@solidxai/core-ui 0.1.20 → 0.1.21-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/components/common/FileReaderExt.d.ts.map +1 -1
  2. package/dist/components/common/FileReaderExt.js +22 -11
  3. package/dist/components/common/FileReaderExt.js.map +1 -1
  4. package/dist/components/common/FileReaderExt.tsx +27 -14
  5. package/dist/components/common/SocialMediaLogin.d.ts.map +1 -1
  6. package/dist/components/common/SocialMediaLogin.js +1 -1
  7. package/dist/components/common/SocialMediaLogin.js.map +1 -1
  8. package/dist/components/common/SocialMediaLogin.tsx +50 -19
  9. package/dist/components/common/solid-export.css +75 -0
  10. package/dist/components/core/common/SolidGenericImport/SolidImport.module.css +71 -0
  11. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  12. package/dist/components/core/form/SolidFormView.js +14 -0
  13. package/dist/components/core/form/SolidFormView.js.map +1 -1
  14. package/dist/components/core/form/SolidFormView.tsx +13 -0
  15. package/dist/components/core/form/fields/SolidMediaMultipleField.js +3 -3
  16. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  17. package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +3 -3
  18. package/dist/components/core/form/fields/SolidMediaSingleField.js +2 -2
  19. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  20. package/dist/components/core/form/fields/SolidMediaSingleField.tsx +2 -2
  21. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +2 -2
  22. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  23. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +4 -4
  24. package/dist/components/core/list/columns/SolidMediaSingleColumn.js +1 -1
  25. package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
  26. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +3 -3
  27. package/dist/components/core/solid-agent/SolidAgentChat.d.ts +3 -1
  28. package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -1
  29. package/dist/components/core/solid-agent/SolidAgentChat.js +150 -22
  30. package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -1
  31. package/dist/components/core/solid-agent/SolidAgentChat.tsx +76 -15
  32. package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts +2 -0
  33. package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts.map +1 -1
  34. package/dist/components/core/solid-agent/SolidAgentEmbedded.js +4 -4
  35. package/dist/components/core/solid-agent/SolidAgentEmbedded.js.map +1 -1
  36. package/dist/components/core/solid-agent/SolidAgentEmbedded.tsx +7 -1
  37. package/dist/components/core/solid-agent/SolidAgentHost.d.ts.map +1 -1
  38. package/dist/components/core/solid-agent/SolidAgentHost.js +79 -1
  39. package/dist/components/core/solid-agent/SolidAgentHost.js.map +1 -1
  40. package/dist/components/core/solid-agent/SolidAgentHost.tsx +69 -2
  41. package/dist/components/core/solid-agent/agentEvents.d.ts.map +1 -1
  42. package/dist/components/core/solid-agent/agentEvents.js +1 -3
  43. package/dist/components/core/solid-agent/agentEvents.js.map +1 -1
  44. package/dist/components/core/solid-agent/agentEvents.ts +5 -3
  45. package/dist/components/core/solid-agent/client/agentPublicEvents.d.ts +88 -0
  46. package/dist/components/core/solid-agent/client/agentPublicEvents.d.ts.map +1 -0
  47. package/dist/components/core/solid-agent/client/agentPublicEvents.js +26 -0
  48. package/dist/components/core/solid-agent/client/agentPublicEvents.js.map +1 -0
  49. package/dist/components/core/solid-agent/client/agentPublicEvents.ts +66 -0
  50. package/dist/components/core/solid-agent/client/agentRuntime.d.ts +18 -3
  51. package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -1
  52. package/dist/components/core/solid-agent/client/agentRuntime.js +173 -31
  53. package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -1
  54. package/dist/components/core/solid-agent/client/agentRuntime.ts +126 -16
  55. package/dist/components/core/solid-agent/client/agentSocket.d.ts +3 -0
  56. package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -1
  57. package/dist/components/core/solid-agent/client/agentSocket.js +19 -1
  58. package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -1
  59. package/dist/components/core/solid-agent/client/agentSocket.ts +11 -1
  60. package/dist/components/core/solid-agent/client/beforeUserMessageSend.d.ts +9 -0
  61. package/dist/components/core/solid-agent/client/beforeUserMessageSend.d.ts.map +1 -0
  62. package/dist/components/core/solid-agent/client/beforeUserMessageSend.js +53 -0
  63. package/dist/components/core/solid-agent/client/beforeUserMessageSend.js.map +1 -0
  64. package/dist/components/core/solid-agent/client/beforeUserMessageSend.ts +26 -0
  65. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.d.ts.map +1 -1
  66. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +4 -3
  67. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -1
  68. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +4 -2
  69. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +29 -0
  70. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -1
  71. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +45 -2
  72. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -1
  73. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +49 -2
  74. package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts +1 -0
  75. package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts.map +1 -1
  76. package/dist/components/core/solid-agent/embed/agentEmbedSamples.js +2 -1
  77. package/dist/components/core/solid-agent/embed/agentEmbedSamples.js.map +1 -1
  78. package/dist/components/core/solid-agent/embed/agentEmbedSamples.ts +15 -1
  79. package/dist/components/core/solid-agent/types.d.ts +13 -0
  80. package/dist/components/core/solid-agent/types.d.ts.map +1 -1
  81. package/dist/components/core/solid-agent/types.js.map +1 -1
  82. package/dist/components/core/solid-agent/types.ts +8 -0
  83. package/dist/components/core/solid-agent/useAgentChat.d.ts +1 -1
  84. package/dist/components/core/solid-agent/useAgentChat.d.ts.map +1 -1
  85. package/dist/components/core/solid-agent/useAgentChat.js +7 -4
  86. package/dist/components/core/solid-agent/useAgentChat.js.map +1 -1
  87. package/dist/components/core/solid-agent/useAgentChat.ts +9 -5
  88. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.d.ts.map +1 -1
  89. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +12 -4
  90. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -1
  91. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +18 -0
  92. package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.d.ts +4 -0
  93. package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.d.ts.map +1 -0
  94. package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.js +30 -0
  95. package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.js.map +1 -0
  96. package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.tsx +41 -0
  97. package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +39 -0
  98. package/dist/components/shad-cn-ui/SolidCodeEditor.d.ts +2 -1
  99. package/dist/components/shad-cn-ui/SolidCodeEditor.d.ts.map +1 -1
  100. package/dist/components/shad-cn-ui/SolidCodeEditor.js +3 -2
  101. package/dist/components/shad-cn-ui/SolidCodeEditor.js.map +1 -1
  102. package/dist/components/shad-cn-ui/SolidCodeEditor.tsx +3 -0
  103. package/dist/helpers/adminViewRefresh.d.ts +13 -0
  104. package/dist/helpers/adminViewRefresh.d.ts.map +1 -0
  105. package/dist/helpers/adminViewRefresh.js +14 -0
  106. package/dist/helpers/adminViewRefresh.js.map +1 -0
  107. package/dist/helpers/adminViewRefresh.ts +26 -0
  108. package/dist/helpers/eventBus.d.ts +1 -0
  109. package/dist/helpers/eventBus.d.ts.map +1 -1
  110. package/dist/helpers/eventBus.js +1 -0
  111. package/dist/helpers/eventBus.js.map +1 -1
  112. package/dist/helpers/eventBus.ts +1 -0
  113. package/dist/helpers/fileTypeIcon.d.ts.map +1 -1
  114. package/dist/helpers/fileTypeIcon.js +4 -1
  115. package/dist/helpers/fileTypeIcon.js.map +1 -1
  116. package/dist/helpers/fileTypeIcon.tsx +15 -0
  117. package/dist/helpers/registry.d.ts.map +1 -1
  118. package/dist/helpers/registry.js +2 -0
  119. package/dist/helpers/registry.js.map +1 -1
  120. package/dist/helpers/registry.ts +2 -0
  121. package/dist/helpers/routePaths.d.ts +13 -0
  122. package/dist/helpers/routePaths.d.ts.map +1 -1
  123. package/dist/helpers/routePaths.js +39 -0
  124. package/dist/helpers/routePaths.js.map +1 -1
  125. package/dist/helpers/routePaths.ts +48 -0
  126. package/dist/redux/features/agentSlice.d.ts +2 -1
  127. package/dist/redux/features/agentSlice.d.ts.map +1 -1
  128. package/dist/redux/features/agentSlice.js +2 -2
  129. package/dist/redux/features/agentSlice.js.map +1 -1
  130. package/dist/redux/features/agentSlice.ts +8 -3
  131. package/dist/resources/solid-custom.css +42 -0
  132. package/dist/resources/solid-tailwind-generated.css +1 -1
  133. package/dist/routes/pages/admin/core/AgentHubModuleField.css +15 -0
  134. package/dist/routes/pages/admin/core/AgentHubModuleField.d.ts +22 -0
  135. package/dist/routes/pages/admin/core/AgentHubModuleField.d.ts.map +1 -0
  136. package/dist/routes/pages/admin/core/AgentHubModuleField.js +42 -0
  137. package/dist/routes/pages/admin/core/AgentHubModuleField.js.map +1 -0
  138. package/dist/routes/pages/admin/core/AgentHubModuleField.tsx +54 -0
  139. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts +3 -1
  140. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts.map +1 -1
  141. package/dist/routes/pages/admin/core/AgentHubTagsField.js +3 -3
  142. package/dist/routes/pages/admin/core/AgentHubTagsField.js.map +1 -1
  143. package/dist/routes/pages/admin/core/AgentHubTagsField.tsx +7 -3
  144. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
  145. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +37 -29
  146. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
  147. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +12 -6
  148. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -1
  149. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +22 -15
  150. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -1
  151. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +17 -7
  152. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -1
  153. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +21 -15
  154. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -1
  155. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +16 -9
  156. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts.map +1 -1
  157. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js +149 -37
  158. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js.map +1 -1
  159. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.tsx +283 -73
  160. package/dist/routes/pages/admin/core/CardPage.d.ts.map +1 -1
  161. package/dist/routes/pages/admin/core/CardPage.js +9 -1
  162. package/dist/routes/pages/admin/core/CardPage.js.map +1 -1
  163. package/dist/routes/pages/admin/core/CardPage.tsx +9 -1
  164. package/dist/routes/pages/admin/core/KanbanPage.d.ts.map +1 -1
  165. package/dist/routes/pages/admin/core/KanbanPage.js +9 -1
  166. package/dist/routes/pages/admin/core/KanbanPage.js.map +1 -1
  167. package/dist/routes/pages/admin/core/KanbanPage.tsx +9 -1
  168. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  169. package/dist/routes/pages/admin/core/ListPage.js +10 -1
  170. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  171. package/dist/routes/pages/admin/core/ListPage.tsx +10 -1
  172. package/dist/routes/pages/admin/core/TreePage.d.ts.map +1 -1
  173. package/dist/routes/pages/admin/core/TreePage.js +9 -1
  174. package/dist/routes/pages/admin/core/TreePage.js.map +1 -1
  175. package/dist/routes/pages/admin/core/TreePage.tsx +9 -1
  176. package/dist/routes/pages/embed/AgentEmbedPage.d.ts.map +1 -1
  177. package/dist/routes/pages/embed/AgentEmbedPage.js +67 -4
  178. package/dist/routes/pages/embed/AgentEmbedPage.js.map +1 -1
  179. package/dist/routes/pages/embed/AgentEmbedPage.tsx +61 -4
  180. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/ListPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAEvH,MAAM,UAAU,QAAQ;IACtB,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IACpB,IAAA,YAAY,GAAI,eAAe,EAAE,GAArB,CAAsB;IACzC,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAEvC,IAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,IAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtE,IAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACxD,IAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACpD,IAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAExD,IAAM,MAAM,GAAG,eAAQ,UAAU,cAAI,SAAS,cAAI,UAAU,cAAI,YAAY,cAAI,QAAQ,cAAI,UAAU,CAAE,CAAC;IAEzG,IAAM,UAAU,GAAG,WAAW,CAAC,UAAC,MAAkC;QAChE,IAAI,MAAM,EAAE;YACV,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjC,OAAO;SACR;QACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC;QACR,IAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAG,QAAQ,cAAI,MAAM,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,IAAM,WAAW,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,WAAW,KAAK,UAAU,EAAE;YAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEvB,OAAO,KAAC,aAAa,aAAC,GAAG,EAAE,UAAU,IAAmB,MAAM,IAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,KAAhF,MAAM,CAA8E,CAAC;AACnI,CAAC","sourcesContent":["import { SolidListView } from \"../../../../components/core/list/SolidListView\";\nimport { camelCase } from \"lodash\";\nimport { useCallback, useEffect } from \"react\";\nimport { useParams, useSearchParams } from \"react-router-dom\";\nimport type { SolidListViewHandle } from \"../../../../components/core/list/SolidListView\";\nimport { registerListView, unregisterListView } from \"../../../../components/core/list/listViewRegistry\";\nimport { usePathname } from \"../../../../hooks/usePathname\";\nimport { useRouter } from \"../../../../hooks/useRouter\";\nimport { resolveRetainedModelViewRoute, storeCurrentModelViewContext } from \"../../../../helpers/modelViewPersistence\";\n\nexport function ListPage() {\n const params = useParams();\n const [searchParams] = useSearchParams();\n const pathname = usePathname();\n const router = useRouter();\n const search = searchParams.toString();\n\n const moduleName = params.moduleName || \"\";\n const modelName = params.modelName ? camelCase(params.modelName) : \"\";\n\n const menuItemId = searchParams.get(\"menuItemId\") || \"\";\n const menuItemName = searchParams.get(\"menuItemName\") || \"\";\n const actionId = searchParams.get(\"actionId\") || \"\";\n const actionName = searchParams.get(\"actionName\") || \"\";\n\n const listId = `page:${moduleName}:${modelName}:${menuItemId}:${menuItemName}:${actionId}:${actionName}`;\n\n const setListRef = useCallback((handle: SolidListViewHandle | null) => {\n if (handle) {\n registerListView(listId, handle);\n return;\n }\n unregisterListView(listId);\n }, [listId]);\n\n useEffect(() => {\n const currentUrl = search ? `${pathname}?${search}` : pathname;\n const retainedUrl = resolveRetainedModelViewRoute(currentUrl);\n if (retainedUrl !== currentUrl) {\n router.replace(retainedUrl);\n return;\n }\n\n storeCurrentModelViewContext(currentUrl);\n }, [pathname, search]);\n\n return <SolidListView ref={setListRef} key={listId} {...params} embeded={false} moduleName={moduleName} modelName={modelName} />;\n}\n"]}
