@solidxai/core-ui 0.1.19-beta.0 → 0.1.19-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/README.md +19 -0
- package/dist/components/common/SolidPopupContainer.d.ts.map +1 -1
- package/dist/components/common/SolidPopupContainer.js +3 -2
- package/dist/components/common/SolidPopupContainer.js.map +1 -1
- package/dist/components/common/SolidPopupContainer.tsx +3 -2
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +4 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +11 -5
- package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatter.js +2 -1
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +2 -0
- package/dist/components/core/chatter/SolidChatterMessageBox.d.ts +2 -0
- package/dist/components/core/chatter/SolidChatterMessageBox.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterMessageBox.js +7 -4
- package/dist/components/core/chatter/SolidChatterMessageBox.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterMessageBox.tsx +8 -3
- package/dist/components/core/chatter/SolidChatterMessageWidget.d.ts +5 -0
- package/dist/components/core/chatter/SolidChatterMessageWidget.d.ts.map +1 -0
- package/dist/components/core/chatter/SolidChatterMessageWidget.js +85 -0
- package/dist/components/core/chatter/SolidChatterMessageWidget.js.map +1 -0
- package/dist/components/core/chatter/SolidChatterMessageWidget.tsx +59 -0
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +6 -5
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +6 -5
- package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.d.ts +11 -0
- package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.js +102 -0
- package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/agentEvent/list/AgentEventOutcomeListWidget.tsx +129 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.d.ts +4 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.js +29 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.module.css +226 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget.tsx +57 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts +4 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js +33 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx +47 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.d.ts +5 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.js +59 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.js.map +1 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel.tsx +82 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.d.ts +17 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.js +258 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.js.map +1 -0
- package/dist/components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel.tsx +286 -0
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +102 -62
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +116 -106
- package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.d.ts +6 -0
- package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.js +37 -0
- package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/MqMessageSelectedRecordsSummaryHeaderAction.tsx +89 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.d.ts +3 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.js +18 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageDetailsKanbanCardAction.tsx +51 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.d.ts +10 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.js +63 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanQuickFilterHeaderAction.tsx +111 -0
- package/dist/components/core/field/FieldListViewData.d.ts.map +1 -1
- package/dist/components/core/field/FieldListViewData.js +29 -9
- package/dist/components/core/field/FieldListViewData.js.map +1 -1
- package/dist/components/core/field/FieldListViewData.tsx +7 -6
- package/dist/components/core/form/SolidFormView.d.ts +1 -0
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +49 -48
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +4 -3
- package/dist/components/core/form/fields/SolidPasswordField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidPasswordField.js +13 -1
- package/dist/components/core/form/fields/SolidPasswordField.js.map +1 -1
- package/dist/components/core/form/fields/SolidPasswordField.tsx +14 -3
- package/dist/components/core/kanban/KanbanBoard.d.ts +1 -1
- package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanBoard.js +2 -2
- package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
- package/dist/components/core/kanban/KanbanBoard.tsx +5 -1
- package/dist/components/core/kanban/KanbanCard.d.ts +3 -0
- package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanCard.js +5 -4
- package/dist/components/core/kanban/KanbanCard.js.map +1 -1
- package/dist/components/core/kanban/KanbanCard.tsx +31 -11
- package/dist/components/core/kanban/KanbanColumn.d.ts +5 -1
- package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanColumn.js +14 -3
- package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
- package/dist/components/core/kanban/KanbanColumn.tsx +43 -3
- package/dist/components/core/kanban/SolidKanbanView.d.ts +2 -0
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +90 -52
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +93 -13
- package/dist/components/core/list/SolidDataTable.d.ts +2 -1
- package/dist/components/core/list/SolidDataTable.d.ts.map +1 -1
- package/dist/components/core/list/SolidDataTable.js +2 -2
- package/dist/components/core/list/SolidDataTable.js.map +1 -1
- package/dist/components/core/list/SolidDataTable.tsx +3 -0
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +114 -57
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +71 -7
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +14 -0
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +13 -0
- package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.d.ts +3 -0
- package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.d.ts.map +1 -0
- package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.js +51 -0
- package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.js.map +1 -0
- package/dist/components/core/list/widgets/AgentProcessNeedsRestartListWidget.tsx +60 -0
- package/dist/components/core/list/widgets/SolidIconNameListViewWidget.d.ts +4 -0
- package/dist/components/core/list/widgets/SolidIconNameListViewWidget.d.ts.map +1 -0
- package/dist/components/core/list/widgets/SolidIconNameListViewWidget.js +24 -0
- package/dist/components/core/list/widgets/SolidIconNameListViewWidget.js.map +1 -0
- package/dist/components/core/list/widgets/SolidIconNameListViewWidget.tsx +32 -0
- package/dist/components/core/model/ModelListViewData.d.ts.map +1 -1
- package/dist/components/core/model/ModelListViewData.js +6 -23
- package/dist/components/core/model/ModelListViewData.js.map +1 -1
- package/dist/components/core/model/ModelListViewData.tsx +1 -48
- package/dist/components/core/solid-agent/AgentModelIndicator.d.ts +5 -0
- package/dist/components/core/solid-agent/AgentModelIndicator.d.ts.map +1 -0
- package/dist/components/core/solid-agent/AgentModelIndicator.js +14 -0
- package/dist/components/core/solid-agent/AgentModelIndicator.js.map +1 -0
- package/dist/components/core/solid-agent/AgentModelIndicator.tsx +40 -0
- package/dist/components/core/solid-agent/AgentSignIn.d.ts +12 -0
- package/dist/components/core/solid-agent/AgentSignIn.d.ts.map +1 -0
- package/dist/components/core/solid-agent/AgentSignIn.js +82 -0
- package/dist/components/core/solid-agent/AgentSignIn.js.map +1 -0
- package/dist/components/core/solid-agent/AgentSignIn.tsx +91 -0
- package/dist/components/core/solid-agent/SolidAgent.module.css +596 -0
- package/dist/components/core/solid-agent/SolidAgentChat.d.ts +30 -0
- package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentChat.js +300 -0
- package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentChat.tsx +451 -0
- package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts +44 -0
- package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentEmbedded.js +46 -0
- package/dist/components/core/solid-agent/SolidAgentEmbedded.js.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentEmbedded.tsx +87 -0
- package/dist/components/core/solid-agent/SolidAgentHost.d.ts +8 -0
- package/dist/components/core/solid-agent/SolidAgentHost.d.ts.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentHost.js +152 -0
- package/dist/components/core/solid-agent/SolidAgentHost.js.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentHost.tsx +164 -0
- package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts +16 -0
- package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentMarkdown.js +161 -0
- package/dist/components/core/solid-agent/SolidAgentMarkdown.js.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentMarkdown.tsx +133 -0
- package/dist/components/core/solid-agent/SolidAgentMount.d.ts +3 -0
- package/dist/components/core/solid-agent/SolidAgentMount.d.ts.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentMount.js +62 -0
- package/dist/components/core/solid-agent/SolidAgentMount.js.map +1 -0
- package/dist/components/core/solid-agent/SolidAgentMount.tsx +31 -0
- package/dist/components/core/solid-agent/SolidXAIIcon.d.ts +5 -0
- package/dist/components/core/solid-agent/SolidXAIIcon.d.ts.map +1 -0
- package/dist/components/core/solid-agent/SolidXAIIcon.js +7 -0
- package/dist/components/core/solid-agent/SolidXAIIcon.js.map +1 -0
- package/dist/components/core/solid-agent/SolidXAIIcon.tsx +6 -0
- package/dist/components/core/solid-agent/agentAttachments.d.ts +20 -0
- package/dist/components/core/solid-agent/agentAttachments.d.ts.map +1 -0
- package/dist/components/core/solid-agent/agentAttachments.js +184 -0
- package/dist/components/core/solid-agent/agentAttachments.js.map +1 -0
- package/dist/components/core/solid-agent/agentAttachments.ts +119 -0
- package/dist/components/core/solid-agent/agentEvents.d.ts +34 -0
- package/dist/components/core/solid-agent/agentEvents.d.ts.map +1 -0
- package/dist/components/core/solid-agent/agentEvents.js +282 -0
- package/dist/components/core/solid-agent/agentEvents.js.map +1 -0
- package/dist/components/core/solid-agent/agentEvents.ts +292 -0
- package/dist/components/core/solid-agent/agentFormat.d.ts +18 -0
- package/dist/components/core/solid-agent/agentFormat.d.ts.map +1 -0
- package/dist/components/core/solid-agent/agentFormat.js +179 -0
- package/dist/components/core/solid-agent/agentFormat.js.map +1 -0
- package/dist/components/core/solid-agent/agentFormat.ts +160 -0
- package/dist/components/core/solid-agent/client/agentAttachmentMedia.d.ts +9 -0
- package/dist/components/core/solid-agent/client/agentAttachmentMedia.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentAttachmentMedia.js +129 -0
- package/dist/components/core/solid-agent/client/agentAttachmentMedia.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentAttachmentMedia.ts +69 -0
- package/dist/components/core/solid-agent/client/agentAuth.d.ts +63 -0
- package/dist/components/core/solid-agent/client/agentAuth.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentAuth.js +307 -0
- package/dist/components/core/solid-agent/client/agentAuth.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentAuth.ts +222 -0
- package/dist/components/core/solid-agent/client/agentRest.d.ts +30 -0
- package/dist/components/core/solid-agent/client/agentRest.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentRest.js +178 -0
- package/dist/components/core/solid-agent/client/agentRest.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentRest.ts +100 -0
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts +48 -0
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentRuntime.js +406 -0
- package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentRuntime.ts +226 -0
- package/dist/components/core/solid-agent/client/agentSocket.d.ts +46 -0
- package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentSocket.js +535 -0
- package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentSocket.ts +276 -0
- package/dist/components/core/solid-agent/client/agentUrls.d.ts +11 -0
- package/dist/components/core/solid-agent/client/agentUrls.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentUrls.js +18 -0
- package/dist/components/core/solid-agent/client/agentUrls.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentUrls.ts +19 -0
- package/dist/components/core/solid-agent/composer/AgentComposer.d.ts +21 -0
- package/dist/components/core/solid-agent/composer/AgentComposer.d.ts.map +1 -0
- package/dist/components/core/solid-agent/composer/AgentComposer.js +219 -0
- package/dist/components/core/solid-agent/composer/AgentComposer.js.map +1 -0
- package/dist/components/core/solid-agent/composer/AgentComposer.tsx +241 -0
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.d.ts +8 -0
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.d.ts.map +1 -0
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +87 -0
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -0
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +58 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +20 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +103 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +60 -0
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts +11 -0
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts.map +1 -0
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.js +21 -0
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.js.map +1 -0
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.ts +266 -0
- package/dist/components/core/solid-agent/processes/agentHubProcessApi.d.ts +15 -0
- package/dist/components/core/solid-agent/processes/agentHubProcessApi.d.ts.map +1 -0
- package/dist/components/core/solid-agent/processes/agentHubProcessApi.js +122 -0
- package/dist/components/core/solid-agent/processes/agentHubProcessApi.js.map +1 -0
- package/dist/components/core/solid-agent/processes/agentHubProcessApi.ts +64 -0
- package/dist/components/core/solid-agent/sdk/solidAgent.d.ts +39 -0
- package/dist/components/core/solid-agent/sdk/solidAgent.d.ts.map +1 -0
- package/dist/components/core/solid-agent/sdk/solidAgent.js +44 -0
- package/dist/components/core/solid-agent/sdk/solidAgent.js.map +1 -0
- package/dist/components/core/solid-agent/sdk/solidAgent.ts +56 -0
- package/dist/components/core/solid-agent/thread/AgentThread.d.ts +17 -0
- package/dist/components/core/solid-agent/thread/AgentThread.d.ts.map +1 -0
- package/dist/components/core/solid-agent/thread/AgentThread.js +166 -0
- package/dist/components/core/solid-agent/thread/AgentThread.js.map +1 -0
- package/dist/components/core/solid-agent/thread/AgentThread.tsx +248 -0
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts +36 -0
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts.map +1 -0
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js +148 -0
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js.map +1 -0
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.tsx +116 -0
- package/dist/components/core/solid-agent/thread/inlineWidget.d.ts +8 -0
- package/dist/components/core/solid-agent/thread/inlineWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/thread/inlineWidget.js +30 -0
- package/dist/components/core/solid-agent/thread/inlineWidget.js.map +1 -0
- package/dist/components/core/solid-agent/thread/inlineWidget.ts +27 -0
- package/dist/components/core/solid-agent/types.d.ts +155 -0
- package/dist/components/core/solid-agent/types.d.ts.map +1 -0
- package/dist/components/core/solid-agent/types.js +31 -0
- package/dist/components/core/solid-agent/types.js.map +1 -0
- package/dist/components/core/solid-agent/types.ts +148 -0
- package/dist/components/core/solid-agent/useAdminInputContext.d.ts +4 -0
- package/dist/components/core/solid-agent/useAdminInputContext.d.ts.map +1 -0
- package/dist/components/core/solid-agent/useAdminInputContext.js +49 -0
- package/dist/components/core/solid-agent/useAdminInputContext.js.map +1 -0
- package/dist/components/core/solid-agent/useAdminInputContext.ts +52 -0
- package/dist/components/core/solid-agent/useAgentAuth.d.ts +14 -0
- package/dist/components/core/solid-agent/useAgentAuth.d.ts.map +1 -0
- package/dist/components/core/solid-agent/useAgentAuth.js +88 -0
- package/dist/components/core/solid-agent/useAgentAuth.js.map +1 -0
- package/dist/components/core/solid-agent/useAgentAuth.ts +40 -0
- package/dist/components/core/solid-agent/useAgentAvailability.d.ts +19 -0
- package/dist/components/core/solid-agent/useAgentAvailability.d.ts.map +1 -0
- package/dist/components/core/solid-agent/useAgentAvailability.js +109 -0
- package/dist/components/core/solid-agent/useAgentAvailability.js.map +1 -0
- package/dist/components/core/solid-agent/useAgentAvailability.ts +80 -0
- package/dist/components/core/solid-agent/useAgentChat.d.ts +22 -0
- package/dist/components/core/solid-agent/useAgentChat.d.ts.map +1 -0
- package/dist/components/core/solid-agent/useAgentChat.js +45 -0
- package/dist/components/core/solid-agent/useAgentChat.js.map +1 -0
- package/dist/components/core/solid-agent/useAgentChat.ts +57 -0
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js +15 -0
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.tsx +24 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js +15 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.tsx +28 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js +20 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.tsx +8 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js +11 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.tsx +16 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js +67 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.tsx +135 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js +24 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.tsx +17 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.d.ts +8 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +30 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +77 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js +40 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.tsx +57 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js +13 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.tsx +19 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js +55 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.tsx +81 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js +15 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.tsx +30 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js +15 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.tsx +21 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js +21 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.tsx +33 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js +11 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.tsx +9 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.d.ts +15 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js +26 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.tsx +42 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js +41 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.tsx +69 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js +23 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.tsx +40 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js +32 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.tsx +55 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.d.ts +7 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js +17 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.tsx +31 -0
- package/dist/components/core/solid-agent/widgets/chatWidgetUtils.d.ts +12 -0
- package/dist/components/core/solid-agent/widgets/chatWidgetUtils.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/chatWidgetUtils.js +17 -0
- package/dist/components/core/solid-agent/widgets/chatWidgetUtils.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/chatWidgetUtils.ts +19 -0
- package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +909 -0
- package/dist/components/core/solid-ai/SolidAiChat.js +1 -1
- package/dist/components/core/solid-ai/SolidAiChat.js.map +1 -1
- package/dist/components/core/solid-ai/SolidAiChat.tsx +2 -2
- package/dist/components/layout/AdminLayout.d.ts.map +1 -1
- package/dist/components/layout/AdminLayout.js +2 -1
- package/dist/components/layout/AdminLayout.js.map +1 -1
- package/dist/components/layout/AdminLayout.tsx +2 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.js +2 -2
- package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +19 -15
- package/dist/components/shad-cn-ui/SolidDialog.d.ts +2 -1
- package/dist/components/shad-cn-ui/SolidDialog.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidDialog.js +2 -2
- package/dist/components/shad-cn-ui/SolidDialog.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidDialog.tsx +3 -0
- package/dist/components/shad-cn-ui/SolidIconPicker.d.ts +7 -0
- package/dist/components/shad-cn-ui/SolidIconPicker.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidIconPicker.js +43 -0
- package/dist/components/shad-cn-ui/SolidIconPicker.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidIconPicker.tsx +73 -0
- package/dist/components/shad-cn-ui/index.d.ts +1 -0
- package/dist/components/shad-cn-ui/index.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/index.js +1 -0
- package/dist/components/shad-cn-ui/index.js.map +1 -1
- package/dist/components/shad-cn-ui/index.ts +1 -0
- package/dist/constants/allowed-ai-models.d.ts +8 -0
- package/dist/constants/allowed-ai-models.d.ts.map +1 -0
- package/dist/constants/allowed-ai-models.js +33 -0
- package/dist/constants/allowed-ai-models.js.map +1 -0
- package/dist/constants/allowed-ai-models.ts +39 -0
- package/dist/helpers/hydrateRelationRules.d.ts.map +1 -1
- package/dist/helpers/hydrateRelationRules.js +3 -1
- package/dist/helpers/hydrateRelationRules.js.map +1 -1
- package/dist/helpers/hydrateRelationRules.ts +5 -1
- package/dist/helpers/registry.d.ts +4 -2
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +75 -12
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +73 -16
- package/dist/helpers/updatePasswordField.d.ts.map +1 -1
- package/dist/helpers/updatePasswordField.js +21 -15
- package/dist/helpers/updatePasswordField.js.map +1 -1
- package/dist/helpers/updatePasswordField.ts +6 -1
- package/dist/index.d.ts +21 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/index.ts +34 -3
- package/dist/redux/api/fieldApi.js +1 -1
- package/dist/redux/api/fieldApi.js.map +1 -1
- package/dist/redux/api/fieldApi.ts +2 -2
- package/dist/redux/api/modelApi.d.ts +13 -13
- package/dist/redux/api/modelApi.d.ts.map +1 -1
- package/dist/redux/api/modelApi.js +15 -15
- package/dist/redux/api/modelApi.js.map +1 -1
- package/dist/redux/api/modelApi.ts +12 -15
- package/dist/redux/features/agentSlice.d.ts +34 -0
- package/dist/redux/features/agentSlice.d.ts.map +1 -0
- package/dist/redux/features/agentSlice.js +92 -0
- package/dist/redux/features/agentSlice.js.map +1 -0
- package/dist/redux/features/agentSlice.ts +119 -0
- package/dist/redux/store/defaultStoreConfig.d.ts +11 -10
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/redux/store/defaultStoreConfig.js +2 -0
- package/dist/redux/store/defaultStoreConfig.js.map +1 -1
- package/dist/redux/store/defaultStoreConfig.ts +2 -0
- package/dist/redux/store/solidEntityApiPool.d.ts.map +1 -1
- package/dist/redux/store/solidEntityApiPool.js +7 -0
- package/dist/redux/store/solidEntityApiPool.js.map +1 -1
- package/dist/redux/store/solidEntityApiPool.ts +6 -0
- package/dist/resources/globals.css +109 -1
- package/dist/resources/solid-custom.css +295 -0
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.css +47 -0
- package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.d.ts +12 -0
- package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.js +80 -0
- package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentRegistryAuditPanel.tsx +123 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +110 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts +3 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +702 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +630 -0
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.css +303 -0
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts +3 -0
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +330 -0
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +460 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.css +125 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts +3 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +295 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +275 -0
- package/dist/routes/pages/admin/core/WorkflowDefinitionEditorPage.js +11 -11
- package/dist/routes/pages/admin/core/WorkflowDefinitionEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/WorkflowDefinitionEditorPage.tsx +15 -15
- package/dist/routes/pages/embed/AgentEmbedPage.d.ts +3 -0
- package/dist/routes/pages/embed/AgentEmbedPage.d.ts.map +1 -0
- package/dist/routes/pages/embed/AgentEmbedPage.js +170 -0
- package/dist/routes/pages/embed/AgentEmbedPage.js.map +1 -0
- package/dist/routes/pages/embed/AgentEmbedPage.module.css +195 -0
- package/dist/routes/pages/embed/AgentEmbedPage.tsx +169 -0
- package/dist/routes/solidRoutes.d.ts.map +1 -1
- package/dist/routes/solidRoutes.js +8 -0
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +8 -0
- package/dist/types/extension-registry.d.ts +4 -0
- package/dist/types/extension-registry.d.ts.map +1 -1
- package/dist/types/extension-registry.js +7 -0
- package/dist/types/extension-registry.js.map +1 -1
- package/dist/types/extension-registry.ts +7 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/list-row-action.d.ts +2 -0
- package/dist/types/list-row-action.d.ts.map +1 -1
- package/dist/types/list-row-action.js.map +1 -1
- package/dist/types/list-row-action.ts +3 -0
- package/dist/types/solid-core.d.ts +36 -0
- package/package.json +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import type { AgentAction, AgentConnection, AgentWireFrame } from "../types";
|
|
2
|
+
import { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from "./agentAuth";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* WebSocket client for the agent, connecting to the full `wsUrl` named at sign-in (agentAuth.ts).
|
|
6
|
+
*
|
|
7
|
+
* Held outside Redux because sockets are not serializable; the host wires its listeners to
|
|
8
|
+
* dispatch into agentSlice. Every outbound frame carries the `agentToken` from the agent login;
|
|
9
|
+
* there is no socket until the user has signed in with an API key, and signing out closes it. Unexpected closes
|
|
10
|
+
* reconnect with backoff (1s, 2s, 4s, then 15s) and re-send `resume_session`; frames sent
|
|
11
|
+
* while disconnected are queued and flushed once the session is re-established.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];
|
|
15
|
+
|
|
16
|
+
type EventListener = (frame: AgentWireFrame) => void;
|
|
17
|
+
type StatusListener = (status: AgentConnection) => void;
|
|
18
|
+
|
|
19
|
+
export class AgentSocket {
|
|
20
|
+
private ws: WebSocket | null = null;
|
|
21
|
+
private attempt = 0;
|
|
22
|
+
private timer: ReturnType<typeof setTimeout> | null = null;
|
|
23
|
+
private closedByUser = false;
|
|
24
|
+
private queue: AgentAction[] = [];
|
|
25
|
+
private eventListeners = new Set<EventListener>();
|
|
26
|
+
private statusListeners = new Set<StatusListener>();
|
|
27
|
+
private sessionId: string | null = null;
|
|
28
|
+
/** False until the agent confirms the session (session_started) on the current socket. */
|
|
29
|
+
private sessionReady = false;
|
|
30
|
+
private checkingProcessAvailability = false;
|
|
31
|
+
private unacknowledgedMessage: AgentAction | null = null;
|
|
32
|
+
|
|
33
|
+
private offAuthChange: () => void;
|
|
34
|
+
private readonly debugEmbed: boolean;
|
|
35
|
+
|
|
36
|
+
constructor(
|
|
37
|
+
private agentUrl: string,
|
|
38
|
+
private initialSessionId: string | null = null,
|
|
39
|
+
private checkProcessAvailability = false,
|
|
40
|
+
) {
|
|
41
|
+
this.sessionId = initialSessionId;
|
|
42
|
+
this.debugEmbed = !checkProcessAvailability;
|
|
43
|
+
if (this.debugEmbed) console.info("[agent-embed][runtime] socket created", { endpoint: this.safeEndpoint(), hasInitialSession: !!initialSessionId });
|
|
44
|
+
// Signing in opens the socket on the wsUrl it named; signing out (or the token expiring) closes it.
|
|
45
|
+
this.offAuthChange = onAgentAuthChange(agentUrl, () => {
|
|
46
|
+
if (this.closedByUser) return;
|
|
47
|
+
if (agentWsUrl(agentUrl)) this.connect();
|
|
48
|
+
else this.disconnect();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private openSession() {
|
|
53
|
+
void this.sendRaw(this.sessionId ? { action: "resume_session", session_id: this.sessionId } : { action: "start_session" });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
get currentSessionId() {
|
|
57
|
+
return this.sessionId;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
onEvent(listener: EventListener) {
|
|
61
|
+
this.eventListeners.add(listener);
|
|
62
|
+
return () => this.eventListeners.delete(listener);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
onStatus(listener: StatusListener) {
|
|
66
|
+
this.statusListeners.add(listener);
|
|
67
|
+
return () => this.statusListeners.delete(listener);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
connect() {
|
|
71
|
+
if (this.closedByUser) return;
|
|
72
|
+
const state = this.ws?.readyState;
|
|
73
|
+
if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;
|
|
74
|
+
this.closedByUser = false;
|
|
75
|
+
const url = agentWsUrl(this.agentUrl);
|
|
76
|
+
if (!url) {
|
|
77
|
+
if (this.debugEmbed) console.warn("[agent-embed][runtime] no WebSocket URL is available from auth yet");
|
|
78
|
+
// Not signed in: the auth listener connects once sign-in names the wsUrl.
|
|
79
|
+
this.setStatus("idle");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.setStatus(this.attempt === 0 ? "connecting" : "reconnecting");
|
|
83
|
+
if (this.debugEmbed) console.info("[agent-embed][runtime] opening WebSocket", { endpoint: this.safeEndpoint(url), attempt: this.attempt + 1 });
|
|
84
|
+
|
|
85
|
+
let ws: WebSocket;
|
|
86
|
+
try {
|
|
87
|
+
ws = new WebSocket(url);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (this.debugEmbed) console.error("[agent-embed][runtime] WebSocket construction failed", { name: error instanceof Error ? error.name : "unknown", message: error instanceof Error ? error.message : String(error) });
|
|
90
|
+
this.scheduleReconnect();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.ws = ws;
|
|
94
|
+
|
|
95
|
+
ws.onopen = () => {
|
|
96
|
+
if (this.ws !== ws) return;
|
|
97
|
+
if (this.debugEmbed) console.info("[agent-embed][runtime] WebSocket open");
|
|
98
|
+
this.attempt = 0;
|
|
99
|
+
this.sessionReady = false;
|
|
100
|
+
this.setStatus("open");
|
|
101
|
+
this.openSession();
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
ws.onmessage = (message) => {
|
|
105
|
+
if (this.ws !== ws) return;
|
|
106
|
+
let frame: AgentWireFrame;
|
|
107
|
+
try {
|
|
108
|
+
frame = JSON.parse(message.data);
|
|
109
|
+
} catch {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const eventType = frame.event_type ?? frame.type;
|
|
113
|
+
const payload = frame.event_data ?? frame.data;
|
|
114
|
+
if (this.debugEmbed) console.info("[agent-embed][runtime] WebSocket frame", { eventType, hasSessionId: !!(frame.session_id ?? payload?.session_id), isError: eventType === "error" });
|
|
115
|
+
if (eventType === "session_started") {
|
|
116
|
+
// After an agent restart the old session is gone and resume returns a new id.
|
|
117
|
+
this.sessionId = frame.session_id ?? payload?.session_id ?? null;
|
|
118
|
+
this.sessionReady = true;
|
|
119
|
+
this.flushQueue();
|
|
120
|
+
} else if (eventType === "error" && /agent token/i.test(String(payload?.error ?? ""))) {
|
|
121
|
+
// The agent forgot the token (idle 30 min or restarted): sign in again.
|
|
122
|
+
this.sessionReady = false;
|
|
123
|
+
if (this.unacknowledgedMessage) this.queue.push(this.unacknowledgedMessage);
|
|
124
|
+
this.unacknowledgedMessage = null;
|
|
125
|
+
clearAgentAuth(this.agentUrl);
|
|
126
|
+
} else if (eventType === "error" && !this.sessionReady) {
|
|
127
|
+
// Start/resume failed (e.g. auth); stop holding messages so their errors show.
|
|
128
|
+
this.sessionReady = true;
|
|
129
|
+
this.flushQueue();
|
|
130
|
+
}
|
|
131
|
+
if (eventType === "UserMessage" || eventType === "turn_complete" || eventType === "error") {
|
|
132
|
+
this.unacknowledgedMessage = null;
|
|
133
|
+
}
|
|
134
|
+
// Drop frames for a different session (e.g. a late event after a switch).
|
|
135
|
+
const frameSession = frame.session_id ?? payload?.session_id;
|
|
136
|
+
if (eventType !== "session_started" && frameSession && this.sessionId && frameSession !== this.sessionId) return;
|
|
137
|
+
this.eventListeners.forEach((listener) => listener(frame));
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
ws.onclose = (event) => {
|
|
141
|
+
if (this.ws !== ws) return;
|
|
142
|
+
if (this.debugEmbed) console.warn("[agent-embed][runtime] WebSocket closed", { code: event.code, reason: event.reason, clean: event.wasClean });
|
|
143
|
+
this.ws = null;
|
|
144
|
+
this.sessionReady = false;
|
|
145
|
+
if (this.closedByUser) {
|
|
146
|
+
this.setStatus("idle");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this.scheduleReconnect();
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
ws.onerror = () => {
|
|
153
|
+
if (this.debugEmbed) console.error("[agent-embed][runtime] WebSocket error event");
|
|
154
|
+
// onclose follows and handles the reconnect.
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Sends an action, or queues it until the socket and session are ready. */
|
|
159
|
+
send(action: AgentAction) {
|
|
160
|
+
if (this.closedByUser) return;
|
|
161
|
+
if (this.ws?.readyState === WebSocket.OPEN && this.sessionId && this.sessionReady) {
|
|
162
|
+
void this.sendRaw(action);
|
|
163
|
+
} else {
|
|
164
|
+
this.queue.push(action);
|
|
165
|
+
this.connect();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Starts a fresh conversation (drops the current session id). */
|
|
170
|
+
newSession() {
|
|
171
|
+
this.unacknowledgedMessage = null;
|
|
172
|
+
this.sessionId = null;
|
|
173
|
+
this.sessionReady = false;
|
|
174
|
+
this.queue = [];
|
|
175
|
+
if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: "start_session" });
|
|
176
|
+
else this.connect();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Switches to an existing conversation. */
|
|
180
|
+
resume(sessionId: string) {
|
|
181
|
+
this.sessionId = sessionId;
|
|
182
|
+
this.sessionReady = false;
|
|
183
|
+
if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: "resume_session", session_id: sessionId });
|
|
184
|
+
else this.connect();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Closes for good (the runtime is being disposed). */
|
|
188
|
+
close() {
|
|
189
|
+
this.offAuthChange();
|
|
190
|
+
this.closedByUser = true;
|
|
191
|
+
if (this.timer) clearTimeout(this.timer);
|
|
192
|
+
this.timer = null;
|
|
193
|
+
this.ws?.close();
|
|
194
|
+
this.ws = null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** Drops the socket after sign-out; the next sign-in reconnects. */
|
|
198
|
+
private disconnect() {
|
|
199
|
+
if (this.timer) clearTimeout(this.timer);
|
|
200
|
+
this.timer = null;
|
|
201
|
+
this.attempt = 0;
|
|
202
|
+
this.sessionReady = false;
|
|
203
|
+
if (this.ws) {
|
|
204
|
+
this.ws.onclose = null; // No reconnect.
|
|
205
|
+
this.ws.close();
|
|
206
|
+
this.ws = null;
|
|
207
|
+
}
|
|
208
|
+
this.setStatus("idle");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private flushQueue() {
|
|
212
|
+
const pending = this.queue;
|
|
213
|
+
this.queue = [];
|
|
214
|
+
pending.forEach((action) => {
|
|
215
|
+
// Queued messages were addressed before a session existed; point them at the current one.
|
|
216
|
+
const addressed = "session_id" in action && this.sessionId ? { ...action, session_id: this.sessionId } : action;
|
|
217
|
+
void this.sendRaw(addressed as AgentAction);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private async sendRaw(action: AgentAction) {
|
|
222
|
+
const agentToken = (await loadAgentAuth(this.agentUrl))?.agentToken;
|
|
223
|
+
if (!agentToken || this.ws?.readyState !== WebSocket.OPEN) {
|
|
224
|
+
if (this.debugEmbed) console.warn("[agent-embed][runtime] skipped outbound frame", { action: action.action, hasAgentToken: !!agentToken, socketOpen: this.ws?.readyState === WebSocket.OPEN });
|
|
225
|
+
if (action.action !== "start_session" && action.action !== "resume_session") this.queue.push(action);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (this.debugEmbed) console.info("[agent-embed][runtime] sending WebSocket action", { action: action.action });
|
|
229
|
+
this.ws.send(JSON.stringify({ ...action, agentToken }));
|
|
230
|
+
if (action.action === "message") this.unacknowledgedMessage = action;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private scheduleReconnect() {
|
|
234
|
+
if (this.timer) return;
|
|
235
|
+
const delay = BACKOFF_MS[Math.min(this.attempt, BACKOFF_MS.length - 1)];
|
|
236
|
+
this.attempt += 1;
|
|
237
|
+
this.setStatus(this.attempt > BACKOFF_MS.length ? "offline" : "reconnecting");
|
|
238
|
+
if (this.checkProcessAvailability && this.attempt >= 2 && this.attempt % 3 === 2) {
|
|
239
|
+
void this.checkAgentProcess(this.attempt);
|
|
240
|
+
}
|
|
241
|
+
this.timer = setTimeout(() => {
|
|
242
|
+
this.timer = null;
|
|
243
|
+
this.connect();
|
|
244
|
+
}, delay);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private async checkAgentProcess(failedAttempt: number) {
|
|
248
|
+
if (this.checkingProcessAvailability) return;
|
|
249
|
+
this.checkingProcessAvailability = true;
|
|
250
|
+
try {
|
|
251
|
+
const auth = await loadAgentAuth(this.agentUrl);
|
|
252
|
+
if (!auth || this.closedByUser || this.attempt !== failedAttempt) return;
|
|
253
|
+
if (!(await isAgentProcessAvailable(auth)) && !this.closedByUser && this.attempt === failedAttempt) {
|
|
254
|
+
// Repeated WebSocket failures plus a failed process health check mean the stored
|
|
255
|
+
// endpoint is stale. Returning to sign-in lets the manager issue a fresh wsUrl.
|
|
256
|
+
clearAgentAuth(this.agentUrl);
|
|
257
|
+
}
|
|
258
|
+
} finally {
|
|
259
|
+
this.checkingProcessAvailability = false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
private setStatus(status: AgentConnection) {
|
|
264
|
+
if (this.debugEmbed) console.info("[agent-embed][runtime] connection status", { status });
|
|
265
|
+
this.statusListeners.forEach((listener) => listener(status));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
private safeEndpoint(url = this.agentUrl) {
|
|
269
|
+
try {
|
|
270
|
+
const parsed = new URL(url);
|
|
271
|
+
return `${parsed.origin}${parsed.pathname}`;
|
|
272
|
+
} catch {
|
|
273
|
+
return "invalid-url";
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A chat's agent URL is the configured backend URL (used only to sign in), plus the agent it talks to
|
|
3
|
+
* when one is given (`<backend>?agentId=5`): required for the Agent Hub, optional for SolidX.
|
|
4
|
+
* Each agent URL has its own login.
|
|
5
|
+
*/
|
|
6
|
+
export declare function withAgentId(url: string, agentId?: number): string;
|
|
7
|
+
/** The agent id named by an agent URL, if any. */
|
|
8
|
+
export declare function agentIdOf(url: string): number | undefined;
|
|
9
|
+
/** `http(s)://host[:port]` of the sign-in backend, from a configured agent URL (http or ws, trailing slash ok). */
|
|
10
|
+
export declare function toHttpBase(url: string): string;
|
|
11
|
+
//# sourceMappingURL=agentUrls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentUrls.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentUrls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzD;AAED,mHAAmH;AACnH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A chat's agent URL is the configured backend URL (used only to sign in), plus the agent it talks to
|
|
3
|
+
* when one is given (`<backend>?agentId=5`): required for the Agent Hub, optional for SolidX.
|
|
4
|
+
* Each agent URL has its own login.
|
|
5
|
+
*/
|
|
6
|
+
export function withAgentId(url, agentId) {
|
|
7
|
+
return agentId === undefined ? url : "".concat(toHttpBase(url), "?agentId=").concat(agentId);
|
|
8
|
+
}
|
|
9
|
+
/** The agent id named by an agent URL, if any. */
|
|
10
|
+
export function agentIdOf(url) {
|
|
11
|
+
var match = url.match(/[?&]agentId=(\d+)/);
|
|
12
|
+
return match ? Number(match[1]) : undefined;
|
|
13
|
+
}
|
|
14
|
+
/** `http(s)://host[:port]` of the sign-in backend, from a configured agent URL (http or ws, trailing slash ok). */
|
|
15
|
+
export function toHttpBase(url) {
|
|
16
|
+
return url.trim().split("?")[0].replace(/\/$/, "").replace(/^ws(s?):\/\//i, "http$1://");
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=agentUrls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentUrls.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentUrls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,OAAgB;IACrD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAG,UAAU,CAAC,GAAG,CAAC,sBAAY,OAAO,CAAE,CAAC;AACjF,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS,CAAC,GAAW;IACjC,IAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,UAAU,CAAC,GAAW;IAClC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AAC7F,CAAC","sourcesContent":["/**\n * A chat's agent URL is the configured backend URL (used only to sign in), plus the agent it talks to\n * when one is given (`<backend>?agentId=5`): required for the Agent Hub, optional for SolidX.\n * Each agent URL has its own login.\n */\nexport function withAgentId(url: string, agentId?: number): string {\n return agentId === undefined ? url : `${toHttpBase(url)}?agentId=${agentId}`;\n}\n\n/** The agent id named by an agent URL, if any. */\nexport function agentIdOf(url: string): number | undefined {\n const match = url.match(/[?&]agentId=(\\d+)/);\n return match ? Number(match[1]) : undefined;\n}\n\n/** `http(s)://host[:port]` of the sign-in backend, from a configured agent URL (http or ws, trailing slash ok). */\nexport function toHttpBase(url: string): string {\n return url.trim().split(\"?\")[0].replace(/\\/$/, \"\").replace(/^ws(s?):\\/\\//i, \"http$1://\");\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A chat's agent URL is the configured backend URL (used only to sign in), plus the agent it talks to
|
|
3
|
+
* when one is given (`<backend>?agentId=5`): required for the Agent Hub, optional for SolidX.
|
|
4
|
+
* Each agent URL has its own login.
|
|
5
|
+
*/
|
|
6
|
+
export function withAgentId(url: string, agentId?: number): string {
|
|
7
|
+
return agentId === undefined ? url : `${toHttpBase(url)}?agentId=${agentId}`;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** The agent id named by an agent URL, if any. */
|
|
11
|
+
export function agentIdOf(url: string): number | undefined {
|
|
12
|
+
const match = url.match(/[?&]agentId=(\d+)/);
|
|
13
|
+
return match ? Number(match[1]) : undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** `http(s)://host[:port]` of the sign-in backend, from a configured agent URL (http or ws, trailing slash ok). */
|
|
17
|
+
export function toHttpBase(url: string): string {
|
|
18
|
+
return url.trim().split("?")[0].replace(/\/$/, "").replace(/^ws(s?):\/\//i, "http$1://");
|
|
19
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { AgentAttachment, AgentCommand } from "../types";
|
|
3
|
+
type Props = {
|
|
4
|
+
working: boolean;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
commands: AgentCommand[];
|
|
8
|
+
/** Text to place in the box (e.g. a prefilled prompt); changing `seedKey` re-applies it. */
|
|
9
|
+
seed?: string;
|
|
10
|
+
seedKey?: number;
|
|
11
|
+
onSend: (text: string, attachments: AgentAttachment[]) => void | Promise<void>;
|
|
12
|
+
onStop: () => void;
|
|
13
|
+
modelIndicator?: React.ReactNode;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Message box: Enter sends, Shift+Enter adds a line, "/" at the start lists the agent's commands.
|
|
17
|
+
* Files can be attached with the paperclip, dropped onto the box, or pasted.
|
|
18
|
+
*/
|
|
19
|
+
export declare function AgentComposer({ working, disabled, placeholder, commands, seed, seedKey, onSend, onStop, modelIndicator }: Props): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=AgentComposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentComposer.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/composer/AgentComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAGpE,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG9D,KAAK,KAAK,GAAG;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,KAAK,2CAyN/H"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
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;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
49
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
50
|
+
if (ar || !(i in from)) {
|
|
51
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
52
|
+
ar[i] = from[i];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
56
|
+
};
|
|
57
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
58
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
59
|
+
import { ArrowUp, FileText, Paperclip, Square, X } from "lucide-react";
|
|
60
|
+
import styles from "../SolidAgent.module.css";
|
|
61
|
+
import { AGENT_ATTACHMENT_ACCEPT, MAX_AGENT_ATTACHMENTS, formatFileSize, readAgentAttachments } from "../agentAttachments";
|
|
62
|
+
/**
|
|
63
|
+
* Message box: Enter sends, Shift+Enter adds a line, "/" at the start lists the agent's commands.
|
|
64
|
+
* Files can be attached with the paperclip, dropped onto the box, or pasted.
|
|
65
|
+
*/
|
|
66
|
+
export function AgentComposer(_a) {
|
|
67
|
+
var _this = this;
|
|
68
|
+
var working = _a.working, disabled = _a.disabled, placeholder = _a.placeholder, commands = _a.commands, seed = _a.seed, seedKey = _a.seedKey, onSend = _a.onSend, onStop = _a.onStop, modelIndicator = _a.modelIndicator;
|
|
69
|
+
var _b = useState(""), text = _b[0], setText = _b[1];
|
|
70
|
+
var _c = useState(0), active = _c[0], setActive = _c[1];
|
|
71
|
+
var _d = useState([]), attachments = _d[0], setAttachments = _d[1];
|
|
72
|
+
var _e = useState([]), attachErrors = _e[0], setAttachErrors = _e[1];
|
|
73
|
+
var _f = useState(false), dragging = _f[0], setDragging = _f[1];
|
|
74
|
+
var _g = useState(false), sending = _g[0], setSending = _g[1];
|
|
75
|
+
var ref = useRef(null);
|
|
76
|
+
var fileInputRef = useRef(null);
|
|
77
|
+
useEffect(function () {
|
|
78
|
+
if (seed == null)
|
|
79
|
+
return;
|
|
80
|
+
setText(seed);
|
|
81
|
+
requestAnimationFrame(function () {
|
|
82
|
+
var _a;
|
|
83
|
+
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
84
|
+
autosize();
|
|
85
|
+
});
|
|
86
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
87
|
+
}, [seedKey]);
|
|
88
|
+
useEffect(function () {
|
|
89
|
+
var _a;
|
|
90
|
+
if (!disabled)
|
|
91
|
+
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
92
|
+
}, [disabled]);
|
|
93
|
+
var slashQuery = text.startsWith("/") && !text.includes(" ") ? text.slice(1).toLowerCase() : null;
|
|
94
|
+
var matches = useMemo(function () { return (slashQuery == null ? [] : commands.filter(function (cmd) { return cmd.name.replace(/^\//, "").toLowerCase().startsWith(slashQuery); })); }, [commands, slashQuery]);
|
|
95
|
+
function autosize() {
|
|
96
|
+
var el = ref.current;
|
|
97
|
+
if (!el)
|
|
98
|
+
return;
|
|
99
|
+
el.style.height = "auto";
|
|
100
|
+
el.style.height = "".concat(Math.min(el.scrollHeight, 200), "px");
|
|
101
|
+
}
|
|
102
|
+
var addFiles = function (files) { return __awaiter(_this, void 0, void 0, function () {
|
|
103
|
+
var _a, added, errors;
|
|
104
|
+
return __generator(this, function (_b) {
|
|
105
|
+
switch (_b.label) {
|
|
106
|
+
case 0:
|
|
107
|
+
if (!files.length || disabled || sending)
|
|
108
|
+
return [2 /*return*/];
|
|
109
|
+
return [4 /*yield*/, readAgentAttachments(files, attachments)];
|
|
110
|
+
case 1:
|
|
111
|
+
_a = _b.sent(), added = _a.added, errors = _a.errors;
|
|
112
|
+
if (added.length)
|
|
113
|
+
setAttachments(function (prev) { return __spreadArray(__spreadArray([], prev, true), added, true); });
|
|
114
|
+
setAttachErrors(errors);
|
|
115
|
+
return [2 /*return*/];
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}); };
|
|
119
|
+
var removeAttachment = function (index) {
|
|
120
|
+
setAttachments(function (prev) { return prev.filter(function (_, i) { return i !== index; }); });
|
|
121
|
+
setAttachErrors([]);
|
|
122
|
+
};
|
|
123
|
+
var canSend = (!!text.trim() || attachments.length > 0) && !working && !disabled && !sending;
|
|
124
|
+
var submit = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
125
|
+
var error_1;
|
|
126
|
+
return __generator(this, function (_a) {
|
|
127
|
+
switch (_a.label) {
|
|
128
|
+
case 0:
|
|
129
|
+
if (!canSend)
|
|
130
|
+
return [2 /*return*/];
|
|
131
|
+
setSending(true);
|
|
132
|
+
setAttachErrors([]);
|
|
133
|
+
_a.label = 1;
|
|
134
|
+
case 1:
|
|
135
|
+
_a.trys.push([1, 3, 4, 5]);
|
|
136
|
+
return [4 /*yield*/, onSend(text.trim(), attachments)];
|
|
137
|
+
case 2:
|
|
138
|
+
_a.sent();
|
|
139
|
+
setText("");
|
|
140
|
+
setAttachments([]);
|
|
141
|
+
requestAnimationFrame(autosize);
|
|
142
|
+
return [3 /*break*/, 5];
|
|
143
|
+
case 3:
|
|
144
|
+
error_1 = _a.sent();
|
|
145
|
+
setAttachErrors([error_1 instanceof Error ? error_1.message : "The message could not be sent."]);
|
|
146
|
+
return [3 /*break*/, 5];
|
|
147
|
+
case 4:
|
|
148
|
+
setSending(false);
|
|
149
|
+
return [7 /*endfinally*/];
|
|
150
|
+
case 5: return [2 /*return*/];
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}); };
|
|
154
|
+
var pickCommand = function (cmd) {
|
|
155
|
+
var _a;
|
|
156
|
+
setText("/".concat(cmd.name.replace(/^\//, ""), " "));
|
|
157
|
+
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
158
|
+
};
|
|
159
|
+
var onKeyDown = function (event) {
|
|
160
|
+
if (matches.length) {
|
|
161
|
+
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
162
|
+
event.preventDefault();
|
|
163
|
+
setActive(function (i) { return (i + (event.key === "ArrowDown" ? 1 : -1) + matches.length) % matches.length; });
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (event.key === "Tab" || (event.key === "Enter" && !event.shiftKey)) {
|
|
167
|
+
event.preventDefault();
|
|
168
|
+
pickCommand(matches[Math.min(active, matches.length - 1)]);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (event.key === "Enter" && !event.shiftKey) {
|
|
173
|
+
event.preventDefault();
|
|
174
|
+
submit();
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
var onPaste = function (event) {
|
|
178
|
+
var _a, _b;
|
|
179
|
+
var files = Array.from((_b = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
|
|
180
|
+
if (files.length) {
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
void addFiles(files);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
var dropHandlers = {
|
|
186
|
+
onDragOver: function (event) {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
if (disabled || sending || !((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) === null || _b === void 0 ? void 0 : _b.includes("Files")))
|
|
189
|
+
return;
|
|
190
|
+
event.preventDefault();
|
|
191
|
+
setDragging(true);
|
|
192
|
+
},
|
|
193
|
+
onDragLeave: function (event) {
|
|
194
|
+
if (!event.currentTarget.contains(event.relatedTarget))
|
|
195
|
+
setDragging(false);
|
|
196
|
+
},
|
|
197
|
+
onDrop: function (event) {
|
|
198
|
+
var _a, _b;
|
|
199
|
+
if (disabled || sending)
|
|
200
|
+
return;
|
|
201
|
+
event.preventDefault();
|
|
202
|
+
setDragging(false);
|
|
203
|
+
void addFiles(Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []));
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
return (_jsxs("div", __assign({ className: "".concat(styles.composer, " ").concat(dragging ? styles.composerDragging : "") }, dropHandlers, { children: [matches.length > 0 && (_jsx("div", { className: styles.popover, role: "listbox", "aria-label": "Commands", children: matches.map(function (cmd, i) { return (_jsxs("button", { type: "button", role: "option", "aria-selected": i === active, className: "".concat(styles.popoverItem, " ").concat(i === active ? styles.popoverItemActive : ""), onMouseDown: function (event) {
|
|
207
|
+
event.preventDefault();
|
|
208
|
+
pickCommand(cmd);
|
|
209
|
+
}, children: [_jsxs("span", { className: styles.popoverCmd, children: ["/", cmd.name.replace(/^\//, "")] }), cmd.description && _jsx("span", { className: styles.popoverDesc, children: cmd.description })] }, cmd.name)); }) })), attachments.length > 0 && (_jsx("ul", { className: styles.attachmentTray, "aria-label": "Attached files", children: attachments.map(function (item, index) { return (_jsxs("li", { className: styles.attachmentChip, children: [item.meta.previewUrl ? (_jsx("img", { className: styles.attachmentThumb, src: item.meta.previewUrl, alt: "" })) : (_jsx("span", { className: styles.attachmentIcon, children: _jsx(FileText, { size: 14 }) })), _jsxs("span", { className: styles.attachmentText, children: [_jsx("span", { className: styles.attachmentName, title: item.meta.name, children: item.meta.name }), _jsx("span", { className: styles.attachmentSize, children: formatFileSize(item.meta.size) })] }), _jsx("button", { type: "button", className: styles.attachmentRemove, "aria-label": "Remove ".concat(item.meta.name), onClick: function () { return removeAttachment(index); }, children: _jsx(X, { size: 12 }) })] }, "".concat(item.meta.name, "-").concat(index))); }) })), attachErrors.length > 0 && (_jsx("div", { className: styles.attachmentErrors, role: "alert", children: attachErrors.map(function (error) { return _jsx("div", { children: error }, error); }) })), _jsx("textarea", { ref: ref, className: styles.textarea, rows: 1, value: text, disabled: disabled || sending, "aria-label": "Message the SolidX Agent", placeholder: dragging ? "Drop files to attach" : placeholder !== null && placeholder !== void 0 ? placeholder : "Ask the agent…", onChange: function (event) {
|
|
210
|
+
setText(event.target.value);
|
|
211
|
+
setActive(0);
|
|
212
|
+
autosize();
|
|
213
|
+
}, onKeyDown: onKeyDown, onPaste: onPaste }), _jsxs("div", { className: styles.composerRow, children: [_jsx("input", { ref: fileInputRef, type: "file", multiple: true, accept: AGENT_ATTACHMENT_ACCEPT, hidden: true, onChange: function (event) {
|
|
214
|
+
var _a;
|
|
215
|
+
void addFiles(Array.from((_a = event.target.files) !== null && _a !== void 0 ? _a : []));
|
|
216
|
+
event.target.value = "";
|
|
217
|
+
} }), _jsx("button", { type: "button", className: styles.iconBtn, "aria-label": "Attach files", title: "Attach files (up to ".concat(MAX_AGENT_ATTACHMENTS, ": images or text files)"), disabled: disabled || sending || attachments.length >= MAX_AGENT_ATTACHMENTS, onClick: function () { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: _jsx(Paperclip, { size: 16 }) }), modelIndicator, working ? (_jsxs("button", { type: "button", className: styles.stopBtn, onClick: onStop, "aria-label": "Stop the agent", children: [_jsx(Square, { size: 10, fill: "currentColor" }), " Stop"] })) : (_jsx("button", { type: "button", className: styles.sendBtn, onClick: submit, disabled: !canSend, "aria-label": "Send", children: _jsx(ArrowUp, { size: 16 }) }))] })] })));
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=AgentComposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentComposer.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/composer/AgentComposer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { ArrowUp, FileText, Paperclip, Square, X } from \"lucide-react\";\nimport styles from \"../SolidAgent.module.css\";\nimport type { AgentAttachment, AgentCommand } from \"../types\";\nimport { AGENT_ATTACHMENT_ACCEPT, MAX_AGENT_ATTACHMENTS, formatFileSize, readAgentAttachments } from \"../agentAttachments\";\n\ntype Props = {\n working: boolean;\n disabled: boolean;\n placeholder?: string;\n commands: AgentCommand[];\n /** Text to place in the box (e.g. a prefilled prompt); changing `seedKey` re-applies it. */\n seed?: string;\n seedKey?: number;\n onSend: (text: string, attachments: AgentAttachment[]) => void | Promise<void>;\n onStop: () => void;\n modelIndicator?: React.ReactNode;\n};\n\n/**\n * Message box: Enter sends, Shift+Enter adds a line, \"/\" at the start lists the agent's commands.\n * Files can be attached with the paperclip, dropped onto the box, or pasted.\n */\nexport function AgentComposer({ working, disabled, placeholder, commands, seed, seedKey, onSend, onStop, modelIndicator }: Props) {\n const [text, setText] = useState(\"\");\n const [active, setActive] = useState(0);\n const [attachments, setAttachments] = useState<AgentAttachment[]>([]);\n const [attachErrors, setAttachErrors] = useState<string[]>([]);\n const [dragging, setDragging] = useState(false);\n const [sending, setSending] = useState(false);\n const ref = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (seed == null) return;\n setText(seed);\n requestAnimationFrame(() => {\n ref.current?.focus();\n autosize();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [seedKey]);\n\n useEffect(() => {\n if (!disabled) ref.current?.focus();\n }, [disabled]);\n\n const slashQuery = text.startsWith(\"/\") && !text.includes(\" \") ? text.slice(1).toLowerCase() : null;\n const matches = useMemo(\n () => (slashQuery == null ? [] : commands.filter((cmd) => cmd.name.replace(/^\\//, \"\").toLowerCase().startsWith(slashQuery))),\n [commands, slashQuery],\n );\n\n function autosize() {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, 200)}px`;\n }\n\n const addFiles = async (files: File[]) => {\n if (!files.length || disabled || sending) return;\n const { added, errors } = await readAgentAttachments(files, attachments);\n if (added.length) setAttachments((prev) => [...prev, ...added]);\n setAttachErrors(errors);\n };\n\n const removeAttachment = (index: number) => {\n setAttachments((prev) => prev.filter((_, i) => i !== index));\n setAttachErrors([]);\n };\n\n const canSend = (!!text.trim() || attachments.length > 0) && !working && !disabled && !sending;\n\n const submit = async () => {\n if (!canSend) return;\n setSending(true);\n setAttachErrors([]);\n try {\n await onSend(text.trim(), attachments);\n setText(\"\");\n setAttachments([]);\n requestAnimationFrame(autosize);\n } catch (error) {\n setAttachErrors([error instanceof Error ? error.message : \"The message could not be sent.\"]);\n } finally {\n setSending(false);\n }\n };\n\n const pickCommand = (cmd: AgentCommand) => {\n setText(`/${cmd.name.replace(/^\\//, \"\")} `);\n ref.current?.focus();\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (matches.length) {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setActive((i) => (i + (event.key === \"ArrowDown\" ? 1 : -1) + matches.length) % matches.length);\n return;\n }\n if (event.key === \"Tab\" || (event.key === \"Enter\" && !event.shiftKey)) {\n event.preventDefault();\n pickCommand(matches[Math.min(active, matches.length - 1)]);\n return;\n }\n }\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n };\n\n const onPaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const files = Array.from(event.clipboardData?.files ?? []);\n if (files.length) {\n event.preventDefault();\n void addFiles(files);\n }\n };\n\n const dropHandlers = {\n onDragOver: (event: React.DragEvent) => {\n if (disabled || sending || !event.dataTransfer?.types?.includes(\"Files\")) return;\n event.preventDefault();\n setDragging(true);\n },\n onDragLeave: (event: React.DragEvent) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) setDragging(false);\n },\n onDrop: (event: React.DragEvent) => {\n if (disabled || sending) return;\n event.preventDefault();\n setDragging(false);\n void addFiles(Array.from(event.dataTransfer?.files ?? []));\n },\n };\n\n return (\n <div className={`${styles.composer} ${dragging ? styles.composerDragging : \"\"}`} {...dropHandlers}>\n {matches.length > 0 && (\n <div className={styles.popover} role=\"listbox\" aria-label=\"Commands\">\n {matches.map((cmd, i) => (\n <button\n key={cmd.name}\n type=\"button\"\n role=\"option\"\n aria-selected={i === active}\n className={`${styles.popoverItem} ${i === active ? styles.popoverItemActive : \"\"}`}\n onMouseDown={(event) => {\n event.preventDefault();\n pickCommand(cmd);\n }}\n >\n <span className={styles.popoverCmd}>/{cmd.name.replace(/^\\//, \"\")}</span>\n {cmd.description && <span className={styles.popoverDesc}>{cmd.description}</span>}\n </button>\n ))}\n </div>\n )}\n\n {attachments.length > 0 && (\n <ul className={styles.attachmentTray} aria-label=\"Attached files\">\n {attachments.map((item, index) => (\n <li key={`${item.meta.name}-${index}`} className={styles.attachmentChip}>\n {item.meta.previewUrl ? (\n <img className={styles.attachmentThumb} src={item.meta.previewUrl} alt=\"\" />\n ) : (\n <span className={styles.attachmentIcon}><FileText size={14} /></span>\n )}\n <span className={styles.attachmentText}>\n <span className={styles.attachmentName} title={item.meta.name}>{item.meta.name}</span>\n <span className={styles.attachmentSize}>{formatFileSize(item.meta.size)}</span>\n </span>\n <button type=\"button\" className={styles.attachmentRemove} aria-label={`Remove ${item.meta.name}`} onClick={() => removeAttachment(index)}>\n <X size={12} />\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {attachErrors.length > 0 && (\n <div className={styles.attachmentErrors} role=\"alert\">\n {attachErrors.map((error) => <div key={error}>{error}</div>)}\n </div>\n )}\n\n <textarea\n ref={ref}\n className={styles.textarea}\n rows={1}\n value={text}\n disabled={disabled || sending}\n aria-label=\"Message the SolidX Agent\"\n placeholder={dragging ? \"Drop files to attach\" : placeholder ?? \"Ask the agent…\"}\n onChange={(event) => {\n setText(event.target.value);\n setActive(0);\n autosize();\n }}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n />\n <div className={styles.composerRow}>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={AGENT_ATTACHMENT_ACCEPT}\n hidden\n onChange={(event) => {\n void addFiles(Array.from(event.target.files ?? []));\n event.target.value = \"\";\n }}\n />\n <button\n type=\"button\"\n className={styles.iconBtn}\n aria-label=\"Attach files\"\n title={`Attach files (up to ${MAX_AGENT_ATTACHMENTS}: images or text files)`}\n disabled={disabled || sending || attachments.length >= MAX_AGENT_ATTACHMENTS}\n onClick={() => fileInputRef.current?.click()}\n >\n <Paperclip size={16} />\n </button>\n {modelIndicator}\n {working ? (\n <button type=\"button\" className={styles.stopBtn} onClick={onStop} aria-label=\"Stop the agent\">\n <Square size={10} fill=\"currentColor\" /> Stop\n </button>\n ) : (\n <button type=\"button\" className={styles.sendBtn} onClick={submit} disabled={!canSend} aria-label=\"Send\">\n <ArrowUp size={16} />\n </button>\n )}\n </div>\n </div>\n );\n}\n"]}
|