@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
@@ -81,7 +81,7 @@ export function AgentEmbeddingPanel(_a) {
81
81
  ], value: backend, onValueChange: setBackend, extra: copyButton(backend, samples[backend]) })] }), _jsxs("section", { className: "agent-editor__section", children: [_jsx("h2", { children: "3. Embed the chat" }), _jsxs("p", { children: ["Load the SDK from the public SDK URL shown below and mount it into a browser container. The SDK calls your app's ", _jsx("code", { children: "tokenEndpoint" }), ", passes the response to the hosted chat in memory, and manages the iframe handshake and token renewal. No SolidX npm dependency is required."] }), _jsxs("p", { children: ["Use a same-origin path such as ", _jsx("code", { children: "/api/agent-chat/token" }), " when possible. If your app API has another origin, give ", _jsx("code", { children: "tokenEndpoint" }), " its absolute URL and configure that API's CORS policy for the browser app origin."] }), _jsxs("p", { children: ["The SDK-serving SolidX API selects the hosted chat UI from its server-side ", _jsx("code", { children: "AGENT_EMBED_UI_URL" }), " setting. The consuming app does not supply an ", _jsx("code", { children: "embedUrl" }), " or choose the iframe host. Keep the SDK script URL and the configured hosted UI origin aligned to the same SolidX deployment."] }), _jsxs("p", { children: ["Pass the current page's required input values in ", _jsx("code", { children: "inputs" }), " using the names and types in this agent's schema. These values provide task context; they are not authorization to access records. Enforce access to protected data in your own API/tools. For a logged-in app, use ", _jsx("code", { children: "getTokenHeaders" }), " to send the app's normal bearer or CSRF header to your app API; do not send the AgentHub API key from the browser."] }), _jsx(SolidTabGroup, { tabs: [
82
82
  { value: "javascript", label: "JavaScript", content: code(samples.javascript, "html") },
83
83
  { value: "react", label: "React", content: code(samples.react, "javascript") },
84
- ], value: tab, onValueChange: setTab, extra: copyButton(tab, tab === "javascript" ? samples.javascript : samples.react) })] }), _jsxs("section", { className: "agent-editor__section", children: [_jsx("h2", { children: "Required inputs" }), fields.length ? _jsxs("table", { style: { width: "100%", textAlign: "left" }, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Variable" }), _jsx("th", { children: "Data type" }), _jsx("th", { children: "Description" })] }) }), _jsx("tbody", { children: fields.map(function (field) { return _jsxs("tr", { children: [_jsx("td", { children: _jsx("code", { children: field.name }) }), _jsx("td", { children: field.dataType }), _jsx("td", { children: field.description })] }, field.name); }) })] })
85
- : _jsx("p", { children: "This agent has no required inputs." }), _jsx("p", { children: "Replace sample values with the current page's values and preserve each declared type. The SDK validates required inputs before the chat starts. Inputs are fixed after the first message; start a new chat to change them. They describe the task and do not grant access to data." })] }), _jsxs("section", { className: "agent-editor__section", children: [_jsx("h2", { children: "Hosting and deployment" }), _jsxs("p", { children: ["Make ", _jsxs("code", { children: ["/embed/agent/", agentId] }), " available on the hosted UI selected by ", _jsx("code", { children: "AGENT_EMBED_UI_URL" }), ". Allow the consuming app origin in the hosted UI's frame-ancestors policy, the AgentHub Runtime origin in its CORS configuration, and the SDK/API/iframe origins in the consuming app's CSP. Use HTTPS for the consuming page, SDK, hosted UI, and runtime in production."] })] }), copyError && _jsx("p", { role: "alert", children: copyError })] });
84
+ ], value: tab, onValueChange: setTab, extra: copyButton(tab, tab === "javascript" ? samples.javascript : samples.react) })] }), _jsxs("section", { className: "agent-editor__section", children: [_jsx("h2", { children: "Inputs" }), fields.length ? _jsxs("table", { style: { width: "100%", textAlign: "left" }, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Variable" }), _jsx("th", { children: "Data type" }), _jsx("th", { children: "Description" }), _jsx("th", { children: "Default value" }), _jsx("th", { children: "Optional" })] }) }), _jsx("tbody", { children: fields.map(function (field) { return _jsxs("tr", { children: [_jsx("td", { children: _jsx("code", { children: field.name }) }), _jsx("td", { children: field.dataType }), _jsx("td", { children: field.description }), _jsx("td", { children: field.defaultValue == null ? "—" : typeof field.defaultValue === "string" ? field.defaultValue : JSON.stringify(field.defaultValue) }), _jsx("td", { children: field.optional ? "Yes" : "No" })] }, field.name); }) })] })
85
+ : _jsx("p", { children: "This agent has no inputs." }), _jsx("p", { children: "Replace sample values with the current page's values and preserve each declared type. Default values are used when an input is omitted; optional inputs may be omitted without a default. Inputs are fixed after the first message; start a new chat to change them. They describe the task and do not grant access to data." })] }), _jsxs("section", { className: "agent-editor__section", children: [_jsx("h2", { children: "Hosting and deployment" }), _jsxs("p", { children: ["Make ", _jsxs("code", { children: ["/embed/agent/", agentId] }), " available on the hosted UI selected by ", _jsx("code", { children: "AGENT_EMBED_UI_URL" }), ". Allow the consuming app origin in the hosted UI's frame-ancestors policy, the AgentHub Runtime origin in its CORS configuration, and the SDK/API/iframe origins in the consuming app's CSP. Use HTTPS for the consuming page, SDK, hosted UI, and runtime in production."] })] }), copyError && _jsx("p", { role: "alert", children: copyError })] });
86
86
  }
