a1719c3a by Ean Schuessler

Increase MCP truncation limits to support complete workflows

- Terse mode: 50 items/5000 chars (from 30/2000)
- Non-terse mode: 1000 items/50000 chars (from 250/5000)
- Prioritizes operational data completeness over token savings
- Prevents "ghost errors" from arbitrary data dropping
1 parent f000a68c
...@@ -568,7 +568,7 @@ ...@@ -568,7 +568,7 @@
568 <parameter name="action"><description>Action being processed: if not null, use real screen rendering instead of test mock</description></parameter> 568 <parameter name="action"><description>Action being processed: if not null, use real screen rendering instead of test mock</description></parameter>
569 <parameter name="renderMode" default="mcp"><description>Render mode: mcp, text, html, xml, vuet, qvt</description></parameter> 569 <parameter name="renderMode" default="mcp"><description>Render mode: mcp, text, html, xml, vuet, qvt</description></parameter>
570 <parameter name="sessionId"><description>Session ID for user context restoration</description></parameter> 570 <parameter name="sessionId"><description>Session ID for user context restoration</description></parameter>
571 <parameter name="terse" type="Boolean" default="false"><description>If true, return minimal data (10 items, 200 chars strings). If false, include full data (50 items, no truncation).</description></parameter> 571 <parameter name="terse" type="Boolean" default="false"><description>If true, return condensed data (50 items, 5000 char strings). If false, include full data (1000 items, 50k char strings).</description></parameter>
572 </in-parameters> 572 </in-parameters>
573 <out-parameters> 573 <out-parameters>
574 <parameter name="result" type="Map"/> 574 <parameter name="result" type="Map"/>
...@@ -661,20 +661,20 @@ serializeMoquiObject = { obj, depth = 0, isTerse = false -> ...@@ -661,20 +661,20 @@ serializeMoquiObject = { obj, depth = 0, isTerse = false ->
661 if (obj instanceof Iterable) { 661 if (obj instanceof Iterable) {
662 def list = obj.collect() 662 def list = obj.collect()
663 // Apply truncation only if terse mode is enabled 663 // Apply truncation only if terse mode is enabled
664 if (isTerse && list.size() > 10) { 664 if (isTerse && list.size() > 50) {
665 ec.logger.info("serializeMoquiObject: Terse mode - truncating list from ${list.size()} to 10 items") 665 ec.logger.info("serializeMoquiObject: Terse mode - truncating list from ${list.size()} to 50 items")
666 def truncated = list.take(10) 666 def truncated = list.take(50)
667 def resultList = truncated.collect { serializeMoquiObject(it, depth + 1, isTerse) } 667 def resultList = truncated.collect { serializeMoquiObject(it, depth + 1, isTerse) }
668 return [ 668 return [
669 _items: resultList, 669 _items: resultList,
670 _totalCount: list.size(), 670 _totalCount: list.size(),
671 _truncated: true, 671 _truncated: true,
672 _hasMore: true, 672 _hasMore: true,
673 _message: "Terse mode: showing first 10 of ${list.size()} items. Set terse=false to get more data." 673 _message: "Terse mode: showing first 50 of ${list.size()} items. Set terse=false to get full data."
674 ] 674 ]
675 } 675 }
676 // Increased limits for non-terse mode 676 // Increased limits for non-terse mode - effectively unlimited for operational use
677 def maxItems = isTerse ? 10 : 250 677 def maxItems = isTerse ? 50 : 1000
678 def truncated = list.take(maxItems) 678 def truncated = list.take(maxItems)
679 def resultList = truncated.collect { serializeMoquiObject(it, depth + 1, isTerse) } 679 def resultList = truncated.collect { serializeMoquiObject(it, depth + 1, isTerse) }
680 if (!isTerse && list.size() > maxItems) { 680 if (!isTerse && list.size() > maxItems) {
...@@ -700,21 +700,21 @@ serializeMoquiObject = { obj, depth = 0, isTerse = false -> ...@@ -700,21 +700,21 @@ serializeMoquiObject = { obj, depth = 0, isTerse = false ->
700 } 700 }
701 if (obj instanceof String) { 701 if (obj instanceof String) {
702 // Apply truncation only if terse mode is enabled 702 // Apply truncation only if terse mode is enabled
703 if (isTerse && obj.length() > 200) { 703 if (isTerse && obj.length() > 5000) {
704 return [ 704 return [
705 _value: obj.substring(0, 200) + "...", 705 _value: obj.substring(0, 5000) + "...",
706 _fullLength: obj.length(), 706 _fullLength: obj.length(),
707 _truncated: true, 707 _truncated: true,
708 _message: "Terse mode: truncated to 200 chars. Set terse=false to get more data." 708 _message: "Terse mode: truncated to 5000 chars. Set terse=false to get more data."
709 ] 709 ]
710 } 710 }
711 // Non-terse limit increased to 2000 for safety but much larger than before 711 // Non-terse limit increased to 50000 for safety
712 if (!isTerse && obj.length() > 2000) { 712 if (!isTerse && obj.length() > 50000) {
713 return [ 713 return [
714 _value: obj.substring(0, 2000) + "...", 714 _value: obj.substring(0, 50000) + "...",
715 _fullLength: obj.length(), 715 _fullLength: obj.length(),
716 _truncated: true, 716 _truncated: true,
717 _message: "Truncated to 2000 chars for safety." 717 _message: "Truncated to 50000 chars for safety."
718 ] 718 ]
719 } 719 }
720 return obj 720 return obj
...@@ -1330,7 +1330,7 @@ def wikiInstructions = getWikiInstructions(inputScreenPath) ...@@ -1330,7 +1330,7 @@ def wikiInstructions = getWikiInstructions(inputScreenPath)
1330 <parameter name="renderMode" default="mcp"><description>Render mode: mcp (default), text, html, xml, vuet, qvt</description></parameter> 1330 <parameter name="renderMode" default="mcp"><description>Render mode: mcp (default), text, html, xml, vuet, qvt</description></parameter>
1331 <parameter name="parameters" type="Map"><description>Parameters to pass to screen during rendering or action</description></parameter> 1331 <parameter name="parameters" type="Map"><description>Parameters to pass to screen during rendering or action</description></parameter>
1332 <parameter name="sessionId"/> 1332 <parameter name="sessionId"/>
1333 <parameter name="terse" type="Boolean" default="false"><description>If true, return minimal data (10 items, 200 chars strings). If false, include full data (50 items, no truncation).</description></parameter> 1333 <parameter name="terse" type="Boolean" default="false"><description>If true, return condensed data (50 items, 5000 char strings). If false, include full data (1000 items, 50k char strings).</description></parameter>
1334 </in-parameters> 1334 </in-parameters>
1335 <out-parameters> 1335 <out-parameters>
1336 <parameter name="result" type="Map"/> 1336 <parameter name="result" type="Map"/>
......