@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,73 @@
|
|
|
1
|
+
import { Provider } from "@dxos/ai";
|
|
2
|
+
import { Obj } from "@dxos/echo";
|
|
3
|
+
import { meta } from "#meta";
|
|
4
|
+
import { AssistantCapabilities } from "#types";
|
|
5
|
+
import { useCallback, useState } from "react";
|
|
6
|
+
import { useObject } from "@dxos/echo-react";
|
|
7
|
+
import { useTranslation } from "@dxos/react-ui";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useChatProcessor, useChatServices, usePresets } from "#hooks";
|
|
10
|
+
import { useAtomCapability } from "@dxos/app-framework/ui";
|
|
11
|
+
import { ChatDialog as ChatDialog$1 } from "@dxos/react-ui-chat";
|
|
12
|
+
import { Chat } from "#components";
|
|
13
|
+
import { useRegistry } from "@dxos/react-client/echo";
|
|
14
|
+
//#region src/containers/ChatDialog/ChatDialog.tsx
|
|
15
|
+
var ChatDialog = ({ chat }) => {
|
|
16
|
+
const { t } = useTranslation(meta.profile.key);
|
|
17
|
+
const db = chat && Obj.getDatabase(chat);
|
|
18
|
+
const settings = useAtomCapability(AssistantCapabilities.Settings);
|
|
19
|
+
const runtime = useChatServices({ id: db?.spaceId });
|
|
20
|
+
const { preset, ...chatProps } = usePresets(settings);
|
|
21
|
+
const online = preset?.provider === Provider.edge.id;
|
|
22
|
+
const processor = useChatProcessor({
|
|
23
|
+
chat,
|
|
24
|
+
preset,
|
|
25
|
+
runtime,
|
|
26
|
+
registry: useRegistry(),
|
|
27
|
+
settings
|
|
28
|
+
});
|
|
29
|
+
const [chatViewType] = useObject(chat, "viewType");
|
|
30
|
+
const [open, setOpen] = useState(true);
|
|
31
|
+
const [expanded, setExpanded] = useState(false);
|
|
32
|
+
const handleEvent = useCallback((event) => {
|
|
33
|
+
switch (event.type) {
|
|
34
|
+
case "submit":
|
|
35
|
+
case "thread-open":
|
|
36
|
+
setOpen(true);
|
|
37
|
+
setExpanded(true);
|
|
38
|
+
break;
|
|
39
|
+
case "thread-close":
|
|
40
|
+
setOpen(false);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}, []);
|
|
44
|
+
if (!chat || !processor) return null;
|
|
45
|
+
return /* @__PURE__ */ jsx(Chat.Root, {
|
|
46
|
+
chat,
|
|
47
|
+
processor,
|
|
48
|
+
onEvent: handleEvent,
|
|
49
|
+
children: /* @__PURE__ */ jsxs(ChatDialog$1.Root, {
|
|
50
|
+
open,
|
|
51
|
+
expanded,
|
|
52
|
+
onOpenChange: setOpen,
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsx(ChatDialog$1.Header, { title: t("assistant-dialog.title") }),
|
|
55
|
+
/* @__PURE__ */ jsx(ChatDialog$1.Content, { children: /* @__PURE__ */ jsx(Chat.Thread, { viewType: chatViewType ?? settings.chatView }) }),
|
|
56
|
+
/* @__PURE__ */ jsx(ChatDialog$1.Footer, {
|
|
57
|
+
classNames: "p-1.5",
|
|
58
|
+
children: /* @__PURE__ */ jsx(Chat.Prompt, {
|
|
59
|
+
...chatProps,
|
|
60
|
+
preset: preset?.id,
|
|
61
|
+
online,
|
|
62
|
+
expandable: true
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
ChatDialog.displayName = "ChatDialog";
|
|
70
|
+
//#endregion
|
|
71
|
+
export { ChatDialog as default };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=chunk-ChatDialog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ChatDialog.mjs","names":[],"sources":["../../src/containers/ChatDialog/ChatDialog.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { Provider } from '@dxos/ai';\nimport { useAtomCapability } from '@dxos/app-framework/ui';\nimport { type Chat as ChatTypes } from '@dxos/assistant-toolkit';\nimport { Obj } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { useRegistry } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { ChatDialog as NaturalChatDialog } from '@dxos/react-ui-chat';\n\nimport { Chat, type ChatRootProps } from '#components';\nimport { useChatProcessor, useChatServices, usePresets } from '#hooks';\nimport { meta } from '#meta';\nimport { type Assistant, AssistantCapabilities } from '#types';\n\nexport type ChatDialogProps = {\n chat?: ChatTypes.Chat;\n};\n\nexport const ChatDialog = ({ chat }: ChatDialogProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const db = chat && Obj.getDatabase(chat);\n const settings = useAtomCapability(AssistantCapabilities.Settings);\n const runtime = useChatServices({ id: db?.spaceId });\n const { preset, ...chatProps } = usePresets(settings);\n const online = preset?.provider === Provider.edge.id;\n const registry = useRegistry();\n const processor = useChatProcessor({ chat, preset, runtime, registry, settings });\n // Subscribe via `useObject` so the thread re-renders when ChatOptions changes the view type.\n const [chatViewType] = useObject(chat, 'viewType');\n\n // TODO(burdon): Refocus when open.\n const [open, setOpen] = useState(true);\n const [expanded, setExpanded] = useState(false);\n const handleEvent = useCallback<NonNullable<ChatRootProps['onEvent']>>((event) => {\n switch (event.type) {\n case 'submit':\n case 'thread-open':\n setOpen(true);\n setExpanded(true);\n break;\n case 'thread-close':\n setOpen(false);\n break;\n }\n }, []);\n\n if (!chat || !processor) {\n return null;\n }\n\n return (\n <Chat.Root chat={chat} processor={processor} onEvent={handleEvent}>\n <NaturalChatDialog.Root open={open} expanded={expanded} onOpenChange={setOpen}>\n <NaturalChatDialog.Header title={t('assistant-dialog.title')} />\n <NaturalChatDialog.Content>\n <Chat.Thread viewType={(chatViewType as Assistant.ChatView | undefined) ?? settings.chatView} />\n </NaturalChatDialog.Content>\n <NaturalChatDialog.Footer classNames='p-1.5'>\n <Chat.Prompt {...chatProps} preset={preset?.id} online={online} expandable />\n </NaturalChatDialog.Footer>\n </NaturalChatDialog.Root>\n </Chat.Root>\n );\n};\n\nChatDialog.displayName = 'ChatDialog';\n"],"mappings":";;;;;;;;;;;;;;AAwBA,IAAa,cAAc,EAAE,WAA4B;CACvD,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAE7C,MAAM,KAAK,QAAQ,IAAI,YAAY,IAAI;CACvC,MAAM,WAAW,kBAAkB,sBAAsB,QAAQ;CACjE,MAAM,UAAU,gBAAgB,EAAE,IAAI,IAAI,QAAQ,CAAC;CACnD,MAAM,EAAE,QAAQ,GAAG,cAAc,WAAW,QAAQ;CACpD,MAAM,SAAS,QAAQ,aAAa,SAAS,KAAK;CAElD,MAAM,YAAY,iBAAiB;EAAE;EAAM;EAAQ;EAAS,UAD3C,YAC2C;EAAU;CAAS,CAAC;CAEhF,MAAM,CAAC,gBAAgB,UAAU,MAAM,UAAU;CAGjD,MAAM,CAAC,MAAM,WAAW,SAAS,IAAI;CACrC,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,cAAc,aAAoD,UAAU;EAChF,QAAQ,MAAM,MAAd;GACE,KAAK;GACL,KAAK;IACH,QAAQ,IAAI;IACZ,YAAY,IAAI;IAChB;GACF,KAAK;IACH,QAAQ,KAAK;IACb;EACJ;CACF,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,QAAQ,CAAC,WACZ,OAAO;CAGT,OACE,oBAAC,KAAK,MAAN;EAAiB;EAAiB;EAAW,SAAS;YACpD,qBAAC,aAAkB,MAAnB;GAA8B;GAAgB;GAAU,cAAc;aAAtE;IACE,oBAAC,aAAkB,QAAnB,EAA0B,OAAO,EAAE,wBAAwB,EAAI,CAAA;IAC/D,oBAAC,aAAkB,SAAnB,EAAA,UACE,oBAAC,KAAK,QAAN,EAAa,UAAW,gBAAmD,SAAS,SAAW,CAAA,EACtE,CAAA;IAC3B,oBAAC,aAAkB,QAAnB;KAA0B,YAAW;eACnC,oBAAC,KAAK,QAAN;MAAa,GAAI;MAAW,QAAQ,QAAQ;MAAY;MAAQ,YAAA;KAAY,CAAA;IACpD,CAAA;GACJ;;CACf,CAAA;AAEf;AAEA,WAAW,cAAc"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { meta } from "#meta";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { Icon, useTranslation } from "@dxos/react-ui";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useCapabilities } from "@dxos/app-framework/ui";
|
|
6
|
+
import { Connector } from "@dxos/plugin-connector";
|
|
7
|
+
import { ConnectorAuthMenu } from "#components";
|
|
8
|
+
import { useActiveSpace } from "@dxos/app-toolkit/ui";
|
|
9
|
+
//#region src/containers/IntegrationPrompt/IntegrationPrompt.tsx
|
|
10
|
+
/**
|
|
11
|
+
* Agent-facing connector prompt: rendered when the assistant needs a service the user has not yet
|
|
12
|
+
* connected. Resolves the matching {@link Connector} entries for `service` and offers to connect via
|
|
13
|
+
* the shared connector-auth menu, so the user can grant access inline instead of the agent failing
|
|
14
|
+
* silently.
|
|
15
|
+
*/
|
|
16
|
+
var IntegrationPrompt = ({ service }) => {
|
|
17
|
+
const { t } = useTranslation(meta.profile.key);
|
|
18
|
+
const space = useActiveSpace();
|
|
19
|
+
const connectors = useCapabilities(Connector).flat();
|
|
20
|
+
const matched = useMemo(() => service ? matchConnectors(connectors, service) : [], [connectors, service]);
|
|
21
|
+
const connectorIds = useMemo(() => matched.map((connector) => connector.id), [matched]);
|
|
22
|
+
if (!service) return null;
|
|
23
|
+
const label = matched[0]?.label ?? service;
|
|
24
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
25
|
+
role: "group",
|
|
26
|
+
className: "flex flex-col gap-2 my-2 p-3 border border-subdued-separator rounded-sm",
|
|
27
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
28
|
+
className: "flex items-center gap-2",
|
|
29
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
30
|
+
icon: "ph--plugs--regular",
|
|
31
|
+
size: 5,
|
|
32
|
+
classNames: "shrink-0 text-subdued"
|
|
33
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
34
|
+
className: "flex flex-col min-w-0",
|
|
35
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
36
|
+
className: "text-sm font-medium truncate",
|
|
37
|
+
children: t("integration-prompt.title", { service: label })
|
|
38
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
39
|
+
className: "text-sm text-subdued",
|
|
40
|
+
children: connectorIds.length > 0 ? t("integration-prompt.description", { service: label }) : t("integration-prompt.unavailable", { service: label })
|
|
41
|
+
})]
|
|
42
|
+
})]
|
|
43
|
+
}), connectorIds.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
44
|
+
className: "flex justify-end",
|
|
45
|
+
children: /* @__PURE__ */ jsx(ConnectorAuthMenu, {
|
|
46
|
+
connectorIds,
|
|
47
|
+
db: space?.db
|
|
48
|
+
})
|
|
49
|
+
})]
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Connectors whose id, source, or label relate to the requested service. Matches on the service's
|
|
54
|
+
* leading token (e.g. `gmail` from `gmail.com`) so model-supplied hostnames resolve to connectors
|
|
55
|
+
* keyed by short id or provider domain.
|
|
56
|
+
*/
|
|
57
|
+
var matchConnectors = (connectors, service) => {
|
|
58
|
+
const needle = service.trim().toLowerCase();
|
|
59
|
+
const base = needle.split(/[.@/]/)[0];
|
|
60
|
+
if (!needle || !base) return [];
|
|
61
|
+
return connectors.filter((connector) => {
|
|
62
|
+
return [
|
|
63
|
+
connector.id,
|
|
64
|
+
connector.source,
|
|
65
|
+
connector.label
|
|
66
|
+
].filter((value) => typeof value === "string").map((value) => value.toLowerCase()).some((value) => value === needle || value === base || value.includes(base));
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
IntegrationPrompt.displayName = "IntegrationPrompt";
|
|
70
|
+
//#endregion
|
|
71
|
+
export { IntegrationPrompt as default };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=chunk-IntegrationPrompt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-IntegrationPrompt.mjs","names":[],"sources":["../../src/containers/IntegrationPrompt/IntegrationPrompt.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { useActiveSpace } from '@dxos/app-toolkit/ui';\nimport { Connector, type ConnectorEntry } from '@dxos/plugin-connector';\nimport { Icon, useTranslation } from '@dxos/react-ui';\n\nimport { ConnectorAuthMenu } from '#components';\nimport { meta } from '#meta';\n\nexport type IntegrationPromptProps = {\n /** Service the agent needs access to, e.g. `gmail.com`. */\n service?: string;\n};\n\n/**\n * Agent-facing connector prompt: rendered when the assistant needs a service the user has not yet\n * connected. Resolves the matching {@link Connector} entries for `service` and offers to connect via\n * the shared connector-auth menu, so the user can grant access inline instead of the agent failing\n * silently.\n */\nexport const IntegrationPrompt = ({ service }: IntegrationPromptProps) => {\n const { t } = useTranslation(meta.profile.key);\n const space = useActiveSpace();\n const connectors = useCapabilities(Connector).flat();\n const matched = useMemo(() => (service ? matchConnectors(connectors, service) : []), [connectors, service]);\n const connectorIds = useMemo(() => matched.map((connector) => connector.id), [matched]);\n\n if (!service) {\n return null;\n }\n\n const label = matched[0]?.label ?? service;\n\n return (\n <div role='group' className='flex flex-col gap-2 my-2 p-3 border border-subdued-separator rounded-sm'>\n <div className='flex items-center gap-2'>\n <Icon icon='ph--plugs--regular' size={5} classNames='shrink-0 text-subdued' />\n <div className='flex flex-col min-w-0'>\n <p className='text-sm font-medium truncate'>{t('integration-prompt.title', { service: label })}</p>\n <p className='text-sm text-subdued'>\n {connectorIds.length > 0\n ? t('integration-prompt.description', { service: label })\n : t('integration-prompt.unavailable', { service: label })}\n </p>\n </div>\n </div>\n {connectorIds.length > 0 && (\n <div className='flex justify-end'>\n <ConnectorAuthMenu connectorIds={connectorIds} db={space?.db} />\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Connectors whose id, source, or label relate to the requested service. Matches on the service's\n * leading token (e.g. `gmail` from `gmail.com`) so model-supplied hostnames resolve to connectors\n * keyed by short id or provider domain.\n */\nconst matchConnectors = (connectors: ConnectorEntry[], service: string): ConnectorEntry[] => {\n const needle = service.trim().toLowerCase();\n // A malformed service (e.g. `.gmail.com` or `/`) can yield an empty base token, which would make\n // `value.includes(base)` match every connector; bail so the unavailable state is shown instead.\n const base = needle.split(/[.@/]/)[0];\n if (!needle || !base) {\n return [];\n }\n return connectors.filter((connector) => {\n const candidates = [connector.id, connector.source, connector.label]\n .filter((value): value is string => typeof value === 'string')\n .map((value) => value.toLowerCase());\n return candidates.some((value) => value === needle || value === base || value.includes(base));\n });\n};\n\nIntegrationPrompt.displayName = 'IntegrationPrompt';\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,IAAa,qBAAqB,EAAE,cAAsC;CACxE,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,QAAQ,eAAe;CAC7B,MAAM,aAAa,gBAAgB,SAAS,CAAC,CAAC,KAAK;CACnD,MAAM,UAAU,cAAe,UAAU,gBAAgB,YAAY,OAAO,IAAI,CAAC,GAAI,CAAC,YAAY,OAAO,CAAC;CAC1G,MAAM,eAAe,cAAc,QAAQ,KAAK,cAAc,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC;CAEtF,IAAI,CAAC,SACH,OAAO;CAGT,MAAM,QAAQ,QAAQ,EAAE,EAAE,SAAS;CAEnC,OACE,qBAAC,OAAD;EAAK,MAAK;EAAQ,WAAU;YAA5B,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,MAAD;IAAM,MAAK;IAAqB,MAAM;IAAG,YAAW;GAAyB,CAAA,GAC7E,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,KAAD;KAAG,WAAU;eAAgC,EAAE,4BAA4B,EAAE,SAAS,MAAM,CAAC;IAAK,CAAA,GAClG,oBAAC,KAAD;KAAG,WAAU;eACV,aAAa,SAAS,IACnB,EAAE,kCAAkC,EAAE,SAAS,MAAM,CAAC,IACtD,EAAE,kCAAkC,EAAE,SAAS,MAAM,CAAC;IACzD,CAAA,CACA;KACF;MACJ,aAAa,SAAS,KACrB,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,mBAAD;IAAiC;IAAc,IAAI,OAAO;GAAK,CAAA;EAC5D,CAAA,CAEJ;;AAET;;;;;;AAOA,IAAM,mBAAmB,YAA8B,YAAsC;CAC3F,MAAM,SAAS,QAAQ,KAAK,CAAC,CAAC,YAAY;CAG1C,MAAM,OAAO,OAAO,MAAM,OAAO,CAAC,CAAC;CACnC,IAAI,CAAC,UAAU,CAAC,MACd,OAAO,CAAC;CAEV,OAAO,WAAW,QAAQ,cAAc;EAItC,OAHmB;GAAC,UAAU;GAAI,UAAU;GAAQ,UAAU;EAAK,CAAA,CAChE,QAAQ,UAA2B,OAAO,UAAU,QAAQ,CAAA,CAC5D,KAAK,UAAU,MAAM,YAAY,CAC7B,CAAA,CAAW,MAAM,UAAU,UAAU,UAAU,UAAU,QAAQ,MAAM,SAAS,IAAI,CAAC;CAC9F,CAAC;AACH;AAEA,kBAAkB,cAAc"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { t as getChatPath } from "./chunk-paths.mjs";
|
|
2
|
+
import { LayoutOperation } from "@dxos/app-toolkit";
|
|
3
|
+
import { Capabilities } from "@dxos/app-framework";
|
|
4
|
+
import { Provider } from "@dxos/ai";
|
|
5
|
+
import { meta } from "#meta";
|
|
6
|
+
import { AssistantCapabilities, AssistantOperation } from "#types";
|
|
7
|
+
import { useEffect, useMemo, useState } from "react";
|
|
8
|
+
import { useTranslation } from "@dxos/react-ui";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
import { Event } from "@dxos/async";
|
|
11
|
+
import { useChatProcessor, useChatServices, usePresets } from "#hooks";
|
|
12
|
+
import { useAtomCapability, useCapability, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
13
|
+
import { ChatPrompt } from "#components";
|
|
14
|
+
import { useRegistry } from "@dxos/react-client/echo";
|
|
15
|
+
//#region src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx
|
|
16
|
+
/**
|
|
17
|
+
* Home article pinned-bottom contributor: the assistant prompt. Backed by an ephemeral in-memory
|
|
18
|
+
* chat whose sole responsibility is to collect the user's text, context bindings, and preset
|
|
19
|
+
* choice, then on submit: persist the chat to the space, queue the text as a pending prompt, and
|
|
20
|
+
* navigate to it. AI generation runs in the opened chat view — the processor here exists only to
|
|
21
|
+
* back the context-binder UI.
|
|
22
|
+
*/
|
|
23
|
+
var SpaceHomePrompt = ({ space }) => {
|
|
24
|
+
const { t } = useTranslation(meta.profile.key);
|
|
25
|
+
const { invokePromise } = useOperationInvoker();
|
|
26
|
+
const registry = useRegistry();
|
|
27
|
+
const atomRegistry = useCapability(Capabilities.AtomRegistry);
|
|
28
|
+
const stateAtom = useCapability(AssistantCapabilities.State);
|
|
29
|
+
const runtime = useChatServices({ id: space?.id });
|
|
30
|
+
const { preset, ...presetProps } = usePresets(useAtomCapability(AssistantCapabilities.Settings));
|
|
31
|
+
const online = preset?.provider === Provider.edge.id;
|
|
32
|
+
const [chat, setChat] = useState();
|
|
33
|
+
const [nonce, setNonce] = useState(0);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (!space) {
|
|
36
|
+
setChat(void 0);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
let cancelled = false;
|
|
40
|
+
invokePromise(AssistantOperation.CreateChat, {
|
|
41
|
+
db: space.db,
|
|
42
|
+
addToSpace: false
|
|
43
|
+
}).then((result) => {
|
|
44
|
+
if (!cancelled) setChat(result.data?.object);
|
|
45
|
+
});
|
|
46
|
+
return () => {
|
|
47
|
+
cancelled = true;
|
|
48
|
+
};
|
|
49
|
+
}, [
|
|
50
|
+
space,
|
|
51
|
+
nonce,
|
|
52
|
+
invokePromise
|
|
53
|
+
]);
|
|
54
|
+
const processor = useChatProcessor({
|
|
55
|
+
space,
|
|
56
|
+
chat,
|
|
57
|
+
preset,
|
|
58
|
+
runtime,
|
|
59
|
+
registry
|
|
60
|
+
});
|
|
61
|
+
const event = useMemo(() => new Event(), []);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
return event.on((ev) => {
|
|
64
|
+
if (ev.type !== "submit") return;
|
|
65
|
+
const text = ev.text.trim();
|
|
66
|
+
if (!space || !chat || text.length === 0) return;
|
|
67
|
+
space.db.add(chat);
|
|
68
|
+
const chatPath = getChatPath(space.db.spaceId, chat.id);
|
|
69
|
+
atomRegistry.update(stateAtom, (current) => ({
|
|
70
|
+
...current,
|
|
71
|
+
pendingPrompts: {
|
|
72
|
+
...current.pendingPrompts,
|
|
73
|
+
[chatPath]: text
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
invokePromise(LayoutOperation.Open, { subject: [chatPath] });
|
|
77
|
+
setNonce((current) => current + 1);
|
|
78
|
+
});
|
|
79
|
+
}, [
|
|
80
|
+
event,
|
|
81
|
+
space,
|
|
82
|
+
chat,
|
|
83
|
+
atomRegistry,
|
|
84
|
+
stateAtom,
|
|
85
|
+
invokePromise
|
|
86
|
+
]);
|
|
87
|
+
if (!processor || !chat || !space) return null;
|
|
88
|
+
return /* @__PURE__ */ jsx(ChatPrompt, {
|
|
89
|
+
...presetProps,
|
|
90
|
+
outline: true,
|
|
91
|
+
chat,
|
|
92
|
+
db: space.db,
|
|
93
|
+
processor,
|
|
94
|
+
event,
|
|
95
|
+
preset: preset?.id,
|
|
96
|
+
online,
|
|
97
|
+
placeholder: t("space-home.prompt.placeholder")
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
SpaceHomePrompt.displayName = "SpaceHomePrompt";
|
|
101
|
+
//#endregion
|
|
102
|
+
export { SpaceHomePrompt as default };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=chunk-SpaceHomePrompt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-SpaceHomePrompt.mjs","names":[],"sources":["../../src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { Provider } from '@dxos/ai';\nimport { Capabilities } from '@dxos/app-framework';\nimport { useAtomCapability, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Event } from '@dxos/async';\nimport { type Space, useRegistry } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\n\nimport { type ChatEvent, ChatPrompt } from '#components';\nimport { useChatProcessor, useChatServices, usePresets } from '#hooks';\nimport { meta } from '#meta';\nimport { AssistantCapabilities, AssistantOperation, type ChatType } from '#types';\n\nimport { getChatPath } from '../../paths';\n\ntype SpaceScopedProps = {\n space?: Space;\n};\n\n/**\n * Home article pinned-bottom contributor: the assistant prompt. Backed by an ephemeral in-memory\n * chat whose sole responsibility is to collect the user's text, context bindings, and preset\n * choice, then on submit: persist the chat to the space, queue the text as a pending prompt, and\n * navigate to it. AI generation runs in the opened chat view — the processor here exists only to\n * back the context-binder UI.\n */\nexport const SpaceHomePrompt = ({ space }: SpaceScopedProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n\n const registry = useRegistry();\n const atomRegistry = useCapability(Capabilities.AtomRegistry);\n const stateAtom = useCapability(AssistantCapabilities.State);\n const runtime = useChatServices({ id: space?.id });\n const settings = useAtomCapability(AssistantCapabilities.Settings);\n const { preset, ...presetProps } = usePresets(settings);\n // The remote (online) service is the edge provider; the resolved preset carries the active provider.\n const online = preset?.provider === Provider.edge.id;\n\n // In-memory backing chat (not yet added to the space). `nonce` forces a fresh chat after submit.\n const [chat, setChat] = useState<ChatType.Chat>();\n const [nonce, setNonce] = useState(0);\n useEffect(() => {\n if (!space) {\n setChat(undefined);\n return;\n }\n let cancelled = false;\n void invokePromise(AssistantOperation.CreateChat, { db: space.db, addToSpace: false }).then((result) => {\n if (!cancelled) {\n setChat(result.data?.object);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [space, nonce, invokePromise]);\n\n const processor = useChatProcessor({ space, chat, preset, runtime, registry });\n\n const event = useMemo(() => new Event<ChatEvent>(), []);\n useEffect(() => {\n return event.on((ev) => {\n if (ev.type !== 'submit') {\n return;\n }\n const text = ev.text.trim();\n if (!space || !chat || text.length === 0) {\n return;\n }\n\n // Persist the in-memory chat, queue the prompt, and open the chat (which submits it).\n space.db.add(chat);\n const chatPath = getChatPath(space.db.spaceId, chat.id);\n atomRegistry.update(stateAtom, (current) => ({\n ...current,\n pendingPrompts: { ...current.pendingPrompts, [chatPath]: text },\n }));\n void invokePromise(LayoutOperation.Open, { subject: [chatPath] });\n setNonce((current) => current + 1);\n });\n }, [event, space, chat, atomRegistry, stateAtom, invokePromise]);\n\n if (!processor || !chat || !space) {\n return null;\n }\n\n return (\n <ChatPrompt\n {...presetProps}\n outline\n chat={chat}\n db={space.db}\n processor={processor}\n event={event}\n preset={preset?.id}\n online={online}\n placeholder={t('space-home.prompt.placeholder')}\n />\n );\n};\n\nSpaceHomePrompt.displayName = 'SpaceHomePrompt';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAa,mBAAmB,EAAE,YAA8B;CAC9D,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,EAAE,kBAAkB,oBAAoB;CAE9C,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAe,cAAc,aAAa,YAAY;CAC5D,MAAM,YAAY,cAAc,sBAAsB,KAAK;CAC3D,MAAM,UAAU,gBAAgB,EAAE,IAAI,OAAO,GAAG,CAAC;CAEjD,MAAM,EAAE,QAAQ,GAAG,gBAAgB,WADlB,kBAAkB,sBAAsB,QACX,CAAQ;CAEtD,MAAM,SAAS,QAAQ,aAAa,SAAS,KAAK;CAGlD,MAAM,CAAC,MAAM,WAAW,SAAwB;CAChD,MAAM,CAAC,OAAO,YAAY,SAAS,CAAC;CACpC,gBAAgB;EACd,IAAI,CAAC,OAAO;GACV,QAAQ,KAAA,CAAS;GACjB;EACF;EACA,IAAI,YAAY;EAChB,cAAmB,mBAAmB,YAAY;GAAE,IAAI,MAAM;GAAI,YAAY;EAAM,CAAC,CAAC,CAAC,MAAM,WAAW;GACtG,IAAI,CAAC,WACH,QAAQ,OAAO,MAAM,MAAM;EAE/B,CAAC;EACD,aAAa;GACX,YAAY;EACd;CACF,GAAG;EAAC;EAAO;EAAO;CAAa,CAAC;CAEhC,MAAM,YAAY,iBAAiB;EAAE;EAAO;EAAM;EAAQ;EAAS;CAAS,CAAC;CAE7E,MAAM,QAAQ,cAAc,IAAI,MAAiB,GAAG,CAAC,CAAC;CACtD,gBAAgB;EACd,OAAO,MAAM,IAAI,OAAO;GACtB,IAAI,GAAG,SAAS,UACd;GAEF,MAAM,OAAO,GAAG,KAAK,KAAK;GAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,GACrC;GAIF,MAAM,GAAG,IAAI,IAAI;GACjB,MAAM,WAAW,YAAY,MAAM,GAAG,SAAS,KAAK,EAAE;GACtD,aAAa,OAAO,YAAY,aAAa;IAC3C,GAAG;IACH,gBAAgB;KAAE,GAAG,QAAQ;MAAiB,WAAW;IAAK;GAChE,EAAE;GACF,cAAmB,gBAAgB,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;GAChE,UAAU,YAAY,UAAU,CAAC;EACnC,CAAC;CACH,GAAG;EAAC;EAAO;EAAO;EAAM;EAAc;EAAW;CAAa,CAAC;CAE/D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAC1B,OAAO;CAGT,OACE,oBAAC,YAAD;EACE,GAAI;EACJ,SAAA;EACM;EACN,IAAI,MAAM;EACC;EACJ;EACP,QAAQ,QAAQ;EACR;EACR,aAAa,EAAE,+BAA+B;CAC/C,CAAA;AAEL;AAEA,gBAAgB,cAAc"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { meta } from "#meta";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { Card, IconButton, useTranslation } from "@dxos/react-ui";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useHomeSuggestions } from "#hooks";
|
|
6
|
+
import { HomeSection, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
7
|
+
import { RoutineOperation } from "@dxos/plugin-routine/types";
|
|
8
|
+
//#region src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Home content contributor: starter-prompt cards. Each card runs its prompt in a new chat via the
|
|
11
|
+
* assistant operation. Always renders (below the recent-objects masonry) so the Home page offers
|
|
12
|
+
* quick entry points regardless of whether recent objects exist.
|
|
13
|
+
*/
|
|
14
|
+
var SpaceHomeSuggestions = ({ space, onClose }) => {
|
|
15
|
+
const { t } = useTranslation(meta.profile.key);
|
|
16
|
+
const { invokePromise } = useOperationInvoker();
|
|
17
|
+
const suggestions = useHomeSuggestions(space);
|
|
18
|
+
const handleRunPrompt = useCallback((prompt) => {
|
|
19
|
+
if (!space) return;
|
|
20
|
+
invokePromise(RoutineOperation.RunPromptInNewChat, {
|
|
21
|
+
db: space.db,
|
|
22
|
+
instructions: prompt
|
|
23
|
+
});
|
|
24
|
+
}, [invokePromise, space]);
|
|
25
|
+
if (!suggestions) return null;
|
|
26
|
+
return /* @__PURE__ */ jsxs(HomeSection.Root, { children: [/* @__PURE__ */ jsx(HomeSection.Header, {
|
|
27
|
+
title: t("space-home.suggestions.heading"),
|
|
28
|
+
onClose
|
|
29
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
30
|
+
className: "flex flex-col gap-3",
|
|
31
|
+
children: suggestions.map((prompt, index) => /* @__PURE__ */ jsx("div", {
|
|
32
|
+
role: "button",
|
|
33
|
+
tabIndex: 0,
|
|
34
|
+
className: "cursor-pointer w-full",
|
|
35
|
+
onClick: () => handleRunPrompt(prompt),
|
|
36
|
+
onKeyDown: (e) => {
|
|
37
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
handleRunPrompt(prompt);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
children: /* @__PURE__ */ jsx(Card.Root, {
|
|
43
|
+
fullWidth: true,
|
|
44
|
+
children: /* @__PURE__ */ jsxs(Card.Header, { children: [/* @__PURE__ */ jsx(Card.Block, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
45
|
+
variant: "ghost",
|
|
46
|
+
label: prompt,
|
|
47
|
+
icon: "ph--sparkle--regular",
|
|
48
|
+
iconOnly: true,
|
|
49
|
+
tabIndex: -1,
|
|
50
|
+
"aria-hidden": true
|
|
51
|
+
}) }), /* @__PURE__ */ jsx(Card.Title, { children: prompt })] })
|
|
52
|
+
})
|
|
53
|
+
}, `${index}:${prompt}`))
|
|
54
|
+
})] });
|
|
55
|
+
};
|
|
56
|
+
SpaceHomeSuggestions.displayName = "SpaceHomeSuggestions";
|
|
57
|
+
//#endregion
|
|
58
|
+
export { SpaceHomeSuggestions as default };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=chunk-SpaceHomeSuggestions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-SpaceHomeSuggestions.mjs","names":[],"sources":["../../src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { HomeSection, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { RoutineOperation } from '@dxos/plugin-routine/types';\nimport { type Space } from '@dxos/react-client/echo';\nimport { Card, IconButton, useTranslation } from '@dxos/react-ui';\n\nimport { useHomeSuggestions } from '#hooks';\nimport { meta } from '#meta';\n\ntype SpaceScopedProps = {\n space?: Space;\n onClose?: () => void;\n};\n\n/**\n * Home content contributor: starter-prompt cards. Each card runs its prompt in a new chat via the\n * assistant operation. Always renders (below the recent-objects masonry) so the Home page offers\n * quick entry points regardless of whether recent objects exist.\n */\nexport const SpaceHomeSuggestions = ({ space, onClose }: SpaceScopedProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const suggestions = useHomeSuggestions(space);\n\n const handleRunPrompt = useCallback(\n (prompt: string) => {\n if (!space) {\n return;\n }\n void invokePromise(RoutineOperation.RunPromptInNewChat, { db: space.db, instructions: prompt });\n },\n [invokePromise, space],\n );\n\n if (!suggestions) {\n return null;\n }\n\n return (\n <HomeSection.Root>\n <HomeSection.Header title={t('space-home.suggestions.heading')} onClose={onClose} />\n <div className='flex flex-col gap-3'>\n {suggestions.map((prompt, index) => (\n <div\n key={`${index}:${prompt}`}\n role='button'\n tabIndex={0}\n className='cursor-pointer w-full'\n onClick={() => handleRunPrompt(prompt)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleRunPrompt(prompt);\n }\n }}\n >\n <Card.Root fullWidth>\n <Card.Header>\n <Card.Block>\n <IconButton\n variant='ghost'\n label={prompt}\n icon='ph--sparkle--regular'\n iconOnly\n tabIndex={-1}\n aria-hidden\n />\n </Card.Block>\n <Card.Title>{prompt}</Card.Title>\n </Card.Header>\n </Card.Root>\n </div>\n ))}\n </div>\n </HomeSection.Root>\n );\n};\n\nSpaceHomeSuggestions.displayName = 'SpaceHomeSuggestions';\n"],"mappings":";;;;;;;;;;;;;AAwBA,IAAa,wBAAwB,EAAE,OAAO,cAAgC;CAC5E,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,cAAc,mBAAmB,KAAK;CAE5C,MAAM,kBAAkB,aACrB,WAAmB;EAClB,IAAI,CAAC,OACH;EAEF,cAAmB,iBAAiB,oBAAoB;GAAE,IAAI,MAAM;GAAI,cAAc;EAAO,CAAC;CAChG,GACA,CAAC,eAAe,KAAK,CACvB;CAEA,IAAI,CAAC,aACH,OAAO;CAGT,OACE,qBAAC,YAAY,MAAb,EAAA,UAAA,CACE,oBAAC,YAAY,QAAb;EAAoB,OAAO,EAAE,gCAAgC;EAAY;CAAU,CAAA,GACnF,oBAAC,OAAD;EAAK,WAAU;YACZ,YAAY,KAAK,QAAQ,UACxB,oBAAC,OAAD;GAEE,MAAK;GACL,UAAU;GACV,WAAU;GACV,eAAe,gBAAgB,MAAM;GACrC,YAAY,MAAM;IAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;KACtC,EAAE,eAAe;KACjB,gBAAgB,MAAM;IACxB;GACF;aAEA,oBAAC,KAAK,MAAN;IAAW,WAAA;cACT,qBAAC,KAAK,QAAN,EAAA,UAAA,CACE,oBAAC,KAAK,OAAN,EAAA,UACE,oBAAC,YAAD;KACE,SAAQ;KACR,OAAO;KACP,MAAK;KACL,UAAA;KACA,UAAU;KACV,eAAA;IACD,CAAA,EACS,CAAA,GACZ,oBAAC,KAAK,OAAN,EAAA,UAAa,OAAmB,CAAA,CACrB,EAAA,CAAA;GACJ,CAAA;EACR,GA3BE,GAAG,MAAM,GAAG,QA2Bd,CACN;CACE,CAAA,CACW,EAAA,CAAA;AAEtB;AAEA,qBAAqB,cAAc"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { LayoutOperation } from "@dxos/app-toolkit";
|
|
2
|
+
import { Process } from "@dxos/compute";
|
|
3
|
+
import { Capabilities } from "@dxos/app-framework";
|
|
4
|
+
import { EID } from "@dxos/keys";
|
|
5
|
+
import { Atom } from "@effect-atom/atom";
|
|
6
|
+
import { AssistantCapabilities } from "#types";
|
|
7
|
+
import { useCallback, useDeferredValue, useEffect, useMemo, useState } from "react";
|
|
8
|
+
import { ScrollContainer, composable, composableProps } from "@dxos/react-ui";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { useAtomValue } from "@effect-atom/atom-react";
|
|
11
|
+
import { Timeline } from "@dxos/react-ui-components";
|
|
12
|
+
import { getTraceMessagesAtom, useTraceMessages } from "#hooks";
|
|
13
|
+
import { useAtomCapability, useCapability, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
14
|
+
import { mx } from "@dxos/ui-theme";
|
|
15
|
+
import { Syntax } from "@dxos/react-ui-syntax-highlighter";
|
|
16
|
+
import * as Data from "effect/Data";
|
|
17
|
+
import * as Duration from "effect/Duration";
|
|
18
|
+
import { pipe } from "effect/Function";
|
|
19
|
+
import { useAttentionAttributes } from "@dxos/react-ui-attention";
|
|
20
|
+
import { ProcessTree } from "#components";
|
|
21
|
+
import { buildExecutionGraph } from "#execution-graph";
|
|
22
|
+
//#region src/containers/TracePanel/TracePanel.tsx
|
|
23
|
+
var TracePanel = composable(({ space, attendableId, onProcessTerminate, ...props }, forwardedRef) => {
|
|
24
|
+
const attentionAttrs = useAttentionAttributes(attendableId);
|
|
25
|
+
const { invokePromise } = useOperationInvoker();
|
|
26
|
+
const tracePanelDebug = useAtomCapability(AssistantCapabilities.Settings).tracePanelDebug ?? false;
|
|
27
|
+
const { branches, commits, spanTree, details } = useDeferredValue(useExecutionGraph(space));
|
|
28
|
+
useEffect(() => {}, [useTraceMessages(space)]);
|
|
29
|
+
const [selectedCommit, setSelectedCommit] = useState();
|
|
30
|
+
const handleCommitSelect = useCallback((commit) => {
|
|
31
|
+
setSelectedCommit(commit);
|
|
32
|
+
if (commit?.link) {
|
|
33
|
+
const echoUri = EID.tryParse(commit.link);
|
|
34
|
+
const spaceId = echoUri ? EID.getSpaceId(echoUri) : void 0;
|
|
35
|
+
const objectId = echoUri ? EID.getEntityId(echoUri) : void 0;
|
|
36
|
+
if (spaceId && objectId) invokePromise(LayoutOperation.Open, { subject: [`${spaceId}:${objectId}`] });
|
|
37
|
+
}
|
|
38
|
+
}, [invokePromise, setSelectedCommit]);
|
|
39
|
+
const [currentBranch, setCurrentBranch] = useState(null);
|
|
40
|
+
const handleProcessSelect = useCallback((process) => {
|
|
41
|
+
const branch = branches.find((branch) => branch === process.pid.toString());
|
|
42
|
+
if (branch) setCurrentBranch(branch);
|
|
43
|
+
}, [branches]);
|
|
44
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
45
|
+
...composableProps(props, {
|
|
46
|
+
...attentionAttrs,
|
|
47
|
+
classNames: mx("h-full grid divide-y divide-subdued-separator", !tracePanelDebug && selectedCommit ? "grid-rows-[minmax(0,160px)_1fr_minmax(0,206px)]" : "grid-rows-[minmax(0,160px)_1fr]")
|
|
48
|
+
}),
|
|
49
|
+
ref: forwardedRef,
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsx(ProcessTreeContainer, {
|
|
52
|
+
onProcessSelect: handleProcessSelect,
|
|
53
|
+
onProcessTerminate
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ jsx(ScrollContainer.Root, {
|
|
56
|
+
pin: true,
|
|
57
|
+
children: /* @__PURE__ */ jsxs(ScrollContainer.Content, {
|
|
58
|
+
thin: true,
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ jsx(ScrollContainer.Fade, {}),
|
|
61
|
+
/* @__PURE__ */ jsx(ScrollContainer.Viewport, { children: tracePanelDebug ? /* @__PURE__ */ jsx(Syntax.Root, {
|
|
62
|
+
data: spanTree,
|
|
63
|
+
children: /* @__PURE__ */ jsx(Syntax.Content, { children: /* @__PURE__ */ jsx(Syntax.Viewport, { children: /* @__PURE__ */ jsx(Syntax.Code, { classNames: "text-xs" }) }) })
|
|
64
|
+
}) : /* @__PURE__ */ jsx(Timeline, {
|
|
65
|
+
compact: true,
|
|
66
|
+
commits,
|
|
67
|
+
branches,
|
|
68
|
+
currentBranch,
|
|
69
|
+
onSelect: handleCommitSelect
|
|
70
|
+
}) }),
|
|
71
|
+
/* @__PURE__ */ jsx(ScrollContainer.ScrollDownButton, {})
|
|
72
|
+
]
|
|
73
|
+
})
|
|
74
|
+
}),
|
|
75
|
+
!tracePanelDebug && selectedCommit && /* @__PURE__ */ jsx(Syntax.Root, {
|
|
76
|
+
data: details[selectedCommit.id] ?? selectedCommit,
|
|
77
|
+
children: /* @__PURE__ */ jsx(Syntax.Content, { children: /* @__PURE__ */ jsx(Syntax.Viewport, { children: /* @__PURE__ */ jsx(Syntax.Code, { classNames: "text-xs" }) }) })
|
|
78
|
+
})
|
|
79
|
+
]
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
var atomEmpty = Atom.make(() => []);
|
|
83
|
+
var SPAN_TIMEOUT_CHECK_INTERVAL_MS = 6e4;
|
|
84
|
+
var useExecutionGraph = (space, { collapseCompletedSpans, eventLimit } = {}) => {
|
|
85
|
+
const processesAtom = useCapability(Capabilities.ProcessMonitor)?.processTreeAtom ?? atomEmpty;
|
|
86
|
+
const [now, setNow] = useState(() => Date.now());
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
const id = setInterval(() => setNow(Date.now()), SPAN_TIMEOUT_CHECK_INTERVAL_MS);
|
|
89
|
+
return () => clearInterval(id);
|
|
90
|
+
}, []);
|
|
91
|
+
return useAtomValue(useMemo(() => getExecutionGraph(space, processesAtom, {
|
|
92
|
+
collapseCompletedSpans,
|
|
93
|
+
eventLimit,
|
|
94
|
+
now
|
|
95
|
+
}), [
|
|
96
|
+
space,
|
|
97
|
+
processesAtom,
|
|
98
|
+
collapseCompletedSpans,
|
|
99
|
+
eventLimit,
|
|
100
|
+
now
|
|
101
|
+
]));
|
|
102
|
+
};
|
|
103
|
+
var getExecutionGraph = (space, processesAtom, { collapseCompletedSpans = true, eventLimit = 100, now }) => {
|
|
104
|
+
const traceMessages = getTraceMessagesAtom(space);
|
|
105
|
+
const activeProcesses = pipe(processesAtom, Atom.debounce(Duration.millis(500)), Atom.map((processes) => Data.array(processes.filter((process) => process.state === Process.State.RUNNING || process.state === Process.State.HYBERNATING).map(Data.struct))));
|
|
106
|
+
return Atom.make((get) => buildExecutionGraph({
|
|
107
|
+
traceMessages: get(traceMessages),
|
|
108
|
+
activeProcesses: get(activeProcesses),
|
|
109
|
+
collapseCompletedSpans,
|
|
110
|
+
eventLimit,
|
|
111
|
+
now
|
|
112
|
+
}));
|
|
113
|
+
};
|
|
114
|
+
TracePanel.displayName = "TracePanel";
|
|
115
|
+
var ProcessTreeContainer = ({ onProcessSelect, onProcessTerminate }) => {
|
|
116
|
+
const monitor = useCapability(Capabilities.ProcessMonitor);
|
|
117
|
+
return /* @__PURE__ */ jsx(ProcessTree, {
|
|
118
|
+
processes: useDeferredValue(useAtomValue(useMemo(() => monitor?.processTreeAtom.pipe(Atom.debounce(Duration.millis(500))) ?? atomEmpty, [monitor]))),
|
|
119
|
+
depth: 3,
|
|
120
|
+
onProcessSelect,
|
|
121
|
+
onProcessTerminate
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
//#endregion
|
|
125
|
+
export { TracePanel as t };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=chunk-TracePanel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-TracePanel.mjs","names":[],"sources":["../../src/containers/TracePanel/TracePanel.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom';\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport * as Data from 'effect/Data';\nimport * as Duration from 'effect/Duration';\nimport { pipe } from 'effect/Function';\nimport React, { useCallback, useDeferredValue, useEffect, useMemo, useState } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useAtomCapability, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Process } from '@dxos/compute';\nimport { EID } from '@dxos/keys';\nimport { type Space } from '@dxos/react-client/echo';\nimport { ScrollContainer } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useAttentionAttributes } from '@dxos/react-ui-attention';\nimport { type Commit, Timeline } from '@dxos/react-ui-components';\nimport { Syntax } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/ui-theme';\n\nimport { ProcessTree, ProcessTreeProps } from '#components';\nimport { type ExecutionGraph, buildExecutionGraph } from '#execution-graph';\nimport { getTraceMessagesAtom, useTraceMessages } from '#hooks';\nimport { AssistantCapabilities } from '#types';\n\nexport type TracePanelProps = AppSurface.SpaceArticleProps<Pick<ProcessTreeProps, 'onProcessTerminate'>>;\n\nexport const TracePanel = composable<HTMLDivElement, TracePanelProps>(\n ({ space, attendableId, onProcessTerminate, ...props }, forwardedRef) => {\n const attentionAttrs = useAttentionAttributes(attendableId);\n const { invokePromise } = useOperationInvoker();\n const settings = useAtomCapability(AssistantCapabilities.Settings);\n const tracePanelDebug = settings.tracePanelDebug ?? false;\n\n // `useDeferredValue` batches update bursts, works together with `React.memo`.\n // See the comment in `ProcessTreeContainer` for more details.\n const { branches, commits, spanTree, details } = useDeferredValue(useExecutionGraph(space));\n\n // Debug hatch (dev builds only): expose the raw trace messages (the exact `buildExecutionGraph`\n // input) so a real trace can be captured as a test fixture. While the TracePanel is mounted, run\n // `dxosDumpTrace()` in the console — it copies the serialized `Trace.Message[]` to the clipboard\n // (and logs it). Gated on `import.meta.env.DEV` so it's stripped from production builds.\n const traceMessages = useTraceMessages(space);\n useEffect(() => {\n if (!import.meta.env.DEV) {\n return;\n }\n // Attach a debug hatch to the global object (a genuine global-augmentation boundary).\n const debugGlobal = globalThis as typeof globalThis & { dxosDumpTrace?: () => string };\n debugGlobal.dxosDumpTrace = () => {\n const data = traceMessages.map((message) => ({\n meta: message.meta,\n isEphemeral: message.isEphemeral,\n events: message.events,\n }));\n const json = JSON.stringify(data, null, 2);\n // eslint-disable-next-line no-console\n console.log(json);\n void navigator.clipboard?.writeText(json);\n return `dxosDumpTrace: ${data.length} message(s) copied to clipboard`;\n };\n return () => {\n delete debugGlobal.dxosDumpTrace;\n };\n }, [traceMessages]);\n\n const [selectedCommit, setSelectedCommit] = useState<Commit | undefined>();\n const handleCommitSelect = useCallback(\n (commit: Commit | undefined) => {\n setSelectedCommit(commit);\n if (commit?.link) {\n const echoUri = EID.tryParse(commit.link);\n const spaceId = echoUri ? EID.getSpaceId(echoUri) : undefined;\n const objectId = echoUri ? EID.getEntityId(echoUri) : undefined;\n if (spaceId && objectId) {\n // TODO(dmaretskyi): Navigates, but fails to open.\n void invokePromise(LayoutOperation.Open, {\n subject: [`${spaceId}:${objectId}`],\n });\n }\n }\n },\n [invokePromise, setSelectedCommit],\n );\n\n // Select current branch.\n const [currentBranch, setCurrentBranch] = useState<string | null>(null);\n const handleProcessSelect = useCallback(\n (process: Process.Info) => {\n const branch = branches.find((branch) => branch === process.pid.toString());\n if (branch) {\n setCurrentBranch(branch);\n }\n },\n [branches],\n );\n\n return (\n <div\n {...composableProps(props, {\n ...attentionAttrs,\n classNames: mx(\n 'h-full grid divide-y divide-subdued-separator',\n !tracePanelDebug && selectedCommit\n ? 'grid-rows-[minmax(0,160px)_1fr_minmax(0,206px)]'\n : 'grid-rows-[minmax(0,160px)_1fr]',\n ),\n })}\n ref={forwardedRef}\n >\n <ProcessTreeContainer onProcessSelect={handleProcessSelect} onProcessTerminate={onProcessTerminate} />\n\n <ScrollContainer.Root pin>\n <ScrollContainer.Content thin>\n <ScrollContainer.Fade />\n <ScrollContainer.Viewport>\n {tracePanelDebug ? (\n <Syntax.Root data={spanTree}>\n <Syntax.Content>\n <Syntax.Viewport>\n <Syntax.Code classNames='text-xs' />\n </Syntax.Viewport>\n </Syntax.Content>\n </Syntax.Root>\n ) : (\n <Timeline\n compact\n commits={commits}\n branches={branches}\n currentBranch={currentBranch}\n onSelect={handleCommitSelect}\n />\n )}\n </ScrollContainer.Viewport>\n <ScrollContainer.ScrollDownButton />\n </ScrollContainer.Content>\n </ScrollContainer.Root>\n\n {!tracePanelDebug && selectedCommit && (\n <Syntax.Root data={details[selectedCommit.id] ?? selectedCommit}>\n <Syntax.Content>\n <Syntax.Viewport>\n <Syntax.Code classNames='text-xs' />\n </Syntax.Viewport>\n </Syntax.Content>\n </Syntax.Root>\n )}\n </div>\n );\n },\n);\n\n// Stable ref.\nconst atomEmpty = Atom.make(() => [] as const);\n\n// How often the graph re-checks for spans that timed out with no closing event.\n// Coarse-grained on purpose: `spanTimeoutMs` operates on a 20-minute scale, so there is no\n// benefit to re-deriving the graph more often than this just to catch the timeout crossing.\nconst SPAN_TIMEOUT_CHECK_INTERVAL_MS = 60_000;\n\ntype UseExecutionGraphOptions = {\n collapseCompletedSpans?: boolean;\n eventLimit?: number;\n};\n\nconst useExecutionGraph = (\n space: Space,\n { collapseCompletedSpans, eventLimit }: UseExecutionGraphOptions = {},\n): ExecutionGraph => {\n const monitor = useCapability(Capabilities.ProcessMonitor);\n const processesAtom = monitor?.processTreeAtom ?? atomEmpty;\n\n // Ticks periodically so spans that are still open purely because no new trace event has\n // arrived (e.g. the runtime crashed before writing its `operationEnd`) eventually get\n // force-closed by `buildExecutionGraph`'s `spanTimeoutMs` check, instead of staying stuck\n // until unrelated trace activity happens to trigger a recompute.\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), SPAN_TIMEOUT_CHECK_INTERVAL_MS);\n return () => clearInterval(id);\n }, []);\n\n const atom = useMemo(\n () => getExecutionGraph(space, processesAtom, { collapseCompletedSpans, eventLimit, now }),\n [space, processesAtom, collapseCompletedSpans, eventLimit, now],\n );\n\n return useAtomValue(atom);\n};\n\nconst getExecutionGraph = (\n space: Space,\n processesAtom: Atom.Atom<readonly Process.Info[]>,\n { collapseCompletedSpans = true, eventLimit = 100, now }: UseExecutionGraphOptions & { now: number },\n): Atom.Atom<ExecutionGraph> => {\n const traceMessages = getTraceMessagesAtom(space);\n\n const activeProcesses = pipe(\n processesAtom,\n Atom.debounce(Duration.millis(500)),\n Atom.map((processes) =>\n // `Data.array` does structural comparison on the array elements.\n Data.array(\n processes\n .filter((process) => process.state === Process.State.RUNNING || process.state === Process.State.HYBERNATING)\n .map(Data.struct),\n ),\n ),\n );\n\n return Atom.make((get) =>\n buildExecutionGraph({\n traceMessages: get(traceMessages),\n activeProcesses: get(activeProcesses),\n collapseCompletedSpans,\n eventLimit,\n now,\n }),\n );\n};\nTracePanel.displayName = 'TracePanel';\n\n// Isolate `ProcessTree` updates from the rest of the panel.\n// TODO(dmaretskyi): Currently not useful since `useExecutionGraph` also pulls in the updates.\nconst ProcessTreeContainer = ({\n onProcessSelect,\n onProcessTerminate,\n}: Pick<ProcessTreeProps, 'onProcessSelect' | 'onProcessTerminate'>) => {\n const monitor = useCapability(Capabilities.ProcessMonitor);\n const processes = useAtomValue(\n useMemo(() => monitor?.processTreeAtom.pipe(Atom.debounce(Duration.millis(500))) ?? atomEmpty, [monitor]),\n );\n\n // `processes` updates in bursts (about 14 updates per navigation).\n // `useDeferredValue` will debounce update propagation, returning stale value for short periods.\n // NOTE: `ProcessTree` MUST use `React.memo`, otherwise this will not work.\n const processesDeferred = useDeferredValue(processes);\n return (\n <ProcessTree\n processes={processesDeferred}\n depth={3}\n onProcessSelect={onProcessSelect}\n onProcessTerminate={onProcessTerminate}\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAa,aAAa,YACvB,EAAE,OAAO,cAAc,oBAAoB,GAAG,SAAS,iBAAiB;CACvE,MAAM,iBAAiB,uBAAuB,YAAY;CAC1D,MAAM,EAAE,kBAAkB,oBAAoB;CAE9C,MAAM,kBADW,kBAAkB,sBAAsB,QACjC,CAAA,CAAS,mBAAmB;CAIpD,MAAM,EAAE,UAAU,SAAS,UAAU,YAAY,iBAAiB,kBAAkB,KAAK,CAAC;CAO1F,gBAAgB,CAqBhB,GAAG,CAtBmB,iBAAiB,KAsBnC,CAAa,CAAC;CAElB,MAAM,CAAC,gBAAgB,qBAAqB,SAA6B;CACzE,MAAM,qBAAqB,aACxB,WAA+B;EAC9B,kBAAkB,MAAM;EACxB,IAAI,QAAQ,MAAM;GAChB,MAAM,UAAU,IAAI,SAAS,OAAO,IAAI;GACxC,MAAM,UAAU,UAAU,IAAI,WAAW,OAAO,IAAI,KAAA;GACpD,MAAM,WAAW,UAAU,IAAI,YAAY,OAAO,IAAI,KAAA;GACtD,IAAI,WAAW,UAEb,cAAmB,gBAAgB,MAAM,EACvC,SAAS,CAAC,GAAG,QAAQ,GAAG,UAAU,EACpC,CAAC;EAEL;CACF,GACA,CAAC,eAAe,iBAAiB,CACnC;CAGA,MAAM,CAAC,eAAe,oBAAoB,SAAwB,IAAI;CACtE,MAAM,sBAAsB,aACzB,YAA0B;EACzB,MAAM,SAAS,SAAS,MAAM,WAAW,WAAW,QAAQ,IAAI,SAAS,CAAC;EAC1E,IAAI,QACF,iBAAiB,MAAM;CAE3B,GACA,CAAC,QAAQ,CACX;CAEA,OACE,qBAAC,OAAD;EACE,GAAI,gBAAgB,OAAO;GACzB,GAAG;GACH,YAAY,GACV,iDACA,CAAC,mBAAmB,iBAChB,oDACA,iCACN;EACF,CAAC;EACD,KAAK;YAVP;GAYE,oBAAC,sBAAD;IAAsB,iBAAiB;IAAyC;GAAqB,CAAA;GAErG,oBAAC,gBAAgB,MAAjB;IAAsB,KAAA;cACpB,qBAAC,gBAAgB,SAAjB;KAAyB,MAAA;eAAzB;MACE,oBAAC,gBAAgB,MAAjB,CAAuB,CAAA;MACvB,oBAAC,gBAAgB,UAAjB,EAAA,UACG,kBACC,oBAAC,OAAO,MAAR;OAAa,MAAM;iBACjB,oBAAC,OAAO,SAAR,EAAA,UACE,oBAAC,OAAO,UAAR,EAAA,UACE,oBAAC,OAAO,MAAR,EAAa,YAAW,UAAW,CAAA,EACpB,CAAA,EACH,CAAA;MACL,CAAA,IAEb,oBAAC,UAAD;OACE,SAAA;OACS;OACC;OACK;OACf,UAAU;MACX,CAAA,EAEqB,CAAA;MAC1B,oBAAC,gBAAgB,kBAAjB,CAAmC,CAAA;KACZ;;GACL,CAAA;GAErB,CAAC,mBAAmB,kBACnB,oBAAC,OAAO,MAAR;IAAa,MAAM,QAAQ,eAAe,OAAO;cAC/C,oBAAC,OAAO,SAAR,EAAA,UACE,oBAAC,OAAO,UAAR,EAAA,UACE,oBAAC,OAAO,MAAR,EAAa,YAAW,UAAW,CAAA,EACpB,CAAA,EACH,CAAA;GACL,CAAA;EAEZ;;AAET,CACF;AAGA,IAAM,YAAY,KAAK,WAAW,CAAC,CAAU;AAK7C,IAAM,iCAAiC;AAOvC,IAAM,qBACJ,OACA,EAAE,wBAAwB,eAAyC,CAAC,MACjD;CAEnB,MAAM,gBADU,cAAc,aAAa,cACrB,CAAA,EAAS,mBAAmB;CAMlD,MAAM,CAAC,KAAK,UAAU,eAAe,KAAK,IAAI,CAAC;CAC/C,gBAAgB;EACd,MAAM,KAAK,kBAAkB,OAAO,KAAK,IAAI,CAAC,GAAG,8BAA8B;EAC/E,aAAa,cAAc,EAAE;CAC/B,GAAG,CAAC,CAAC;CAOL,OAAO,aALM,cACL,kBAAkB,OAAO,eAAe;EAAE;EAAwB;EAAY;CAAI,CAAC,GACzF;EAAC;EAAO;EAAe;EAAwB;EAAY;CAAG,CAG5C,CAAI;AAC1B;AAEA,IAAM,qBACJ,OACA,eACA,EAAE,yBAAyB,MAAM,aAAa,KAAK,UACrB;CAC9B,MAAM,gBAAgB,qBAAqB,KAAK;CAEhD,MAAM,kBAAkB,KACtB,eACA,KAAK,SAAS,SAAS,OAAO,GAAG,CAAC,GAClC,KAAK,KAAK,cAER,KAAK,MACH,UACG,QAAQ,YAAY,QAAQ,UAAU,QAAQ,MAAM,WAAW,QAAQ,UAAU,QAAQ,MAAM,WAAW,CAAA,CAC1G,IAAI,KAAK,MAAM,CACpB,CACF,CACF;CAEA,OAAO,KAAK,MAAM,QAChB,oBAAoB;EAClB,eAAe,IAAI,aAAa;EAChC,iBAAiB,IAAI,eAAe;EACpC;EACA;EACA;CACF,CAAC,CACH;AACF;AACA,WAAW,cAAc;AAIzB,IAAM,wBAAwB,EAC5B,iBACA,yBACsE;CACtE,MAAM,UAAU,cAAc,aAAa,cAAc;CASzD,OACE,oBAAC,aAAD;EACE,WAHsB,iBAPR,aAChB,cAAc,SAAS,gBAAgB,KAAK,KAAK,SAAS,SAAS,OAAO,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,CAM/D,CAG5B;EACX,OAAO;EACU;EACG;CACrB,CAAA;AAEL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-TracePanel2.mjs","names":[],"sources":["../../src/containers/TracePanel/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { TracePanel } from './TracePanel';\n\nexport * from './TracePanel';\n\nexport default TracePanel;\n"],"mappings":";;AAQA,IAAA,qBAAe"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { meta } from "#meta";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { IconButton, Popover, useTranslation } from "@dxos/react-ui";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useTriggerRuntimeControls } from "@dxos/plugin-routine/hooks";
|
|
6
|
+
import { StatusBar } from "@dxos/plugin-status-bar/components";
|
|
7
|
+
//#region src/containers/TriggerStatus/TriggerStatus.tsx
|
|
8
|
+
var getIcon = (state) => {
|
|
9
|
+
switch (state) {
|
|
10
|
+
case "disabled": return "ph--lightning-slash--regular";
|
|
11
|
+
case "idle": return "ph--lightning--regular";
|
|
12
|
+
case "running": return "ph--lightning--fill";
|
|
13
|
+
case "error": return "ph--warning--regular";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var getIconClassNames = (state) => {
|
|
17
|
+
switch (state) {
|
|
18
|
+
case "running": return "animate-pulse text-accent-text";
|
|
19
|
+
case "error": return "text-error-text";
|
|
20
|
+
default: return;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var SpaceStatus = ({ space }) => {
|
|
24
|
+
const { t } = useTranslation(meta.profile.key);
|
|
25
|
+
const { state } = useTriggerRuntimeControls(space.db);
|
|
26
|
+
const isEnabled = state?.enabled ?? false;
|
|
27
|
+
const triggerState = useMemo(() => {
|
|
28
|
+
if (!isEnabled) return "disabled";
|
|
29
|
+
if (state?.invocations.some((invocation) => invocation.result === null)) return "running";
|
|
30
|
+
if ((state?.invocations.at(-1))?.result?._tag === "Failure") return "error";
|
|
31
|
+
return "idle";
|
|
32
|
+
}, [isEnabled, state?.invocations]);
|
|
33
|
+
return /* @__PURE__ */ jsxs(Popover.Root, { children: [/* @__PURE__ */ jsx(Popover.Trigger, {
|
|
34
|
+
asChild: true,
|
|
35
|
+
children: /* @__PURE__ */ jsx(StatusBar.Item, { children: /* @__PURE__ */ jsx(IconButton, {
|
|
36
|
+
variant: "ghost",
|
|
37
|
+
icon: getIcon(triggerState),
|
|
38
|
+
iconOnly: true,
|
|
39
|
+
label: t(`trigger-status-${triggerState}.label`),
|
|
40
|
+
classNames: getIconClassNames(triggerState)
|
|
41
|
+
}) })
|
|
42
|
+
}), /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(Popover.Content, {
|
|
43
|
+
side: "left",
|
|
44
|
+
children: [/* @__PURE__ */ jsx(TriggerStatusPopover, {
|
|
45
|
+
state: triggerState,
|
|
46
|
+
currentFunctionName: state?.invocations.at(-1)?.function?.meta.name ?? state?.invocations.at(-1)?.function?.meta.key,
|
|
47
|
+
lastInvocation: state?.invocations.at(-1)
|
|
48
|
+
}), /* @__PURE__ */ jsx(Popover.Arrow, {})]
|
|
49
|
+
}) })] });
|
|
50
|
+
};
|
|
51
|
+
var TriggerStatusPopover = ({ state, currentFunctionName, lastInvocation }) => {
|
|
52
|
+
const { t } = useTranslation(meta.profile.key);
|
|
53
|
+
return /* @__PURE__ */ jsx("div", {
|
|
54
|
+
className: "flex flex-col gap-2 p-2 w-[240px]",
|
|
55
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
56
|
+
className: "flex flex-col gap-1",
|
|
57
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
58
|
+
className: "text-sm",
|
|
59
|
+
children: t(`trigger-status-${state}.label`)
|
|
60
|
+
}), currentFunctionName && state === "running" && /* @__PURE__ */ jsx("div", {
|
|
61
|
+
className: "text-xs text-description",
|
|
62
|
+
children: currentFunctionName
|
|
63
|
+
})]
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
SpaceStatus.displayName = "SpaceStatus";
|
|
68
|
+
TriggerStatusPopover.displayName = "TriggerStatusPopover";
|
|
69
|
+
//#endregion
|
|
70
|
+
export { SpaceStatus, SpaceStatus as default };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=chunk-TriggerStatus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-TriggerStatus.mjs","names":[],"sources":["../../src/containers/TriggerStatus/TriggerStatus.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type InvocationsState } from '@dxos/compute-runtime';\nimport { useTriggerRuntimeControls } from '@dxos/plugin-routine/hooks';\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { IconButton, Popover, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\ntype TriggerStatusState = 'disabled' | 'idle' | 'running' | 'error';\n\nconst getIcon = (state: TriggerStatusState): string => {\n switch (state) {\n case 'disabled':\n return 'ph--lightning-slash--regular';\n case 'idle':\n return 'ph--lightning--regular';\n case 'running':\n return 'ph--lightning--fill';\n case 'error':\n return 'ph--warning--regular';\n }\n};\n\nconst getIconClassNames = (state: TriggerStatusState): string | undefined => {\n switch (state) {\n case 'running':\n return 'animate-pulse text-accent-text';\n case 'error':\n return 'text-error-text';\n default:\n return undefined;\n }\n};\n\nexport type SpaceStatusProps = AppSurface.SpaceArticleProps;\n\nexport const SpaceStatus = ({ space }: SpaceStatusProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { state } = useTriggerRuntimeControls(space.db);\n // The dispatcher is stopped for the space when `triggersDisabled` is set, so `enabled` already\n // reflects the space-wide kill-switch; per-trigger edge routing does not affect this indicator.\n const isEnabled = state?.enabled ?? false;\n\n // Determine the current trigger status state.\n const triggerState: TriggerStatusState = useMemo(() => {\n if (!isEnabled) {\n return 'disabled';\n }\n\n // Check if there's any pending invocation.\n const hasPending = state?.invocations.some((invocation) => invocation.result === null);\n if (hasPending) {\n return 'running';\n }\n\n // Check if the last invocation failed.\n const lastInvocation = state?.invocations.at(-1);\n if (lastInvocation?.result?._tag === 'Failure') {\n return 'error';\n }\n\n return 'idle';\n }, [isEnabled, state?.invocations]);\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon={getIcon(triggerState)}\n iconOnly\n label={t(`trigger-status-${triggerState}.label`)}\n classNames={getIconClassNames(triggerState)}\n />\n </StatusBar.Item>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content side='left'>\n <TriggerStatusPopover\n state={triggerState}\n currentFunctionName={\n state?.invocations.at(-1)?.function?.meta.name ?? state?.invocations.at(-1)?.function?.meta.key\n }\n lastInvocation={state?.invocations.at(-1)}\n />\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n\ntype TriggerStatusPopoverProps = {\n state: TriggerStatusState;\n currentFunctionName?: string;\n lastInvocation?: InvocationsState;\n};\n\nconst TriggerStatusPopover = ({\n state,\n currentFunctionName,\n lastInvocation, // TODO(burdon): Show.\n}: TriggerStatusPopoverProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <div className='flex flex-col gap-2 p-2 w-[240px]'>\n <div className='flex flex-col gap-1'>\n <div className='text-sm'>{t(`trigger-status-${state}.label`)}</div>\n {currentFunctionName && state === 'running' && (\n <div className='text-xs text-description'>{currentFunctionName}</div>\n )}\n </div>\n </div>\n );\n};\n\nSpaceStatus.displayName = 'SpaceStatus';\n\nTriggerStatusPopover.displayName = 'TriggerStatusPopover';\n"],"mappings":";;;;;;;AAgBA,IAAM,WAAW,UAAsC;CACrD,QAAQ,OAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,SACH,OAAO;CACX;AACF;AAEA,IAAM,qBAAqB,UAAkD;CAC3E,QAAQ,OAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,SACE;CACJ;AACF;AAIA,IAAa,eAAe,EAAE,YAA8B;CAC1D,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,EAAE,UAAU,0BAA0B,MAAM,EAAE;CAGpD,MAAM,YAAY,OAAO,WAAW;CAGpC,MAAM,eAAmC,cAAc;EACrD,IAAI,CAAC,WACH,OAAO;EAKT,IADmB,OAAO,YAAY,MAAM,eAAe,WAAW,WAAW,IAAI,GAEnF,OAAO;EAKT,KADuB,OAAO,YAAY,GAAG,EAAE,EAAA,EAC3B,QAAQ,SAAS,WACnC,OAAO;EAGT,OAAO;CACT,GAAG,CAAC,WAAW,OAAO,WAAW,CAAC;CAElC,OACE,qBAAC,QAAQ,MAAT,EAAA,UAAA,CACE,oBAAC,QAAQ,SAAT;EAAiB,SAAA;YACf,oBAAC,UAAU,MAAX,EAAA,UACE,oBAAC,YAAD;GACE,SAAQ;GACR,MAAM,QAAQ,YAAY;GAC1B,UAAA;GACA,OAAO,EAAE,kBAAkB,aAAa,OAAO;GAC/C,YAAY,kBAAkB,YAAY;EAC3C,CAAA,EACa,CAAA;CACD,CAAA,GACjB,oBAAC,QAAQ,QAAT,EAAA,UACE,qBAAC,QAAQ,SAAT;EAAiB,MAAK;YAAtB,CACE,oBAAC,sBAAD;GACE,OAAO;GACP,qBACE,OAAO,YAAY,GAAG,EAAE,CAAC,EAAE,UAAU,KAAK,QAAQ,OAAO,YAAY,GAAG,EAAE,CAAC,EAAE,UAAU,KAAK;GAE9F,gBAAgB,OAAO,YAAY,GAAG,EAAE;EACzC,CAAA,GACD,oBAAC,QAAQ,OAAT,CAAgB,CAAA,CACD;IACH,CAAA,CACJ,EAAA,CAAA;AAElB;AAQA,IAAM,wBAAwB,EAC5B,OACA,qBACA,qBAC+B;CAC/B,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAE7C,OACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD;IAAK,WAAU;cAAW,EAAE,kBAAkB,MAAM,OAAO;GAAO,CAAA,GACjE,uBAAuB,UAAU,aAChC,oBAAC,OAAD;IAAK,WAAU;cAA4B;GAAyB,CAAA,CAEnE;;CACF,CAAA;AAET;AAEA,YAAY,cAAc;AAE1B,qBAAqB,cAAc"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AgentService, ServiceResolver } from "@dxos/compute";
|
|
2
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import { log } from "@dxos/log";
|
|
5
|
+
import * as Cause from "effect/Cause";
|
|
6
|
+
//#region src/capabilities/agent-hydrator.ts
|
|
7
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/capabilities/agent-hydrator.ts";
|
|
8
|
+
var agent_hydrator_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
9
|
+
(yield* Capability.get(Capabilities.ProcessManagerRuntime)).runFork(Effect.gen(function* () {
|
|
10
|
+
yield* (yield* AgentService.AgentService).hydrate();
|
|
11
|
+
}).pipe(Effect.provide(ServiceResolver.provide({}, AgentService.AgentService)), Effect.catchAllCause((cause) => Effect.sync(() => log.warn("agent hydrate failed", { cause: Cause.pretty(cause) }, {
|
|
12
|
+
"~LogMeta": "~LogMeta",
|
|
13
|
+
F: __dxlog_file,
|
|
14
|
+
L: 29,
|
|
15
|
+
S: this
|
|
16
|
+
})))));
|
|
17
|
+
return Capability.contributes(Capabilities.Null, null);
|
|
18
|
+
}));
|
|
19
|
+
//#endregion
|
|
20
|
+
export { agent_hydrator_default as default };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=chunk-agent-hydrator.mjs.map
|