87
87
  //# sourceMappingURL=AgentEmbeddingPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentEmbeddingPanel.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from \"react\";\nimport { Copy, Check } from \"lucide-react\";\nimport { env } from \"../../../../adapters/env\";\nimport { SolidButton, SolidCodeEditor, SolidTabGroup } from \"../../../shad-cn-ui\";\nimport type { AgentInputDefinition } from \"./agentEmbedProtocol\";\nimport { embedSamples } from \"./agentEmbedSamples\";\n\nexport function AgentEmbeddingPanel({ agentId, fields, hubUrl, active }: { agentId: number; fields: AgentInputDefinition[]; hubUrl: string; active: boolean }) {\n const [tab, setTab] = useState(\"javascript\");\n const [backend, setBackend] = useState(\"express\");\n const [copied, setCopied] = useState(\"\");\n const [copyError, setCopyError] = useState(\"\");\n const sdkUrl = `${env(\"NEXT_PUBLIC_BACKEND_API_URL\").replace(/\\/$/, \"\")}/api/agent-embed/sdk.js?v=2`;\n const samples = embedSamples(agentId, fields, sdkUrl, hubUrl || \"https://agenthub.example.com\");\n async function copy(key: string, code: string) {\n try { await navigator.clipboard.writeText(code); setCopied(key); setCopyError(\"\"); }\n catch { setCopyError(\"Clipboard access is unavailable. Select and copy the code below.\"); }\n }\n const code = (value: string, language: string) => <SolidCodeEditor readOnly value={value} language={language} fontSize={11} height=\"420px\" />;\n const copyButton = (key: string, value: string) => <SolidButton variant=\"secondary\" size=\"small\" onClick={() => void copy(key, value)}>\n {copied === key ? <Check size={14} /> : <Copy size={14} />} {copied === key ? \"Copied\" : \"Copy code\"}\n </SolidButton>;\n return <div className=\"agent-editor__stack\">\n {!active && <p role=\"status\" className=\"agent-editor__hint\">Activate this agent before embedding it. Samples use the saved agent definition.</p>}\n <section className=\"agent-editor__section\"><h2>1. Keep your API key on your server</h2>\n <p>Configure <code>AGENTHUB_API_KEY</code>, <code>AGENTHUB_AGENT_ID</code>, and <code>AGENTHUB_BACKEND_URL</code> on the server that hosts your app API. Never expose the API key or AgentHub runtime URL in browser code. The browser receives only the short-lived embed response through the SDK handshake.</p>\n </section>\n <section className=\"agent-editor__section\"><h2>2. Create your token endpoint</h2>\n <p>Your app API accepts the SDK's token request, ignores any client-selected backend or API key, and uses the configured agent ID to call <code>/api/agent/api-keys/embedded/me</code> on AgentHub Runtime. Return the successful JSON response unchanged with <code>Cache-Control: no-store</code>; never cache or log credentials or tokens.</p>\n <p>Anonymous embeds can expose this endpoint publicly, as in the demo. Add rate limiting at your API or gateway and use your app's authorization policy when chat access should require sign-in. <code>externalUserId</code> is optional: when the trusted auth layer supplies a stable user ID, send a namespaced value; omit it for anonymous visitors. The runtime manages chat sessions independently.</p>\n <SolidTabGroup tabs={[\n { value: \"python\", label: \"Python / FastAPI\", content: code(samples.python, \"python\") },\n { value: \"nestjs\", label: \"NestJS\", content: code(samples.nestjs, \"typescript\") },\n { value: \"express\", label: \"Express\", content: code(samples.express, \"javascript\") },\n { value: \"java\", label: \"Java / Spring Boot\", content: code(samples.java, \"java\") },\n { value: \"dotnet\", label: \".NET / ASP.NET Core\", content: code(samples.dotnet, \"csharp\") },\n ]} value={backend} onValueChange={setBackend} extra={copyButton(backend, samples[backend as keyof typeof samples])} />\n </section>\n <section className=\"agent-editor__section\"><h2>3. Embed the chat</h2>\n <p>Load the SDK from the public SDK URL shown below and mount it into a browser container. The SDK calls your app's <code>tokenEndpoint</code>, passes the response to the hosted chat in memory, and manages the iframe handshake and token renewal. No SolidX npm dependency is required.</p>\n <p>Use a same-origin path such as <code>/api/agent-chat/token</code> when possible. If your app API has another origin, give <code>tokenEndpoint</code> its absolute URL and configure that API's CORS policy for the browser app origin.</p>\n <p>The SDK-serving SolidX API selects the hosted chat UI from its server-side <code>AGENT_EMBED_UI_URL</code> setting. The consuming app does not supply an <code>embedUrl</code> or choose the iframe host. Keep the SDK script URL and the configured hosted UI origin aligned to the same SolidX deployment.</p>\n <p>Pass the current page's required input values in <code>inputs</code> using the names and types in this agent's schema. These values provide task context; they are not authorization to access records. Enforce access to protected data in your own API/tools. For a logged-in app, use <code>getTokenHeaders</code> to send the app's normal bearer or CSRF header to your app API; do not send the AgentHub API key from the browser.</p>\n <SolidTabGroup tabs={[\n { value: \"javascript\", label: \"JavaScript\", content: code(samples.javascript, \"html\") },\n { value: \"react\", label: \"React\", content: code(samples.react, \"javascript\") },\n ]} value={tab} onValueChange={setTab} extra={copyButton(tab, tab === \"javascript\" ? samples.javascript : samples.react)} />\n </section>\n <section className=\"agent-editor__section\"><h2>Required inputs</h2>\n {fields.length ? <table style={{ width: \"100%\", textAlign: \"left\" }}><thead><tr><th>Variable</th><th>Data type</th><th>Description</th></tr></thead>\n <tbody>{fields.map((field) => <tr key={field.name}><td><code>{field.name}</code></td><td>{field.dataType}</td><td>{field.description}</td></tr>)}</tbody></table>\n : <p>This agent has no required inputs.</p>}\n <p>Replace sample values with the current page's values and preserve each declared type. The SDK validates required inputs before the chat starts. Inputs are fixed after the first message; start a new chat to change them. They describe the task and do not grant access to data.</p>\n </section>\n <section className=\"agent-editor__section\"><h2>Hosting and deployment</h2><p>Make <code>/embed/agent/{agentId}</code> available on the hosted UI selected by <code>AGENT_EMBED_UI_URL</code>. Allow the consuming app origin in the hosted UI's frame-ancestors policy, the AgentHub Runtime origin in its CORS configuration, and the SDK/API/iframe origins in the consuming app's CSP. Use HTTPS for the consuming page, SDK, hosted UI, and runtime in production.</p></section>\n {copyError && <p role=\"alert\">{copyError}</p>}\n </div>;\n}\n"]}
1
+ {"version":3,"file":"AgentEmbeddingPanel.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from \"react\";\nimport { Copy, Check } from \"lucide-react\";\nimport { env } from \"../../../../adapters/env\";\nimport { SolidButton, SolidCodeEditor, SolidTabGroup } from \"../../../shad-cn-ui\";\nimport type { AgentInputDefinition } from \"./agentEmbedProtocol\";\nimport { embedSamples } from \"./agentEmbedSamples\";\n\nexport function AgentEmbeddingPanel({ agentId, fields, hubUrl, active }: { agentId: number; fields: AgentInputDefinition[]; hubUrl: string; active: boolean }) {\n const [tab, setTab] = useState(\"javascript\");\n const [backend, setBackend] = useState(\"express\");\n const [copied, setCopied] = useState(\"\");\n const [copyError, setCopyError] = useState(\"\");\n const sdkUrl = `${env(\"NEXT_PUBLIC_BACKEND_API_URL\").replace(/\\/$/, \"\")}/api/agent-embed/sdk.js?v=2`;\n const samples = embedSamples(agentId, fields, sdkUrl, hubUrl || \"https://agenthub.example.com\");\n async function copy(key: string, code: string) {\n try { await navigator.clipboard.writeText(code); setCopied(key); setCopyError(\"\"); }\n catch { setCopyError(\"Clipboard access is unavailable. Select and copy the code below.\"); }\n }\n const code = (value: string, language: string) => <SolidCodeEditor readOnly value={value} language={language} fontSize={11} height=\"420px\" />;\n const copyButton = (key: string, value: string) => <SolidButton variant=\"secondary\" size=\"small\" onClick={() => void copy(key, value)}>\n {copied === key ? <Check size={14} /> : <Copy size={14} />} {copied === key ? \"Copied\" : \"Copy code\"}\n </SolidButton>;\n return <div className=\"agent-editor__stack\">\n {!active && <p role=\"status\" className=\"agent-editor__hint\">Activate this agent before embedding it. Samples use the saved agent definition.</p>}\n <section className=\"agent-editor__section\"><h2>1. Keep your API key on your server</h2>\n <p>Configure <code>AGENTHUB_API_KEY</code>, <code>AGENTHUB_AGENT_ID</code>, and <code>AGENTHUB_BACKEND_URL</code> on the server that hosts your app API. Never expose the API key or AgentHub runtime URL in browser code. The browser receives only the short-lived embed response through the SDK handshake.</p>\n </section>\n <section className=\"agent-editor__section\"><h2>2. Create your token endpoint</h2>\n <p>Your app API accepts the SDK's token request, ignores any client-selected backend or API key, and uses the configured agent ID to call <code>/api/agent/api-keys/embedded/me</code> on AgentHub Runtime. Return the successful JSON response unchanged with <code>Cache-Control: no-store</code>; never cache or log credentials or tokens.</p>\n <p>Anonymous embeds can expose this endpoint publicly, as in the demo. Add rate limiting at your API or gateway and use your app's authorization policy when chat access should require sign-in. <code>externalUserId</code> is optional: when the trusted auth layer supplies a stable user ID, send a namespaced value; omit it for anonymous visitors. The runtime manages chat sessions independently.</p>\n <SolidTabGroup tabs={[\n { value: \"python\", label: \"Python / FastAPI\", content: code(samples.python, \"python\") },\n { value: \"nestjs\", label: \"NestJS\", content: code(samples.nestjs, \"typescript\") },\n { value: \"express\", label: \"Express\", content: code(samples.express, \"javascript\") },\n { value: \"java\", label: \"Java / Spring Boot\", content: code(samples.java, \"java\") },\n { value: \"dotnet\", label: \".NET / ASP.NET Core\", content: code(samples.dotnet, \"csharp\") },\n ]} value={backend} onValueChange={setBackend} extra={copyButton(backend, samples[backend as keyof typeof samples])} />\n </section>\n <section className=\"agent-editor__section\"><h2>3. Embed the chat</h2>\n <p>Load the SDK from the public SDK URL shown below and mount it into a browser container. The SDK calls your app's <code>tokenEndpoint</code>, passes the response to the hosted chat in memory, and manages the iframe handshake and token renewal. No SolidX npm dependency is required.</p>\n <p>Use a same-origin path such as <code>/api/agent-chat/token</code> when possible. If your app API has another origin, give <code>tokenEndpoint</code> its absolute URL and configure that API's CORS policy for the browser app origin.</p>\n <p>The SDK-serving SolidX API selects the hosted chat UI from its server-side <code>AGENT_EMBED_UI_URL</code> setting. The consuming app does not supply an <code>embedUrl</code> or choose the iframe host. Keep the SDK script URL and the configured hosted UI origin aligned to the same SolidX deployment.</p>\n <p>Pass the current page's required input values in <code>inputs</code> using the names and types in this agent's schema. These values provide task context; they are not authorization to access records. Enforce access to protected data in your own API/tools. For a logged-in app, use <code>getTokenHeaders</code> to send the app's normal bearer or CSRF header to your app API; do not send the AgentHub API key from the browser.</p>\n <SolidTabGroup tabs={[\n { value: \"javascript\", label: \"JavaScript\", content: code(samples.javascript, \"html\") },\n { value: \"react\", label: \"React\", content: code(samples.react, \"javascript\") },\n ]} value={tab} onValueChange={setTab} extra={copyButton(tab, tab === \"javascript\" ? samples.javascript : samples.react)} />\n </section>\n <section className=\"agent-editor__section\"><h2>Inputs</h2>\n {fields.length ? <table style={{ width: \"100%\", textAlign: \"left\" }}><thead><tr><th>Variable</th><th>Data type</th><th>Description</th><th>Default value</th><th>Optional</th></tr></thead>\n <tbody>{fields.map((field) => <tr key={field.name}><td><code>{field.name}</code></td><td>{field.dataType}</td><td>{field.description}</td><td>{field.defaultValue == null ? \"—\" : typeof field.defaultValue === \"string\" ? field.defaultValue : JSON.stringify(field.defaultValue)}</td><td>{field.optional ? \"Yes\" : \"No\"}</td></tr>)}</tbody></table>\n : <p>This agent has no inputs.</p>}\n <p>Replace sample values with the current page's values and preserve each declared type. Default values are used when an input is omitted; optional inputs may be omitted without a default. Inputs are fixed after the first message; start a new chat to change them. They describe the task and do not grant access to data.</p>\n </section>\n <section className=\"agent-editor__section\"><h2>Hosting and deployment</h2><p>Make <code>/embed/agent/{agentId}</code> available on the hosted UI selected by <code>AGENT_EMBED_UI_URL</code>. Allow the consuming app origin in the hosted UI's frame-ancestors policy, the AgentHub Runtime origin in its CORS configuration, and the SDK/API/iframe origins in the consuming app's CSP. Use HTTPS for the consuming page, SDK, hosted UI, and runtime in production.</p></section>\n {copyError && <p role=\"alert\">{copyError}</p>}\n </div>;\n}\n"]}
@@ -46,11 +46,11 @@ export function AgentEmbeddingPanel({ agentId, fields, hubUrl, active }: { agent
46
46
  { value: "react", label: "React", content: code(samples.react, "javascript") },
47
47
  ]} value={tab} onValueChange={setTab} extra={copyButton(tab, tab === "javascript" ? samples.javascript : samples.react)} />
