@dxos/plugin-assistant 0.10.0 → 0.11.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/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
|
@@ -103,7 +103,7 @@ export const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) =>
|
|
|
103
103
|
// Plain `List`/`ListItem` (non-select), with the trigger editor's "fatter" two-line row
|
|
104
104
|
// treatment: a name line plus a secondary meta line, on a surface-styled row. Rows are
|
|
105
105
|
// actioned via their trailing buttons (no selection semantics).
|
|
106
|
-
<List variant='unordered' className='flex flex-col gap-1 grow
|
|
106
|
+
<List variant='unordered' className='flex flex-col gap-1 grow w-full text-left'>
|
|
107
107
|
{state.models.map((model) => {
|
|
108
108
|
const running = loaded.get(model.name);
|
|
109
109
|
const error = state.errors[model.name];
|
|
@@ -116,7 +116,7 @@ export const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) =>
|
|
|
116
116
|
return (
|
|
117
117
|
<ListItem
|
|
118
118
|
key={model.name}
|
|
119
|
-
className='flex flex-col gap-0.5 rounded-sm
|
|
119
|
+
className='flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full'
|
|
120
120
|
>
|
|
121
121
|
<div className='flex items-center gap-2'>
|
|
122
122
|
<span className='grow truncate font-medium'>{model.name}</span>
|
|
@@ -157,7 +157,7 @@ export const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) =>
|
|
|
157
157
|
? t('settings.ollama.pulling.message', { percent: percentOf(progress) })
|
|
158
158
|
: (progress?.status ?? t('settings.ollama.pulling.label'));
|
|
159
159
|
return (
|
|
160
|
-
<ListItem key={name} className='flex flex-col gap-0.5 rounded-sm
|
|
160
|
+
<ListItem key={name} className='flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full'>
|
|
161
161
|
<div className='flex items-center gap-2'>
|
|
162
162
|
<span className='grow truncate font-medium text-description'>{name}</span>
|
|
163
163
|
<IconButton
|
|
@@ -193,7 +193,7 @@ export const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) =>
|
|
|
193
193
|
onValueChange={() => {}}
|
|
194
194
|
placeholder={t('settings.ollama.pull.placeholder')}
|
|
195
195
|
>
|
|
196
|
-
<Combobox.Trigger classNames='
|
|
196
|
+
<Combobox.Trigger classNames='w-full' />
|
|
197
197
|
<Combobox.Portal>
|
|
198
198
|
<Combobox.Content>
|
|
199
199
|
<Combobox.Input
|
|
@@ -253,3 +253,5 @@ const formatBytes = (bytes: number): string => {
|
|
|
253
253
|
}
|
|
254
254
|
return `${value.toFixed(unit === 0 ? 0 : 1)} ${UNITS[unit]}`;
|
|
255
255
|
};
|
|
256
|
+
|
|
257
|
+
OllamaModels.displayName = 'OllamaModels';
|
|
@@ -2,29 +2,85 @@
|
|
|
2
2
|
// Copyright 2026 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as LanguageModel from '@effect/ai/LanguageModel';
|
|
5
6
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
7
|
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Layer from 'effect/Layer';
|
|
7
9
|
import React from 'react';
|
|
10
|
+
import { expect, userEvent, waitFor } from 'storybook/test';
|
|
8
11
|
|
|
9
|
-
import {
|
|
12
|
+
import { type AiService } from '@dxos/ai';
|
|
13
|
+
import { ScriptedLanguageModel, SERVICES_CONFIG } from '@dxos/ai/testing';
|
|
10
14
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
11
15
|
import { AppActivationEvents } from '@dxos/app-toolkit';
|
|
12
16
|
import { Chat } from '@dxos/assistant-toolkit';
|
|
13
17
|
import { capabilities } from '@dxos/assistant-toolkit/testing';
|
|
14
18
|
import { Feed, Filter, Ref } from '@dxos/echo';
|
|
19
|
+
import { useQuery } from '@dxos/echo-react';
|
|
15
20
|
import { ClientPlugin, initializeIdentity } from '@dxos/plugin-client/testing';
|
|
16
21
|
import { PreviewPlugin } from '@dxos/plugin-preview/testing';
|
|
17
22
|
import { RoutinePlugin } from '@dxos/plugin-routine/testing';
|
|
18
23
|
import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
|
|
19
24
|
import { Config } from '@dxos/react-client';
|
|
20
|
-
import {
|
|
25
|
+
import { useSpaces } from '@dxos/react-client/echo';
|
|
21
26
|
import { Loading, withTheme } from '@dxos/react-ui/testing';
|
|
27
|
+
import { Message } from '@dxos/types';
|
|
22
28
|
|
|
23
29
|
import { translations } from '#translations';
|
|
24
30
|
|
|
25
31
|
import { AssistantPlugin } from '../../AssistantPlugin';
|
|
26
32
|
import { ChatArticle } from './ChatArticle';
|
|
27
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Replaces the AI service the plugin would build with a scripted model, so a story can drive the real
|
|
36
|
+
* request loop offline and deterministically.
|
|
37
|
+
*
|
|
38
|
+
* The model is built **once** and shared across requests. Constructing it per request — the obvious
|
|
39
|
+
* shape, since `model()` returns a layer — gives each request its own cursor, so every turn replays the
|
|
40
|
+
* first reply and a multi-turn story silently answers itself wrongly.
|
|
41
|
+
*
|
|
42
|
+
* Inert until something submits: the model is only consulted on a request, so stories that never submit
|
|
43
|
+
* are unaffected. The script is exhausted rather than looped, so submitting more often than there are
|
|
44
|
+
* replies fails loudly instead of hanging.
|
|
45
|
+
*/
|
|
46
|
+
const scriptedAiServiceMiddleware = (replies: readonly string[]) => {
|
|
47
|
+
const model = Effect.runSync(
|
|
48
|
+
ScriptedLanguageModel.makeScriptedLanguageModel(
|
|
49
|
+
replies.map((reply) => ({ parts: [ScriptedLanguageModel.text(reply)] })),
|
|
50
|
+
),
|
|
51
|
+
);
|
|
52
|
+
const layer = Layer.succeed(LanguageModel.LanguageModel, model);
|
|
53
|
+
return (_upstream: AiService.Service) => ({ model: () => layer });
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Types into the chat prompt and submits.
|
|
58
|
+
*
|
|
59
|
+
* The thread renders its own CodeMirror instance (read-only, but still `contenteditable`), so an
|
|
60
|
+
* unscoped `.cm-content` lookup is ambiguous; `ChatPrompt` wraps the real editor in a `role="group"`.
|
|
61
|
+
*/
|
|
62
|
+
const submitPrompt = async (canvasElement: HTMLElement, text: string) => {
|
|
63
|
+
const content = await waitFor(
|
|
64
|
+
() => {
|
|
65
|
+
const element = canvasElement.querySelector<HTMLElement>('[role="group"] .cm-content');
|
|
66
|
+
if (!element) {
|
|
67
|
+
throw new Error('Prompt editor not found.');
|
|
68
|
+
}
|
|
69
|
+
return element;
|
|
70
|
+
},
|
|
71
|
+
{ timeout: 15_000, interval: 300 },
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
await userEvent.click(content);
|
|
75
|
+
await userEvent.type(content, text);
|
|
76
|
+
await userEvent.keyboard('{Enter}');
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
type StoryProps = {
|
|
80
|
+
/** Turns the story drives: each prompt is submitted, and its reply is what the scripted model returns. */
|
|
81
|
+
messages?: { prompt: string; reply: string }[];
|
|
82
|
+
};
|
|
83
|
+
|
|
28
84
|
const DefaultStory = () => {
|
|
29
85
|
const [space] = useSpaces();
|
|
30
86
|
const [chat] = useQuery(space?.db, Filter.type(Chat.Chat));
|
|
@@ -40,39 +96,156 @@ const meta = {
|
|
|
40
96
|
render: DefaultStory,
|
|
41
97
|
decorators: [
|
|
42
98
|
withTheme(),
|
|
43
|
-
withPluginManager({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
99
|
+
withPluginManager<StoryProps>(({ args: { messages = [] } }) => {
|
|
100
|
+
return {
|
|
101
|
+
setupEvents: [AppActivationEvents.SetupSettings],
|
|
102
|
+
plugins: [
|
|
103
|
+
...corePlugins(),
|
|
104
|
+
ClientPlugin({
|
|
105
|
+
types: [Chat.Chat, Feed.Feed, Message.Message],
|
|
106
|
+
config: new Config({ runtime: { services: SERVICES_CONFIG.REMOTE } }),
|
|
107
|
+
onClientInitialized: ({ client }) =>
|
|
108
|
+
Effect.gen(function* () {
|
|
109
|
+
yield* initializeIdentity(client);
|
|
110
|
+
const [space] = client.spaces.get();
|
|
111
|
+
yield* Effect.promise(() => space.waitUntilReady());
|
|
112
|
+
const feed = space.db.add(Feed.make());
|
|
113
|
+
space.db.add(Chat.make({ name: 'Test', feed: Ref.make(feed) }));
|
|
114
|
+
|
|
115
|
+
yield* Effect.promise(() => space.db.flush({ indexes: true }));
|
|
116
|
+
}),
|
|
117
|
+
}),
|
|
118
|
+
RoutinePlugin(),
|
|
119
|
+
AssistantPlugin({
|
|
120
|
+
// Only the stories that declare their turns are scripted; the rest keep the real service, so
|
|
121
|
+
// `Default` stays a place to actually talk to a model rather than one with an empty script.
|
|
122
|
+
aiServiceMiddleware:
|
|
123
|
+
messages.length > 0 ? scriptedAiServiceMiddleware(messages.map(({ reply }) => reply)) : undefined,
|
|
124
|
+
}),
|
|
125
|
+
PreviewPlugin(),
|
|
126
|
+
StorybookPlugin({}),
|
|
127
|
+
],
|
|
128
|
+
capabilities,
|
|
129
|
+
};
|
|
66
130
|
}),
|
|
67
131
|
],
|
|
68
132
|
parameters: {
|
|
69
133
|
layout: 'fullscreen',
|
|
70
134
|
translations,
|
|
71
135
|
},
|
|
72
|
-
} satisfies Meta<
|
|
136
|
+
} satisfies Meta<StoryProps>;
|
|
73
137
|
|
|
74
138
|
export default meta;
|
|
75
139
|
|
|
76
|
-
type Story = StoryObj<
|
|
140
|
+
type Story = StoryObj<StoryProps>;
|
|
77
141
|
|
|
78
142
|
export const Default: Story = {};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Drives the real request loop against the scripted model — no network and no seeded feed. This is the
|
|
146
|
+
* precondition for exercising rewind against turns the app itself produced.
|
|
147
|
+
*/
|
|
148
|
+
export const Scripted: Story = {
|
|
149
|
+
args: {
|
|
150
|
+
messages: [
|
|
151
|
+
{
|
|
152
|
+
prompt: 'What is a feed?',
|
|
153
|
+
reply: 'A feed is an append-only log.',
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
play: async ({ canvasElement, args: { messages = [] } }) => {
|
|
158
|
+
const { prompt, reply } = messages[0];
|
|
159
|
+
await submitPrompt(canvasElement, prompt);
|
|
160
|
+
await waitFor(() => void expect(canvasElement.textContent ?? '').toContain(reply), {
|
|
161
|
+
timeout: 20_000,
|
|
162
|
+
interval: 300,
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Soft fork ("rewind") driven entirely through the UI, over a realistic conversation: a greeting, then a
|
|
169
|
+
* question, then a rewind of that question, then the same question asked differently.
|
|
170
|
+
*
|
|
171
|
+
* Rewinding is edit-and-resend: the prompt and its answer both leave the thread and the prompt text comes
|
|
172
|
+
* back in the composer. The greeting survives, because it precedes the rewind point. The resend then
|
|
173
|
+
* continues from the greeting, so the abandoned pair never rejoins the conversation.
|
|
174
|
+
*/
|
|
175
|
+
export const Rewind: Story = {
|
|
176
|
+
args: {
|
|
177
|
+
messages: [
|
|
178
|
+
{ prompt: 'Hello', reply: 'Hi — how can I help?' },
|
|
179
|
+
{ prompt: 'What is a feed?', reply: 'A feed is an append-only log.' },
|
|
180
|
+
{ prompt: 'What is a feed, in one sentence?', reply: 'An append-only log of immutable blocks.' },
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
play: async ({ canvasElement, args: { messages = [] } }) => {
|
|
184
|
+
const [greeting, asked, revised] = messages;
|
|
185
|
+
const toolbars = () => canvasElement.querySelectorAll<HTMLElement>('[data-testid="chat.rewind"]');
|
|
186
|
+
|
|
187
|
+
// Greeting, then the question.
|
|
188
|
+
await submitPrompt(canvasElement, greeting.prompt);
|
|
189
|
+
await waitFor(() => void expect(threadText(canvasElement)).toContain(greeting.reply), {
|
|
190
|
+
timeout: 8_000,
|
|
191
|
+
interval: 200,
|
|
192
|
+
});
|
|
193
|
+
await submitPrompt(canvasElement, asked.prompt);
|
|
194
|
+
await waitFor(() => void expect(threadText(canvasElement)).toContain(asked.reply), {
|
|
195
|
+
timeout: 8_000,
|
|
196
|
+
interval: 200,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Let the reply finish streaming, so the rewind forks a settled turn.
|
|
200
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
201
|
+
await waitFor(() => void expect(toolbars()).toHaveLength(2), { timeout: 5_000, interval: 200 });
|
|
202
|
+
|
|
203
|
+
// Rewind the question — the second prompt's toolbar.
|
|
204
|
+
toolbars()[1].click();
|
|
205
|
+
|
|
206
|
+
// The question and its answer leave the thread, and the greeting is untouched.
|
|
207
|
+
await waitFor(() => void expect(threadText(canvasElement)).not.toContain(asked.reply), {
|
|
208
|
+
timeout: 5_000,
|
|
209
|
+
interval: 200,
|
|
210
|
+
});
|
|
211
|
+
await expect(threadText(canvasElement)).not.toContain(asked.prompt);
|
|
212
|
+
await expect(threadText(canvasElement)).toContain(greeting.prompt);
|
|
213
|
+
await expect(threadText(canvasElement)).toContain(greeting.reply);
|
|
214
|
+
|
|
215
|
+
// Edit-and-resend: the question comes back in the composer, ready to be revised.
|
|
216
|
+
await expect(composerText(canvasElement)).toContain(asked.prompt);
|
|
217
|
+
|
|
218
|
+
// Ask it differently. The answer continues from the greeting, so the abandoned pair stays gone.
|
|
219
|
+
await clearPrompt(canvasElement);
|
|
220
|
+
await submitPrompt(canvasElement, revised.prompt);
|
|
221
|
+
await waitFor(() => void expect(threadText(canvasElement)).toContain(revised.reply), {
|
|
222
|
+
timeout: 8_000,
|
|
223
|
+
interval: 200,
|
|
224
|
+
});
|
|
225
|
+
await expect(threadText(canvasElement)).toContain(revised.prompt);
|
|
226
|
+
await expect(threadText(canvasElement)).not.toContain(asked.reply);
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* The rendered conversation, excluding the composer — both are CodeMirror instances, and the composer
|
|
232
|
+
* holds the restored prompt after a rewind, so an unscoped read cannot tell "still in the thread" from
|
|
233
|
+
* "waiting to be resent".
|
|
234
|
+
*/
|
|
235
|
+
const threadText = (canvasElement: HTMLElement) =>
|
|
236
|
+
Array.from(canvasElement.querySelectorAll<HTMLElement>('.cm-content'))
|
|
237
|
+
.filter((element) => !element.closest('[role="group"]'))
|
|
238
|
+
.map((element) => element.textContent ?? '')
|
|
239
|
+
.join('\n');
|
|
240
|
+
|
|
241
|
+
const composerText = (canvasElement: HTMLElement) =>
|
|
242
|
+
canvasElement.querySelector<HTMLElement>('[role="group"] .cm-content')?.textContent ?? '';
|
|
243
|
+
|
|
244
|
+
/** Empties the composer, so a restored prompt can be replaced rather than appended to. */
|
|
245
|
+
const clearPrompt = async (canvasElement: HTMLElement) => {
|
|
246
|
+
const content = canvasElement.querySelector<HTMLElement>('[role="group"] .cm-content');
|
|
247
|
+
if (content) {
|
|
248
|
+
await userEvent.click(content);
|
|
249
|
+
await userEvent.keyboard('{Control>}a{/Control}{Backspace}');
|
|
250
|
+
}
|
|
251
|
+
};
|
|
@@ -10,12 +10,13 @@ import { useAtomCapability, useCapability, useOperationInvoker } from '@dxos/app
|
|
|
10
10
|
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
11
11
|
import { getSpace } from '@dxos/client/echo';
|
|
12
12
|
import { type Obj } from '@dxos/echo';
|
|
13
|
+
import { useObject } from '@dxos/echo-react';
|
|
13
14
|
import { ClientOperation } from '@dxos/plugin-client';
|
|
14
|
-
import {
|
|
15
|
+
import { useRegistry } from '@dxos/react-client/echo';
|
|
15
16
|
import { Panel } from '@dxos/react-ui';
|
|
16
17
|
|
|
17
18
|
import { Chat as ChatComponent, type ChatRootProps } from '#components';
|
|
18
|
-
import { useChatProcessor, useChatServices, usePresets } from '#hooks';
|
|
19
|
+
import { useChatProcessor, useChatServices, usePresets, useSelectionContext } from '#hooks';
|
|
19
20
|
import { type Assistant, AssistantCapabilities, type ChatType } from '#types';
|
|
20
21
|
|
|
21
22
|
export type ChatArticleProps = AppSurface.ObjectSectionProps<ChatType.Chat> & {
|
|
@@ -36,6 +37,7 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
|
|
|
36
37
|
// The provider is configured in settings; the chat surfaces it as a read-only online indicator.
|
|
37
38
|
const online = preset?.provider === Provider.edge.id;
|
|
38
39
|
const processor = useChatProcessor({ space, chat, preset, runtime, registry, settings });
|
|
40
|
+
const getContext = useSelectionContext(companionTo);
|
|
39
41
|
|
|
40
42
|
// Subscribe to the view type via `useObject` so the thread re-renders when ChatOptions changes it;
|
|
41
43
|
// a direct `chat.viewType` read in render does not establish a reactive dependency.
|
|
@@ -77,14 +79,24 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
|
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
return (
|
|
80
|
-
<ChatComponent.Root
|
|
82
|
+
<ChatComponent.Root
|
|
83
|
+
chat={chat}
|
|
84
|
+
db={space?.db}
|
|
85
|
+
processor={processor}
|
|
86
|
+
getContext={getContext}
|
|
87
|
+
onEvent={onEvent}
|
|
88
|
+
onSubmit={onSubmit}
|
|
89
|
+
>
|
|
81
90
|
<Panel.Root role={role} ref={forwardedRef}>
|
|
82
91
|
<Panel.Toolbar>
|
|
83
92
|
<ChatComponent.Toolbar classNames='dx-document' attendableId={attendableId} companionTo={companionTo} />
|
|
84
93
|
</Panel.Toolbar>
|
|
85
|
-
<Panel.Content>
|
|
94
|
+
<Panel.Content asChild>
|
|
86
95
|
<ChatComponent.Content>
|
|
87
96
|
<div className='dx-container relative'>
|
|
97
|
+
{viewType !== 'summary' && (
|
|
98
|
+
<ChatComponent.Minimap classNames='absolute left-0 top-1/2 -translate-y-1/2 z-10' />
|
|
99
|
+
)}
|
|
88
100
|
<ChatComponent.Thread viewType={viewType} onViewUsage={handleViewUsage} />
|
|
89
101
|
{viewType !== 'summary' && (
|
|
90
102
|
<div className='absolute bottom-2 left-0 right-0'>
|
|
@@ -98,7 +110,13 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
|
|
|
98
110
|
<div className='flex flex-col items-center py-2 overflow-hidden'>
|
|
99
111
|
<ChatComponent.TaskList classNames='max-h-[120px] border border-separator rounded-sm text-description' />
|
|
100
112
|
</div>
|
|
101
|
-
<ChatComponent.Prompt
|
|
113
|
+
<ChatComponent.Prompt
|
|
114
|
+
{...chatProps}
|
|
115
|
+
outline
|
|
116
|
+
preset={preset?.id}
|
|
117
|
+
online={online}
|
|
118
|
+
companionTo={companionTo}
|
|
119
|
+
/>
|
|
102
120
|
</div>
|
|
103
121
|
</ChatComponent.Content>
|
|
104
122
|
</Panel.Content>
|
|
@@ -107,3 +125,5 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
|
|
|
107
125
|
);
|
|
108
126
|
},
|
|
109
127
|
);
|
|
128
|
+
|
|
129
|
+
ChatArticle.displayName = 'ChatArticle';
|
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import * as Option from 'effect/Option';
|
|
6
|
-
import React, { forwardRef, useCallback, useMemo } from 'react';
|
|
6
|
+
import React, { forwardRef, useCallback, useEffect, useMemo } from 'react';
|
|
7
7
|
|
|
8
8
|
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
9
9
|
import { AppAnnotation } from '@dxos/app-toolkit';
|
|
10
10
|
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
11
11
|
import { Chat } from '@dxos/assistant-toolkit';
|
|
12
12
|
import { getSpace } from '@dxos/client/echo';
|
|
13
|
-
import { Skill } from '@dxos/compute';
|
|
13
|
+
import { Project, Skill } from '@dxos/compute';
|
|
14
14
|
import { Entity, Filter, Obj, Ref, Type } from '@dxos/echo';
|
|
15
|
+
import { useObject, useQuery } from '@dxos/echo-react';
|
|
15
16
|
import { SpaceOperation } from '@dxos/plugin-space';
|
|
16
|
-
import {
|
|
17
|
+
import { useRegistry } from '@dxos/react-client/echo';
|
|
17
18
|
import { useAsyncEffect } from '@dxos/react-ui';
|
|
18
19
|
|
|
19
20
|
import { useContextBinder } from '#hooks';
|
|
@@ -26,22 +27,22 @@ export type ChatCompanionProps = AppSurface.ArticleProps<Chat.Chat, {}, Obj.Unkn
|
|
|
26
27
|
export const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(
|
|
27
28
|
({ role = 'article', subject: chat, companionTo, attendableId }, forwardedRef) => {
|
|
28
29
|
const { invokePromise } = useOperationInvoker();
|
|
29
|
-
const
|
|
30
|
+
const db = Obj.getDatabase(companionTo);
|
|
30
31
|
useSkills({ subject: chat, companionTo });
|
|
31
32
|
|
|
32
33
|
// Persist (and flush) a transient chat before the first request so the agent can resolve
|
|
33
34
|
// the now-durable conversation feed; subsequent submits are a no-op once persisted.
|
|
34
35
|
const handleSubmit = useCallback(async () => {
|
|
35
|
-
if (!
|
|
36
|
+
if (!db || !chat || Obj.getDatabase(chat)) {
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
await invokePromise(SpaceOperation.AddObject, {
|
|
40
41
|
object: chat,
|
|
41
|
-
target:
|
|
42
|
+
target: db,
|
|
42
43
|
});
|
|
43
44
|
await invokePromise(SpaceOperation.AddRelation, {
|
|
44
|
-
db
|
|
45
|
+
db,
|
|
45
46
|
schema: Chat.CompanionTo,
|
|
46
47
|
source: chat,
|
|
47
48
|
target: companionTo,
|
|
@@ -50,8 +51,8 @@ export const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(
|
|
|
50
51
|
companionTo,
|
|
51
52
|
chat,
|
|
52
53
|
});
|
|
53
|
-
await
|
|
54
|
-
}, [
|
|
54
|
+
await db.flush();
|
|
55
|
+
}, [db, chat, companionTo, invokePromise]);
|
|
55
56
|
|
|
56
57
|
return (
|
|
57
58
|
<ChatArticle
|
|
@@ -96,6 +97,26 @@ const useSkills = ({ subject: chat, companionTo }: Pick<ChatCompanionProps, 'sub
|
|
|
96
97
|
[existingSkills, skillKeys],
|
|
97
98
|
);
|
|
98
99
|
|
|
100
|
+
// Subscribe so a project's instructions ref resolving after the project object itself (e.g. loading
|
|
101
|
+
// over the wire) re-triggers the effects below, mirroring the `feedSnapshot` subscription above.
|
|
102
|
+
const [instructionsSnapshot] = useObject(
|
|
103
|
+
Obj.instanceOf(Project.Project, companionTo) ? companionTo.instructions : undefined,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
// Steer the chat with the project's instructions BY REFERENCE (chat.instructions → system prompt at
|
|
107
|
+
// request time). Also the lazy backfill: pre-existing project chats without the field pick it up here.
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (!chat || chat.instructions || !Obj.instanceOf(Project.Project, companionTo)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const instructionsRef = companionTo.instructions;
|
|
113
|
+
if (instructionsRef) {
|
|
114
|
+
Obj.update(chat, (chat) => {
|
|
115
|
+
chat.instructions = instructionsRef;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}, [chat, companionTo, instructionsSnapshot]);
|
|
119
|
+
|
|
99
120
|
useAsyncEffect(async () => {
|
|
100
121
|
if (!binder?.isOpen) {
|
|
101
122
|
return;
|
|
@@ -123,5 +144,19 @@ const useSkills = ({ subject: chat, companionTo }: Pick<ChatCompanionProps, 'sub
|
|
|
123
144
|
} else {
|
|
124
145
|
await binder.bind({ objects: [Ref.make(companionTo)] });
|
|
125
146
|
}
|
|
126
|
-
|
|
147
|
+
|
|
148
|
+
// Bind the project's skills and context objects into the session (instructions text travels
|
|
149
|
+
// via chat.instructions, set above).
|
|
150
|
+
if (Obj.instanceOf(Project.Project, companionTo)) {
|
|
151
|
+
const bindings = Project.contextBindings(companionTo);
|
|
152
|
+
if (bindings.skills.length > 0) {
|
|
153
|
+
await binder.bind({ skills: bindings.skills });
|
|
154
|
+
}
|
|
155
|
+
if (bindings.objects.length > 0) {
|
|
156
|
+
await binder.bind({ objects: bindings.objects });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}, [binder, skillKeys, pluginSkills, companionTo, instructionsSnapshot]);
|
|
127
160
|
};
|
|
161
|
+
|
|
162
|
+
ChatCompanion.displayName = 'ChatCompanion';
|
|
@@ -8,7 +8,8 @@ import { Provider } from '@dxos/ai';
|
|
|
8
8
|
import { useAtomCapability } from '@dxos/app-framework/ui';
|
|
9
9
|
import { type Chat as ChatTypes } from '@dxos/assistant-toolkit';
|
|
10
10
|
import { Obj } from '@dxos/echo';
|
|
11
|
-
import { useObject
|
|
11
|
+
import { useObject } from '@dxos/echo-react';
|
|
12
|
+
import { useRegistry } from '@dxos/react-client/echo';
|
|
12
13
|
import { useTranslation } from '@dxos/react-ui';
|
|
13
14
|
import { ChatDialog as NaturalChatDialog } from '@dxos/react-ui-chat';
|
|
14
15
|
|
|
@@ -68,3 +69,5 @@ export const ChatDialog = ({ chat }: ChatDialogProps) => {
|
|
|
68
69
|
</Chat.Root>
|
|
69
70
|
);
|
|
70
71
|
};
|
|
72
|
+
|
|
73
|
+
ChatDialog.displayName = 'ChatDialog';
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { useCapabilities } from '@dxos/app-framework/ui';
|
|
8
8
|
import { useActiveSpace } from '@dxos/app-toolkit/ui';
|
|
9
|
-
import { Connector,
|
|
9
|
+
import { Connector, type ConnectorEntry } from '@dxos/plugin-connector';
|
|
10
10
|
import { Icon, useTranslation } from '@dxos/react-ui';
|
|
11
11
|
|
|
12
|
+
import { ConnectorAuthMenu } from '#components';
|
|
12
13
|
import { meta } from '#meta';
|
|
13
14
|
|
|
14
15
|
export type IntegrationPromptProps = {
|
|
@@ -19,7 +20,7 @@ export type IntegrationPromptProps = {
|
|
|
19
20
|
/**
|
|
20
21
|
* Agent-facing connector prompt: rendered when the assistant needs a service the user has not yet
|
|
21
22
|
* connected. Resolves the matching {@link Connector} entries for `service` and offers to connect via
|
|
22
|
-
* the shared connector-auth
|
|
23
|
+
* the shared connector-auth menu, so the user can grant access inline instead of the agent failing
|
|
23
24
|
* silently.
|
|
24
25
|
*/
|
|
25
26
|
export const IntegrationPrompt = ({ service }: IntegrationPromptProps) => {
|
|
@@ -27,13 +28,13 @@ export const IntegrationPrompt = ({ service }: IntegrationPromptProps) => {
|
|
|
27
28
|
const space = useActiveSpace();
|
|
28
29
|
const connectors = useCapabilities(Connector).flat();
|
|
29
30
|
const matched = useMemo(() => (service ? matchConnectors(connectors, service) : []), [connectors, service]);
|
|
31
|
+
const connectorIds = useMemo(() => matched.map((connector) => connector.id), [matched]);
|
|
30
32
|
|
|
31
33
|
if (!service) {
|
|
32
34
|
return null;
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
const label = matched[0]?.label ?? service;
|
|
36
|
-
const connectorIds = matched.map((connector) => connector.id);
|
|
37
38
|
|
|
38
39
|
return (
|
|
39
40
|
<div role='group' className='flex flex-col gap-2 my-2 p-3 border border-subdued-separator rounded-sm'>
|
|
@@ -48,9 +49,9 @@ export const IntegrationPrompt = ({ service }: IntegrationPromptProps) => {
|
|
|
48
49
|
</p>
|
|
49
50
|
</div>
|
|
50
51
|
</div>
|
|
51
|
-
{connectorIds.length > 0 &&
|
|
52
|
+
{connectorIds.length > 0 && (
|
|
52
53
|
<div className='flex justify-end'>
|
|
53
|
-
<
|
|
54
|
+
<ConnectorAuthMenu connectorIds={connectorIds} db={space?.db} />
|
|
54
55
|
</div>
|
|
55
56
|
)}
|
|
56
57
|
</div>
|
|
@@ -77,3 +78,5 @@ const matchConnectors = (connectors: ConnectorEntry[], service: string): Connect
|
|
|
77
78
|
return candidates.some((value) => value === needle || value === base || value.includes(base));
|
|
78
79
|
});
|
|
79
80
|
};
|
|
81
|
+
|
|
82
|
+
IntegrationPrompt.displayName = 'IntegrationPrompt';
|