1
+ {"version":3,"file":"ListPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/ListPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACtH,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACvH,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAgC,MAAM,sCAAsC,CAAC;AAC9I,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,UAAU,QAAQ;IACtB,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IACpB,IAAA,YAAY,GAAI,eAAe,EAAE,GAArB,CAAsB;IACzC,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAEvC,IAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,IAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtE,IAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACxD,IAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACpD,IAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAExD,IAAM,MAAM,GAAG,eAAQ,UAAU,cAAI,SAAS,cAAI,UAAU,cAAI,YAAY,cAAI,QAAQ,cAAI,UAAU,CAAE,CAAC;IAEzG,IAAM,UAAU,GAAG,WAAW,CAAC,UAAC,MAAkC;QAChE,IAAI,MAAM,EAAE;YACV,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjC,OAAO;SACR;QACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC;QACR,IAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAG,QAAQ,cAAI,MAAM,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,IAAM,WAAW,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,WAAW,KAAK,UAAU,EAAE;YAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEvB,SAAS,CAAC,cAAM,OAAA,QAAQ,CAAC,EAAE,CAA0B,4BAA4B,EAAE,UAAC,OAAO;;QACzF,IAAI,0BAA0B,CAAC,OAAO,EAAE,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;YACpF,6FAA6F;YAC7F,MAAA,WAAW,CAAC,MAAM,CAAC,0CAAE,OAAO,EAAE,CAAC;SAChC;IACH,CAAC,CAAC,EALc,CAKd,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAErC,OAAO,KAAC,aAAa,aAAC,GAAG,EAAE,UAAU,IAAmB,MAAM,IAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,KAAhF,MAAM,CAA8E,CAAC;AACnI,CAAC","sourcesContent":["import { SolidListView } from \"../../../../components/core/list/SolidListView\";\nimport { camelCase } from \"lodash\";\nimport { useCallback, useEffect } from \"react\";\nimport { useParams, useSearchParams } from \"react-router-dom\";\nimport type { SolidListViewHandle } from \"../../../../components/core/list/SolidListView\";\nimport { getListView, registerListView, unregisterListView } from \"../../../../components/core/list/listViewRegistry\";\nimport { usePathname } from \"../../../../hooks/usePathname\";\nimport { useRouter } from \"../../../../hooks/useRouter\";\nimport { resolveRetainedModelViewRoute, storeCurrentModelViewContext } from \"../../../../helpers/modelViewPersistence\";\nimport { isMatchingAdminViewRefresh, ADMIN_VIEW_REFRESH_REQUESTED, type AdminViewRefreshRequest } from \"../../../../helpers/adminViewRefresh\";\nimport { eventBus } from \"../../../../helpers/eventBus\";\n\nexport function ListPage() {\n const params = useParams();\n const [searchParams] = useSearchParams();\n const pathname = usePathname();\n const router = useRouter();\n const search = searchParams.toString();\n\n const moduleName = params.moduleName || \"\";\n const modelName = params.modelName ? camelCase(params.modelName) : \"\";\n\n const menuItemId = searchParams.get(\"menuItemId\") || \"\";\n const menuItemName = searchParams.get(\"menuItemName\") || \"\";\n const actionId = searchParams.get(\"actionId\") || \"\";\n const actionName = searchParams.get(\"actionName\") || \"\";\n\n const listId = `page:${moduleName}:${modelName}:${menuItemId}:${menuItemName}:${actionId}:${actionName}`;\n\n const setListRef = useCallback((handle: SolidListViewHandle | null) => {\n if (handle) {\n registerListView(listId, handle);\n return;\n }\n unregisterListView(listId);\n }, [listId]);\n\n useEffect(() => {\n const currentUrl = search ? `${pathname}?${search}` : pathname;\n const retainedUrl = resolveRetainedModelViewRoute(currentUrl);\n if (retainedUrl !== currentUrl) {\n router.replace(retainedUrl);\n return;\n }\n\n storeCurrentModelViewContext(currentUrl);\n }, [pathname, search]);\n\n useEffect(() => eventBus.on<AdminViewRefreshRequest>(ADMIN_VIEW_REFRESH_REQUESTED, (request) => {\n if (isMatchingAdminViewRefresh(request, { moduleName, modelName, viewName: \"list\" })) {\n // The registered handle is the page's active list view; its refresh retains current filters.\n getListView(listId)?.refresh();\n }\n }), [listId, moduleName, modelName]);\n\n return <SolidListView ref={setListRef} key={listId} {...params} embeded={false} moduleName={moduleName} modelName={modelName} />;\n}\n"]}
@@ -3,10 +3,12 @@ import { camelCase } from "lodash";
3
3
  import { useCallback, useEffect } from "react";