48
48
  </section>
49
- <section className="agent-editor__section"><h2>Required inputs</h2>
50
- {fields.length ? <table style={{ width: "100%", textAlign: "left" }}><thead><tr><th>Variable</th><th>Data type</th><th>Description</th></tr></thead>
51
- <tbody>{fields.map((field) => <tr key={field.name}><td><code>{field.name}</code></td><td>{field.dataType}</td><td>{field.description}</td></tr>)}</tbody></table>
52
- : <p>This agent has no required inputs.</p>}
53
- <p>Replace sample values with the current page's values and preserve each declared type. The SDK validates required inputs before the chat starts. Inputs are fixed after the first message; start a new chat to change them. They describe the task and do not grant access to data.</p>
49
+ <section className="agent-editor__section"><h2>Inputs</h2>
50
+ {fields.length ? <table style={{ width: "100%", textAlign: "left" }}><thead><tr><th>Variable</th><th>Data type</th><th>Description</th><th>Default value</th><th>Optional</th></tr></thead>
51
+ <tbody>{fields.map((field) => <tr key={field.name}><td><code>{field.name}</code></td><td>{field.dataType}</td><td>{field.description}</td><td>{field.defaultValue == null ? "—" : typeof field.defaultValue === "string" ? field.defaultValue : JSON.stringify(field.defaultValue)}</td><td>{field.optional ? "Yes" : "No"}</td></tr>)}</tbody></table>
52
+ : <p>This agent has no inputs.</p>}
53
+ <p>Replace sample values with the current page's values and preserve each declared type. Default values are used when an input is omitted; optional inputs may be omitted without a default. Inputs are fixed after the first message; start a new chat to change them. They describe the task and do not grant access to data.</p>
54
54
  </section>
55
55
  <section className="agent-editor__section"><h2>Hosting and deployment</h2><p>Make <code>/embed/agent/{agentId}</code> available on the hosted UI selected by <code>AGENT_EMBED_UI_URL</code>. Allow the consuming app origin in the hosted UI's frame-ancestors policy, the AgentHub Runtime origin in its CORS configuration, and the SDK/API/iframe origins in the consuming app's CSP. Use HTTPS for the consuming page, SDK, hosted UI, and runtime in production.</p></section>
56
56
  {copyError && <p role="alert">{copyError}</p>}
@@ -4,6 +4,8 @@ export type AgentInputDefinition = {
4
4
  name: string;
5
5
  description: string;
6
6
  dataType: string;
7
+ defaultValue?: unknown;
8
+ optional?: boolean;
7
9
  };
