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