@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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useCallback } from 'react';
|
|
6
6
|
|
|
7
|
-
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
7
|
+
import { HomeSection, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
8
|
import { RoutineOperation } from '@dxos/plugin-routine/types';
|
|
9
9
|
import { type Space } from '@dxos/react-client/echo';
|
|
10
10
|
import { Card, IconButton, useTranslation } from '@dxos/react-ui';
|
|
@@ -14,6 +14,7 @@ import { meta } from '#meta';
|
|
|
14
14
|
|
|
15
15
|
type SpaceScopedProps = {
|
|
16
16
|
space?: Space;
|
|
17
|
+
onClose?: () => void;
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
/**
|
|
@@ -21,7 +22,7 @@ type SpaceScopedProps = {
|
|
|
21
22
|
* assistant operation. Always renders (below the recent-objects masonry) so the Home page offers
|
|
22
23
|
* quick entry points regardless of whether recent objects exist.
|
|
23
24
|
*/
|
|
24
|
-
export const SpaceHomeSuggestions = ({ space }: SpaceScopedProps) => {
|
|
25
|
+
export const SpaceHomeSuggestions = ({ space, onClose }: SpaceScopedProps) => {
|
|
25
26
|
const { t } = useTranslation(meta.profile.key);
|
|
26
27
|
const { invokePromise } = useOperationInvoker();
|
|
27
28
|
const suggestions = useHomeSuggestions(space);
|
|
@@ -41,43 +42,43 @@ export const SpaceHomeSuggestions = ({ space }: SpaceScopedProps) => {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
return (
|
|
44
|
-
<
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
>
|
|
62
|
-
<Card.
|
|
63
|
-
<Card.
|
|
64
|
-
<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
))}
|
|
79
|
-
</div>
|
|
45
|
+
<HomeSection.Root>
|
|
46
|
+
<HomeSection.Header title={t('space-home.suggestions.heading')} onClose={onClose} />
|
|
47
|
+
<div className='flex flex-col gap-3'>
|
|
48
|
+
{suggestions.map((prompt, index) => (
|
|
49
|
+
<div
|
|
50
|
+
key={`${index}:${prompt}`}
|
|
51
|
+
role='button'
|
|
52
|
+
tabIndex={0}
|
|
53
|
+
className='cursor-pointer w-full'
|
|
54
|
+
onClick={() => handleRunPrompt(prompt)}
|
|
55
|
+
onKeyDown={(e) => {
|
|
56
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
handleRunPrompt(prompt);
|
|
59
|
+
}
|
|
60
|
+
}}
|
|
61
|
+
>
|
|
62
|
+
<Card.Root fullWidth>
|
|
63
|
+
<Card.Header>
|
|
64
|
+
<Card.Block>
|
|
65
|
+
<IconButton
|
|
66
|
+
variant='ghost'
|
|
67
|
+
label={prompt}
|
|
68
|
+
icon='ph--sparkle--regular'
|
|
69
|
+
iconOnly
|
|
70
|
+
tabIndex={-1}
|
|
71
|
+
aria-hidden
|
|
72
|
+
/>
|
|
73
|
+
</Card.Block>
|
|
74
|
+
<Card.Title>{prompt}</Card.Title>
|
|
75
|
+
</Card.Header>
|
|
76
|
+
</Card.Root>
|
|
77
|
+
</div>
|
|
78
|
+
))}
|
|
80
79
|
</div>
|
|
81
|
-
</
|
|
80
|
+
</HomeSection.Root>
|
|
82
81
|
);
|
|
83
82
|
};
|
|
83
|
+
|
|
84
|
+
SpaceHomeSuggestions.displayName = 'SpaceHomeSuggestions';
|
|
@@ -8,17 +8,19 @@ import React, { PropsWithChildren, type ReactNode, useCallback, useEffect, useMe
|
|
|
8
8
|
|
|
9
9
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
10
10
|
import { useProcessManagerRuntime } from '@dxos/app-framework/ui';
|
|
11
|
+
import { AppActivationEvents } from '@dxos/app-toolkit';
|
|
11
12
|
import { addEventListener } from '@dxos/async';
|
|
12
13
|
import { Process, Trace } from '@dxos/compute';
|
|
13
14
|
import { ProcessManager } from '@dxos/compute-runtime';
|
|
15
|
+
import { FeedTraceSink } from '@dxos/compute-runtime';
|
|
14
16
|
import { Feed, Filter, Query } from '@dxos/echo';
|
|
15
|
-
import {
|
|
17
|
+
import { useQuery } from '@dxos/echo-react';
|
|
16
18
|
import { log } from '@dxos/log';
|
|
17
19
|
import { ClientPlugin } from '@dxos/plugin-client/testing';
|
|
18
20
|
import { initializeIdentity } from '@dxos/plugin-client/testing';
|
|
19
21
|
import { RoutinePlugin } from '@dxos/plugin-routine/testing';
|
|
20
22
|
import { corePlugins } from '@dxos/plugin-testing';
|
|
21
|
-
import {
|
|
23
|
+
import { useSpaces } from '@dxos/react-client/echo';
|
|
22
24
|
import { IconButton, Panel, ScrollContainer, Toolbar } from '@dxos/react-ui';
|
|
23
25
|
import { type Commit, Timeline } from '@dxos/react-ui-components';
|
|
24
26
|
import { Syntax } from '@dxos/react-ui-syntax-highlighter';
|
|
@@ -56,7 +58,7 @@ const JsonInspectorPanel = ({ data }: { data: unknown }) => (
|
|
|
56
58
|
<Syntax.Root data={data}>
|
|
57
59
|
<Syntax.Content>
|
|
58
60
|
<Syntax.Viewport>
|
|
59
|
-
<Syntax.Code
|
|
61
|
+
<Syntax.Code classNames='text-xs' />
|
|
60
62
|
</Syntax.Viewport>
|
|
61
63
|
</Syntax.Content>
|
|
62
64
|
</Syntax.Root>
|
|
@@ -262,7 +264,7 @@ const TimelinePlayback = ({
|
|
|
262
264
|
/>
|
|
263
265
|
<IconButton iconOnly icon='ph--caret-right--regular' label='Step forward (→ / L)' onClick={handleNext} />
|
|
264
266
|
<IconButton iconOnly icon='ph--skip-forward--regular' label='Show all (E / End)' onClick={handleShowAll} />
|
|
265
|
-
<Toolbar.Text
|
|
267
|
+
<Toolbar.Text classNames='text-right text-sm tabular-nums opacity-70'>
|
|
266
268
|
{step} / {total}
|
|
267
269
|
</Toolbar.Text>
|
|
268
270
|
</Toolbar.Root>
|
|
@@ -307,6 +309,9 @@ export const Default: Story = {
|
|
|
307
309
|
withTheme(),
|
|
308
310
|
withLayout({ layout: 'column', classNames: 'w-(--dx-complementary-sidebar-size) overflow-hidden' }),
|
|
309
311
|
withPluginManager({
|
|
312
|
+
// Fire SetupSettings so the assistant settings module activates and contributes
|
|
313
|
+
// `AssistantCapabilities.Settings`, which `TracePanel` reads via `useAtomCapability`.
|
|
314
|
+
setupEvents: [AppActivationEvents.SetupSettings],
|
|
310
315
|
plugins: [
|
|
311
316
|
...corePlugins(),
|
|
312
317
|
ClientPlugin({
|
|
@@ -105,7 +105,7 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
|
|
|
105
105
|
{...composableProps(props, {
|
|
106
106
|
...attentionAttrs,
|
|
107
107
|
classNames: mx(
|
|
108
|
-
'h-full grid divide-y divide-separator',
|
|
108
|
+
'h-full grid divide-y divide-subdued-separator',
|
|
109
109
|
!tracePanelDebug && selectedCommit
|
|
110
110
|
? 'grid-rows-[minmax(0,160px)_1fr_minmax(0,206px)]'
|
|
111
111
|
: 'grid-rows-[minmax(0,160px)_1fr]',
|
|
@@ -123,7 +123,7 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
|
|
|
123
123
|
<Syntax.Root data={spanTree}>
|
|
124
124
|
<Syntax.Content>
|
|
125
125
|
<Syntax.Viewport>
|
|
126
|
-
<Syntax.Code
|
|
126
|
+
<Syntax.Code classNames='text-xs' />
|
|
127
127
|
</Syntax.Viewport>
|
|
128
128
|
</Syntax.Content>
|
|
129
129
|
</Syntax.Root>
|
|
@@ -145,7 +145,7 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
|
|
|
145
145
|
<Syntax.Root data={details[selectedCommit.id] ?? selectedCommit}>
|
|
146
146
|
<Syntax.Content>
|
|
147
147
|
<Syntax.Viewport>
|
|
148
|
-
<Syntax.Code
|
|
148
|
+
<Syntax.Code classNames='text-xs' />
|
|
149
149
|
</Syntax.Viewport>
|
|
150
150
|
</Syntax.Content>
|
|
151
151
|
</Syntax.Root>
|
|
@@ -158,6 +158,11 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
|
|
|
158
158
|
// Stable ref.
|
|
159
159
|
const atomEmpty = Atom.make(() => [] as const);
|
|
160
160
|
|
|
161
|
+
// How often the graph re-checks for spans that timed out with no closing event.
|
|
162
|
+
// Coarse-grained on purpose: `spanTimeoutMs` operates on a 20-minute scale, so there is no
|
|
163
|
+
// benefit to re-deriving the graph more often than this just to catch the timeout crossing.
|
|
164
|
+
const SPAN_TIMEOUT_CHECK_INTERVAL_MS = 60_000;
|
|
165
|
+
|
|
161
166
|
type UseExecutionGraphOptions = {
|
|
162
167
|
collapseCompletedSpans?: boolean;
|
|
163
168
|
eventLimit?: number;
|
|
@@ -170,9 +175,19 @@ const useExecutionGraph = (
|
|
|
170
175
|
const monitor = useCapability(Capabilities.ProcessMonitor);
|
|
171
176
|
const processesAtom = monitor?.processTreeAtom ?? atomEmpty;
|
|
172
177
|
|
|
178
|
+
// Ticks periodically so spans that are still open purely because no new trace event has
|
|
179
|
+
// arrived (e.g. the runtime crashed before writing its `operationEnd`) eventually get
|
|
180
|
+
// force-closed by `buildExecutionGraph`'s `spanTimeoutMs` check, instead of staying stuck
|
|
181
|
+
// until unrelated trace activity happens to trigger a recompute.
|
|
182
|
+
const [now, setNow] = useState(() => Date.now());
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
const id = setInterval(() => setNow(Date.now()), SPAN_TIMEOUT_CHECK_INTERVAL_MS);
|
|
185
|
+
return () => clearInterval(id);
|
|
186
|
+
}, []);
|
|
187
|
+
|
|
173
188
|
const atom = useMemo(
|
|
174
|
-
() => getExecutionGraph(space, processesAtom, { collapseCompletedSpans, eventLimit }),
|
|
175
|
-
[space, processesAtom, collapseCompletedSpans, eventLimit],
|
|
189
|
+
() => getExecutionGraph(space, processesAtom, { collapseCompletedSpans, eventLimit, now }),
|
|
190
|
+
[space, processesAtom, collapseCompletedSpans, eventLimit, now],
|
|
176
191
|
);
|
|
177
192
|
|
|
178
193
|
return useAtomValue(atom);
|
|
@@ -181,7 +196,7 @@ const useExecutionGraph = (
|
|
|
181
196
|
const getExecutionGraph = (
|
|
182
197
|
space: Space,
|
|
183
198
|
processesAtom: Atom.Atom<readonly Process.Info[]>,
|
|
184
|
-
{ collapseCompletedSpans = true, eventLimit = 100 }: UseExecutionGraphOptions
|
|
199
|
+
{ collapseCompletedSpans = true, eventLimit = 100, now }: UseExecutionGraphOptions & { now: number },
|
|
185
200
|
): Atom.Atom<ExecutionGraph> => {
|
|
186
201
|
const traceMessages = getTraceMessagesAtom(space);
|
|
187
202
|
|
|
@@ -204,6 +219,7 @@ const getExecutionGraph = (
|
|
|
204
219
|
activeProcesses: get(activeProcesses),
|
|
205
220
|
collapseCompletedSpans,
|
|
206
221
|
eventLimit,
|
|
222
|
+
now,
|
|
207
223
|
}),
|
|
208
224
|
);
|
|
209
225
|
};
|
|
@@ -5,16 +5,14 @@
|
|
|
5
5
|
import React, { useMemo } from 'react';
|
|
6
6
|
|
|
7
7
|
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
8
|
-
import { type InvocationsState } from '@dxos/
|
|
8
|
+
import { type InvocationsState } from '@dxos/compute-runtime';
|
|
9
9
|
import { useTriggerRuntimeControls } from '@dxos/plugin-routine/hooks';
|
|
10
10
|
import { StatusBar } from '@dxos/plugin-status-bar/components';
|
|
11
|
-
import { useMulticastObservable } from '@dxos/react-client';
|
|
12
|
-
import { SpaceState, useObject } from '@dxos/react-client/echo';
|
|
13
11
|
import { IconButton, Popover, useTranslation } from '@dxos/react-ui';
|
|
14
12
|
|
|
15
13
|
import { meta } from '#meta';
|
|
16
14
|
|
|
17
|
-
type TriggerStatusState = 'disabled' | 'idle' | 'running' | '
|
|
15
|
+
type TriggerStatusState = 'disabled' | 'idle' | 'running' | 'error';
|
|
18
16
|
|
|
19
17
|
const getIcon = (state: TriggerStatusState): string => {
|
|
20
18
|
switch (state) {
|
|
@@ -22,8 +20,6 @@ const getIcon = (state: TriggerStatusState): string => {
|
|
|
22
20
|
return 'ph--lightning-slash--regular';
|
|
23
21
|
case 'idle':
|
|
24
22
|
return 'ph--lightning--regular';
|
|
25
|
-
case 'edge':
|
|
26
|
-
return 'ph--lightning--regular';
|
|
27
23
|
case 'running':
|
|
28
24
|
return 'ph--lightning--fill';
|
|
29
25
|
case 'error':
|
|
@@ -47,19 +43,12 @@ export type SpaceStatusProps = AppSurface.SpaceArticleProps;
|
|
|
47
43
|
export const SpaceStatus = ({ space }: SpaceStatusProps) => {
|
|
48
44
|
const { t } = useTranslation(meta.profile.key);
|
|
49
45
|
const { state } = useTriggerRuntimeControls(space.db);
|
|
46
|
+
// The dispatcher is stopped for the space when `triggersDisabled` is set, so `enabled` already
|
|
47
|
+
// reflects the space-wide kill-switch; per-trigger edge routing does not affect this indicator.
|
|
50
48
|
const isEnabled = state?.enabled ?? false;
|
|
51
|
-
// `space.properties` throws until the space finishes initializing (e.g. right after joining);
|
|
52
|
-
// gate on `space.state` so this component doesn't crash for a freshly-joined space.
|
|
53
|
-
const spaceState = useMulticastObservable(space.state);
|
|
54
|
-
const [properties] = useObject(spaceState === SpaceState.SPACE_READY ? space.properties : undefined);
|
|
55
|
-
const computeEnvironment = properties?.computeEnvironment ?? 'local';
|
|
56
49
|
|
|
57
50
|
// Determine the current trigger status state.
|
|
58
51
|
const triggerState: TriggerStatusState = useMemo(() => {
|
|
59
|
-
if (computeEnvironment === 'edge') {
|
|
60
|
-
return 'edge';
|
|
61
|
-
}
|
|
62
|
-
|
|
63
52
|
if (!isEnabled) {
|
|
64
53
|
return 'disabled';
|
|
65
54
|
}
|
|
@@ -77,7 +66,7 @@ export const SpaceStatus = ({ space }: SpaceStatusProps) => {
|
|
|
77
66
|
}
|
|
78
67
|
|
|
79
68
|
return 'idle';
|
|
80
|
-
}, [
|
|
69
|
+
}, [isEnabled, state?.invocations]);
|
|
81
70
|
|
|
82
71
|
return (
|
|
83
72
|
<Popover.Root>
|
|
@@ -132,3 +121,7 @@ const TriggerStatusPopover = ({
|
|
|
132
121
|
</div>
|
|
133
122
|
);
|
|
134
123
|
};
|
|
124
|
+
|
|
125
|
+
SpaceStatus.displayName = 'SpaceStatus';
|
|
126
|
+
|
|
127
|
+
TriggerStatusPopover.displayName = 'TriggerStatusPopover';
|
package/src/containers/index.ts
CHANGED
|
@@ -11,7 +11,6 @@ export const ChatCompanion: ComponentType<any> = lazy(() => import('./ChatCompan
|
|
|
11
11
|
export const ChatArticle: ComponentType<any> = lazy(() => import('./ChatArticle'));
|
|
12
12
|
export const ChatDialog: ComponentType<any> = lazy(() => import('./ChatDialog'));
|
|
13
13
|
export const IntegrationPrompt: ComponentType<any> = lazy(() => import('./IntegrationPrompt'));
|
|
14
|
-
export const PlanArticle: ComponentType<any> = lazy(() => import('./PlanArticle'));
|
|
15
14
|
export const SpaceHomePrompt: ComponentType<any> = lazy(() => import('./SpaceHomePrompt'));
|
|
16
15
|
export const SpaceHomeSuggestions: ComponentType<any> = lazy(() => import('./SpaceHomeSuggestions'));
|
|
17
16
|
export const TracePanel: ComponentType<any> = lazy(() => import('./TracePanel'));
|
|
@@ -25,7 +25,8 @@ Out of scope:
|
|
|
25
25
|
- Filtering / search of commits.
|
|
26
26
|
- Mutating, ack-ing, or replaying trace events.
|
|
27
27
|
|
|
28
|
-
Inputs: `traceMessages: Trace.Message[]`, `activeProcesses?: Process.Info[]`, `eventLimit?: number
|
|
28
|
+
Inputs: `traceMessages: Trace.Message[]`, `activeProcesses?: Process.Info[]`, `eventLimit?: number`,
|
|
29
|
+
`spanTimeoutMs?: number`, `now?: number`.
|
|
29
30
|
Output: `ExecutionGraph = { branches, commits, spanTree, details }`.
|
|
30
31
|
|
|
31
32
|
## 2. Inputs
|
|
@@ -77,6 +78,8 @@ Optional input via `activeProcesses` (defaults to `[]`). Fields the builder read
|
|
|
77
78
|
- `TracePanel`'s `getExecutionGraph` defaults `eventLimit = 300`
|
|
78
79
|
(`TracePanel.tsx#L153`).
|
|
79
80
|
- The cap targets `Timeline` rendering cost, not memory; see §11 for what it bounds.
|
|
81
|
+
- `buildSpanTree` defaults `spanTimeoutMs = DEFAULT_SPAN_TIMEOUT_MS` (20 minutes); `now` has
|
|
82
|
+
no default and force-closing is skipped unless a caller passes it. See §5.4.
|
|
80
83
|
|
|
81
84
|
## 3. Outputs
|
|
82
85
|
|
|
@@ -227,6 +230,48 @@ retains span boundaries') and `#L159` (regression for parent-child preservation)
|
|
|
227
230
|
Sibling spans are sorted by `firstTimestamp` ascending so output is deterministic
|
|
228
231
|
across runs that share inputs. Test: `span-tree.test.ts#L120`.
|
|
229
232
|
|
|
233
|
+
### 5.4 Timeout-based force-close
|
|
234
|
+
|
|
235
|
+
Runs after the linear scan, before children are sorted, over `allSpans` — every span ever
|
|
236
|
+
opened, not just the ones still in `openSpans`. This matters because a span superseded by a
|
|
237
|
+
later same-pid begin event (§15 "interleaved same-pid begin/end pairs") is removed from
|
|
238
|
+
`openSpans` but never receives an end event either; walking `allSpans` and checking each
|
|
239
|
+
span's own last event (rather than map membership) reaches it too.
|
|
240
|
+
|
|
241
|
+
Skipped entirely when `options.now` is omitted (see below). Otherwise, any span whose **last**
|
|
242
|
+
event is not itself an end event (`isSpanEndEvent`) and is older than `now - spanTimeoutMs` is
|
|
243
|
+
force-closed with a synthetic end event appended to `span.events`:
|
|
244
|
+
|
|
245
|
+
- Span opened by `AgentRequestBegin` → synthetic `AgentRequestEnd` with
|
|
246
|
+
`{ status: 'interrupted', error: SPAN_TIMEOUT_MESSAGE }`.
|
|
247
|
+
- Span opened by `Trace.OperationStart` → synthetic `Trace.OperationEnd` with
|
|
248
|
+
`{ key, name, icon, outcome: 'failure', error: SPAN_TIMEOUT_MESSAGE }` (fields copied
|
|
249
|
+
from the begin event's payload).
|
|
250
|
+
|
|
251
|
+
The synthetic event's `timestamp` is `lastEvent.timestamp + spanTimeoutMs` (the exact
|
|
252
|
+
moment the span crossed the threshold), not `now` — this keeps the emitted commit's
|
|
253
|
+
position stable across repeated `buildSpanTree` calls with an advancing `now`, rather
|
|
254
|
+
than jumping forward on every recompute.
|
|
255
|
+
|
|
256
|
+
Rationale: the runtime may fail to write the closing event (crash, dropped connection,
|
|
257
|
+
process killed) — see DX-1080. Without this, `isCompletedSpan` never returns `true` for
|
|
258
|
+
that span (§7), so it never collapses and keeps rendering with the "in progress" shimmer
|
|
259
|
+
forever. Appending a synthetic end event makes it indistinguishable downstream from a
|
|
260
|
+
span that completed normally, except for the `outcome: 'failure'` / `status: 'interrupted'`
|
|
261
|
+
result and the `SPAN_TIMEOUT_MESSAGE` text surfaced by `presentEvent` (§4.1).
|
|
262
|
+
|
|
263
|
+
`spanTimeoutMs` defaults to `DEFAULT_SPAN_TIMEOUT_MS` (20 minutes) when `now` is provided.
|
|
264
|
+
`now` has **no default** — force-closing only runs when a caller explicitly passes it, so
|
|
265
|
+
deterministic callers (tests, `TracePanel.stories.tsx`'s fixture snapshot) that pass fixture
|
|
266
|
+
timestamps unrelated to wall-clock time are unaffected unless they opt in. `TracePanel` opts
|
|
267
|
+
in by ticking a `now` state every 60s (`TracePanel.tsx`); `span-tree.test.ts`'s "force-closed"
|
|
268
|
+
tests pass an explicit `now` for determinism.
|
|
269
|
+
|
|
270
|
+
Only spans with **zero** events never happen (a span always has at least its begin
|
|
271
|
+
event), so `span.events[span.events.length - 1]` is always defined when force-closing.
|
|
272
|
+
Nested children of a force-closed span are evaluated independently — a still-active
|
|
273
|
+
child is not force-closed just because its parent timed out.
|
|
274
|
+
|
|
230
275
|
## 6. Span branch assignment (`branchOf`)
|
|
231
276
|
|
|
232
277
|
`execution-graph.ts#L263`. Pure function on a span:
|
|
@@ -582,6 +627,16 @@ Each entry: **scenario → expected output → rationale**.
|
|
|
582
627
|
- Logged via `log('invalid trace event', …)` and dropped. The event still
|
|
583
628
|
occupies a position in `spanTree.events`.
|
|
584
629
|
|
|
630
|
+
18. **Span open longer than `spanTimeoutMs` with no end event** (DX-1080)
|
|
631
|
+
- Force-closed with a synthetic failure/interrupted end event (§5.4); becomes
|
|
632
|
+
`isCompletedSpan` and collapses/renders like a normal completed span instead of
|
|
633
|
+
hanging with the shimmer effect forever. Test: `span-tree.test.ts`
|
|
634
|
+
("an open operation span past the timeout is force-closed…").
|
|
635
|
+
|
|
636
|
+
19. **Span open but still within `spanTimeoutMs`**
|
|
637
|
+
- Left untouched — stays open and continues to render as in-progress. Test:
|
|
638
|
+
`span-tree.test.ts` ("an open span within the timeout window stays open").
|
|
639
|
+
|
|
585
640
|
## 14. Performance & complexity
|
|
586
641
|
|
|
587
642
|
- `buildSpanTree`: O(E log E) for the chronological sort, O(E) for the linear
|
|
@@ -605,7 +660,9 @@ Each entry: **scenario → expected output → rationale**.
|
|
|
605
660
|
spans per pid. If a process emits `B1 B2 E1 E2` interleaved, the second `B2`
|
|
606
661
|
orphans the still-open `B1` (no `E1` ever closes the first span). The first
|
|
607
662
|
span receives only its begin event; the second receives `B2 E1 E2`.
|
|
608
|
-
Outcome: incorrect. Not currently supported.
|
|
663
|
+
Outcome: incorrect. Not currently supported. `B1` is at least reachable by the
|
|
664
|
+
§5.4 timeout sweep (via `allSpans`) so it eventually force-closes rather than
|
|
665
|
+
hanging forever — but the interleaving itself is still not modeled correctly.
|
|
609
666
|
- **Event types beyond `presentEvent`**: silently dropped from the commit
|
|
610
667
|
stream but retained in `spanTree.events`. Consumers wanting the full event
|
|
611
668
|
stream must read `spanTree`. Examples: `OperationInput`, `OperationOutput`,
|
|
@@ -625,6 +682,7 @@ Each entry: **scenario → expected output → rationale**.
|
|
|
625
682
|
| ------------------------------------------------------- | ---------------------------------------------------------------------------- | ----------- |
|
|
626
683
|
| `buildSpanTree` | `packages/plugins/plugin-assistant/src/execution-graph/span-tree.ts` | L112 |
|
|
627
684
|
| `applyEventLimit` | same | L211 |
|
|
685
|
+
| `makeTimeoutEndEvent` / `DEFAULT_SPAN_TIMEOUT_MS` | same | L252 / L13 |
|
|
628
686
|
| `ROOT_SPAN_ID` | same | L12 |
|
|
629
687
|
| `BEGIN_EVENT_TYPES`/`END_EVENT_TYPES` | same | L47 |
|
|
630
688
|
| `walkSpanTree`/`flattenSpanTree` | same | L245 |
|
|
@@ -10,10 +10,10 @@ import * as Pipeable from 'effect/Pipeable';
|
|
|
10
10
|
import * as Schema from 'effect/Schema';
|
|
11
11
|
import * as Struct from 'effect/Struct';
|
|
12
12
|
|
|
13
|
+
import { AGENT_PROCESS_KEY } from '@dxos/agent-runtime';
|
|
13
14
|
import { AgentRequestBegin, AgentRequestEnd, CompleteBlock } from '@dxos/assistant';
|
|
14
15
|
import { Process, Trace } from '@dxos/compute';
|
|
15
16
|
import { Annotation } from '@dxos/echo';
|
|
16
|
-
import { AGENT_PROCESS_KEY } from '@dxos/functions-runtime';
|
|
17
17
|
import { EID } from '@dxos/keys';
|
|
18
18
|
import { LogLevel, log } from '@dxos/log';
|
|
19
19
|
import { type Commit } from '@dxos/react-ui-components';
|
|
@@ -93,6 +93,17 @@ export interface BuildExecutionGraphParams {
|
|
|
93
93
|
activeProcesses?: readonly Process.Info[];
|
|
94
94
|
collapseCompletedSpans?: boolean;
|
|
95
95
|
eventLimit?: number;
|
|
96
|
+
/**
|
|
97
|
+
* Duration a span may sit open with no new events before it's force-closed with a synthetic
|
|
98
|
+
* end event. Only takes effect when `now` is also provided. Defaults to
|
|
99
|
+
* `DEFAULT_SPAN_TIMEOUT_MS`.
|
|
100
|
+
*/
|
|
101
|
+
spanTimeoutMs?: number;
|
|
102
|
+
/**
|
|
103
|
+
* Reference time used to detect abandoned spans. Force-closing is skipped entirely when this
|
|
104
|
+
* is omitted.
|
|
105
|
+
*/
|
|
106
|
+
now?: number;
|
|
96
107
|
}
|
|
97
108
|
|
|
98
109
|
/**
|
|
@@ -121,8 +132,10 @@ export const buildExecutionGraph = ({
|
|
|
121
132
|
activeProcesses = [],
|
|
122
133
|
collapseCompletedSpans = false,
|
|
123
134
|
eventLimit = 500,
|
|
135
|
+
spanTimeoutMs,
|
|
136
|
+
now,
|
|
124
137
|
}: BuildExecutionGraphParams): ExecutionGraph => {
|
|
125
|
-
const spanTree = buildSpanTree(traceMessages, { eventLimit });
|
|
138
|
+
const spanTree = buildSpanTree(traceMessages, { eventLimit, spanTimeoutMs, now });
|
|
126
139
|
const toolCallContext = buildToolCallContext(traceMessages);
|
|
127
140
|
const built = spanTreeToCommits(spanTree, activeProcesses, toolCallContext, collapseCompletedSpans);
|
|
128
141
|
log('trace execution graph', {
|
|
@@ -60,11 +60,12 @@ export const pendingStatusFromEphemeralMessage = (message: Trace.Message): strin
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
if (Trace.isOfType(Trace.StatusUpdate, event)) {
|
|
63
|
+
const message = event.data.message?.trim();
|
|
63
64
|
// Suppress opaque routine ULID lines so descriptive partial-block / operation-input lines win.
|
|
64
|
-
if (ROUTINE_ULID_STATUS.test(
|
|
65
|
+
if (!message || ROUTINE_ULID_STATUS.test(message)) {
|
|
65
66
|
continue;
|
|
66
67
|
}
|
|
67
|
-
return
|
|
68
|
+
return message;
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
return undefined;
|
|
@@ -9,7 +9,13 @@ import { describe, test } from 'vitest';
|
|
|
9
9
|
import { AgentRequestBegin, AgentRequestEnd } from '@dxos/assistant';
|
|
10
10
|
import { Trace } from '@dxos/compute';
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
DEFAULT_SPAN_TIMEOUT_MS,
|
|
14
|
+
ROOT_SPAN_ID,
|
|
15
|
+
buildSpanTree,
|
|
16
|
+
collectSpanTreeEventsCategorically,
|
|
17
|
+
flattenSpanTree,
|
|
18
|
+
} from './span-tree';
|
|
13
19
|
import { collectTraceEvents, withMeta } from './testing';
|
|
14
20
|
|
|
15
21
|
const NoteEvent = Trace.EventType('note', {
|
|
@@ -247,6 +253,86 @@ describe('buildSpanTree', () => {
|
|
|
247
253
|
expect(order).toHaveLength(3);
|
|
248
254
|
});
|
|
249
255
|
|
|
256
|
+
test('an open operation span past the timeout is force-closed with a synthetic failure end', ({ expect }) => {
|
|
257
|
+
const messages = collectTraceEvents(
|
|
258
|
+
withMeta({ pid: 'op-1' }, Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' })),
|
|
259
|
+
);
|
|
260
|
+
// The single event lands at timestamp 1; `now` is well past the default timeout.
|
|
261
|
+
const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
|
|
262
|
+
expect(tree.children).toHaveLength(1);
|
|
263
|
+
const span = tree.children[0];
|
|
264
|
+
expect(span.events).toHaveLength(2);
|
|
265
|
+
expect(span.events[1].type).toBe(Trace.OperationEnd.key);
|
|
266
|
+
expect(span.events[1].data).toMatchObject({ key: 'reply', name: 'Reply', outcome: 'failure' });
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test('an open agent request span past the timeout is force-closed as interrupted', ({ expect }) => {
|
|
270
|
+
const messages = collectTraceEvents(withMeta({ pid: 'agent-1' }, Trace.write(AgentRequestBegin, {})));
|
|
271
|
+
const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
|
|
272
|
+
const span = tree.children[0];
|
|
273
|
+
expect(span.events).toHaveLength(2);
|
|
274
|
+
expect(span.events[1].type).toBe(AgentRequestEnd.key);
|
|
275
|
+
expect(span.events[1].data).toMatchObject({ status: 'interrupted' });
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test('an open span within the timeout window stays open', ({ expect }) => {
|
|
279
|
+
const messages = collectTraceEvents(
|
|
280
|
+
withMeta({ pid: 'op-1' }, Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' })),
|
|
281
|
+
);
|
|
282
|
+
const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS - 1 });
|
|
283
|
+
const span = tree.children[0];
|
|
284
|
+
expect(span.events).toHaveLength(1);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
test('spanTimeoutMs is configurable', ({ expect }) => {
|
|
288
|
+
const messages = collectTraceEvents(
|
|
289
|
+
withMeta({ pid: 'op-1' }, Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' })),
|
|
290
|
+
);
|
|
291
|
+
const closed = buildSpanTree(messages, { now: 100, spanTimeoutMs: 10 });
|
|
292
|
+
expect(closed.children[0].events).toHaveLength(2);
|
|
293
|
+
|
|
294
|
+
const stillOpen = buildSpanTree(messages, { now: 100, spanTimeoutMs: 1_000 });
|
|
295
|
+
expect(stillOpen.children[0].events).toHaveLength(1);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
test('a span superseded by a later same-pid begin event is force-closed too', ({ expect }) => {
|
|
299
|
+
// The first begin never gets an end (interleaved B1 B2 E1 pattern, §15) — `openSpans` only
|
|
300
|
+
// tracks the second span once it supersedes the first, so the sweep must reach both.
|
|
301
|
+
const messages = collectTraceEvents(
|
|
302
|
+
withMeta(
|
|
303
|
+
{ pid: 'agent-1' },
|
|
304
|
+
Effect.gen(function* () {
|
|
305
|
+
yield* Trace.write(AgentRequestBegin, {});
|
|
306
|
+
yield* Trace.write(AgentRequestBegin, {});
|
|
307
|
+
yield* Trace.write(AgentRequestEnd, { status: 'success' });
|
|
308
|
+
}),
|
|
309
|
+
),
|
|
310
|
+
);
|
|
311
|
+
const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
|
|
312
|
+
expect(tree.children).toHaveLength(2);
|
|
313
|
+
const [superseded, current] = tree.children;
|
|
314
|
+
expect(superseded.events).toHaveLength(2);
|
|
315
|
+
expect(superseded.events[1].type).toBe(AgentRequestEnd.key);
|
|
316
|
+
expect(superseded.events[1].data).toMatchObject({ status: 'interrupted' });
|
|
317
|
+
expect(current.events).toHaveLength(2);
|
|
318
|
+
expect(current.events[1].data).toMatchObject({ status: 'success' });
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test('a completed span is unaffected by the timeout', ({ expect }) => {
|
|
322
|
+
const messages = collectTraceEvents(
|
|
323
|
+
withMeta(
|
|
324
|
+
{ pid: 'op-1' },
|
|
325
|
+
Effect.gen(function* () {
|
|
326
|
+
yield* Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' });
|
|
327
|
+
yield* Trace.write(Trace.OperationEnd, { key: 'reply', name: 'Reply', outcome: 'success' });
|
|
328
|
+
}),
|
|
329
|
+
),
|
|
330
|
+
);
|
|
331
|
+
const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
|
|
332
|
+
expect(tree.children[0].events).toHaveLength(2);
|
|
333
|
+
expect(tree.children[0].events[1].data).toMatchObject({ outcome: 'success' });
|
|
334
|
+
});
|
|
335
|
+
|
|
250
336
|
test('collectSpanTreeEventsCategorically emits begin, child subtrees, then remaining events', ({ expect }) => {
|
|
251
337
|
const messages = collectTraceEvents(
|
|
252
338
|
Effect.gen(function* () {
|