8
10
  export type AgentEmbedBootstrap = AgentBootstrap & {
9
11
  embed: true;
@@ -1 +1 @@
1
- {"version":3,"file":"agentEmbedProtocol.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/agentEmbedProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3F,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAC/C,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,oBAAoB,EAAE,CAAC;CAC1C,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,KAAK;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE;gBAApB,UAAU,EAAE,MAAM,EAAE;CAI5C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAWtF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA4BlH"}
1
+ {"version":3,"file":"agentEmbedProtocol.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/agentEmbedProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACvI,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAC/C,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,oBAAoB,EAAE,CAAC;CAC1C,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,KAAK;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE;gBAApB,UAAU,EAAE,MAAM,EAAE;CAI5C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAWtF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA4BlH"}
@@ -55,9 +55,9 @@ export function validateEmbedInputs(fields, suppliedValues) {
55
55
  }
56
56
  var missing = fields
57
57
  .filter(function (_a) {
58
- var name = _a.name;
58
+ var name = _a.name, optional = _a.optional, defaultValue = _a.defaultValue;
59
59
  var value = values[name];
60
- return value === undefined || value === null || (typeof value === "string" && !value.trim());
60
+ return !optional && defaultValue == null && (value === undefined || value === null || (typeof value === "string" && !value.trim()));
61
61
  })
62
62
  .map(function (_a) {
63
63
  var name = _a.name;
@@ -1 +1 @@
1
- {"version":3,"file":"agentEmbedProtocol.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/agentEmbedProtocol.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentBootstrap } from \"../client/agentAuth\";\n\nexport const EMBED_CHANNEL = \"solidx-agent-embed\";\nexport type AgentInputDefinition = { name: string; description: string; dataType: string };\nexport type AgentEmbedBootstrap = AgentBootstrap & {\n embed: true;\n agentId: number;\n title?: string;\n requiredInputs: AgentInputDefinition[];\n};\n\nexport class MissingAgentInputsError extends Error {\n constructor(readonly inputNames: string[]) {\n super(`Required inputs are missing: ${inputNames.join(\", \")}`);\n this.name = \"MissingAgentInputsError\";\n }\n}\n\nexport function validateBootstrap(value: unknown, agentId: number): AgentEmbedBootstrap {\n const body = value as AgentEmbedBootstrap;\n if (!body || body.embed !== true || body.agentId !== agentId || typeof body.agentToken !== \"string\" || !body.agentToken\n || !Array.isArray(body.requiredInputs)) throw new Error(\"The token endpoint returned an invalid embed response.\");\n const ws = new URL(body.wsUrl), http = new URL(body.httpUrl);\n if (![\"ws:\", \"wss:\"].includes(ws.protocol) || ![\"http:\", \"https:\"].includes(http.protocol)\n || ws.username || ws.password || http.username || http.password || ws.search || http.search || ws.hash || http.hash)\n throw new Error(\"The token endpoint returned invalid connection URLs.\");\n if (window.location.protocol === \"https:\" && (ws.protocol !== \"wss:\" || http.protocol !== \"https:\"))\n throw new Error(\"HTTPS embeds require HTTPS and WSS AgentHub endpoints.\");\n return body;\n}\n\nexport function validateEmbedInputs(fields: AgentInputDefinition[], suppliedValues?: Record<string, unknown>): void {\n const values = suppliedValues ?? {};\n if (typeof values !== \"object\" || Array.isArray(values)) throw new Error(\"inputs must be an object.\");\n const names = new Set(fields.map((field) => field.name));\n for (const name of Object.keys(values)) if (!names.has(name)) throw new Error(`Unknown input: ${name}`);\n const missing = fields\n .filter(({ name }) => {\n const value = values[name];\n return value === undefined || value === null || (typeof value === \"string\" && !value.trim());\n })\n .map(({ name }) => name);\n if (missing.length) throw new MissingAgentInputsError(missing);\n for (const field of fields) {\n const value = values[field.name];\n let valid = false;\n switch (field.dataType) {\n case \"string\": valid = typeof value === \"string\"; break;\n case \"number\": valid = typeof value === \"number\" && Number.isFinite(value); break;\n case \"integer\": valid = typeof value === \"number\" && Number.isSafeInteger(value); break;\n case \"boolean\": valid = typeof value === \"boolean\"; break;\n case \"array\": valid = Array.isArray(value); break;\n case \"object\": valid = typeof value === \"object\" && value !== null && !Array.isArray(value); break;\n case \"date\": valid = typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString().slice(0, 10) === value; break;\n case \"datetime\": valid = typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T/.test(value) && !Number.isNaN(Date.parse(value)); break;\n }\n if (!valid) throw new Error(`Input ${field.name} must have data type ${field.dataType}.`);\n }\n}\n"]}
1
+ {"version":3,"file":"agentEmbedProtocol.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/agentEmbedProtocol.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentBootstrap } from \"../client/agentAuth\";\n\nexport const EMBED_CHANNEL = \"solidx-agent-embed\";\nexport type AgentInputDefinition = { name: string; description: string; dataType: string; defaultValue?: unknown; optional?: boolean };\nexport type AgentEmbedBootstrap = AgentBootstrap & {\n embed: true;\n agentId: number;\n title?: string;\n requiredInputs: AgentInputDefinition[];\n};\n\nexport class MissingAgentInputsError extends Error {\n constructor(readonly inputNames: string[]) {\n super(`Required inputs are missing: ${inputNames.join(\", \")}`);\n this.name = \"MissingAgentInputsError\";\n }\n}\n\nexport function validateBootstrap(value: unknown, agentId: number): AgentEmbedBootstrap {\n const body = value as AgentEmbedBootstrap;\n if (!body || body.embed !== true || body.agentId !== agentId || typeof body.agentToken !== \"string\" || !body.agentToken\n || !Array.isArray(body.requiredInputs)) throw new Error(\"The token endpoint returned an invalid embed response.\");\n const ws = new URL(body.wsUrl), http = new URL(body.httpUrl);\n if (![\"ws:\", \"wss:\"].includes(ws.protocol) || ![\"http:\", \"https:\"].includes(http.protocol)\n || ws.username || ws.password || http.username || http.password || ws.search || http.search || ws.hash || http.hash)\n throw new Error(\"The token endpoint returned invalid connection URLs.\");\n if (window.location.protocol === \"https:\" && (ws.protocol !== \"wss:\" || http.protocol !== \"https:\"))\n throw new Error(\"HTTPS embeds require HTTPS and WSS AgentHub endpoints.\");\n return body;\n}\n\nexport function validateEmbedInputs(fields: AgentInputDefinition[], suppliedValues?: Record<string, unknown>): void {\n const values = suppliedValues ?? {};\n if (typeof values !== \"object\" || Array.isArray(values)) throw new Error(\"inputs must be an object.\");\n const names = new Set(fields.map((field) => field.name));\n for (const name of Object.keys(values)) if (!names.has(name)) throw new Error(`Unknown input: ${name}`);\n const missing = fields\n .filter(({ name, optional, defaultValue }) => {\n const value = values[name];\n return !optional && defaultValue == null && (value === undefined || value === null || (typeof value === \"string\" && !value.trim()));\n })\n .map(({ name }) => name);\n if (missing.length) throw new MissingAgentInputsError(missing);\n for (const field of fields) {\n const value = values[field.name];\n let valid = false;\n switch (field.dataType) {\n case \"string\": valid = typeof value === \"string\"; break;\n case \"number\": valid = typeof value === \"number\" && Number.isFinite(value); break;\n case \"integer\": valid = typeof value === \"number\" && Number.isSafeInteger(value); break;\n case \"boolean\": valid = typeof value === \"boolean\"; break;\n case \"array\": valid = Array.isArray(value); break;\n case \"object\": valid = typeof value === \"object\" && value !== null && !Array.isArray(value); break;\n case \"date\": valid = typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString().slice(0, 10) === value; break;\n case \"datetime\": valid = typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T/.test(value) && !Number.isNaN(Date.parse(value)); break;\n }\n if (!valid) throw new Error(`Input ${field.name} must have data type ${field.dataType}.`);\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { AgentBootstrap } from "../client/agentAuth";
2
2
 
3
3
  export const EMBED_CHANNEL = "solidx-agent-embed";
4
- export type AgentInputDefinition = { name: string; description: string; dataType: string };
4
+ export type AgentInputDefinition = { name: string; description: string; dataType: string; defaultValue?: unknown; optional?: boolean };
5
5
  export type AgentEmbedBootstrap = AgentBootstrap & {
6
6
  embed: true;
7
7
  agentId: number;
@@ -35,9 +35,9 @@ export function validateEmbedInputs(fields: AgentInputDefinition[], suppliedValu
35
35
  const names = new Set(fields.map((field) => field.name));
36
36
  for (const name of Object.keys(values)) if (!names.has(name)) throw new Error(`Unknown input: ${name}`);
37
37
  const missing = fields
38
- .filter(({ name }) => {
39
- const value = values[name];
40
- return value === undefined || value === null || (typeof value === "string" && !value.trim());
38
+ .filter(({ name, optional, defaultValue }) => {
39
+ const value = values[name];
40
+ return !optional && defaultValue == null && (value === undefined || value === null || (typeof value === "string" && !value.trim()));
41
41
  })
42
42
  .map(({ name }) => name);
43
43
  if (missing.length) throw new MissingAgentInputsError(missing);
@@ -1 +1 @@
1
- {"version":3,"file":"AgentThread.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/thread/AgentThread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAK5E,OAAO,EAAmB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGlF,KAAK,KAAK,GAAG;IACT,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAiHF,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAmHvI"}
1
+ {"version":3,"file":"AgentThread.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/thread/AgentThread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAK5E,OAAO,EAAmB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAOlF,KAAK,KAAK,GAAG;IACT,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAkIF,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAgIvI"}
@@ -14,7 +14,11 @@ import styles from "../SolidAgent.module.css";
14
14
  import widgetStyles from "../widgets/solidChatWidgets.module.css";
15
15
  import { SolidXAIIcon } from "../SolidXAIIcon";
16
16
  import { AgentEventTypes } from "../types";
17
+ import { toolCategory } from "../agentFormat";
18
+ import { SolidAgentMessageCopyButton } from "../SolidAgentMarkdown";
17
19
  import { SolidAgentChatItem } from "./SolidAgentChatItem";
20
+ import { parseWidgetContent } from "./inlineWidget";
21
+ import { formatChatTime } from "../widgets/chatWidgetUtils";
18
22
  var isUserItem = function (item) { return item.eventType === AgentEventTypes.userMessage && !item.widget; };
19
23
  var ASSISTANT_MESSAGE_TYPES = new Set([
20
24
  AgentEventTypes.llmToken,
@@ -23,6 +27,27 @@ var ASSISTANT_MESSAGE_TYPES = new Set([
23
27
  AgentEventTypes.turnCompleteLegacy,
24
28
  ]);
25
29
  var isAssistantMessage = function (item) { return !item.widget && ASSISTANT_MESSAGE_TYPES.has(item.eventType); };
30
+ var isVisibleCurrentTool = function (item) {
31
+ var _a, _b;
32
+ return item.eventType === AgentEventTypes.toolCalling
33
+ && toolCategory((_b = (_a = item.eventData) === null || _a === void 0 ? void 0 : _a.tool_name) !== null && _b !== void 0 ? _b : "") !== "Context";
34
+ };
35
+ var assistantCopyContent = function (item) {
36
+ var _a, _b, _c, _d, _e, _f, _g, _h;
37
+ if (item.widget === "markdown" || item.widget === "SolidMarkdownChatWidget") {
38
+ var data = (_b = (_a = item.eventData) === null || _a === void 0 ? void 0 : _a.props) !== null && _b !== void 0 ? _b : item.eventData;
39
+ return typeof ((_c = data === null || data === void 0 ? void 0 : data.text) !== null && _c !== void 0 ? _c : data === null || data === void 0 ? void 0 : data.content) === "string" ? ((_d = data.text) !== null && _d !== void 0 ? _d : data.content) : null;
40
+ }
41
+ if (!isAssistantMessage(item))
42
+ return null;
43
+ var inline = parseWidgetContent((_e = item.eventData) === null || _e === void 0 ? void 0 : _e.content);
44
+ if (inline) {
45
+ if (inline.widget !== "markdown" && inline.widget !== "SolidMarkdownChatWidget")
46
+ return null;
47
+ return typeof ((_f = inline.data.text) !== null && _f !== void 0 ? _f : inline.data.content) === "string" ? ((_g = inline.data.text) !== null && _g !== void 0 ? _g : inline.data.content) : null;
48
+ }
49
+ return typeof ((_h = item.eventData) === null || _h === void 0 ? void 0 : _h.content) === "string" ? item.eventData.content : null;
50
+ };
26
51
  /** Consecutive agent items form one turn (one avatar); each user message stands alone. */
27
52
  function groupItems(items) {
28
53
  var groups = [];
@@ -129,37 +154,47 @@ export function AgentThread(_a) {
129
154
  items: [],
130
155
  });
131
156
  }
132
- var renderItem = function (item) { return (_jsx(SolidAgentChatItem, { item: item, agentContext: context, onReply: onReply, onPrompt: onPrompt }, item.id)); };
157
+ var renderItem = function (item, showMessageMeta) { return (_jsx(SolidAgentChatItem, { item: item, agentContext: context, showMessageMeta: showMessageMeta, onReply: onReply, onPrompt: onPrompt }, item.id)); };
133
158
  return (_jsxs("div", { ref: scrollRef, className: styles.thread, role: "log", "aria-live": "polite", "aria-relevant": "additions", children: [hasMore && (_jsx("button", { type: "button", className: "".concat(styles.btn, " ").concat(styles.loadMore), onClick: onLoadOlder, children: "Load earlier messages" })), groups.map(function (group) {
134
159
  if (group.kind === "user")
135
160
  return renderItem(group.item);
136
161
  var isCurrentTurn = working && group === groups[groups.length - 1];
137
- var latestTool = isCurrentTurn
138
- ? __spreadArray([], group.items, true).reverse().find(function (item) { return item.eventType === AgentEventTypes.toolCalling && item.live; })
139
- : undefined;
140
- var currentActivity = latestTool !== null && latestTool !== void 0 ? latestTool : (isCurrentTurn
141
- ? __spreadArray([], group.items, true).reverse().find(function (item) { return item.eventType === AgentEventTypes.toolCalling; })
142
- : undefined);
143
- var activityItems = group.items.filter(function (item) { return !isAssistantMessage(item); });
144
- var detailItems = activityItems.filter(function (item) { return item !== currentActivity; });
145
- var activitySet = new Set(group.items.filter(function (item) { return !isAssistantMessage(item); }));
146
- var showIdleThinkingStatus = isCurrentTurn && thinking && activityItems.length === 0;
147
- var activityRendered = false;
148
- var turnContent = __spreadArray(__spreadArray([], (showIdleThinkingStatus ? [
149
- _jsx(AgentActivityDisclosure, { turnKey: group.key, items: activityItems, detailItems: detailItems, working: isCurrentTurn, showSummary: true, renderItem: renderItem }, "activity-".concat(group.key)),
150
- ] : []), true), group.items.flatMap(function (item) {
151
- if (activitySet.has(item)) {
152
- if (activityRendered)
153
- return [];
154
- activityRendered = true;
155
- return __spreadArray([
156
- _jsx(AgentActivityDisclosure, { turnKey: group.key, items: activityItems, detailItems: detailItems, working: isCurrentTurn, showSummary: detailItems.length > 0 || currentActivity !== undefined, renderItem: renderItem }, "activity-".concat(group.key))
157
- ], (currentActivity ? [renderItem(currentActivity)] : []), true);
162
+ var assistantCopyText = __spreadArray([], group.items, true).reverse()
163
+ .map(assistantCopyContent)
164
+ .find(function (content) { return content !== null && content.length > 0; });
165
+ var turnContent = [];
166
+ var activityItems = [];
167
+ var flushActivity = function (isLatest) {
168
+ var _a;
169
+ if (!activityItems.length)
170
+ return;
171
+ var currentActivity = isCurrentTurn && isLatest
172
+ ? (_a = __spreadArray([], activityItems, true).reverse().find(function (item) { return isVisibleCurrentTool(item) && item.live; })) !== null && _a !== void 0 ? _a : __spreadArray([], activityItems, true).reverse().find(isVisibleCurrentTool)
173
+ : undefined;
174
+ var detailItems = activityItems.filter(function (item) { return item !== currentActivity; });
175
+ var activityKey = "".concat(group.key, "-").concat(activityItems[0].id);
176
+ turnContent.push(_jsx(AgentActivityDisclosure, { turnKey: activityKey, items: activityItems, detailItems: detailItems, working: isCurrentTurn && isLatest, showSummary: detailItems.length > 0 || currentActivity !== undefined, renderItem: renderItem }, "activity-".concat(activityKey)));
177
+ if (currentActivity)
178
+ turnContent.push(renderItem(currentActivity));
179
+ activityItems = [];
180
+ };
181
+ for (var _i = 0, _a = group.items; _i < _a.length; _i++) {
182
+ var item = _a[_i];
183
+ if (isAssistantMessage(item)) {
184
+ flushActivity(false);
185
+ turnContent.push(renderItem(item, false));
186
+ }
187
+ else {
188
+ activityItems.push(item);
158
189
  }
159
- if (item === currentActivity)
160
- return [];
161
- return [renderItem(item)];
162
- }), true);
190
+ }
191
+ flushActivity(true);
192
+ if (isCurrentTurn && thinking && group.items.length === 0) {
193
+ turnContent.push(_jsx(AgentActivityDisclosure, { turnKey: group.key, items: [], detailItems: [], working: true, showSummary: true, renderItem: renderItem }, "activity-".concat(group.key)));
194
+ }
195
+ if (!isCurrentTurn && assistantCopyText) {
196
+ turnContent.push(_jsxs("div", { className: "".concat(widgetStyles.BubbleMeta, " ").concat(widgetStyles.BubbleMetaAssistant, " ").concat(widgetStyles.TurnMeta), children: [_jsx("span", { className: widgetStyles.Timestamp, children: formatChatTime(group.items[group.items.length - 1].at) }), _jsx(SolidAgentMessageCopyButton, { text: assistantCopyText })] }, "meta-".concat(group.key)));
197
+ }
163
198
  return (_jsxs("div", { className: widgetStyles.AiTurnGroup, children: [_jsx("div", { className: "".concat(widgetStyles.Avatar, " ").concat(widgetStyles.AvatarAi), children: _jsx(SolidXAIIcon, { size: 14 }) }), _jsx("div", { className: widgetStyles.AiTurnContent, children: turnContent })] }, group.key));
164
199
  })] }));
165
200
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentThread.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/thread/AgentThread.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { CheckCircle2, ChevronDown, LoaderCircle } from \"lucide-react\";\nimport styles from \"../SolidAgent.module.css\";\nimport widgetStyles from \"../widgets/solidChatWidgets.module.css\";\nimport { SolidXAIIcon } from \"../SolidXAIIcon\";\nimport { AgentEventTypes, type AgentChatItem, type AgentContext } from \"../types\";\nimport { SolidAgentChatItem } from \"./SolidAgentChatItem\";\n\ntype Props = {\n items: AgentChatItem[];\n thinking: boolean;\n working?: boolean;\n hasMore: boolean;\n context?: AgentContext;\n emptyState?: React.ReactNode;\n onLoadOlder: () => void;\n onReply: (widgetId: string, widget: string, value: unknown) => void;\n onPrompt: (text: string) => void;\n};\n\ntype ItemGroup = { kind: \"user\"; item: AgentChatItem } | { kind: \"agent\"; key: string; items: AgentChatItem[] };\n\nconst isUserItem = (item: AgentChatItem) => item.eventType === AgentEventTypes.userMessage && !item.widget;\nconst ASSISTANT_MESSAGE_TYPES = new Set<string>([\n AgentEventTypes.llmToken,\n AgentEventTypes.llmComplete,\n AgentEventTypes.turnComplete,\n AgentEventTypes.turnCompleteLegacy,\n]);\n\nconst isAssistantMessage = (item: AgentChatItem) => !item.widget && ASSISTANT_MESSAGE_TYPES.has(item.eventType);\n\n/** Consecutive agent items form one turn (one avatar); each user message stands alone. */\nfunction groupItems(items: AgentChatItem[]): ItemGroup[] {\n const groups: ItemGroup[] = [];\n let turn: AgentChatItem[] = [];\n let turnKey = \"initial-agent-turn\";\n const flush = () => {\n if (turn.length) groups.push({ kind: \"agent\", key: turnKey, items: turn });\n turn = [];\n };\n for (const item of items) {\n if (isUserItem(item)) {\n flush();\n groups.push({ kind: \"user\", item });\n turnKey = `after-${item.id}`;\n } else {\n turn.push(item);\n }\n }\n flush();\n return groups;\n}\n\nfunction AgentActivityDisclosure({\n turnKey,\n items,\n detailItems,\n working,\n showSummary,\n renderItem,\n}: {\n turnKey: string;\n items: AgentChatItem[];\n detailItems: AgentChatItem[];\n working: boolean;\n showSummary: boolean;\n renderItem: (item: AgentChatItem) => React.ReactNode;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n const hasLiveTimer = useRef(working);\n const startTime = useRef(working ? Date.now() : (items[0]?.at || Date.now()));\n\n useEffect(() => {\n if (!working) {\n if (hasLiveTimer.current) setNow(Date.now());\n return;\n }\n hasLiveTimer.current = true;\n const timer = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(timer);\n }, [working]);\n\n const toolCount = items.filter((item) => item.eventType === AgentEventTypes.toolCalling).length;\n const activeDuration = Math.max(0, Math.floor((now - startTime.current) / 1000));\n const recordedDuration = items.length > 1\n ? Math.max(0, Math.floor((items[items.length - 1].at - items[0].at) / 1000))\n : 0;\n const seconds = hasLiveTimer.current ? activeDuration : recordedDuration;\n const durationLabel = `${seconds}s`;\n const summary = working\n ? `Working · ${toolCount ? `${toolCount} tool${toolCount === 1 ? \"\" : \"s\"} · ` : \"\"}${durationLabel}`\n : toolCount\n ? `${toolCount} tool${toolCount === 1 ? \"\" : \"s\"} called · took ${durationLabel}`\n : `Activity · took ${durationLabel}`;\n const panelId = `agent-activity-${turnKey.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <section className={`${widgetStyles.ActivityGroup} ${showSummary ? \"\" : widgetStyles.ActivityTimerOnly}`} aria-label={showSummary ? \"Agent activity\" : undefined}>\n {showSummary && (\n <>\n {detailItems.length > 0 ? <button\n type=\"button\"\n className={widgetStyles.ActivitySummary}\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={() => setExpanded((value) => !value)}\n >\n {working\n ? <LoaderCircle size={15} className={widgetStyles.ActivitySpinner} aria-hidden=\"true\" />\n : <CheckCircle2 size={15} className={widgetStyles.ActivityComplete} aria-hidden=\"true\" />}\n <span className={widgetStyles.ActivitySummaryText}>{summary}</span>\n <ChevronDown size={15} className={`${widgetStyles.ActivityChevron} ${expanded ? widgetStyles.ActivityChevronOpen : \"\"}`} aria-hidden=\"true\" />\n </button> : <div className={widgetStyles.ActivitySummary} role=\"status\">\n {working\n ? <LoaderCircle size={15} className={widgetStyles.ActivitySpinner} aria-hidden=\"true\" />\n : <CheckCircle2 size={15} className={widgetStyles.ActivityComplete} aria-hidden=\"true\" />}\n <span className={widgetStyles.ActivitySummaryText}>{summary}</span>\n </div>}\n {expanded && (\n <div id={panelId} className={widgetStyles.ActivityDetails}>\n {detailItems.map(renderItem)}\n </div>\n )}\n </>\n )}\n </section>\n );\n}\n\n/** Renders thread items; sticks to the bottom while new content streams unless the user scrolled up. */\nexport function AgentThread({ items, thinking, working = thinking, hasMore, context, emptyState, onLoadOlder, onReply, onPrompt }: Props) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const pinned = useRef(true);\n const prevHeight = useRef(0);\n const prevFirstId = useRef<string | undefined>(undefined);\n\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const firstId = items[0]?.id;\n if (prevFirstId.current && firstId !== prevFirstId.current && prevHeight.current) {\n // Older history was prepended: keep the viewport where it was.\n el.scrollTop = el.scrollHeight - prevHeight.current;\n } else if (pinned.current) {\n el.scrollTop = el.scrollHeight;\n }\n prevFirstId.current = firstId;\n prevHeight.current = el.scrollHeight;\n }, [items]);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onScroll = () => {\n pinned.current = el.scrollHeight - el.scrollTop - el.clientHeight < 48;\n prevHeight.current = el.scrollHeight;\n };\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n if (!items.length && !thinking && emptyState) {\n return <div className={styles.thread}>{emptyState}</div>;\n }\n\n const groups = groupItems(items);\n const lastGroup = groups[groups.length - 1];\n if (working && (!lastGroup || lastGroup.kind === \"user\")) {\n groups.push({\n kind: \"agent\",\n key: lastGroup?.kind === \"user\" ? `after-${lastGroup.item.id}` : \"working-turn\",\n items: [],\n });\n }\n const renderItem = (item: AgentChatItem) => (\n <SolidAgentChatItem key={item.id} item={item} agentContext={context} onReply={onReply} onPrompt={onPrompt} />\n );\n\n return (\n <div ref={scrollRef} className={styles.thread} role=\"log\" aria-live=\"polite\" aria-relevant=\"additions\">\n {hasMore && (\n <button type=\"button\" className={`${styles.btn} ${styles.loadMore}`} onClick={onLoadOlder}>\n Load earlier messages\n </button>\n )}\n {groups.map((group) => {\n if (group.kind === \"user\") return renderItem(group.item);\n\n const isCurrentTurn = working && group === groups[groups.length - 1];\n const latestTool = isCurrentTurn\n ? [...group.items].reverse().find((item) => item.eventType === AgentEventTypes.toolCalling && item.live)\n : undefined;\n const currentActivity = latestTool ?? (isCurrentTurn\n ? [...group.items].reverse().find((item) => item.eventType === AgentEventTypes.toolCalling)\n : undefined);\n const activityItems = group.items.filter((item) => !isAssistantMessage(item));\n const detailItems = activityItems.filter((item) => item !== currentActivity);\n const activitySet = new Set(group.items.filter((item) => !isAssistantMessage(item)));\n const showIdleThinkingStatus = isCurrentTurn && thinking && activityItems.length === 0;\n let activityRendered = false;\n const turnContent = [\n ...(showIdleThinkingStatus ? [\n <AgentActivityDisclosure\n key={`activity-${group.key}`}\n turnKey={group.key}\n items={activityItems}\n detailItems={detailItems}\n working={isCurrentTurn}\n showSummary\n renderItem={renderItem}\n />,\n ] : []),\n ...group.items.flatMap((item) => {\n if (activitySet.has(item)) {\n if (activityRendered) return [];\n activityRendered = true;\n return [\n <AgentActivityDisclosure\n key={`activity-${group.key}`}\n turnKey={group.key}\n items={activityItems}\n detailItems={detailItems}\n working={isCurrentTurn}\n showSummary={detailItems.length > 0 || currentActivity !== undefined}\n renderItem={renderItem}\n />,\n ...(currentActivity ? [renderItem(currentActivity)] : []),\n ];\n }\n if (item === currentActivity) return [];\n return [renderItem(item)];\n }),\n ];\n\n return (\n <div key={group.key} className={widgetStyles.AiTurnGroup}>\n <div className={`${widgetStyles.Avatar} ${widgetStyles.AvatarAi}`}>\n <SolidXAIIcon size={14} />\n </div>\n <div className={widgetStyles.AiTurnContent}>{turnContent}</div>\n </div>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"AgentThread.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/thread/AgentThread.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { CheckCircle2, ChevronDown, LoaderCircle } from \"lucide-react\";\nimport styles from \"../SolidAgent.module.css\";\nimport widgetStyles from \"../widgets/solidChatWidgets.module.css\";\nimport { SolidXAIIcon } from \"../SolidXAIIcon\";\nimport { AgentEventTypes, type AgentChatItem, type AgentContext } from \"../types\";\nimport { toolCategory } from \"../agentFormat\";\nimport { SolidAgentMessageCopyButton } from \"../SolidAgentMarkdown\";\nimport { SolidAgentChatItem } from \"./SolidAgentChatItem\";\nimport { parseWidgetContent } from \"./inlineWidget\";\nimport { formatChatTime } from \"../widgets/chatWidgetUtils\";\n\ntype Props = {\n items: AgentChatItem[];\n thinking: boolean;\n working?: boolean;\n hasMore: boolean;\n context?: AgentContext;\n emptyState?: React.ReactNode;\n onLoadOlder: () => void;\n onReply: (widgetId: string, widget: string, value: unknown) => void;\n onPrompt: (text: string) => void;\n};\n\ntype ItemGroup = { kind: \"user\"; item: AgentChatItem } | { kind: \"agent\"; key: string; items: AgentChatItem[] };\n\nconst isUserItem = (item: AgentChatItem) => item.eventType === AgentEventTypes.userMessage && !item.widget;\nconst ASSISTANT_MESSAGE_TYPES = new Set<string>([\n AgentEventTypes.llmToken,\n AgentEventTypes.llmComplete,\n AgentEventTypes.turnComplete,\n AgentEventTypes.turnCompleteLegacy,\n]);\n\nconst isAssistantMessage = (item: AgentChatItem) => !item.widget && ASSISTANT_MESSAGE_TYPES.has(item.eventType);\nconst isVisibleCurrentTool = (item: AgentChatItem) =>\n item.eventType === AgentEventTypes.toolCalling\n && toolCategory(item.eventData?.tool_name ?? \"\") !== \"Context\";\n\nconst assistantCopyContent = (item: AgentChatItem): string | null => {\n if (item.widget === \"markdown\" || item.widget === \"SolidMarkdownChatWidget\") {\n const data = item.eventData?.props ?? item.eventData;\n return typeof (data?.text ?? data?.content) === \"string\" ? (data.text ?? data.content) : null;\n }\n if (!isAssistantMessage(item)) return null;\n const inline = parseWidgetContent(item.eventData?.content);\n if (inline) {\n if (inline.widget !== \"markdown\" && inline.widget !== \"SolidMarkdownChatWidget\") return null;\n return typeof (inline.data.text ?? inline.data.content) === \"string\" ? (inline.data.text ?? inline.data.content) : null;\n }\n return typeof item.eventData?.content === \"string\" ? item.eventData.content : null;\n};\n\n/** Consecutive agent items form one turn (one avatar); each user message stands alone. */\nfunction groupItems(items: AgentChatItem[]): ItemGroup[] {\n const groups: ItemGroup[] = [];\n let turn: AgentChatItem[] = [];\n let turnKey = \"initial-agent-turn\";\n const flush = () => {\n if (turn.length) groups.push({ kind: \"agent\", key: turnKey, items: turn });\n turn = [];\n };\n for (const item of items) {\n if (isUserItem(item)) {\n flush();\n groups.push({ kind: \"user\", item });\n turnKey = `after-${item.id}`;\n } else {\n turn.push(item);\n }\n }\n flush();\n return groups;\n}\n\nfunction AgentActivityDisclosure({\n turnKey,\n items,\n detailItems,\n working,\n showSummary,\n renderItem,\n}: {\n turnKey: string;\n items: AgentChatItem[];\n detailItems: AgentChatItem[];\n working: boolean;\n showSummary: boolean;\n renderItem: (item: AgentChatItem) => React.ReactNode;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n const hasLiveTimer = useRef(working);\n const startTime = useRef(working ? Date.now() : (items[0]?.at || Date.now()));\n\n useEffect(() => {\n if (!working) {\n if (hasLiveTimer.current) setNow(Date.now());\n return;\n }\n hasLiveTimer.current = true;\n const timer = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(timer);\n }, [working]);\n\n const toolCount = items.filter((item) => item.eventType === AgentEventTypes.toolCalling).length;\n const activeDuration = Math.max(0, Math.floor((now - startTime.current) / 1000));\n const recordedDuration = items.length > 1\n ? Math.max(0, Math.floor((items[items.length - 1].at - items[0].at) / 1000))\n : 0;\n const seconds = hasLiveTimer.current ? activeDuration : recordedDuration;\n const durationLabel = `${seconds}s`;\n const summary = working\n ? `Working · ${toolCount ? `${toolCount} tool${toolCount === 1 ? \"\" : \"s\"} · ` : \"\"}${durationLabel}`\n : toolCount\n ? `${toolCount} tool${toolCount === 1 ? \"\" : \"s\"} called · took ${durationLabel}`\n : `Activity · took ${durationLabel}`;\n const panelId = `agent-activity-${turnKey.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <section className={`${widgetStyles.ActivityGroup} ${showSummary ? \"\" : widgetStyles.ActivityTimerOnly}`} aria-label={showSummary ? \"Agent activity\" : undefined}>\n {showSummary && (\n <>\n {detailItems.length > 0 ? <button\n type=\"button\"\n className={widgetStyles.ActivitySummary}\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={() => setExpanded((value) => !value)}\n >\n {working\n ? <LoaderCircle size={15} className={widgetStyles.ActivitySpinner} aria-hidden=\"true\" />\n : <CheckCircle2 size={15} className={widgetStyles.ActivityComplete} aria-hidden=\"true\" />}\n <span className={widgetStyles.ActivitySummaryText}>{summary}</span>\n <ChevronDown size={15} className={`${widgetStyles.ActivityChevron} ${expanded ? widgetStyles.ActivityChevronOpen : \"\"}`} aria-hidden=\"true\" />\n </button> : <div className={widgetStyles.ActivitySummary} role=\"status\">\n {working\n ? <LoaderCircle size={15} className={widgetStyles.ActivitySpinner} aria-hidden=\"true\" />\n : <CheckCircle2 size={15} className={widgetStyles.ActivityComplete} aria-hidden=\"true\" />}\n <span className={widgetStyles.ActivitySummaryText}>{summary}</span>\n </div>}\n {expanded && (\n <div id={panelId} className={widgetStyles.ActivityDetails}>\n {detailItems.map(renderItem)}\n </div>\n )}\n </>\n )}\n </section>\n );\n}\n\n/** Renders thread items; sticks to the bottom while new content streams unless the user scrolled up. */\nexport function AgentThread({ items, thinking, working = thinking, hasMore, context, emptyState, onLoadOlder, onReply, onPrompt }: Props) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const pinned = useRef(true);\n const prevHeight = useRef(0);\n const prevFirstId = useRef<string | undefined>(undefined);\n\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const firstId = items[0]?.id;\n if (prevFirstId.current && firstId !== prevFirstId.current && prevHeight.current) {\n // Older history was prepended: keep the viewport where it was.\n el.scrollTop = el.scrollHeight - prevHeight.current;\n } else if (pinned.current) {\n el.scrollTop = el.scrollHeight;\n }\n prevFirstId.current = firstId;\n prevHeight.current = el.scrollHeight;\n }, [items]);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onScroll = () => {\n pinned.current = el.scrollHeight - el.scrollTop - el.clientHeight < 48;\n prevHeight.current = el.scrollHeight;\n };\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n if (!items.length && !thinking && emptyState) {\n return <div className={styles.thread}>{emptyState}</div>;\n }\n\n const groups = groupItems(items);\n const lastGroup = groups[groups.length - 1];\n if (working && (!lastGroup || lastGroup.kind === \"user\")) {\n groups.push({\n kind: \"agent\",\n key: lastGroup?.kind === \"user\" ? `after-${lastGroup.item.id}` : \"working-turn\",\n items: [],\n });\n }\n const renderItem = (item: AgentChatItem, showMessageMeta?: boolean) => (\n <SolidAgentChatItem key={item.id} item={item} agentContext={context} showMessageMeta={showMessageMeta} onReply={onReply} onPrompt={onPrompt} />\n );\n\n return (\n <div ref={scrollRef} className={styles.thread} role=\"log\" aria-live=\"polite\" aria-relevant=\"additions\">\n {hasMore && (\n <button type=\"button\" className={`${styles.btn} ${styles.loadMore}`} onClick={onLoadOlder}>\n Load earlier messages\n </button>\n )}\n {groups.map((group) => {\n if (group.kind === \"user\") return renderItem(group.item);\n\n const isCurrentTurn = working && group === groups[groups.length - 1];\n const assistantCopyText = [...group.items].reverse()\n .map(assistantCopyContent)\n .find((content) => content !== null && content.length > 0);\n const turnContent: React.ReactNode[] = [];\n let activityItems: AgentChatItem[] = [];\n const flushActivity = (isLatest: boolean) => {\n if (!activityItems.length) return;\n const currentActivity = isCurrentTurn && isLatest\n ? [...activityItems].reverse().find((item) => isVisibleCurrentTool(item) && item.live)\n ?? [...activityItems].reverse().find(isVisibleCurrentTool)\n : undefined;\n const detailItems = activityItems.filter((item) => item !== currentActivity);\n const activityKey = `${group.key}-${activityItems[0].id}`;\n turnContent.push(\n <AgentActivityDisclosure\n key={`activity-${activityKey}`}\n turnKey={activityKey}\n items={activityItems}\n detailItems={detailItems}\n working={isCurrentTurn && isLatest}\n showSummary={detailItems.length > 0 || currentActivity !== undefined}\n renderItem={renderItem}\n />,\n );\n if (currentActivity) turnContent.push(renderItem(currentActivity));\n activityItems = [];\n };\n for (const item of group.items) {\n if (isAssistantMessage(item)) {\n flushActivity(false);\n turnContent.push(renderItem(item, false));\n } else {\n activityItems.push(item);\n }\n }\n flushActivity(true);\n if (isCurrentTurn && thinking && group.items.length === 0) {\n turnContent.push(\n <AgentActivityDisclosure\n key={`activity-${group.key}`}\n turnKey={group.key}\n items={[]}\n detailItems={[]}\n working\n showSummary\n renderItem={renderItem}\n />,\n );\n }\n if (!isCurrentTurn && assistantCopyText) {\n turnContent.push(\n <div key={`meta-${group.key}`} className={`${widgetStyles.BubbleMeta} ${widgetStyles.BubbleMetaAssistant} ${widgetStyles.TurnMeta}`}>\n <span className={widgetStyles.Timestamp}>{formatChatTime(group.items[group.items.length - 1].at)}</span>\n <SolidAgentMessageCopyButton text={assistantCopyText} />\n </div>,\n );\n }\n\n return (\n <div key={group.key} className={widgetStyles.AiTurnGroup}>\n <div className={`${widgetStyles.Avatar} ${widgetStyles.AvatarAi}`}>\n <SolidXAIIcon size={14} />\n </div>\n <div className={widgetStyles.AiTurnContent}>{turnContent}</div>\n </div>\n );\n })}\n </div>\n );\n}\n"]}
@@ -4,7 +4,11 @@ import styles from "../SolidAgent.module.css";
4
4
  import widgetStyles from "../widgets/solidChatWidgets.module.css";
5
5
  import { SolidXAIIcon } from "../SolidXAIIcon";
6
6
  import { AgentEventTypes, type AgentChatItem, type AgentContext } from "../types";
7
+ import { toolCategory } from "../agentFormat";
8
+ import { SolidAgentMessageCopyButton } from "../SolidAgentMarkdown";
7
9
  import { SolidAgentChatItem } from "./SolidAgentChatItem";
10
+ import { parseWidgetContent } from "./inlineWidget";
11
+ import { formatChatTime } from "../widgets/chatWidgetUtils";
8
12
 
9
13
  type Props = {
10
14
  items: AgentChatItem[];
@@ -29,6 +33,23 @@ const ASSISTANT_MESSAGE_TYPES = new Set<string>([
29
33
  ]);
30
34
 
31
35
  const isAssistantMessage = (item: AgentChatItem) => !item.widget && ASSISTANT_MESSAGE_TYPES.has(item.eventType);
36
+ const isVisibleCurrentTool = (item: AgentChatItem) =>
37
+ item.eventType === AgentEventTypes.toolCalling
38
+ && toolCategory(item.eventData?.tool_name ?? "") !== "Context";
39
+
40
+ const assistantCopyContent = (item: AgentChatItem): string | null => {
41
+ if (item.widget === "markdown" || item.widget === "SolidMarkdownChatWidget") {
42
+ const data = item.eventData?.props ?? item.eventData;
43
+ return typeof (data?.text ?? data?.content) === "string" ? (data.text ?? data.content) : null;
44
+ }
45
+ if (!isAssistantMessage(item)) return null;
46
+ const inline = parseWidgetContent(item.eventData?.content);
47
+ if (inline) {
48
+ if (inline.widget !== "markdown" && inline.widget !== "SolidMarkdownChatWidget") return null;
49
+ return typeof (inline.data.text ?? inline.data.content) === "string" ? (inline.data.text ?? inline.data.content) : null;
50
+ }
51
+ return typeof item.eventData?.content === "string" ? item.eventData.content : null;
52
+ };
32
53
 
33
54
  /** Consecutive agent items form one turn (one avatar); each user message stands alone. */
34
55
  function groupItems(items: AgentChatItem[]): ItemGroup[] {
@@ -174,8 +195,8 @@ export function AgentThread({ items, thinking, working = thinking, hasMore, cont
174
195
  items: [],
175
196
  });
176
197
  }
177
- const renderItem = (item: AgentChatItem) => (
178
- <SolidAgentChatItem key={item.id} item={item} agentContext={context} onReply={onReply} onPrompt={onPrompt} />
198
+ const renderItem = (item: AgentChatItem, showMessageMeta?: boolean) => (
199
+ <SolidAgentChatItem key={item.id} item={item} agentContext={context} showMessageMeta={showMessageMeta} onReply={onReply} onPrompt={onPrompt} />
179
200
  );
180
201
 
181
202
  return (
@@ -189,50 +210,63 @@ export function AgentThread({ items, thinking, working = thinking, hasMore, cont
189
210
  if (group.kind === "user") return renderItem(group.item);
190
211
 
191
212
  const isCurrentTurn = working && group === groups[groups.length - 1];
192
- const latestTool = isCurrentTurn
193
- ? [...group.items].reverse().find((item) => item.eventType === AgentEventTypes.toolCalling && item.live)
194
- : undefined;
195
- const currentActivity = latestTool ?? (isCurrentTurn
196
- ? [...group.items].reverse().find((item) => item.eventType === AgentEventTypes.toolCalling)
197
- : undefined);
198
- const activityItems = group.items.filter((item) => !isAssistantMessage(item));
199
- const detailItems = activityItems.filter((item) => item !== currentActivity);
200
- const activitySet = new Set(group.items.filter((item) => !isAssistantMessage(item)));
201
- const showIdleThinkingStatus = isCurrentTurn && thinking && activityItems.length === 0;
202
- let activityRendered = false;
203
- const turnContent = [
204
- ...(showIdleThinkingStatus ? [
213
+ const assistantCopyText = [...group.items].reverse()
214
+ .map(assistantCopyContent)
215
+ .find((content) => content !== null && content.length > 0);
216
+ const turnContent: React.ReactNode[] = [];
217
+ let activityItems: AgentChatItem[] = [];
218
+ const flushActivity = (isLatest: boolean) => {
219
+ if (!activityItems.length) return;
220
+ const currentActivity = isCurrentTurn && isLatest
221
+ ? [...activityItems].reverse().find((item) => isVisibleCurrentTool(item) && item.live)
222
+ ?? [...activityItems].reverse().find(isVisibleCurrentTool)
223
+ : undefined;
224
+ const detailItems = activityItems.filter((item) => item !== currentActivity);
225
+ const activityKey = `${group.key}-${activityItems[0].id}`;
226
+ turnContent.push(
205
227
  <AgentActivityDisclosure
206
- key={`activity-${group.key}`}
207
- turnKey={group.key}
228
+ key={`activity-${activityKey}`}
229
+ turnKey={activityKey}
208
230
  items={activityItems}
209
231
  detailItems={detailItems}
210
- working={isCurrentTurn}
232
+ working={isCurrentTurn && isLatest}
233
+ showSummary={detailItems.length > 0 || currentActivity !== undefined}
234
+ renderItem={renderItem}
235
+ />,
236
+ );
237
+ if (currentActivity) turnContent.push(renderItem(currentActivity));
238
+ activityItems = [];
239
+ };
240
+ for (const item of group.items) {
241
+ if (isAssistantMessage(item)) {
242
+ flushActivity(false);
243
+ turnContent.push(renderItem(item, false));
244
+ } else {
245
+ activityItems.push(item);
246
+ }
247
+ }
248
+ flushActivity(true);
249
+ if (isCurrentTurn && thinking && group.items.length === 0) {
250
+ turnContent.push(
251
+ <AgentActivityDisclosure
252
+ key={`activity-${group.key}`}
253
+ turnKey={group.key}
254
+ items={[]}
255
+ detailItems={[]}
256
+ working
211
257
  showSummary
212
258
  renderItem={renderItem}
213
259
  />,
214
- ] : []),
215
- ...group.items.flatMap((item) => {
216
- if (activitySet.has(item)) {
217
- if (activityRendered) return [];
218
- activityRendered = true;
219
- return [
220
- <AgentActivityDisclosure
221
- key={`activity-${group.key}`}
222
- turnKey={group.key}
223
- items={activityItems}
224
- detailItems={detailItems}
225
- working={isCurrentTurn}
226
- showSummary={detailItems.length > 0 || currentActivity !== undefined}
227
- renderItem={renderItem}
228
- />,
229
- ...(currentActivity ? [renderItem(currentActivity)] : []),
230
- ];
231
- }
232
- if (item === currentActivity) return [];
233
- return [renderItem(item)];
234
- }),
235
- ];
260
+ );
261
+ }
262
+ if (!isCurrentTurn && assistantCopyText) {
263
+ turnContent.push(
264
+ <div key={`meta-${group.key}`} className={`${widgetStyles.BubbleMeta} ${widgetStyles.BubbleMetaAssistant} ${widgetStyles.TurnMeta}`}>
265
+ <span className={widgetStyles.Timestamp}>{formatChatTime(group.items[group.items.length - 1].at)}</span>
266
+ <SolidAgentMessageCopyButton text={assistantCopyText} />
267
+ </div>,
268
+ );
269
+ }
236
270
 
237
271
  return (
238
272
  <div key={group.key} className={widgetStyles.AiTurnGroup}>