4
4
  import { useParams, useSearchParams } from "react-router-dom";
5
5
  import type { SolidListViewHandle } from "../../../../components/core/list/SolidListView";
6
- import { registerListView, unregisterListView } from "../../../../components/core/list/listViewRegistry";
6
+ import { getListView, registerListView, unregisterListView } from "../../../../components/core/list/listViewRegistry";
7
7
  import { usePathname } from "../../../../hooks/usePathname";
8
8
  import { useRouter } from "../../../../hooks/useRouter";
9
9
  import { resolveRetainedModelViewRoute, storeCurrentModelViewContext } from "../../../../helpers/modelViewPersistence";
10
+ import { isMatchingAdminViewRefresh, ADMIN_VIEW_REFRESH_REQUESTED, type AdminViewRefreshRequest } from "../../../../helpers/adminViewRefresh";
11
+ import { eventBus } from "../../../../helpers/eventBus";
10
12
 
11
13
  export function ListPage() {
12
14
  const params = useParams();
@@ -44,5 +46,12 @@ export function ListPage() {
44
46
  storeCurrentModelViewContext(currentUrl);
45
47
  }, [pathname, search]);
46
48
 
49
+ useEffect(() => eventBus.on<AdminViewRefreshRequest>(ADMIN_VIEW_REFRESH_REQUESTED, (request) => {
50
+ if (isMatchingAdminViewRefresh(request, { moduleName, modelName, viewName: "list" })) {
51
+ // The registered handle is the page's active list view; its refresh retains current filters.
52
+ getListView(listId)?.refresh();
53
+ }
54
+ }), [listId, moduleName, modelName]);
55
+
47
56
  return <SolidListView ref={setListRef} key={listId} {...params} embeded={false} moduleName={moduleName} modelName={modelName} />;
48
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TreePage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/TreePage.tsx"],"names":[],"mappings":"AASA,wBAAgB,QAAQ,4CA6BvB"}
1
+ {"version":3,"file":"TreePage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/TreePage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,QAAQ,4CAmCvB"}
@@ -13,10 +13,12 @@ import { jsx as _jsx } from "react/jsx-runtime";
13
13
  import { camelCase } from "lodash";
14
14
  import { useCallback, useEffect } from "react";
15
15
  import { useParams, useSearchParams } from "react-router-dom";
16
- import { registerTree, unregisterTree } from "../../../../components/core/tree/treeViewRegistry";
16
+ import { getTree, registerTree, unregisterTree } from "../../../../components/core/tree/treeViewRegistry";
17
17
  import { SolidTreeView } from "../../../../components/core/tree/SolidTreeView";
18
18
  import { storeCurrentModelViewContext } from "../../../../helpers/modelViewPersistence";
19
19
  import { usePathname } from "../../../../hooks/usePathname";
20
+ import { isMatchingAdminViewRefresh, ADMIN_VIEW_REFRESH_REQUESTED } from "../../../../helpers/adminViewRefresh";
21
+ import { eventBus } from "../../../../helpers/eventBus";
20
22
  export function TreePage() {
21
23
  var params = useParams();
22
24
  var searchParams = useSearchParams()[0];
@@ -40,6 +42,12 @@ export function TreePage() {
40
42
  var currentUrl = search ? "".concat(pathname, "?").concat(search) : pathname;
41
43
  storeCurrentModelViewContext(currentUrl);
42
44
  }, [pathname, search]);
45
+ useEffect(function () { return eventBus.on(ADMIN_VIEW_REFRESH_REQUESTED, function (request) {
46
+ var _a;
47
+ if (isMatchingAdminViewRefresh(request, { moduleName: moduleName, modelName: modelName, viewName: "tree" })) {
48
+ (_a = getTree(treeId)) === null || _a === void 0 ? void 0 : _a.refresh();
49
+ }
50
+ }); }, [treeId, moduleName, modelName]);
43
51
  return _jsx(SolidTreeView, __assign({ ref: setTreeRef }, params, { embeded: false, moduleName: moduleName, modelName: modelName }), moduleName + modelName + menuItemId + menuItemName + actionId + actionName);
44
52
  }
45
53
  //# sourceMappingURL=TreePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TreePage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/TreePage.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,MAAM,UAAU,QAAQ;IACtB,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IACpB,IAAA,YAAY,GAAI,eAAe,EAAE,GAArB,CAAsB;IACzC,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAEvC,IAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,IAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,IAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACxD,IAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACpD,IAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAExD,IAAM,MAAM,GAAG,eAAQ,UAAU,cAAI,SAAS,cAAI,UAAU,cAAI,YAAY,cAAI,QAAQ,cAAI,UAAU,CAAE,CAAC;IAEzG,IAAM,UAAU,GAAG,WAAW,CAAC,UAAC,MAAkC;QAChE,IAAI,MAAM,EAAE;YACV,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO;SACR;QACD,cAAc,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC;QACR,IAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAG,QAAQ,cAAI,MAAM,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEvB,OAAO,KAAC,aAAa,aAAC,GAAG,EAAE,UAAU,IAAuF,MAAM,IAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,KAApJ,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,CAA8E,CAAC;AACvM,CAAC","sourcesContent":["import { camelCase } from \"lodash\";\nimport { useCallback, useEffect } from \"react\";\nimport { useParams, useSearchParams } from \"react-router-dom\";\nimport type { SolidTreeViewHandle } from \"../../../../components/core/tree/SolidTreeView\";\nimport { registerTree, unregisterTree } from \"../../../../components/core/tree/treeViewRegistry\";\nimport { SolidTreeView } from \"../../../../components/core/tree/SolidTreeView\";\nimport { storeCurrentModelViewContext } from \"../../../../helpers/modelViewPersistence\";\nimport { usePathname } from \"../../../../hooks/usePathname\";\n\nexport function TreePage() {\n const params = useParams();\n const [searchParams] = useSearchParams();\n const pathname = usePathname();\n const search = searchParams.toString();\n\n const moduleName = params.moduleName || \"\";\n const modelName = params.modelName ? camelCase(params.modelName) : \"\";\n const menuItemId = searchParams.get(\"menuItemId\") || \"\";\n const menuItemName = searchParams.get(\"menuItemName\") || \"\";\n const actionId = searchParams.get(\"actionId\") || \"\";\n const actionName = searchParams.get(\"actionName\") || \"\";\n\n const treeId = `page:${moduleName}:${modelName}:${menuItemId}:${menuItemName}:${actionId}:${actionName}`;\n\n const setTreeRef = useCallback((handle: SolidTreeViewHandle | null) => {\n if (handle) {\n registerTree(treeId, handle);\n return;\n }\n unregisterTree(treeId);\n }, [treeId]);\n\n useEffect(() => {\n const currentUrl = search ? `${pathname}?${search}` : pathname;\n storeCurrentModelViewContext(currentUrl);\n }, [pathname, search]);\n\n return <SolidTreeView ref={setTreeRef} key={moduleName + modelName + menuItemId + menuItemName + actionId + actionName} {...params} embeded={false} moduleName={moduleName} modelName={modelName} />;\n}\n"]}
1
+ {"version":3,"file":"TreePage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/TreePage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { camelCase } from \"lodash\";\nimport { useCallback, useEffect } from \"react\";\nimport { useParams, useSearchParams } from \"react-router-dom\";\nimport type { SolidTreeViewHandle } from \"../../../../components/core/tree/SolidTreeView\";\nimport { getTree, registerTree, unregisterTree } from \"../../../../components/core/tree/treeViewRegistry\";\nimport { SolidTreeView } from \"../../../../components/core/tree/SolidTreeView\";\nimport { storeCurrentModelViewContext } from \"../../../../helpers/modelViewPersistence\";\nimport { usePathname } from \"../../../../hooks/usePathname\";\nimport { isMatchingAdminViewRefresh, ADMIN_VIEW_REFRESH_REQUESTED, type AdminViewRefreshRequest } from \"../../../../helpers/adminViewRefresh\";\nimport { eventBus } from \"../../../../helpers/eventBus\";\n\nexport function TreePage() {\n const params = useParams();\n const [searchParams] = useSearchParams();\n const pathname = usePathname();\n const search = searchParams.toString();\n\n const moduleName = params.moduleName || \"\";\n const modelName = params.modelName ? camelCase(params.modelName) : \"\";\n const menuItemId = searchParams.get(\"menuItemId\") || \"\";\n const menuItemName = searchParams.get(\"menuItemName\") || \"\";\n const actionId = searchParams.get(\"actionId\") || \"\";\n const actionName = searchParams.get(\"actionName\") || \"\";\n\n const treeId = `page:${moduleName}:${modelName}:${menuItemId}:${menuItemName}:${actionId}:${actionName}`;\n\n const setTreeRef = useCallback((handle: SolidTreeViewHandle | null) => {\n if (handle) {\n registerTree(treeId, handle);\n return;\n }\n unregisterTree(treeId);\n }, [treeId]);\n\n useEffect(() => {\n const currentUrl = search ? `${pathname}?${search}` : pathname;\n storeCurrentModelViewContext(currentUrl);\n }, [pathname, search]);\n\n useEffect(() => eventBus.on<AdminViewRefreshRequest>(ADMIN_VIEW_REFRESH_REQUESTED, (request) => {\n if (isMatchingAdminViewRefresh(request, { moduleName, modelName, viewName: \"tree\" })) {\n getTree(treeId)?.refresh();\n }\n }), [treeId, moduleName, modelName]);\n\n return <SolidTreeView ref={setTreeRef} key={moduleName + modelName + menuItemId + menuItemName + actionId + actionName} {...params} embeded={false} moduleName={moduleName} modelName={modelName} />;\n}\n"]}
@@ -2,10 +2,12 @@ import { camelCase } from "lodash";
2
2
  import { useCallback, useEffect } from "react";
