46e8d9ed by Ean Schuessler

Fix action execution - resolve screen path and traverse default subscreens

Critical fixes:
- Set resolvedScreenDef after successful literal path resolution (was falling back to webroot)
- Traverse default subscreens when looking up transitions (matching action discovery logic)
- Build full path including subscreens for framework transition execution

New features:
- moqui_batch_operations tool for multi-step workflows
- Enhanced validation error handling with field-level details
- ARIA mode now includes value, ref, description, describedby attributes

Documentation:
- Added render modes table and examples to AGENTS.md
- Updated README with MARIA format explanation
- Added MCP_SERVICE_DOCS wiki space with service parameter docs
1 parent 7c09f005
...@@ -59,4 +59,10 @@ ...@@ -59,4 +59,10 @@
59 <moqui.security.UserGroupMember userGroupId="MCP_BUSINESS" userId="ORG_ZIZI_JD" fromDate="2025-01-01 00:00:00.000"/> 59 <moqui.security.UserGroupMember userGroupId="MCP_BUSINESS" userId="ORG_ZIZI_JD" fromDate="2025-01-01 00:00:00.000"/>
60 <moqui.security.UserGroupMember userGroupId="MCP_BUSINESS" userId="ORG_ZIZI_BD" fromDate="2025-01-01 00:00:00.000"/> 60 <moqui.security.UserGroupMember userGroupId="MCP_BUSINESS" userId="ORG_ZIZI_BD" fromDate="2025-01-01 00:00:00.000"/>
61 --> 61 -->
62
63 <!-- Add EX_JOHN_DOE to PopcAdminSales so JohnSales can see/message John Doe in searches -->
64 <moqui.security.UserGroupMember userGroupId="PopcAdminSales" userId="EX_JOHN_DOE" fromDate="2025-01-01 00:00:00.000"/>
65
66 <!-- Set EX_JOHN_DOE's ownerPartyId to ORG_ZIZI_RETAIL so they appear in org-filtered searches -->
67 <mantle.party.Party partyId="EX_JOHN_DOE" ownerPartyId="ORG_ZIZI_RETAIL"/>
62 </entity-facade-xml> 68 </entity-facade-xml>
......
...@@ -128,6 +128,11 @@ ...@@ -128,6 +128,11 @@
128 <#assign formName = (.node["@name"]!"")?string> 128 <#assign formName = (.node["@name"]!"")?string>
129 <#assign fieldMetaList = []> 129 <#assign fieldMetaList = []>
130 <#assign dummy = ec.resource.expression("if (mcpSemanticData.formMetadata == null) mcpSemanticData.formMetadata = [:]; mcpSemanticData.formMetadata.put('" + formName?js_string + "', [name: '" + formName?js_string + "', map: '" + (mapName!"")?js_string + "'])", "")!> 130 <#assign dummy = ec.resource.expression("if (mcpSemanticData.formMetadata == null) mcpSemanticData.formMetadata = [:]; mcpSemanticData.formMetadata.put('" + formName?js_string + "', [name: '" + formName?js_string + "', map: '" + (mapName!"")?js_string + "'])", "")!>
131 <#-- Store the actual form data (current entity values) in semanticData -->
132 <#if formMap?has_content>
133 <#assign dummy = ec.context.put("tempFormMapData", formMap)!>
134 <#assign dummy = ec.resource.expression("mcpSemanticData.put('" + formName?js_string + "_data', tempFormMapData)", "")!>
135 </#if>
131 </#if> 136 </#if>
132 <#t>${sri.pushSingleFormMapContext(mapName)} 137 <#t>${sri.pushSingleFormMapContext(mapName)}
133 <#list formNode["field"] as fieldNode> 138 <#list formNode["field"] as fieldNode>
......