@solidxai/core-ui 0.1.19-beta.0 → 0.1.19

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 (512) hide show
  1. package/README.md +19 -0
  2. package/dist/components/common/SolidPopupContainer.d.ts.map +1 -1
  3. package/dist/components/common/SolidPopupContainer.js +3 -2
  4. package/dist/components/common/SolidPopupContainer.js.map +1 -1
  5. package/dist/components/common/SolidPopupContainer.tsx +3 -2
  6. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  7. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +4 -1
  8. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  9. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +11 -5
  10. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  11. package/dist/components/core/chatter/SolidChatter.js +2 -1
  12. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  13. package/dist/components/core/chatter/SolidChatter.tsx +2 -0
  14. package/dist/components/core/chatter/SolidChatterMessageBox.d.ts +2 -0
  15. package/dist/components/core/chatter/SolidChatterMessageBox.d.ts.map +1 -1
  16. package/dist/components/core/chatter/SolidChatterMessageBox.js +7 -4
  17. package/dist/components/core/chatter/SolidChatterMessageBox.js.map +1 -1
  18. package/dist/components/core/chatter/SolidChatterMessageBox.tsx +8 -3
  19. package/dist/components/core/chatter/SolidChatterMessageWidget.d.ts +5 -0
  20. package/dist/components/core/chatter/SolidChatterMessageWidget.d.ts.map +1 -0
  21. package/dist/components/core/chatter/SolidChatterMessageWidget.js +85 -0
  22. package/dist/components/core/chatter/SolidChatterMessageWidget.js.map +1 -0
  23. package/dist/components/core/chatter/SolidChatterMessageWidget.tsx +59 -0
  24. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  25. package/dist/components/core/common/SolidGlobalSearchElement.js +6 -5
  26. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  27. package/dist/components/core/common/SolidGlobalSearchElement.tsx +6 -5
  28. package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.d.ts +11 -0
  29. package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.d.ts.map +1 -0
  30. package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.js +102 -0
  31. package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.js.map +1 -0
  32. package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.tsx +129 -0
  33. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.d.ts +4 -0
  34. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.d.ts.map +1 -0
  35. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.js +29 -0
  36. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.js.map +1 -0
  37. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.module.css +226 -0
  38. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.tsx +57 -0
  39. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts +4 -0
  40. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts.map +1 -0
  41. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js +33 -0
  42. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js.map +1 -0
  43. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx +47 -0
  44. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.d.ts +5 -0
  45. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.d.ts.map +1 -0
  46. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.js +59 -0
  47. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.js.map +1 -0
  48. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.tsx +82 -0
  49. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.d.ts +17 -0
  50. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.d.ts.map +1 -0
  51. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.js +258 -0
  52. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.js.map +1 -0
  53. package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.tsx +286 -0
  54. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.d.ts.map +1 -1
  55. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +102 -62
  56. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
  57. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +116 -106
  58. package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.d.ts +6 -0
  59. package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.d.ts.map +1 -0
  60. package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.js +37 -0
  61. package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.js.map +1 -0
  62. package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.tsx +89 -0
  63. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.d.ts +3 -0
  64. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.d.ts.map +1 -0
  65. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.js +18 -0
  66. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.js.map +1 -0
  67. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.tsx +51 -0
  68. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.d.ts +10 -0
  69. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.d.ts.map +1 -0
  70. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.js +63 -0
  71. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.js.map +1 -0
  72. package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.tsx +111 -0
  73. package/dist/components/core/field/FieldListViewData.d.ts.map +1 -1
  74. package/dist/components/core/field/FieldListViewData.js +29 -9
  75. package/dist/components/core/field/FieldListViewData.js.map +1 -1
  76. package/dist/components/core/field/FieldListViewData.tsx +7 -6
  77. package/dist/components/core/form/SolidFormView.d.ts +1 -0
  78. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  79. package/dist/components/core/form/SolidFormView.js +49 -48
  80. package/dist/components/core/form/SolidFormView.js.map +1 -1
  81. package/dist/components/core/form/SolidFormView.tsx +4 -3
  82. package/dist/components/core/form/fields/SolidPasswordField.d.ts.map +1 -1
  83. package/dist/components/core/form/fields/SolidPasswordField.js +13 -1
  84. package/dist/components/core/form/fields/SolidPasswordField.js.map +1 -1
  85. package/dist/components/core/form/fields/SolidPasswordField.tsx +14 -3
  86. package/dist/components/core/kanban/KanbanBoard.d.ts +1 -1
  87. package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
  88. package/dist/components/core/kanban/KanbanBoard.js +2 -2
  89. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  90. package/dist/components/core/kanban/KanbanBoard.tsx +5 -1
  91. package/dist/components/core/kanban/KanbanCard.d.ts +3 -0
  92. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  93. package/dist/components/core/kanban/KanbanCard.js +5 -4
  94. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  95. package/dist/components/core/kanban/KanbanCard.tsx +31 -11
  96. package/dist/components/core/kanban/KanbanColumn.d.ts +5 -1
  97. package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
  98. package/dist/components/core/kanban/KanbanColumn.js +14 -3
  99. package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
  100. package/dist/components/core/kanban/KanbanColumn.tsx +43 -3
  101. package/dist/components/core/kanban/SolidKanbanView.d.ts +2 -0
  102. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  103. package/dist/components/core/kanban/SolidKanbanView.js +90 -52
  104. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  105. package/dist/components/core/kanban/SolidKanbanView.tsx +93 -13
  106. package/dist/components/core/list/SolidDataTable.d.ts +2 -1
  107. package/dist/components/core/list/SolidDataTable.d.ts.map +1 -1
  108. package/dist/components/core/list/SolidDataTable.js +2 -2
  109. package/dist/components/core/list/SolidDataTable.js.map +1 -1
  110. package/dist/components/core/list/SolidDataTable.tsx +3 -0
  111. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  112. package/dist/components/core/list/SolidListView.js +114 -57
  113. package/dist/components/core/list/SolidListView.js.map +1 -1
  114. package/dist/components/core/list/SolidListView.tsx +71 -7
  115. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
  116. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +14 -0
  117. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
  118. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +13 -0
  119. package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.d.ts +3 -0
  120. package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.d.ts.map +1 -0
  121. package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.js +51 -0
  122. package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.js.map +1 -0
  123. package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.tsx +60 -0
  124. package/dist/components/core/list/widgets/SolidIconNameListViewWidget.d.ts +4 -0
  125. package/dist/components/core/list/widgets/SolidIconNameListViewWidget.d.ts.map +1 -0
  126. package/dist/components/core/list/widgets/SolidIconNameListViewWidget.js +24 -0
  127. package/dist/components/core/list/widgets/SolidIconNameListViewWidget.js.map +1 -0
  128. package/dist/components/core/list/widgets/SolidIconNameListViewWidget.tsx +32 -0
  129. package/dist/components/core/model/ModelListViewData.d.ts.map +1 -1
  130. package/dist/components/core/model/ModelListViewData.js +6 -23
  131. package/dist/components/core/model/ModelListViewData.js.map +1 -1
  132. package/dist/components/core/model/ModelListViewData.tsx +1 -48
  133. package/dist/components/core/solid-agent/AgentModelIndicator.d.ts +5 -0
  134. package/dist/components/core/solid-agent/AgentModelIndicator.d.ts.map +1 -0
  135. package/dist/components/core/solid-agent/AgentModelIndicator.js +14 -0
  136. package/dist/components/core/solid-agent/AgentModelIndicator.js.map +1 -0
  137. package/dist/components/core/solid-agent/AgentModelIndicator.tsx +40 -0
  138. package/dist/components/core/solid-agent/AgentSignIn.d.ts +12 -0
  139. package/dist/components/core/solid-agent/AgentSignIn.d.ts.map +1 -0
  140. package/dist/components/core/solid-agent/AgentSignIn.js +82 -0
  141. package/dist/components/core/solid-agent/AgentSignIn.js.map +1 -0
  142. package/dist/components/core/solid-agent/AgentSignIn.tsx +91 -0
  143. package/dist/components/core/solid-agent/SolidAgent.module.css +596 -0
  144. package/dist/components/core/solid-agent/SolidAgentChat.d.ts +30 -0
  145. package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -0
  146. package/dist/components/core/solid-agent/SolidAgentChat.js +300 -0
  147. package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -0
  148. package/dist/components/core/solid-agent/SolidAgentChat.tsx +451 -0
  149. package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts +44 -0
  150. package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts.map +1 -0
  151. package/dist/components/core/solid-agent/SolidAgentEmbedded.js +46 -0
  152. package/dist/components/core/solid-agent/SolidAgentEmbedded.js.map +1 -0
  153. package/dist/components/core/solid-agent/SolidAgentEmbedded.tsx +87 -0
  154. package/dist/components/core/solid-agent/SolidAgentHost.d.ts +8 -0
  155. package/dist/components/core/solid-agent/SolidAgentHost.d.ts.map +1 -0
  156. package/dist/components/core/solid-agent/SolidAgentHost.js +152 -0
  157. package/dist/components/core/solid-agent/SolidAgentHost.js.map +1 -0
  158. package/dist/components/core/solid-agent/SolidAgentHost.tsx +164 -0
  159. package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts +16 -0
  160. package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts.map +1 -0
  161. package/dist/components/core/solid-agent/SolidAgentMarkdown.js +161 -0
  162. package/dist/components/core/solid-agent/SolidAgentMarkdown.js.map +1 -0
  163. package/dist/components/core/solid-agent/SolidAgentMarkdown.tsx +133 -0
  164. package/dist/components/core/solid-agent/SolidAgentMount.d.ts +3 -0
  165. package/dist/components/core/solid-agent/SolidAgentMount.d.ts.map +1 -0
  166. package/dist/components/core/solid-agent/SolidAgentMount.js +62 -0
  167. package/dist/components/core/solid-agent/SolidAgentMount.js.map +1 -0
  168. package/dist/components/core/solid-agent/SolidAgentMount.tsx +31 -0
  169. package/dist/components/core/solid-agent/SolidXAIIcon.d.ts +5 -0
  170. package/dist/components/core/solid-agent/SolidXAIIcon.d.ts.map +1 -0
  171. package/dist/components/core/solid-agent/SolidXAIIcon.js +7 -0
  172. package/dist/components/core/solid-agent/SolidXAIIcon.js.map +1 -0
  173. package/dist/components/core/solid-agent/SolidXAIIcon.tsx +6 -0
  174. package/dist/components/core/solid-agent/agentAttachments.d.ts +20 -0
  175. package/dist/components/core/solid-agent/agentAttachments.d.ts.map +1 -0
  176. package/dist/components/core/solid-agent/agentAttachments.js +184 -0
  177. package/dist/components/core/solid-agent/agentAttachments.js.map +1 -0
  178. package/dist/components/core/solid-agent/agentAttachments.ts +119 -0
  179. package/dist/components/core/solid-agent/agentEvents.d.ts +34 -0
  180. package/dist/components/core/solid-agent/agentEvents.d.ts.map +1 -0
  181. package/dist/components/core/solid-agent/agentEvents.js +282 -0
  182. package/dist/components/core/solid-agent/agentEvents.js.map +1 -0
  183. package/dist/components/core/solid-agent/agentEvents.ts +292 -0
  184. package/dist/components/core/solid-agent/agentFormat.d.ts +18 -0
  185. package/dist/components/core/solid-agent/agentFormat.d.ts.map +1 -0
  186. package/dist/components/core/solid-agent/agentFormat.js +179 -0
  187. package/dist/components/core/solid-agent/agentFormat.js.map +1 -0
  188. package/dist/components/core/solid-agent/agentFormat.ts +160 -0
  189. package/dist/components/core/solid-agent/client/agentAttachmentMedia.d.ts +9 -0
  190. package/dist/components/core/solid-agent/client/agentAttachmentMedia.d.ts.map +1 -0
  191. package/dist/components/core/solid-agent/client/agentAttachmentMedia.js +129 -0
  192. package/dist/components/core/solid-agent/client/agentAttachmentMedia.js.map +1 -0
  193. package/dist/components/core/solid-agent/client/agentAttachmentMedia.ts +69 -0
  194. package/dist/components/core/solid-agent/client/agentAuth.d.ts +63 -0
  195. package/dist/components/core/solid-agent/client/agentAuth.d.ts.map +1 -0
  196. package/dist/components/core/solid-agent/client/agentAuth.js +307 -0
  197. package/dist/components/core/solid-agent/client/agentAuth.js.map +1 -0
  198. package/dist/components/core/solid-agent/client/agentAuth.ts +222 -0
  199. package/dist/components/core/solid-agent/client/agentRest.d.ts +30 -0
  200. package/dist/components/core/solid-agent/client/agentRest.d.ts.map +1 -0
  201. package/dist/components/core/solid-agent/client/agentRest.js +178 -0
  202. package/dist/components/core/solid-agent/client/agentRest.js.map +1 -0
  203. package/dist/components/core/solid-agent/client/agentRest.ts +100 -0
  204. package/dist/components/core/solid-agent/client/agentRuntime.d.ts +48 -0
  205. package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -0
  206. package/dist/components/core/solid-agent/client/agentRuntime.js +406 -0
  207. package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -0
  208. package/dist/components/core/solid-agent/client/agentRuntime.ts +226 -0
  209. package/dist/components/core/solid-agent/client/agentSocket.d.ts +46 -0
  210. package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -0
  211. package/dist/components/core/solid-agent/client/agentSocket.js +535 -0
  212. package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -0
  213. package/dist/components/core/solid-agent/client/agentSocket.ts +276 -0
  214. package/dist/components/core/solid-agent/client/agentUrls.d.ts +11 -0
  215. package/dist/components/core/solid-agent/client/agentUrls.d.ts.map +1 -0
  216. package/dist/components/core/solid-agent/client/agentUrls.js +18 -0
  217. package/dist/components/core/solid-agent/client/agentUrls.js.map +1 -0
  218. package/dist/components/core/solid-agent/client/agentUrls.ts +19 -0
  219. package/dist/components/core/solid-agent/composer/AgentComposer.d.ts +21 -0
  220. package/dist/components/core/solid-agent/composer/AgentComposer.d.ts.map +1 -0
  221. package/dist/components/core/solid-agent/composer/AgentComposer.js +219 -0
  222. package/dist/components/core/solid-agent/composer/AgentComposer.js.map +1 -0
  223. package/dist/components/core/solid-agent/composer/AgentComposer.tsx +241 -0
  224. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.d.ts +8 -0
  225. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.d.ts.map +1 -0
  226. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +87 -0
  227. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -0
  228. package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +58 -0
  229. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +20 -0
  230. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -0
  231. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +103 -0
  232. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -0
  233. package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +60 -0
  234. package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts +11 -0
  235. package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts.map +1 -0
  236. package/dist/components/core/solid-agent/embed/agentEmbedSamples.js +21 -0
  237. package/dist/components/core/solid-agent/embed/agentEmbedSamples.js.map +1 -0
  238. package/dist/components/core/solid-agent/embed/agentEmbedSamples.ts +266 -0
  239. package/dist/components/core/solid-agent/processes/agentHubProcessApi.d.ts +15 -0
  240. package/dist/components/core/solid-agent/processes/agentHubProcessApi.d.ts.map +1 -0
  241. package/dist/components/core/solid-agent/processes/agentHubProcessApi.js +122 -0
  242. package/dist/components/core/solid-agent/processes/agentHubProcessApi.js.map +1 -0
  243. package/dist/components/core/solid-agent/processes/agentHubProcessApi.ts +64 -0
  244. package/dist/components/core/solid-agent/sdk/solidAgent.d.ts +39 -0
  245. package/dist/components/core/solid-agent/sdk/solidAgent.d.ts.map +1 -0
  246. package/dist/components/core/solid-agent/sdk/solidAgent.js +44 -0
  247. package/dist/components/core/solid-agent/sdk/solidAgent.js.map +1 -0
  248. package/dist/components/core/solid-agent/sdk/solidAgent.ts +56 -0
  249. package/dist/components/core/solid-agent/thread/AgentThread.d.ts +17 -0
  250. package/dist/components/core/solid-agent/thread/AgentThread.d.ts.map +1 -0
  251. package/dist/components/core/solid-agent/thread/AgentThread.js +166 -0
  252. package/dist/components/core/solid-agent/thread/AgentThread.js.map +1 -0
  253. package/dist/components/core/solid-agent/thread/AgentThread.tsx +248 -0
  254. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts +36 -0
  255. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts.map +1 -0
  256. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js +148 -0
  257. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js.map +1 -0
  258. package/dist/components/core/solid-agent/thread/SolidAgentChatItem.tsx +116 -0
  259. package/dist/components/core/solid-agent/thread/inlineWidget.d.ts +8 -0
  260. package/dist/components/core/solid-agent/thread/inlineWidget.d.ts.map +1 -0
  261. package/dist/components/core/solid-agent/thread/inlineWidget.js +30 -0
  262. package/dist/components/core/solid-agent/thread/inlineWidget.js.map +1 -0
  263. package/dist/components/core/solid-agent/thread/inlineWidget.ts +27 -0
  264. package/dist/components/core/solid-agent/types.d.ts +155 -0
  265. package/dist/components/core/solid-agent/types.d.ts.map +1 -0
  266. package/dist/components/core/solid-agent/types.js +31 -0
  267. package/dist/components/core/solid-agent/types.js.map +1 -0
  268. package/dist/components/core/solid-agent/types.ts +148 -0
  269. package/dist/components/core/solid-agent/useAdminInputContext.d.ts +4 -0
  270. package/dist/components/core/solid-agent/useAdminInputContext.d.ts.map +1 -0
  271. package/dist/components/core/solid-agent/useAdminInputContext.js +49 -0
  272. package/dist/components/core/solid-agent/useAdminInputContext.js.map +1 -0
  273. package/dist/components/core/solid-agent/useAdminInputContext.ts +52 -0
  274. package/dist/components/core/solid-agent/useAgentAuth.d.ts +14 -0
  275. package/dist/components/core/solid-agent/useAgentAuth.d.ts.map +1 -0
  276. package/dist/components/core/solid-agent/useAgentAuth.js +88 -0
  277. package/dist/components/core/solid-agent/useAgentAuth.js.map +1 -0
  278. package/dist/components/core/solid-agent/useAgentAuth.ts +40 -0
  279. package/dist/components/core/solid-agent/useAgentAvailability.d.ts +19 -0
  280. package/dist/components/core/solid-agent/useAgentAvailability.d.ts.map +1 -0
  281. package/dist/components/core/solid-agent/useAgentAvailability.js +109 -0
  282. package/dist/components/core/solid-agent/useAgentAvailability.js.map +1 -0
  283. package/dist/components/core/solid-agent/useAgentAvailability.ts +80 -0
  284. package/dist/components/core/solid-agent/useAgentChat.d.ts +22 -0
  285. package/dist/components/core/solid-agent/useAgentChat.d.ts.map +1 -0
  286. package/dist/components/core/solid-agent/useAgentChat.js +45 -0
  287. package/dist/components/core/solid-agent/useAgentChat.js.map +1 -0
  288. package/dist/components/core/solid-agent/useAgentChat.ts +57 -0
  289. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts +7 -0
  290. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts.map +1 -0
  291. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js +15 -0
  292. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js.map +1 -0
  293. package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.tsx +24 -0
  294. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.d.ts +7 -0
  295. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.d.ts.map +1 -0
  296. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js +15 -0
  297. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js.map +1 -0
  298. package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.tsx +28 -0
  299. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.d.ts +4 -0
  300. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.d.ts.map +1 -0
  301. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js +20 -0
  302. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js.map +1 -0
  303. package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.tsx +8 -0
  304. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.d.ts +7 -0
  305. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.d.ts.map +1 -0
  306. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js +11 -0
  307. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js.map +1 -0
  308. package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.tsx +16 -0
  309. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.d.ts +7 -0
  310. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.d.ts.map +1 -0
  311. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js +67 -0
  312. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js.map +1 -0
  313. package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.tsx +135 -0
  314. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.d.ts +7 -0
  315. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.d.ts.map +1 -0
  316. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js +24 -0
  317. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js.map +1 -0
  318. package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.tsx +17 -0
  319. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.d.ts +8 -0
  320. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.d.ts.map +1 -0
  321. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +30 -0
  322. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -0
  323. package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +77 -0
  324. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.d.ts +7 -0
  325. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.d.ts.map +1 -0
  326. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js +40 -0
  327. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js.map +1 -0
  328. package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.tsx +57 -0
  329. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.d.ts +4 -0
  330. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.d.ts.map +1 -0
  331. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js +13 -0
  332. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js.map +1 -0
  333. package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.tsx +19 -0
  334. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.d.ts +7 -0
  335. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.d.ts.map +1 -0
  336. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js +55 -0
  337. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js.map +1 -0
  338. package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.tsx +81 -0
  339. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.d.ts +4 -0
  340. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.d.ts.map +1 -0
  341. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js +15 -0
  342. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js.map +1 -0
  343. package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.tsx +30 -0
  344. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.d.ts +4 -0
  345. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.d.ts.map +1 -0
  346. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js +15 -0
  347. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js.map +1 -0
  348. package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.tsx +21 -0
  349. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.d.ts +7 -0
  350. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.d.ts.map +1 -0
  351. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js +21 -0
  352. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js.map +1 -0
  353. package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.tsx +33 -0
  354. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.d.ts +4 -0
  355. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.d.ts.map +1 -0
  356. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js +11 -0
  357. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js.map +1 -0
  358. package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.tsx +9 -0
  359. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.d.ts +15 -0
  360. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.d.ts.map +1 -0
  361. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js +26 -0
  362. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js.map +1 -0
  363. package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.tsx +42 -0
  364. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.d.ts +7 -0
  365. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.d.ts.map +1 -0
  366. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js +41 -0
  367. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js.map +1 -0
  368. package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.tsx +69 -0
  369. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.d.ts +7 -0
  370. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.d.ts.map +1 -0
  371. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js +23 -0
  372. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js.map +1 -0
  373. package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.tsx +40 -0
  374. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.d.ts +4 -0
  375. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.d.ts.map +1 -0
  376. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js +32 -0
  377. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js.map +1 -0
  378. package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.tsx +55 -0
  379. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.d.ts +7 -0
  380. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.d.ts.map +1 -0
  381. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js +17 -0
  382. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js.map +1 -0
  383. package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.tsx +31 -0
  384. package/dist/components/core/solid-agent/widgets/chatWidgetUtils.d.ts +12 -0
  385. package/dist/components/core/solid-agent/widgets/chatWidgetUtils.d.ts.map +1 -0
  386. package/dist/components/core/solid-agent/widgets/chatWidgetUtils.js +17 -0
  387. package/dist/components/core/solid-agent/widgets/chatWidgetUtils.js.map +1 -0
  388. package/dist/components/core/solid-agent/widgets/chatWidgetUtils.ts +19 -0
  389. package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +909 -0
  390. package/dist/components/core/solid-ai/SolidAiChat.js +1 -1
  391. package/dist/components/core/solid-ai/SolidAiChat.js.map +1 -1
  392. package/dist/components/core/solid-ai/SolidAiChat.tsx +2 -2
  393. package/dist/components/layout/AdminLayout.d.ts.map +1 -1
  394. package/dist/components/layout/AdminLayout.js +2 -1
  395. package/dist/components/layout/AdminLayout.js.map +1 -1
  396. package/dist/components/layout/AdminLayout.tsx +2 -0
  397. package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +1 -1
  398. package/dist/components/shad-cn-ui/SolidAutocomplete.js +2 -2
  399. package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +1 -1
  400. package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +19 -15
  401. package/dist/components/shad-cn-ui/SolidDialog.d.ts +2 -1
  402. package/dist/components/shad-cn-ui/SolidDialog.d.ts.map +1 -1
  403. package/dist/components/shad-cn-ui/SolidDialog.js +2 -2
  404. package/dist/components/shad-cn-ui/SolidDialog.js.map +1 -1
  405. package/dist/components/shad-cn-ui/SolidDialog.tsx +3 -0
  406. package/dist/components/shad-cn-ui/SolidIconPicker.d.ts +7 -0
  407. package/dist/components/shad-cn-ui/SolidIconPicker.d.ts.map +1 -0
  408. package/dist/components/shad-cn-ui/SolidIconPicker.js +43 -0
  409. package/dist/components/shad-cn-ui/SolidIconPicker.js.map +1 -0
  410. package/dist/components/shad-cn-ui/SolidIconPicker.tsx +73 -0
  411. package/dist/components/shad-cn-ui/index.d.ts +1 -0
  412. package/dist/components/shad-cn-ui/index.d.ts.map +1 -1
  413. package/dist/components/shad-cn-ui/index.js +1 -0
  414. package/dist/components/shad-cn-ui/index.js.map +1 -1
  415. package/dist/components/shad-cn-ui/index.ts +1 -0
  416. package/dist/constants/allowed-ai-models.d.ts +8 -0
  417. package/dist/constants/allowed-ai-models.d.ts.map +1 -0
  418. package/dist/constants/allowed-ai-models.js +33 -0
  419. package/dist/constants/allowed-ai-models.js.map +1 -0
  420. package/dist/constants/allowed-ai-models.ts +39 -0
  421. package/dist/helpers/hydrateRelationRules.d.ts.map +1 -1
  422. package/dist/helpers/hydrateRelationRules.js +3 -1
  423. package/dist/helpers/hydrateRelationRules.js.map +1 -1
  424. package/dist/helpers/hydrateRelationRules.ts +5 -1
  425. package/dist/helpers/registry.d.ts +4 -2
  426. package/dist/helpers/registry.d.ts.map +1 -1
  427. package/dist/helpers/registry.js +75 -12
  428. package/dist/helpers/registry.js.map +1 -1
  429. package/dist/helpers/registry.ts +73 -16
  430. package/dist/helpers/updatePasswordField.d.ts.map +1 -1
  431. package/dist/helpers/updatePasswordField.js +21 -15
  432. package/dist/helpers/updatePasswordField.js.map +1 -1
  433. package/dist/helpers/updatePasswordField.ts +6 -1
  434. package/dist/index.d.ts +21 -5
  435. package/dist/index.d.ts.map +1 -1
  436. package/dist/index.js +16 -3
  437. package/dist/index.js.map +1 -1
  438. package/dist/index.ts +34 -3
  439. package/dist/redux/api/fieldApi.js +1 -1
  440. package/dist/redux/api/fieldApi.js.map +1 -1
  441. package/dist/redux/api/fieldApi.ts +2 -2
  442. package/dist/redux/api/modelApi.d.ts +13 -13
  443. package/dist/redux/api/modelApi.d.ts.map +1 -1
  444. package/dist/redux/api/modelApi.js +15 -15
  445. package/dist/redux/api/modelApi.js.map +1 -1
  446. package/dist/redux/api/modelApi.ts +12 -15
  447. package/dist/redux/features/agentSlice.d.ts +34 -0
  448. package/dist/redux/features/agentSlice.d.ts.map +1 -0
  449. package/dist/redux/features/agentSlice.js +92 -0
  450. package/dist/redux/features/agentSlice.js.map +1 -0
  451. package/dist/redux/features/agentSlice.ts +119 -0
  452. package/dist/redux/store/defaultStoreConfig.d.ts +11 -10
  453. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  454. package/dist/redux/store/defaultStoreConfig.js +2 -0
  455. package/dist/redux/store/defaultStoreConfig.js.map +1 -1
  456. package/dist/redux/store/defaultStoreConfig.ts +2 -0
  457. package/dist/redux/store/solidEntityApiPool.d.ts.map +1 -1
  458. package/dist/redux/store/solidEntityApiPool.js +7 -0
  459. package/dist/redux/store/solidEntityApiPool.js.map +1 -1
  460. package/dist/redux/store/solidEntityApiPool.ts +6 -0
  461. package/dist/resources/globals.css +109 -1
  462. package/dist/resources/solid-custom.css +295 -0
  463. package/dist/resources/solid-tailwind-generated.css +1 -1
  464. package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.css +47 -0
  465. package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.d.ts +12 -0
  466. package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.d.ts.map +1 -0
  467. package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.js +80 -0
  468. package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.js.map +1 -0
  469. package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.tsx +123 -0
  470. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +110 -0
  471. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts +3 -0
  472. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -0
  473. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +702 -0
  474. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -0
  475. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +630 -0
  476. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.css +303 -0
  477. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts +3 -0
  478. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -0
  479. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +330 -0
  480. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -0
  481. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +460 -0
  482. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.css +125 -0
  483. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts +3 -0
  484. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -0
  485. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +295 -0
  486. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -0
  487. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +275 -0
  488. package/dist/routes/pages/admin/core/WorkflowDefinitionEditorPage.js +11 -11
  489. package/dist/routes/pages/admin/core/WorkflowDefinitionEditorPage.js.map +1 -1
  490. package/dist/routes/pages/admin/core/WorkflowDefinitionEditorPage.tsx +15 -15
  491. package/dist/routes/pages/embed/AgentEmbedPage.d.ts +3 -0
  492. package/dist/routes/pages/embed/AgentEmbedPage.d.ts.map +1 -0
  493. package/dist/routes/pages/embed/AgentEmbedPage.js +170 -0
  494. package/dist/routes/pages/embed/AgentEmbedPage.js.map +1 -0
  495. package/dist/routes/pages/embed/AgentEmbedPage.module.css +195 -0
  496. package/dist/routes/pages/embed/AgentEmbedPage.tsx +169 -0
  497. package/dist/routes/solidRoutes.d.ts.map +1 -1
  498. package/dist/routes/solidRoutes.js +8 -0
  499. package/dist/routes/solidRoutes.js.map +1 -1
  500. package/dist/routes/solidRoutes.tsx +8 -0
  501. package/dist/types/extension-registry.d.ts +4 -0
  502. package/dist/types/extension-registry.d.ts.map +1 -1
  503. package/dist/types/extension-registry.js +7 -0
  504. package/dist/types/extension-registry.js.map +1 -1
  505. package/dist/types/extension-registry.ts +7 -0
  506. package/dist/types/index.d.ts +4 -0
  507. package/dist/types/list-row-action.d.ts +2 -0
  508. package/dist/types/list-row-action.d.ts.map +1 -1
  509. package/dist/types/list-row-action.js.map +1 -1
  510. package/dist/types/list-row-action.ts +3 -0
  511. package/dist/types/solid-core.d.ts +36 -0
  512. package/package.json +1 -1