3
3
  import { useParams, useSearchParams } from "react-router-dom";
4
4
  import type { SolidTreeViewHandle } from "../../../../components/core/tree/SolidTreeView";
5
- import { registerTree, unregisterTree } from "../../../../components/core/tree/treeViewRegistry";
5
+ import { getTree, registerTree, unregisterTree } from "../../../../components/core/tree/treeViewRegistry";
6
6
  import { SolidTreeView } from "../../../../components/core/tree/SolidTreeView";
7
7
  import { storeCurrentModelViewContext } from "../../../../helpers/modelViewPersistence";
8
8
  import { usePathname } from "../../../../hooks/usePathname";
9
+ import { isMatchingAdminViewRefresh, ADMIN_VIEW_REFRESH_REQUESTED, type AdminViewRefreshRequest } from "../../../../helpers/adminViewRefresh";
10
+ import { eventBus } from "../../../../helpers/eventBus";
9
11
 
10
12
  export function TreePage() {
11
13
  const params = useParams();
@@ -35,5 +37,11 @@ export function TreePage() {
35
37
  storeCurrentModelViewContext(currentUrl);
36
38
  }, [pathname, search]);
37
39
 
40
+ useEffect(() => eventBus.on<AdminViewRefreshRequest>(ADMIN_VIEW_REFRESH_REQUESTED, (request) => {
41
+ if (isMatchingAdminViewRefresh(request, { moduleName, modelName, viewName: "tree" })) {
42
+ getTree(treeId)?.refresh();
43
+ }
44
+ }), [treeId, moduleName, modelName]);
45
+
38
46
  return <SolidTreeView ref={setTreeRef} key={moduleName + modelName + menuItemId + menuItemName + actionId + actionName} {...params} embeded={false} moduleName={moduleName} modelName={modelName} />;
39
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentEmbedPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/embed/AgentEmbedPage.tsx"],"names":[],"mappings":"AAgBA,4GAA4G;AAC5G,wBAAgB,cAAc,4CAuJ7B"}
1
+ {"version":3,"file":"AgentEmbedPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/embed/AgentEmbedPage.tsx"],"names":[],"mappings":"AAiBA,4GAA4G;AAC5G,wBAAgB,cAAc,4CA+M7B"}
@@ -16,8 +16,9 @@ import { Provider } from "react-redux";
16
16
  import { configureStore } from "@reduxjs/toolkit";
17
17
  import agentReducer from "../../../redux/features/agentSlice";
18
18
  import { SolidAgentEmbedded } from "../../../components/core/solid-agent/SolidAgentEmbedded";
19
+ import { onAgentPublicEvent } from "../../../components/core/solid-agent/client/agentPublicEvents";
19
20
  import { registerExternalAgentAuth, renewExternalAgentAuth } from "../../../components/core/solid-agent/client/agentAuth";
20
- import { EMBED_CHANNEL, MissingAgentInputsError, validateBootstrap, validateEmbedInputs } from "../../../components/core/solid-agent/embed/agentEmbedProtocol";
21
+ import { EMBED_CHANNEL, EMBED_PUBLIC_PROTOCOL_VERSION, MissingAgentInputsError, validateBootstrap, validateEmbedInputs, validateMessageContext } from "../../../components/core/solid-agent/embed/agentEmbedProtocol";
21
22
  import styles from "./AgentEmbedPage.module.css";
22
23
  /** Request IDs correlate iframe messages; they are not credentials and need not be cryptographic. */
23
24
  function createEmbedRequestId() {
@@ -36,6 +37,7 @@ export function AgentEmbedPage() {
36
37
  var _f = useState([]), missingInputs = _f[0], setMissingInputs = _f[1];
37
38
  var locked = useRef(false);
38
39
  var schema = useRef(null);
40
+ var contextRequests = useRef(new Map());
39
41
  var params = useMemo(function () { return new URLSearchParams(window.location.search); }, []);
40
42
  var parentOrigin = (_a = params.get("parentOrigin")) !== null && _a !== void 0 ? _a : "";
41
43
  var instanceId = (_b = params.get("instanceId")) !== null && _b !== void 0 ? _b : "";
@@ -46,6 +48,31 @@ export function AgentEmbedPage() {
46
48
  if (parentOrigin)
47
49
  window.parent.postMessage(__assign({ channel: EMBED_CHANNEL, version: 1, instanceId: instanceId, type: type }, data), parentOrigin);
48
50
  }, [parentOrigin, instanceId]);
51
+ var beforeSend = React.useCallback(function (request, signal) {
52
+ if (signal.aborted)
53
+ return Promise.reject(new Error("Message preparation was cancelled."));
54
+ var requestId = createEmbedRequestId();
55
+ return new Promise(function (resolve, reject) {
56
+ var finish = function () {
57
+ var pending = contextRequests.current.get(requestId);
58
+ if (!pending)
59
+ return;
60
+ clearTimeout(pending.timer);
61
+ signal.removeEventListener("abort", pending.abort);
62
+ contextRequests.current.delete(requestId);
63
+ };
64
+ var abort = function () { finish(); reject(new Error("Message context request was cancelled.")); };
65
+ var timer = setTimeout(function () { finish(); reject(new Error("The host context request timed out.")); }, 5500);
66
+ contextRequests.current.set(requestId, { resolve: function (value) { finish(); resolve(value); },
67
+ reject: function (error) { finish(); reject(error); }, timer: timer, signal: signal, abort: abort });
68
+ signal.addEventListener("abort", abort, { once: true });
69
+ send("before_send_request", { requestId: requestId, protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, request: request });
70
+ });
71
+ }, [send]);
72
+ var relayRuntimeEvent = React.useCallback(function (notification) {
73
+ send("public_event", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION,
74
+ event: notification.event, payload: notification.payload });
75
+ }, [send]);
49
76
  useEffect(function () {
50
77
  console.info("[agent-embed][iframe] page initialized", { agentId: agentId, pageOrigin: window.location.origin, parentOrigin: parentOrigin, hasInstanceId: !!instanceId, isFramed: window.parent !== window });
51
78
  var parent;
@@ -141,12 +168,45 @@ export function AgentEmbedPage() {
141
168
  send("inputs_result", { requestId: data.requestId, ok: false, error: String(failure) });
142
169
  }
143
170
  }
171
+ else if (data.type === "before_send_result" && data.protocolVersion === EMBED_PUBLIC_PROTOCOL_VERSION
172
+ && typeof data.requestId === "string") {
173
+ var request = contextRequests.current.get(data.requestId);
174
+ if (request) {
175
+ if (!data.ok)
176
+ request.reject(new Error(typeof data.error === "string" ? data.error : "The host could not prepare message context."));
177
+ else {
178
+ try {
179
+ request.resolve(validateMessageContext(data.message_context));
180
+ }
181
+ catch (failure) {
182
+ request.reject(failure instanceof Error ? failure : new Error("Invalid host message context."));
183
+ }
184
+ }
185
+ }
186
+ }
187
+ else if (data.type === "command" && data.protocolVersion === EMBED_PUBLIC_PROTOCOL_VERSION
188
+ && typeof data.requestId === "string" && typeof data.command === "string") {
189
+ var allowed = new Set(["sendMessage", "prefill", "newChat", "cancelTurn", "reconnect", "setContext"]);
190
+ if (!allowed.has(data.command) || !data.payload || typeof data.payload !== "object" || Array.isArray(data.payload)) {
191
+ send("command_result", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, requestId: data.requestId, ok: false, error: "Invalid embed command." });
192
+ }
193
+ else {
194
+ var respond = function (result, failure) { return send("command_result", __assign({ protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, requestId: data.requestId, ok: !failure }, (failure ? { error: String(failure instanceof Error ? failure.message : failure).slice(0, 1024) } : { result: result !== null && result !== void 0 ? result : null }))); };
195
+ var commandEvent = new CustomEvent("solid-agent-embed:command", {
196
+ detail: { command: data.command, payload: data.payload, respond: respond }, cancelable: true,
197
+ });
198
+ if (window.dispatchEvent(commandEvent))
199
+ respond(undefined, new Error("Hosted chat is not ready."));
200
+ }
201
+ }
144
202
  };
145
203
  window.addEventListener("message", receive);
204
+ var unsubscribePublicEvents = onAgentPublicEvent(relayRuntimeEvent);
146
205
  var onKey = function (event) { if (event.key === "Escape")
147
206
  send("close"); };
148
207
  window.addEventListener("keydown", onKey);
