@dxos/plugin-assistant 0.10.0 → 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 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-connector.mjs","names":[],"sources":["../../src/capabilities/connector.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Format, Obj, Ref } from '@dxos/echo';\nimport { AccessToken } from '@dxos/link';\nimport { Connection, Connector, type CredentialForm } from '@dxos/plugin-connector';\n\nimport { ANTHROPIC_PROVIDER_ID, ANTHROPIC_SOURCE } from '../constants';\n\n/** API-key form for the Anthropic BYOK provider; key is best-effort validated against `/v1/models`. */\nconst AnthropicTokenForm = Schema.Struct({\n token: Schema.String.pipe(Format.FormatAnnotation.set(Format.TypeFormat.Password)).annotations({\n title: 'API key',\n description: 'Your Anthropic API key — find it at https://console.anthropic.com/settings/keys.',\n }),\n});\n\n/**\n * Best-effort validation: 401/403 from Anthropic blocks the save; CORS/network failures\n * are tolerated so the form still works in environments where the direct browser call is blocked.\n */\nconst validateAnthropicKey = (apiKey: string): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: () =>\n fetch('https://api.anthropic.com/v1/models', {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true',\n },\n }),\n catch: (cause) => cause,\n }).pipe(\n Effect.matchEffect({\n onSuccess: (response) =>\n response.status === 401 || response.status === 403\n ? Effect.fail(\n new Error('Invalid Anthropic API key. Check it at https://console.anthropic.com/settings/keys.'),\n )\n : Effect.void,\n onFailure: () => Effect.void,\n }),\n );\n\nconst credentialForm: CredentialForm<Schema.Schema.Type<typeof AnthropicTokenForm>> = {\n schema: AnthropicTokenForm,\n defaultValues: { token: '' },\n // Validates before the dialog closes so 401/403 errors are shown inline.\n onValidate: ({ values }) => validateAnthropicKey(values.token.trim()),\n onSubmit: ({ values, connector }) =>\n Effect.sync(() => {\n const accessToken = Obj.make(AccessToken.AccessToken, {\n source: ANTHROPIC_SOURCE,\n token: values.token.trim(),\n });\n const connection = Obj.make(Connection.Connection, {\n name: connector.label ?? 'Anthropic',\n connectorId: connector.id,\n accessToken: Ref.make(accessToken),\n });\n return { kind: 'complete' as const, accessToken, connection };\n }),\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(Connector, [\n {\n id: ANTHROPIC_PROVIDER_ID,\n source: ANTHROPIC_SOURCE,\n label: 'Anthropic',\n credentialForm,\n },\n ]);\n }),\n);\n"],"mappings":";;;;;;;;;AAeA,IAAM,qBAAqB,OAAO,OAAO,EACvC,OAAO,OAAO,OAAO,KAAK,OAAO,iBAAiB,IAAI,OAAO,WAAW,QAAQ,CAAC,CAAC,CAAC,YAAY;CAC7F,OAAO;CACP,aAAa;AACf,CAAC,EACH,CAAC;;;;;AAMD,IAAM,wBAAwB,WAC5B,OAAO,WAAW;CAChB,WACE,MAAM,uCAAuC,EAC3C,SAAS;EACP,aAAa;EACb,qBAAqB;EACrB,6CAA6C;CAC/C,EACF,CAAC;CACH,QAAQ,UAAU;AACpB,CAAC,CAAC,CAAC,KACD,OAAO,YAAY;CACjB,YAAY,aACV,SAAS,WAAW,OAAO,SAAS,WAAW,MAC3C,OAAO,qBACL,IAAI,MAAM,qFAAqF,CACjG,IACA,OAAO;CACb,iBAAiB,OAAO;AAC1B,CAAC,CACH;AAEF,IAAM,iBAAgF;CACpF,QAAQ;CACR,eAAe,EAAE,OAAO,GAAG;CAE3B,aAAa,EAAE,aAAa,qBAAqB,OAAO,MAAM,KAAK,CAAC;CACpE,WAAW,EAAE,QAAQ,gBACnB,OAAO,WAAW;EAChB,MAAM,cAAc,IAAI,KAAK,YAAY,aAAa;GACpD,QAAQ;GACR,OAAO,OAAO,MAAM,KAAK;EAC3B,CAAC;EAMD,OAAO;GAAE,MAAM;GAAqB;GAAa,YAL9B,IAAI,KAAK,WAAW,YAAY;IACjD,MAAM,UAAU,SAAS;IACzB,aAAa,UAAU;IACvB,aAAa,IAAI,KAAK,WAAW;GACnC,CACiD;EAAW;CAC9D,CAAC;AACL;AAEA,IAAA,oBAAe,WAAW,WACxB,OAAO,WAAW,aAAa;CAC7B,OAAO,WAAW,YAAY,WAAW,CACvC;EACE,IAAI;EACJ,QAAQ;EACR,OAAO;EACP;CACF,CACF,CAAC;AACH,CAAC,CACH"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/constants.ts
|
|
2
|
+
/** Stable id used by `plugin-connector` to look up the Anthropic provider entry. */
|
|
3
|
+
var ANTHROPIC_PROVIDER_ID = "anthropic";
|
|
4
|
+
/** Source string used in `AccessToken.source` and matched by `Header.byokLayer('anthropic.com')`. */
|
|
5
|
+
var ANTHROPIC_SOURCE = "anthropic.com";
|
|
6
|
+
//#endregion
|
|
7
|
+
export { ANTHROPIC_SOURCE as n, ANTHROPIC_PROVIDER_ID as t };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=chunk-constants.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-constants.mjs","names":[],"sources":["../../src/constants.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n/** Stable id used by `plugin-connector` to look up the Anthropic provider entry. */\nexport const ANTHROPIC_PROVIDER_ID = 'anthropic';\n\n/** Source string used in `AccessToken.source` and matched by `Header.byokLayer('anthropic.com')`. */\nexport const ANTHROPIC_SOURCE = 'anthropic.com';\n"],"mappings":";;AAKA,IAAa,wBAAwB;;AAGrC,IAAa,mBAAmB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createContext } from "@radix-ui/react-context";
|
|
2
|
+
//#region src/components/Chat/context.ts
|
|
3
|
+
var [ChatContextProvider, useChatContext] = createContext("Chat");
|
|
4
|
+
//#endregion
|
|
5
|
+
export { useChatContext as n, ChatContextProvider as t };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=chunk-context.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-context.mjs","names":[],"sources":["../../src/components/Chat/context.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\n\nimport { type Chat as ChatModule } from '@dxos/assistant-toolkit';\nimport { type Event } from '@dxos/async';\nimport { type Database } from '@dxos/echo';\nimport { type MarkdownStreamController } from '@dxos/react-ui-markdown';\nimport { type Message } from '@dxos/types';\n\nimport { type AiChatProcessor } from '../../processor';\nimport { type MessageSpan } from '../ChatThread';\nimport { type ChatEvent } from './events';\n\n/**\n * Wall-clock timestamps for the most-recent (or in-flight) request, lifted out of\n * `ChatStreamStatus` so the elapsed value survives across re-mounts triggered when wire's\n * drip queue toggles `wireDrainingEffect` (which removes/restores the footer block widget).\n * `endedAt` is `null` while the request is still active.\n */\nexport type ChatRequestTiming = {\n startedAt: number;\n endedAt: number | null;\n};\n\nexport type ChatContextValue = {\n debug?: boolean;\n event: Event<ChatEvent>;\n db?: Database.Database;\n chat?: ChatModule.Chat;\n messages: Message.Message[];\n processor: AiChatProcessor;\n requestTiming: ChatRequestTiming | null;\n /** The thread's editor controller, shared between `Chat.Thread` and `Chat.Minimap`. */\n controller: MarkdownStreamController | null;\n setController: (controller: MarkdownStreamController | null) => void;\n /** Per-message document offset ranges, published by `Chat.Thread`'s syncer. */\n messageRanges: MessageSpan[];\n setMessageRanges: (ranges: MessageSpan[]) => void;\n};\n\n// Internal: not re-exported from `Chat/index.ts`. Accessed by sibling components in this\n// package (e.g. `ChatStreamStatus`) without dragging in `Chat.tsx`'s heavy transitive\n// imports (transcription, etc.).\nexport const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');\n"],"mappings":";;AA8CA,IAAa,CAAC,qBAAqB,kBAAkB,cAAgC,MAAM"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { AiContext } from "@dxos/assistant";
|
|
2
|
+
import { Operation, Skill } from "@dxos/compute";
|
|
3
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
4
|
+
import { AgentWizardSkill, AlarmSkill, Chat, DatabaseSkill } from "@dxos/assistant-toolkit";
|
|
5
|
+
import { Database, Feed, Obj, Ref } from "@dxos/echo";
|
|
6
|
+
import { AssistantOperation } from "#types";
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import { AssistantSkill } from "#skills";
|
|
9
|
+
import { invariant } from "@dxos/invariant";
|
|
10
|
+
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
11
|
+
//#region src/operations/create-chat.ts
|
|
12
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/create-chat.ts";
|
|
13
|
+
var handler = AssistantOperation.CreateChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db, name, instructions, addToSpace = true }) {
|
|
14
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
15
|
+
const space = (yield* Capability.get(ClientCapabilities.Client)).spaces.get(db.spaceId);
|
|
16
|
+
invariant(space, "Space not found", {
|
|
17
|
+
"~LogMeta": "~LogMeta",
|
|
18
|
+
F: __dxlog_file,
|
|
19
|
+
L: 24,
|
|
20
|
+
S: this,
|
|
21
|
+
A: ["space", "'Space not found'"]
|
|
22
|
+
});
|
|
23
|
+
const feed = space.db.add(Feed.make());
|
|
24
|
+
const chat = Chat.make({
|
|
25
|
+
name,
|
|
26
|
+
feed: Ref.make(feed),
|
|
27
|
+
instructions
|
|
28
|
+
});
|
|
29
|
+
Obj.setParent(feed, chat);
|
|
30
|
+
if (addToSpace) space.db.add(chat);
|
|
31
|
+
const { SkillManagerSkill } = yield* Effect.promise(() => import("@dxos/assistant-toolkit"));
|
|
32
|
+
const runtime = yield* Effect.runtime().pipe(Effect.provide(Database.layer(space.db)));
|
|
33
|
+
const binder = new AiContext.Binder({
|
|
34
|
+
feed,
|
|
35
|
+
runtime,
|
|
36
|
+
registry
|
|
37
|
+
});
|
|
38
|
+
yield* Effect.promise(() => binder.use((b) => b.bind({
|
|
39
|
+
skills: [
|
|
40
|
+
AssistantSkill,
|
|
41
|
+
DatabaseSkill,
|
|
42
|
+
AgentWizardSkill,
|
|
43
|
+
SkillManagerSkill,
|
|
44
|
+
AlarmSkill
|
|
45
|
+
].map(({ key }) => Ref.fromURI(Skill.registryURI(key))),
|
|
46
|
+
objects: [Ref.make(chat)]
|
|
47
|
+
})));
|
|
48
|
+
return { object: chat };
|
|
49
|
+
})));
|
|
50
|
+
//#endregion
|
|
51
|
+
export { handler as default };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=chunk-create-chat.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-create-chat.mjs","names":[],"sources":["../../src/operations/create-chat.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AiContext } from '@dxos/assistant';\nimport { AgentWizardSkill, AlarmSkill, Chat, DatabaseSkill } from '@dxos/assistant-toolkit';\nimport { Operation, Skill } from '@dxos/compute';\nimport { Database, Feed, Obj, Ref } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { AssistantSkill } from '#skills';\nimport { AssistantOperation } from '#types';\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.CreateChat> = AssistantOperation.CreateChat.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ db, name, instructions, addToSpace = true }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = client.spaces.get(db.spaceId);\n invariant(space, 'Space not found');\n const feed = space.db.add(Feed.make());\n const chat = Chat.make({ name, feed: Ref.make(feed), instructions });\n Obj.setParent(feed, chat);\n if (addToSpace) {\n space.db.add(chat);\n }\n\n // Dynamic import to avoid circular dependency with the barrel that also exports SkillManagerHandlers.\n const { SkillManagerSkill } = yield* Effect.promise(() => import('@dxos/assistant-toolkit'));\n\n const runtime = yield* Effect.runtime<Database.Service>().pipe(Effect.provide(Database.layer(space.db)));\n const binder = new AiContext.Binder({ feed, runtime, registry });\n\n // Bind default skills via registry refs — no DB clone needed since the ECHO ref\n // resolver already spans the hypergraph registry.\n yield* Effect.promise(() =>\n binder.use((b: AiContext.Binder) =>\n b.bind({\n skills: [AssistantSkill, DatabaseSkill, AgentWizardSkill, SkillManagerSkill, AlarmSkill].map(({ key }) =>\n Ref.fromURI(Skill.registryURI(key)),\n ),\n objects: [Ref.make(chat)],\n }),\n ),\n );\n\n return { object: chat };\n }),\n ),\n);\n\nexport default handler;\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAM,UAAuE,mBAAmB,WAAW,KACzG,UAAU,YACR,OAAO,WAAW,WAAW,EAAE,IAAI,MAAM,cAAc,aAAa,QAAQ;CAC1E,MAAM,WAAW,OAAO,WAAW,IAAI,aAAa,YAAY;CAEhE,MAAM,SAAQ,OADQ,WAAW,IAAI,mBAAmB,MAAM,EAAA,CACzC,OAAO,IAAI,GAAG,OAAO;CAC1C,UAAU,OAAO,mBAAgB;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,CAAA,SAAA,mBAAA;CAAA,CAAC;CAClC,MAAM,OAAO,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC;CACrC,MAAM,OAAO,KAAK,KAAK;EAAE;EAAM,MAAM,IAAI,KAAK,IAAI;EAAG;CAAa,CAAC;CACnE,IAAI,UAAU,MAAM,IAAI;CACxB,IAAI,YACF,MAAM,GAAG,IAAI,IAAI;CAInB,MAAM,EAAE,sBAAsB,OAAO,OAAO,cAAc,OAAO,0BAA0B;CAE3F,MAAM,UAAU,OAAO,OAAO,QAA0B,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,MAAM,MAAM,EAAE,CAAC,CAAC;CACvG,MAAM,SAAS,IAAI,UAAU,OAAO;EAAE;EAAM;EAAS;CAAS,CAAC;CAI/D,OAAO,OAAO,cACZ,OAAO,KAAK,MACV,EAAE,KAAK;EACL,QAAQ;GAAC;GAAgB;GAAe;GAAkB;GAAmB;EAAU,CAAC,CAAC,KAAK,EAAE,UAC9F,IAAI,QAAQ,MAAM,YAAY,GAAG,CAAC,CACpC;EACA,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;CAC1B,CAAC,CACH,CACF;CAEA,OAAO,EAAE,QAAQ,KAAK;AACxB,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { n as getChatsPath } from "./chunk-paths.mjs";
|
|
2
|
+
import { Operation, ServiceResolver, Skill } from "@dxos/compute";
|
|
3
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
4
|
+
import { Agent, AgentSkill, Chat } from "@dxos/assistant-toolkit";
|
|
5
|
+
import { Database, Obj, Type } from "@dxos/echo";
|
|
6
|
+
import { Sequence } from "@dxos/conductor";
|
|
7
|
+
import { AssistantOperation } from "#types";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
10
|
+
import { SpaceCapabilities, SpaceOperation } from "@dxos/plugin-space";
|
|
11
|
+
//#region src/capabilities/create-object.ts
|
|
12
|
+
var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
13
|
+
return [
|
|
14
|
+
Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
15
|
+
id: Type.getTypename(Chat.Chat),
|
|
16
|
+
createObject: (props, options) => Effect.gen(function* () {
|
|
17
|
+
const { object } = yield* Operation.invoke(AssistantOperation.CreateChat, {
|
|
18
|
+
db: options.db,
|
|
19
|
+
name: props?.name
|
|
20
|
+
});
|
|
21
|
+
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
22
|
+
object,
|
|
23
|
+
target: options.target,
|
|
24
|
+
targetNodeId: options.targetNodeId ?? getChatsPath(options.db.spaceId)
|
|
25
|
+
});
|
|
26
|
+
})
|
|
27
|
+
}),
|
|
28
|
+
Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
29
|
+
id: Type.getTypename(Skill.Skill),
|
|
30
|
+
inputSchema: AssistantOperation.SkillForm,
|
|
31
|
+
createObject: (props, options) => Effect.gen(function* () {
|
|
32
|
+
const object = Skill.make(props);
|
|
33
|
+
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
34
|
+
object,
|
|
35
|
+
target: options.target,
|
|
36
|
+
targetNodeId: options.targetNodeId
|
|
37
|
+
});
|
|
38
|
+
})
|
|
39
|
+
}),
|
|
40
|
+
Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
41
|
+
id: Type.getTypename(Sequence.Sequence),
|
|
42
|
+
createObject: (props, options) => Effect.gen(function* () {
|
|
43
|
+
const object = Obj.make(Sequence.Sequence, props);
|
|
44
|
+
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
45
|
+
object,
|
|
46
|
+
target: options.target,
|
|
47
|
+
targetNodeId: options.targetNodeId
|
|
48
|
+
});
|
|
49
|
+
})
|
|
50
|
+
}),
|
|
51
|
+
Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
52
|
+
id: Type.getTypename(Agent.Agent),
|
|
53
|
+
createObject: (props, options) => Effect.gen(function* () {
|
|
54
|
+
const object = yield* Agent.makeInitialized({
|
|
55
|
+
name: "",
|
|
56
|
+
instructions: ""
|
|
57
|
+
}, AgentSkill.make());
|
|
58
|
+
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
59
|
+
object,
|
|
60
|
+
target: options.target,
|
|
61
|
+
targetNodeId: options.targetNodeId
|
|
62
|
+
});
|
|
63
|
+
}).pipe(Effect.provide(ServiceResolver.provide({ space: options.db.spaceId }, Database.Service).pipe(Layer.provide(Capability.asLayer(Capabilities.ServiceResolver, ServiceResolver.ServiceResolver)))))
|
|
64
|
+
})
|
|
65
|
+
];
|
|
66
|
+
}));
|
|
67
|
+
//#endregion
|
|
68
|
+
export { create_object_default as default };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=chunk-create-object.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-create-object.mjs","names":[],"sources":["../../src/capabilities/create-object.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Agent, AgentSkill, Chat } from '@dxos/assistant-toolkit';\nimport { Operation, ServiceResolver, Skill } from '@dxos/compute';\nimport { Sequence } from '@dxos/conductor';\nimport { Database, Obj, Type } from '@dxos/echo';\nimport { SpaceCapabilities, SpaceOperation } from '@dxos/plugin-space';\n\nimport { AssistantOperation } from '#types';\n\nimport { getChatsPath } from '../paths';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return [\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Chat.Chat),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const { object } = yield* Operation.invoke(AssistantOperation.CreateChat, {\n db: options.db,\n name: props?.name,\n });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId ?? getChatsPath(options.db.spaceId),\n });\n }),\n }),\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Skill.Skill),\n inputSchema: AssistantOperation.SkillForm,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Skill.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n }),\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Sequence.Sequence),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Obj.make(Sequence.Sequence, props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n }),\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Agent.Agent),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = yield* Agent.makeInitialized({ name: '', instructions: '' }, AgentSkill.make());\n\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }).pipe(\n Effect.provide(\n ServiceResolver.provide({ space: options.db.spaceId }, Database.Service).pipe(\n Layer.provide(Capability.asLayer(Capabilities.ServiceResolver, ServiceResolver.ServiceResolver)),\n ),\n ),\n ),\n }),\n ];\n }),\n);\n"],"mappings":";;;;;;;;;;;AAkBA,IAAA,wBAAe,WAAW,WACxB,OAAO,WAAW,aAAa;CAC7B,OAAO;EACL,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,KAAK,IAAI;GAC9B,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,EAAE,WAAW,OAAO,UAAU,OAAO,mBAAmB,YAAY;KACxE,IAAI,QAAQ;KACZ,MAAM,OAAO;IACf,CAAC;IACD,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ,gBAAgB,aAAa,QAAQ,GAAG,OAAO;IACvE,CAAC;GACH,CAAC;EACL,CAAC;EACD,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,MAAM,KAAK;GAChC,aAAa,mBAAmB;GAChC,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,SAAS,MAAM,KAAK,KAAK;IAC/B,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ;IACxB,CAAC;GACH,CAAC;EACL,CAAC;EACD,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,SAAS,QAAQ;GACtC,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,SAAS,IAAI,KAAK,SAAS,UAAU,KAAK;IAChD,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ;IACxB,CAAC;GACH,CAAC;EACL,CAAC;EACD,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,MAAM,KAAK;GAChC,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,SAAS,OAAO,MAAM,gBAAgB;KAAE,MAAM;KAAI,cAAc;IAAG,GAAG,WAAW,KAAK,CAAC;IAE7F,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ;IACxB,CAAC;GACH,CAAC,CAAC,CAAC,KACD,OAAO,QACL,gBAAgB,QAAQ,EAAE,OAAO,QAAQ,GAAG,QAAQ,GAAG,SAAS,OAAO,CAAC,CAAC,KACvE,MAAM,QAAQ,WAAW,QAAQ,aAAa,iBAAiB,gBAAgB,eAAe,CAAC,CACjG,CACF,CACF;EACJ,CAAC;CACH;AACF,CAAC,CACH"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { n as ANTHROPIC_SOURCE } from "./chunk-constants.mjs";
|
|
2
|
+
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
3
|
+
import { Header } from "@dxos/compute";
|
|
4
|
+
import { Capability } from "@dxos/app-framework";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Option from "effect/Option";
|
|
7
|
+
import { EdgeAiHttpClient, EdgeHttpClient } from "@dxos/edge-client";
|
|
8
|
+
import * as Layer from "effect/Layer";
|
|
9
|
+
import { invariant } from "@dxos/invariant";
|
|
10
|
+
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
11
|
+
import * as AnthropicClient from "@effect/ai-anthropic/AnthropicClient";
|
|
12
|
+
import { AnthropicResolver } from "@dxos/ai/resolvers";
|
|
13
|
+
import { createEdgeIdentity } from "@dxos/client/edge";
|
|
14
|
+
//#region src/capabilities/edge-model-resolver.ts
|
|
15
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/capabilities/edge-model-resolver.ts";
|
|
16
|
+
var edgeModelResolver = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
17
|
+
const manager = yield* Capability.Service;
|
|
18
|
+
let edgeClient;
|
|
19
|
+
let identitySubscription;
|
|
20
|
+
const getEdgeClient = () => {
|
|
21
|
+
if (!edgeClient) {
|
|
22
|
+
const [client] = manager.getAll(ClientCapabilities.Client);
|
|
23
|
+
invariant(client, "Client capability is required for edge AI requests.", {
|
|
24
|
+
"~LogMeta": "~LogMeta",
|
|
25
|
+
F: __dxlog_file,
|
|
26
|
+
L: 39,
|
|
27
|
+
S: this,
|
|
28
|
+
A: ["client", "'Client capability is required for edge AI requests.'"]
|
|
29
|
+
});
|
|
30
|
+
const [haloIdentity] = manager.getAll(ClientCapabilities.IdentityService);
|
|
31
|
+
invariant(haloIdentity, "HALO identity capability is required for edge AI requests.", {
|
|
32
|
+
"~LogMeta": "~LogMeta",
|
|
33
|
+
F: __dxlog_file,
|
|
34
|
+
L: 41,
|
|
35
|
+
S: this,
|
|
36
|
+
A: ["haloIdentity", "'HALO identity capability is required for edge AI requests.'"]
|
|
37
|
+
});
|
|
38
|
+
const edgeUrl = client.config.values.runtime?.services?.edge?.url;
|
|
39
|
+
invariant(edgeUrl, "EDGE services are not configured.", {
|
|
40
|
+
"~LogMeta": "~LogMeta",
|
|
41
|
+
F: __dxlog_file,
|
|
42
|
+
L: 43,
|
|
43
|
+
S: this,
|
|
44
|
+
A: ["edgeUrl", "'EDGE services are not configured.'"]
|
|
45
|
+
});
|
|
46
|
+
const created = new EdgeHttpClient(edgeUrl);
|
|
47
|
+
const updateIdentity = () => {
|
|
48
|
+
if (Option.isSome(haloIdentity.getSnapshot())) created.setIdentity(createEdgeIdentity(client));
|
|
49
|
+
};
|
|
50
|
+
updateIdentity();
|
|
51
|
+
identitySubscription = { unsubscribe: haloIdentity.subscribe(updateIdentity) };
|
|
52
|
+
edgeClient = created;
|
|
53
|
+
}
|
|
54
|
+
return edgeClient;
|
|
55
|
+
};
|
|
56
|
+
const httpClient = Header.byokLayer(ANTHROPIC_SOURCE).pipe(Layer.provide(EdgeAiHttpClient.layer(getEdgeClient)));
|
|
57
|
+
const anthropicClient = AnthropicClient.layer({ apiUrl: "http://edge.internal" }).pipe(Layer.provide(httpClient));
|
|
58
|
+
const anthropicResolverLayer = AnthropicResolver.make().pipe(Layer.provide(anthropicClient));
|
|
59
|
+
return [Capability.contributes(AppCapabilities.AiModelResolver, anthropicResolverLayer, () => Effect.sync(() => identitySubscription?.unsubscribe()))];
|
|
60
|
+
}));
|
|
61
|
+
//#endregion
|
|
62
|
+
export { edgeModelResolver as default };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=chunk-edge-model-resolver.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-edge-model-resolver.mjs","names":[],"sources":["../../src/capabilities/edge-model-resolver.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AnthropicClient from '@effect/ai-anthropic/AnthropicClient';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\n\nimport { AnthropicResolver } from '@dxos/ai/resolvers';\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { createEdgeIdentity } from '@dxos/client/edge';\nimport { Header } from '@dxos/compute';\nimport { EdgeAiHttpClient, EdgeHttpClient } from '@dxos/edge-client';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { ANTHROPIC_SOURCE } from '../constants';\n\n// Named alias so the module's inferred type stays portable (avoids TS2883 leaking the internal\n// `@dxos/ai/AiModelResolver` Layer type into the emitted declarations).\nexport type EdgeModelResolverCapabilities = Capability.Capability<typeof AppCapabilities.AiModelResolver>[];\n\nconst edgeModelResolver = Capability.makeModule<[], EdgeModelResolverCapabilities>(\n Effect.fnUntraced(function* () {\n const manager = yield* Capability.Service;\n\n // The authenticated EDGE client is resolved lazily on the first AI request. AI providers are\n // set up before the Client capability and user identity exist (the startup cascade activates\n // this module before `ClientReady`), so requiring the Client here would throw — or deadlock\n // if we blocked on it. `EdgeAiHttpClient` invokes this thunk per request, by which point the\n // Client is available.\n let edgeClient: EdgeHttpClient | undefined;\n let identitySubscription: { unsubscribe: () => void } | undefined;\n const getEdgeClient = (): EdgeHttpClient => {\n if (!edgeClient) {\n const [client] = manager.getAll(ClientCapabilities.Client);\n invariant(client, 'Client capability is required for edge AI requests.');\n const [haloIdentity] = manager.getAll(ClientCapabilities.IdentityService);\n invariant(haloIdentity, 'HALO identity capability is required for edge AI requests.');\n const edgeUrl = client.config.values.runtime?.services?.edge?.url;\n invariant(edgeUrl, 'EDGE services are not configured.');\n const created = new EdgeHttpClient(edgeUrl);\n const updateIdentity = () => {\n if (Option.isSome(haloIdentity.getSnapshot())) {\n created.setIdentity(createEdgeIdentity(client));\n }\n };\n updateIdentity();\n identitySubscription = { unsubscribe: haloIdentity.subscribe(updateIdentity) };\n edgeClient = created;\n }\n return edgeClient;\n };\n\n // `apiUrl` is a sentinel; `EdgeAiHttpClient` rewrites the request onto the EDGE\n // `/ai/generate/anthropic` route. `Header.byokLayer` wraps that client to inject `X-BYOK`.\n const httpClient = Header.byokLayer(ANTHROPIC_SOURCE).pipe(Layer.provide(EdgeAiHttpClient.layer(getEdgeClient)));\n const anthropicClient = AnthropicClient.layer({ apiUrl: 'http://edge.internal' }).pipe(Layer.provide(httpClient));\n const anthropicResolverLayer = AnthropicResolver.make().pipe(Layer.provide(anthropicClient));\n\n const contribution: Capability.Capability<typeof AppCapabilities.AiModelResolver> = Capability.contributes(\n AppCapabilities.AiModelResolver,\n anthropicResolverLayer,\n () => Effect.sync(() => identitySubscription?.unsubscribe()),\n );\n\n return [contribution];\n }),\n);\n\nexport default edgeModelResolver;\n"],"mappings":";;;;;;;;;;;;;;;AAwBA,IAAM,oBAAoB,WAAW,WACnC,OAAO,WAAW,aAAa;CAC7B,MAAM,UAAU,OAAO,WAAW;CAOlC,IAAI;CACJ,IAAI;CACJ,MAAM,sBAAsC;EAC1C,IAAI,CAAC,YAAY;GACf,MAAM,CAAC,UAAU,QAAQ,OAAO,mBAAmB,MAAM;GACzD,UAAU,QAAQ,uDAAoD;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,CAAA,UAAA,uDAAA;GAAA,CAAC;GACvE,MAAM,CAAC,gBAAgB,QAAQ,OAAO,mBAAmB,eAAe;GACxE,UAAU,cAAc,8DAA2D;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,CAAA,gBAAA,8DAAA;GAAA,CAAC;GACpF,MAAM,UAAU,OAAO,OAAO,OAAO,SAAS,UAAU,MAAM;GAC9D,UAAU,SAAS,qCAAkC;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,CAAA,WAAA,qCAAA;GAAA,CAAC;GACtD,MAAM,UAAU,IAAI,eAAe,OAAO;GAC1C,MAAM,uBAAuB;IAC3B,IAAI,OAAO,OAAO,aAAa,YAAY,CAAC,GAC1C,QAAQ,YAAY,mBAAmB,MAAM,CAAC;GAElD;GACA,eAAe;GACf,uBAAuB,EAAE,aAAa,aAAa,UAAU,cAAc,EAAE;GAC7E,aAAa;EACf;EACA,OAAO;CACT;CAIA,MAAM,aAAa,OAAO,UAAU,gBAAgB,CAAC,CAAC,KAAK,MAAM,QAAQ,iBAAiB,MAAM,aAAa,CAAC,CAAC;CAC/G,MAAM,kBAAkB,gBAAgB,MAAM,EAAE,QAAQ,uBAAuB,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,UAAU,CAAC;CAChH,MAAM,yBAAyB,kBAAkB,KAAK,CAAC,CAAC,KAAK,MAAM,QAAQ,eAAe,CAAC;CAQ3F,OAAO,CAN6E,WAAW,YAC7F,gBAAgB,iBAChB,8BACM,OAAO,WAAW,sBAAsB,YAAY,CAAC,CAGrD,CAAY;AACtB,CAAC,CACH"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Operation } from "@dxos/compute";
|
|
2
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
3
|
+
import { Chat } from "@dxos/assistant-toolkit";
|
|
4
|
+
import { Filter, Obj, Query } from "@dxos/echo";
|
|
5
|
+
import { AssistantCapabilities, AssistantOperation } from "#types";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
//#region src/operations/ensure-companion-chat.ts
|
|
8
|
+
var handler = AssistantOperation.EnsureCompanionChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db, companionTo }) {
|
|
9
|
+
const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);
|
|
10
|
+
const companionUri = Obj.getURI(companionTo);
|
|
11
|
+
const existingChat = (yield* Effect.promise(() => db.query(Query.select(Filter.id(companionTo.id)).targetOf(Chat.CompanionTo).source()).run())).at(-1);
|
|
12
|
+
if (existingChat) {
|
|
13
|
+
yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({
|
|
14
|
+
...current,
|
|
15
|
+
[companionUri]: existingChat
|
|
16
|
+
}));
|
|
17
|
+
yield* Effect.promise(() => operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, {
|
|
18
|
+
companionTo,
|
|
19
|
+
chat: existingChat
|
|
20
|
+
}));
|
|
21
|
+
return {
|
|
22
|
+
chat: existingChat,
|
|
23
|
+
persisted: true
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const cached = (yield* Capabilities.getAtomValue(AssistantCapabilities.CompanionChatCache))[companionUri];
|
|
27
|
+
if (cached) return {
|
|
28
|
+
chat: cached,
|
|
29
|
+
persisted: false
|
|
30
|
+
};
|
|
31
|
+
const { data } = yield* Effect.promise(() => operationInvoker.invokePromise(AssistantOperation.CreateChat, {
|
|
32
|
+
db,
|
|
33
|
+
addToSpace: false
|
|
34
|
+
}));
|
|
35
|
+
if (!data?.object) return yield* Effect.fail(/* @__PURE__ */ new Error("CreateChat did not return a chat object"));
|
|
36
|
+
const chat = data.object;
|
|
37
|
+
yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({
|
|
38
|
+
...current,
|
|
39
|
+
[companionUri]: chat
|
|
40
|
+
}));
|
|
41
|
+
return {
|
|
42
|
+
chat,
|
|
43
|
+
persisted: false
|
|
44
|
+
};
|
|
45
|
+
})));
|
|
46
|
+
//#endregion
|
|
47
|
+
export { handler as default };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=chunk-ensure-companion-chat.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ensure-companion-chat.mjs","names":[],"sources":["../../src/operations/ensure-companion-chat.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Filter, Obj, Query } from '@dxos/echo';\n\nimport { AssistantCapabilities, AssistantOperation } from '#types';\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.EnsureCompanionChat> =\n AssistantOperation.EnsureCompanionChat.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ db, companionTo }) {\n const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);\n const companionUri = Obj.getURI(companionTo);\n\n // 1. Look for an existing persisted companion chat in the space.\n const existingChats = yield* Effect.promise(() =>\n db.query(Query.select(Filter.id(companionTo.id)).targetOf(Chat.CompanionTo).source()).run(),\n );\n const existingChat = existingChats.at(-1);\n if (existingChat) {\n // Cache the persisted chat so the graph connector can resolve it immediately\n // via the cache fallback, without waiting for AtomObj.make(ref) to hydrate.\n yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({\n ...current,\n [companionUri]: existingChat,\n }));\n yield* Effect.promise(() =>\n operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, { companionTo, chat: existingChat }),\n );\n return { chat: existingChat, persisted: true };\n }\n\n // 2. Return cached transient chat for this companion if present.\n const cache = yield* Capabilities.getAtomValue(AssistantCapabilities.CompanionChatCache);\n const cached = cache[companionUri] as Chat.Chat | undefined;\n if (cached) {\n return { chat: cached, persisted: false };\n }\n\n // 3. Create a new transient chat, cache it, and return it without persisting.\n const { data } = yield* Effect.promise(() =>\n operationInvoker.invokePromise(AssistantOperation.CreateChat, { db, addToSpace: false }),\n );\n if (!data?.object) {\n return yield* Effect.fail(new Error('CreateChat did not return a chat object'));\n }\n const chat = data.object;\n yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({\n ...current,\n [companionUri]: chat,\n }));\n return { chat, persisted: false };\n }),\n ),\n );\n\nexport default handler;\n"],"mappings":";;;;;;;AAaA,IAAM,UACJ,mBAAmB,oBAAoB,KACrC,UAAU,YACR,OAAO,WAAW,WAAW,EAAE,IAAI,eAAe;CAChD,MAAM,mBAAmB,OAAO,WAAW,IAAI,aAAa,gBAAgB;CAC5E,MAAM,eAAe,IAAI,OAAO,WAAW;CAM3C,MAAM,gBAAe,OAHQ,OAAO,cAClC,GAAG,MAAM,MAAM,OAAO,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC5F,EAAA,CACmC,GAAG,EAAE;CACxC,IAAI,cAAc;EAGhB,OAAO,aAAa,gBAAgB,sBAAsB,qBAAqB,aAAa;GAC1F,GAAG;IACF,eAAe;EAClB,EAAE;EACF,OAAO,OAAO,cACZ,iBAAiB,cAAc,mBAAmB,gBAAgB;GAAE;GAAa,MAAM;EAAa,CAAC,CACvG;EACA,OAAO;GAAE,MAAM;GAAc,WAAW;EAAK;CAC/C;CAIA,MAAM,UAAS,OADM,aAAa,aAAa,sBAAsB,kBAAkB,EAAA,CAClE;CACrB,IAAI,QACF,OAAO;EAAE,MAAM;EAAQ,WAAW;CAAM;CAI1C,MAAM,EAAE,SAAS,OAAO,OAAO,cAC7B,iBAAiB,cAAc,mBAAmB,YAAY;EAAE;EAAI,YAAY;CAAM,CAAC,CACzF;CACA,IAAI,CAAC,MAAM,QACT,OAAO,OAAO,OAAO,qBAAK,IAAI,MAAM,yCAAyC,CAAC;CAEhF,MAAM,OAAO,KAAK;CAClB,OAAO,aAAa,gBAAgB,sBAAsB,qBAAqB,aAAa;EAC1F,GAAG;GACF,eAAe;CAClB,EAAE;CACF,OAAO;EAAE;EAAM,WAAW;CAAM;AAClC,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
|
|
2
|
+
import { Domino } from "@dxos/ui";
|
|
3
|
+
import { syntaxTree } from "@codemirror/language";
|
|
4
|
+
import { Facet } from "@codemirror/state";
|
|
5
|
+
//#region src/extensions/prompt-extension.ts
|
|
6
|
+
var promptHandlerFacet = Facet.define({ combine: (handlers) => handlers[0] ?? null });
|
|
7
|
+
var promptPlugin = ViewPlugin.fromClass(class {
|
|
8
|
+
decorations;
|
|
9
|
+
constructor(view) {
|
|
10
|
+
this.decorations = this.buildDecorations(view);
|
|
11
|
+
}
|
|
12
|
+
update(update) {
|
|
13
|
+
if (update.docChanged || update.viewportChanged || update.selectionSet || update.focusChanged || update.startState.facet(promptHandlerFacet) !== update.state.facet(promptHandlerFacet)) this.decorations = this.buildDecorations(update.view);
|
|
14
|
+
}
|
|
15
|
+
buildDecorations(view) {
|
|
16
|
+
const onRun = view.state.facet(promptHandlerFacet);
|
|
17
|
+
if (!onRun) return Decoration.none;
|
|
18
|
+
const ranges = [];
|
|
19
|
+
syntaxTree(view.state).iterate({ enter: (node) => {
|
|
20
|
+
if (node.name === "FencedCode") {
|
|
21
|
+
const info = node.node.getChild("CodeInfo");
|
|
22
|
+
if (info) {
|
|
23
|
+
const type = view.state.sliceDoc(info.from, info.to);
|
|
24
|
+
const text = node.node.getChild("CodeText");
|
|
25
|
+
if (type === "prompt" && text) {
|
|
26
|
+
const content = view.state.sliceDoc(text.from, text.to).trim();
|
|
27
|
+
if (content.length > 0) {
|
|
28
|
+
ranges.push(Decoration.line({ class: "cm-prompt-header" }).range(node.from, node.from));
|
|
29
|
+
ranges.push(Decoration.widget({
|
|
30
|
+
widget: new PromptRunWidget(content, onRun),
|
|
31
|
+
side: -1
|
|
32
|
+
}).range(node.from, node.from));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} });
|
|
38
|
+
return Decoration.set(ranges, true);
|
|
39
|
+
}
|
|
40
|
+
}, { decorations: (v) => v.decorations });
|
|
41
|
+
var promptTheme = EditorView.baseTheme({ ".cm-prompt-header": {
|
|
42
|
+
position: "relative",
|
|
43
|
+
overflow: "visible"
|
|
44
|
+
} });
|
|
45
|
+
/**
|
|
46
|
+
* CodeMirror extension that adds a "run" button to ```prompt fenced code blocks.
|
|
47
|
+
*/
|
|
48
|
+
var promptRunExtension = ({ onRun }) => [
|
|
49
|
+
promptHandlerFacet.of(onRun),
|
|
50
|
+
promptPlugin,
|
|
51
|
+
promptTheme
|
|
52
|
+
];
|
|
53
|
+
var PromptRunWidget = class extends WidgetType {
|
|
54
|
+
prompt;
|
|
55
|
+
onClick;
|
|
56
|
+
constructor(prompt, onClick) {
|
|
57
|
+
super();
|
|
58
|
+
this.prompt = prompt;
|
|
59
|
+
this.onClick = onClick;
|
|
60
|
+
}
|
|
61
|
+
eq(other) {
|
|
62
|
+
return this.prompt === other.prompt && this.onClick === other.onClick;
|
|
63
|
+
}
|
|
64
|
+
ignoreEvent() {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
toDOM() {
|
|
68
|
+
return Domino.of("button").classNames("dx-button h-6 w-6 min-h-0 p-1 absolute top-0 right-0 bg-green-bg hover:bg-green-surface text-green-fg").on("mousedown", (event) => {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
event.stopPropagation();
|
|
71
|
+
this.onClick(this.prompt);
|
|
72
|
+
}).append(Domino.of("svg", Domino.SVG).classNames("w-4 h-4 cursor-pointer").append(Domino.of("use", Domino.SVG).attributes({ href: Domino.icon("ph--sparkle--regular") }))).root;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
//#endregion
|
|
76
|
+
export { promptRunExtension as t };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=chunk-extensions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-extensions.mjs","names":[],"sources":["../../src/extensions/prompt-extension.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type Extension, Facet, type Range } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nexport type PromptExtensionOptions = {\n /** Called when the user clicks the run button on a prompt code block. */\n onRun: (promptText: string) => void;\n};\n\ntype OnRun = (text: string) => void;\n\n// Module-level facet so the plugin singleton can read the latest handler.\nconst promptHandlerFacet = Facet.define<OnRun, OnRun | null>({\n combine: (handlers) => handlers[0] ?? null,\n});\n\n// Module-level singleton — CM6 deduplicates by reference equality, preventing duplicate buttons\n// when the extension is contributed more than once.\nconst promptPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (\n update.docChanged ||\n update.viewportChanged ||\n update.selectionSet ||\n update.focusChanged ||\n update.startState.facet(promptHandlerFacet) !== update.state.facet(promptHandlerFacet)\n ) {\n this.decorations = this.buildDecorations(update.view);\n }\n }\n\n buildDecorations(view: EditorView): DecorationSet {\n const onRun = view.state.facet(promptHandlerFacet);\n if (!onRun) {\n return Decoration.none;\n }\n\n const ranges: Range<Decoration>[] = [];\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name === 'FencedCode') {\n const info = node.node.getChild('CodeInfo');\n if (info) {\n const type = view.state.sliceDoc(info.from, info.to);\n const text = node.node.getChild('CodeText');\n if (type === 'prompt' && text) {\n const content = view.state.sliceDoc(text.from, text.to).trim();\n if (content.length > 0) {\n // Mark the header line as a positioned container for the button overlay.\n ranges.push(Decoration.line({ class: 'cm-prompt-header' }).range(node.from, node.from));\n ranges.push(\n Decoration.widget({ widget: new PromptRunWidget(content, onRun), side: -1 }).range(\n node.from,\n node.from,\n ),\n );\n }\n }\n }\n }\n },\n });\n\n // sort=true lets CM6 order by startSide (line decorations before widgets at the same position).\n return Decoration.set(ranges, true);\n }\n },\n {\n decorations: (v) => v.decorations,\n },\n);\n\n// Base theme wires up the positioned container on the header line.\nconst promptTheme = EditorView.baseTheme({\n '.cm-prompt-header': {\n position: 'relative',\n overflow: 'visible',\n },\n});\n\n/**\n * CodeMirror extension that adds a \"run\" button to ```prompt fenced code blocks.\n */\nexport const promptRunExtension = ({ onRun }: PromptExtensionOptions): Extension => [\n promptHandlerFacet.of(onRun),\n promptPlugin,\n promptTheme,\n];\n\nclass PromptRunWidget extends WidgetType {\n constructor(\n private readonly prompt: string,\n private readonly onClick: OnRun,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this.prompt === other.prompt && this.onClick === other.onClick;\n }\n\n override ignoreEvent() {\n return false;\n }\n\n override toDOM() {\n return Domino.of('button')\n .classNames(\n 'dx-button h-6 w-6 min-h-0 p-1 absolute top-0 right-0 bg-green-bg hover:bg-green-surface text-green-fg',\n )\n .on('mousedown', (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.onClick(this.prompt);\n })\n .append(\n Domino.of('svg', Domino.SVG)\n .classNames('w-4 h-4 cursor-pointer')\n .append(\n Domino.of('use', Domino.SVG).attributes({\n href: Domino.icon('ph--sparkle--regular'),\n }),\n ),\n ).root;\n }\n}\n"],"mappings":";;;;;AAkBA,IAAM,qBAAqB,MAAM,OAA4B,EAC3D,UAAU,aAAa,SAAS,MAAM,KACxC,CAAC;AAID,IAAM,eAAe,WAAW,UAC9B,MAAM;CACJ;CAEA,YAAY,MAAkB;EAC5B,KAAK,cAAc,KAAK,iBAAiB,IAAI;CAC/C;CAEA,OAAO,QAAoB;EACzB,IACE,OAAO,cACP,OAAO,mBACP,OAAO,gBACP,OAAO,gBACP,OAAO,WAAW,MAAM,kBAAkB,MAAM,OAAO,MAAM,MAAM,kBAAkB,GAErF,KAAK,cAAc,KAAK,iBAAiB,OAAO,IAAI;CAExD;CAEA,iBAAiB,MAAiC;EAChD,MAAM,QAAQ,KAAK,MAAM,MAAM,kBAAkB;EACjD,IAAI,CAAC,OACH,OAAO,WAAW;EAGpB,MAAM,SAA8B,CAAC;EAErC,WAAW,KAAK,KAAK,CAAC,CAAC,QAAQ,EAC7B,QAAQ,SAAS;GACf,IAAI,KAAK,SAAS,cAAc;IAC9B,MAAM,OAAO,KAAK,KAAK,SAAS,UAAU;IAC1C,IAAI,MAAM;KACR,MAAM,OAAO,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,EAAE;KACnD,MAAM,OAAO,KAAK,KAAK,SAAS,UAAU;KAC1C,IAAI,SAAS,YAAY,MAAM;MAC7B,MAAM,UAAU,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,EAAE,CAAC,CAAC,KAAK;MAC7D,IAAI,QAAQ,SAAS,GAAG;OAEtB,OAAO,KAAK,WAAW,KAAK,EAAE,OAAO,mBAAmB,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC;OACtF,OAAO,KACL,WAAW,OAAO;QAAE,QAAQ,IAAI,gBAAgB,SAAS,KAAK;QAAG,MAAM;OAAG,CAAC,CAAC,CAAC,MAC3E,KAAK,MACL,KAAK,IACP,CACF;MACF;KACF;IACF;GACF;EACF,EACF,CAAC;EAGD,OAAO,WAAW,IAAI,QAAQ,IAAI;CACpC;AACF,GACA,EACE,cAAc,MAAM,EAAE,YACxB,CACF;AAGA,IAAM,cAAc,WAAW,UAAU,EACvC,qBAAqB;CACnB,UAAU;CACV,UAAU;AACZ,EACF,CAAC;;;;AAKD,IAAa,sBAAsB,EAAE,YAA+C;CAClF,mBAAmB,GAAG,KAAK;CAC3B;CACA;AACF;AAEA,IAAM,kBAAN,cAA8B,WAAW;CAEpB;CACA;CAFnB,YACE,QACA,SACA;EACA,MAAM;EAHW,KAAA,SAAA;EACA,KAAA,UAAA;CAGnB;CAEA,GAAY,OAAa;EACvB,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,YAAY,MAAM;CAChE;CAEA,cAAuB;EACrB,OAAO;CACT;CAEA,QAAiB;EACf,OAAO,OAAO,GAAG,QAAQ,CAAA,CACtB,WACC,uGACF,CAAA,CACC,GAAG,cAAc,UAAU;GAC1B,MAAM,eAAe;GACrB,MAAM,gBAAgB;GACtB,KAAK,QAAQ,KAAK,MAAM;EAC1B,CAAC,CAAA,CACA,OACC,OAAO,GAAG,OAAO,OAAO,GAAG,CAAA,CACxB,WAAW,wBAAwB,CAAA,CACnC,OACC,OAAO,GAAG,OAAO,OAAO,GAAG,CAAC,CAAC,WAAW,EACtC,MAAM,OAAO,KAAK,sBAAsB,EAC1C,CAAC,CACH,CACJ,CAAC,CAAC;CACN;AACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { GraphPath, LayoutOperation } from "@dxos/app-toolkit";
|
|
2
|
+
import { AiContext, SessionLink } from "@dxos/assistant";
|
|
3
|
+
import { Operation } from "@dxos/compute";
|
|
4
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
5
|
+
import { Chat } from "@dxos/assistant-toolkit";
|
|
6
|
+
import { Database, Feed, Filter, Obj, Ref } from "@dxos/echo";
|
|
7
|
+
import { Message } from "@dxos/types";
|
|
8
|
+
import { AssistantOperation } from "#types";
|
|
9
|
+
import * as Effect from "effect/Effect";
|
|
10
|
+
import { invariant } from "@dxos/invariant";
|
|
11
|
+
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
12
|
+
import { SpaceOperation } from "@dxos/plugin-space";
|
|
13
|
+
//#region src/operations/fork-chat.ts
|
|
14
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/fork-chat.ts";
|
|
15
|
+
var handler = AssistantOperation.ForkChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ chat, companionTo }) {
|
|
16
|
+
const { db } = yield* Database.Service;
|
|
17
|
+
const sourceFeed = yield* Database.load(chat.feed);
|
|
18
|
+
const space = (yield* Capability.get(ClientCapabilities.Client)).spaces.get(db.spaceId);
|
|
19
|
+
invariant(space, "Space not found.", {
|
|
20
|
+
"~LogMeta": "~LogMeta",
|
|
21
|
+
F: __dxlog_file,
|
|
22
|
+
L: 28,
|
|
23
|
+
S: this,
|
|
24
|
+
A: ["space", "'Space not found.'"]
|
|
25
|
+
});
|
|
26
|
+
const dbLayer = Database.layer(space.db);
|
|
27
|
+
const sorted = (yield* Feed.query(sourceFeed, Filter.type(Message.Message)).run.pipe(Effect.provide(dbLayer))).filter(Obj.instanceOf(Message.Message)).sort((a, b) => a.created.localeCompare(b.created));
|
|
28
|
+
const sourceName = Obj.getLabel(chat);
|
|
29
|
+
const { object: newChat } = yield* Operation.invoke(AssistantOperation.CreateChat, {
|
|
30
|
+
db,
|
|
31
|
+
name: sourceName ? `${sourceName} (fork)` : void 0
|
|
32
|
+
});
|
|
33
|
+
const newFeed = yield* Database.load(newChat.feed);
|
|
34
|
+
if (sorted.length > 0) {
|
|
35
|
+
const lastMessage = sorted[sorted.length - 1];
|
|
36
|
+
yield* Feed.append(newFeed, [Obj.make(SessionLink.SessionLink, {
|
|
37
|
+
feedRef: Ref.make(sourceFeed),
|
|
38
|
+
messageId: lastMessage.id
|
|
39
|
+
})]).pipe(Effect.provide(dbLayer));
|
|
40
|
+
}
|
|
41
|
+
const sourceBindings = (yield* Feed.query(sourceFeed, Filter.type(AiContext.Binding)).run.pipe(Effect.provide(dbLayer))).filter(Obj.instanceOf(AiContext.Binding));
|
|
42
|
+
if (sourceBindings.length > 0) {
|
|
43
|
+
const skillRefMap = /* @__PURE__ */ new Map();
|
|
44
|
+
const objectRefMap = /* @__PURE__ */ new Map();
|
|
45
|
+
for (const binding of sourceBindings) {
|
|
46
|
+
binding.skills.added.forEach((ref) => skillRefMap.set(ref.uri, ref));
|
|
47
|
+
binding.skills.removed.forEach((ref) => skillRefMap.delete(ref.uri));
|
|
48
|
+
binding.objects.added.forEach((ref) => objectRefMap.set(ref.uri, ref));
|
|
49
|
+
binding.objects.removed.forEach((ref) => objectRefMap.delete(ref.uri));
|
|
50
|
+
}
|
|
51
|
+
yield* Feed.append(newFeed, [Obj.make(AiContext.Binding, {
|
|
52
|
+
skills: {
|
|
53
|
+
added: Array.from(skillRefMap.values()),
|
|
54
|
+
removed: []
|
|
55
|
+
},
|
|
56
|
+
objects: {
|
|
57
|
+
added: Array.from(objectRefMap.values()),
|
|
58
|
+
removed: []
|
|
59
|
+
}
|
|
60
|
+
})]).pipe(Effect.provide(dbLayer));
|
|
61
|
+
}
|
|
62
|
+
if (companionTo) {
|
|
63
|
+
yield* Operation.invoke(SpaceOperation.AddRelation, {
|
|
64
|
+
db,
|
|
65
|
+
schema: Chat.CompanionTo,
|
|
66
|
+
source: newChat,
|
|
67
|
+
target: companionTo
|
|
68
|
+
});
|
|
69
|
+
const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);
|
|
70
|
+
yield* Effect.promise(() => operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, {
|
|
71
|
+
companionTo,
|
|
72
|
+
chat: newChat
|
|
73
|
+
}));
|
|
74
|
+
} else {
|
|
75
|
+
const chatPath = GraphPath.getObjectPathFromObject(newChat);
|
|
76
|
+
yield* Operation.invoke(LayoutOperation.Open, { subject: [chatPath] });
|
|
77
|
+
}
|
|
78
|
+
return { object: newChat };
|
|
79
|
+
})));
|
|
80
|
+
//#endregion
|
|
81
|
+
export { handler as default };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=chunk-fork-chat.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-fork-chat.mjs","names":[],"sources":["../../src/operations/fork-chat.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { GraphPath, LayoutOperation } from '@dxos/app-toolkit';\nimport { AiContext, SessionLink } from '@dxos/assistant';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { Message } from '@dxos/types';\n\nimport { AssistantOperation } from '#types';\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.ForkChat> = AssistantOperation.ForkChat.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ chat, companionTo }) {\n const { db } = yield* Database.Service;\n const sourceFeed = yield* Database.load(chat.feed);\n\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = client.spaces.get(db.spaceId);\n invariant(space, 'Space not found.');\n\n const dbLayer = Database.layer(space.db);\n\n const messages = yield* Feed.query(sourceFeed, Filter.type(Message.Message)).run.pipe(Effect.provide(dbLayer));\n\n // Sort chronologically to find the last message.\n const sorted = messages\n .filter(Obj.instanceOf(Message.Message))\n .sort((a, b) => a.created.localeCompare(b.created));\n\n // Create a new chat, then apply source bindings and session link.\n const sourceName = Obj.getLabel(chat);\n const { object: newChat } = yield* Operation.invoke(AssistantOperation.CreateChat, {\n db,\n name: sourceName ? `${sourceName} (fork)` : undefined,\n });\n const newFeed = yield* Database.load(newChat.feed);\n\n if (sorted.length > 0) {\n const lastMessage = sorted[sorted.length - 1];\n\n // Append a SessionLink record pointing to the last message of the source feed.\n yield* Feed.append(newFeed, [\n Obj.make(SessionLink.SessionLink, {\n feedRef: Ref.make(sourceFeed),\n messageId: lastMessage.id,\n }),\n ]).pipe(Effect.provide(dbLayer));\n }\n\n // Copy source chat's skill and object bindings to the new feed.\n // Sort chronologically so add/remove events are applied in the correct order.\n const sourceBindings = (yield* Feed.query(sourceFeed, Filter.type(AiContext.Binding)).run.pipe(\n Effect.provide(dbLayer),\n )).filter(Obj.instanceOf(AiContext.Binding));\n\n if (sourceBindings.length > 0) {\n // Reduce binding events to the final active set.\n const skillRefMap = new Map<string, Ref.Ref<any>>();\n const objectRefMap = new Map<string, Ref.Ref<any>>();\n for (const binding of sourceBindings) {\n binding.skills.added.forEach((ref: Ref.Ref<any>) => skillRefMap.set(ref.uri, ref));\n binding.skills.removed.forEach((ref: Ref.Ref<any>) => skillRefMap.delete(ref.uri));\n binding.objects.added.forEach((ref: Ref.Ref<any>) => objectRefMap.set(ref.uri, ref));\n binding.objects.removed.forEach((ref: Ref.Ref<any>) => objectRefMap.delete(ref.uri));\n }\n\n yield* Feed.append(newFeed, [\n Obj.make(AiContext.Binding, {\n skills: { added: Array.from(skillRefMap.values()), removed: [] },\n objects: { added: Array.from(objectRefMap.values()), removed: [] },\n }),\n ]).pipe(Effect.provide(dbLayer));\n }\n\n if (companionTo) {\n // Wire the forked chat as a companion and switch to it without navigating away.\n yield* Operation.invoke(SpaceOperation.AddRelation, {\n db,\n schema: Chat.CompanionTo,\n source: newChat,\n target: companionTo,\n });\n const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);\n yield* Effect.promise(() =>\n operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, { companionTo, chat: newChat }),\n );\n } else {\n // Navigate to the forked chat as a standalone plank.\n const chatPath = GraphPath.getObjectPathFromObject(newChat);\n yield* Operation.invoke(LayoutOperation.Open, { subject: [chatPath] });\n }\n\n return { object: newChat };\n }),\n ),\n);\n\nexport default handler;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
2
|
+
import { Operation } from "@dxos/compute";
|
|
3
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { AiService } from "@dxos/ai";
|
|
6
|
+
import { Collection, Filter, Obj, Order, Query, Type } from "@dxos/echo";
|
|
7
|
+
import { AssistantCapabilities, AssistantOperation } from "#types";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Option from "effect/Option";
|
|
10
|
+
import { log } from "@dxos/log";
|
|
11
|
+
import { HiddenAnnotation, getTypeAnnotation } from "@dxos/echo/Annotation";
|
|
12
|
+
import { Kind } from "@dxos/echo/Entity";
|
|
13
|
+
import * as LanguageModel from "@effect/ai/LanguageModel";
|
|
14
|
+
//#region src/operations/generate-home-suggestions.ts
|
|
15
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/generate-home-suggestions.ts";
|
|
16
|
+
var MODEL = "com.anthropic.model.claude-haiku-4-5.default";
|
|
17
|
+
var CACHE_TTL_MS = 3600 * 1e3;
|
|
18
|
+
var RECENT_LIMIT = 20;
|
|
19
|
+
var MAX_PROMPTS = 3;
|
|
20
|
+
var ONBOARDING_DOCUMENT_LABELS = /* @__PURE__ */ new Set(["Welcome to Composer"]);
|
|
21
|
+
var handler = AssistantOperation.GenerateHomeSuggestions.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db }) {
|
|
22
|
+
const spaceId = db.spaceId;
|
|
23
|
+
const entry = (yield* Capabilities.getAtomValue(AssistantCapabilities.HomeSuggestionsCache))[spaceId];
|
|
24
|
+
if (entry && Date.now() - entry.generatedAt < CACHE_TTL_MS) return { prompts: [...entry.prompts] };
|
|
25
|
+
const schemas = yield* Capability.getAll(AppCapabilities.Schema);
|
|
26
|
+
const collectionTypename = Type.getTypename(Collection.Collection);
|
|
27
|
+
const types = schemas.flat().filter(Type.isType).filter((type) => getTypeAnnotation(Type.getSchema(type))?.kind !== Kind.Relation).filter((type) => !HiddenAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => false))).filter((type) => Type.getTypename(type) !== collectionTypename);
|
|
28
|
+
let prompts = [];
|
|
29
|
+
if (types.length > 0) {
|
|
30
|
+
const items = (yield* Effect.promise(() => db.query(Query.select(Filter.or(...types.map((type) => Filter.type(type)))).orderBy(Order.updated("desc")).limit(RECENT_LIMIT)).run())).filter(Obj.isObject).filter((obj) => !Obj.isDeleted(obj)).filter((obj) => !ONBOARDING_DOCUMENT_LABELS.has(Obj.getLabel(obj) ?? "")).flatMap((obj) => {
|
|
31
|
+
const label = Obj.getLabel(obj);
|
|
32
|
+
const typename = Obj.getTypename(obj);
|
|
33
|
+
return label && typename ? [{
|
|
34
|
+
label,
|
|
35
|
+
typename
|
|
36
|
+
}] : [];
|
|
37
|
+
});
|
|
38
|
+
if (items.length > 0) prompts = yield* generateSuggestions(items);
|
|
39
|
+
}
|
|
40
|
+
const validPrompts = prompts.map((p) => p.trim()).filter((p) => p.length > 0);
|
|
41
|
+
if (validPrompts.length > 0) yield* Capabilities.updateAtomValue(AssistantCapabilities.HomeSuggestionsCache, (current) => ({
|
|
42
|
+
...current,
|
|
43
|
+
[spaceId]: {
|
|
44
|
+
generatedAt: Date.now(),
|
|
45
|
+
prompts: validPrompts
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
48
|
+
return { prompts: validPrompts };
|
|
49
|
+
})));
|
|
50
|
+
var generateSuggestions = (items) => Effect.scoped(LanguageModel.generateObject({
|
|
51
|
+
schema: Schema.Struct({ prompts: Schema.Array(Schema.String) }),
|
|
52
|
+
prompt: [
|
|
53
|
+
"Generate exactly 3 short, imperative, specific starter prompts for an AI assistant with access to this workspace.",
|
|
54
|
+
"Each prompt must be one sentence, at most 10 words, with no markdown or numbering.",
|
|
55
|
+
"",
|
|
56
|
+
"Recent workspace objects:",
|
|
57
|
+
...items.map(({ label, typename }) => `- ${label} (${typename})`)
|
|
58
|
+
].join("\n")
|
|
59
|
+
})).pipe(Effect.map(({ value }) => [...value.prompts.slice(0, MAX_PROMPTS)]), Effect.catchAll((err) => {
|
|
60
|
+
log.warn("generate-home-suggestions: LLM call failed", { err }, {
|
|
61
|
+
"~LogMeta": "~LogMeta",
|
|
62
|
+
F: __dxlog_file,
|
|
63
|
+
L: 110,
|
|
64
|
+
S: void 0
|
|
65
|
+
});
|
|
66
|
+
return Effect.succeed([]);
|
|
67
|
+
}), Effect.provide(AiService.model(MODEL)));
|
|
68
|
+
//#endregion
|
|
69
|
+
export { handler as default };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=chunk-generate-home-suggestions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-generate-home-suggestions.mjs","names":[],"sources":["../../src/operations/generate-home-suggestions.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as LanguageModel from '@effect/ai/LanguageModel';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\n\nimport { AiService } from '@dxos/ai';\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Collection, Filter, Obj, Order, Query, Type } from '@dxos/echo';\nimport { HiddenAnnotation, getTypeAnnotation } from '@dxos/echo/Annotation';\nimport { Kind as EntityKind } from '@dxos/echo/Entity';\nimport { log } from '@dxos/log';\n\nimport { AssistantCapabilities, AssistantOperation } from '#types';\n\nconst MODEL = 'com.anthropic.model.claude-haiku-4-5.default';\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst RECENT_LIMIT = 20;\nconst MAX_PROMPTS = 3;\n\n// Onboarding documents added by the system at identity creation — exclude them so a\n// brand-new personal space (containing only the welcome doc) still uses fallback prompts.\nconst ONBOARDING_DOCUMENT_LABELS = new Set(['Welcome to Composer']);\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.GenerateHomeSuggestions> =\n AssistantOperation.GenerateHomeSuggestions.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ db }) {\n const spaceId = db.spaceId;\n\n // Cache check: return early if a fresh result exists.\n const cache = yield* Capabilities.getAtomValue(AssistantCapabilities.HomeSuggestionsCache);\n const entry = cache[spaceId];\n if (entry && Date.now() - entry.generatedAt < CACHE_TTL_MS) {\n return { prompts: [...entry.prompts] };\n }\n\n // Build the recent-objects filter (mirrors SpaceHomeRecent).\n const schemas = yield* Capability.getAll(AppCapabilities.Schema);\n const collectionTypename = Type.getTypename(Collection.Collection);\n const types = schemas\n .flat()\n .filter(Type.isType)\n .filter((type) => getTypeAnnotation(Type.getSchema(type))?.kind !== EntityKind.Relation)\n .filter((type) => !HiddenAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => false)))\n .filter((type) => Type.getTypename(type) !== collectionTypename);\n\n let prompts: string[] = [];\n\n if (types.length > 0) {\n const objects = yield* Effect.promise(() =>\n db\n .query(\n Query.select(Filter.or(...types.map((type) => Filter.type(type))))\n .orderBy(Order.updated('desc'))\n .limit(RECENT_LIMIT),\n )\n .run(),\n );\n\n const items = objects\n .filter(Obj.isObject)\n .filter((obj) => !Obj.isDeleted(obj))\n .filter((obj) => !ONBOARDING_DOCUMENT_LABELS.has(Obj.getLabel(obj) ?? ''))\n .flatMap((obj): { label: string; typename: string }[] => {\n const label = Obj.getLabel(obj);\n const typename = Obj.getTypename(obj);\n return label && typename ? [{ label, typename }] : [];\n });\n\n if (items.length > 0) {\n prompts = yield* generateSuggestions(items);\n }\n }\n\n const validPrompts = prompts.map((p) => p.trim()).filter((p) => p.length > 0);\n\n if (validPrompts.length > 0) {\n yield* Capabilities.updateAtomValue(AssistantCapabilities.HomeSuggestionsCache, (current) => ({\n ...current,\n [spaceId]: { generatedAt: Date.now(), prompts: validPrompts },\n }));\n }\n\n return { prompts: validPrompts };\n }),\n ),\n );\n\nconst generateSuggestions = (items: { label: string; typename: string }[]) =>\n Effect.scoped(\n LanguageModel.generateObject({\n schema: Schema.Struct({ prompts: Schema.Array(Schema.String) }),\n prompt: [\n 'Generate exactly 3 short, imperative, specific starter prompts for an AI assistant with access to this workspace.',\n 'Each prompt must be one sentence, at most 10 words, with no markdown or numbering.',\n '',\n 'Recent workspace objects:',\n ...items.map(({ label, typename }) => `- ${label} (${typename})`),\n ].join('\\n'),\n }),\n ).pipe(\n Effect.map(({ value }) => [...value.prompts.slice(0, MAX_PROMPTS)]),\n Effect.catchAll((err) => {\n log.warn('generate-home-suggestions: LLM call failed', { err });\n return Effect.succeed<string[]>([]);\n }),\n Effect.provide(AiService.model(MODEL)),\n );\n\nexport default handler;\n"],"mappings":"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"}
|