@@ -0,0 +1,60 @@
1
+ import type { AgentBootstrap } from "../client/agentAuth";
2
+
3
+ export const EMBED_CHANNEL = "solidx-agent-embed";
4
+ export type AgentInputDefinition = { name: string; description: string; dataType: string };
5
+ export type AgentEmbedBootstrap = AgentBootstrap & {
6
+ embed: true;
7
+ agentId: number;
8
+ title?: string;
9
+ requiredInputs: AgentInputDefinition[];
10
+ };
11
+
12
+ export class MissingAgentInputsError extends Error {
13
+ constructor(readonly inputNames: string[]) {
14
+ super(`Required inputs are missing: ${inputNames.join(", ")}`);
15
+ this.name = "MissingAgentInputsError";
16
+ }
17
+ }
18
+
19
+ export function validateBootstrap(value: unknown, agentId: number): AgentEmbedBootstrap {
20
+ const body = value as AgentEmbedBootstrap;
21
+ if (!body || body.embed !== true || body.agentId !== agentId || typeof body.agentToken !== "string" || !body.agentToken
22
+ || !Array.isArray(body.requiredInputs)) throw new Error("The token endpoint returned an invalid embed response.");
23
+ const ws = new URL(body.wsUrl), http = new URL(body.httpUrl);
24
+ if (!["ws:", "wss:"].includes(ws.protocol) || !["http:", "https:"].includes(http.protocol)
25
+ || ws.username || ws.password || http.username || http.password || ws.search || http.search || ws.hash || http.hash)
26
+ throw new Error("The token endpoint returned invalid connection URLs.");
27
+ if (window.location.protocol === "https:" && (ws.protocol !== "wss:" || http.protocol !== "https:"))
28
+ throw new Error("HTTPS embeds require HTTPS and WSS AgentHub endpoints.");
29
+ return body;
30
+ }
31
+
32
+ export function validateEmbedInputs(fields: AgentInputDefinition[], suppliedValues?: Record<string, unknown>): void {
33
+ const values = suppliedValues ?? {};
34
+ if (typeof values !== "object" || Array.isArray(values)) throw new Error("inputs must be an object.");
35
+ const names = new Set(fields.map((field) => field.name));
36
+ for (const name of Object.keys(values)) if (!names.has(name)) throw new Error(`Unknown input: ${name}`);
37
+ const missing = fields
38
+ .filter(({ name }) => {
39
+ const value = values[name];
40
+ return value === undefined || value === null || (typeof value === "string" && !value.trim());
41
+ })
42
+ .map(({ name }) => name);
43
+ if (missing.length) throw new MissingAgentInputsError(missing);
44
+ for (const field of fields) {
45
+ const value = values[field.name];
46
+ let valid = false;
47
+ switch (field.dataType) {
48
+ case "string": valid = typeof value === "string"; break;
49
+ case "number": valid = typeof value === "number" && Number.isFinite(value); break;
50
+ case "integer": valid = typeof value === "number" && Number.isSafeInteger(value); break;
51
+ case "boolean": valid = typeof value === "boolean"; break;
52
+ case "array": valid = Array.isArray(value); break;
53
+ case "object": valid = typeof value === "object" && value !== null && !Array.isArray(value); break;
54
+ case "date": valid = typeof value === "string" && /^\d{4}-\d{2}-\d{2}$/.test(value)
55
+ && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString().slice(0, 10) === value; break;
56
+ case "datetime": valid = typeof value === "string" && /^\d{4}-\d{2}-\d{2}T/.test(value) && !Number.isNaN(Date.parse(value)); break;
57
+ }
58
+ if (!valid) throw new Error(`Input ${field.name} must have data type ${field.dataType}.`);
59
+ }
60
+ }
@@ -0,0 +1,11 @@
1
+ import type { AgentInputDefinition } from "./agentEmbedProtocol";
2
+ export declare function embedSamples(agentId: number, fields: AgentInputDefinition[], sdkUrl: string, hubBase: string): {
3
+ javascript: string;
4
+ react: string;
5
+ python: string;
6
+ nestjs: string;
7
+ express: string;
8
+ java: string;
9
+ dotnet: string;
10
+ };
11
+ //# sourceMappingURL=agentEmbedSamples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentEmbedSamples.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/agentEmbedSamples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAMjE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;;;;EAmQ5G"}
@@ -0,0 +1,21 @@
1
+ var js = function (value) { return JSON.stringify(value, null, 2).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); };
2
+ var examples = { string: "Replace with your value", number: 0, integer: 0, boolean: false,
3
+ date: "2026-01-01", datetime: "2026-01-01T09:00:00Z", object: {}, array: [] };
4
+ export function embedSamples(agentId, fields, sdkUrl, hubBase) {
5
+ var values = Object.fromEntries(fields.map(function (field) { var _a; return [field.name, (_a = examples[field.dataType]) !== null && _a !== void 0 ? _a : "Replace with your value"]; }));
6
+ var valuesJson = js(values).replace(/\n/g, "\n ");
7
+ var backendUrl = hubBase.replace(/\/$/, "");
8
+ var environmentNote = "# AGENTHUB_BACKEND_URL=".concat(backendUrl);
9
+ var environmentNoteSlash = "// AGENTHUB_BACKEND_URL=".concat(backendUrl);
10
+ var config = "agentId: ".concat(agentId, ",\n tokenEndpoint: \"/api/agent-chat/token\",\n inputs: ").concat(valuesJson);
11
+ return {
12
+ javascript: "<div id=\"agent-chat\"></div>\n<script src=".concat(JSON.stringify(sdkUrl).replace(/</g, "&lt;"), "></script>\n<script>\n // Values should come from the current page or trusted app state.\n // The API key and AgentHub URL stay on your server.\n const chat = SolidAgentEmbed.mount({\n container: \"#agent-chat\",\n ").concat(config, "\n });\n // For app auth/CSRF, add getTokenHeaders: () => yourAppAuthHeaders().\n // Optional lifecycle methods: chat.open(), chat.close(), chat.destroy().\n // Update context before the first message or after starting a new chat:\n // await chat.setInputs({ ... });\n</script>"),
13
+ react: "\"use client\";\nimport { useEffect, useRef } from \"react\";\n\ntype AgentEmbed = { destroy: () => void };\ntype AgentEmbedSdk = { mount: (options: {\n container: HTMLElement; agentId: number; tokenEndpoint: string;\n inputs: Record<string, unknown>; label?: string; title?: string;\n getTokenHeaders?: () => Record<string, string>;\n}) => AgentEmbed };\ndeclare global { interface Window { SolidAgentEmbed?: AgentEmbedSdk } }\n\nconst SDK_URL = ".concat(js(sdkUrl), ";\nlet sdkPromise: Promise<AgentEmbedSdk> | undefined;\nfunction loadSdk() {\n if (window.SolidAgentEmbed) return Promise.resolve(window.SolidAgentEmbed);\n if (!sdkPromise) sdkPromise = new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = SDK_URL;\n script.async = true;\n script.onload = () => window.SolidAgentEmbed\n ? resolve(window.SolidAgentEmbed)\n : reject(new Error(\"Agent embed SDK did not initialize\"));\n script.onerror = () => { script.remove(); sdkPromise = undefined; reject(new Error(\"Could not load Agent embed SDK\")); };\n document.head.appendChild(script);\n });\n return sdkPromise;\n}\n\nexport function AgentChat() {\n const containerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n let disposed = false;\n let chat: AgentEmbed | undefined;\n void loadSdk().then((sdk) => {\n if (disposed || !containerRef.current) return;\n chat = sdk.mount({\n container: containerRef.current,\n ").concat(config.replace(/\n/g, "\n "), "\n });\n }).catch((error: unknown) => {\n if (!disposed) console.error(\"Could not initialize agent chat\", error);\n });\n return () => { disposed = true; chat?.destroy(); };\n }, []);\n return <div ref={containerRef} />;\n}"),
14
+ python: "# FastAPI. Install httpx; mount this router in your application.\n# Keep these server-only environment variables out of the browser bundle:\n# AGENTHUB_API_KEY, AGENTHUB_AGENT_ID, AGENTHUB_BACKEND_URL\n".concat(environmentNote, "\nimport os\nimport httpx\nfrom fastapi import APIRouter, HTTPException, Request, Response\nfrom pydantic import BaseModel\n\nrouter = APIRouter()\nAGENTHUB_URL = (os.getenv(\"AGENTHUB_BACKEND_URL\") or \"\").rstrip(\"/\")\n\nclass TokenRequest(BaseModel):\n agentId: int\n\n@router.post(\"/api/agent-chat/token\")\nasync def create_agent_token(body: TokenRequest, request: Request, response: Response):\n response.headers[\"Cache-Control\"] = \"no-store\"\n try:\n agent_id = int(os.environ.get(\"AGENTHUB_AGENT_ID\", \"0\"))\n except ValueError:\n agent_id = 0\n api_key = os.getenv(\"AGENTHUB_API_KEY\")\n if not api_key or not AGENTHUB_URL or agent_id <= 0:\n raise HTTPException(status_code=503, detail=\"Chat is temporarily unavailable\")\n if body.agentId != agent_id:\n raise HTTPException(status_code=400, detail=\"Agent is not configured for this application\")\n # If trusted optional-auth middleware populated request.state.user, pass its stable ID.\n user = getattr(request.state, \"user\", None)\n external_id = user.get(\"id\") if isinstance(user, dict) else getattr(user, \"id\", None)\n payload = {\"apiKey\": api_key, \"agentId\": agent_id}\n if external_id is not None:\n payload[\"externalUserId\"] = f\"my-app:{external_id}\"\n try:\n async with httpx.AsyncClient(timeout=15) as client:\n upstream = await client.post(f\"{AGENTHUB_URL}/api/agent/api-keys/embedded/me\", json=payload)\n if not upstream.is_success:\n raise HTTPException(status_code=502, detail=\"Chat is temporarily unavailable\")\n return upstream.json() # forward the token response; never cache or log it\n except httpx.HTTPError as exc:\n raise HTTPException(status_code=503, detail=\"Chat is temporarily unavailable\") from exc\n"),
15
+ nestjs: "// NestJS. Uses the app's existing ConfigService and optional auth middleware.\n// Add a distributed rate limit at the gateway or with your Nest throttler.\nimport { Body, Controller, HttpException, HttpStatus, Post, Req, Res } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport { Public } from \"@solidxai/core\";\nimport { Request, Response } from \"express\";\n\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=".concat(agentId, "\n").concat(environmentNoteSlash, "\ntype EmbedRequest = Request & { user?: { id?: string | number; sub?: string | number } };\n@Controller(\"agent-chat\")\nexport class AgentChatController {\n constructor(private readonly config: ConfigService) {}\n\n @Post(\"token\")\n @Public() // allow anonymous use; remove/replace with your app policy for login-only chat\n async createToken(@Body() body: { agentId: number }, @Req() req: EmbedRequest, @Res() res: Response) {\n res.setHeader(\"Cache-Control\", \"no-store\");\n const agentId = Number(this.config.get(\"AGENTHUB_AGENT_ID\")); // fixed; never trust browser selection\n const apiKey = this.config.get<string>(\"AGENTHUB_API_KEY\");\n const baseUrl = this.config.get<string>(\"AGENTHUB_BACKEND_URL\")?.replace(/\\/$/, \"\");\n if (!apiKey || !baseUrl || !Number.isSafeInteger(agentId) || agentId <= 0)\n throw new HttpException(\"Chat is temporarily unavailable\", HttpStatus.SERVICE_UNAVAILABLE);\n if (body.agentId !== agentId) throw new HttpException(\"Agent is not configured\", HttpStatus.BAD_REQUEST);\n const userId = req.user?.id ?? req.user?.sub; // set only by trusted auth middleware\n const payload = { apiKey, agentId, ...(userId != null ? { externalUserId: \"my-app:\" + userId } : {}) };\n try {\n const upstream = await fetch(baseUrl + \"/api/agent/api-keys/embedded/me\", {\n method: \"POST\", headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload), signal: AbortSignal.timeout(15_000),\n });\n if (!upstream.ok) throw new HttpException(\"Chat is temporarily unavailable\", HttpStatus.BAD_GATEWAY);\n res.status(200).type(\"application/json\").send(await upstream.text());\n } catch (error) {\n if (error instanceof HttpException) throw error;\n throw new HttpException(\"Chat is temporarily unavailable\", HttpStatus.SERVICE_UNAVAILABLE);\n }\n }\n}\n// Mount behind trusted proxy configuration and rate limiting. Apply the app's\n// authentication/authorization guard instead of @Public() when access is restricted."),
16
+ express: "// Express (Node.js 20+). Mount after any optional authentication middleware.\n// Protect this public endpoint with a distributed/IP-aware rate limiter in production.\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=".concat(agentId, "\n").concat(environmentNoteSlash, "\nimport express from \"express\";\n\nconst router = express.Router();\nrouter.post(\"/api/agent-chat/token\", async (req, res) => {\n res.set(\"Cache-Control\", \"no-store\");\n const agentId = Number(process.env.AGENTHUB_AGENT_ID); // fixed server-side allowlist\n const apiKey = process.env.AGENTHUB_API_KEY;\n const baseUrl = process.env.AGENTHUB_BACKEND_URL?.replace(/\\/$/, \"\");\n if (!apiKey || !baseUrl || !Number.isSafeInteger(agentId) || agentId <= 0)\n return res.status(503).json({ error: \"Chat is temporarily unavailable\" });\n if (Number(req.body?.agentId) !== agentId)\n return res.status(400).json({ error: \"Agent is not configured for this application\" });\n const userId = req.user?.id ?? req.user?.sub; // optional identity from trusted middleware\n try {\n const upstream = await fetch(baseUrl + \"/api/agent/api-keys/embedded/me\", {\n method: \"POST\", headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey, agentId, ...(userId != null ? { externalUserId: \"my-app:\" + userId } : {}) }),\n signal: AbortSignal.timeout(15_000),\n });\n if (!upstream.ok) return res.status(502).json({ error: \"Chat is temporarily unavailable\" });\n return res.status(200).type(\"application/json\").send(await upstream.text());\n } catch {\n return res.status(503).json({ error: \"Chat is temporarily unavailable\" });\n }\n});\nexport default router;\n// Ensure express.json() is installed. Never accept API key/backend URL from req.body."),
17
+ java: "// Spring Boot 3 / Java 17+. Keep this route public for anonymous embeds,\n// or apply your application's authorization policy. Add a distributed rate limiter.\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=".concat(agentId, "\n").concat(environmentNoteSlash, "\n@RestController\npublic class AgentEmbedController {\n private final java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()\n .connectTimeout(java.time.Duration.ofSeconds(5)).build();\n private final com.fasterxml.jackson.databind.ObjectMapper json = new com.fasterxml.jackson.databind.ObjectMapper();\n\n @Value(\"${AGENTHUB_API_KEY}\") private String apiKey;\n @Value(\"${AGENTHUB_AGENT_ID}\") private int agentId;\n @Value(\"${AGENTHUB_BACKEND_URL}\") private String agentHubUrl;\n\n @PostMapping(\"/api/agent-chat/token\")\n public ResponseEntity<String> token(@RequestBody Map<String, Object> request,\n org.springframework.security.core.Authentication authentication) throws Exception {\n if (!Integer.valueOf(agentId).equals(request.get(\"agentId\")))\n return ResponseEntity.badRequest().cacheControl(CacheControl.noStore()).build();\n Map<String, Object> payload = new java.util.HashMap<>();\n payload.put(\"apiKey\", apiKey); payload.put(\"agentId\", agentId);\n // Omit externalUserId for anonymous access; ignore anonymous security principals.\n if (authentication != null && authentication.isAuthenticated() &&\n !(authentication instanceof org.springframework.security.authentication.AnonymousAuthenticationToken))\n payload.put(\"externalUserId\", \"my-app:\" + authentication.getName());\n var upstreamRequest = java.net.http.HttpRequest.newBuilder()\n .uri(java.net.URI.create(agentHubUrl.replaceAll(\"/+$\", \"\") + \"/api/agent/api-keys/embedded/me\"))\n .timeout(java.time.Duration.ofSeconds(15)).header(\"Content-Type\", \"application/json\")\n .POST(java.net.http.HttpRequest.BodyPublishers.ofString(json.writeValueAsString(payload))).build();\n try {\n var upstream = client.send(upstreamRequest, java.net.http.HttpResponse.BodyHandlers.ofString());\n if (upstream.statusCode() != 200)\n return ResponseEntity.status(502).cacheControl(CacheControl.noStore()).build();\n return ResponseEntity.ok().cacheControl(CacheControl.noStore())\n .contentType(MediaType.APPLICATION_JSON).body(upstream.body());\n } catch (java.io.IOException | InterruptedException error) {\n if (error instanceof InterruptedException) Thread.currentThread().interrupt();\n return ResponseEntity.status(503).cacheControl(CacheControl.noStore()).build();\n }\n }\n}\n// Imports: org.springframework.beans.factory.annotation.Value, web.bind.annotation.*,\n// org.springframework.http.*, java.util.Map. Do not log the key or token response."),
18
+ dotnet: "// ASP.NET Core Minimal API. Configure an IP/user rate-limit policy in production.\n// Authentication can be optional (anonymous demo) or required by your app's policy.\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=".concat(agentId, "\n").concat(environmentNoteSlash, "\nusing System.Security.Claims;\nusing System.Collections.Generic;\nusing System.Net.Http.Json;\n\nbuilder.Services.AddHttpClient(\"AgentHub\", client => client.Timeout = TimeSpan.FromSeconds(15));\napp.MapPost(\"/api/agent-chat/token\", async (AgentTokenRequest body, HttpContext context, IHttpClientFactory clients, IConfiguration config) => {\n context.Response.Headers.CacheControl = \"no-store\";\n if (!int.TryParse(config[\"AGENTHUB_AGENT_ID\"], out var agentId) || agentId <= 0)\n return Results.StatusCode(503);\n var apiKey = config[\"AGENTHUB_API_KEY\"];\n var baseUrl = config[\"AGENTHUB_BACKEND_URL\"]?.TrimEnd('/');\n if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(baseUrl))\n return Results.StatusCode(503);\n if (body.AgentId != agentId)\n return Results.BadRequest(new { error = \"Agent is not configured for this application\" });\n var subject = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;\n var payload = new Dictionary<string, object?> { [\"apiKey\"] = apiKey, [\"agentId\"] = agentId };\n if (context.User.Identity?.IsAuthenticated == true && !string.IsNullOrEmpty(subject))\n payload[\"externalUserId\"] = \"my-app:\" + subject;\n try {\n var upstream = await clients.CreateClient(\"AgentHub\").PostAsJsonAsync(\n baseUrl + \"/api/agent/api-keys/embedded/me\", payload, context.RequestAborted);\n if (!upstream.IsSuccessStatusCode) return Results.StatusCode(502);\n return Results.Text(await upstream.Content.ReadAsStringAsync(context.RequestAborted), \"application/json\");\n } catch (HttpRequestException) { return Results.StatusCode(503); }\n}).AllowAnonymous(); // Replace with .RequireAuthorization() for login-only chat.\npublic sealed record AgentTokenRequest(int AgentId);\n// Imports: Microsoft.AspNetCore.Http, System.Net.Http.Json, System.Collections.Generic.\n// Add a distributed rate limiter and trusted-proxy configuration for public deployments."),
19
+ };
20
+ }
21
+ //# sourceMappingURL=agentEmbedSamples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentEmbedSamples.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/embed/agentEmbedSamples.ts"],"names":[],"mappings":"AAEA,IAAM,EAAE,GAAG,UAAC,KAAc,IAAK,OAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAnH,CAAmH,CAAC;AACnJ,IAAM,QAAQ,GAA4B,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK;IAChH,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAElF,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAA8B,EAAE,MAAc,EAAE,OAAe;IACzG,IAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,YAAK,OAAA,CAAC,KAAK,CAAC,IAAI,EAAE,MAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,mCAAI,yBAAyB,CAAC,CAAA,EAAA,CAAC,CAAC,CAAC;IAC9H,IAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAM,eAAe,GAAG,iCAA0B,UAAU,CAAE,CAAC;IAC/D,IAAM,oBAAoB,GAAG,kCAA2B,UAAU,CAAE,CAAC;IACrE,IAAM,MAAM,GAAG,mBAAY,OAAO,2EAA+D,UAAU,CAAE,CAAC;IAC9G,OAAO;QACH,UAAU,EAAE,qDACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,6OAMpD,MAAM,+RAMF;QACF,KAAK,EAAE,4cAWG,EAAE,CAAC,MAAM,CAAC,uhCA0BlB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,2PAQ3C;QACM,MAAM,EAAE,oNAGd,eAAe,8zDAsChB;QACO,MAAM,EAAE,wdAOiD,OAAO,eACtE,oBAAoB,2hEAgCgE;QAC9E,OAAO,EAAE,iPAEgD,OAAO,eACtE,oBAAoB,6/CA2BiE;QAC/E,IAAI,EAAE,0OAEmD,OAAO,eACtE,oBAAoB,ojFAuC8D;QAC5E,MAAM,EAAE,mPAEiD,OAAO,eACtE,oBAAoB,g+DA6BoE;KACrF,CAAC;AACN,CAAC","sourcesContent":["import type { AgentInputDefinition } from \"./agentEmbedProtocol\";\n\nconst js = (value: unknown) => JSON.stringify(value, null, 2).replace(/</g, \"\\\\u003c\").replace(/\\u2028/g, \"\\\\u2028\").replace(/\\u2029/g, \"\\\\u2029\");\nconst examples: Record<string, unknown> = { string: \"Replace with your value\", number: 0, integer: 0, boolean: false,\n date: \"2026-01-01\", datetime: \"2026-01-01T09:00:00Z\", object: {}, array: [] };\n\nexport function embedSamples(agentId: number, fields: AgentInputDefinition[], sdkUrl: string, hubBase: string) {\n const values = Object.fromEntries(fields.map((field) => [field.name, examples[field.dataType] ?? \"Replace with your value\"]));\n const valuesJson = js(values).replace(/\\n/g, \"\\n \");\n const backendUrl = hubBase.replace(/\\/$/, \"\");\n const environmentNote = `# AGENTHUB_BACKEND_URL=${backendUrl}`;\n const environmentNoteSlash = `// AGENTHUB_BACKEND_URL=${backendUrl}`;\n const config = `agentId: ${agentId},\\n tokenEndpoint: \"/api/agent-chat/token\",\\n inputs: ${valuesJson}`;\n return {\n javascript: `<div id=\"agent-chat\"></div>\n<script src=${JSON.stringify(sdkUrl).replace(/</g, \"&lt;\")}></script>\n<script>\n // Values should come from the current page or trusted app state.\n // The API key and AgentHub URL stay on your server.\n const chat = SolidAgentEmbed.mount({\n container: \"#agent-chat\",\n ${config}\n });\n // For app auth/CSRF, add getTokenHeaders: () => yourAppAuthHeaders().\n // Optional lifecycle methods: chat.open(), chat.close(), chat.destroy().\n // Update context before the first message or after starting a new chat:\n // await chat.setInputs({ ... });\n</script>`,\n react: `\"use client\";\nimport { useEffect, useRef } from \"react\";\n\ntype AgentEmbed = { destroy: () => void };\ntype AgentEmbedSdk = { mount: (options: {\n container: HTMLElement; agentId: number; tokenEndpoint: string;\n inputs: Record<string, unknown>; label?: string; title?: string;\n getTokenHeaders?: () => Record<string, string>;\n}) => AgentEmbed };\ndeclare global { interface Window { SolidAgentEmbed?: AgentEmbedSdk } }\n\nconst SDK_URL = ${js(sdkUrl)};\nlet sdkPromise: Promise<AgentEmbedSdk> | undefined;\nfunction loadSdk() {\n if (window.SolidAgentEmbed) return Promise.resolve(window.SolidAgentEmbed);\n if (!sdkPromise) sdkPromise = new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = SDK_URL;\n script.async = true;\n script.onload = () => window.SolidAgentEmbed\n ? resolve(window.SolidAgentEmbed)\n : reject(new Error(\"Agent embed SDK did not initialize\"));\n script.onerror = () => { script.remove(); sdkPromise = undefined; reject(new Error(\"Could not load Agent embed SDK\")); };\n document.head.appendChild(script);\n });\n return sdkPromise;\n}\n\nexport function AgentChat() {\n const containerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n let disposed = false;\n let chat: AgentEmbed | undefined;\n void loadSdk().then((sdk) => {\n if (disposed || !containerRef.current) return;\n chat = sdk.mount({\n container: containerRef.current,\n ${config.replace(/\\n/g, \"\\n \")}\n });\n }).catch((error: unknown) => {\n if (!disposed) console.error(\"Could not initialize agent chat\", error);\n });\n return () => { disposed = true; chat?.destroy(); };\n }, []);\n return <div ref={containerRef} />;\n}`,\n python: `# FastAPI. Install httpx; mount this router in your application.\n# Keep these server-only environment variables out of the browser bundle:\n# AGENTHUB_API_KEY, AGENTHUB_AGENT_ID, AGENTHUB_BACKEND_URL\n${environmentNote}\nimport os\nimport httpx\nfrom fastapi import APIRouter, HTTPException, Request, Response\nfrom pydantic import BaseModel\n\nrouter = APIRouter()\nAGENTHUB_URL = (os.getenv(\"AGENTHUB_BACKEND_URL\") or \"\").rstrip(\"/\")\n\nclass TokenRequest(BaseModel):\n agentId: int\n\n@router.post(\"/api/agent-chat/token\")\nasync def create_agent_token(body: TokenRequest, request: Request, response: Response):\n response.headers[\"Cache-Control\"] = \"no-store\"\n try:\n agent_id = int(os.environ.get(\"AGENTHUB_AGENT_ID\", \"0\"))\n except ValueError:\n agent_id = 0\n api_key = os.getenv(\"AGENTHUB_API_KEY\")\n if not api_key or not AGENTHUB_URL or agent_id <= 0:\n raise HTTPException(status_code=503, detail=\"Chat is temporarily unavailable\")\n if body.agentId != agent_id:\n raise HTTPException(status_code=400, detail=\"Agent is not configured for this application\")\n # If trusted optional-auth middleware populated request.state.user, pass its stable ID.\n user = getattr(request.state, \"user\", None)\n external_id = user.get(\"id\") if isinstance(user, dict) else getattr(user, \"id\", None)\n payload = {\"apiKey\": api_key, \"agentId\": agent_id}\n if external_id is not None:\n payload[\"externalUserId\"] = f\"my-app:{external_id}\"\n try:\n async with httpx.AsyncClient(timeout=15) as client:\n upstream = await client.post(f\"{AGENTHUB_URL}/api/agent/api-keys/embedded/me\", json=payload)\n if not upstream.is_success:\n raise HTTPException(status_code=502, detail=\"Chat is temporarily unavailable\")\n return upstream.json() # forward the token response; never cache or log it\n except httpx.HTTPError as exc:\n raise HTTPException(status_code=503, detail=\"Chat is temporarily unavailable\") from exc\n`,\n nestjs: `// NestJS. Uses the app's existing ConfigService and optional auth middleware.\n// Add a distributed rate limit at the gateway or with your Nest throttler.\nimport { Body, Controller, HttpException, HttpStatus, Post, Req, Res } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport { Public } from \"@solidxai/core\";\nimport { Request, Response } from \"express\";\n\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}\n${environmentNoteSlash}\ntype EmbedRequest = Request & { user?: { id?: string | number; sub?: string | number } };\n@Controller(\"agent-chat\")\nexport class AgentChatController {\n constructor(private readonly config: ConfigService) {}\n\n @Post(\"token\")\n @Public() // allow anonymous use; remove/replace with your app policy for login-only chat\n async createToken(@Body() body: { agentId: number }, @Req() req: EmbedRequest, @Res() res: Response) {\n res.setHeader(\"Cache-Control\", \"no-store\");\n const agentId = Number(this.config.get(\"AGENTHUB_AGENT_ID\")); // fixed; never trust browser selection\n const apiKey = this.config.get<string>(\"AGENTHUB_API_KEY\");\n const baseUrl = this.config.get<string>(\"AGENTHUB_BACKEND_URL\")?.replace(/\\\\/$/, \"\");\n if (!apiKey || !baseUrl || !Number.isSafeInteger(agentId) || agentId <= 0)\n throw new HttpException(\"Chat is temporarily unavailable\", HttpStatus.SERVICE_UNAVAILABLE);\n if (body.agentId !== agentId) throw new HttpException(\"Agent is not configured\", HttpStatus.BAD_REQUEST);\n const userId = req.user?.id ?? req.user?.sub; // set only by trusted auth middleware\n const payload = { apiKey, agentId, ...(userId != null ? { externalUserId: \"my-app:\" + userId } : {}) };\n try {\n const upstream = await fetch(baseUrl + \"/api/agent/api-keys/embedded/me\", {\n method: \"POST\", headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload), signal: AbortSignal.timeout(15_000),\n });\n if (!upstream.ok) throw new HttpException(\"Chat is temporarily unavailable\", HttpStatus.BAD_GATEWAY);\n res.status(200).type(\"application/json\").send(await upstream.text());\n } catch (error) {\n if (error instanceof HttpException) throw error;\n throw new HttpException(\"Chat is temporarily unavailable\", HttpStatus.SERVICE_UNAVAILABLE);\n }\n }\n}\n// Mount behind trusted proxy configuration and rate limiting. Apply the app's\n// authentication/authorization guard instead of @Public() when access is restricted.`,\n express: `// Express (Node.js 20+). Mount after any optional authentication middleware.\n// Protect this public endpoint with a distributed/IP-aware rate limiter in production.\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}\n${environmentNoteSlash}\nimport express from \"express\";\n\nconst router = express.Router();\nrouter.post(\"/api/agent-chat/token\", async (req, res) => {\n res.set(\"Cache-Control\", \"no-store\");\n const agentId = Number(process.env.AGENTHUB_AGENT_ID); // fixed server-side allowlist\n const apiKey = process.env.AGENTHUB_API_KEY;\n const baseUrl = process.env.AGENTHUB_BACKEND_URL?.replace(/\\\\/$/, \"\");\n if (!apiKey || !baseUrl || !Number.isSafeInteger(agentId) || agentId <= 0)\n return res.status(503).json({ error: \"Chat is temporarily unavailable\" });\n if (Number(req.body?.agentId) !== agentId)\n return res.status(400).json({ error: \"Agent is not configured for this application\" });\n const userId = req.user?.id ?? req.user?.sub; // optional identity from trusted middleware\n try {\n const upstream = await fetch(baseUrl + \"/api/agent/api-keys/embedded/me\", {\n method: \"POST\", headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey, agentId, ...(userId != null ? { externalUserId: \"my-app:\" + userId } : {}) }),\n signal: AbortSignal.timeout(15_000),\n });\n if (!upstream.ok) return res.status(502).json({ error: \"Chat is temporarily unavailable\" });\n return res.status(200).type(\"application/json\").send(await upstream.text());\n } catch {\n return res.status(503).json({ error: \"Chat is temporarily unavailable\" });\n }\n});\nexport default router;\n// Ensure express.json() is installed. Never accept API key/backend URL from req.body.`,\n java: `// Spring Boot 3 / Java 17+. Keep this route public for anonymous embeds,\n// or apply your application's authorization policy. Add a distributed rate limiter.\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}\n${environmentNoteSlash}\n@RestController\npublic class AgentEmbedController {\n private final java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()\n .connectTimeout(java.time.Duration.ofSeconds(5)).build();\n private final com.fasterxml.jackson.databind.ObjectMapper json = new com.fasterxml.jackson.databind.ObjectMapper();\n\n @Value(\"\\${AGENTHUB_API_KEY}\") private String apiKey;\n @Value(\"\\${AGENTHUB_AGENT_ID}\") private int agentId;\n @Value(\"\\${AGENTHUB_BACKEND_URL}\") private String agentHubUrl;\n\n @PostMapping(\"/api/agent-chat/token\")\n public ResponseEntity<String> token(@RequestBody Map<String, Object> request,\n org.springframework.security.core.Authentication authentication) throws Exception {\n if (!Integer.valueOf(agentId).equals(request.get(\"agentId\")))\n return ResponseEntity.badRequest().cacheControl(CacheControl.noStore()).build();\n Map<String, Object> payload = new java.util.HashMap<>();\n payload.put(\"apiKey\", apiKey); payload.put(\"agentId\", agentId);\n // Omit externalUserId for anonymous access; ignore anonymous security principals.\n if (authentication != null && authentication.isAuthenticated() &&\n !(authentication instanceof org.springframework.security.authentication.AnonymousAuthenticationToken))\n payload.put(\"externalUserId\", \"my-app:\" + authentication.getName());\n var upstreamRequest = java.net.http.HttpRequest.newBuilder()\n .uri(java.net.URI.create(agentHubUrl.replaceAll(\"/+$\", \"\") + \"/api/agent/api-keys/embedded/me\"))\n .timeout(java.time.Duration.ofSeconds(15)).header(\"Content-Type\", \"application/json\")\n .POST(java.net.http.HttpRequest.BodyPublishers.ofString(json.writeValueAsString(payload))).build();\n try {\n var upstream = client.send(upstreamRequest, java.net.http.HttpResponse.BodyHandlers.ofString());\n if (upstream.statusCode() != 200)\n return ResponseEntity.status(502).cacheControl(CacheControl.noStore()).build();\n return ResponseEntity.ok().cacheControl(CacheControl.noStore())\n .contentType(MediaType.APPLICATION_JSON).body(upstream.body());\n } catch (java.io.IOException | InterruptedException error) {\n if (error instanceof InterruptedException) Thread.currentThread().interrupt();\n return ResponseEntity.status(503).cacheControl(CacheControl.noStore()).build();\n }\n }\n}\n// Imports: org.springframework.beans.factory.annotation.Value, web.bind.annotation.*,\n// org.springframework.http.*, java.util.Map. Do not log the key or token response.`,\n dotnet: `// ASP.NET Core Minimal API. Configure an IP/user rate-limit policy in production.\n// Authentication can be optional (anonymous demo) or required by your app's policy.\n// Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}\n${environmentNoteSlash}\nusing System.Security.Claims;\nusing System.Collections.Generic;\nusing System.Net.Http.Json;\n\nbuilder.Services.AddHttpClient(\"AgentHub\", client => client.Timeout = TimeSpan.FromSeconds(15));\napp.MapPost(\"/api/agent-chat/token\", async (AgentTokenRequest body, HttpContext context, IHttpClientFactory clients, IConfiguration config) => {\n context.Response.Headers.CacheControl = \"no-store\";\n if (!int.TryParse(config[\"AGENTHUB_AGENT_ID\"], out var agentId) || agentId <= 0)\n return Results.StatusCode(503);\n var apiKey = config[\"AGENTHUB_API_KEY\"];\n var baseUrl = config[\"AGENTHUB_BACKEND_URL\"]?.TrimEnd('/');\n if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(baseUrl))\n return Results.StatusCode(503);\n if (body.AgentId != agentId)\n return Results.BadRequest(new { error = \"Agent is not configured for this application\" });\n var subject = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;\n var payload = new Dictionary<string, object?> { [\"apiKey\"] = apiKey, [\"agentId\"] = agentId };\n if (context.User.Identity?.IsAuthenticated == true && !string.IsNullOrEmpty(subject))\n payload[\"externalUserId\"] = \"my-app:\" + subject;\n try {\n var upstream = await clients.CreateClient(\"AgentHub\").PostAsJsonAsync(\n baseUrl + \"/api/agent/api-keys/embedded/me\", payload, context.RequestAborted);\n if (!upstream.IsSuccessStatusCode) return Results.StatusCode(502);\n return Results.Text(await upstream.Content.ReadAsStringAsync(context.RequestAborted), \"application/json\");\n } catch (HttpRequestException) { return Results.StatusCode(503); }\n}).AllowAnonymous(); // Replace with .RequireAuthorization() for login-only chat.\npublic sealed record AgentTokenRequest(int AgentId);\n// Imports: Microsoft.AspNetCore.Http, System.Net.Http.Json, System.Collections.Generic.\n// Add a distributed rate limiter and trusted-proxy configuration for public deployments.`,\n };\n}\n"]}
@@ -0,0 +1,266 @@
1
+ import type { AgentInputDefinition } from "./agentEmbedProtocol";
2
+
3
+ const js = (value: unknown) => JSON.stringify(value, null, 2).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
4
+ const examples: Record<string, unknown> = { string: "Replace with your value", number: 0, integer: 0, boolean: false,
5
+ date: "2026-01-01", datetime: "2026-01-01T09:00:00Z", object: {}, array: [] };
6
+
7
+ export function embedSamples(agentId: number, fields: AgentInputDefinition[], sdkUrl: string, hubBase: string) {
8
+ const values = Object.fromEntries(fields.map((field) => [field.name, examples[field.dataType] ?? "Replace with your value"]));
9
+ const valuesJson = js(values).replace(/\n/g, "\n ");
10
+ const backendUrl = hubBase.replace(/\/$/, "");
11
+ const environmentNote = `# AGENTHUB_BACKEND_URL=${backendUrl}`;
12
+ const environmentNoteSlash = `// AGENTHUB_BACKEND_URL=${backendUrl}`;
13
+ const config = `agentId: ${agentId},\n tokenEndpoint: "/api/agent-chat/token",\n inputs: ${valuesJson}`;
14
+ return {
15
+ javascript: `<div id="agent-chat"></div>
16
+ <script src=${JSON.stringify(sdkUrl).replace(/</g, "&lt;")}></script>
17
+ <script>
18
+ // Values should come from the current page or trusted app state.
19
+ // The API key and AgentHub URL stay on your server.
20
+ const chat = SolidAgentEmbed.mount({
21
+ container: "#agent-chat",
22
+ ${config}
23
+ });
24
+ // For app auth/CSRF, add getTokenHeaders: () => yourAppAuthHeaders().
25
+ // Optional lifecycle methods: chat.open(), chat.close(), chat.destroy().
26
+ // Update context before the first message or after starting a new chat:
27
+ // await chat.setInputs({ ... });
28
+ </script>`,
29
+ react: `"use client";
30
+ import { useEffect, useRef } from "react";
31
+
32
+ type AgentEmbed = { destroy: () => void };
33
+ type AgentEmbedSdk = { mount: (options: {
34
+ container: HTMLElement; agentId: number; tokenEndpoint: string;
35
+ inputs: Record<string, unknown>; label?: string; title?: string;
36
+ getTokenHeaders?: () => Record<string, string>;
37
+ }) => AgentEmbed };
38
+ declare global { interface Window { SolidAgentEmbed?: AgentEmbedSdk } }
39
+
40
+ const SDK_URL = ${js(sdkUrl)};
41
+ let sdkPromise: Promise<AgentEmbedSdk> | undefined;
42
+ function loadSdk() {
43
+ if (window.SolidAgentEmbed) return Promise.resolve(window.SolidAgentEmbed);
44
+ if (!sdkPromise) sdkPromise = new Promise((resolve, reject) => {
45
+ const script = document.createElement("script");
46
+ script.src = SDK_URL;
47
+ script.async = true;
48
+ script.onload = () => window.SolidAgentEmbed
49
+ ? resolve(window.SolidAgentEmbed)
50
+ : reject(new Error("Agent embed SDK did not initialize"));
51
+ script.onerror = () => { script.remove(); sdkPromise = undefined; reject(new Error("Could not load Agent embed SDK")); };
52
+ document.head.appendChild(script);
53
+ });
54
+ return sdkPromise;
55
+ }
56
+
57
+ export function AgentChat() {
58
+ const containerRef = useRef<HTMLDivElement>(null);
59
+ useEffect(() => {
60
+ let disposed = false;
61
+ let chat: AgentEmbed | undefined;
62
+ void loadSdk().then((sdk) => {
63
+ if (disposed || !containerRef.current) return;
64
+ chat = sdk.mount({
65
+ container: containerRef.current,
66
+ ${config.replace(/\n/g, "\n ")}
67
+ });
68
+ }).catch((error: unknown) => {
69
+ if (!disposed) console.error("Could not initialize agent chat", error);
70
+ });
71
+ return () => { disposed = true; chat?.destroy(); };
72
+ }, []);
73
+ return <div ref={containerRef} />;
74
+ }`,
75
+ python: `# FastAPI. Install httpx; mount this router in your application.
76
+ # Keep these server-only environment variables out of the browser bundle:
77
+ # AGENTHUB_API_KEY, AGENTHUB_AGENT_ID, AGENTHUB_BACKEND_URL
78
+ ${environmentNote}
79
+ import os
80
+ import httpx
81
+ from fastapi import APIRouter, HTTPException, Request, Response
82
+ from pydantic import BaseModel
83
+
84
+ router = APIRouter()
85
+ AGENTHUB_URL = (os.getenv("AGENTHUB_BACKEND_URL") or "").rstrip("/")
86
+
87
+ class TokenRequest(BaseModel):
88
+ agentId: int
89
+
90
+ @router.post("/api/agent-chat/token")
91
+ async def create_agent_token(body: TokenRequest, request: Request, response: Response):
92
+ response.headers["Cache-Control"] = "no-store"
93
+ try:
94
+ agent_id = int(os.environ.get("AGENTHUB_AGENT_ID", "0"))
95
+ except ValueError:
96
+ agent_id = 0
97
+ api_key = os.getenv("AGENTHUB_API_KEY")
98
+ if not api_key or not AGENTHUB_URL or agent_id <= 0:
99
+ raise HTTPException(status_code=503, detail="Chat is temporarily unavailable")
100
+ if body.agentId != agent_id:
101
+ raise HTTPException(status_code=400, detail="Agent is not configured for this application")
102
+ # If trusted optional-auth middleware populated request.state.user, pass its stable ID.
103
+ user = getattr(request.state, "user", None)
104
+ external_id = user.get("id") if isinstance(user, dict) else getattr(user, "id", None)
105
+ payload = {"apiKey": api_key, "agentId": agent_id}
106
+ if external_id is not None:
107
+ payload["externalUserId"] = f"my-app:{external_id}"
108
+ try:
109
+ async with httpx.AsyncClient(timeout=15) as client:
110
+ upstream = await client.post(f"{AGENTHUB_URL}/api/agent/api-keys/embedded/me", json=payload)
111
+ if not upstream.is_success:
112
+ raise HTTPException(status_code=502, detail="Chat is temporarily unavailable")
113
+ return upstream.json() # forward the token response; never cache or log it
114
+ except httpx.HTTPError as exc:
115
+ raise HTTPException(status_code=503, detail="Chat is temporarily unavailable") from exc
116
+ `,
117
+ nestjs: `// NestJS. Uses the app's existing ConfigService and optional auth middleware.
118
+ // Add a distributed rate limit at the gateway or with your Nest throttler.
119
+ import { Body, Controller, HttpException, HttpStatus, Post, Req, Res } from "@nestjs/common";
120
+ import { ConfigService } from "@nestjs/config";
121
+ import { Public } from "@solidxai/core";
122
+ import { Request, Response } from "express";
123
+
124
+ // Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}
125
+ ${environmentNoteSlash}
126
+ type EmbedRequest = Request & { user?: { id?: string | number; sub?: string | number } };
127
+ @Controller("agent-chat")
128
+ export class AgentChatController {
129
+ constructor(private readonly config: ConfigService) {}
130
+
131
+ @Post("token")
132
+ @Public() // allow anonymous use; remove/replace with your app policy for login-only chat
133
+ async createToken(@Body() body: { agentId: number }, @Req() req: EmbedRequest, @Res() res: Response) {
134
+ res.setHeader("Cache-Control", "no-store");
135
+ const agentId = Number(this.config.get("AGENTHUB_AGENT_ID")); // fixed; never trust browser selection
136
+ const apiKey = this.config.get<string>("AGENTHUB_API_KEY");
137
+ const baseUrl = this.config.get<string>("AGENTHUB_BACKEND_URL")?.replace(/\\/$/, "");
138
+ if (!apiKey || !baseUrl || !Number.isSafeInteger(agentId) || agentId <= 0)
139
+ throw new HttpException("Chat is temporarily unavailable", HttpStatus.SERVICE_UNAVAILABLE);
140
+ if (body.agentId !== agentId) throw new HttpException("Agent is not configured", HttpStatus.BAD_REQUEST);
141
+ const userId = req.user?.id ?? req.user?.sub; // set only by trusted auth middleware
142
+ const payload = { apiKey, agentId, ...(userId != null ? { externalUserId: "my-app:" + userId } : {}) };
143
+ try {
144
+ const upstream = await fetch(baseUrl + "/api/agent/api-keys/embedded/me", {
145
+ method: "POST", headers: { "Content-Type": "application/json" },
146
+ body: JSON.stringify(payload), signal: AbortSignal.timeout(15_000),
147
+ });
148
+ if (!upstream.ok) throw new HttpException("Chat is temporarily unavailable", HttpStatus.BAD_GATEWAY);
149
+ res.status(200).type("application/json").send(await upstream.text());
150
+ } catch (error) {
151
+ if (error instanceof HttpException) throw error;
152
+ throw new HttpException("Chat is temporarily unavailable", HttpStatus.SERVICE_UNAVAILABLE);
153
+ }
154
+ }
155
+ }
156
+ // Mount behind trusted proxy configuration and rate limiting. Apply the app's
157
+ // authentication/authorization guard instead of @Public() when access is restricted.`,
158
+ express: `// Express (Node.js 20+). Mount after any optional authentication middleware.
159
+ // Protect this public endpoint with a distributed/IP-aware rate limiter in production.
160
+ // Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}
161
+ ${environmentNoteSlash}
162
+ import express from "express";
163
+
164
+ const router = express.Router();
165
+ router.post("/api/agent-chat/token", async (req, res) => {
166
+ res.set("Cache-Control", "no-store");
167
+ const agentId = Number(process.env.AGENTHUB_AGENT_ID); // fixed server-side allowlist
168
+ const apiKey = process.env.AGENTHUB_API_KEY;
169
+ const baseUrl = process.env.AGENTHUB_BACKEND_URL?.replace(/\\/$/, "");
170
+ if (!apiKey || !baseUrl || !Number.isSafeInteger(agentId) || agentId <= 0)
171
+ return res.status(503).json({ error: "Chat is temporarily unavailable" });
172
+ if (Number(req.body?.agentId) !== agentId)
173
+ return res.status(400).json({ error: "Agent is not configured for this application" });
174
+ const userId = req.user?.id ?? req.user?.sub; // optional identity from trusted middleware
175
+ try {
176
+ const upstream = await fetch(baseUrl + "/api/agent/api-keys/embedded/me", {
177
+ method: "POST", headers: { "Content-Type": "application/json" },
178
+ body: JSON.stringify({ apiKey, agentId, ...(userId != null ? { externalUserId: "my-app:" + userId } : {}) }),
179
+ signal: AbortSignal.timeout(15_000),
180
+ });
181
+ if (!upstream.ok) return res.status(502).json({ error: "Chat is temporarily unavailable" });
182
+ return res.status(200).type("application/json").send(await upstream.text());
183
+ } catch {
184
+ return res.status(503).json({ error: "Chat is temporarily unavailable" });
185
+ }
186
+ });
187
+ export default router;
188
+ // Ensure express.json() is installed. Never accept API key/backend URL from req.body.`,
189
+ java: `// Spring Boot 3 / Java 17+. Keep this route public for anonymous embeds,
190
+ // or apply your application's authorization policy. Add a distributed rate limiter.
191
+ // Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}
192
+ ${environmentNoteSlash}
193
+ @RestController
194
+ public class AgentEmbedController {
195
+ private final java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
196
+ .connectTimeout(java.time.Duration.ofSeconds(5)).build();
197
+ private final com.fasterxml.jackson.databind.ObjectMapper json = new com.fasterxml.jackson.databind.ObjectMapper();
198
+
199
+ @Value("\${AGENTHUB_API_KEY}") private String apiKey;
200
+ @Value("\${AGENTHUB_AGENT_ID}") private int agentId;
201
+ @Value("\${AGENTHUB_BACKEND_URL}") private String agentHubUrl;
202
+
203
+ @PostMapping("/api/agent-chat/token")
204
+ public ResponseEntity<String> token(@RequestBody Map<String, Object> request,
205
+ org.springframework.security.core.Authentication authentication) throws Exception {
206
+ if (!Integer.valueOf(agentId).equals(request.get("agentId")))
207
+ return ResponseEntity.badRequest().cacheControl(CacheControl.noStore()).build();
208
+ Map<String, Object> payload = new java.util.HashMap<>();
209
+ payload.put("apiKey", apiKey); payload.put("agentId", agentId);
210
+ // Omit externalUserId for anonymous access; ignore anonymous security principals.
211
+ if (authentication != null && authentication.isAuthenticated() &&
212
+ !(authentication instanceof org.springframework.security.authentication.AnonymousAuthenticationToken))
213
+ payload.put("externalUserId", "my-app:" + authentication.getName());
214
+ var upstreamRequest = java.net.http.HttpRequest.newBuilder()
215
+ .uri(java.net.URI.create(agentHubUrl.replaceAll("/+$", "") + "/api/agent/api-keys/embedded/me"))
216
+ .timeout(java.time.Duration.ofSeconds(15)).header("Content-Type", "application/json")
217
+ .POST(java.net.http.HttpRequest.BodyPublishers.ofString(json.writeValueAsString(payload))).build();
218
+ try {
219
+ var upstream = client.send(upstreamRequest, java.net.http.HttpResponse.BodyHandlers.ofString());
220
+ if (upstream.statusCode() != 200)
221
+ return ResponseEntity.status(502).cacheControl(CacheControl.noStore()).build();
222
+ return ResponseEntity.ok().cacheControl(CacheControl.noStore())
223
+ .contentType(MediaType.APPLICATION_JSON).body(upstream.body());
224
+ } catch (java.io.IOException | InterruptedException error) {
225
+ if (error instanceof InterruptedException) Thread.currentThread().interrupt();
226
+ return ResponseEntity.status(503).cacheControl(CacheControl.noStore()).build();
227
+ }
228
+ }
229
+ }
230
+ // Imports: org.springframework.beans.factory.annotation.Value, web.bind.annotation.*,
231
+ // org.springframework.http.*, java.util.Map. Do not log the key or token response.`,
232
+ dotnet: `// ASP.NET Core Minimal API. Configure an IP/user rate-limit policy in production.
233
+ // Authentication can be optional (anonymous demo) or required by your app's policy.
234
+ // Server environment: AGENTHUB_API_KEY=...; AGENTHUB_AGENT_ID=${agentId}
235
+ ${environmentNoteSlash}
236
+ using System.Security.Claims;
237
+ using System.Collections.Generic;
238
+ using System.Net.Http.Json;
239
+
240
+ builder.Services.AddHttpClient("AgentHub", client => client.Timeout = TimeSpan.FromSeconds(15));
241
+ app.MapPost("/api/agent-chat/token", async (AgentTokenRequest body, HttpContext context, IHttpClientFactory clients, IConfiguration config) => {
242
+ context.Response.Headers.CacheControl = "no-store";
243
+ if (!int.TryParse(config["AGENTHUB_AGENT_ID"], out var agentId) || agentId <= 0)
244
+ return Results.StatusCode(503);
245
+ var apiKey = config["AGENTHUB_API_KEY"];
246
+ var baseUrl = config["AGENTHUB_BACKEND_URL"]?.TrimEnd('/');
247
+ if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(baseUrl))
248
+ return Results.StatusCode(503);
249
+ if (body.AgentId != agentId)
250
+ return Results.BadRequest(new { error = "Agent is not configured for this application" });
251
+ var subject = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
252
+ var payload = new Dictionary<string, object?> { ["apiKey"] = apiKey, ["agentId"] = agentId };
253
+ if (context.User.Identity?.IsAuthenticated == true && !string.IsNullOrEmpty(subject))
254
+ payload["externalUserId"] = "my-app:" + subject;
255
+ try {
256
+ var upstream = await clients.CreateClient("AgentHub").PostAsJsonAsync(
257
+ baseUrl + "/api/agent/api-keys/embedded/me", payload, context.RequestAborted);
258
+ if (!upstream.IsSuccessStatusCode) return Results.StatusCode(502);
259
+ return Results.Text(await upstream.Content.ReadAsStringAsync(context.RequestAborted), "application/json");
260
+ } catch (HttpRequestException) { return Results.StatusCode(503); }
261
+ }).AllowAnonymous(); // Replace with .RequireAuthorization() for login-only chat.
262
+ public sealed record AgentTokenRequest(int AgentId);
263
+ // Imports: Microsoft.AspNetCore.Http, System.Net.Http.Json, System.Collections.Generic.
264
+ // Add a distributed rate limiter and trusted-proxy configuration for public deployments.`,
265
+ };
266
+ }
@@ -0,0 +1,15 @@
1
+ export type AgentHubRuntimeProcess = {
2
+ id: string;
3
+ agentId: number;
4
+ status: string;
5
+ openSessions: number;
6
+ runningTurns: number;
7
+ restartNeeded: boolean;
8
+ };
9
+ export declare function listAgentHubProcesses(force?: boolean): Promise<AgentHubRuntimeProcess[]>;
10
+ export declare function stopAgentHubProcess(processId: string): Promise<void>;
11
+ export declare function restartAgentHubProcess(processId: string): Promise<void>;
12
+ export declare function invalidateAgentHubProcessList(): void;
13
+ export declare function stopAgentHubProcessRowAction(event: any): Promise<void>;
14
+ export declare function restartAgentHubProcessRowAction(event: any): Promise<void>;
15
+ //# sourceMappingURL=agentHubProcessApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentHubProcessApi.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/processes/agentHubProcessApi.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAgBF,wBAAgB,qBAAqB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAWtF;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,iBAG1D;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,iBAG7D;AAED,wBAAgB,6BAA6B,SAG5C;AAED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,GAAG,iBAI5D;AAED,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,GAAG,iBAI/D"}
@@ -0,0 +1,122 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { solidGet, solidPost } from "../../../../http/solidHttp";
38
+ var inFlight = null;
39
+ var cachedAt = 0;
40
+ var cached = [];
41
+ function unwrap(value) {
42
+ var current = value;
43
+ for (var depth = 0; depth < 5 && current; depth += 1) {
44
+ if (Array.isArray(current))
45
+ return current;
46
+ if (Array.isArray(current.data))
47
+ return current.data;
48
+ current = current.data;
49
+ }
50
+ return [];
51
+ }
52
+ export function listAgentHubProcesses(force) {
53
+ if (force === void 0) { force = false; }
54
+ if (!force && Date.now() - cachedAt < 5000)
55
+ return Promise.resolve(cached);
56
+ if (inFlight)
57
+ return inFlight;
58
+ inFlight = solidGet("/agent-process/manager/processes")
59
+ .then(function (response) {
60
+ cached = unwrap(response === null || response === void 0 ? void 0 : response.data);
61
+ cachedAt = Date.now();
62
+ return cached;
63
+ })
64
+ .finally(function () { inFlight = null; });
65
+ return inFlight;
66
+ }
67
+ export function stopAgentHubProcess(processId) {
68
+ return __awaiter(this, void 0, void 0, function () {
69
+ return __generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0: return [4 /*yield*/, solidPost("/agent-process/manager/processes/".concat(encodeURIComponent(processId), "/stop"), {})];
72
+ case 1:
73
+ _a.sent();
74
+ invalidateAgentHubProcessList();
75
+ return [2 /*return*/];
76
+ }
77
+ });
78
+ });
79
+ }
80
+ export function restartAgentHubProcess(processId) {
81
+ return __awaiter(this, void 0, void 0, function () {
82
+ return __generator(this, function (_a) {
83
+ switch (_a.label) {
84
+ case 0: return [4 /*yield*/, solidPost("/agent-process/manager/processes/".concat(encodeURIComponent(processId), "/restart"), {})];
85
+ case 1:
86
+ _a.sent();
87
+ invalidateAgentHubProcessList();
88
+ return [2 /*return*/];
89
+ }
90
+ });
91
+ });
92
+ }
93
+ export function invalidateAgentHubProcessList() {
94
+ cachedAt = 0;
95
+ if (typeof window !== "undefined")
96
+ window.dispatchEvent(new Event("agent-process-manager-updated"));
97
+ }
98
+ export function stopAgentHubProcessRowAction(event) {
99
+ var _a;
100
+ return __awaiter(this, void 0, void 0, function () {
101
+ var processId;
102
+ return __generator(this, function (_b) {
103
+ processId = (_a = event === null || event === void 0 ? void 0 : event.rowData) === null || _a === void 0 ? void 0 : _a.processId;
104
+ if (!processId)
105
+ throw new Error("This process has no runtime process ID.");
106
+ return [2 /*return*/, stopAgentHubProcess(String(processId))];
107
+ });
108
+ });
109
+ }
110
+ export function restartAgentHubProcessRowAction(event) {
111
+ var _a;
112
+ return __awaiter(this, void 0, void 0, function () {
113
+ var processId;
114
+ return __generator(this, function (_b) {
115
+ processId = (_a = event === null || event === void 0 ? void 0 : event.rowData) === null || _a === void 0 ? void 0 : _a.processId;
116
+ if (!processId)
117
+ throw new Error("This process has no runtime process ID.");
118
+ return [2 /*return*/, restartAgentHubProcess(String(processId))];
119
+ });
120
+ });
121
+ }
122
+ //# sourceMappingURL=agentHubProcessApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentHubProcessApi.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/processes/agentHubProcessApi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAWjE,IAAI,QAAQ,GAA6C,IAAI,CAAC;AAC9D,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAI,MAAM,GAA6B,EAAE,CAAC;AAE1C,SAAS,MAAM,CAAC,KAAU;IACxB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC;QACrD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;KACxB;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IAAb,sBAAA,EAAA,aAAa;IACjD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,QAAQ,GAAG,QAAQ,CAAC,kCAAkC,CAAC;SACpD,IAAI,CAAC,UAAC,QAAa;QAClB,MAAM,GAAG,MAAM,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,CAAC;QAChC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;SACD,OAAO,CAAC,cAAQ,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAgB,mBAAmB,CAAC,SAAiB;;;;wBACzD,qBAAM,SAAS,CAAC,2CAAoC,kBAAkB,CAAC,SAAS,CAAC,UAAO,EAAE,EAAE,CAAC,EAAA;;oBAA7F,SAA6F,CAAC;oBAC9F,6BAA6B,EAAE,CAAC;;;;;CACjC;AAED,MAAM,UAAgB,sBAAsB,CAAC,SAAiB;;;;wBAC5D,qBAAM,SAAS,CAAC,2CAAoC,kBAAkB,CAAC,SAAS,CAAC,aAAU,EAAE,EAAE,CAAC,EAAA;;oBAAhG,SAAgG,CAAC;oBACjG,6BAA6B,EAAE,CAAC;;;;;CACjC;AAED,MAAM,UAAU,6BAA6B;IAC3C,QAAQ,GAAG,CAAC,CAAC;IACb,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAgB,4BAA4B,CAAC,KAAU;;;;;YACrD,SAAS,GAAG,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,0CAAE,SAAS,CAAC;YAC5C,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC3E,sBAAO,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAC;;;CAC/C;AAED,MAAM,UAAgB,+BAA+B,CAAC,KAAU;;;;;YACxD,SAAS,GAAG,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,0CAAE,SAAS,CAAC;YAC5C,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC3E,sBAAO,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAC;;;CAClD","sourcesContent":["import { solidGet, solidPost } from \"../../../../http/solidHttp\";\n\nexport type AgentHubRuntimeProcess = {\n id: string;\n agentId: number;\n status: string;\n openSessions: number;\n runningTurns: number;\n restartNeeded: boolean;\n};\n\nlet inFlight: Promise<AgentHubRuntimeProcess[]> | null = null;\nlet cachedAt = 0;\nlet cached: AgentHubRuntimeProcess[] = [];\n\nfunction unwrap(value: any): any {\n let current = value;\n for (let depth = 0; depth < 5 && current; depth += 1) {\n if (Array.isArray(current)) return current;\n if (Array.isArray(current.data)) return current.data;\n current = current.data;\n }\n return [];\n}\n\nexport function listAgentHubProcesses(force = false): Promise<AgentHubRuntimeProcess[]> {\n if (!force && Date.now() - cachedAt < 5000) return Promise.resolve(cached);\n if (inFlight) return inFlight;\n inFlight = solidGet(\"/agent-process/manager/processes\")\n .then((response: any) => {\n cached = unwrap(response?.data);\n cachedAt = Date.now();\n return cached;\n })\n .finally(() => { inFlight = null; });\n return inFlight;\n}\n\nexport async function stopAgentHubProcess(processId: string) {\n await solidPost(`/agent-process/manager/processes/${encodeURIComponent(processId)}/stop`, {});\n invalidateAgentHubProcessList();\n}\n\nexport async function restartAgentHubProcess(processId: string) {\n await solidPost(`/agent-process/manager/processes/${encodeURIComponent(processId)}/restart`, {});\n invalidateAgentHubProcessList();\n}\n\nexport function invalidateAgentHubProcessList() {\n cachedAt = 0;\n if (typeof window !== \"undefined\") window.dispatchEvent(new Event(\"agent-process-manager-updated\"));\n}\n\nexport async function stopAgentHubProcessRowAction(event: any) {\n const processId = event?.rowData?.processId;\n if (!processId) throw new Error(\"This process has no runtime process ID.\");\n return stopAgentHubProcess(String(processId));\n}\n\nexport async function restartAgentHubProcessRowAction(event: any) {\n const processId = event?.rowData?.processId;\n if (!processId) throw new Error(\"This process has no runtime process ID.\");\n return restartAgentHubProcess(String(processId));\n}\n"]}