149
- send("ready");
208
+ send("ready", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION,
209
+ capabilities: ["inlinePanel", "asyncBeforeSend", "messageContextV1", "publicCommands"] });
150
210
  void renewExternalAgentAuth(agentUrl).then(function () {
151
211
  console.info("[agent-embed][iframe] initial auth renewal completed");
152
212
  }).catch(function (failure) {
@@ -155,16 +215,19 @@ export function AgentEmbedPage() {
155
215
  return function () {
156
216
  disposed = true;
157
217
  window.removeEventListener("message", receive);
218
+ unsubscribePublicEvents();
158
219
  window.removeEventListener("keydown", onKey);
159
220
  if (pending) {
160
221
  clearTimeout(pending.timer);
161
222
  pending.reject(new Error("Embed closed."));
162
223
  pending = null;
163
224
  }
225
+ contextRequests.current.forEach(function (request) { return request.reject(new Error("Embed closed.")); });
226
+ contextRequests.current.clear();
164
227
  registration.dispose();
165
228
  };
166
- }, [agentId, agentUrl, instanceId, parentOrigin, send]);
167
- return _jsx(Provider, { store: store, children: _jsxs("main", { className: styles.page, children: [missingInputs.length > 0 ? (_jsx("section", { role: "alert", className: styles.errorPage, children: _jsxs("div", { className: styles.errorCard, children: [_jsx("span", { className: styles.errorMark, "aria-hidden": "true", children: "!" }), _jsx("p", { className: styles.errorEyebrow, children: "Agent setup required" }), _jsx("h1", { children: "This agent needs input values" }), _jsx("p", { className: styles.errorCopy, children: "The chat could not start because the host application did not provide all required inputs." }), _jsxs("div", { className: styles.missingInputs, children: [_jsx("strong", { children: "Missing inputs" }), _jsx("ul", { children: missingInputs.map(function (name) { return _jsx("li", { children: _jsx("code", { children: name }) }, name); }) })] }), _jsxs("p", { className: styles.errorHint, children: ["Update the SDK integration to pass these values in its ", _jsx("code", { children: "inputs" }), " option, then open the chat again."] }), _jsx("button", { type: "button", className: styles.errorClose, onClick: function () { return send("close"); }, children: "Close chat" })] }) })) : error ? (_jsx("section", { role: "alert", className: styles.errorPage, children: _jsxs("div", { className: styles.errorCard, children: [_jsx("span", { className: styles.errorMark, "aria-hidden": "true", children: "!" }), _jsx("p", { className: styles.errorEyebrow, children: "Connection problem" }), _jsx("h1", { children: "We couldn\u2019t start this chat" }), _jsx("p", { className: styles.errorCopy, children: error }), _jsx("button", { type: "button", className: styles.reconnect, onClick: function () { return void renewExternalAgentAuth(agentUrl).catch(function () { }); }, children: "Try again" })] }) })) : null, bootstrap ? _jsx(SolidAgentEmbedded, { agentRuntime: "agentHub", agentId: agentId, title: bootstrap.title, inputs: inputs, height: "100%", externalEmbed: { agentUrl: agentUrl, onInputsLocked: function (value) { locked.current = value; send("inputs_locked", { locked: value }); } } })
229
+ }, [agentId, agentUrl, instanceId, parentOrigin, send, relayRuntimeEvent]);
230
+ return _jsx(Provider, { store: store, children: _jsxs("main", { className: styles.page, children: [missingInputs.length > 0 ? (_jsx("section", { role: "alert", className: styles.errorPage, children: _jsxs("div", { className: styles.errorCard, children: [_jsx("span", { className: styles.errorMark, "aria-hidden": "true", children: "!" }), _jsx("p", { className: styles.errorEyebrow, children: "Agent setup required" }), _jsx("h1", { children: "This agent needs input values" }), _jsx("p", { className: styles.errorCopy, children: "The chat could not start because the host application did not provide all required inputs." }), _jsxs("div", { className: styles.missingInputs, children: [_jsx("strong", { children: "Missing inputs" }), _jsx("ul", { children: missingInputs.map(function (name) { return _jsx("li", { children: _jsx("code", { children: name }) }, name); }) })] }), _jsxs("p", { className: styles.errorHint, children: ["Update the SDK integration to pass these values in its ", _jsx("code", { children: "inputs" }), " option, then open the chat again."] }), _jsx("button", { type: "button", className: styles.errorClose, onClick: function () { return send("close"); }, children: "Close chat" })] }) })) : error ? (_jsx("section", { role: "alert", className: styles.errorPage, children: _jsxs("div", { className: styles.errorCard, children: [_jsx("span", { className: styles.errorMark, "aria-hidden": "true", children: "!" }), _jsx("p", { className: styles.errorEyebrow, children: "Connection problem" }), _jsx("h1", { children: "We couldn\u2019t start this chat" }), _jsx("p", { className: styles.errorCopy, children: error }), _jsx("button", { type: "button", className: styles.reconnect, onClick: function () { return void renewExternalAgentAuth(agentUrl).catch(function () { }); }, children: "Try again" })] }) })) : null, bootstrap ? _jsx(SolidAgentEmbedded, { agentRuntime: "agentHub", agentId: agentId, title: bootstrap.title, inputs: inputs, height: "100%", externalEmbed: { agentUrl: agentUrl, beforeSend: beforeSend, onInputsLocked: function (value) { locked.current = value; send("inputs_locked", { locked: value }); } } })
168
231
  : !error && missingInputs.length === 0 && _jsx("div", { className: styles.loading, role: "status", "aria-live": "polite", children: _jsxs("div", { className: styles.loadingCard, children: [_jsx("span", { className: styles.spinner, "aria-hidden": "true" }), _jsx("span", { className: styles.loadingTitle, children: "Please wait" }), _jsx("span", { className: styles.loadingMessage, children: "Connecting to your assistant" })] }) })] }) });
169
232
  }
170
233
  //# sourceMappingURL=AgentEmbedPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentEmbedPage.js","sourceRoot":"","sources":["../../../../src/routes/pages/embed/AgentEmbedPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { Provider } from \"react-redux\";\nimport { configureStore } from \"@reduxjs/toolkit\";\nimport agentReducer from \"../../../redux/features/agentSlice\";\nimport { SolidAgentEmbedded } from \"../../../components/core/solid-agent/SolidAgentEmbedded\";\nimport { registerExternalAgentAuth, renewExternalAgentAuth, type AgentAuth } from \"../../../components/core/solid-agent/client/agentAuth\";\nimport { EMBED_CHANNEL, MissingAgentInputsError, validateBootstrap, validateEmbedInputs, type AgentEmbedBootstrap } from \"../../../components/core/solid-agent/embed/agentEmbedProtocol\";\nimport styles from \"./AgentEmbedPage.module.css\";\n\n/** Request IDs correlate iframe messages; they are not credentials and need not be cryptographic. */\nfunction createEmbedRequestId(): string {\n if (typeof crypto.randomUUID === \"function\") return crypto.randomUUID();\n return `embed-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Public iframe surface. Authentication is supplied by the parent SDK, with no admin layout or session. */\nexport function AgentEmbedPage() {\n const agentId = Number(useParams().agentId);\n const [store] = useState(() => configureStore({ reducer: { solidAgent: agentReducer } }));\n const [bootstrap, setBootstrap] = useState<AgentEmbedBootstrap | null>(null);\n const [inputs, setInputs] = useState<Record<string, unknown>>({});\n const [error, setError] = useState(\"\");\n const [missingInputs, setMissingInputs] = useState<string[]>([]);\n const locked = useRef(false);\n const schema = useRef<AgentEmbedBootstrap | null>(null);\n const params = useMemo(() => new URLSearchParams(window.location.search), []);\n const parentOrigin = params.get(\"parentOrigin\") ?? \"\";\n const instanceId = params.get(\"instanceId\") ?? \"\";\n const agentUrl = `${window.location.origin}/embed/agent/${agentId}?agentId=${agentId}&embedInstance=${encodeURIComponent(instanceId)}`;\n const send = React.useCallback((type: string, data: Record<string, unknown> = {}) => {\n console.info(\"[agent-embed][iframe] sending parent message\", { type, instanceId, requestId: data.requestId });\n if (parentOrigin) window.parent.postMessage({ channel: EMBED_CHANNEL, version: 1, instanceId, type, ...data }, parentOrigin);\n }, [parentOrigin, instanceId]);\n\n useEffect(() => {\n console.info(\"[agent-embed][iframe] page initialized\", { agentId, pageOrigin: window.location.origin,\n parentOrigin, hasInstanceId: !!instanceId, isFramed: window.parent !== window });\n let parent: URL;\n try { parent = new URL(parentOrigin); } catch {\n console.error(\"[agent-embed][iframe] invalid parentOrigin\", { parentOrigin });\n setError(\"Open this chat using the SolidX embed SDK.\"); return;\n }\n if (window.parent === window || !instanceId || !Number.isSafeInteger(agentId) || agentId <= 0\n || parent.origin !== parentOrigin || ![\"http:\", \"https:\"].includes(parent.protocol)) {\n console.error(\"[agent-embed][iframe] embed configuration rejected\", { isFramed: window.parent !== window,\n hasInstanceId: !!instanceId, validAgentId: Number.isSafeInteger(agentId) && agentId > 0,\n parentOriginIsCanonical: parent.origin === parentOrigin, parentProtocol: parent.protocol });\n setError(\"Invalid embed configuration.\"); return;\n }\n console.info(\"[agent-embed][iframe] embed configuration accepted\", { agentId, parentOrigin: parent.origin });\n let disposed = false;\n let pending: { id: string; resolve: (auth: AgentAuth) => void; reject: (error: Error) => void; timer: ReturnType<typeof setTimeout> } | null = null;\n const registration = registerExternalAgentAuth(agentUrl, () => new Promise<AgentAuth>((resolve, reject) => {\n setError(\"\");\n setMissingInputs([]);\n const id = createEmbedRequestId();\n const timer = setTimeout(() => {\n pending = null;\n const failure = new Error(\"The token endpoint did not respond. Try reconnecting.\");\n console.error(\"[agent-embed][iframe] token request timed out\", { requestId: id, timeoutMs: 30000 });\n if (!disposed) setError(failure.message);\n reject(failure);\n }, 30000);\n pending = { id, resolve, reject, timer };\n console.info(\"[agent-embed][iframe] requesting token from parent\", { requestId: id });\n send(\"token_request\", { requestId: id });\n }));\n const receive = (event: MessageEvent) => {\n const data = event.data;\n if (event.source !== window.parent || event.origin !== parentOrigin || !data || data.channel !== EMBED_CHANNEL\n || data.version !== 1 || data.instanceId !== instanceId) {\n console.info(\"[agent-embed][iframe] ignored parent message\", { sourceMatchesParent: event.source === window.parent,\n originMatchesParent: event.origin === parentOrigin, hasData: !!data,\n channelMatches: !!data && data.channel === EMBED_CHANNEL, versionMatches: !!data && data.version === 1,\n instanceMatches: !!data && data.instanceId === instanceId });\n return;\n }\n console.info(\"[agent-embed][iframe] received parent message\", { type: data.type, requestId: data.requestId });\n if ((data.type === \"token\" || data.type === \"token_error\") && pending && pending.id === data.requestId) {\n const request = pending;\n pending = null;\n clearTimeout(request.timer);\n try {\n if (data.type === \"token_error\") throw new Error(String(data.error || \"Could not authenticate the chat.\"));\n const next = validateBootstrap(data.auth, agentId);\n console.info(\"[agent-embed][iframe] token bootstrap validated\", { agentId,\n hasAgentToken: !!next.agentToken, hasWsUrl: !!next.wsUrl, hasHttpUrl: !!next.httpUrl,\n requiredInputsCount: next.requiredInputs.length, inputsProvided: !!data.inputs });\n // A renewal may return a changed schema. Existing sessions keep their original inputs.\n if (!locked.current) { validateEmbedInputs(next.requiredInputs, data.inputs); setInputs(data.inputs); }\n schema.current = next;\n setBootstrap(next);\n setError(\"\");\n setMissingInputs([]);\n request.resolve({ ...next, solidUserId: null });\n send(\"authenticated\");\n } catch (failure) {\n const message = failure instanceof Error ? failure.message : \"Invalid bootstrap response.\";\n console.error(\"[agent-embed][iframe] token bootstrap rejected\", { name: failure instanceof Error ? failure.name : \"unknown\", message });\n if (failure instanceof MissingAgentInputsError) setMissingInputs(failure.inputNames);\n else setError(message);\n request.reject(new Error(message)); send(\"error\", { error: message });\n }\n } else if (data.type === \"set_inputs\") {\n try {\n if (locked.current) throw new Error(\"Start a new chat before changing inputs.\");\n if (schema.current) validateEmbedInputs(schema.current.requiredInputs, data.inputs);\n setInputs(data.inputs);\n send(\"inputs_result\", { requestId: data.requestId, ok: true });\n } catch (failure) { send(\"inputs_result\", { requestId: data.requestId, ok: false, error: String(failure) }); }\n }\n };\n window.addEventListener(\"message\", receive);\n const onKey = (event: KeyboardEvent) => { if (event.key === \"Escape\") send(\"close\"); };\n window.addEventListener(\"keydown\", onKey);\n send(\"ready\");\n void renewExternalAgentAuth(agentUrl).then(() => {\n console.info(\"[agent-embed][iframe] initial auth renewal completed\");\n }).catch((failure) => {\n console.warn(\"[agent-embed][iframe] initial auth renewal failed\", { message: failure instanceof Error ? failure.message : String(failure) });\n });\n return () => {\n disposed = true;\n window.removeEventListener(\"message\", receive);\n window.removeEventListener(\"keydown\", onKey);\n if (pending) { clearTimeout(pending.timer); pending.reject(new Error(\"Embed closed.\")); pending = null; }\n registration.dispose();\n };\n }, [agentId, agentUrl, instanceId, parentOrigin, send]);\n\n return <Provider store={store}><main className={styles.page}>\n {missingInputs.length > 0 ? (\n <section role=\"alert\" className={styles.errorPage}>\n <div className={styles.errorCard}>\n <span className={styles.errorMark} aria-hidden=\"true\">!</span>\n <p className={styles.errorEyebrow}>Agent setup required</p>\n <h1>This agent needs input values</h1>\n <p className={styles.errorCopy}>The chat could not start because the host application did not provide all required inputs.</p>\n <div className={styles.missingInputs}>\n <strong>Missing inputs</strong>\n <ul>{missingInputs.map((name) => <li key={name}><code>{name}</code></li>)}</ul>\n </div>\n <p className={styles.errorHint}>Update the SDK integration to pass these values in its <code>inputs</code> option, then open the chat again.</p>\n <button type=\"button\" className={styles.errorClose} onClick={() => send(\"close\")}>Close chat</button>\n </div>\n </section>\n ) : error ? (\n <section role=\"alert\" className={styles.errorPage}>\n <div className={styles.errorCard}>\n <span className={styles.errorMark} aria-hidden=\"true\">!</span>\n <p className={styles.errorEyebrow}>Connection problem</p>\n <h1>We couldn’t start this chat</h1>\n <p className={styles.errorCopy}>{error}</p>\n <button type=\"button\" className={styles.reconnect} onClick={() => void renewExternalAgentAuth(agentUrl).catch(() => {})}>Try again</button>\n </div>\n </section>\n ) : null}\n {bootstrap ? <SolidAgentEmbedded agentRuntime=\"agentHub\" agentId={agentId} title={bootstrap.title} inputs={inputs} height=\"100%\"\n externalEmbed={{ agentUrl, onInputsLocked: (value) => { locked.current = value; send(\"inputs_locked\", { locked: value }); } }} />\n : !error && missingInputs.length === 0 && <div className={styles.loading} role=\"status\" aria-live=\"polite\">\n <div className={styles.loadingCard}>\n <span className={styles.spinner} aria-hidden=\"true\" />\n <span className={styles.loadingTitle}>Please wait</span>\n <span className={styles.loadingMessage}>Connecting to your assistant</span>\n </div>\n </div>}\n </main></Provider>;\n}\n"]}
1
+ {"version":3,"file":"AgentEmbedPage.js","sourceRoot":"","sources":["../../../../src/routes/pages/embed/AgentEmbedPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { Provider } from \"react-redux\";\nimport { configureStore } from \"@reduxjs/toolkit\";\nimport agentReducer from \"../../../redux/features/agentSlice\";\nimport { SolidAgentEmbedded } from \"../../../components/core/solid-agent/SolidAgentEmbedded\";\nimport { onAgentPublicEvent, type AgentPublicEvent } from \"../../../components/core/solid-agent/client/agentPublicEvents\";\nimport { registerExternalAgentAuth, renewExternalAgentAuth, type AgentAuth } from \"../../../components/core/solid-agent/client/agentAuth\";\nimport { EMBED_CHANNEL, EMBED_PUBLIC_PROTOCOL_VERSION, MissingAgentInputsError, validateBootstrap, validateEmbedInputs, validateMessageContext, type AgentEmbedBootstrap, type BeforeUserMessageSendRequest, type EmbedMessageContext } from \"../../../components/core/solid-agent/embed/agentEmbedProtocol\";\nimport styles from \"./AgentEmbedPage.module.css\";\n\n/** Request IDs correlate iframe messages; they are not credentials and need not be cryptographic. */\nfunction createEmbedRequestId(): string {\n if (typeof crypto.randomUUID === \"function\") return crypto.randomUUID();\n return `embed-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Public iframe surface. Authentication is supplied by the parent SDK, with no admin layout or session. */\nexport function AgentEmbedPage() {\n const agentId = Number(useParams().agentId);\n const [store] = useState(() => configureStore({ reducer: { solidAgent: agentReducer } }));\n const [bootstrap, setBootstrap] = useState<AgentEmbedBootstrap | null>(null);\n const [inputs, setInputs] = useState<Record<string, unknown>>({});\n const [error, setError] = useState(\"\");\n const [missingInputs, setMissingInputs] = useState<string[]>([]);\n const locked = useRef(false);\n const schema = useRef<AgentEmbedBootstrap | null>(null);\n const contextRequests = useRef(new Map<string, { resolve: (value: EmbedMessageContext) => void; reject: (error: Error) => void; timer: ReturnType<typeof setTimeout>; signal: AbortSignal; abort: () => void }>());\n const params = useMemo(() => new URLSearchParams(window.location.search), []);\n const parentOrigin = params.get(\"parentOrigin\") ?? \"\";\n const instanceId = params.get(\"instanceId\") ?? \"\";\n const agentUrl = `${window.location.origin}/embed/agent/${agentId}?agentId=${agentId}&embedInstance=${encodeURIComponent(instanceId)}`;\n const send = React.useCallback((type: string, data: Record<string, unknown> = {}) => {\n console.info(\"[agent-embed][iframe] sending parent message\", { type, instanceId, requestId: data.requestId });\n if (parentOrigin) window.parent.postMessage({ channel: EMBED_CHANNEL, version: 1, instanceId, type, ...data }, parentOrigin);\n }, [parentOrigin, instanceId]);\n\n const beforeSend = React.useCallback((request: BeforeUserMessageSendRequest, signal: AbortSignal) => {\n if (signal.aborted) return Promise.reject(new Error(\"Message preparation was cancelled.\"));\n const requestId = createEmbedRequestId();\n return new Promise<EmbedMessageContext>((resolve, reject) => {\n const finish = () => {\n const pending = contextRequests.current.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timer);\n signal.removeEventListener(\"abort\", pending.abort);\n contextRequests.current.delete(requestId);\n };\n const abort = () => { finish(); reject(new Error(\"Message context request was cancelled.\")); };\n const timer = setTimeout(() => { finish(); reject(new Error(\"The host context request timed out.\")); }, 5500);\n contextRequests.current.set(requestId, { resolve: (value) => { finish(); resolve(value); },\n reject: (error) => { finish(); reject(error); }, timer, signal, abort });\n signal.addEventListener(\"abort\", abort, { once: true });\n send(\"before_send_request\", { requestId, protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, request });\n });\n }, [send]);\n\n const relayRuntimeEvent = React.useCallback((notification: AgentPublicEvent) => {\n send(\"public_event\", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION,\n event: notification.event, payload: notification.payload });\n }, [send]);\n\n useEffect(() => {\n console.info(\"[agent-embed][iframe] page initialized\", { agentId, pageOrigin: window.location.origin,\n parentOrigin, hasInstanceId: !!instanceId, isFramed: window.parent !== window });\n let parent: URL;\n try { parent = new URL(parentOrigin); } catch {\n console.error(\"[agent-embed][iframe] invalid parentOrigin\", { parentOrigin });\n setError(\"Open this chat using the SolidX embed SDK.\"); return;\n }\n if (window.parent === window || !instanceId || !Number.isSafeInteger(agentId) || agentId <= 0\n || parent.origin !== parentOrigin || ![\"http:\", \"https:\"].includes(parent.protocol)) {\n console.error(\"[agent-embed][iframe] embed configuration rejected\", { isFramed: window.parent !== window,\n hasInstanceId: !!instanceId, validAgentId: Number.isSafeInteger(agentId) && agentId > 0,\n parentOriginIsCanonical: parent.origin === parentOrigin, parentProtocol: parent.protocol });\n setError(\"Invalid embed configuration.\"); return;\n }\n console.info(\"[agent-embed][iframe] embed configuration accepted\", { agentId, parentOrigin: parent.origin });\n let disposed = false;\n let pending: { id: string; resolve: (auth: AgentAuth) => void; reject: (error: Error) => void; timer: ReturnType<typeof setTimeout> } | null = null;\n const registration = registerExternalAgentAuth(agentUrl, () => new Promise<AgentAuth>((resolve, reject) => {\n setError(\"\");\n setMissingInputs([]);\n const id = createEmbedRequestId();\n const timer = setTimeout(() => {\n pending = null;\n const failure = new Error(\"The token endpoint did not respond. Try reconnecting.\");\n console.error(\"[agent-embed][iframe] token request timed out\", { requestId: id, timeoutMs: 30000 });\n if (!disposed) setError(failure.message);\n reject(failure);\n }, 30000);\n pending = { id, resolve, reject, timer };\n console.info(\"[agent-embed][iframe] requesting token from parent\", { requestId: id });\n send(\"token_request\", { requestId: id });\n }));\n const receive = (event: MessageEvent) => {\n const data = event.data;\n if (event.source !== window.parent || event.origin !== parentOrigin || !data || data.channel !== EMBED_CHANNEL\n || data.version !== 1 || data.instanceId !== instanceId) {\n console.info(\"[agent-embed][iframe] ignored parent message\", { sourceMatchesParent: event.source === window.parent,\n originMatchesParent: event.origin === parentOrigin, hasData: !!data,\n channelMatches: !!data && data.channel === EMBED_CHANNEL, versionMatches: !!data && data.version === 1,\n instanceMatches: !!data && data.instanceId === instanceId });\n return;\n }\n console.info(\"[agent-embed][iframe] received parent message\", { type: data.type, requestId: data.requestId });\n if ((data.type === \"token\" || data.type === \"token_error\") && pending && pending.id === data.requestId) {\n const request = pending;\n pending = null;\n clearTimeout(request.timer);\n try {\n if (data.type === \"token_error\") throw new Error(String(data.error || \"Could not authenticate the chat.\"));\n const next = validateBootstrap(data.auth, agentId);\n console.info(\"[agent-embed][iframe] token bootstrap validated\", { agentId,\n hasAgentToken: !!next.agentToken, hasWsUrl: !!next.wsUrl, hasHttpUrl: !!next.httpUrl,\n requiredInputsCount: next.requiredInputs.length, inputsProvided: !!data.inputs });\n // A renewal may return a changed schema. Existing sessions keep their original inputs.\n if (!locked.current) { validateEmbedInputs(next.requiredInputs, data.inputs); setInputs(data.inputs); }\n schema.current = next;\n setBootstrap(next);\n setError(\"\");\n setMissingInputs([]);\n request.resolve({ ...next, solidUserId: null });\n send(\"authenticated\");\n } catch (failure) {\n const message = failure instanceof Error ? failure.message : \"Invalid bootstrap response.\";\n console.error(\"[agent-embed][iframe] token bootstrap rejected\", { name: failure instanceof Error ? failure.name : \"unknown\", message });\n if (failure instanceof MissingAgentInputsError) setMissingInputs(failure.inputNames);\n else setError(message);\n request.reject(new Error(message)); send(\"error\", { error: message });\n }\n } else if (data.type === \"set_inputs\") {\n try {\n if (locked.current) throw new Error(\"Start a new chat before changing inputs.\");\n if (schema.current) validateEmbedInputs(schema.current.requiredInputs, data.inputs);\n setInputs(data.inputs);\n send(\"inputs_result\", { requestId: data.requestId, ok: true });\n } catch (failure) { send(\"inputs_result\", { requestId: data.requestId, ok: false, error: String(failure) }); }\n } else if (data.type === \"before_send_result\" && data.protocolVersion === EMBED_PUBLIC_PROTOCOL_VERSION\n && typeof data.requestId === \"string\") {\n const request = contextRequests.current.get(data.requestId);\n if (request) {\n if (!data.ok) request.reject(new Error(typeof data.error === \"string\" ? data.error : \"The host could not prepare message context.\"));\n else {\n try { request.resolve(validateMessageContext(data.message_context)); }\n catch (failure) { request.reject(failure instanceof Error ? failure : new Error(\"Invalid host message context.\")); }\n }\n }\n } else if (data.type === \"command\" && data.protocolVersion === EMBED_PUBLIC_PROTOCOL_VERSION\n && typeof data.requestId === \"string\" && typeof data.command === \"string\") {\n const allowed = new Set([\"sendMessage\", \"prefill\", \"newChat\", \"cancelTurn\", \"reconnect\", \"setContext\"]);\n if (!allowed.has(data.command) || !data.payload || typeof data.payload !== \"object\" || Array.isArray(data.payload)) {\n send(\"command_result\", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, requestId: data.requestId, ok: false, error: \"Invalid embed command.\" });\n } else {\n const respond = (result?: unknown, failure?: unknown) => send(\"command_result\", {\n protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, requestId: data.requestId, ok: !failure,\n ...(failure ? { error: String(failure instanceof Error ? failure.message : failure).slice(0, 1024) } : { result: result ?? null }),\n });\n const commandEvent = new CustomEvent(\"solid-agent-embed:command\", {\n detail: { command: data.command, payload: data.payload, respond }, cancelable: true,\n });\n if (window.dispatchEvent(commandEvent)) respond(undefined, new Error(\"Hosted chat is not ready.\"));\n }\n }\n };\n window.addEventListener(\"message\", receive);\n const unsubscribePublicEvents = onAgentPublicEvent(relayRuntimeEvent);\n const onKey = (event: KeyboardEvent) => { if (event.key === \"Escape\") send(\"close\"); };\n window.addEventListener(\"keydown\", onKey);\n send(\"ready\", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION,\n capabilities: [\"inlinePanel\", \"asyncBeforeSend\", \"messageContextV1\", \"publicCommands\"] });\n void renewExternalAgentAuth(agentUrl).then(() => {\n console.info(\"[agent-embed][iframe] initial auth renewal completed\");\n }).catch((failure) => {\n console.warn(\"[agent-embed][iframe] initial auth renewal failed\", { message: failure instanceof Error ? failure.message : String(failure) });\n });\n return () => {\n disposed = true;\n window.removeEventListener(\"message\", receive);\n unsubscribePublicEvents();\n window.removeEventListener(\"keydown\", onKey);\n if (pending) { clearTimeout(pending.timer); pending.reject(new Error(\"Embed closed.\")); pending = null; }\n contextRequests.current.forEach((request) => request.reject(new Error(\"Embed closed.\")));\n contextRequests.current.clear();\n registration.dispose();\n };\n }, [agentId, agentUrl, instanceId, parentOrigin, send, relayRuntimeEvent]);\n\n return <Provider store={store}><main className={styles.page}>\n {missingInputs.length > 0 ? (\n <section role=\"alert\" className={styles.errorPage}>\n <div className={styles.errorCard}>\n <span className={styles.errorMark} aria-hidden=\"true\">!</span>\n <p className={styles.errorEyebrow}>Agent setup required</p>\n <h1>This agent needs input values</h1>\n <p className={styles.errorCopy}>The chat could not start because the host application did not provide all required inputs.</p>\n <div className={styles.missingInputs}>\n <strong>Missing inputs</strong>\n <ul>{missingInputs.map((name) => <li key={name}><code>{name}</code></li>)}</ul>\n </div>\n <p className={styles.errorHint}>Update the SDK integration to pass these values in its <code>inputs</code> option, then open the chat again.</p>\n <button type=\"button\" className={styles.errorClose} onClick={() => send(\"close\")}>Close chat</button>\n </div>\n </section>\n ) : error ? (\n <section role=\"alert\" className={styles.errorPage}>\n <div className={styles.errorCard}>\n <span className={styles.errorMark} aria-hidden=\"true\">!</span>\n <p className={styles.errorEyebrow}>Connection problem</p>\n <h1>We couldn’t start this chat</h1>\n <p className={styles.errorCopy}>{error}</p>\n <button type=\"button\" className={styles.reconnect} onClick={() => void renewExternalAgentAuth(agentUrl).catch(() => {})}>Try again</button>\n </div>\n </section>\n ) : null}\n {bootstrap ? <SolidAgentEmbedded agentRuntime=\"agentHub\" agentId={agentId} title={bootstrap.title} inputs={inputs} height=\"100%\"\n externalEmbed={{ agentUrl, beforeSend, onInputsLocked: (value) => { locked.current = value; send(\"inputs_locked\", { locked: value }); } }} />\n : !error && missingInputs.length === 0 && <div className={styles.loading} role=\"status\" aria-live=\"polite\">\n <div className={styles.loadingCard}>\n <span className={styles.spinner} aria-hidden=\"true\" />\n <span className={styles.loadingTitle}>Please wait</span>\n <span className={styles.loadingMessage}>Connecting to your assistant</span>\n </div>\n </div>}\n </main></Provider>;\n}\n"]}
@@ -4,8 +4,9 @@ import { Provider } from "react-redux";
4
4
  import { configureStore } from "@reduxjs/toolkit";
5
5
  import agentReducer from "../../../redux/features/agentSlice";
6
6
  import { SolidAgentEmbedded } from "../../../components/core/solid-agent/SolidAgentEmbedded";
7
+ import { onAgentPublicEvent, type AgentPublicEvent } from "../../../components/core/solid-agent/client/agentPublicEvents";
7
8
  import { registerExternalAgentAuth, renewExternalAgentAuth, type AgentAuth } from "../../../components/core/solid-agent/client/agentAuth";
8
- import { EMBED_CHANNEL, MissingAgentInputsError, validateBootstrap, validateEmbedInputs, type AgentEmbedBootstrap } from "../../../components/core/solid-agent/embed/agentEmbedProtocol";
9
+ import { EMBED_CHANNEL, EMBED_PUBLIC_PROTOCOL_VERSION, MissingAgentInputsError, validateBootstrap, validateEmbedInputs, validateMessageContext, type AgentEmbedBootstrap, type BeforeUserMessageSendRequest, type EmbedMessageContext } from "../../../components/core/solid-agent/embed/agentEmbedProtocol";
9
10
  import styles from "./AgentEmbedPage.module.css";
10
11
 
11
12
  /** Request IDs correlate iframe messages; they are not credentials and need not be cryptographic. */
@@ -24,6 +25,7 @@ export function AgentEmbedPage() {
24
25
  const [missingInputs, setMissingInputs] = useState<string[]>([]);
25
26
  const locked = useRef(false);
26
27
  const schema = useRef<AgentEmbedBootstrap | null>(null);
28
+ const contextRequests = useRef(new Map<string, { resolve: (value: EmbedMessageContext) => void; reject: (error: Error) => void; timer: ReturnType<typeof setTimeout>; signal: AbortSignal; abort: () => void }>());
27
29
  const params = useMemo(() => new URLSearchParams(window.location.search), []);
28
30
  const parentOrigin = params.get("parentOrigin") ?? "";
29
31
  const instanceId = params.get("instanceId") ?? "";
@@ -33,6 +35,31 @@ export function AgentEmbedPage() {
33
35
  if (parentOrigin) window.parent.postMessage({ channel: EMBED_CHANNEL, version: 1, instanceId, type, ...data }, parentOrigin);
34
36
  }, [parentOrigin, instanceId]);
35
37
 
38
+ const beforeSend = React.useCallback((request: BeforeUserMessageSendRequest, signal: AbortSignal) => {
39
+ if (signal.aborted) return Promise.reject(new Error("Message preparation was cancelled."));
40
+ const requestId = createEmbedRequestId();
41
+ return new Promise<EmbedMessageContext>((resolve, reject) => {
42
+ const finish = () => {
43
+ const pending = contextRequests.current.get(requestId);
44
+ if (!pending) return;
45
+ clearTimeout(pending.timer);
46
+ signal.removeEventListener("abort", pending.abort);
47
+ contextRequests.current.delete(requestId);
48
+ };
49
+ const abort = () => { finish(); reject(new Error("Message context request was cancelled.")); };
50
+ const timer = setTimeout(() => { finish(); reject(new Error("The host context request timed out.")); }, 5500);
51
+ contextRequests.current.set(requestId, { resolve: (value) => { finish(); resolve(value); },
52
+ reject: (error) => { finish(); reject(error); }, timer, signal, abort });
53
+ signal.addEventListener("abort", abort, { once: true });
54
+ send("before_send_request", { requestId, protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, request });
55
+ });
56
+ }, [send]);
57
+
58
+ const relayRuntimeEvent = React.useCallback((notification: AgentPublicEvent) => {
59
+ send("public_event", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION,
60
+ event: notification.event, payload: notification.payload });
61
+ }, [send]);
62
+
36
63
  useEffect(() => {
37
64
  console.info("[agent-embed][iframe] page initialized", { agentId, pageOrigin: window.location.origin,
38
65
  parentOrigin, hasInstanceId: !!instanceId, isFramed: window.parent !== window });
@@ -109,12 +136,39 @@ export function AgentEmbedPage() {
109
136
  setInputs(data.inputs);
110
137
  send("inputs_result", { requestId: data.requestId, ok: true });
111
138
  } catch (failure) { send("inputs_result", { requestId: data.requestId, ok: false, error: String(failure) }); }
139
+ } else if (data.type === "before_send_result" && data.protocolVersion === EMBED_PUBLIC_PROTOCOL_VERSION
140
+ && typeof data.requestId === "string") {
141
+ const request = contextRequests.current.get(data.requestId);
142
+ if (request) {
143
+ if (!data.ok) request.reject(new Error(typeof data.error === "string" ? data.error : "The host could not prepare message context."));
144
+ else {
145
+ try { request.resolve(validateMessageContext(data.message_context)); }
146
+ catch (failure) { request.reject(failure instanceof Error ? failure : new Error("Invalid host message context.")); }
147
+ }
148
+ }
149
+ } else if (data.type === "command" && data.protocolVersion === EMBED_PUBLIC_PROTOCOL_VERSION
150
+ && typeof data.requestId === "string" && typeof data.command === "string") {
151
+ const allowed = new Set(["sendMessage", "prefill", "newChat", "cancelTurn", "reconnect", "setContext"]);
152
+ if (!allowed.has(data.command) || !data.payload || typeof data.payload !== "object" || Array.isArray(data.payload)) {
153
+ send("command_result", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, requestId: data.requestId, ok: false, error: "Invalid embed command." });
154
+ } else {
155
+ const respond = (result?: unknown, failure?: unknown) => send("command_result", {
156
+ protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION, requestId: data.requestId, ok: !failure,
157
+ ...(failure ? { error: String(failure instanceof Error ? failure.message : failure).slice(0, 1024) } : { result: result ?? null }),
158
+ });
159
+ const commandEvent = new CustomEvent("solid-agent-embed:command", {
160
+ detail: { command: data.command, payload: data.payload, respond }, cancelable: true,
161
+ });
162
+ if (window.dispatchEvent(commandEvent)) respond(undefined, new Error("Hosted chat is not ready."));
163
+ }
112
164
  }
113
165
  };
114
166
  window.addEventListener("message", receive);
167
+ const unsubscribePublicEvents = onAgentPublicEvent(relayRuntimeEvent);
115
168
  const onKey = (event: KeyboardEvent) => { if (event.key === "Escape") send("close"); };
116
169
  window.addEventListener("keydown", onKey);
117
- send("ready");
170
+ send("ready", { protocolVersion: EMBED_PUBLIC_PROTOCOL_VERSION,
171
+ capabilities: ["inlinePanel", "asyncBeforeSend", "messageContextV1", "publicCommands"] });
118
172
  void renewExternalAgentAuth(agentUrl).then(() => {
119
173
  console.info("[agent-embed][iframe] initial auth renewal completed");
120
174
  }).catch((failure) => {
@@ -123,11 +177,14 @@ export function AgentEmbedPage() {
123
177
  return () => {
124
178
  disposed = true;
125
179
  window.removeEventListener("message", receive);
180
+ unsubscribePublicEvents();
126
181
  window.removeEventListener("keydown", onKey);
127
182
  if (pending) { clearTimeout(pending.timer); pending.reject(new Error("Embed closed.")); pending = null; }
183
+ contextRequests.current.forEach((request) => request.reject(new Error("Embed closed.")));
184
+ contextRequests.current.clear();
128
185
  registration.dispose();
129
186
  };
130
- }, [agentId, agentUrl, instanceId, parentOrigin, send]);
187
+ }, [agentId, agentUrl, instanceId, parentOrigin, send, relayRuntimeEvent]);
131
188
 
