@solidxai/core-ui 0.1.19 → 0.1.20-beta.1

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 (282) hide show
  1. package/dist/components/common/Link.d.ts.map +1 -1
  2. package/dist/components/common/Link.js +2 -1
  3. package/dist/components/common/Link.js.map +1 -1
  4. package/dist/components/common/Link.tsx +2 -1
  5. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +1 -0
  6. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  7. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +109 -23
  8. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  9. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +155 -34
  10. package/dist/components/core/chatter/SolidChatter.js +2 -2
  11. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  12. package/dist/components/core/chatter/SolidChatter.tsx +2 -2
  13. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js +20 -19
  14. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js.map +1 -1
  15. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +16 -16
  16. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts.map +1 -1
  17. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js +3 -10
  18. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js.map +1 -1
  19. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx +3 -8
  20. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.d.ts.map +1 -1
  21. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js +36 -9
  22. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js.map +1 -1
  23. package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.tsx +78 -7
  24. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts +1 -0
  25. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts.map +1 -1
  26. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js +1 -1
  27. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js.map +1 -1
  28. package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.tsx +1 -1
  29. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts +4 -0
  30. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts.map +1 -0
  31. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js +131 -0
  32. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js.map +1 -0
  33. package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.tsx +151 -0
  34. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts +4 -0
  35. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts.map +1 -0
  36. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js +13 -0
  37. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js.map +1 -0
  38. package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.tsx +20 -0
  39. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  40. package/dist/components/core/form/SolidFormView.js +4 -0
  41. package/dist/components/core/form/SolidFormView.js.map +1 -1
  42. package/dist/components/core/form/SolidFormView.tsx +4 -0
  43. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  44. package/dist/components/core/kanban/SolidKanbanView.js +50 -15
  45. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  46. package/dist/components/core/kanban/SolidKanbanView.tsx +22 -3
  47. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  48. package/dist/components/core/list/SolidListView.js +16 -3
  49. package/dist/components/core/list/SolidListView.js.map +1 -1
  50. package/dist/components/core/list/SolidListView.tsx +16 -2
  51. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  52. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +4 -1
  53. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  54. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +4 -1
  55. package/dist/components/core/module/ModulePackageDialog.css +102 -0
  56. package/dist/components/core/module/ModulePackageDialog.d.ts +2 -1
  57. package/dist/components/core/module/ModulePackageDialog.d.ts.map +1 -1
  58. package/dist/components/core/module/ModulePackageDialog.js +216 -68
  59. package/dist/components/core/module/ModulePackageDialog.js.map +1 -1
  60. package/dist/components/core/module/ModulePackageDialog.tsx +356 -76
  61. package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -1
  62. package/dist/components/core/solid-agent/SolidAgentChat.js +9 -3
  63. package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -1
  64. package/dist/components/core/solid-agent/SolidAgentChat.tsx +9 -4
  65. package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts.map +1 -1
  66. package/dist/components/core/solid-agent/SolidAgentMarkdown.js +25 -6
  67. package/dist/components/core/solid-agent/SolidAgentMarkdown.js.map +1 -1
  68. package/dist/components/core/solid-agent/SolidAgentMarkdown.tsx +15 -1
  69. package/dist/components/core/solid-agent/client/agentRuntime.d.ts +5 -0
  70. package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -1
  71. package/dist/components/core/solid-agent/client/agentRuntime.js +77 -20
  72. package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -1
  73. package/dist/components/core/solid-agent/client/agentRuntime.ts +29 -1
  74. package/dist/components/core/solid-agent/client/agentSocket.d.ts +5 -1
  75. package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -1
  76. package/dist/components/core/solid-agent/client/agentSocket.js +27 -4
  77. package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -1
  78. package/dist/components/core/solid-agent/client/agentSocket.ts +14 -3
  79. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +2 -2
  80. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -1
  81. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +5 -5
  82. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +2 -0
  83. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -1
  84. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +2 -2
  85. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -1
  86. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +4 -4
  87. package/dist/components/core/solid-agent/thread/AgentThread.d.ts.map +1 -1
  88. package/dist/components/core/solid-agent/thread/AgentThread.js +61 -26
  89. package/dist/components/core/solid-agent/thread/AgentThread.js.map +1 -1
  90. package/dist/components/core/solid-agent/thread/AgentThread.tsx +74 -40
  91. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts +2 -1
  92. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts.map +1 -1
  93. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js +2 -1
  94. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js.map +1 -1
  95. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.tsx +3 -1
  96. package/dist/components/core/solid-agent/types.d.ts +3 -0
  97. package/dist/components/core/solid-agent/types.d.ts.map +1 -1
  98. package/dist/components/core/solid-agent/types.js +0 -9
  99. package/dist/components/core/solid-agent/types.js.map +1 -1
  100. package/dist/components/core/solid-agent/types.ts +4 -2
  101. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts +1 -1
  102. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts.map +1 -1
  103. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js +5 -2
  104. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js.map +1 -1
  105. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.tsx +11 -5
  106. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js +3 -0
  107. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js.map +1 -1
  108. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.tsx +4 -0
  109. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js +3 -0
  110. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js.map +1 -1
  111. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.tsx +4 -0
  112. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js +3 -0
  113. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js.map +1 -1
  114. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.tsx +4 -0
  115. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js +3 -0
  116. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js.map +1 -1
  117. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.tsx +4 -0
  118. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js +3 -0
  119. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js.map +1 -1
  120. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.tsx +4 -0
  121. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +3 -0
  122. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -1
  123. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +4 -0
  124. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js +3 -0
  125. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js.map +1 -1
  126. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.tsx +4 -0
  127. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js +3 -0
  128. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js.map +1 -1
  129. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.tsx +4 -0
  130. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js +3 -0
  131. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js.map +1 -1
  132. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.tsx +4 -0
  133. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js +19 -0
  134. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js.map +1 -1
  135. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.tsx +20 -0
  136. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js +3 -0
  137. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js.map +1 -1
  138. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.tsx +4 -0
  139. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js +3 -0
  140. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js.map +1 -1
  141. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.tsx +4 -0
  142. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js +3 -0
  143. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js.map +1 -1
  144. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.tsx +4 -0
  145. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js +3 -0
  146. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js.map +1 -1
  147. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.tsx +4 -0
  148. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js +3 -0
  149. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js.map +1 -1
  150. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.tsx +4 -0
  151. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js +3 -0
  152. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js.map +1 -1
  153. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.tsx +4 -0
  154. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js +3 -0
  155. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js.map +1 -1
  156. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.tsx +4 -0
  157. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js +3 -0
  158. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js.map +1 -1
  159. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.tsx +4 -0
  160. package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +9 -1
  161. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  162. package/dist/components/core/users/CreateUser.js +23 -8
  163. package/dist/components/core/users/CreateUser.js.map +1 -1
  164. package/dist/components/core/users/CreateUser.tsx +10 -6
  165. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
  166. package/dist/components/layout/AdminHeaderActions.js +1 -29
  167. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  168. package/dist/components/layout/AdminHeaderActions.tsx +0 -42
  169. package/dist/components/layout/AdminTopHeader.js +2 -2
  170. package/dist/components/layout/AdminTopHeader.js.map +1 -1
  171. package/dist/components/layout/AdminTopHeader.tsx +2 -2
  172. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  173. package/dist/components/layout/AppSidebar.js +21 -5
  174. package/dist/components/layout/AppSidebar.js.map +1 -1
  175. package/dist/components/layout/AppSidebar.tsx +24 -6
  176. package/dist/components/layout/SolidAiStudioLayout.d.ts +0 -1
  177. package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
  178. package/dist/components/layout/SolidAiStudioLayout.js +8 -161
  179. package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
  180. package/dist/components/layout/SolidAiStudioLayout.tsx +6 -136
  181. package/dist/components/layout/user-profile-menu.js +10 -10
  182. package/dist/components/layout/user-profile-menu.js.map +1 -1
  183. package/dist/components/layout/user-profile-menu.tsx +3 -3
  184. package/dist/components/shad-cn-ui/SolidLightbox.d.ts +2 -1
  185. package/dist/components/shad-cn-ui/SolidLightbox.d.ts.map +1 -1
  186. package/dist/components/shad-cn-ui/SolidLightbox.js +11 -4
  187. package/dist/components/shad-cn-ui/SolidLightbox.js.map +1 -1
  188. package/dist/components/shad-cn-ui/SolidLightbox.tsx +14 -1
  189. package/dist/helpers/modelViewPersistence.d.ts +2 -0
  190. package/dist/helpers/modelViewPersistence.d.ts.map +1 -1
  191. package/dist/helpers/modelViewPersistence.js +72 -0
  192. package/dist/helpers/modelViewPersistence.js.map +1 -1
  193. package/dist/helpers/modelViewPersistence.ts +79 -0
  194. package/dist/helpers/registry.d.ts +6 -2
  195. package/dist/helpers/registry.d.ts.map +1 -1
  196. package/dist/helpers/registry.js +68 -3
  197. package/dist/helpers/registry.js.map +1 -1
  198. package/dist/helpers/registry.ts +62 -4
  199. package/dist/hooks/useModelsDevModels.d.ts +43 -0
  200. package/dist/hooks/useModelsDevModels.d.ts.map +1 -0
  201. package/dist/hooks/useModelsDevModels.js +81 -0
  202. package/dist/hooks/useModelsDevModels.js.map +1 -0
  203. package/dist/hooks/useModelsDevModels.ts +106 -0
  204. package/dist/hooks/useRouter.d.ts.map +1 -1
  205. package/dist/hooks/useRouter.js +3 -2
  206. package/dist/hooks/useRouter.js.map +1 -1
  207. package/dist/hooks/useRouter.ts +3 -2
  208. package/dist/index.d.ts +2 -2
  209. package/dist/index.d.ts.map +1 -1
  210. package/dist/index.js +1 -1
  211. package/dist/index.js.map +1 -1
  212. package/dist/index.ts +4 -1
  213. package/dist/modules/solidUiModule.d.ts +3 -2
  214. package/dist/modules/solidUiModule.d.ts.map +1 -1
  215. package/dist/modules/solidUiModule.js +1 -1
  216. package/dist/modules/solidUiModule.js.map +1 -1
  217. package/dist/modules/solidUiModule.ts +5 -1
  218. package/dist/redux/api/moduleApi.d.ts +12 -2
  219. package/dist/redux/api/moduleApi.d.ts.map +1 -1
  220. package/dist/redux/api/moduleApi.js +33 -3
  221. package/dist/redux/api/moduleApi.js.map +1 -1
  222. package/dist/redux/api/moduleApi.ts +17 -2
  223. package/dist/redux/api/solidChatterMessageApi.d.ts +3 -1
  224. package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
  225. package/dist/redux/api/solidChatterMessageApi.js +9 -1
  226. package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
  227. package/dist/redux/api/solidChatterMessageApi.ts +9 -1
  228. package/dist/redux/store/defaultStoreConfig.d.ts +9 -1
  229. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  230. package/dist/resources/globals.css +30 -0
  231. package/dist/resources/solid-custom.css +10 -6
  232. package/dist/resources/solid-tailwind-generated.css +1 -1
  233. package/dist/routes/AppEventListener.d.ts.map +1 -1
  234. package/dist/routes/AppEventListener.js +3 -3
  235. package/dist/routes/AppEventListener.js.map +1 -1
  236. package/dist/routes/AppEventListener.tsx +2 -3
  237. package/dist/routes/pages/admin/core/AgentHubTagsField.css +21 -0
  238. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts +17 -0
  239. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts.map +1 -0
  240. package/dist/routes/pages/admin/core/AgentHubTagsField.js +171 -0
  241. package/dist/routes/pages/admin/core/AgentHubTagsField.js.map +1 -0
  242. package/dist/routes/pages/admin/core/AgentHubTagsField.tsx +125 -0
  243. package/dist/routes/pages/admin/core/AgentPersonaHistory.css +130 -0
  244. package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts +7 -0
  245. package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts.map +1 -0
  246. package/dist/routes/pages/admin/core/AgentPersonaHistory.js +228 -0
  247. package/dist/routes/pages/admin/core/AgentPersonaHistory.js.map +1 -0
  248. package/dist/routes/pages/admin/core/AgentPersonaHistory.tsx +234 -0
  249. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +13 -14
  250. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
  251. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +218 -165
  252. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
  253. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +221 -127
  254. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -1
  255. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +14 -69
  256. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -1
  257. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +15 -83
  258. package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts +11 -0
  259. package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts.map +1 -0
  260. package/dist/routes/pages/admin/core/AgentToolActivationDialog.js +166 -0
  261. package/dist/routes/pages/admin/core/AgentToolActivationDialog.js.map +1 -0
  262. package/dist/routes/pages/admin/core/AgentToolActivationDialog.tsx +140 -0
  263. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.css +26 -0
  264. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -1
  265. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +94 -71
  266. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -1
  267. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +60 -52
  268. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts +2 -0
  269. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts.map +1 -0
  270. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js +108 -0
  271. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js.map +1 -0
  272. package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.tsx +96 -0
  273. package/dist/routes/solidRoutes.d.ts.map +1 -1
  274. package/dist/routes/solidRoutes.js +2 -0
  275. package/dist/routes/solidRoutes.js.map +1 -1
  276. package/dist/routes/solidRoutes.tsx +2 -0
  277. package/dist/types/extension-registry.d.ts +12 -0
  278. package/dist/types/extension-registry.d.ts.map +1 -1
  279. package/dist/types/extension-registry.js.map +1 -1
  280. package/dist/types/extension-registry.ts +15 -0
  281. package/dist/types/solid-core.d.ts +2 -0
  282. package/package.json +2 -1
