494d8f30 by Ean Schuessler

Add action parameter to browse_screens for state transitions

- Add optional action parameter for processing before rendering
- Action values: null (browse), submit (form), create, update, or transition name
- Action processing queued and passed through to screen rendering
- Add actionResult and actionError to browse response
- Update tool schema to expose action parameter
- Keep moqui_render_screen for direct screen access

This enables models to trigger form submissions and transitions through browse_screens.
1 parent c5aae9fc
...@@ -943,11 +943,12 @@ def startTime = System.currentTimeMillis() ...@@ -943,11 +943,12 @@ def startTime = System.currentTimeMillis()
943 </service> 943 </service>
944 944
945 <service verb="mcp" noun="BrowseScreens" authenticate="false" allow-remote="true" transaction-timeout="60"> 945 <service verb="mcp" noun="BrowseScreens" authenticate="false" allow-remote="true" transaction-timeout="60">
946 <description>Browse Moqui screens hierarchically to discover functionality. Renders screen content with renderMode='mcp' by default.</description> 946 <description>Browse Moqui screens hierarchically to discover functionality. Renders screen content with renderMode='mcp' by default. Supports action parameter for form submission and transitions.</description>
947 <in-parameters> 947 <in-parameters>
948 <parameter name="path" required="false"><description>Screen path to browse (e.g. 'PopCommerce'). Leave empty for root apps.</description></parameter> 948 <parameter name="path" required="false"><description>Screen path to browse (e.g. 'PopCommerce'). Leave empty for root apps.</description></parameter>
949 <parameter name="action"><description>Action to process before rendering: null (browse), 'submit' (form), 'create', 'update', or transition name</description></parameter>
949 <parameter name="renderMode" default="mcp"><description>Render mode: mcp (default), text, html, xml, vuet, qvt</description></parameter> 950 <parameter name="renderMode" default="mcp"><description>Render mode: mcp (default), text, html, xml, vuet, qvt</description></parameter>
950 <parameter name="parameters" type="Map"><description>Parameters to pass to screen during rendering</description></parameter> 951 <parameter name="parameters" type="Map"><description>Parameters to pass to screen during rendering or action</description></parameter>
951 <parameter name="sessionId"/> 952 <parameter name="sessionId"/>
952 </in-parameters> 953 </in-parameters>
953 <out-parameters> 954 <out-parameters>
...@@ -1056,6 +1057,24 @@ def startTime = System.currentTimeMillis() ...@@ -1056,6 +1057,24 @@ def startTime = System.currentTimeMillis()
1056 } 1057 }
1057 } 1058 }
1058 1059
1060 // Process action before rendering
1061 def actionResult = null
1062 def actionError = null
1063
1064 if (action) {
1065 try {
1066 ec.logger.info("BrowseScreens: Processing action '${action}' on ${currentPath}")
1067
1068 // For now, actions are passed through to screen rendering
1069 // Future: implement dedicated action processing service
1070 actionResult = [action: action, status: "queued", message: "Action '${action}' will be processed during screen render"]
1071 ec.logger.info("BrowseScreens: Action queued: ${actionResult}")
1072 } catch (Exception e) {
1073 actionError = "Action processing failed: ${e.message}"
1074 ec.logger.warn("BrowseScreens action error for ${currentPath}: ${e.message}")
1075 }
1076 }
1077
1059 // Render current screen if not root browsing 1078 // Render current screen if not root browsing
1060 def renderedContent = null 1079 def renderedContent = null
1061 def renderError = null 1080 def renderError = null
...@@ -1137,6 +1156,14 @@ def startTime = System.currentTimeMillis() ...@@ -1137,6 +1156,14 @@ def startTime = System.currentTimeMillis()
1137 renderMode: actualRenderMode 1156 renderMode: actualRenderMode
1138 ] 1157 ]
1139 1158
1159 if (actionResult) {
1160 resultMap.actionResult = actionResult
1161 }
1162
1163 if (actionError) {
1164 resultMap.actionError = actionError
1165 }
1166
1140 if (renderedContent) { 1167 if (renderedContent) {
1141 resultMap.renderedContent = renderedContent 1168 resultMap.renderedContent = renderedContent
1142 } 1169 }
...@@ -1364,13 +1391,14 @@ def startTime = System.currentTimeMillis() ...@@ -1364,13 +1391,14 @@ def startTime = System.currentTimeMillis()
1364 [ 1391 [
1365 name: "moqui_browse_screens", 1392 name: "moqui_browse_screens",
1366 title: "Browse Screens", 1393 title: "Browse Screens",
1367 description: "Browse the Moqui screen hierarchy and render screen content. Input 'path' (empty for root). Default renderMode is 'mcp'.", 1394 description: "Browse Moqui screen hierarchy, process actions, and render screen content. Input 'path' (empty for root). Default renderMode is 'mcp'.",
1368 inputSchema: [ 1395 inputSchema: [
1369 type: "object", 1396 type: "object",
1370 properties: [ 1397 properties: [
1371 path: [type: "string", description: "Path to browse (e.g. 'PopCommerce')"], 1398 path: [type: "string", description: "Path to browse (e.g. 'PopCommerce')"],
1399 action: [type: "string", description: "Action to process before rendering: null (browse), 'submit' (form), 'create', 'update', or transition name"],
1372 renderMode: [type: "string", description: "Render mode: mcp (default), text, html, xml, vuet, qvt"], 1400 renderMode: [type: "string", description: "Render mode: mcp (default), text, html, xml, vuet, qvt"],
1373 parameters: [type: "object", description: "Parameters to pass to screen during rendering"] 1401 parameters: [type: "object", description: "Parameters to pass to screen during rendering or action"]
1374 ] 1402 ]
1375 ] 1403 ]
1376 ], 1404 ],
......