132
189
  return <Provider store={store}><main className={styles.page}>
133
190
  {missingInputs.length > 0 ? (
@@ -157,7 +214,7 @@ export function AgentEmbedPage() {
157
214
  </section>
158
215
  ) : null}
159
216
  {bootstrap ? <SolidAgentEmbedded agentRuntime="agentHub" agentId={agentId} title={bootstrap.title} inputs={inputs} height="100%"
160
- externalEmbed={{ agentUrl, onInputsLocked: (value) => { locked.current = value; send("inputs_locked", { locked: value }); } }} />
217
+ externalEmbed={{ agentUrl, beforeSend, onInputsLocked: (value) => { locked.current = value; send("inputs_locked", { locked: value }); } }} />
161
218
  : !error && missingInputs.length === 0 && <div className={styles.loading} role="status" aria-live="polite">
162
219
  <div className={styles.loadingCard}>
163
220
  <span className={styles.spinner} aria-hidden="true" />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidxai/core-ui",
3
- "version": "0.1.20",
3
+ "version": "0.1.21-beta.0",
4
4
  "scripts": {
5
5
  "build:tailwind": "tailwindcss -i ./src/resources/solid-tailwind.css -o ./src/resources/solid-tailwind-generated.css -c ./tailwind.config.js --minify",
6
6
  "prebuild": "npm run build:tailwind && npm run copy-resources && npm run copy-styles",