@@ -46,6 +46,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
46
46
  }
47
47
  };
48
48
  import { eventBus } from "../../../../helpers/eventBus";
49
+ import { getAgentChatWidgetCatalog } from "../../../../helpers/registry";
49
50
  import { agentConnectionChanged, agentEventReceived, agentHistoryLoaded, agentThreadReset, agentUserMessageAdded, } from "../../../../redux/features/agentSlice";
50
51
  import { historyToItems, normalizeAgentFrame } from "../agentEvents";
51
52
  import { SOLID_AGENT_EVENTS } from "../sdk/solidAgent";
@@ -143,6 +144,30 @@ var AgentRuntime = /** @class */ (function () {
143
144
  writable: true,
144
145
  value: void 0
145
146
  });
147
+ Object.defineProperty(this, "historySessionId", {
148
+ enumerable: true,
149
+ configurable: true,
150
+ writable: true,
151
+ value: null
152
+ });
153
+ Object.defineProperty(this, "historyGeneration", {
154
+ enumerable: true,
155
+ configurable: true,
156
+ writable: true,
157
+ value: 0
158
+ });
159
+ Object.defineProperty(this, "loadingHistoryPages", {
160
+ enumerable: true,
161
+ configurable: true,
162
+ writable: true,
163
+ value: new Map()
164
+ });
165
+ Object.defineProperty(this, "loadedHistoryPages", {
166
+ enumerable: true,
167
+ configurable: true,
168
+ writable: true,
169
+ value: new Set()
170
+ });
146
171
  Object.defineProperty(this, "sessionKey", {
147
172
  enumerable: true,
148
173
  configurable: true,
@@ -150,7 +175,7 @@ var AgentRuntime = /** @class */ (function () {
150
175
  value: void 0
151
176
  });
152
177
  this.sessionKey = sessionKey(agentRuntime, agentUrl);
153
- this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub");
178
+ this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub", agentRuntime === "agentHub" ? getAgentChatWidgetCatalog() : []);
154
179
  this.unsubscribers.push(this.socket.onEvent(function (frame) { return _this.handleFrame(frame); }), this.socket.onStatus(function (status) { return _this.dispatch(agentConnectionChanged(status)); }));
155
180
  this.socket.connect();
156
181
  }
@@ -230,6 +255,7 @@ var AgentRuntime = /** @class */ (function () {
230
255
  configurable: true,
231
256
  writable: true,
232
257
  value: function () {
258
+ this.resetHistoryLoads();
233
259
  if (this.persistSession)
234
260
  writeSessionId(this.sessionKey, null);
235
261
  this.lastContext = undefined;
@@ -242,6 +268,7 @@ var AgentRuntime = /** @class */ (function () {
242
268
  configurable: true,
243
269
  writable: true,
244
270
  value: function (sessionId) {
271
+ this.resetHistoryLoads();
245
272
  if (this.persistSession)
246
273
  writeSessionId(this.sessionKey, sessionId);
247
274
  this.dispatch(agentThreadReset());
@@ -270,11 +297,23 @@ var AgentRuntime = /** @class */ (function () {
270
297
  });
271
298
  }
272
299
  });
300
+ Object.defineProperty(AgentRuntime.prototype, "resetHistoryLoads", {
301
+ enumerable: false,
302
+ configurable: true,
303
+ writable: true,
304
+ value: function () {
305
+ this.historyGeneration += 1;
306
+ this.historySessionId = null;
307
+ this.loadingHistoryPages.clear();
308
+ this.loadedHistoryPages.clear();
309
+ }
310
+ });
273
311
  Object.defineProperty(AgentRuntime.prototype, "dispose", {
274
312
  enumerable: false,
275
313
  configurable: true,
276
314
  writable: true,
277
315
  value: function () {
316
+ this.resetHistoryLoads();
278
317
  this.unsubscribers.forEach(function (off) { return off(); });
279
318
  if (this.frame != null)
280
319
  cancelAnimationFrame(this.frame);
@@ -286,35 +325,49 @@ var AgentRuntime = /** @class */ (function () {
286
325
  configurable: true,
287
326
  writable: true,
288
327
  value: function (historySessionId, page) {
289
- var _a;
328
+ var _a, _b;
290
329
  return __awaiter(this, void 0, void 0, function () {
291
- var result, rawItems, items, _b, _c;
292
- return __generator(this, function (_d) {
293
- switch (_d.label) {
330
+ var key, generation, result, rawItems, items, _c, _d;
331
+ return __generator(this, function (_e) {
332
+ switch (_e.label) {
294
333
  case 0:
295
- _d.trys.push([0, 5, , 6]);
296
- return [4 /*yield*/, fetchSessionHistory(this.agentUrl, historySessionId, page)];
334
+ key = "".concat(historySessionId, ":").concat(page);
335
+ if (this.loadingHistoryPages.has(key) || this.loadedHistoryPages.has(key))
336
+ return [2 /*return*/];
337
+ generation = this.historyGeneration;
338
+ this.loadingHistoryPages.set(key, generation);
339
+ _e.label = 1;
297
340
  case 1:
298
- result = _d.sent();
341
+ _e.trys.push([1, 6, 7, 8]);
342
+ return [4 /*yield*/, fetchSessionHistory(this.agentUrl, historySessionId, page)];
343
+ case 2:
344
+ result = _e.sent();
299
345
  if (!result)
300
346
  return [2 /*return*/];
301
347
  rawItems = historyToItems((_a = result.messages) !== null && _a !== void 0 ? _a : []);
302
- if (!this.persistSession) return [3 /*break*/, 3];
348
+ if (!this.persistSession) return [3 /*break*/, 4];
303
349
  return [4 /*yield*/, resolveAttachmentMedia(rawItems)];
304
- case 2:
305
- _b = _d.sent();
306
- return [3 /*break*/, 4];
307
350
  case 3:
308
- _b = rawItems;
309
- _d.label = 4;
351
+ _c = _e.sent();
352
+ return [3 /*break*/, 5];
310
353
  case 4:
311
- items = _b;
312
- this.dispatch(agentHistoryLoaded({ items: items, hasMore: !!result.has_more, page: page }));
313
- return [3 /*break*/, 6];
354
+ _c = rawItems;
355
+ _e.label = 5;
314
356
  case 5:
315
- _c = _d.sent();
316
- return [3 /*break*/, 6];
317
- case 6: return [2 /*return*/];
357
+ items = _c;
358
+ if (generation !== this.historyGeneration || ((_b = this.getState()) === null || _b === void 0 ? void 0 : _b.historySessionId) !== historySessionId)
359
+ return [2 /*return*/];
360
+ this.dispatch(agentHistoryLoaded({ items: items, hasMore: !!result.has_more, page: page }));
361
+ this.loadedHistoryPages.add(key);
362
+ return [3 /*break*/, 8];
363
+ case 6:
364
+ _d = _e.sent();
365
+ return [3 /*break*/, 8];
366
+ case 7:
367
+ if (this.loadingHistoryPages.get(key) === generation)
368
+ this.loadingHistoryPages.delete(key);
369
+ return [7 /*endfinally*/];
370
+ case 8: return [2 /*return*/];
318
371
  }
319
372
  });
320
373
  });
@@ -354,6 +407,10 @@ var AgentRuntime = /** @class */ (function () {
354
407
  eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId: sessionId, agentType: this.agentRuntime });
355
408
  var state = this.getState();
356
409
  var historyId = (_d = (_c = event.frame.history_session_id) !== null && _c !== void 0 ? _c : event.eventData.history_session_id) !== null && _d !== void 0 ? _d : sessionId;
410
+ if (historyId !== this.historySessionId) {
411
+ this.resetHistoryLoads();
412
+ this.historySessionId = historyId;
413
+ }
357
414
  if (state && state.items.length === 0 && historyId)
358
415
  void this.loadHistory(historyId, 1);
359
416
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agentRuntime.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventBus } from \"../../../../helpers/eventBus\";\nimport {\n agentConnectionChanged,\n agentEventReceived,\n agentHistoryLoaded,\n agentThreadReset,\n agentUserMessageAdded,\n type AgentState,\n} from \"../../../../redux/features/agentSlice\";\nimport { historyToItems, normalizeAgentFrame } from \"../agentEvents\";\nimport { SOLID_AGENT_EVENTS } from \"../sdk/solidAgent\";\nimport { AgentEventTypes, type AgentRuntimeType, type AgentAttachment, type AgentChatEvent, type AgentContext, type AgentWireFrame } from \"../types\";\nimport { resolveAttachmentMedia } from \"./agentAttachmentMedia\";\nimport { clearAllAgentAuth } from \"./agentAuth\";\nimport { fetchSessionHistory, uploadAgentAttachments } from \"./agentRest\";\nimport { AgentSocket } from \"./agentSocket\";\nimport { agentIdOf } from \"./agentUrls\";\n\n/**\n * A live connection to one agent backend. The \"solidx\" runtime is shared by the floating window and\n * any embedded chat of that type (ensureAgentRuntime); other types get their own runtime per\n * embedded chat (see useAgentChat). Owns the AgentSocket, normalises frames to `{ eventType, eventData }`, batches LlmToken\n * deltas to one dispatch per animation frame, loads history on session start, and emits the\n * public SDK events on the event bus.\n */\n\ntype Dispatch = (action: any) => any;\ntype GetAgentState = () => AgentState | undefined;\n\n/** Keep the original SolidX storage key; Agent Hub keeps one per agent (its agent URL names the agent). */\nfunction sessionKey(agentRuntime: AgentRuntimeType, agentUrl: string) {\n if (agentRuntime === \"solidx\") return \"solid-agent.session_id\";\n const agentId = agentIdOf(agentUrl);\n return agentId === undefined ? `solid-agent.${agentRuntime}.session_id` : `solid-agent.${agentRuntime}.${agentId}.session_id`;\n}\n\nfunction readSessionId(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeSessionId(key: string, id: string | null) {\n try {\n id ? localStorage.setItem(key, id) : localStorage.removeItem(key);\n } catch {\n // Storage blocked (private mode); the session just won't survive a reload.\n }\n}\n\nexport class AgentRuntime {\n readonly socket: AgentSocket;\n private pendingDelta = \"\";\n private frame: number | null = null;\n private unsubscribers: Array<() => void> = [];\n private lastContext: AgentContext | undefined;\n\n private readonly sessionKey: string;\n\n constructor(\n readonly agentUrl: string,\n private dispatch: Dispatch,\n private getState: GetAgentState,\n readonly agentRuntime: AgentRuntimeType = \"solidx\",\n private persistSession = true,\n ) {\n this.sessionKey = sessionKey(agentRuntime, agentUrl);\n this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === \"agentHub\");\n this.unsubscribers.push(\n this.socket.onEvent((frame) => this.handleFrame(frame)),\n this.socket.onStatus((status) => this.dispatch(agentConnectionChanged(status))),\n );\n this.socket.connect();\n }\n\n /**\n * Uploads files into SolidX media storage first, then sends their IDs with the socket message.\n */\n async sendMessage(text: string, context?: AgentContext, attachments: AgentAttachment[] = [], inputs?: Record<string, unknown>) {\n const content = text.trim();\n if (!content && !attachments.length) return;\n const uploaded = attachments.length\n ? await uploadAgentAttachments(this.agentUrl, attachments.map((item) => item.file))\n : [];\n if (uploaded.length !== attachments.length) {\n throw new Error(\"SolidX did not confirm every uploaded file. Please retry.\");\n }\n if (context) this.lastContext = context;\n const displayAttachments = attachments.map((item, index) => ({\n ...item.meta,\n ...(uploaded[index] ? { mediaId: uploaded[index].id } : {}),\n }));\n this.dispatch(agentUserMessageAdded({ text: content, attachments: displayAttachments }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content,\n context: context ?? this.lastContext,\n ...(this.agentRuntime === \"agentHub\" && inputs ? { inputs } : {}),\n ...(attachments.length ? { attachments: uploaded } : {}),\n });\n }\n\n /** Answers a widget. Sent as text too, so agents without widget_reply support still understand it. */\n replyToWidget(widgetId: string, widget: string, value: unknown) {\n const text = typeof value === \"string\" ? value : Array.isArray(value) ? value.join(\", \") : JSON.stringify(value);\n this.dispatch(agentUserMessageAdded({ text }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content: text,\n context: this.lastContext,\n widget_reply: { widgetId, value },\n });\n eventBus.emit(SOLID_AGENT_EVENTS.widgetAction, { widgetId, widget, value, agentType: this.agentRuntime });\n }\n\n cancel() {\n const sessionId = this.socket.currentSessionId;\n if (sessionId) this.socket.send({ action: \"cancel\", session_id: sessionId });\n }\n\n newChat() {\n if (this.persistSession) writeSessionId(this.sessionKey, null);\n this.lastContext = undefined;\n this.dispatch(agentThreadReset());\n this.socket.newSession();\n }\n\n resume(sessionId: string) {\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n this.dispatch(agentThreadReset());\n this.socket.resume(sessionId);\n }\n\n async loadOlder() {\n const state = this.getState();\n if (!state?.historySessionId || !state.hasMoreHistory) return;\n await this.loadHistory(state.historySessionId, state.historyPage + 1);\n }\n\n dispose() {\n this.unsubscribers.forEach((off) => off());\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.socket.close();\n }\n\n private async loadHistory(historySessionId: string, page: number) {\n try {\n const result = await fetchSessionHistory(this.agentUrl, historySessionId, page);\n if (!result) return;\n // Attached files are stored in Solid media storage; resolve their URLs before showing.\n const rawItems = historyToItems(result.messages ?? []);\n const items = this.persistSession ? await resolveAttachmentMedia(rawItems) : rawItems;\n this.dispatch(agentHistoryLoaded({ items, hasMore: !!result.has_more, page }));\n } catch {\n // History is a convenience; the live session still works without it.\n }\n }\n\n private handleFrame(frame: AgentWireFrame) {\n const event = normalizeAgentFrame(frame);\n\n // Stream text is batched per animation frame unless it carries a widget of its own.\n if (event.eventType === AgentEventTypes.llmToken && !event.eventData.widget) {\n this.pendingDelta += event.eventData.delta ?? \"\";\n if (this.frame == null) this.frame = requestAnimationFrame(() => this.flushTokens());\n return;\n }\n // Keep order: any buffered text lands before the next event.\n this.flushTokens();\n this.dispatch(agentEventReceived(event));\n this.emitSdkEvents(event);\n }\n\n private emitSdkEvents(event: AgentChatEvent) {\n if (event.eventType === AgentEventTypes.sessionStarted) {\n const sessionId = event.frame.session_id ?? event.eventData.session_id ?? null;\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId, agentType: this.agentRuntime });\n const state = this.getState();\n const historyId = event.frame.history_session_id ?? event.eventData.history_session_id ?? sessionId;\n if (state && state.items.length === 0 && historyId) void this.loadHistory(historyId, 1);\n } else if (event.eventType === AgentEventTypes.turnComplete || event.eventType === AgentEventTypes.turnCompleteLegacy) {\n eventBus.emit(SOLID_AGENT_EVENTS.turnComplete, {\n sessionId: this.socket.currentSessionId,\n agentType: this.agentRuntime,\n content: event.eventData.content ?? event.frame.content,\n });\n }\n }\n\n private flushTokens() {\n if (this.frame != null) {\n cancelAnimationFrame(this.frame);\n this.frame = null;\n }\n if (!this.pendingDelta) return;\n const delta = this.pendingDelta;\n this.pendingDelta = \"\";\n this.dispatch(agentEventReceived(normalizeAgentFrame({ event_type: AgentEventTypes.llmToken, event_data: { delta } })));\n }\n}\n\nlet runtime: AgentRuntime | null = null;\n\n/** Returns the shared \"solidx\" runtime, creating (or re-pointing) it for `agentUrl`. */\nexport function ensureAgentRuntime(agentUrl: string, dispatch: Dispatch, getState: GetAgentState): AgentRuntime {\n if (runtime && runtime.agentUrl === agentUrl) return runtime;\n runtime?.dispose();\n runtime = new AgentRuntime(agentUrl, dispatch, getState);\n return runtime;\n}\n\nexport function getAgentRuntime(): AgentRuntime | null {\n return runtime;\n}\n\n/** Closes the connection and forgets this tab's agent logins (e.g. on logout). */\nexport function disposeAgentRuntime() {\n runtime?.dispose();\n runtime = null;\n clearAllAgentAuth();\n}\n"]}
1
+ {"version":3,"file":"agentRuntime.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventBus } from \"../../../../helpers/eventBus\";\nimport { getAgentChatWidgetCatalog } from \"../../../../helpers/registry\";\nimport {\n agentConnectionChanged,\n agentEventReceived,\n agentHistoryLoaded,\n agentThreadReset,\n agentUserMessageAdded,\n type AgentState,\n} from \"../../../../redux/features/agentSlice\";\nimport { historyToItems, normalizeAgentFrame } from \"../agentEvents\";\nimport { SOLID_AGENT_EVENTS } from \"../sdk/solidAgent\";\nimport { AgentEventTypes, type AgentRuntimeType, type AgentAttachment, type AgentChatEvent, type AgentContext, type AgentWireFrame } from \"../types\";\nimport { resolveAttachmentMedia } from \"./agentAttachmentMedia\";\nimport { clearAllAgentAuth } from \"./agentAuth\";\nimport { fetchSessionHistory, uploadAgentAttachments } from \"./agentRest\";\nimport { AgentSocket } from \"./agentSocket\";\nimport { agentIdOf } from \"./agentUrls\";\n\n/**\n * A live connection to one agent backend. The \"solidx\" runtime is shared by the floating window and\n * any embedded chat of that type (ensureAgentRuntime); other types get their own runtime per\n * embedded chat (see useAgentChat). Owns the AgentSocket, normalises frames to `{ eventType, eventData }`, batches LlmToken\n * deltas to one dispatch per animation frame, loads history on session start, and emits the\n * public SDK events on the event bus.\n */\n\ntype Dispatch = (action: any) => any;\ntype GetAgentState = () => AgentState | undefined;\n\n/** Keep the original SolidX storage key; Agent Hub keeps one per agent (its agent URL names the agent). */\nfunction sessionKey(agentRuntime: AgentRuntimeType, agentUrl: string) {\n if (agentRuntime === \"solidx\") return \"solid-agent.session_id\";\n const agentId = agentIdOf(agentUrl);\n return agentId === undefined ? `solid-agent.${agentRuntime}.session_id` : `solid-agent.${agentRuntime}.${agentId}.session_id`;\n}\n\nfunction readSessionId(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeSessionId(key: string, id: string | null) {\n try {\n id ? localStorage.setItem(key, id) : localStorage.removeItem(key);\n } catch {\n // Storage blocked (private mode); the session just won't survive a reload.\n }\n}\n\nexport class AgentRuntime {\n readonly socket: AgentSocket;\n private pendingDelta = \"\";\n private frame: number | null = null;\n private unsubscribers: Array<() => void> = [];\n private lastContext: AgentContext | undefined;\n private historySessionId: string | null = null;\n private historyGeneration = 0;\n private loadingHistoryPages = new Map<string, number>();\n private loadedHistoryPages = new Set<string>();\n\n private readonly sessionKey: string;\n\n constructor(\n readonly agentUrl: string,\n private dispatch: Dispatch,\n private getState: GetAgentState,\n readonly agentRuntime: AgentRuntimeType = \"solidx\",\n private persistSession = true,\n ) {\n this.sessionKey = sessionKey(agentRuntime, agentUrl);\n this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === \"agentHub\",\n agentRuntime === \"agentHub\" ? getAgentChatWidgetCatalog() : []);\n this.unsubscribers.push(\n this.socket.onEvent((frame) => this.handleFrame(frame)),\n this.socket.onStatus((status) => this.dispatch(agentConnectionChanged(status))),\n );\n this.socket.connect();\n }\n\n /**\n * Uploads files into SolidX media storage first, then sends their IDs with the socket message.\n */\n async sendMessage(text: string, context?: AgentContext, attachments: AgentAttachment[] = [], inputs?: Record<string, unknown>) {\n const content = text.trim();\n if (!content && !attachments.length) return;\n const uploaded = attachments.length\n ? await uploadAgentAttachments(this.agentUrl, attachments.map((item) => item.file))\n : [];\n if (uploaded.length !== attachments.length) {\n throw new Error(\"SolidX did not confirm every uploaded file. Please retry.\");\n }\n if (context) this.lastContext = context;\n const displayAttachments = attachments.map((item, index) => ({\n ...item.meta,\n ...(uploaded[index] ? { mediaId: uploaded[index].id } : {}),\n }));\n this.dispatch(agentUserMessageAdded({ text: content, attachments: displayAttachments }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content,\n context: context ?? this.lastContext,\n ...(this.agentRuntime === \"agentHub\" && inputs ? { inputs } : {}),\n ...(attachments.length ? { attachments: uploaded } : {}),\n });\n }\n\n /** Answers a widget. Sent as text too, so agents without widget_reply support still understand it. */\n replyToWidget(widgetId: string, widget: string, value: unknown) {\n const text = typeof value === \"string\" ? value : Array.isArray(value) ? value.join(\", \") : JSON.stringify(value);\n this.dispatch(agentUserMessageAdded({ text }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content: text,\n context: this.lastContext,\n widget_reply: { widgetId, value },\n });\n eventBus.emit(SOLID_AGENT_EVENTS.widgetAction, { widgetId, widget, value, agentType: this.agentRuntime });\n }\n\n cancel() {\n const sessionId = this.socket.currentSessionId;\n if (sessionId) this.socket.send({ action: \"cancel\", session_id: sessionId });\n }\n\n newChat() {\n this.resetHistoryLoads();\n if (this.persistSession) writeSessionId(this.sessionKey, null);\n this.lastContext = undefined;\n this.dispatch(agentThreadReset());\n this.socket.newSession();\n }\n\n resume(sessionId: string) {\n this.resetHistoryLoads();\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n this.dispatch(agentThreadReset());\n this.socket.resume(sessionId);\n }\n\n async loadOlder() {\n const state = this.getState();\n if (!state?.historySessionId || !state.hasMoreHistory) return;\n await this.loadHistory(state.historySessionId, state.historyPage + 1);\n }\n\n private resetHistoryLoads() {\n this.historyGeneration += 1;\n this.historySessionId = null;\n this.loadingHistoryPages.clear();\n this.loadedHistoryPages.clear();\n }\n\n dispose() {\n this.resetHistoryLoads();\n this.unsubscribers.forEach((off) => off());\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.socket.close();\n }\n\n private async loadHistory(historySessionId: string, page: number) {\n const key = `${historySessionId}:${page}`;\n if (this.loadingHistoryPages.has(key) || this.loadedHistoryPages.has(key)) return;\n const generation = this.historyGeneration;\n this.loadingHistoryPages.set(key, generation);\n try {\n const result = await fetchSessionHistory(this.agentUrl, historySessionId, page);\n if (!result) return;\n // Attached files are stored in Solid media storage; resolve their URLs before showing.\n const rawItems = historyToItems(result.messages ?? []);\n const items = this.persistSession ? await resolveAttachmentMedia(rawItems) : rawItems;\n if (generation !== this.historyGeneration || this.getState()?.historySessionId !== historySessionId) return;\n this.dispatch(agentHistoryLoaded({ items, hasMore: !!result.has_more, page }));\n this.loadedHistoryPages.add(key);\n } catch {\n // History is a convenience; the live session still works without it.\n } finally {\n if (this.loadingHistoryPages.get(key) === generation) this.loadingHistoryPages.delete(key);\n }\n }\n\n private handleFrame(frame: AgentWireFrame) {\n const event = normalizeAgentFrame(frame);\n\n // Stream text is batched per animation frame unless it carries a widget of its own.\n if (event.eventType === AgentEventTypes.llmToken && !event.eventData.widget) {\n this.pendingDelta += event.eventData.delta ?? \"\";\n if (this.frame == null) this.frame = requestAnimationFrame(() => this.flushTokens());\n return;\n }\n // Keep order: any buffered text lands before the next event.\n this.flushTokens();\n this.dispatch(agentEventReceived(event));\n this.emitSdkEvents(event);\n }\n\n private emitSdkEvents(event: AgentChatEvent) {\n if (event.eventType === AgentEventTypes.sessionStarted) {\n const sessionId = event.frame.session_id ?? event.eventData.session_id ?? null;\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId, agentType: this.agentRuntime });\n const state = this.getState();\n const historyId = event.frame.history_session_id ?? event.eventData.history_session_id ?? sessionId;\n if (historyId !== this.historySessionId) {\n this.resetHistoryLoads();\n this.historySessionId = historyId;\n }\n if (state && state.items.length === 0 && historyId) void this.loadHistory(historyId, 1);\n } else if (event.eventType === AgentEventTypes.turnComplete || event.eventType === AgentEventTypes.turnCompleteLegacy) {\n eventBus.emit(SOLID_AGENT_EVENTS.turnComplete, {\n sessionId: this.socket.currentSessionId,\n agentType: this.agentRuntime,\n content: event.eventData.content ?? event.frame.content,\n });\n }\n }\n\n private flushTokens() {\n if (this.frame != null) {\n cancelAnimationFrame(this.frame);\n this.frame = null;\n }\n if (!this.pendingDelta) return;\n const delta = this.pendingDelta;\n this.pendingDelta = \"\";\n this.dispatch(agentEventReceived(normalizeAgentFrame({ event_type: AgentEventTypes.llmToken, event_data: { delta } })));\n }\n}\n\nlet runtime: AgentRuntime | null = null;\n\n/** Returns the shared \"solidx\" runtime, creating (or re-pointing) it for `agentUrl`. */\nexport function ensureAgentRuntime(agentUrl: string, dispatch: Dispatch, getState: GetAgentState): AgentRuntime {\n if (runtime && runtime.agentUrl === agentUrl) return runtime;\n runtime?.dispose();\n runtime = new AgentRuntime(agentUrl, dispatch, getState);\n return runtime;\n}\n\nexport function getAgentRuntime(): AgentRuntime | null {\n return runtime;\n}\n\n/** Closes the connection and forgets this tab's agent logins (e.g. on logout). */\nexport function disposeAgentRuntime() {\n runtime?.dispose();\n runtime = null;\n clearAllAgentAuth();\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { eventBus } from "../../../../helpers/eventBus";
2
+ import { getAgentChatWidgetCatalog } from "../../../../helpers/registry";
2
3
  import {
3
4
  agentConnectionChanged,
4
5
  agentEventReceived,
@@ -56,6 +57,10 @@ export class AgentRuntime {
56
57
  private frame: number | null = null;
57
58
  private unsubscribers: Array<() => void> = [];
58
59
  private lastContext: AgentContext | undefined;
60
+ private historySessionId: string | null = null;
61
+ private historyGeneration = 0;
62
+ private loadingHistoryPages = new Map<string, number>();
63
+ private loadedHistoryPages = new Set<string>();
59
64
 
60
65
  private readonly sessionKey: string;
61
66
 
@@ -67,7 +72,8 @@ export class AgentRuntime {
67
72
  private persistSession = true,
68
73
  ) {
69
74
  this.sessionKey = sessionKey(agentRuntime, agentUrl);
70
- this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub");
75
+ this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub",
76
+ agentRuntime === "agentHub" ? getAgentChatWidgetCatalog() : []);
71
77
  this.unsubscribers.push(
72
78
  this.socket.onEvent((frame) => this.handleFrame(frame)),
73
79
  this.socket.onStatus((status) => this.dispatch(agentConnectionChanged(status))),
@@ -123,6 +129,7 @@ export class AgentRuntime {
123
129
  }
124
130
 
125
131
  newChat() {
132
+ this.resetHistoryLoads();
126
133
  if (this.persistSession) writeSessionId(this.sessionKey, null);
127
134
  this.lastContext = undefined;
128
135
  this.dispatch(agentThreadReset());
@@ -130,6 +137,7 @@ export class AgentRuntime {
130
137
  }
131
138
 
132
139
  resume(sessionId: string) {
140
+ this.resetHistoryLoads();
133
141
  if (this.persistSession) writeSessionId(this.sessionKey, sessionId);
134
142
  this.dispatch(agentThreadReset());
135
143
  this.socket.resume(sessionId);
@@ -141,22 +149,38 @@ export class AgentRuntime {
141
149
  await this.loadHistory(state.historySessionId, state.historyPage + 1);
142
150
  }
143
151
 
152
+ private resetHistoryLoads() {
153
+ this.historyGeneration += 1;
154
+ this.historySessionId = null;
155
+ this.loadingHistoryPages.clear();
156
+ this.loadedHistoryPages.clear();
157
+ }
158
+
144
159
  dispose() {
160
+ this.resetHistoryLoads();
145
161
  this.unsubscribers.forEach((off) => off());
146
162
  if (this.frame != null) cancelAnimationFrame(this.frame);
147
163
  this.socket.close();
148
164
  }
149
165
 
150
166
  private async loadHistory(historySessionId: string, page: number) {
167
+ const key = `${historySessionId}:${page}`;
168
+ if (this.loadingHistoryPages.has(key) || this.loadedHistoryPages.has(key)) return;
169
+ const generation = this.historyGeneration;
170
+ this.loadingHistoryPages.set(key, generation);
151
171
  try {
152
172
  const result = await fetchSessionHistory(this.agentUrl, historySessionId, page);
153
173
  if (!result) return;
154
174
  // Attached files are stored in Solid media storage; resolve their URLs before showing.
155
175
  const rawItems = historyToItems(result.messages ?? []);
156
176
  const items = this.persistSession ? await resolveAttachmentMedia(rawItems) : rawItems;
177
+ if (generation !== this.historyGeneration || this.getState()?.historySessionId !== historySessionId) return;
157
178
  this.dispatch(agentHistoryLoaded({ items, hasMore: !!result.has_more, page }));
179
+ this.loadedHistoryPages.add(key);
158
180
  } catch {
159
181
  // History is a convenience; the live session still works without it.
182
+ } finally {
183
+ if (this.loadingHistoryPages.get(key) === generation) this.loadingHistoryPages.delete(key);
160
184
  }
161
185
  }
162
186
 
@@ -182,6 +206,10 @@ export class AgentRuntime {
182
206
  eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId, agentType: this.agentRuntime });
183
207
  const state = this.getState();
184
208
  const historyId = event.frame.history_session_id ?? event.eventData.history_session_id ?? sessionId;
209
+ if (historyId !== this.historySessionId) {
210
+ this.resetHistoryLoads();
211
+ this.historySessionId = historyId;
212
+ }
185
213
  if (state && state.items.length === 0 && historyId) void this.loadHistory(historyId, 1);
186
214
  } else if (event.eventType === AgentEventTypes.turnComplete || event.eventType === AgentEventTypes.turnCompleteLegacy) {
187
215
  eventBus.emit(SOLID_AGENT_EVENTS.turnComplete, {
@@ -1,10 +1,12 @@
1
1
  import type { AgentAction, AgentConnection, AgentWireFrame } from "../types";
2
+ import type { AgentChatWidgetMetadata } from "../../../../types/extension-registry";
2
3
  type EventListener = (frame: AgentWireFrame) => void;
3
4
  type StatusListener = (status: AgentConnection) => void;
4
5
  export declare class AgentSocket {
5
6
  private agentUrl;
6
7
  private initialSessionId;
7
8
  private checkProcessAvailability;
9
+ private widgetCatalog;
8
10
  private ws;
9
11
  private attempt;
10
12
  private timer;
@@ -19,8 +21,10 @@ export declare class AgentSocket {
19
21
  private unacknowledgedMessage;
20
22
  private offAuthChange;
21
23
  private readonly debugEmbed;
22
- constructor(agentUrl: string, initialSessionId?: string | null, checkProcessAvailability?: boolean);
24
+ constructor(agentUrl: string, initialSessionId?: string | null, checkProcessAvailability?: boolean, widgetCatalog?: AgentChatWidgetMetadata[]);
23
25
  private openSession;
26
+ private startSessionAction;
27
+ private resumeSessionAction;
24
28
  get currentSessionId(): string | null;
25
29
  onEvent(listener: EventListener): () => boolean;
26
30
  onStatus(listener: StatusListener): () => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"agentSocket.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAe7E,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AACrD,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAExD,qBAAa,WAAW;IAkBhB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,wBAAwB;IAnBpC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,SAAS,CAAuB;IACxC,0FAA0F;IAC1F,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,qBAAqB,CAA4B;IAEzD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;gBAGzB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,MAAM,GAAG,IAAW,EACtC,wBAAwB,UAAQ;IAa5C,OAAO,CAAC,WAAW;IAInB,IAAI,gBAAgB,kBAEnB;IAED,OAAO,CAAC,QAAQ,EAAE,aAAa;IAK/B,QAAQ,CAAC,QAAQ,EAAE,cAAc;IAKjC,OAAO;IAwFP,4EAA4E;IAC5E,IAAI,CAAC,MAAM,EAAE,WAAW;IAUxB,kEAAkE;IAClE,UAAU;IASV,4CAA4C;IAC5C,MAAM,CAAC,SAAS,EAAE,MAAM;IAOxB,uDAAuD;IACvD,KAAK;IASL,oEAAoE;IACpE,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;YAUJ,OAAO;IAYrB,OAAO,CAAC,iBAAiB;YAcX,iBAAiB;IAgB/B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,YAAY;CAQvB"}
1
+ {"version":3,"file":"agentSocket.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAepF,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AACrD,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAExD,qBAAa,WAAW;IAkBhB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,wBAAwB;IAChC,OAAO,CAAC,aAAa;IApBzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,SAAS,CAAuB;IACxC,0FAA0F;IAC1F,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,qBAAqB,CAA4B;IAEzD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;gBAGzB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,MAAM,GAAG,IAAW,EACtC,wBAAwB,UAAQ,EAChC,aAAa,GAAE,uBAAuB,EAAO;IAazD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,mBAAmB;IAK3B,IAAI,gBAAgB,kBAEnB;IAED,OAAO,CAAC,QAAQ,EAAE,aAAa;IAK/B,QAAQ,CAAC,QAAQ,EAAE,cAAc;IAKjC,OAAO;IAwFP,4EAA4E;IAC5E,IAAI,CAAC,MAAM,EAAE,WAAW;IAUxB,kEAAkE;IAClE,UAAU;IASV,4CAA4C;IAC5C,MAAM,CAAC,SAAS,EAAE,MAAM;IAOxB,uDAAuD;IACvD,KAAK;IASL,oEAAoE;IACpE,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;YAUJ,OAAO;IAYrB,OAAO,CAAC,iBAAiB;YAcX,iBAAiB;IAgB/B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,YAAY;CAQvB"}
@@ -57,10 +57,11 @@ import { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onA
57
57
  */
58
58
  var BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];
59
59
  var AgentSocket = /** @class */ (function () {
60
- function AgentSocket(agentUrl, initialSessionId, checkProcessAvailability) {
60
+ function AgentSocket(agentUrl, initialSessionId, checkProcessAvailability, widgetCatalog) {
61
61
  var _this = this;
62
62
  if (initialSessionId === void 0) { initialSessionId = null; }
63
63
  if (checkProcessAvailability === void 0) { checkProcessAvailability = false; }
64
+ if (widgetCatalog === void 0) { widgetCatalog = []; }
64
65
  Object.defineProperty(this, "agentUrl", {
65
66
  enumerable: true,
66
67
  configurable: true,
@@ -79,6 +80,12 @@ var AgentSocket = /** @class */ (function () {
79
80
  writable: true,
80
81
  value: checkProcessAvailability
81
82
  });
83
+ Object.defineProperty(this, "widgetCatalog", {
84
+ enumerable: true,
85
+ configurable: true,
86
+ writable: true,
87
+ value: widgetCatalog
88
+ });
82
89
  Object.defineProperty(this, "ws", {
83
90
  enumerable: true,
84
91
  configurable: true,
@@ -177,7 +184,23 @@ var AgentSocket = /** @class */ (function () {
177
184
  configurable: true,
178
185
  writable: true,
179
186
  value: function () {
180
- void this.sendRaw(this.sessionId ? { action: "resume_session", session_id: this.sessionId } : { action: "start_session" });
187
+ void this.sendRaw(this.sessionId ? this.resumeSessionAction(this.sessionId) : this.startSessionAction());
188
+ }
189
+ });
190
+ Object.defineProperty(AgentSocket.prototype, "startSessionAction", {
191
+ enumerable: false,
192
+ configurable: true,
193
+ writable: true,
194
+ value: function () {
195
+ return __assign({ action: "start_session" }, (this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}));
196
+ }
197
+ });
198
+ Object.defineProperty(AgentSocket.prototype, "resumeSessionAction", {
199
+ enumerable: false,
200
+ configurable: true,
201
+ writable: true,
202
+ value: function (sessionId) {
203
+ return __assign({ action: "resume_session", session_id: sessionId }, (this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}));
181
204
  }
182
205
  });
183
206
  Object.defineProperty(AgentSocket.prototype, "currentSessionId", {
@@ -345,7 +368,7 @@ var AgentSocket = /** @class */ (function () {
345
368
  this.sessionReady = false;
346
369
  this.queue = [];
347
370
  if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN)
348
- void this.sendRaw({ action: "start_session" });
371
+ void this.sendRaw(this.startSessionAction());
349
372
  else
350
373
  this.connect();
351
374
  }
@@ -360,7 +383,7 @@ var AgentSocket = /** @class */ (function () {
360
383
  this.sessionId = sessionId;
361
384
  this.sessionReady = false;
362
385
  if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN)
363
- void this.sendRaw({ action: "resume_session", session_id: sessionId });
386
+ void this.sendRaw(this.resumeSessionAction(sessionId));
364
387
  else
365
388
  this.connect();
366
389
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agentSocket.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentAction, AgentConnection, AgentWireFrame } from \"../types\";\nimport { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from \"./agentAuth\";\n\n/**\n * WebSocket client for the agent, connecting to the full `wsUrl` named at sign-in (agentAuth.ts).\n *\n * Held outside Redux because sockets are not serializable; the host wires its listeners to\n * dispatch into agentSlice. Every outbound frame carries the `agentToken` from the agent login;\n * there is no socket until the user has signed in with an API key, and signing out closes it. Unexpected closes\n * reconnect with backoff (1s, 2s, 4s, then 15s) and re-send `resume_session`; frames sent\n * while disconnected are queued and flushed once the session is re-established.\n */\n\nconst BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];\n\ntype EventListener = (frame: AgentWireFrame) => void;\ntype StatusListener = (status: AgentConnection) => void;\n\nexport class AgentSocket {\n private ws: WebSocket | null = null;\n private attempt = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private closedByUser = false;\n private queue: AgentAction[] = [];\n private eventListeners = new Set<EventListener>();\n private statusListeners = new Set<StatusListener>();\n private sessionId: string | null = null;\n /** False until the agent confirms the session (session_started) on the current socket. */\n private sessionReady = false;\n private checkingProcessAvailability = false;\n private unacknowledgedMessage: AgentAction | null = null;\n\n private offAuthChange: () => void;\n private readonly debugEmbed: boolean;\n\n constructor(\n private agentUrl: string,\n private initialSessionId: string | null = null,\n private checkProcessAvailability = false,\n ) {\n this.sessionId = initialSessionId;\n this.debugEmbed = !checkProcessAvailability;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] socket created\", { endpoint: this.safeEndpoint(), hasInitialSession: !!initialSessionId });\n // Signing in opens the socket on the wsUrl it named; signing out (or the token expiring) closes it.\n this.offAuthChange = onAgentAuthChange(agentUrl, () => {\n if (this.closedByUser) return;\n if (agentWsUrl(agentUrl)) this.connect();\n else this.disconnect();\n });\n }\n\n private openSession() {\n void this.sendRaw(this.sessionId ? { action: \"resume_session\", session_id: this.sessionId } : { action: \"start_session\" });\n }\n\n get currentSessionId() {\n return this.sessionId;\n }\n\n onEvent(listener: EventListener) {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n onStatus(listener: StatusListener) {\n this.statusListeners.add(listener);\n return () => this.statusListeners.delete(listener);\n }\n\n connect() {\n if (this.closedByUser) return;\n const state = this.ws?.readyState;\n if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;\n this.closedByUser = false;\n const url = agentWsUrl(this.agentUrl);\n if (!url) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] no WebSocket URL is available from auth yet\");\n // Not signed in: the auth listener connects once sign-in names the wsUrl.\n this.setStatus(\"idle\");\n return;\n }\n this.setStatus(this.attempt === 0 ? \"connecting\" : \"reconnecting\");\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] opening WebSocket\", { endpoint: this.safeEndpoint(url), attempt: this.attempt + 1 });\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch (error) {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket construction failed\", { name: error instanceof Error ? error.name : \"unknown\", message: error instanceof Error ? error.message : String(error) });\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.onopen = () => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket open\");\n this.attempt = 0;\n this.sessionReady = false;\n this.setStatus(\"open\");\n this.openSession();\n };\n\n ws.onmessage = (message) => {\n if (this.ws !== ws) return;\n let frame: AgentWireFrame;\n try {\n frame = JSON.parse(message.data);\n } catch {\n return;\n }\n const eventType = frame.event_type ?? frame.type;\n const payload = frame.event_data ?? frame.data;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket frame\", { eventType, hasSessionId: !!(frame.session_id ?? payload?.session_id), isError: eventType === \"error\" });\n if (eventType === \"session_started\") {\n // After an agent restart the old session is gone and resume returns a new id.\n this.sessionId = frame.session_id ?? payload?.session_id ?? null;\n this.sessionReady = true;\n this.flushQueue();\n } else if (eventType === \"error\" && /agent token/i.test(String(payload?.error ?? \"\"))) {\n // The agent forgot the token (idle 30 min or restarted): sign in again.\n this.sessionReady = false;\n if (this.unacknowledgedMessage) this.queue.push(this.unacknowledgedMessage);\n this.unacknowledgedMessage = null;\n clearAgentAuth(this.agentUrl);\n } else if (eventType === \"error\" && !this.sessionReady) {\n // Start/resume failed (e.g. auth); stop holding messages so their errors show.\n this.sessionReady = true;\n this.flushQueue();\n }\n if (eventType === \"UserMessage\" || eventType === \"turn_complete\" || eventType === \"error\") {\n this.unacknowledgedMessage = null;\n }\n // Drop frames for a different session (e.g. a late event after a switch).\n const frameSession = frame.session_id ?? payload?.session_id;\n if (eventType !== \"session_started\" && frameSession && this.sessionId && frameSession !== this.sessionId) return;\n this.eventListeners.forEach((listener) => listener(frame));\n };\n\n ws.onclose = (event) => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] WebSocket closed\", { code: event.code, reason: event.reason, clean: event.wasClean });\n this.ws = null;\n this.sessionReady = false;\n if (this.closedByUser) {\n this.setStatus(\"idle\");\n return;\n }\n this.scheduleReconnect();\n };\n\n ws.onerror = () => {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket error event\");\n // onclose follows and handles the reconnect.\n };\n }\n\n /** Sends an action, or queues it until the socket and session are ready. */\n send(action: AgentAction) {\n if (this.closedByUser) return;\n if (this.ws?.readyState === WebSocket.OPEN && this.sessionId && this.sessionReady) {\n void this.sendRaw(action);\n } else {\n this.queue.push(action);\n this.connect();\n }\n }\n\n /** Starts a fresh conversation (drops the current session id). */\n newSession() {\n this.unacknowledgedMessage = null;\n this.sessionId = null;\n this.sessionReady = false;\n this.queue = [];\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: \"start_session\" });\n else this.connect();\n }\n\n /** Switches to an existing conversation. */\n resume(sessionId: string) {\n this.sessionId = sessionId;\n this.sessionReady = false;\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: \"resume_session\", session_id: sessionId });\n else this.connect();\n }\n\n /** Closes for good (the runtime is being disposed). */\n close() {\n this.offAuthChange();\n this.closedByUser = true;\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.ws?.close();\n this.ws = null;\n }\n\n /** Drops the socket after sign-out; the next sign-in reconnects. */\n private disconnect() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.attempt = 0;\n this.sessionReady = false;\n if (this.ws) {\n this.ws.onclose = null; // No reconnect.\n this.ws.close();\n this.ws = null;\n }\n this.setStatus(\"idle\");\n }\n\n private flushQueue() {\n const pending = this.queue;\n this.queue = [];\n pending.forEach((action) => {\n // Queued messages were addressed before a session existed; point them at the current one.\n const addressed = \"session_id\" in action && this.sessionId ? { ...action, session_id: this.sessionId } : action;\n void this.sendRaw(addressed as AgentAction);\n });\n }\n\n private async sendRaw(action: AgentAction) {\n const agentToken = (await loadAgentAuth(this.agentUrl))?.agentToken;\n if (!agentToken || this.ws?.readyState !== WebSocket.OPEN) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] skipped outbound frame\", { action: action.action, hasAgentToken: !!agentToken, socketOpen: this.ws?.readyState === WebSocket.OPEN });\n if (action.action !== \"start_session\" && action.action !== \"resume_session\") this.queue.push(action);\n return;\n }\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] sending WebSocket action\", { action: action.action });\n this.ws.send(JSON.stringify({ ...action, agentToken }));\n if (action.action === \"message\") this.unacknowledgedMessage = action;\n }\n\n private scheduleReconnect() {\n if (this.timer) return;\n const delay = BACKOFF_MS[Math.min(this.attempt, BACKOFF_MS.length - 1)];\n this.attempt += 1;\n this.setStatus(this.attempt > BACKOFF_MS.length ? \"offline\" : \"reconnecting\");\n if (this.checkProcessAvailability && this.attempt >= 2 && this.attempt % 3 === 2) {\n void this.checkAgentProcess(this.attempt);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.connect();\n }, delay);\n }\n\n private async checkAgentProcess(failedAttempt: number) {\n if (this.checkingProcessAvailability) return;\n this.checkingProcessAvailability = true;\n try {\n const auth = await loadAgentAuth(this.agentUrl);\n if (!auth || this.closedByUser || this.attempt !== failedAttempt) return;\n if (!(await isAgentProcessAvailable(auth)) && !this.closedByUser && this.attempt === failedAttempt) {\n // Repeated WebSocket failures plus a failed process health check mean the stored\n // endpoint is stale. Returning to sign-in lets the manager issue a fresh wsUrl.\n clearAgentAuth(this.agentUrl);\n }\n } finally {\n this.checkingProcessAvailability = false;\n }\n }\n\n private setStatus(status: AgentConnection) {\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] connection status\", { status });\n this.statusListeners.forEach((listener) => listener(status));\n }\n\n private safeEndpoint(url = this.agentUrl) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return \"invalid-url\";\n }\n }\n}\n"]}
1
+ {"version":3,"file":"agentSocket.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentAction, AgentConnection, AgentWireFrame } from \"../types\";\nimport type { AgentChatWidgetMetadata } from \"../../../../types/extension-registry\";\nimport { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from \"./agentAuth\";\n\n/**\n * WebSocket client for the agent, connecting to the full `wsUrl` named at sign-in (agentAuth.ts).\n *\n * Held outside Redux because sockets are not serializable; the host wires its listeners to\n * dispatch into agentSlice. Every outbound frame carries the `agentToken` from the agent login;\n * there is no socket until the user has signed in with an API key, and signing out closes it. Unexpected closes\n * reconnect with backoff (1s, 2s, 4s, then 15s) and re-send `resume_session`; frames sent\n * while disconnected are queued and flushed once the session is re-established.\n */\n\nconst BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];\n\ntype EventListener = (frame: AgentWireFrame) => void;\ntype StatusListener = (status: AgentConnection) => void;\n\nexport class AgentSocket {\n private ws: WebSocket | null = null;\n private attempt = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private closedByUser = false;\n private queue: AgentAction[] = [];\n private eventListeners = new Set<EventListener>();\n private statusListeners = new Set<StatusListener>();\n private sessionId: string | null = null;\n /** False until the agent confirms the session (session_started) on the current socket. */\n private sessionReady = false;\n private checkingProcessAvailability = false;\n private unacknowledgedMessage: AgentAction | null = null;\n\n private offAuthChange: () => void;\n private readonly debugEmbed: boolean;\n\n constructor(\n private agentUrl: string,\n private initialSessionId: string | null = null,\n private checkProcessAvailability = false,\n private widgetCatalog: AgentChatWidgetMetadata[] = [],\n ) {\n this.sessionId = initialSessionId;\n this.debugEmbed = !checkProcessAvailability;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] socket created\", { endpoint: this.safeEndpoint(), hasInitialSession: !!initialSessionId });\n // Signing in opens the socket on the wsUrl it named; signing out (or the token expiring) closes it.\n this.offAuthChange = onAgentAuthChange(agentUrl, () => {\n if (this.closedByUser) return;\n if (agentWsUrl(agentUrl)) this.connect();\n else this.disconnect();\n });\n }\n\n private openSession() {\n void this.sendRaw(this.sessionId ? this.resumeSessionAction(this.sessionId) : this.startSessionAction());\n }\n\n private startSessionAction(): AgentAction {\n return { action: \"start_session\", ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };\n }\n\n private resumeSessionAction(sessionId: string): AgentAction {\n return { action: \"resume_session\", session_id: sessionId,\n ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };\n }\n\n get currentSessionId() {\n return this.sessionId;\n }\n\n onEvent(listener: EventListener) {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n onStatus(listener: StatusListener) {\n this.statusListeners.add(listener);\n return () => this.statusListeners.delete(listener);\n }\n\n connect() {\n if (this.closedByUser) return;\n const state = this.ws?.readyState;\n if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;\n this.closedByUser = false;\n const url = agentWsUrl(this.agentUrl);\n if (!url) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] no WebSocket URL is available from auth yet\");\n // Not signed in: the auth listener connects once sign-in names the wsUrl.\n this.setStatus(\"idle\");\n return;\n }\n this.setStatus(this.attempt === 0 ? \"connecting\" : \"reconnecting\");\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] opening WebSocket\", { endpoint: this.safeEndpoint(url), attempt: this.attempt + 1 });\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch (error) {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket construction failed\", { name: error instanceof Error ? error.name : \"unknown\", message: error instanceof Error ? error.message : String(error) });\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.onopen = () => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket open\");\n this.attempt = 0;\n this.sessionReady = false;\n this.setStatus(\"open\");\n this.openSession();\n };\n\n ws.onmessage = (message) => {\n if (this.ws !== ws) return;\n let frame: AgentWireFrame;\n try {\n frame = JSON.parse(message.data);\n } catch {\n return;\n }\n const eventType = frame.event_type ?? frame.type;\n const payload = frame.event_data ?? frame.data;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket frame\", { eventType, hasSessionId: !!(frame.session_id ?? payload?.session_id), isError: eventType === \"error\" });\n if (eventType === \"session_started\") {\n // After an agent restart the old session is gone and resume returns a new id.\n this.sessionId = frame.session_id ?? payload?.session_id ?? null;\n this.sessionReady = true;\n this.flushQueue();\n } else if (eventType === \"error\" && /agent token/i.test(String(payload?.error ?? \"\"))) {\n // The agent forgot the token (idle 30 min or restarted): sign in again.\n this.sessionReady = false;\n if (this.unacknowledgedMessage) this.queue.push(this.unacknowledgedMessage);\n this.unacknowledgedMessage = null;\n clearAgentAuth(this.agentUrl);\n } else if (eventType === \"error\" && !this.sessionReady) {\n // Start/resume failed (e.g. auth); stop holding messages so their errors show.\n this.sessionReady = true;\n this.flushQueue();\n }\n if (eventType === \"UserMessage\" || eventType === \"turn_complete\" || eventType === \"error\") {\n this.unacknowledgedMessage = null;\n }\n // Drop frames for a different session (e.g. a late event after a switch).\n const frameSession = frame.session_id ?? payload?.session_id;\n if (eventType !== \"session_started\" && frameSession && this.sessionId && frameSession !== this.sessionId) return;\n this.eventListeners.forEach((listener) => listener(frame));\n };\n\n ws.onclose = (event) => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] WebSocket closed\", { code: event.code, reason: event.reason, clean: event.wasClean });\n this.ws = null;\n this.sessionReady = false;\n if (this.closedByUser) {\n this.setStatus(\"idle\");\n return;\n }\n this.scheduleReconnect();\n };\n\n ws.onerror = () => {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket error event\");\n // onclose follows and handles the reconnect.\n };\n }\n\n /** Sends an action, or queues it until the socket and session are ready. */\n send(action: AgentAction) {\n if (this.closedByUser) return;\n if (this.ws?.readyState === WebSocket.OPEN && this.sessionId && this.sessionReady) {\n void this.sendRaw(action);\n } else {\n this.queue.push(action);\n this.connect();\n }\n }\n\n /** Starts a fresh conversation (drops the current session id). */\n newSession() {\n this.unacknowledgedMessage = null;\n this.sessionId = null;\n this.sessionReady = false;\n this.queue = [];\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.startSessionAction());\n else this.connect();\n }\n\n /** Switches to an existing conversation. */\n resume(sessionId: string) {\n this.sessionId = sessionId;\n this.sessionReady = false;\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.resumeSessionAction(sessionId));\n else this.connect();\n }\n\n /** Closes for good (the runtime is being disposed). */\n close() {\n this.offAuthChange();\n this.closedByUser = true;\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.ws?.close();\n this.ws = null;\n }\n\n /** Drops the socket after sign-out; the next sign-in reconnects. */\n private disconnect() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.attempt = 0;\n this.sessionReady = false;\n if (this.ws) {\n this.ws.onclose = null; // No reconnect.\n this.ws.close();\n this.ws = null;\n }\n this.setStatus(\"idle\");\n }\n\n private flushQueue() {\n const pending = this.queue;\n this.queue = [];\n pending.forEach((action) => {\n // Queued messages were addressed before a session existed; point them at the current one.\n const addressed = \"session_id\" in action && this.sessionId ? { ...action, session_id: this.sessionId } : action;\n void this.sendRaw(addressed as AgentAction);\n });\n }\n\n private async sendRaw(action: AgentAction) {\n const agentToken = (await loadAgentAuth(this.agentUrl))?.agentToken;\n if (!agentToken || this.ws?.readyState !== WebSocket.OPEN) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] skipped outbound frame\", { action: action.action, hasAgentToken: !!agentToken, socketOpen: this.ws?.readyState === WebSocket.OPEN });\n if (action.action !== \"start_session\" && action.action !== \"resume_session\") this.queue.push(action);\n return;\n }\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] sending WebSocket action\", { action: action.action });\n this.ws.send(JSON.stringify({ ...action, agentToken }));\n if (action.action === \"message\") this.unacknowledgedMessage = action;\n }\n\n private scheduleReconnect() {\n if (this.timer) return;\n const delay = BACKOFF_MS[Math.min(this.attempt, BACKOFF_MS.length - 1)];\n this.attempt += 1;\n this.setStatus(this.attempt > BACKOFF_MS.length ? \"offline\" : \"reconnecting\");\n if (this.checkProcessAvailability && this.attempt >= 2 && this.attempt % 3 === 2) {\n void this.checkAgentProcess(this.attempt);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.connect();\n }, delay);\n }\n\n private async checkAgentProcess(failedAttempt: number) {\n if (this.checkingProcessAvailability) return;\n this.checkingProcessAvailability = true;\n try {\n const auth = await loadAgentAuth(this.agentUrl);\n if (!auth || this.closedByUser || this.attempt !== failedAttempt) return;\n if (!(await isAgentProcessAvailable(auth)) && !this.closedByUser && this.attempt === failedAttempt) {\n // Repeated WebSocket failures plus a failed process health check mean the stored\n // endpoint is stale. Returning to sign-in lets the manager issue a fresh wsUrl.\n clearAgentAuth(this.agentUrl);\n }\n } finally {\n this.checkingProcessAvailability = false;\n }\n }\n\n private setStatus(status: AgentConnection) {\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] connection status\", { status });\n this.statusListeners.forEach((listener) => listener(status));\n }\n\n private safeEndpoint(url = this.agentUrl) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return \"invalid-url\";\n }\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { AgentAction, AgentConnection, AgentWireFrame } from "../types";
2
+ import type { AgentChatWidgetMetadata } from "../../../../types/extension-registry";
2
3
  import { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from "./agentAuth";
3
4
 
4
5
  /**
@@ -37,6 +38,7 @@ export class AgentSocket {
37
38
  private agentUrl: string,
38
39
  private initialSessionId: string | null = null,
39
40
  private checkProcessAvailability = false,
41
+ private widgetCatalog: AgentChatWidgetMetadata[] = [],
40
42
  ) {
41
43
  this.sessionId = initialSessionId;
42
44
  this.debugEmbed = !checkProcessAvailability;
@@ -50,7 +52,16 @@ export class AgentSocket {
50
52
  }
51
53
 
52
54
  private openSession() {
53
- void this.sendRaw(this.sessionId ? { action: "resume_session", session_id: this.sessionId } : { action: "start_session" });
55
+ void this.sendRaw(this.sessionId ? this.resumeSessionAction(this.sessionId) : this.startSessionAction());
56
+ }
57
+
58
+ private startSessionAction(): AgentAction {
59
+ return { action: "start_session", ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };
60
+ }
61
+
62
+ private resumeSessionAction(sessionId: string): AgentAction {
63
+ return { action: "resume_session", session_id: sessionId,
64
+ ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };
54
65
  }
55
66
 
56
67
  get currentSessionId() {
@@ -172,7 +183,7 @@ export class AgentSocket {
172
183
  this.sessionId = null;
173
184
  this.sessionReady = false;
174
185
  this.queue = [];
175
- if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: "start_session" });
186
+ if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.startSessionAction());
176
187
  else this.connect();
177
188
  }
178
189
 
@@ -180,7 +191,7 @@ export class AgentSocket {
180
191
  resume(sessionId: string) {
181
192
  this.sessionId = sessionId;
182
193
  this.sessionReady = false;
183
- if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: "resume_session", session_id: sessionId });
194
+ if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.resumeSessionAction(sessionId));
184
195
  else this.connect();
185
196
  }
186
197