@dxos/plugin-assistant 0.9.1-staging.ee54ba693a → 0.11.0
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/PLUGIN.mdl +3 -28
- package/dist/lib/AssistantPlugin.mjs +2 -0
- package/dist/lib/AssistantPlugin.node.mjs +55 -0
- package/dist/lib/AssistantPlugin.node.mjs.map +1 -0
- package/dist/lib/AssistantPlugin.workerd.mjs +43 -0
- package/dist/lib/AssistantPlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +24 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-AgentArticle.mjs +52 -0
- package/dist/lib/chunk-AgentArticle.mjs.map +1 -0
- package/dist/lib/chunk-AgentProperties.mjs +35 -0
- package/dist/lib/chunk-AgentProperties.mjs.map +1 -0
- package/dist/lib/chunk-AssistantPlugin.mjs +88 -0
- package/dist/lib/chunk-AssistantPlugin.mjs.map +1 -0
- package/dist/lib/chunk-AssistantSettings.mjs +285 -0
- package/dist/lib/chunk-AssistantSettings.mjs.map +1 -0
- package/dist/lib/chunk-ChatArticle.mjs +121 -0
- package/dist/lib/chunk-ChatArticle.mjs.map +1 -0
- package/dist/lib/chunk-ChatCompanion.mjs +116 -0
- package/dist/lib/chunk-ChatCompanion.mjs.map +1 -0
- package/dist/lib/chunk-ChatDialog.mjs +73 -0
- package/dist/lib/chunk-ChatDialog.mjs.map +1 -0
- package/dist/lib/chunk-IntegrationPrompt.mjs +73 -0
- package/dist/lib/chunk-IntegrationPrompt.mjs.map +1 -0
- package/dist/lib/chunk-SpaceHomePrompt.mjs +104 -0
- package/dist/lib/chunk-SpaceHomePrompt.mjs.map +1 -0
- package/dist/lib/chunk-SpaceHomeSuggestions.mjs +60 -0
- package/dist/lib/chunk-SpaceHomeSuggestions.mjs.map +1 -0
- package/dist/lib/chunk-TracePanel.mjs +127 -0
- package/dist/lib/chunk-TracePanel.mjs.map +1 -0
- package/dist/lib/chunk-TracePanel2.mjs +7 -0
- package/dist/lib/chunk-TracePanel2.mjs.map +1 -0
- package/dist/lib/chunk-TriggerStatus.mjs +72 -0
- package/dist/lib/chunk-TriggerStatus.mjs.map +1 -0
- package/dist/lib/chunk-agent-hydrator.mjs +22 -0
- package/dist/lib/chunk-agent-hydrator.mjs.map +1 -0
- package/dist/lib/chunk-agent-service.mjs +21 -0
- package/dist/lib/chunk-agent-service.mjs.map +1 -0
- package/dist/lib/{neutral/ai-context-LIKJYMIN.mjs → chunk-ai-context.mjs} +8 -12
- package/dist/lib/chunk-ai-context.mjs.map +1 -0
- package/dist/lib/chunk-ai-service.mjs +27 -0
- package/dist/lib/chunk-ai-service.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +179 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-automation-templates.mjs +99 -0
- package/dist/lib/chunk-automation-templates.mjs.map +1 -0
- package/dist/lib/chunk-companion-chat-provisioner.mjs +123 -0
- package/dist/lib/chunk-companion-chat-provisioner.mjs.map +1 -0
- package/dist/lib/chunk-connector.mjs +60 -0
- package/dist/lib/chunk-connector.mjs.map +1 -0
- package/dist/lib/chunk-constants.mjs +9 -0
- package/dist/lib/chunk-constants.mjs.map +1 -0
- package/dist/lib/chunk-context.mjs +7 -0
- package/dist/lib/chunk-context.mjs.map +1 -0
- package/dist/lib/chunk-create-chat.mjs +53 -0
- package/dist/lib/chunk-create-chat.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +70 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-edge-model-resolver.mjs +64 -0
- package/dist/lib/chunk-edge-model-resolver.mjs.map +1 -0
- package/dist/lib/chunk-ensure-companion-chat.mjs +49 -0
- package/dist/lib/chunk-ensure-companion-chat.mjs.map +1 -0
- package/dist/lib/chunk-extensions.mjs +78 -0
- package/dist/lib/chunk-extensions.mjs.map +1 -0
- package/dist/lib/chunk-fork-chat.mjs +83 -0
- package/dist/lib/chunk-fork-chat.mjs.map +1 -0
- package/dist/lib/chunk-generate-home-suggestions.mjs +71 -0
- package/dist/lib/chunk-generate-home-suggestions.mjs.map +1 -0
- package/dist/lib/chunk-local-model-resolver.mjs +25 -0
- package/dist/lib/chunk-local-model-resolver.mjs.map +1 -0
- package/dist/lib/chunk-markdown-extension.mjs +27 -0
- package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-L7AR4VTA.mjs → chunk-meta.mjs} +20 -25
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +13 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-paths.mjs +8 -0
- package/dist/lib/chunk-paths.mjs.map +1 -0
- package/dist/lib/chunk-processor.mjs +432 -0
- package/dist/lib/chunk-processor.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +177 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-run-prompt-in-new-chat.mjs +96 -0
- package/dist/lib/chunk-run-prompt-in-new-chat.mjs.map +1 -0
- package/dist/lib/chunk-set-current-chat.mjs +43 -0
- package/dist/lib/chunk-set-current-chat.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-skill-definition.mjs +42 -0
- package/dist/lib/chunk-skill-definition.mjs.map +1 -0
- package/dist/lib/chunk-skills.mjs +19 -0
- package/dist/lib/chunk-skills.mjs.map +1 -0
- package/dist/lib/chunk-state.mjs +32 -0
- package/dist/lib/chunk-state.mjs.map +1 -0
- package/dist/lib/chunk-toggle-trace-panel-debug.mjs +18 -0
- package/dist/lib/chunk-toggle-trace-panel-debug.mjs.map +1 -0
- package/dist/lib/chunk-toolkit.mjs +12 -0
- package/dist/lib/chunk-toolkit.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +332 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-update-chat-name.mjs +63 -0
- package/dist/lib/chunk-update-chat-name.mjs.map +1 -0
- package/dist/lib/components.mjs +2616 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +17 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/execution-graph.mjs +961 -0
- package/dist/lib/execution-graph.mjs.map +1 -0
- package/dist/lib/extensions.mjs +2 -0
- package/dist/lib/hooks.mjs +674 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +5 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +7 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/plugin.workerd.mjs +2 -0
- package/dist/lib/skills.mjs +2 -0
- package/dist/lib/testing.mjs +2 -0
- package/dist/lib/translations.mjs +207 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
- package/dist/types/src/AssistantPlugin.node.d.ts.map +1 -1
- package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/AssistantSurfaces.d.ts +22 -0
- package/dist/types/src/capabilities/AssistantSurfaces.d.ts.map +1 -0
- package/dist/types/src/capabilities/agent-hydrator.d.ts +1 -1
- package/dist/types/src/capabilities/agent-service.d.ts +1 -1
- package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
- package/dist/types/src/capabilities/ai-context.d.ts +1 -1
- package/dist/types/src/capabilities/ai-service.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +12 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/automation-templates.d.ts +1 -1
- package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +1 -1
- package/dist/types/src/capabilities/connector.d.ts +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/edge-model-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +0 -2
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/local-model-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/standalone-chats-query.test.d.ts +2 -0
- package/dist/types/src/capabilities/standalone-chats-query.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/state.d.ts +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +1 -1
- package/dist/types/src/components/AgentProperties/AgentProperties.d.ts +4 -1
- package/dist/types/src/components/AgentProperties/AgentProperties.d.ts.map +1 -1
- package/dist/types/src/components/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +21 -8
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/src/components/Chat/{Chat.stories.d.ts → Error.stories.d.ts} +1 -1
- package/dist/types/src/components/Chat/Error.stories.d.ts.map +1 -0
- package/dist/types/src/components/Chat/context.d.ts +8 -0
- package/dist/types/src/components/Chat/context.d.ts.map +1 -1
- package/dist/types/src/components/Chat/events.d.ts +5 -0
- package/dist/types/src/components/Chat/events.d.ts.map +1 -1
- package/dist/types/src/components/Chat/thread.d.ts +42 -0
- package/dist/types/src/components/Chat/thread.d.ts.map +1 -0
- package/dist/types/src/components/Chat/thread.test.d.ts +2 -0
- package/dist/types/src/components/Chat/thread.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +5 -3
- package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/index.d.ts +0 -1
- package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/Anchor.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/ChatThread.d.ts +8 -3
- package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +30 -2
- package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/index.d.ts +1 -0
- package/dist/types/src/components/ChatThread/index.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/sync/index.d.ts +3 -0
- package/dist/types/src/components/ChatThread/sync/index.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/{sync.d.ts → sync/sync.d.ts} +46 -2
- package/dist/types/src/components/ChatThread/sync/sync.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/sync/sync.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/sync/tool-widget-state.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/sync/tool-widget-state.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts +15 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts +21 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts +2 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts +1 -2
- package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/defaults.d.ts +6 -0
- package/dist/types/src/components/ChatThread/widgets/defaults.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/format-time.d.ts +2 -0
- package/dist/types/src/components/ChatThread/widgets/format-time.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/index.d.ts +4 -1
- package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts +3 -0
- package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts.map +1 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts +16 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts.map +1 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts +210 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/ConnectorAuthMenu/index.d.ts +2 -0
- package/dist/types/src/components/ConnectorAuthMenu/index.d.ts.map +1 -0
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.d.ts +9 -11
- package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -4
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
- package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +1 -2
- package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
- package/dist/types/src/components/ToolBlock/index.d.ts +1 -0
- package/dist/types/src/components/ToolBlock/index.d.ts.map +1 -1
- package/dist/types/src/components/ToolBlock/is-tool-message.d.ts +3 -0
- package/dist/types/src/components/ToolBlock/is-tool-message.d.ts.map +1 -0
- package/dist/types/src/components/Toolbox/Toolbox.d.ts +1 -1
- package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts +5 -2
- package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts.map +1 -1
- package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts +4 -1
- package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts.map +1 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts +4 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts.map +1 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts +4 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts +4 -6
- package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts +22 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
- package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts +4 -1
- package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
- package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts +4 -7
- package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +4 -9
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +5 -7
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -1
- package/dist/types/src/containers/TracePanel/TracePanel.d.ts +1 -1
- package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
- package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
- package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts +15 -1
- package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +0 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/execution-graph.d.ts +12 -1
- package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
- package/dist/types/src/execution-graph/index.d.ts +1 -1
- package/dist/types/src/execution-graph/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -1
- package/dist/types/src/execution-graph/span-tree.d.ts +17 -0
- package/dist/types/src/execution-graph/span-tree.d.ts.map +1 -1
- package/dist/types/src/feed-logger.d.ts +1 -1
- package/dist/types/src/feed-logger.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
- package/dist/types/src/hooks/useContextObjects.d.ts +1 -1
- package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
- package/dist/types/src/hooks/useSelectionContext.d.ts +13 -0
- package/dist/types/src/hooks/useSelectionContext.d.ts.map +1 -0
- package/dist/types/src/hooks/useSelectionContext.test.d.ts +2 -0
- package/dist/types/src/hooks/useSelectionContext.test.d.ts.map +1 -0
- package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/processor/index.d.ts +1 -0
- package/dist/types/src/processor/index.d.ts.map +1 -1
- package/dist/types/src/processor/processor.d.ts +5 -2
- package/dist/types/src/processor/processor.d.ts.map +1 -1
- package/dist/types/src/processor/prompt.d.ts +18 -0
- package/dist/types/src/processor/prompt.d.ts.map +1 -0
- package/dist/types/src/processor/prompt.test.d.ts +2 -0
- package/dist/types/src/processor/prompt.test.d.ts.map +1 -0
- package/dist/types/src/processor/streaming.node.test.d.ts +2 -0
- package/dist/types/src/processor/streaming.node.test.d.ts.map +1 -0
- package/dist/types/src/skills/assistant/skill.d.ts.map +1 -1
- package/dist/types/src/templates/scaffold.d.ts +1 -1
- package/dist/types/src/templates/scaffold.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/AssistantOperation.d.ts +2 -13
- package/dist/types/src/types/AssistantOperation.d.ts.map +1 -1
- package/dist/types/src/types/ChatSurface.d.ts +2 -2
- package/dist/types/src/types/ChatSurface.d.ts.map +1 -1
- package/dist/types/src/types/Ollama.d.ts +1 -1
- package/dist/types/src/types/Ollama.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +1 -0
- package/package.json +106 -105
- package/src/AssistantPlugin.node.ts +1 -2
- package/src/AssistantPlugin.test.ts +60 -62
- package/src/AssistantPlugin.ts +1 -10
- package/src/AssistantPlugin.workerd.ts +1 -2
- package/src/capabilities/AssistantSurfaces.tsx +86 -0
- package/src/capabilities/agent-service.ts +1 -1
- package/src/capabilities/app-graph-builder.ts +31 -17
- package/src/capabilities/companion-chat-provisioner.ts +12 -11
- package/src/capabilities/connector.ts +3 -3
- package/src/capabilities/edge-model-resolver.ts +5 -2
- package/src/capabilities/index.ts +0 -2
- package/src/capabilities/react-surface.ts +135 -0
- package/src/capabilities/skill-definition.ts +4 -0
- package/src/capabilities/standalone-chats-query.test.ts +51 -0
- package/src/capabilities/state.ts +1 -1
- package/src/components/AgentProperties/AgentProperties.stories.tsx +6 -7
- package/src/components/AgentProperties/AgentProperties.tsx +37 -30
- package/src/components/Chat/Chat.tsx +275 -59
- package/src/components/Chat/{Chat.stories.tsx → Error.stories.tsx} +1 -1
- package/src/components/Chat/context.ts +8 -0
- package/src/components/Chat/events.ts +5 -0
- package/src/components/Chat/thread.test.ts +127 -0
- package/src/components/Chat/thread.ts +87 -0
- package/src/components/ChatPrompt/ChatActions.tsx +8 -8
- package/src/components/ChatPrompt/ChatMcpErrors.tsx +2 -2
- package/src/components/ChatPrompt/ChatOptions.stories.tsx +2 -1
- package/src/components/ChatPrompt/ChatOptions.tsx +5 -5
- package/src/components/ChatPrompt/ChatPrompt.tsx +33 -6
- package/src/components/ChatPrompt/index.ts +0 -1
- package/src/components/ChatThread/Anchor.stories.tsx +2 -1
- package/src/components/ChatThread/ChatThread.stories.tsx +99 -4
- package/src/components/ChatThread/ChatThread.tsx +34 -6
- package/src/components/ChatThread/Link.tsx +1 -0
- package/src/components/ChatThread/index.ts +2 -0
- package/src/components/ChatThread/registry.tsx +28 -4
- package/src/components/ChatThread/sync/index.ts +6 -0
- package/src/components/ChatThread/{sync.test.ts → sync/sync.test.ts} +167 -7
- package/src/components/ChatThread/{sync.ts → sync/sync.ts} +97 -3
- package/src/components/ChatThread/{tool-widget-state.ts → sync/tool-widget-state.ts} +1 -3
- package/src/components/ChatThread/widgets/BranchWidget.stories.tsx +83 -0
- package/src/components/ChatThread/widgets/BranchWidget.test.ts +55 -0
- package/src/components/ChatThread/widgets/BranchWidget.tsx +61 -0
- package/src/components/ChatThread/widgets/FallbackWidget.tsx +2 -2
- package/src/components/ChatThread/widgets/ReasoningWidget.ts +1 -1
- package/src/components/ChatThread/widgets/ReferenceWidget.ts +1 -6
- package/src/components/ChatThread/widgets/SuggestionWidget.ts +12 -3
- package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
- package/src/components/ChatThread/widgets/ToolWidget.tsx +15 -9
- package/src/components/ChatThread/widgets/defaults.ts +7 -1
- package/src/components/ChatThread/widgets/format-time.ts +45 -0
- package/src/components/ChatThread/widgets/index.ts +4 -1
- package/src/components/ChatThread/widgets/is-tool-message.ts +13 -0
- package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.tsx +177 -0
- package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx +82 -0
- package/src/components/ConnectorAuthMenu/index.ts +5 -0
- package/src/components/ProcessTree/ProcessTree.stories.tsx +1 -1
- package/src/components/TaskList/TaskList.stories.tsx +19 -26
- package/src/components/TaskList/TaskList.tsx +32 -104
- package/src/components/ToolBlock/ToolBlock.tsx +1 -5
- package/src/components/ToolBlock/index.ts +1 -0
- package/src/components/ToolBlock/is-tool-message.ts +13 -0
- package/src/components/Toolbox/Toolbox.tsx +1 -1
- package/src/components/index.ts +1 -0
- package/src/containers/AgentArticle/AgentArticle.stories.tsx +18 -11
- package/src/containers/AgentArticle/AgentArticle.tsx +27 -151
- package/src/containers/AgentProperties/AgentProperties.tsx +21 -17
- package/src/containers/AssistantSettings/AssistantSettings.tsx +2 -0
- package/src/containers/AssistantSettings/OllamaModels.tsx +6 -4
- package/src/containers/ChatArticle/ChatArticle.stories.tsx +200 -27
- package/src/containers/ChatArticle/ChatArticle.tsx +25 -5
- package/src/containers/ChatCompanion/ChatCompanion.tsx +45 -10
- package/src/containers/ChatDialog/ChatDialog.tsx +4 -1
- package/src/containers/IntegrationPrompt/IntegrationPrompt.tsx +9 -6
- package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +2 -0
- package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +40 -39
- package/src/containers/TracePanel/TracePanel.stories.tsx +9 -4
- package/src/containers/TracePanel/TracePanel.tsx +22 -6
- package/src/containers/TriggerStatus/TriggerStatus.tsx +9 -16
- package/src/containers/index.ts +0 -1
- package/src/execution-graph/SPEC.md +60 -2
- package/src/execution-graph/execution-graph.ts +15 -2
- package/src/execution-graph/index.ts +1 -0
- package/src/execution-graph/pending-block-status.ts +3 -2
- package/src/execution-graph/span-tree.test.ts +87 -1
- package/src/execution-graph/span-tree.ts +95 -0
- package/src/feed-logger.ts +6 -6
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useChatProcessor.ts +2 -1
- package/src/hooks/useChatToolbarActions.ts +22 -19
- package/src/hooks/useContextObjects.ts +9 -3
- package/src/hooks/useSelectionContext.test.ts +93 -0
- package/src/hooks/useSelectionContext.ts +72 -0
- package/src/hooks/useSkillRegistry.ts +1 -1
- package/src/hooks/useTraceMessages.ts +5 -3
- package/src/operations/create-chat.ts +2 -2
- package/src/operations/fork-chat.ts +2 -2
- package/src/operations/generate-home-suggestions.test.ts +2 -2
- package/src/operations/index.ts +0 -1
- package/src/operations/prompt.node.test.ts +1 -1
- package/src/paths.ts +3 -3
- package/src/processor/index.ts +1 -0
- package/src/processor/processor.node.test.ts +1 -1
- package/src/processor/processor.ts +33 -5
- package/src/processor/prompt.test.ts +37 -0
- package/src/processor/prompt.ts +42 -0
- package/src/processor/streaming.node.test.ts +196 -0
- package/src/skills/assistant/skill.node.test.ts +2 -2
- package/src/skills/assistant/skill.ts +3 -5
- package/src/templates/routine-templates.test.ts +1 -2
- package/src/templates/scaffold.ts +3 -3
- package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
- package/src/testing/data/trace-timeline-remote.dx.json +1 -1
- package/src/testing/data/trace-timeline.dx.json +1 -2
- package/src/testing/trace-timeline.node.test.ts +3 -3
- package/src/translations.ts +11 -10
- package/src/types/AssistantCapabilities.ts +1 -1
- package/src/types/AssistantOperation.ts +8 -31
- package/src/types/ChatSurface.ts +3 -3
- package/src/types/Ollama.ts +1 -1
- package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs +0 -161
- package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs.map +0 -7
- package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs +0 -40
- package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs.map +0 -7
- package/dist/lib/neutral/AssistantPlugin.mjs +0 -10
- package/dist/lib/neutral/AssistantPlugin.mjs.map +0 -7
- package/dist/lib/neutral/AssistantPlugin.node.mjs +0 -72
- package/dist/lib/neutral/AssistantPlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/AssistantPlugin.workerd.mjs +0 -13
- package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs +0 -302
- package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs.map +0 -7
- package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs +0 -8
- package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs.map +0 -7
- package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs +0 -128
- package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs.map +0 -7
- package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs +0 -74
- package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs.map +0 -7
- package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs +0 -72
- package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs.map +0 -7
- package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs +0 -34
- package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +0 -7
- package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs +0 -114
- package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs.map +0 -7
- package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs +0 -63
- package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs.map +0 -7
- package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs +0 -12
- package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs.map +0 -7
- package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs +0 -95
- package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs.map +0 -7
- package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs +0 -23
- package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs.map +0 -7
- package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs +0 -32
- package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs.map +0 -7
- package/dist/lib/neutral/ai-context-LIKJYMIN.mjs.map +0 -7
- package/dist/lib/neutral/ai-service-DM6YXWUC.mjs +0 -44
- package/dist/lib/neutral/ai-service-DM6YXWUC.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs +0 -249
- package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs.map +0 -7
- package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs +0 -97
- package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -47
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/chunk-5IHQ52KJ.mjs +0 -9
- package/dist/lib/neutral/chunk-5IHQ52KJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6Q4OBGIK.mjs +0 -420
- package/dist/lib/neutral/chunk-6Q4OBGIK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BXI2R4OO.mjs +0 -410
- package/dist/lib/neutral/chunk-BXI2R4OO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CMPLPDYE.mjs +0 -30
- package/dist/lib/neutral/chunk-CMPLPDYE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GPHT3HYS.mjs +0 -8
- package/dist/lib/neutral/chunk-GPHT3HYS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HKLSFB5I.mjs +0 -90
- package/dist/lib/neutral/chunk-HKLSFB5I.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-L7AR4VTA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LS72HWMM.mjs +0 -42
- package/dist/lib/neutral/chunk-LS72HWMM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OZWZGIV2.mjs +0 -12
- package/dist/lib/neutral/chunk-OZWZGIV2.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QOKLFHUS.mjs +0 -13
- package/dist/lib/neutral/chunk-QOKLFHUS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SCTHQVIJ.mjs +0 -155
- package/dist/lib/neutral/chunk-SCTHQVIJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-U4LTLBAX.mjs +0 -56
- package/dist/lib/neutral/chunk-U4LTLBAX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UPKFUZ6V.mjs +0 -115
- package/dist/lib/neutral/chunk-UPKFUZ6V.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V2Y4XE3O.mjs +0 -12
- package/dist/lib/neutral/chunk-V2Y4XE3O.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XVGEJWJX.mjs +0 -133
- package/dist/lib/neutral/chunk-XVGEJWJX.mjs.map +0 -7
- package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs +0 -126
- package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -2527
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/connector-ITLLTBPZ.mjs +0 -70
- package/dist/lib/neutral/connector-ITLLTBPZ.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -31
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-chat-YGVZZYGP.mjs +0 -56
- package/dist/lib/neutral/create-chat-YGVZZYGP.mjs.map +0 -7
- package/dist/lib/neutral/create-object-5PAEJ6KM.mjs +0 -76
- package/dist/lib/neutral/create-object-5PAEJ6KM.mjs.map +0 -7
- package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs +0 -55
- package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs.map +0 -7
- package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs +0 -58
- package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs.map +0 -7
- package/dist/lib/neutral/execution-graph/index.mjs +0 -977
- package/dist/lib/neutral/execution-graph/index.mjs.map +0 -7
- package/dist/lib/neutral/extensions/index.mjs +0 -8
- package/dist/lib/neutral/extensions/index.mjs.map +0 -7
- package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs +0 -92
- package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs.map +0 -7
- package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs +0 -93
- package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -877
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -42
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs +0 -24
- package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs.map +0 -7
- package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs +0 -41
- package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -12
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/migrations-7DEMVBOG.mjs +0 -28
- package/dist/lib/neutral/migrations-7DEMVBOG.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs +0 -18
- package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-2LEN45GP.mjs +0 -8
- package/dist/lib/neutral/operation-handler-2LEN45GP.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -8
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -16
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/plugin.workerd.mjs +0 -13
- package/dist/lib/neutral/plugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-HEJEK44F.mjs +0 -171
- package/dist/lib/neutral/react-surface-HEJEK44F.mjs.map +0 -7
- package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs +0 -28
- package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs.map +0 -7
- package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs +0 -102
- package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs.map +0 -7
- package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs +0 -48
- package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs.map +0 -7
- package/dist/lib/neutral/settings-7Q3RITIT.mjs +0 -28
- package/dist/lib/neutral/settings-7Q3RITIT.mjs.map +0 -7
- package/dist/lib/neutral/skill-definition-553MQRTR.mjs +0 -8
- package/dist/lib/neutral/skill-definition-553MQRTR.mjs.map +0 -7
- package/dist/lib/neutral/skills/index.mjs +0 -8
- package/dist/lib/neutral/skills/index.mjs.map +0 -7
- package/dist/lib/neutral/state-4LGAKSSD.mjs +0 -34
- package/dist/lib/neutral/state-4LGAKSSD.mjs.map +0 -7
- package/dist/lib/neutral/testing.mjs +0 -8
- package/dist/lib/neutral/testing.mjs.map +0 -7
- package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs +0 -21
- package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs.map +0 -7
- package/dist/lib/neutral/toolkit-ETWLG5NT.mjs +0 -8
- package/dist/lib/neutral/toolkit-ETWLG5NT.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -217
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -24
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs +0 -61
- package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs.map +0 -7
- package/dist/types/src/capabilities/migrations.d.ts +0 -5
- package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
- package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
- package/dist/types/src/components/Chat/Chat.stories.d.ts.map +0 -1
- package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +0 -10
- package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/sync.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/sync.test.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/tool-widget-state.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/tool-widget-state.test.d.ts.map +0 -1
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts +0 -6
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +0 -1
- package/dist/types/src/containers/PlanArticle/index.d.ts +0 -2
- package/dist/types/src/containers/PlanArticle/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useFlush.d.ts +0 -6
- package/dist/types/src/hooks/useFlush.d.ts.map +0 -1
- package/dist/types/src/operations/resolve-navigation-targets.d.ts +0 -5
- package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +0 -1
- package/src/AssistantPlugin.conversations.json +0 -1
- package/src/capabilities/migrations.ts +0 -28
- package/src/capabilities/navigation-resolver.ts +0 -20
- package/src/capabilities/react-surface.tsx +0 -177
- package/src/components/ChatPrompt/ChatStatusIndicator.tsx +0 -42
- package/src/components/ChatThread/DEBUG.md +0 -64
- package/src/containers/PlanArticle/PlanArticle.tsx +0 -37
- package/src/containers/PlanArticle/index.ts +0 -5
- package/src/hooks/useFlush.ts +0 -35
- package/src/operations/resolve-navigation-targets.ts +0 -44
- /package/dist/types/src/components/ChatThread/{sync.test.d.ts → sync/sync.test.d.ts} +0 -0
- /package/dist/types/src/components/ChatThread/{tool-widget-state.d.ts → sync/tool-widget-state.d.ts} +0 -0
- /package/dist/types/src/components/ChatThread/{tool-widget-state.test.d.ts → sync/tool-widget-state.test.d.ts} +0 -0
- /package/src/components/ChatThread/{tool-widget-state.test.ts → sync/tool-widget-state.test.ts} +0 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { a as resolveProvider, i as presetsForProvider } from "./chunk-processor.mjs";
|
|
2
|
+
import { Model, Provider } from "@dxos/ai";
|
|
3
|
+
import { EffectEx } from "@dxos/effect";
|
|
4
|
+
import { meta } from "#meta";
|
|
5
|
+
import { Assistant, AssistantCapabilities, Ollama } from "#types";
|
|
6
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
7
|
+
import { IconButton, useTranslation } from "@dxos/react-ui";
|
|
8
|
+
import { Form, createSelectField } from "@dxos/react-ui-form";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { useAtomValue } from "@effect-atom/atom-react";
|
|
11
|
+
import { useOptionalCapability } from "@dxos/app-framework/ui";
|
|
12
|
+
import { Combobox } from "@dxos/react-ui-list";
|
|
13
|
+
import { List, ListItem } from "@dxos/react-list";
|
|
14
|
+
//#region src/containers/AssistantSettings/OllamaModels.tsx
|
|
15
|
+
/** Quick-pick model names (Ollama pull tags) sourced from the curated catalog. */
|
|
16
|
+
var QUICK_PICKS = Model.forProvider(Provider.ollama.id).map((model) => model.backend);
|
|
17
|
+
/** Poll interval for the loaded-into-memory set while the settings panel is open. */
|
|
18
|
+
var LOADED_POLL_INTERVAL = 3e3;
|
|
19
|
+
/**
|
|
20
|
+
* Manage locally-installed Ollama models. The {@link AssistantCapabilities.OllamaManager}
|
|
21
|
+
* capability is only contributed by the native (desktop) runtime, so this renders nothing in the
|
|
22
|
+
* browser/mobile. Split from the section body so hooks are never called conditionally.
|
|
23
|
+
*/
|
|
24
|
+
var OllamaModels = () => {
|
|
25
|
+
const manager = useOptionalCapability(AssistantCapabilities.OllamaManager);
|
|
26
|
+
if (!manager) return null;
|
|
27
|
+
return /* @__PURE__ */ jsx(OllamaModelsSection, { manager });
|
|
28
|
+
};
|
|
29
|
+
var OllamaModelsSection = ({ manager }) => {
|
|
30
|
+
const { t } = useTranslation(meta.profile.key);
|
|
31
|
+
const state = useAtomValue(manager.state);
|
|
32
|
+
const [query, setQuery] = useState("");
|
|
33
|
+
const [open, setOpen] = useState(false);
|
|
34
|
+
const [pending, setPending] = useState({});
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
EffectEx.runPromise(manager.refresh);
|
|
37
|
+
}, [manager]);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
const interval = setInterval(() => void EffectEx.runPromise(manager.refreshLoaded), LOADED_POLL_INTERVAL);
|
|
40
|
+
return () => clearInterval(interval);
|
|
41
|
+
}, [manager]);
|
|
42
|
+
const installed = new Set(state.models.map((model) => model.name));
|
|
43
|
+
const loaded = new Map(state.loaded.map((model) => [model.name, model]));
|
|
44
|
+
const pulling = Object.keys(state.pulls).filter((name) => !installed.has(name));
|
|
45
|
+
const withPending = useCallback((key, action) => async () => {
|
|
46
|
+
setPending((prev) => ({
|
|
47
|
+
...prev,
|
|
48
|
+
[key]: true
|
|
49
|
+
}));
|
|
50
|
+
try {
|
|
51
|
+
await action();
|
|
52
|
+
} finally {
|
|
53
|
+
setPending((prev) => ({
|
|
54
|
+
...prev,
|
|
55
|
+
[key]: false
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
}, []);
|
|
59
|
+
const handlePull = useCallback((target) => {
|
|
60
|
+
const trimmed = target.trim();
|
|
61
|
+
if (trimmed.length === 0) return;
|
|
62
|
+
setQuery("");
|
|
63
|
+
setOpen(false);
|
|
64
|
+
withPending(trimmed, () => EffectEx.runPromise(manager.pull(trimmed)))();
|
|
65
|
+
}, [manager, withPending]);
|
|
66
|
+
const filter = query.trim();
|
|
67
|
+
const suggestions = QUICK_PICKS.filter((pick) => !installed.has(pick) && (filter === "" || pick.includes(filter)));
|
|
68
|
+
const offerCustom = filter.length > 0 && !installed.has(filter) && !suggestions.includes(filter);
|
|
69
|
+
const empty = state.models.length === 0 && pulling.length === 0;
|
|
70
|
+
return /* @__PURE__ */ jsxs(Form.Section, {
|
|
71
|
+
title: t("settings.ollama.title"),
|
|
72
|
+
children: [/* @__PURE__ */ jsx(Form.Row, {
|
|
73
|
+
label: t("settings.ollama.installed.label"),
|
|
74
|
+
children: state.kind === "failed" && state.error ? /* @__PURE__ */ jsx("p", {
|
|
75
|
+
className: "text-sm text-error-text",
|
|
76
|
+
children: t("settings.ollama.failed.message", { error: state.error })
|
|
77
|
+
}) : empty ? /* @__PURE__ */ jsx("p", {
|
|
78
|
+
className: "text-sm text-description",
|
|
79
|
+
children: t("settings.ollama.empty.message")
|
|
80
|
+
}) : /* @__PURE__ */ jsxs(List, {
|
|
81
|
+
variant: "unordered",
|
|
82
|
+
className: "flex flex-col gap-1 grow w-full text-left",
|
|
83
|
+
children: [state.models.map((model) => {
|
|
84
|
+
const running = loaded.get(model.name);
|
|
85
|
+
const error = state.errors[model.name];
|
|
86
|
+
const size = model.size != null ? formatBytes(model.size) : void 0;
|
|
87
|
+
const loadedLabel = running ? running.sizeVram ? t("settings.ollama.loaded.vram", { size: formatBytes(running.sizeVram) }) : t("settings.ollama.loaded.label") : void 0;
|
|
88
|
+
return /* @__PURE__ */ jsxs(ListItem, {
|
|
89
|
+
className: "flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full",
|
|
90
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
91
|
+
className: "flex items-center gap-2",
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx("span", {
|
|
94
|
+
className: "grow truncate font-medium",
|
|
95
|
+
children: model.name
|
|
96
|
+
}),
|
|
97
|
+
/* @__PURE__ */ jsx(IconButton, {
|
|
98
|
+
icon: running ? "ph--eject--regular" : "ph--play--regular",
|
|
99
|
+
iconOnly: true,
|
|
100
|
+
label: running ? t("settings.ollama.unload.label") : t("settings.ollama.load.label"),
|
|
101
|
+
disabled: pending[model.name],
|
|
102
|
+
onClick: () => void withPending(model.name, () => EffectEx.runPromise(running ? manager.unload(model.name) : manager.load(model.name)))()
|
|
103
|
+
}),
|
|
104
|
+
/* @__PURE__ */ jsx(IconButton, {
|
|
105
|
+
icon: "ph--trash--regular",
|
|
106
|
+
iconOnly: true,
|
|
107
|
+
label: t("settings.ollama.remove.label"),
|
|
108
|
+
disabled: pending[model.name],
|
|
109
|
+
onClick: () => void withPending(model.name, () => EffectEx.runPromise(manager.remove(model.name)))()
|
|
110
|
+
})
|
|
111
|
+
]
|
|
112
|
+
}), (size || loadedLabel || error) && /* @__PURE__ */ jsxs("div", {
|
|
113
|
+
className: "flex items-center gap-2 text-sm",
|
|
114
|
+
children: [
|
|
115
|
+
size && /* @__PURE__ */ jsx("span", {
|
|
116
|
+
className: "text-description",
|
|
117
|
+
children: size
|
|
118
|
+
}),
|
|
119
|
+
loadedLabel && /* @__PURE__ */ jsx("span", {
|
|
120
|
+
className: "text-success-text",
|
|
121
|
+
children: loadedLabel
|
|
122
|
+
}),
|
|
123
|
+
error && /* @__PURE__ */ jsx("span", {
|
|
124
|
+
className: "truncate text-error-text",
|
|
125
|
+
children: shortError(error)
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
})]
|
|
129
|
+
}, model.name);
|
|
130
|
+
}), pulling.map((name) => {
|
|
131
|
+
const progress = state.pulls[name];
|
|
132
|
+
const status = progress?.total ? t("settings.ollama.pulling.message", { percent: percentOf(progress) }) : progress?.status ?? t("settings.ollama.pulling.label");
|
|
133
|
+
return /* @__PURE__ */ jsxs(ListItem, {
|
|
134
|
+
className: "flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full",
|
|
135
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
136
|
+
className: "flex items-center gap-2",
|
|
137
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
138
|
+
className: "grow truncate font-medium text-description",
|
|
139
|
+
children: name
|
|
140
|
+
}), /* @__PURE__ */ jsx(IconButton, {
|
|
141
|
+
icon: "ph--x--regular",
|
|
142
|
+
iconOnly: true,
|
|
143
|
+
label: t("settings.ollama.cancel.label"),
|
|
144
|
+
onClick: () => void EffectEx.runPromise(manager.cancel(name))
|
|
145
|
+
})]
|
|
146
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
147
|
+
className: "text-sm text-description",
|
|
148
|
+
children: status
|
|
149
|
+
})]
|
|
150
|
+
}, name);
|
|
151
|
+
})]
|
|
152
|
+
})
|
|
153
|
+
}), /* @__PURE__ */ jsxs(Form.Row, {
|
|
154
|
+
label: t("settings.ollama.pull.label"),
|
|
155
|
+
children: [Object.entries(state.errors).filter(([name]) => !installed.has(name)).map(([name, error]) => /* @__PURE__ */ jsxs("p", {
|
|
156
|
+
className: "text-xs text-error-text",
|
|
157
|
+
children: [
|
|
158
|
+
name,
|
|
159
|
+
": ",
|
|
160
|
+
shortError(error)
|
|
161
|
+
]
|
|
162
|
+
}, name)), /* @__PURE__ */ jsxs(Combobox.Root, {
|
|
163
|
+
open,
|
|
164
|
+
onOpenChange: setOpen,
|
|
165
|
+
value: "",
|
|
166
|
+
onValueChange: () => {},
|
|
167
|
+
placeholder: t("settings.ollama.pull.placeholder"),
|
|
168
|
+
children: [/* @__PURE__ */ jsx(Combobox.Trigger, { classNames: "w-full" }), /* @__PURE__ */ jsx(Combobox.Portal, { children: /* @__PURE__ */ jsxs(Combobox.Content, { children: [
|
|
169
|
+
/* @__PURE__ */ jsx(Combobox.Input, {
|
|
170
|
+
value: query,
|
|
171
|
+
onValueChange: setQuery,
|
|
172
|
+
placeholder: t("settings.ollama.pull.placeholder"),
|
|
173
|
+
onKeyDown: (event) => {
|
|
174
|
+
if (event.key === "Enter" && filter.length > 0) handlePull(filter);
|
|
175
|
+
}
|
|
176
|
+
}),
|
|
177
|
+
/* @__PURE__ */ jsxs(Combobox.List, { children: [offerCustom && /* @__PURE__ */ jsx(Combobox.Item, {
|
|
178
|
+
value: filter,
|
|
179
|
+
label: t("settings.ollama.pull-custom.label", { name: filter }),
|
|
180
|
+
icon: "ph--download-simple--regular",
|
|
181
|
+
onSelect: () => handlePull(filter)
|
|
182
|
+
}), suggestions.map((pick) => /* @__PURE__ */ jsx(Combobox.Item, {
|
|
183
|
+
value: pick,
|
|
184
|
+
label: pick,
|
|
185
|
+
onSelect: () => handlePull(pick)
|
|
186
|
+
}, pick))] }),
|
|
187
|
+
/* @__PURE__ */ jsx(Combobox.Arrow, {})
|
|
188
|
+
] }) })]
|
|
189
|
+
})]
|
|
190
|
+
})]
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* Condense a verbose service error for inline display: drop Ollama's "(checked: <paths>)" path dump
|
|
195
|
+
* and cap the length. The full message is still logged to the console.
|
|
196
|
+
*/
|
|
197
|
+
var shortError = (error) => {
|
|
198
|
+
const head = error.split(/\s*\(checked:/)[0].trim();
|
|
199
|
+
return head.length > 160 ? `${head.slice(0, 160)}…` : head;
|
|
200
|
+
};
|
|
201
|
+
/** Percent complete for an in-flight pull, or 0 when totals are not yet known. */
|
|
202
|
+
var percentOf = (progress) => progress && progress.total && progress.total > 0 ? Math.round((progress.completed ?? 0) / progress.total * 100) : 0;
|
|
203
|
+
var UNITS = [
|
|
204
|
+
"B",
|
|
205
|
+
"KB",
|
|
206
|
+
"MB",
|
|
207
|
+
"GB",
|
|
208
|
+
"TB"
|
|
209
|
+
];
|
|
210
|
+
/** Human-readable byte size (binary units). */
|
|
211
|
+
var formatBytes = (bytes) => {
|
|
212
|
+
let value = bytes;
|
|
213
|
+
let unit = 0;
|
|
214
|
+
while (value >= 1024 && unit < UNITS.length - 1) {
|
|
215
|
+
value /= 1024;
|
|
216
|
+
unit += 1;
|
|
217
|
+
}
|
|
218
|
+
return `${value.toFixed(unit === 0 ? 0 : 1)} ${UNITS[unit]}`;
|
|
219
|
+
};
|
|
220
|
+
OllamaModels.displayName = "OllamaModels";
|
|
221
|
+
//#endregion
|
|
222
|
+
//#region src/containers/AssistantSettings/AssistantSettings.tsx
|
|
223
|
+
var presetOptions = (provider, installed) => presetsForProvider(provider).filter((preset) => !installed || installed.has(preset.backend)).map((preset) => ({
|
|
224
|
+
value: preset.model,
|
|
225
|
+
label: preset.label
|
|
226
|
+
}));
|
|
227
|
+
var AssistantSettings = ({ settings, onSettingsChange }) => {
|
|
228
|
+
const { t } = useTranslation(meta.profile.key);
|
|
229
|
+
const ollamaManager = useOptionalCapability(AssistantCapabilities.OllamaManager);
|
|
230
|
+
const localProvider = ollamaManager ? Provider.builtIn : Provider.ollama;
|
|
231
|
+
const localProviderKey = ollamaManager ? "built-in" : "ollama";
|
|
232
|
+
const localModels = useAtomValue(ollamaManager?.state ?? Ollama.emptyState);
|
|
233
|
+
const installed = useMemo(() => new Set(localModels.models.map((model) => model.name)), [localModels]);
|
|
234
|
+
const values = useMemo(() => ({
|
|
235
|
+
...settings,
|
|
236
|
+
modelProvider: resolveProvider(settings.modelProvider, !!ollamaManager)
|
|
237
|
+
}), [settings, ollamaManager]);
|
|
238
|
+
const fieldMap = useMemo(() => ({
|
|
239
|
+
"modelProvider": createSelectField({
|
|
240
|
+
defaultLabel: null,
|
|
241
|
+
options: [
|
|
242
|
+
{
|
|
243
|
+
value: Provider.edge.id,
|
|
244
|
+
label: t("settings.provider.edge.label")
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
value: localProvider.id,
|
|
248
|
+
label: t(`settings.provider.${localProviderKey}.label`)
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
value: Provider.lmStudio.id,
|
|
252
|
+
label: t("settings.provider.lmstudio.label")
|
|
253
|
+
}
|
|
254
|
+
]
|
|
255
|
+
}),
|
|
256
|
+
"modelDefaults.edge": createSelectField({ options: presetOptions(Provider.edge.id) }),
|
|
257
|
+
"modelDefaults.ollama": createSelectField({ options: presetOptions(localProvider.id, ollamaManager ? installed : void 0) }),
|
|
258
|
+
"modelDefaults.lmstudio": createSelectField({ options: presetOptions(Provider.lmStudio.id) })
|
|
259
|
+
}), [
|
|
260
|
+
t,
|
|
261
|
+
localProvider,
|
|
262
|
+
localProviderKey,
|
|
263
|
+
ollamaManager,
|
|
264
|
+
installed
|
|
265
|
+
]);
|
|
266
|
+
return /* @__PURE__ */ jsx(Form.Root, {
|
|
267
|
+
variant: "settings",
|
|
268
|
+
schema: Assistant.Settings,
|
|
269
|
+
readonly: !onSettingsChange,
|
|
270
|
+
values,
|
|
271
|
+
onValuesChanged: (values) => onSettingsChange?.(() => values),
|
|
272
|
+
children: /* @__PURE__ */ jsx(Form.Viewport, {
|
|
273
|
+
scroll: true,
|
|
274
|
+
children: /* @__PURE__ */ jsxs(Form.Content, { children: [/* @__PURE__ */ jsx(Form.Section, {
|
|
275
|
+
title: meta.profile.name ?? meta.profile.key,
|
|
276
|
+
children: /* @__PURE__ */ jsx(Form.FieldSet, { fieldMap })
|
|
277
|
+
}), /* @__PURE__ */ jsx(OllamaModels, {})] })
|
|
278
|
+
})
|
|
279
|
+
});
|
|
280
|
+
};
|
|
281
|
+
AssistantSettings.displayName = "AssistantSettings";
|
|
282
|
+
//#endregion
|
|
283
|
+
export { AssistantSettings as default };
|
|
284
|
+
|
|
285
|
+
//# sourceMappingURL=chunk-AssistantSettings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-AssistantSettings.mjs","names":[],"sources":["../../src/containers/AssistantSettings/OllamaModels.tsx","../../src/containers/AssistantSettings/AssistantSettings.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { Model, Provider } from '@dxos/ai';\nimport { useOptionalCapability } from '@dxos/app-framework/ui';\nimport { EffectEx } from '@dxos/effect';\nimport { List, ListItem } from '@dxos/react-list';\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { Combobox } from '@dxos/react-ui-list';\n\nimport { meta } from '#meta';\nimport { AssistantCapabilities, type Ollama } from '#types';\n\n/** Quick-pick model names (Ollama pull tags) sourced from the curated catalog. */\nconst QUICK_PICKS = Model.forProvider(Provider.ollama.id).map((model) => model.backend);\n\n/** Poll interval for the loaded-into-memory set while the settings panel is open. */\nconst LOADED_POLL_INTERVAL = 3_000;\n\n/**\n * Manage locally-installed Ollama models. The {@link AssistantCapabilities.OllamaManager}\n * capability is only contributed by the native (desktop) runtime, so this renders nothing in the\n * browser/mobile. Split from the section body so hooks are never called conditionally.\n */\nexport const OllamaModels = () => {\n const manager = useOptionalCapability(AssistantCapabilities.OllamaManager);\n if (!manager) {\n return null;\n }\n\n return <OllamaModelsSection manager={manager} />;\n};\n\nexport const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) => {\n const { t } = useTranslation(meta.profile.key);\n // Explicit subscription: the list and badges must re-render as pulls/installs/loads land.\n const state = useAtomValue(manager.state);\n const [query, setQuery] = useState('');\n const [open, setOpen] = useState(false);\n // UI-level gate keyed by model name, guaranteeing a visible busy state across the click handler.\n const [pending, setPending] = useState<Record<string, boolean>>({});\n\n // Ensure the sidecar is up and list installed models on mount.\n useEffect(() => {\n void EffectEx.runPromise(manager.refresh);\n }, [manager]);\n\n // Poll the loaded-into-memory set so the panel reflects which model is resident in real time.\n useEffect(() => {\n const interval = setInterval(() => void EffectEx.runPromise(manager.refreshLoaded), LOADED_POLL_INTERVAL);\n return () => clearInterval(interval);\n }, [manager]);\n\n const installed = new Set(state.models.map((model) => model.name));\n const loaded = new Map(state.loaded.map((model) => [model.name, model]));\n const pulling = Object.keys(state.pulls).filter((name) => !installed.has(name));\n\n const withPending = useCallback(\n (key: string, action: () => Promise<void>) => async () => {\n setPending((prev) => ({ ...prev, [key]: true }));\n try {\n await action();\n } finally {\n setPending((prev) => ({ ...prev, [key]: false }));\n }\n },\n [],\n );\n\n const handlePull = useCallback(\n (target: string) => {\n const trimmed = target.trim();\n if (trimmed.length === 0) {\n return;\n }\n setQuery('');\n setOpen(false);\n void withPending(trimmed, () => EffectEx.runPromise(manager.pull(trimmed)))();\n },\n [manager, withPending],\n );\n\n // Caller-driven filtering: curated picks not yet installed, matching the typed query.\n const filter = query.trim();\n const suggestions = QUICK_PICKS.filter((pick) => !installed.has(pick) && (filter === '' || pick.includes(filter)));\n const offerCustom = filter.length > 0 && !installed.has(filter) && !suggestions.includes(filter);\n const empty = state.models.length === 0 && pulling.length === 0;\n\n return (\n <Form.Section title={t('settings.ollama.title')}>\n <Form.Row label={t('settings.ollama.installed.label')}>\n {state.kind === 'failed' && state.error ? (\n // Connection-level failure has no associated model, so it shows inline as the row content.\n <p className='text-sm text-error-text'>{t('settings.ollama.failed.message', { error: state.error })}</p>\n ) : empty ? (\n <p className='text-sm text-description'>{t('settings.ollama.empty.message')}</p>\n ) : (\n // Plain `List`/`ListItem` (non-select), with the trigger editor's \"fatter\" two-line row\n // treatment: a name line plus a secondary meta line, on a surface-styled row. Rows are\n // actioned via their trailing buttons (no selection semantics).\n <List variant='unordered' className='flex flex-col gap-1 grow w-full text-left'>\n {state.models.map((model) => {\n const running = loaded.get(model.name);\n const error = state.errors[model.name];\n const size = model.size != null ? formatBytes(model.size) : undefined;\n const loadedLabel = running\n ? running.sizeVram\n ? t('settings.ollama.loaded.vram', { size: formatBytes(running.sizeVram) })\n : t('settings.ollama.loaded.label')\n : undefined;\n return (\n <ListItem\n key={model.name}\n className='flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full'\n >\n <div className='flex items-center gap-2'>\n <span className='grow truncate font-medium'>{model.name}</span>\n <IconButton\n icon={running ? 'ph--eject--regular' : 'ph--play--regular'}\n iconOnly\n label={running ? t('settings.ollama.unload.label') : t('settings.ollama.load.label')}\n disabled={pending[model.name]}\n onClick={() =>\n void withPending(model.name, () =>\n EffectEx.runPromise(running ? manager.unload(model.name) : manager.load(model.name)),\n )()\n }\n />\n <IconButton\n icon='ph--trash--regular'\n iconOnly\n label={t('settings.ollama.remove.label')}\n disabled={pending[model.name]}\n onClick={() =>\n void withPending(model.name, () => EffectEx.runPromise(manager.remove(model.name)))()\n }\n />\n </div>\n {(size || loadedLabel || error) && (\n <div className='flex items-center gap-2 text-sm'>\n {size && <span className='text-description'>{size}</span>}\n {loadedLabel && <span className='text-success-text'>{loadedLabel}</span>}\n {error && <span className='truncate text-error-text'>{shortError(error)}</span>}\n </div>\n )}\n </ListItem>\n );\n })}\n {pulling.map((name) => {\n const progress = state.pulls[name];\n const status = progress?.total\n ? t('settings.ollama.pulling.message', { percent: percentOf(progress) })\n : (progress?.status ?? t('settings.ollama.pulling.label'));\n return (\n <ListItem key={name} className='flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full'>\n <div className='flex items-center gap-2'>\n <span className='grow truncate font-medium text-description'>{name}</span>\n <IconButton\n icon='ph--x--regular'\n iconOnly\n label={t('settings.ollama.cancel.label')}\n onClick={() => void EffectEx.runPromise(manager.cancel(name))}\n />\n </div>\n <span className='text-sm text-description'>{status}</span>\n </ListItem>\n );\n })}\n </List>\n )}\n </Form.Row>\n\n <Form.Row label={t('settings.ollama.pull.label')}>\n {/* Pull failures for not-yet-installed models surface here (no model row to attach to). */}\n {Object.entries(state.errors)\n .filter(([name]) => !installed.has(name))\n .map(([name, error]) => (\n <p key={name} className='text-xs text-error-text'>\n {name}: {shortError(error)}\n </p>\n ))}\n {/* Root value is held empty so the trigger always shows the placeholder; the live text is\n the separate `query` driving the input and suggestion filter. */}\n <Combobox.Root\n open={open}\n onOpenChange={setOpen}\n value=''\n onValueChange={() => {}}\n placeholder={t('settings.ollama.pull.placeholder')}\n >\n <Combobox.Trigger classNames='w-full' />\n <Combobox.Portal>\n <Combobox.Content>\n <Combobox.Input\n value={query}\n onValueChange={setQuery}\n placeholder={t('settings.ollama.pull.placeholder')}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && filter.length > 0) {\n handlePull(filter);\n }\n }}\n />\n <Combobox.List>\n {offerCustom && (\n <Combobox.Item\n value={filter}\n label={t('settings.ollama.pull-custom.label', { name: filter })}\n icon='ph--download-simple--regular'\n onSelect={() => handlePull(filter)}\n />\n )}\n {suggestions.map((pick) => (\n <Combobox.Item key={pick} value={pick} label={pick} onSelect={() => handlePull(pick)} />\n ))}\n </Combobox.List>\n <Combobox.Arrow />\n </Combobox.Content>\n </Combobox.Portal>\n </Combobox.Root>\n </Form.Row>\n </Form.Section>\n );\n};\n\n/**\n * Condense a verbose service error for inline display: drop Ollama's \"(checked: <paths>)\" path dump\n * and cap the length. The full message is still logged to the console.\n */\nconst shortError = (error: string): string => {\n const head = error.split(/\\s*\\(checked:/)[0].trim();\n return head.length > 160 ? `${head.slice(0, 160)}…` : head;\n};\n\n/** Percent complete for an in-flight pull, or 0 when totals are not yet known. */\nconst percentOf = (progress: Ollama.ModelsState['pulls'][string] | undefined): number =>\n progress && progress.total && progress.total > 0 ? Math.round(((progress.completed ?? 0) / progress.total) * 100) : 0;\n\nconst UNITS = ['B', 'KB', 'MB', 'GB', 'TB'];\n\n/** Human-readable byte size (binary units). */\nconst formatBytes = (bytes: number): string => {\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit += 1;\n }\n return `${value.toFixed(unit === 0 ? 0 : 1)} ${UNITS[unit]}`;\n};\n\nOllamaModels.displayName = 'OllamaModels';\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useMemo } from 'react';\n\nimport { Provider } from '@dxos/ai';\nimport { useOptionalCapability } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type DXN } from '@dxos/keys';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Form, type FormFieldMap, createSelectField } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { Assistant, AssistantCapabilities, Ollama } from '#types';\n\nimport { presetsForProvider, resolveProvider } from '../../processor';\nimport { OllamaModels } from './OllamaModels';\n\nexport type AssistantSettingsProps = AppSurface.SettingsProps<Assistant.Settings>;\n\n// The per-provider model-default options must match the chat picker (usePresets): the catalog models\n// served by the provider, restricted to installed models when `installed` is supplied (local sidecar).\nconst presetOptions = (provider: DXN.DXN, installed?: ReadonlySet<string>) =>\n presetsForProvider(provider)\n .filter((preset) => !installed || installed.has(preset.backend))\n .map((preset) => ({ value: preset.model, label: preset.label }));\n\nexport const AssistantSettings = ({ settings, onSettingsChange }: AssistantSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n // The Ollama manager is the bundled sidecar (desktop only). Its presence selects the local\n // provider: the managed `built-in` vs. an external `ollama` server.\n const ollamaManager = useOptionalCapability(AssistantCapabilities.OllamaManager);\n const localProvider = ollamaManager ? Provider.builtIn : Provider.ollama;\n const localProviderKey = ollamaManager ? 'built-in' : 'ollama';\n\n // Installed models reported by the bundled sidecar; restricts the local default to present models.\n const localModels = useAtomValue(ollamaManager?.state ?? Ollama.emptyState);\n const installed = useMemo(() => new Set(localModels.models.map((model) => model.name)), [localModels]);\n\n // Reconcile a stored provider with the runtime (`ollama` → `built-in` on desktop) so the\n // dropdown shows a concrete, available selection rather than blank.\n const values = useMemo(\n () => ({ ...settings, modelProvider: resolveProvider(settings.modelProvider, !!ollamaManager) }),\n [settings, ollamaManager],\n );\n\n // Form `fieldMap` is keyed by dotted JSON path, so nested struct leaves are addressed directly.\n const fieldMap = useMemo<FormFieldMap>(\n () => ({\n // `defaultLabel: null` drops the sentinel \"Default\" option — a provider is always concrete.\n 'modelProvider': createSelectField({\n defaultLabel: null,\n options: [\n { value: Provider.edge.id, label: t('settings.provider.edge.label') },\n { value: localProvider.id, label: t(`settings.provider.${localProviderKey}.label`) },\n { value: Provider.lmStudio.id, label: t('settings.provider.lmstudio.label') },\n ],\n }),\n 'modelDefaults.edge': createSelectField({ options: presetOptions(Provider.edge.id) }),\n // `built-in` and `ollama` share the `ollama` default key; the managed sidecar restricts to installed.\n 'modelDefaults.ollama': createSelectField({\n options: presetOptions(localProvider.id, ollamaManager ? installed : undefined),\n }),\n 'modelDefaults.lmstudio': createSelectField({ options: presetOptions(Provider.lmStudio.id) }),\n }),\n [t, localProvider, localProviderKey, ollamaManager, installed],\n );\n\n return (\n <Form.Root\n variant='settings'\n schema={Assistant.Settings}\n readonly={!onSettingsChange}\n values={values}\n onValuesChanged={(values) => onSettingsChange?.(() => values)}\n >\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n <Form.FieldSet fieldMap={fieldMap} />\n </Form.Section>\n <OllamaModels />\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nAssistantSettings.displayName = 'AssistantSettings';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { u as __exportAll } from "./chunk-types.mjs";
|
|
2
|
+
import { Capabilities } from "@dxos/app-framework";
|
|
3
|
+
import { Provider } from "@dxos/ai";
|
|
4
|
+
import { AssistantCapabilities } from "#types";
|
|
5
|
+
import { forwardRef, useCallback, useEffect, useRef } from "react";
|
|
6
|
+
import { useObject } from "@dxos/echo-react";
|
|
7
|
+
import { Panel } from "@dxos/react-ui";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useChatProcessor, useChatServices, usePresets, useSelectionContext } from "#hooks";
|
|
10
|
+
import { useAtomCapability, useCapability, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
11
|
+
import { Chat } from "#components";
|
|
12
|
+
import { getSpace } from "@dxos/client/echo";
|
|
13
|
+
import { ClientOperation } from "@dxos/plugin-client";
|
|
14
|
+
import { useRegistry } from "@dxos/react-client/echo";
|
|
15
|
+
//#region src/containers/ChatArticle/ChatArticle.tsx
|
|
16
|
+
var ChatArticle = forwardRef(({ role, attendableId, subject: chat, companionTo, onEvent, onSubmit }, forwardedRef) => {
|
|
17
|
+
const registry = useRegistry();
|
|
18
|
+
const settings = useAtomCapability(AssistantCapabilities.Settings);
|
|
19
|
+
const atomRegistry = useCapability(Capabilities.AtomRegistry);
|
|
20
|
+
const stateAtom = useCapability(AssistantCapabilities.State);
|
|
21
|
+
const space = getSpace(chat) ?? getSpace(companionTo);
|
|
22
|
+
const runtime = useChatServices({ id: space?.id });
|
|
23
|
+
const { preset, ...chatProps } = usePresets(settings);
|
|
24
|
+
const online = preset?.provider === Provider.edge.id;
|
|
25
|
+
const processor = useChatProcessor({
|
|
26
|
+
space,
|
|
27
|
+
chat,
|
|
28
|
+
preset,
|
|
29
|
+
runtime,
|
|
30
|
+
registry,
|
|
31
|
+
settings
|
|
32
|
+
});
|
|
33
|
+
const getContext = useSelectionContext(companionTo);
|
|
34
|
+
const [chatViewType] = useObject(chat, "viewType");
|
|
35
|
+
const viewType = chatViewType ?? settings.chatView;
|
|
36
|
+
const { invokePromise } = useOperationInvoker();
|
|
37
|
+
const handleViewUsage = useCallback(() => {
|
|
38
|
+
invokePromise(ClientOperation.OpenUsage, void 0);
|
|
39
|
+
}, [invokePromise]);
|
|
40
|
+
const pendingSubmitted = useRef(false);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
pendingSubmitted.current = false;
|
|
43
|
+
}, [attendableId]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!processor || !attendableId || pendingSubmitted.current) return;
|
|
46
|
+
const pendingPrompt = atomRegistry.get(stateAtom).pendingPrompts[attendableId];
|
|
47
|
+
if (pendingPrompt) {
|
|
48
|
+
pendingSubmitted.current = true;
|
|
49
|
+
atomRegistry.update(stateAtom, (current) => {
|
|
50
|
+
const { [attendableId]: _, ...rest } = current.pendingPrompts;
|
|
51
|
+
return {
|
|
52
|
+
...current,
|
|
53
|
+
pendingPrompts: rest
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
processor.request({ message: pendingPrompt });
|
|
57
|
+
}
|
|
58
|
+
}, [
|
|
59
|
+
processor,
|
|
60
|
+
attendableId,
|
|
61
|
+
atomRegistry,
|
|
62
|
+
stateAtom
|
|
63
|
+
]);
|
|
64
|
+
if (!processor) return null;
|
|
65
|
+
return /* @__PURE__ */ jsx(Chat.Root, {
|
|
66
|
+
chat,
|
|
67
|
+
db: space?.db,
|
|
68
|
+
processor,
|
|
69
|
+
getContext,
|
|
70
|
+
onEvent,
|
|
71
|
+
onSubmit,
|
|
72
|
+
children: /* @__PURE__ */ jsxs(Panel.Root, {
|
|
73
|
+
role,
|
|
74
|
+
ref: forwardedRef,
|
|
75
|
+
children: [/* @__PURE__ */ jsx(Panel.Toolbar, { children: /* @__PURE__ */ jsx(Chat.Toolbar, {
|
|
76
|
+
classNames: "dx-document",
|
|
77
|
+
attendableId,
|
|
78
|
+
companionTo
|
|
79
|
+
}) }), /* @__PURE__ */ jsx(Panel.Content, {
|
|
80
|
+
asChild: true,
|
|
81
|
+
children: /* @__PURE__ */ jsxs(Chat.Content, { children: [/* @__PURE__ */ jsxs("div", {
|
|
82
|
+
className: "dx-container relative",
|
|
83
|
+
children: [
|
|
84
|
+
viewType !== "summary" && /* @__PURE__ */ jsx(Chat.Minimap, { classNames: "absolute left-0 top-1/2 -translate-y-1/2 z-10" }),
|
|
85
|
+
/* @__PURE__ */ jsx(Chat.Thread, {
|
|
86
|
+
viewType,
|
|
87
|
+
onViewUsage: handleViewUsage
|
|
88
|
+
}),
|
|
89
|
+
viewType !== "summary" && /* @__PURE__ */ jsx("div", {
|
|
90
|
+
className: "absolute bottom-2 left-0 right-0",
|
|
91
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
92
|
+
className: "dx-document px-4",
|
|
93
|
+
children: /* @__PURE__ */ jsx(Chat.Status, { classNames: "px-3 rounded-sm bg-group-surface" })
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
]
|
|
97
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
98
|
+
className: "dx-document px-4 pb-4",
|
|
99
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
100
|
+
className: "flex flex-col items-center py-2 overflow-hidden",
|
|
101
|
+
children: /* @__PURE__ */ jsx(Chat.TaskList, { classNames: "max-h-[120px] border border-separator rounded-sm text-description" })
|
|
102
|
+
}), /* @__PURE__ */ jsx(Chat.Prompt, {
|
|
103
|
+
...chatProps,
|
|
104
|
+
outline: true,
|
|
105
|
+
preset: preset?.id,
|
|
106
|
+
online,
|
|
107
|
+
companionTo
|
|
108
|
+
})]
|
|
109
|
+
})] })
|
|
110
|
+
})]
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
ChatArticle.displayName = "ChatArticle";
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region src/containers/ChatArticle/index.ts
|
|
117
|
+
var ChatArticle_exports = /* @__PURE__ */ __exportAll({ default: () => ChatArticle });
|
|
118
|
+
//#endregion
|
|
119
|
+
export { ChatArticle as n, ChatArticle_exports as t };
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=chunk-ChatArticle.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ChatArticle.mjs","names":[],"sources":["../../src/containers/ChatArticle/ChatArticle.tsx","../../src/containers/ChatArticle/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useEffect, useRef } from 'react';\n\nimport { Provider } from '@dxos/ai';\nimport { Capabilities } from '@dxos/app-framework';\nimport { useAtomCapability, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { getSpace } from '@dxos/client/echo';\nimport { type Obj } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { ClientOperation } from '@dxos/plugin-client';\nimport { useRegistry } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\n\nimport { Chat as ChatComponent, type ChatRootProps } from '#components';\nimport { useChatProcessor, useChatServices, usePresets, useSelectionContext } from '#hooks';\nimport { type Assistant, AssistantCapabilities, type ChatType } from '#types';\n\nexport type ChatArticleProps = AppSurface.ObjectSectionProps<ChatType.Chat> & {\n companionTo?: Obj.Unknown;\n} & Pick<ChatRootProps, 'onEvent' | 'onSubmit'>;\n\nexport const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(\n ({ role, attendableId, subject: chat, companionTo, onEvent, onSubmit }, forwardedRef) => {\n const registry = useRegistry();\n const settings = useAtomCapability(AssistantCapabilities.Settings);\n const atomRegistry = useCapability(Capabilities.AtomRegistry);\n const stateAtom = useCapability(AssistantCapabilities.State);\n // Transient (pre-submit) chats have no database; fall back to the companion's space.\n const space = getSpace(chat) ?? getSpace(companionTo);\n const runtime = useChatServices({ id: space?.id });\n\n const { preset, ...chatProps } = usePresets(settings);\n // The provider is configured in settings; the chat surfaces it as a read-only online indicator.\n const online = preset?.provider === Provider.edge.id;\n const processor = useChatProcessor({ space, chat, preset, runtime, registry, settings });\n const getContext = useSelectionContext(companionTo);\n\n // Subscribe to the view type via `useObject` so the thread re-renders when ChatOptions changes it;\n // a direct `chat.viewType` read in render does not establish a reactive dependency.\n const [chatViewType] = useObject(chat, 'viewType');\n const viewType = (chatViewType as Assistant.ChatView | undefined) ?? settings.chatView;\n\n const { invokePromise } = useOperationInvoker();\n const handleViewUsage = useCallback(() => {\n void invokePromise(ClientOperation.OpenUsage, undefined);\n }, [invokePromise]);\n\n // Reset the one-shot guard when the target conversation changes, so a pending prompt for a new\n // `attendableId` is still auto-submitted within the same mount.\n const pendingSubmitted = useRef(false);\n useEffect(() => {\n pendingSubmitted.current = false;\n }, [attendableId]);\n\n useEffect(() => {\n if (!processor || !attendableId || pendingSubmitted.current) {\n return;\n }\n\n const state = atomRegistry.get(stateAtom);\n const pendingPrompt = state.pendingPrompts[attendableId];\n if (pendingPrompt) {\n pendingSubmitted.current = true;\n atomRegistry.update(stateAtom, (current) => {\n const { [attendableId]: _, ...rest } = current.pendingPrompts;\n return { ...current, pendingPrompts: rest };\n });\n\n void processor.request({ message: pendingPrompt });\n }\n }, [processor, attendableId, atomRegistry, stateAtom]);\n\n if (!processor) {\n return null;\n }\n\n return (\n <ChatComponent.Root\n chat={chat}\n db={space?.db}\n processor={processor}\n getContext={getContext}\n onEvent={onEvent}\n onSubmit={onSubmit}\n >\n <Panel.Root role={role} ref={forwardedRef}>\n <Panel.Toolbar>\n <ChatComponent.Toolbar classNames='dx-document' attendableId={attendableId} companionTo={companionTo} />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <ChatComponent.Content>\n <div className='dx-container relative'>\n {viewType !== 'summary' && (\n <ChatComponent.Minimap classNames='absolute left-0 top-1/2 -translate-y-1/2 z-10' />\n )}\n <ChatComponent.Thread viewType={viewType} onViewUsage={handleViewUsage} />\n {viewType !== 'summary' && (\n <div className='absolute bottom-2 left-0 right-0'>\n <div className='dx-document px-4'>\n <ChatComponent.Status classNames='px-3 rounded-sm bg-group-surface' />\n </div>\n </div>\n )}\n </div>\n <div className='dx-document px-4 pb-4'>\n <div className='flex flex-col items-center py-2 overflow-hidden'>\n <ChatComponent.TaskList classNames='max-h-[120px] border border-separator rounded-sm text-description' />\n </div>\n <ChatComponent.Prompt\n {...chatProps}\n outline\n preset={preset?.id}\n online={online}\n companionTo={companionTo}\n />\n </div>\n </ChatComponent.Content>\n </Panel.Content>\n </Panel.Root>\n </ChatComponent.Root>\n );\n },\n);\n\nChatArticle.displayName = 'ChatArticle';\n","//\n// Copyright 2025 DXOS.org\n//\n\nexport { ChatArticle as default } from './ChatArticle';\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,IAAa,cAAc,YACxB,EAAE,MAAM,cAAc,SAAS,MAAM,aAAa,SAAS,YAAY,iBAAiB;CACvF,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,kBAAkB,sBAAsB,QAAQ;CACjE,MAAM,eAAe,cAAc,aAAa,YAAY;CAC5D,MAAM,YAAY,cAAc,sBAAsB,KAAK;CAE3D,MAAM,QAAQ,SAAS,IAAI,KAAK,SAAS,WAAW;CACpD,MAAM,UAAU,gBAAgB,EAAE,IAAI,OAAO,GAAG,CAAC;CAEjD,MAAM,EAAE,QAAQ,GAAG,cAAc,WAAW,QAAQ;CAEpD,MAAM,SAAS,QAAQ,aAAa,SAAS,KAAK;CAClD,MAAM,YAAY,iBAAiB;EAAE;EAAO;EAAM;EAAQ;EAAS;EAAU;CAAS,CAAC;CACvF,MAAM,aAAa,oBAAoB,WAAW;CAIlD,MAAM,CAAC,gBAAgB,UAAU,MAAM,UAAU;CACjD,MAAM,WAAY,gBAAmD,SAAS;CAE9E,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,kBAAkB,kBAAkB;EACxC,cAAmB,gBAAgB,WAAW,KAAA,CAAS;CACzD,GAAG,CAAC,aAAa,CAAC;CAIlB,MAAM,mBAAmB,OAAO,KAAK;CACrC,gBAAgB;EACd,iBAAiB,UAAU;CAC7B,GAAG,CAAC,YAAY,CAAC;CAEjB,gBAAgB;EACd,IAAI,CAAC,aAAa,CAAC,gBAAgB,iBAAiB,SAClD;EAIF,MAAM,gBADQ,aAAa,IAAI,SACT,CAAA,CAAM,eAAe;EAC3C,IAAI,eAAe;GACjB,iBAAiB,UAAU;GAC3B,aAAa,OAAO,YAAY,YAAY;IAC1C,MAAM,GAAG,eAAe,GAAG,GAAG,SAAS,QAAQ;IAC/C,OAAO;KAAE,GAAG;KAAS,gBAAgB;IAAK;GAC5C,CAAC;GAED,UAAe,QAAQ,EAAE,SAAS,cAAc,CAAC;EACnD;CACF,GAAG;EAAC;EAAW;EAAc;EAAc;CAAS,CAAC;CAErD,IAAI,CAAC,WACH,OAAO;CAGT,OACE,oBAAC,KAAc,MAAf;EACQ;EACN,IAAI,OAAO;EACA;EACC;EACH;EACC;YAEV,qBAAC,MAAM,MAAP;GAAkB;GAAM,KAAK;aAA7B,CACE,oBAAC,MAAM,SAAP,EAAA,UACE,oBAAC,KAAc,SAAf;IAAuB,YAAW;IAA4B;IAA2B;GAAc,CAAA,EAC1F,CAAA,GACf,oBAAC,MAAM,SAAP;IAAe,SAAA;cACb,qBAAC,KAAc,SAAf,EAAA,UAAA,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf;MACG,aAAa,aACZ,oBAAC,KAAc,SAAf,EAAuB,YAAW,gDAAiD,CAAA;MAErF,oBAAC,KAAc,QAAf;OAAgC;OAAU,aAAa;MAAkB,CAAA;MACxE,aAAa,aACZ,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,OAAD;QAAK,WAAU;kBACb,oBAAC,KAAc,QAAf,EAAsB,YAAW,mCAAoC,CAAA;OAClE,CAAA;MACF,CAAA;KAEJ;QACL,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,KAAc,UAAf,EAAwB,YAAW,oEAAqE,CAAA;KACrG,CAAA,GACL,oBAAC,KAAc,QAAf;MACE,GAAI;MACJ,SAAA;MACA,QAAQ,QAAQ;MACR;MACK;KACd,CAAA,CACE;MACgB,EAAA,CAAA;GACV,CAAA,CACL;;CACM,CAAA;AAExB,CACF;AAEA,YAAY,cAAc"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { n as ChatArticle } from "./chunk-ChatArticle.mjs";
|
|
2
|
+
import { AppAnnotation } from "@dxos/app-toolkit";
|
|
3
|
+
import { Project, Skill } from "@dxos/compute";
|
|
4
|
+
import { Chat } from "@dxos/assistant-toolkit";
|
|
5
|
+
import { Entity, Filter, Obj, Ref, Type } from "@dxos/echo";
|
|
6
|
+
import { AssistantOperation } from "#types";
|
|
7
|
+
import * as Option from "effect/Option";
|
|
8
|
+
import { forwardRef, useCallback, useEffect, useMemo } from "react";
|
|
9
|
+
import { useObject, useQuery } from "@dxos/echo-react";
|
|
10
|
+
import { useAsyncEffect } from "@dxos/react-ui";
|
|
11
|
+
import { jsx } from "react/jsx-runtime";
|
|
12
|
+
import { useContextBinder } from "#hooks";
|
|
13
|
+
import { useOperationInvoker } from "@dxos/app-framework/ui";
|
|
14
|
+
import { getSpace } from "@dxos/client/echo";
|
|
15
|
+
import { SpaceOperation } from "@dxos/plugin-space";
|
|
16
|
+
import { useRegistry } from "@dxos/react-client/echo";
|
|
17
|
+
//#region src/containers/ChatCompanion/ChatCompanion.tsx
|
|
18
|
+
var ChatCompanion = forwardRef(({ role = "article", subject: chat, companionTo, attendableId }, forwardedRef) => {
|
|
19
|
+
const { invokePromise } = useOperationInvoker();
|
|
20
|
+
const db = Obj.getDatabase(companionTo);
|
|
21
|
+
useSkills$1({
|
|
22
|
+
subject: chat,
|
|
23
|
+
companionTo
|
|
24
|
+
});
|
|
25
|
+
return /* @__PURE__ */ jsx(ChatArticle, {
|
|
26
|
+
role,
|
|
27
|
+
subject: chat,
|
|
28
|
+
attendableId,
|
|
29
|
+
companionTo,
|
|
30
|
+
onSubmit: useCallback(async () => {
|
|
31
|
+
if (!db || !chat || Obj.getDatabase(chat)) return;
|
|
32
|
+
await invokePromise(SpaceOperation.AddObject, {
|
|
33
|
+
object: chat,
|
|
34
|
+
target: db
|
|
35
|
+
});
|
|
36
|
+
await invokePromise(SpaceOperation.AddRelation, {
|
|
37
|
+
db,
|
|
38
|
+
schema: Chat.CompanionTo,
|
|
39
|
+
source: chat,
|
|
40
|
+
target: companionTo
|
|
41
|
+
});
|
|
42
|
+
await invokePromise(AssistantOperation.SetCurrentChat, {
|
|
43
|
+
companionTo,
|
|
44
|
+
chat
|
|
45
|
+
});
|
|
46
|
+
await db.flush();
|
|
47
|
+
}, [
|
|
48
|
+
db,
|
|
49
|
+
chat,
|
|
50
|
+
companionTo,
|
|
51
|
+
invokePromise
|
|
52
|
+
]),
|
|
53
|
+
ref: forwardedRef
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Bind skills to the context.
|
|
58
|
+
*/
|
|
59
|
+
var useSkills$1 = ({ subject: chat, companionTo }) => {
|
|
60
|
+
const registry = useRegistry();
|
|
61
|
+
const space = getSpace(companionTo);
|
|
62
|
+
const [feedSnapshot] = useObject(chat?.feed);
|
|
63
|
+
const binder = useContextBinder(space, Obj.getReactiveOrUndefined(feedSnapshot));
|
|
64
|
+
const skillKeys = useMemo(() => {
|
|
65
|
+
const schema = companionTo ? Obj.getType(companionTo) : void 0;
|
|
66
|
+
if (!schema) return [];
|
|
67
|
+
return Option.getOrElse(() => [])(AppAnnotation.SkillsAnnotation.get(Type.getSchema(schema)));
|
|
68
|
+
}, [companionTo]);
|
|
69
|
+
const existingSkills = useQuery(space?.db, Filter.type(Skill.Skill));
|
|
70
|
+
const pluginSkills = useMemo(() => existingSkills.filter((skill) => {
|
|
71
|
+
const key = Obj.getMeta(skill).key;
|
|
72
|
+
return key !== void 0 && skillKeys.includes(key);
|
|
73
|
+
}), [existingSkills, skillKeys]);
|
|
74
|
+
const [instructionsSnapshot] = useObject(Obj.instanceOf(Project.Project, companionTo) ? companionTo.instructions : void 0);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (!chat || chat.instructions || !Obj.instanceOf(Project.Project, companionTo)) return;
|
|
77
|
+
const instructionsRef = companionTo.instructions;
|
|
78
|
+
if (instructionsRef) Obj.update(chat, (chat) => {
|
|
79
|
+
chat.instructions = instructionsRef;
|
|
80
|
+
});
|
|
81
|
+
}, [
|
|
82
|
+
chat,
|
|
83
|
+
companionTo,
|
|
84
|
+
instructionsSnapshot
|
|
85
|
+
]);
|
|
86
|
+
useAsyncEffect(async () => {
|
|
87
|
+
if (!binder?.isOpen) return;
|
|
88
|
+
if (skillKeys.length > 0) {
|
|
89
|
+
const registryKeys = skillKeys.filter((key) => {
|
|
90
|
+
const candidate = registry.list().find((e) => Entity.getMeta(e)?.key === key);
|
|
91
|
+
return candidate != null && Obj.instanceOf(Skill.Skill, candidate);
|
|
92
|
+
});
|
|
93
|
+
const dbForks = pluginSkills.filter((bp) => !registryKeys.includes(Obj.getMeta(bp).key ?? ""));
|
|
94
|
+
if (registryKeys.length > 0) await binder.bind({ skills: registryKeys.map((key) => Ref.fromURI(Skill.registryURI(key))) });
|
|
95
|
+
if (dbForks.length > 0) await binder.bind({ skills: dbForks.map((skill) => Ref.make(skill)) });
|
|
96
|
+
}
|
|
97
|
+
if (Obj.instanceOf(Skill.Skill, companionTo)) await binder.bind({ skills: [Ref.make(companionTo)] });
|
|
98
|
+
else await binder.bind({ objects: [Ref.make(companionTo)] });
|
|
99
|
+
if (Obj.instanceOf(Project.Project, companionTo)) {
|
|
100
|
+
const bindings = Project.contextBindings(companionTo);
|
|
101
|
+
if (bindings.skills.length > 0) await binder.bind({ skills: bindings.skills });
|
|
102
|
+
if (bindings.objects.length > 0) await binder.bind({ objects: bindings.objects });
|
|
103
|
+
}
|
|
104
|
+
}, [
|
|
105
|
+
binder,
|
|
106
|
+
skillKeys,
|
|
107
|
+
pluginSkills,
|
|
108
|
+
companionTo,
|
|
109
|
+
instructionsSnapshot
|
|
110
|
+
]);
|
|
111
|
+
};
|
|
112
|
+
ChatCompanion.displayName = "ChatCompanion";
|
|
113
|
+
//#endregion
|
|
114
|
+
export { ChatCompanion as default };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=chunk-ChatCompanion.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ChatCompanion.mjs","names":[],"sources":["../../src/containers/ChatCompanion/ChatCompanion.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { forwardRef, useCallback, useEffect, useMemo } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppAnnotation } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { getSpace } from '@dxos/client/echo';\nimport { Project, Skill } from '@dxos/compute';\nimport { Entity, Filter, Obj, Ref, Type } from '@dxos/echo';\nimport { useObject, useQuery } from '@dxos/echo-react';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { useRegistry } from '@dxos/react-client/echo';\nimport { useAsyncEffect } from '@dxos/react-ui';\n\nimport { useContextBinder } from '#hooks';\nimport { AssistantOperation } from '#types';\n\nimport ChatArticle from '../ChatArticle';\n\nexport type ChatCompanionProps = AppSurface.ArticleProps<Chat.Chat, {}, Obj.Unknown>;\n\nexport const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(\n ({ role = 'article', subject: chat, companionTo, attendableId }, forwardedRef) => {\n const { invokePromise } = useOperationInvoker();\n const db = Obj.getDatabase(companionTo);\n useSkills({ subject: chat, companionTo });\n\n // Persist (and flush) a transient chat before the first request so the agent can resolve\n // the now-durable conversation feed; subsequent submits are a no-op once persisted.\n const handleSubmit = useCallback(async () => {\n if (!db || !chat || Obj.getDatabase(chat)) {\n return;\n }\n\n await invokePromise(SpaceOperation.AddObject, {\n object: chat,\n target: db,\n });\n await invokePromise(SpaceOperation.AddRelation, {\n db,\n schema: Chat.CompanionTo,\n source: chat,\n target: companionTo,\n });\n await invokePromise(AssistantOperation.SetCurrentChat, {\n companionTo,\n chat,\n });\n await db.flush();\n }, [db, chat, companionTo, invokePromise]);\n\n return (\n <ChatArticle\n role={role}\n subject={chat}\n attendableId={attendableId}\n companionTo={companionTo}\n onSubmit={handleSubmit}\n ref={forwardedRef}\n />\n );\n },\n);\n\n/**\n * Bind skills to the context.\n */\n// TODO(burdon): Why is this only in the companion?\nconst useSkills = ({ subject: chat, companionTo }: Pick<ChatCompanionProps, 'subject' | 'companionTo'>) => {\n const registry = useRegistry();\n const space = getSpace(companionTo);\n const [feedSnapshot] = useObject(chat?.feed);\n const feedTarget = Obj.getReactiveOrUndefined(feedSnapshot);\n const binder = useContextBinder(space, feedTarget);\n\n const skillKeys = useMemo(() => {\n const schema = companionTo ? Obj.getType(companionTo) : undefined;\n if (!schema) {\n return [] as string[];\n }\n\n return Option.getOrElse(() => [] as string[])(AppAnnotation.SkillsAnnotation.get(Type.getSchema(schema)));\n }, [companionTo]);\n\n const existingSkills = useQuery(space?.db, Filter.type(Skill.Skill));\n const pluginSkills = useMemo(\n () =>\n existingSkills.filter((skill) => {\n const key = Obj.getMeta(skill).key;\n return key !== undefined && skillKeys.includes(key);\n }),\n [existingSkills, skillKeys],\n );\n\n // Subscribe so a project's instructions ref resolving after the project object itself (e.g. loading\n // over the wire) re-triggers the effects below, mirroring the `feedSnapshot` subscription above.\n const [instructionsSnapshot] = useObject(\n Obj.instanceOf(Project.Project, companionTo) ? companionTo.instructions : undefined,\n );\n\n // Steer the chat with the project's instructions BY REFERENCE (chat.instructions → system prompt at\n // request time). Also the lazy backfill: pre-existing project chats without the field pick it up here.\n useEffect(() => {\n if (!chat || chat.instructions || !Obj.instanceOf(Project.Project, companionTo)) {\n return;\n }\n const instructionsRef = companionTo.instructions;\n if (instructionsRef) {\n Obj.update(chat, (chat) => {\n chat.instructions = instructionsRef;\n });\n }\n }, [chat, companionTo, instructionsSnapshot]);\n\n useAsyncEffect(async () => {\n if (!binder?.isOpen) {\n return;\n }\n\n // Bind annotated skills: use key URI for registry skills (no DB clone needed).\n if (skillKeys.length > 0) {\n const registryKeys = skillKeys.filter((key) => {\n const candidate = registry.list().find((e) => Entity.getMeta(e)?.key === key);\n return candidate != null && Obj.instanceOf(Skill.Skill, candidate);\n });\n\n // DB-forked skills (in space but not in registry).\n const dbForks = pluginSkills.filter((bp) => !registryKeys.includes(Obj.getMeta(bp).key ?? ''));\n if (registryKeys.length > 0) {\n await binder.bind({ skills: registryKeys.map((key) => Ref.fromURI(Skill.registryURI(key))) });\n }\n if (dbForks.length > 0) {\n await binder.bind({ skills: dbForks.map((skill) => Ref.make(skill)) });\n }\n }\n\n if (Obj.instanceOf(Skill.Skill, companionTo)) {\n await binder.bind({ skills: [Ref.make(companionTo)] });\n } else {\n await binder.bind({ objects: [Ref.make(companionTo)] });\n }\n\n // Bind the project's skills and context objects into the session (instructions text travels\n // via chat.instructions, set above).\n if (Obj.instanceOf(Project.Project, companionTo)) {\n const bindings = Project.contextBindings(companionTo);\n if (bindings.skills.length > 0) {\n await binder.bind({ skills: bindings.skills });\n }\n if (bindings.objects.length > 0) {\n await binder.bind({ objects: bindings.objects });\n }\n }\n }, [binder, skillKeys, pluginSkills, companionTo, instructionsSnapshot]);\n};\n\nChatCompanion.displayName = 'ChatCompanion';\n"],"mappings":"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"}
|