@dxos/plugin-assistant 0.9.1-staging.ee54ba693a → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PLUGIN.mdl +3 -28
- package/dist/lib/AssistantPlugin.mjs +2 -0
- package/dist/lib/AssistantPlugin.node.mjs +55 -0
- package/dist/lib/AssistantPlugin.node.mjs.map +1 -0
- package/dist/lib/AssistantPlugin.workerd.mjs +43 -0
- package/dist/lib/AssistantPlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +24 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-AgentArticle.mjs +52 -0
- package/dist/lib/chunk-AgentArticle.mjs.map +1 -0
- package/dist/lib/chunk-AgentProperties.mjs +35 -0
- package/dist/lib/chunk-AgentProperties.mjs.map +1 -0
- package/dist/lib/chunk-AssistantPlugin.mjs +88 -0
- package/dist/lib/chunk-AssistantPlugin.mjs.map +1 -0
- package/dist/lib/chunk-AssistantSettings.mjs +285 -0
- package/dist/lib/chunk-AssistantSettings.mjs.map +1 -0
- package/dist/lib/chunk-ChatArticle.mjs +121 -0
- package/dist/lib/chunk-ChatArticle.mjs.map +1 -0
- package/dist/lib/chunk-ChatCompanion.mjs +116 -0
- package/dist/lib/chunk-ChatCompanion.mjs.map +1 -0
- package/dist/lib/chunk-ChatDialog.mjs +73 -0
- package/dist/lib/chunk-ChatDialog.mjs.map +1 -0
- package/dist/lib/chunk-IntegrationPrompt.mjs +73 -0
- package/dist/lib/chunk-IntegrationPrompt.mjs.map +1 -0
- package/dist/lib/chunk-SpaceHomePrompt.mjs +104 -0
- package/dist/lib/chunk-SpaceHomePrompt.mjs.map +1 -0
- package/dist/lib/chunk-SpaceHomeSuggestions.mjs +60 -0
- package/dist/lib/chunk-SpaceHomeSuggestions.mjs.map +1 -0
- package/dist/lib/chunk-TracePanel.mjs +127 -0
- package/dist/lib/chunk-TracePanel.mjs.map +1 -0
- package/dist/lib/chunk-TracePanel2.mjs +7 -0
- package/dist/lib/chunk-TracePanel2.mjs.map +1 -0
- package/dist/lib/chunk-TriggerStatus.mjs +72 -0
- package/dist/lib/chunk-TriggerStatus.mjs.map +1 -0
- package/dist/lib/chunk-agent-hydrator.mjs +22 -0
- package/dist/lib/chunk-agent-hydrator.mjs.map +1 -0
- package/dist/lib/chunk-agent-service.mjs +21 -0
- package/dist/lib/chunk-agent-service.mjs.map +1 -0
- package/dist/lib/{neutral/ai-context-LIKJYMIN.mjs → chunk-ai-context.mjs} +8 -12
- package/dist/lib/chunk-ai-context.mjs.map +1 -0
- package/dist/lib/chunk-ai-service.mjs +27 -0
- package/dist/lib/chunk-ai-service.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +179 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-automation-templates.mjs +99 -0
- package/dist/lib/chunk-automation-templates.mjs.map +1 -0
- package/dist/lib/chunk-companion-chat-provisioner.mjs +123 -0
- package/dist/lib/chunk-companion-chat-provisioner.mjs.map +1 -0
- package/dist/lib/chunk-connector.mjs +60 -0
- package/dist/lib/chunk-connector.mjs.map +1 -0
- package/dist/lib/chunk-constants.mjs +9 -0
- package/dist/lib/chunk-constants.mjs.map +1 -0
- package/dist/lib/chunk-context.mjs +7 -0
- package/dist/lib/chunk-context.mjs.map +1 -0
- package/dist/lib/chunk-create-chat.mjs +53 -0
- package/dist/lib/chunk-create-chat.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +70 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-edge-model-resolver.mjs +64 -0
- package/dist/lib/chunk-edge-model-resolver.mjs.map +1 -0
- package/dist/lib/chunk-ensure-companion-chat.mjs +49 -0
- package/dist/lib/chunk-ensure-companion-chat.mjs.map +1 -0
- package/dist/lib/chunk-extensions.mjs +78 -0
- package/dist/lib/chunk-extensions.mjs.map +1 -0
- package/dist/lib/chunk-fork-chat.mjs +83 -0
- package/dist/lib/chunk-fork-chat.mjs.map +1 -0
- package/dist/lib/chunk-generate-home-suggestions.mjs +71 -0
- package/dist/lib/chunk-generate-home-suggestions.mjs.map +1 -0
- package/dist/lib/chunk-local-model-resolver.mjs +25 -0
- package/dist/lib/chunk-local-model-resolver.mjs.map +1 -0
- package/dist/lib/chunk-markdown-extension.mjs +27 -0
- package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-L7AR4VTA.mjs → chunk-meta.mjs} +20 -25
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +13 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-paths.mjs +8 -0
- package/dist/lib/chunk-paths.mjs.map +1 -0
- package/dist/lib/chunk-processor.mjs +432 -0
- package/dist/lib/chunk-processor.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +177 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-run-prompt-in-new-chat.mjs +96 -0
- package/dist/lib/chunk-run-prompt-in-new-chat.mjs.map +1 -0
- package/dist/lib/chunk-set-current-chat.mjs +43 -0
- package/dist/lib/chunk-set-current-chat.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-skill-definition.mjs +42 -0
- package/dist/lib/chunk-skill-definition.mjs.map +1 -0
- package/dist/lib/chunk-skills.mjs +19 -0
- package/dist/lib/chunk-skills.mjs.map +1 -0
- package/dist/lib/chunk-state.mjs +32 -0
- package/dist/lib/chunk-state.mjs.map +1 -0
- package/dist/lib/chunk-toggle-trace-panel-debug.mjs +18 -0
- package/dist/lib/chunk-toggle-trace-panel-debug.mjs.map +1 -0
- package/dist/lib/chunk-toolkit.mjs +12 -0
- package/dist/lib/chunk-toolkit.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +332 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-update-chat-name.mjs +63 -0
- package/dist/lib/chunk-update-chat-name.mjs.map +1 -0
- package/dist/lib/components.mjs +2616 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +17 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/execution-graph.mjs +961 -0
- package/dist/lib/execution-graph.mjs.map +1 -0
- package/dist/lib/extensions.mjs +2 -0
- package/dist/lib/hooks.mjs +674 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +5 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +7 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/plugin.workerd.mjs +2 -0
- package/dist/lib/skills.mjs +2 -0
- package/dist/lib/testing.mjs +2 -0
- package/dist/lib/translations.mjs +207 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
- package/dist/types/src/AssistantPlugin.node.d.ts.map +1 -1
- package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/AssistantSurfaces.d.ts +22 -0
- package/dist/types/src/capabilities/AssistantSurfaces.d.ts.map +1 -0
- package/dist/types/src/capabilities/agent-hydrator.d.ts +1 -1
- package/dist/types/src/capabilities/agent-service.d.ts +1 -1
- package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
- package/dist/types/src/capabilities/ai-context.d.ts +1 -1
- package/dist/types/src/capabilities/ai-service.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +12 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/automation-templates.d.ts +1 -1
- package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +1 -1
- package/dist/types/src/capabilities/connector.d.ts +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/edge-model-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +0 -2
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/local-model-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/standalone-chats-query.test.d.ts +2 -0
- package/dist/types/src/capabilities/standalone-chats-query.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/state.d.ts +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +1 -1
- package/dist/types/src/components/AgentProperties/AgentProperties.d.ts +4 -1
- package/dist/types/src/components/AgentProperties/AgentProperties.d.ts.map +1 -1
- package/dist/types/src/components/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +21 -8
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/src/components/Chat/{Chat.stories.d.ts → Error.stories.d.ts} +1 -1
- package/dist/types/src/components/Chat/Error.stories.d.ts.map +1 -0
- package/dist/types/src/components/Chat/context.d.ts +8 -0
- package/dist/types/src/components/Chat/context.d.ts.map +1 -1
- package/dist/types/src/components/Chat/events.d.ts +5 -0
- package/dist/types/src/components/Chat/events.d.ts.map +1 -1
- package/dist/types/src/components/Chat/thread.d.ts +42 -0
- package/dist/types/src/components/Chat/thread.d.ts.map +1 -0
- package/dist/types/src/components/Chat/thread.test.d.ts +2 -0
- package/dist/types/src/components/Chat/thread.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +5 -3
- package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/index.d.ts +0 -1
- package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/Anchor.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/ChatThread.d.ts +8 -3
- package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +30 -2
- package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/index.d.ts +1 -0
- package/dist/types/src/components/ChatThread/index.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/sync/index.d.ts +3 -0
- package/dist/types/src/components/ChatThread/sync/index.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/{sync.d.ts → sync/sync.d.ts} +46 -2
- package/dist/types/src/components/ChatThread/sync/sync.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/sync/sync.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/sync/tool-widget-state.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/sync/tool-widget-state.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts +15 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts +21 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts +2 -0
- package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts +1 -2
- package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/defaults.d.ts +6 -0
- package/dist/types/src/components/ChatThread/widgets/defaults.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/format-time.d.ts +2 -0
- package/dist/types/src/components/ChatThread/widgets/format-time.d.ts.map +1 -0
- package/dist/types/src/components/ChatThread/widgets/index.d.ts +4 -1
- package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts +3 -0
- package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts.map +1 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts +16 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts.map +1 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts +210 -0
- package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/ConnectorAuthMenu/index.d.ts +2 -0
- package/dist/types/src/components/ConnectorAuthMenu/index.d.ts.map +1 -0
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.d.ts +9 -11
- package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -4
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
- package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +1 -2
- package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
- package/dist/types/src/components/ToolBlock/index.d.ts +1 -0
- package/dist/types/src/components/ToolBlock/index.d.ts.map +1 -1
- package/dist/types/src/components/ToolBlock/is-tool-message.d.ts +3 -0
- package/dist/types/src/components/ToolBlock/is-tool-message.d.ts.map +1 -0
- package/dist/types/src/components/Toolbox/Toolbox.d.ts +1 -1
- package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts +5 -2
- package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts.map +1 -1
- package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts +4 -1
- package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts.map +1 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts +4 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts.map +1 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts +4 -1
- package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts +4 -6
- package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts +22 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
- package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts +4 -1
- package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
- package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts +4 -7
- package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +4 -9
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +5 -7
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -1
- package/dist/types/src/containers/TracePanel/TracePanel.d.ts +1 -1
- package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
- package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
- package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts +15 -1
- package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +0 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/execution-graph.d.ts +12 -1
- package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
- package/dist/types/src/execution-graph/index.d.ts +1 -1
- package/dist/types/src/execution-graph/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -1
- package/dist/types/src/execution-graph/span-tree.d.ts +17 -0
- package/dist/types/src/execution-graph/span-tree.d.ts.map +1 -1
- package/dist/types/src/feed-logger.d.ts +1 -1
- package/dist/types/src/feed-logger.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
- package/dist/types/src/hooks/useContextObjects.d.ts +1 -1
- package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
- package/dist/types/src/hooks/useSelectionContext.d.ts +13 -0
- package/dist/types/src/hooks/useSelectionContext.d.ts.map +1 -0
- package/dist/types/src/hooks/useSelectionContext.test.d.ts +2 -0
- package/dist/types/src/hooks/useSelectionContext.test.d.ts.map +1 -0
- package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/processor/index.d.ts +1 -0
- package/dist/types/src/processor/index.d.ts.map +1 -1
- package/dist/types/src/processor/processor.d.ts +5 -2
- package/dist/types/src/processor/processor.d.ts.map +1 -1
- package/dist/types/src/processor/prompt.d.ts +18 -0
- package/dist/types/src/processor/prompt.d.ts.map +1 -0
- package/dist/types/src/processor/prompt.test.d.ts +2 -0
- package/dist/types/src/processor/prompt.test.d.ts.map +1 -0
- package/dist/types/src/processor/streaming.node.test.d.ts +2 -0
- package/dist/types/src/processor/streaming.node.test.d.ts.map +1 -0
- package/dist/types/src/skills/assistant/skill.d.ts.map +1 -1
- package/dist/types/src/templates/scaffold.d.ts +1 -1
- package/dist/types/src/templates/scaffold.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/AssistantOperation.d.ts +2 -13
- package/dist/types/src/types/AssistantOperation.d.ts.map +1 -1
- package/dist/types/src/types/ChatSurface.d.ts +2 -2
- package/dist/types/src/types/ChatSurface.d.ts.map +1 -1
- package/dist/types/src/types/Ollama.d.ts +1 -1
- package/dist/types/src/types/Ollama.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +1 -0
- package/package.json +106 -105
- package/src/AssistantPlugin.node.ts +1 -2
- package/src/AssistantPlugin.test.ts +60 -62
- package/src/AssistantPlugin.ts +1 -10
- package/src/AssistantPlugin.workerd.ts +1 -2
- package/src/capabilities/AssistantSurfaces.tsx +86 -0
- package/src/capabilities/agent-service.ts +1 -1
- package/src/capabilities/app-graph-builder.ts +31 -17
- package/src/capabilities/companion-chat-provisioner.ts +12 -11
- package/src/capabilities/connector.ts +3 -3
- package/src/capabilities/edge-model-resolver.ts +5 -2
- package/src/capabilities/index.ts +0 -2
- package/src/capabilities/react-surface.ts +135 -0
- package/src/capabilities/skill-definition.ts +4 -0
- package/src/capabilities/standalone-chats-query.test.ts +51 -0
- package/src/capabilities/state.ts +1 -1
- package/src/components/AgentProperties/AgentProperties.stories.tsx +6 -7
- package/src/components/AgentProperties/AgentProperties.tsx +37 -30
- package/src/components/Chat/Chat.tsx +275 -59
- package/src/components/Chat/{Chat.stories.tsx → Error.stories.tsx} +1 -1
- package/src/components/Chat/context.ts +8 -0
- package/src/components/Chat/events.ts +5 -0
- package/src/components/Chat/thread.test.ts +127 -0
- package/src/components/Chat/thread.ts +87 -0
- package/src/components/ChatPrompt/ChatActions.tsx +8 -8
- package/src/components/ChatPrompt/ChatMcpErrors.tsx +2 -2
- package/src/components/ChatPrompt/ChatOptions.stories.tsx +2 -1
- package/src/components/ChatPrompt/ChatOptions.tsx +5 -5
- package/src/components/ChatPrompt/ChatPrompt.tsx +33 -6
- package/src/components/ChatPrompt/index.ts +0 -1
- package/src/components/ChatThread/Anchor.stories.tsx +2 -1
- package/src/components/ChatThread/ChatThread.stories.tsx +99 -4
- package/src/components/ChatThread/ChatThread.tsx +34 -6
- package/src/components/ChatThread/Link.tsx +1 -0
- package/src/components/ChatThread/index.ts +2 -0
- package/src/components/ChatThread/registry.tsx +28 -4
- package/src/components/ChatThread/sync/index.ts +6 -0
- package/src/components/ChatThread/{sync.test.ts → sync/sync.test.ts} +167 -7
- package/src/components/ChatThread/{sync.ts → sync/sync.ts} +97 -3
- package/src/components/ChatThread/{tool-widget-state.ts → sync/tool-widget-state.ts} +1 -3
- package/src/components/ChatThread/widgets/BranchWidget.stories.tsx +83 -0
- package/src/components/ChatThread/widgets/BranchWidget.test.ts +55 -0
- package/src/components/ChatThread/widgets/BranchWidget.tsx +61 -0
- package/src/components/ChatThread/widgets/FallbackWidget.tsx +2 -2
- package/src/components/ChatThread/widgets/ReasoningWidget.ts +1 -1
- package/src/components/ChatThread/widgets/ReferenceWidget.ts +1 -6
- package/src/components/ChatThread/widgets/SuggestionWidget.ts +12 -3
- package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
- package/src/components/ChatThread/widgets/ToolWidget.tsx +15 -9
- package/src/components/ChatThread/widgets/defaults.ts +7 -1
- package/src/components/ChatThread/widgets/format-time.ts +45 -0
- package/src/components/ChatThread/widgets/index.ts +4 -1
- package/src/components/ChatThread/widgets/is-tool-message.ts +13 -0
- package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.tsx +177 -0
- package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx +82 -0
- package/src/components/ConnectorAuthMenu/index.ts +5 -0
- package/src/components/ProcessTree/ProcessTree.stories.tsx +1 -1
- package/src/components/TaskList/TaskList.stories.tsx +19 -26
- package/src/components/TaskList/TaskList.tsx +32 -104
- package/src/components/ToolBlock/ToolBlock.tsx +1 -5
- package/src/components/ToolBlock/index.ts +1 -0
- package/src/components/ToolBlock/is-tool-message.ts +13 -0
- package/src/components/Toolbox/Toolbox.tsx +1 -1
- package/src/components/index.ts +1 -0
- package/src/containers/AgentArticle/AgentArticle.stories.tsx +18 -11
- package/src/containers/AgentArticle/AgentArticle.tsx +27 -151
- package/src/containers/AgentProperties/AgentProperties.tsx +21 -17
- package/src/containers/AssistantSettings/AssistantSettings.tsx +2 -0
- package/src/containers/AssistantSettings/OllamaModels.tsx +6 -4
- package/src/containers/ChatArticle/ChatArticle.stories.tsx +200 -27
- package/src/containers/ChatArticle/ChatArticle.tsx +25 -5
- package/src/containers/ChatCompanion/ChatCompanion.tsx +45 -10
- package/src/containers/ChatDialog/ChatDialog.tsx +4 -1
- package/src/containers/IntegrationPrompt/IntegrationPrompt.tsx +9 -6
- package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +2 -0
- package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +40 -39
- package/src/containers/TracePanel/TracePanel.stories.tsx +9 -4
- package/src/containers/TracePanel/TracePanel.tsx +22 -6
- package/src/containers/TriggerStatus/TriggerStatus.tsx +9 -16
- package/src/containers/index.ts +0 -1
- package/src/execution-graph/SPEC.md +60 -2
- package/src/execution-graph/execution-graph.ts +15 -2
- package/src/execution-graph/index.ts +1 -0
- package/src/execution-graph/pending-block-status.ts +3 -2
- package/src/execution-graph/span-tree.test.ts +87 -1
- package/src/execution-graph/span-tree.ts +95 -0
- package/src/feed-logger.ts +6 -6
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useChatProcessor.ts +2 -1
- package/src/hooks/useChatToolbarActions.ts +22 -19
- package/src/hooks/useContextObjects.ts +9 -3
- package/src/hooks/useSelectionContext.test.ts +93 -0
- package/src/hooks/useSelectionContext.ts +72 -0
- package/src/hooks/useSkillRegistry.ts +1 -1
- package/src/hooks/useTraceMessages.ts +5 -3
- package/src/operations/create-chat.ts +2 -2
- package/src/operations/fork-chat.ts +2 -2
- package/src/operations/generate-home-suggestions.test.ts +2 -2
- package/src/operations/index.ts +0 -1
- package/src/operations/prompt.node.test.ts +1 -1
- package/src/paths.ts +3 -3
- package/src/processor/index.ts +1 -0
- package/src/processor/processor.node.test.ts +1 -1
- package/src/processor/processor.ts +33 -5
- package/src/processor/prompt.test.ts +37 -0
- package/src/processor/prompt.ts +42 -0
- package/src/processor/streaming.node.test.ts +196 -0
- package/src/skills/assistant/skill.node.test.ts +2 -2
- package/src/skills/assistant/skill.ts +3 -5
- package/src/templates/routine-templates.test.ts +1 -2
- package/src/templates/scaffold.ts +3 -3
- package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
- package/src/testing/data/trace-timeline-remote.dx.json +1 -1
- package/src/testing/data/trace-timeline.dx.json +1 -2
- package/src/testing/trace-timeline.node.test.ts +3 -3
- package/src/translations.ts +11 -10
- package/src/types/AssistantCapabilities.ts +1 -1
- package/src/types/AssistantOperation.ts +8 -31
- package/src/types/ChatSurface.ts +3 -3
- package/src/types/Ollama.ts +1 -1
- package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs +0 -161
- package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs.map +0 -7
- package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs +0 -40
- package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs.map +0 -7
- package/dist/lib/neutral/AssistantPlugin.mjs +0 -10
- package/dist/lib/neutral/AssistantPlugin.mjs.map +0 -7
- package/dist/lib/neutral/AssistantPlugin.node.mjs +0 -72
- package/dist/lib/neutral/AssistantPlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/AssistantPlugin.workerd.mjs +0 -13
- package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs +0 -302
- package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs.map +0 -7
- package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs +0 -8
- package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs.map +0 -7
- package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs +0 -128
- package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs.map +0 -7
- package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs +0 -74
- package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs.map +0 -7
- package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs +0 -72
- package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs.map +0 -7
- package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs +0 -34
- package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +0 -7
- package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs +0 -114
- package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs.map +0 -7
- package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs +0 -63
- package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs.map +0 -7
- package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs +0 -12
- package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs.map +0 -7
- package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs +0 -95
- package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs.map +0 -7
- package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs +0 -23
- package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs.map +0 -7
- package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs +0 -32
- package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs.map +0 -7
- package/dist/lib/neutral/ai-context-LIKJYMIN.mjs.map +0 -7
- package/dist/lib/neutral/ai-service-DM6YXWUC.mjs +0 -44
- package/dist/lib/neutral/ai-service-DM6YXWUC.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs +0 -249
- package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs.map +0 -7
- package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs +0 -97
- package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -47
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/chunk-5IHQ52KJ.mjs +0 -9
- package/dist/lib/neutral/chunk-5IHQ52KJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6Q4OBGIK.mjs +0 -420
- package/dist/lib/neutral/chunk-6Q4OBGIK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BXI2R4OO.mjs +0 -410
- package/dist/lib/neutral/chunk-BXI2R4OO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CMPLPDYE.mjs +0 -30
- package/dist/lib/neutral/chunk-CMPLPDYE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GPHT3HYS.mjs +0 -8
- package/dist/lib/neutral/chunk-GPHT3HYS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HKLSFB5I.mjs +0 -90
- package/dist/lib/neutral/chunk-HKLSFB5I.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-L7AR4VTA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LS72HWMM.mjs +0 -42
- package/dist/lib/neutral/chunk-LS72HWMM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OZWZGIV2.mjs +0 -12
- package/dist/lib/neutral/chunk-OZWZGIV2.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QOKLFHUS.mjs +0 -13
- package/dist/lib/neutral/chunk-QOKLFHUS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SCTHQVIJ.mjs +0 -155
- package/dist/lib/neutral/chunk-SCTHQVIJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-U4LTLBAX.mjs +0 -56
- package/dist/lib/neutral/chunk-U4LTLBAX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UPKFUZ6V.mjs +0 -115
- package/dist/lib/neutral/chunk-UPKFUZ6V.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V2Y4XE3O.mjs +0 -12
- package/dist/lib/neutral/chunk-V2Y4XE3O.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XVGEJWJX.mjs +0 -133
- package/dist/lib/neutral/chunk-XVGEJWJX.mjs.map +0 -7
- package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs +0 -126
- package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -2527
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/connector-ITLLTBPZ.mjs +0 -70
- package/dist/lib/neutral/connector-ITLLTBPZ.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -31
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-chat-YGVZZYGP.mjs +0 -56
- package/dist/lib/neutral/create-chat-YGVZZYGP.mjs.map +0 -7
- package/dist/lib/neutral/create-object-5PAEJ6KM.mjs +0 -76
- package/dist/lib/neutral/create-object-5PAEJ6KM.mjs.map +0 -7
- package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs +0 -55
- package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs.map +0 -7
- package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs +0 -58
- package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs.map +0 -7
- package/dist/lib/neutral/execution-graph/index.mjs +0 -977
- package/dist/lib/neutral/execution-graph/index.mjs.map +0 -7
- package/dist/lib/neutral/extensions/index.mjs +0 -8
- package/dist/lib/neutral/extensions/index.mjs.map +0 -7
- package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs +0 -92
- package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs.map +0 -7
- package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs +0 -93
- package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -877
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -42
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs +0 -24
- package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs.map +0 -7
- package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs +0 -41
- package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -12
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/migrations-7DEMVBOG.mjs +0 -28
- package/dist/lib/neutral/migrations-7DEMVBOG.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs +0 -18
- package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-2LEN45GP.mjs +0 -8
- package/dist/lib/neutral/operation-handler-2LEN45GP.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -8
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -16
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/plugin.workerd.mjs +0 -13
- package/dist/lib/neutral/plugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-HEJEK44F.mjs +0 -171
- package/dist/lib/neutral/react-surface-HEJEK44F.mjs.map +0 -7
- package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs +0 -28
- package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs.map +0 -7
- package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs +0 -102
- package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs.map +0 -7
- package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs +0 -48
- package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs.map +0 -7
- package/dist/lib/neutral/settings-7Q3RITIT.mjs +0 -28
- package/dist/lib/neutral/settings-7Q3RITIT.mjs.map +0 -7
- package/dist/lib/neutral/skill-definition-553MQRTR.mjs +0 -8
- package/dist/lib/neutral/skill-definition-553MQRTR.mjs.map +0 -7
- package/dist/lib/neutral/skills/index.mjs +0 -8
- package/dist/lib/neutral/skills/index.mjs.map +0 -7
- package/dist/lib/neutral/state-4LGAKSSD.mjs +0 -34
- package/dist/lib/neutral/state-4LGAKSSD.mjs.map +0 -7
- package/dist/lib/neutral/testing.mjs +0 -8
- package/dist/lib/neutral/testing.mjs.map +0 -7
- package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs +0 -21
- package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs.map +0 -7
- package/dist/lib/neutral/toolkit-ETWLG5NT.mjs +0 -8
- package/dist/lib/neutral/toolkit-ETWLG5NT.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -217
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -24
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs +0 -61
- package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs.map +0 -7
- package/dist/types/src/capabilities/migrations.d.ts +0 -5
- package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
- package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
- package/dist/types/src/components/Chat/Chat.stories.d.ts.map +0 -1
- package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +0 -10
- package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/sync.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/sync.test.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/tool-widget-state.d.ts.map +0 -1
- package/dist/types/src/components/ChatThread/tool-widget-state.test.d.ts.map +0 -1
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts +0 -6
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +0 -1
- package/dist/types/src/containers/PlanArticle/index.d.ts +0 -2
- package/dist/types/src/containers/PlanArticle/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useFlush.d.ts +0 -6
- package/dist/types/src/hooks/useFlush.d.ts.map +0 -1
- package/dist/types/src/operations/resolve-navigation-targets.d.ts +0 -5
- package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +0 -1
- package/src/AssistantPlugin.conversations.json +0 -1
- package/src/capabilities/migrations.ts +0 -28
- package/src/capabilities/navigation-resolver.ts +0 -20
- package/src/capabilities/react-surface.tsx +0 -177
- package/src/components/ChatPrompt/ChatStatusIndicator.tsx +0 -42
- package/src/components/ChatThread/DEBUG.md +0 -64
- package/src/containers/PlanArticle/PlanArticle.tsx +0 -37
- package/src/containers/PlanArticle/index.ts +0 -5
- package/src/hooks/useFlush.ts +0 -35
- package/src/operations/resolve-navigation-targets.ts +0 -44
- /package/dist/types/src/components/ChatThread/{sync.test.d.ts → sync/sync.test.d.ts} +0 -0
- /package/dist/types/src/components/ChatThread/{tool-widget-state.d.ts → sync/tool-widget-state.d.ts} +0 -0
- /package/dist/types/src/components/ChatThread/{tool-widget-state.test.d.ts → sync/tool-widget-state.test.d.ts} +0 -0
- /package/src/components/ChatThread/{tool-widget-state.test.ts → sync/tool-widget-state.test.ts} +0 -0
|
@@ -0,0 +1,961 @@
|
|
|
1
|
+
import { AgentRequestBegin, AgentRequestEnd, CompleteBlock, PartialBlock } from "@dxos/assistant";
|
|
2
|
+
import { Process, Trace } from "@dxos/compute";
|
|
3
|
+
import { EID } from "@dxos/keys";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { Annotation } from "@dxos/echo";
|
|
6
|
+
import * as Option from "effect/Option";
|
|
7
|
+
import { LogLevel, log } from "@dxos/log";
|
|
8
|
+
import * as Array from "effect/Array";
|
|
9
|
+
import { pipe } from "effect/Function";
|
|
10
|
+
import * as Either from "effect/Either";
|
|
11
|
+
import * as Pipeable from "effect/Pipeable";
|
|
12
|
+
import * as Struct from "effect/Struct";
|
|
13
|
+
import { AGENT_PROCESS_KEY } from "@dxos/agent-runtime";
|
|
14
|
+
//#region src/execution-graph/span-tree.ts
|
|
15
|
+
/**
|
|
16
|
+
* Default duration a span may sit open with no new events before it's considered abandoned
|
|
17
|
+
* (the runtime crashed, lost connectivity, or otherwise never wrote the closing event).
|
|
18
|
+
*/
|
|
19
|
+
var DEFAULT_SPAN_TIMEOUT_MS = 1200 * 1e3;
|
|
20
|
+
/**
|
|
21
|
+
* Synthetic id assigned to the root span.
|
|
22
|
+
* The root is a virtual container for top-level spans (those without a parent in the captured trace).
|
|
23
|
+
*/
|
|
24
|
+
var ROOT_SPAN_ID = "<main>";
|
|
25
|
+
var BEGIN_EVENT_TYPES = /* @__PURE__ */ new Set([Trace.OperationStart.key, AgentRequestBegin.key]);
|
|
26
|
+
var END_EVENT_TYPES = /* @__PURE__ */ new Set([Trace.OperationEnd.key, AgentRequestEnd.key]);
|
|
27
|
+
var isSpanBeginEvent = (event) => BEGIN_EVENT_TYPES.has(event.type);
|
|
28
|
+
var isSpanEndEvent = (event) => END_EVENT_TYPES.has(event.type);
|
|
29
|
+
var computeMeta = (rawMeta) => ({
|
|
30
|
+
pid: rawMeta.pid,
|
|
31
|
+
parentPid: rawMeta.parentPid,
|
|
32
|
+
processName: rawMeta.processName,
|
|
33
|
+
conversationId: rawMeta.conversation ? EID.getEntityId(EID.parse(rawMeta.conversation.uri)) : void 0,
|
|
34
|
+
triggerId: rawMeta.trigger ? EID.getEntityId(EID.parse(rawMeta.trigger.uri)) : void 0,
|
|
35
|
+
toolCallId: rawMeta.toolCallId,
|
|
36
|
+
runtimeName: rawMeta.runtimeName
|
|
37
|
+
});
|
|
38
|
+
var makeMutableSpan = (id, meta) => ({
|
|
39
|
+
id,
|
|
40
|
+
meta,
|
|
41
|
+
events: [],
|
|
42
|
+
children: [],
|
|
43
|
+
firstTimestamp: Number.POSITIVE_INFINITY
|
|
44
|
+
});
|
|
45
|
+
var freezeSpan = (span) => ({
|
|
46
|
+
id: span.id,
|
|
47
|
+
meta: span.meta,
|
|
48
|
+
events: span.events,
|
|
49
|
+
children: span.children.map(freezeSpan)
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Builds a hierarchical span tree from a list of trace messages.
|
|
53
|
+
*
|
|
54
|
+
* Algorithm:
|
|
55
|
+
* 1. Flatten messages into events and sort them chronologically.
|
|
56
|
+
* 2. For each event:
|
|
57
|
+
* - Begin events (`OperationStart`, `AgentRequestBegin`) open a new span whose parent
|
|
58
|
+
* is the currently-open span of the event's `meta.parentPid`, or the root if there is
|
|
59
|
+
* none. The begin event itself becomes the first event of the new span.
|
|
60
|
+
* - End events (`OperationEnd`, `AgentRequestEnd`) close the currently-open span for
|
|
61
|
+
* the event's `meta.pid` and become its last event.
|
|
62
|
+
* - Other events attach to the currently-open span for their `meta.pid`, or to the
|
|
63
|
+
* root span if no span is currently open for that pid (or the event has no pid).
|
|
64
|
+
* 3. Sort each span's children by their earliest event timestamp.
|
|
65
|
+
*/
|
|
66
|
+
var buildSpanTree = (messages, options = {}) => {
|
|
67
|
+
const allEvents = messages.flatMap((message) => Trace.flatten(message));
|
|
68
|
+
allEvents.sort((a, b) => a.timestamp - b.timestamp);
|
|
69
|
+
const events = applyEventLimit(allEvents, options.eventLimit);
|
|
70
|
+
const root = makeMutableSpan(ROOT_SPAN_ID, {});
|
|
71
|
+
const openSpans = /* @__PURE__ */ new Map();
|
|
72
|
+
const lastSpanByPid = /* @__PURE__ */ new Map();
|
|
73
|
+
const allSpans = [];
|
|
74
|
+
let spanCounter = 0;
|
|
75
|
+
const allocSpanId = (pid) => {
|
|
76
|
+
const id = `${pid}#${spanCounter}`;
|
|
77
|
+
spanCounter += 1;
|
|
78
|
+
return id;
|
|
79
|
+
};
|
|
80
|
+
const noteTimestamp = (span, timestamp) => {
|
|
81
|
+
if (timestamp < span.firstTimestamp) span.firstTimestamp = timestamp;
|
|
82
|
+
};
|
|
83
|
+
for (const event of events) {
|
|
84
|
+
const pid = event.meta.pid;
|
|
85
|
+
if (!pid) {
|
|
86
|
+
root.events.push(event);
|
|
87
|
+
noteTimestamp(root, event.timestamp);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (BEGIN_EVENT_TYPES.has(event.type)) {
|
|
91
|
+
const parentPid = event.meta.parentPid;
|
|
92
|
+
const parent = parentPid && (openSpans.get(parentPid) ?? lastSpanByPid.get(parentPid)) || root;
|
|
93
|
+
const span = makeMutableSpan(allocSpanId(pid), computeMeta(event.meta));
|
|
94
|
+
span.events.push(event);
|
|
95
|
+
noteTimestamp(span, event.timestamp);
|
|
96
|
+
parent.children.push(span);
|
|
97
|
+
allSpans.push(span);
|
|
98
|
+
openSpans.set(pid, span);
|
|
99
|
+
lastSpanByPid.set(pid, span);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (END_EVENT_TYPES.has(event.type)) {
|
|
103
|
+
const span = openSpans.get(pid);
|
|
104
|
+
if (span) {
|
|
105
|
+
span.events.push(event);
|
|
106
|
+
noteTimestamp(span, event.timestamp);
|
|
107
|
+
openSpans.delete(pid);
|
|
108
|
+
} else {
|
|
109
|
+
root.events.push(event);
|
|
110
|
+
noteTimestamp(root, event.timestamp);
|
|
111
|
+
}
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const open = openSpans.get(pid);
|
|
115
|
+
if (open) {
|
|
116
|
+
open.events.push(event);
|
|
117
|
+
noteTimestamp(open, event.timestamp);
|
|
118
|
+
} else {
|
|
119
|
+
root.events.push(event);
|
|
120
|
+
noteTimestamp(root, event.timestamp);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (options.now !== void 0) {
|
|
124
|
+
const now = options.now;
|
|
125
|
+
const spanTimeoutMs = options.spanTimeoutMs ?? 12e5;
|
|
126
|
+
for (const span of allSpans) {
|
|
127
|
+
const lastEvent = span.events[span.events.length - 1];
|
|
128
|
+
if (isSpanEndEvent(lastEvent)) continue;
|
|
129
|
+
const timeoutAt = lastEvent.timestamp + spanTimeoutMs;
|
|
130
|
+
if (now < timeoutAt) continue;
|
|
131
|
+
const endEvent = makeTimeoutEndEvent(span, timeoutAt);
|
|
132
|
+
span.events.push(endEvent);
|
|
133
|
+
noteTimestamp(span, endEvent.timestamp);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const sortChildren = (span) => {
|
|
137
|
+
span.children.sort((a, b) => a.firstTimestamp - b.firstTimestamp);
|
|
138
|
+
for (const child of span.children) sortChildren(child);
|
|
139
|
+
};
|
|
140
|
+
sortChildren(root);
|
|
141
|
+
return freezeSpan(root);
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Message stamped on synthetic end events produced when a span times out.
|
|
145
|
+
*/
|
|
146
|
+
var SPAN_TIMEOUT_MESSAGE = "No end event was recorded for this span; it was closed after a timeout.";
|
|
147
|
+
/**
|
|
148
|
+
* Synthesizes the end event that closes an abandoned span, matching the event type its begin
|
|
149
|
+
* event opened it with (`OperationStart` → `OperationEnd`, `AgentRequestBegin` → `AgentRequestEnd`).
|
|
150
|
+
*/
|
|
151
|
+
var makeTimeoutEndEvent = (span, timestamp) => {
|
|
152
|
+
const beginEvent = span.events[0];
|
|
153
|
+
if (beginEvent.type === AgentRequestBegin.key) return {
|
|
154
|
+
type: AgentRequestEnd.key,
|
|
155
|
+
timestamp,
|
|
156
|
+
meta: beginEvent.meta,
|
|
157
|
+
isEphemeral: false,
|
|
158
|
+
data: {
|
|
159
|
+
status: "interrupted",
|
|
160
|
+
error: SPAN_TIMEOUT_MESSAGE
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
const fallback = { key: "unknown" };
|
|
164
|
+
const beginData = Option.getOrElse(Schema.decodeUnknownOption(Trace.OperationStart.schema)(beginEvent.data), () => fallback);
|
|
165
|
+
return {
|
|
166
|
+
type: Trace.OperationEnd.key,
|
|
167
|
+
timestamp,
|
|
168
|
+
meta: beginEvent.meta,
|
|
169
|
+
isEphemeral: false,
|
|
170
|
+
data: {
|
|
171
|
+
key: beginData.key,
|
|
172
|
+
name: beginData.name,
|
|
173
|
+
icon: beginData.icon,
|
|
174
|
+
outcome: "failure",
|
|
175
|
+
error: SPAN_TIMEOUT_MESSAGE
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* Caps the number of non-boundary events while retaining every span boundary event.
|
|
181
|
+
*
|
|
182
|
+
* Boundary events define the span tree's structure: dropping a begin event detaches every
|
|
183
|
+
* descendant span (its `parentPid` lookup fails, so children fall back to the root), and
|
|
184
|
+
* dropping an end event leaves a span open and corrupts the open-span map for sibling spans
|
|
185
|
+
* that share a pid. Status/partial-block events are the noisy bulk and the only ones the
|
|
186
|
+
* limit needs to control.
|
|
187
|
+
*
|
|
188
|
+
* The returned array stays in chronological order.
|
|
189
|
+
*/
|
|
190
|
+
var applyEventLimit = (events, eventLimit) => {
|
|
191
|
+
if (eventLimit === void 0) return [...events];
|
|
192
|
+
let nonBoundaryCount = 0;
|
|
193
|
+
for (const event of events) if (!isBoundary(event)) nonBoundaryCount += 1;
|
|
194
|
+
if (nonBoundaryCount <= eventLimit) return [...events];
|
|
195
|
+
const dropCount = nonBoundaryCount - eventLimit;
|
|
196
|
+
let dropped = 0;
|
|
197
|
+
const result = [];
|
|
198
|
+
for (const event of events) {
|
|
199
|
+
if (!isBoundary(event) && dropped < dropCount) {
|
|
200
|
+
dropped += 1;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
result.push(event);
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
};
|
|
207
|
+
var isBoundary = (event) => BEGIN_EVENT_TYPES.has(event.type) || END_EVENT_TYPES.has(event.type);
|
|
208
|
+
/**
|
|
209
|
+
* Walks the span tree in depth-first pre-order, invoking `visit` for each span (root included).
|
|
210
|
+
*/
|
|
211
|
+
var walkSpanTree = (root, visit, depth = 0) => {
|
|
212
|
+
visit(root, depth);
|
|
213
|
+
for (const child of root.children) walkSpanTree(child, visit, depth + 1);
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* Returns all spans in the tree in depth-first pre-order, root first.
|
|
217
|
+
*/
|
|
218
|
+
var flattenSpanTree = (root) => {
|
|
219
|
+
const result = [];
|
|
220
|
+
walkSpanTree(root, (span) => result.push(span));
|
|
221
|
+
return result;
|
|
222
|
+
};
|
|
223
|
+
//#endregion
|
|
224
|
+
//#region src/execution-graph/execution-graph.ts
|
|
225
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/execution-graph/execution-graph.ts";
|
|
226
|
+
/**
|
|
227
|
+
* Branch name for top-level operation invocations.
|
|
228
|
+
*/
|
|
229
|
+
var MAIN_BRANCH = "main";
|
|
230
|
+
/** Timeline tag that applies a shimmer message effect. */
|
|
231
|
+
var SHIMMER_EFFECT_TAG = "effect:shimmer";
|
|
232
|
+
var ICONS = {
|
|
233
|
+
agentRequestBegin: {
|
|
234
|
+
icon: "ph--atom--regular",
|
|
235
|
+
level: LogLevel.VERBOSE
|
|
236
|
+
},
|
|
237
|
+
agentRequestEndSuccess: {
|
|
238
|
+
icon: "ph--atom--regular",
|
|
239
|
+
level: LogLevel.INFO
|
|
240
|
+
},
|
|
241
|
+
agentRequestEndError: {
|
|
242
|
+
icon: "ph--atom--regular",
|
|
243
|
+
level: LogLevel.ERROR
|
|
244
|
+
},
|
|
245
|
+
agentRequestEndInterrupted: {
|
|
246
|
+
icon: "ph--atom--regular",
|
|
247
|
+
level: LogLevel.WARN
|
|
248
|
+
},
|
|
249
|
+
userMessage: {
|
|
250
|
+
icon: "ph--user--regular",
|
|
251
|
+
level: LogLevel.VERBOSE
|
|
252
|
+
},
|
|
253
|
+
statusMessage: {
|
|
254
|
+
icon: "ph--info--regular",
|
|
255
|
+
level: LogLevel.VERBOSE
|
|
256
|
+
},
|
|
257
|
+
operationStart: {
|
|
258
|
+
icon: "ph--function--regular",
|
|
259
|
+
level: LogLevel.VERBOSE
|
|
260
|
+
},
|
|
261
|
+
operationEndSuccess: {
|
|
262
|
+
icon: "ph--function--regular",
|
|
263
|
+
level: LogLevel.INFO
|
|
264
|
+
},
|
|
265
|
+
operationEndError: {
|
|
266
|
+
icon: "ph--function--regular",
|
|
267
|
+
level: LogLevel.ERROR
|
|
268
|
+
},
|
|
269
|
+
toolCall: {
|
|
270
|
+
icon: "ph--wrench--regular",
|
|
271
|
+
level: LogLevel.VERBOSE
|
|
272
|
+
},
|
|
273
|
+
toolResultSuccess: {
|
|
274
|
+
icon: "ph--wrench--regular",
|
|
275
|
+
level: LogLevel.INFO
|
|
276
|
+
},
|
|
277
|
+
toolResultError: {
|
|
278
|
+
icon: "ph--wrench--regular",
|
|
279
|
+
level: LogLevel.ERROR
|
|
280
|
+
},
|
|
281
|
+
agentRequestRunning: {
|
|
282
|
+
icon: "ph--spinner-gap--regular",
|
|
283
|
+
level: LogLevel.VERBOSE
|
|
284
|
+
},
|
|
285
|
+
processRunning: {
|
|
286
|
+
icon: "ph--spinner-gap--regular",
|
|
287
|
+
level: LogLevel.VERBOSE
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
var buildExecutionGraph = ({ traceMessages, activeProcesses = [], collapseCompletedSpans = false, eventLimit = 500, spanTimeoutMs, now }) => {
|
|
291
|
+
const spanTree = buildSpanTree(traceMessages, {
|
|
292
|
+
eventLimit,
|
|
293
|
+
spanTimeoutMs,
|
|
294
|
+
now
|
|
295
|
+
});
|
|
296
|
+
const built = spanTreeToCommits(spanTree, activeProcesses, buildToolCallContext(traceMessages), collapseCompletedSpans);
|
|
297
|
+
log("trace execution graph", {
|
|
298
|
+
traceMessages: traceMessages.length,
|
|
299
|
+
commits: built.commits.length,
|
|
300
|
+
branches: built.branches.length,
|
|
301
|
+
activeProcesses: activeProcesses.length
|
|
302
|
+
}, {
|
|
303
|
+
"~LogMeta": "~LogMeta",
|
|
304
|
+
F: __dxlog_file,
|
|
305
|
+
L: 141,
|
|
306
|
+
S: void 0
|
|
307
|
+
});
|
|
308
|
+
return {
|
|
309
|
+
...built,
|
|
310
|
+
spanTree
|
|
311
|
+
};
|
|
312
|
+
};
|
|
313
|
+
var buildToolCallContext = (messages) => {
|
|
314
|
+
const callById = /* @__PURE__ */ new Map();
|
|
315
|
+
const resultByCallId = /* @__PURE__ */ new Map();
|
|
316
|
+
for (const message of messages) for (const event of message.events) {
|
|
317
|
+
if (event.type !== CompleteBlock.key) continue;
|
|
318
|
+
const block = event.data?.block;
|
|
319
|
+
if (!block) continue;
|
|
320
|
+
if (block._tag === "toolCall") callById.set(block.toolCallId, block);
|
|
321
|
+
else if (block._tag === "toolResult") resultByCallId.set(block.toolCallId, block);
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
callById,
|
|
325
|
+
resultByCallId
|
|
326
|
+
};
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Parses `AgentRequestEnd` payload, accepting legacy traces that omitted `status`.
|
|
330
|
+
*/
|
|
331
|
+
var parseAgentRequestEnd = (data) => {
|
|
332
|
+
const validated = Schema.validateEither(AgentRequestEnd.schema)(data);
|
|
333
|
+
if (Either.isRight(validated)) return validated.right;
|
|
334
|
+
if (data != null && typeof data === "object" && Object.keys(data).length === 0) return { status: "success" };
|
|
335
|
+
log("invalid trace event", { type: AgentRequestEnd.key }, {
|
|
336
|
+
"~LogMeta": "~LogMeta",
|
|
337
|
+
F: __dxlog_file,
|
|
338
|
+
L: 208,
|
|
339
|
+
S: void 0
|
|
340
|
+
});
|
|
341
|
+
};
|
|
342
|
+
var presentAgentRequestEnd = (data) => {
|
|
343
|
+
switch (data.status) {
|
|
344
|
+
case "error": return {
|
|
345
|
+
icon: ICONS.agentRequestEndError.icon,
|
|
346
|
+
level: ICONS.agentRequestEndError.level,
|
|
347
|
+
message: data.error ? trimText(`Agent request failed: ${data.error}`) : "Agent request failed"
|
|
348
|
+
};
|
|
349
|
+
case "interrupted": return {
|
|
350
|
+
icon: ICONS.agentRequestEndInterrupted.icon,
|
|
351
|
+
level: ICONS.agentRequestEndInterrupted.level,
|
|
352
|
+
message: "Agent request interrupted"
|
|
353
|
+
};
|
|
354
|
+
default: return {
|
|
355
|
+
icon: ICONS.agentRequestEndSuccess.icon,
|
|
356
|
+
level: ICONS.agentRequestEndSuccess.level,
|
|
357
|
+
message: "Agent completed request"
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
var presentEvent = (event, toolCallContext) => {
|
|
362
|
+
if (Trace.isOfType(AgentRequestBegin, event)) {
|
|
363
|
+
if (Either.isLeft(Schema.validateEither(AgentRequestBegin.schema)(event.data))) {
|
|
364
|
+
log("invalid trace event", { type: event.type }, {
|
|
365
|
+
"~LogMeta": "~LogMeta",
|
|
366
|
+
F: __dxlog_file,
|
|
367
|
+
L: 238,
|
|
368
|
+
S: void 0
|
|
369
|
+
});
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
icon: ICONS.agentRequestBegin.icon,
|
|
374
|
+
level: ICONS.agentRequestBegin.level,
|
|
375
|
+
message: "Agent processing request..."
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
if (Trace.isOfType(AgentRequestEnd, event)) {
|
|
379
|
+
const endData = parseAgentRequestEnd(event.data);
|
|
380
|
+
if (!endData) return;
|
|
381
|
+
return presentAgentRequestEnd(endData);
|
|
382
|
+
}
|
|
383
|
+
if (Trace.isOfType(CompleteBlock, event)) {
|
|
384
|
+
if (Either.isLeft(Schema.validateEither(CompleteBlock.schema)(event.data))) {
|
|
385
|
+
log("invalid trace event", { type: event.type }, {
|
|
386
|
+
"~LogMeta": "~LogMeta",
|
|
387
|
+
F: __dxlog_file,
|
|
388
|
+
L: 256,
|
|
389
|
+
S: void 0
|
|
390
|
+
});
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
switch (event.data.block._tag) {
|
|
394
|
+
case "text": return event.data.role === "user" ? {
|
|
395
|
+
icon: ICONS.userMessage.icon,
|
|
396
|
+
level: ICONS.userMessage.level,
|
|
397
|
+
message: trimText(event.data.block.text)
|
|
398
|
+
} : void 0;
|
|
399
|
+
case "status": return {
|
|
400
|
+
icon: ICONS.statusMessage.icon,
|
|
401
|
+
level: ICONS.statusMessage.level,
|
|
402
|
+
message: trimText(event.data.block.statusText)
|
|
403
|
+
};
|
|
404
|
+
case "toolCall":
|
|
405
|
+
if (event.data.block.operationKey) return;
|
|
406
|
+
if (toolCallContext.resultByCallId.has(event.data.block.toolCallId)) return;
|
|
407
|
+
return {
|
|
408
|
+
icon: ICONS.toolCall.icon,
|
|
409
|
+
level: ICONS.toolCall.level,
|
|
410
|
+
message: event.data.block.name,
|
|
411
|
+
idSuffix: `toolCall:${event.data.block.toolCallId}`
|
|
412
|
+
};
|
|
413
|
+
case "toolResult": {
|
|
414
|
+
const call = toolCallContext.callById.get(event.data.block.toolCallId);
|
|
415
|
+
if (call?.operationKey) return;
|
|
416
|
+
const success = event.data.block.error === void 0;
|
|
417
|
+
const name = call?.name ?? event.data.block.name;
|
|
418
|
+
return {
|
|
419
|
+
icon: success ? ICONS.toolResultSuccess.icon : ICONS.toolResultError.icon,
|
|
420
|
+
level: success ? ICONS.toolResultSuccess.level : ICONS.toolResultError.level,
|
|
421
|
+
message: `${name}${!success ? " - Error" : ""}`,
|
|
422
|
+
idSuffix: `toolResult:${event.data.block.toolCallId}`
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
default: return;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (Trace.isOfType(Trace.OperationStart, event)) {
|
|
429
|
+
if (Either.isLeft(Schema.validateEither(Trace.OperationStart.schema)(event.data))) {
|
|
430
|
+
log("invalid trace event", { type: event.type }, {
|
|
431
|
+
"~LogMeta": "~LogMeta",
|
|
432
|
+
F: __dxlog_file,
|
|
433
|
+
L: 316,
|
|
434
|
+
S: void 0
|
|
435
|
+
});
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
icon: event.data.icon ?? ICONS.operationStart.icon,
|
|
440
|
+
level: ICONS.operationStart.level,
|
|
441
|
+
message: event.data.name ?? event.data.key,
|
|
442
|
+
idSuffix: `${event.data.key}:start`
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
if (Trace.isOfType(Trace.OperationEnd, event)) {
|
|
446
|
+
if (Either.isLeft(Schema.validateEither(Trace.OperationEnd.schema)(event.data))) {
|
|
447
|
+
log("invalid trace event", { type: event.type }, {
|
|
448
|
+
"~LogMeta": "~LogMeta",
|
|
449
|
+
F: __dxlog_file,
|
|
450
|
+
L: 328,
|
|
451
|
+
S: void 0
|
|
452
|
+
});
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
const success = event.data.outcome === "success";
|
|
456
|
+
return {
|
|
457
|
+
icon: event.data.icon ?? (success ? ICONS.operationEndSuccess.icon : ICONS.operationEndError.icon),
|
|
458
|
+
level: success ? ICONS.operationEndSuccess.level : ICONS.operationEndError.level,
|
|
459
|
+
message: `${event.data.name ?? event.data.key}${!success ? " - Error" : ""}`,
|
|
460
|
+
idSuffix: `${event.data.key}:end`
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
/**
|
|
465
|
+
* Collects human-readable activity lines for a process subtree (root pid and descendants).
|
|
466
|
+
* Used to surface live sub-agent status in the task list.
|
|
467
|
+
*/
|
|
468
|
+
var collectProcessActivityLines = (messages, rootPid, options = {}) => {
|
|
469
|
+
const { conversationId, eventLimit = 50 } = options;
|
|
470
|
+
const descendantPids = collectDescendantPids(messages, rootPid);
|
|
471
|
+
const filtered = messages.filter((message) => {
|
|
472
|
+
const pid = message.meta.pid;
|
|
473
|
+
if (!pid || !descendantPids.has(pid)) return false;
|
|
474
|
+
const metaConvId = message.meta.conversation ? EID.getEntityId(EID.parse(message.meta.conversation.uri)) : void 0;
|
|
475
|
+
if (conversationId && metaConvId !== void 0 && metaConvId !== conversationId) return false;
|
|
476
|
+
return true;
|
|
477
|
+
});
|
|
478
|
+
const events = filtered.flatMap((message) => Trace.flatten(message)).sort((left, right) => left.timestamp - right.timestamp).slice(-eventLimit);
|
|
479
|
+
const toolCallContext = buildToolCallContext(filtered);
|
|
480
|
+
const lines = [];
|
|
481
|
+
for (const event of events) {
|
|
482
|
+
const presentation = presentEvent(event, toolCallContext);
|
|
483
|
+
if (presentation) lines.push(presentation.message);
|
|
484
|
+
}
|
|
485
|
+
return lines;
|
|
486
|
+
};
|
|
487
|
+
/**
|
|
488
|
+
* Derives a single in-flight status line from durable trace when ephemeral subscription
|
|
489
|
+
* is unavailable (e.g. between partial blocks or while a child operation is running).
|
|
490
|
+
*/
|
|
491
|
+
var deriveInFlightActivityLine = (messages, rootPid, options = {}) => {
|
|
492
|
+
const { conversationId, eventLimit = 50 } = options;
|
|
493
|
+
const descendantPids = collectDescendantPids(messages, rootPid);
|
|
494
|
+
const events = messages.filter((message) => {
|
|
495
|
+
const pid = message.meta.pid;
|
|
496
|
+
if (!pid || !descendantPids.has(pid)) return false;
|
|
497
|
+
const metaConvId = message.meta.conversation ? EID.getEntityId(EID.parse(message.meta.conversation.uri)) : void 0;
|
|
498
|
+
if (conversationId && metaConvId !== void 0 && metaConvId !== conversationId) return false;
|
|
499
|
+
return true;
|
|
500
|
+
}).flatMap((message) => Trace.flatten(message)).sort((left, right) => left.timestamp - right.timestamp).slice(-eventLimit);
|
|
501
|
+
const openOperations = /* @__PURE__ */ new Map();
|
|
502
|
+
let agentRequestOpen = false;
|
|
503
|
+
let lastLine;
|
|
504
|
+
for (const event of events) {
|
|
505
|
+
const pid = event.meta.pid ?? rootPid;
|
|
506
|
+
if (Trace.isOfType(Trace.OperationStart, event)) {
|
|
507
|
+
const key = `${pid}:${event.data.key}`;
|
|
508
|
+
const name = event.data.name ?? event.data.key;
|
|
509
|
+
openOperations.set(key, {
|
|
510
|
+
name,
|
|
511
|
+
timestamp: event.timestamp
|
|
512
|
+
});
|
|
513
|
+
lastLine = `${name}...`;
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
if (Trace.isOfType(Trace.OperationEnd, event)) {
|
|
517
|
+
openOperations.delete(`${pid}:${event.data.key}`);
|
|
518
|
+
continue;
|
|
519
|
+
}
|
|
520
|
+
if (Trace.isOfType(AgentRequestBegin, event)) {
|
|
521
|
+
agentRequestOpen = true;
|
|
522
|
+
lastLine = "Generating...";
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
if (Trace.isOfType(AgentRequestEnd, event)) agentRequestOpen = false;
|
|
526
|
+
}
|
|
527
|
+
if (agentRequestOpen) return "Generating...";
|
|
528
|
+
const latestOperation = [...openOperations.values()].sort((left, right) => right.timestamp - left.timestamp)[0];
|
|
529
|
+
if (latestOperation) return `${latestOperation.name}...`;
|
|
530
|
+
return lastLine;
|
|
531
|
+
};
|
|
532
|
+
var collectDescendantPids = (messages, rootPid) => {
|
|
533
|
+
const pids = /* @__PURE__ */ new Set([rootPid]);
|
|
534
|
+
let expanded = true;
|
|
535
|
+
while (expanded) {
|
|
536
|
+
expanded = false;
|
|
537
|
+
for (const message of messages) {
|
|
538
|
+
const pid = message.meta.pid;
|
|
539
|
+
const parentPid = message.meta.parentPid;
|
|
540
|
+
if (pid && parentPid && pids.has(parentPid) && !pids.has(pid)) {
|
|
541
|
+
pids.add(pid);
|
|
542
|
+
expanded = true;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return pids;
|
|
547
|
+
};
|
|
548
|
+
var isPendingToolCallEvent = (event, toolCallContext) => {
|
|
549
|
+
if (!Trace.isOfType(CompleteBlock, event)) return false;
|
|
550
|
+
if (event.data.block._tag !== "toolCall") return false;
|
|
551
|
+
return !toolCallContext.resultByCallId.has(event.data.block.toolCallId);
|
|
552
|
+
};
|
|
553
|
+
/**
|
|
554
|
+
* Marks commits that represent work still in flight for Timeline shimmer styling.
|
|
555
|
+
*/
|
|
556
|
+
var shouldShimmerInProgressCommit = (event, toolCallContext) => isPendingToolCallEvent(event, toolCallContext);
|
|
557
|
+
/**
|
|
558
|
+
* A span is completed when its last recorded event is a matching end boundary.
|
|
559
|
+
*/
|
|
560
|
+
var isCompletedSpan = (span) => {
|
|
561
|
+
if (span.id === "<main>") return false;
|
|
562
|
+
const lastEvent = span.events[span.events.length - 1];
|
|
563
|
+
return lastEvent !== void 0 && isSpanEndEvent(lastEvent);
|
|
564
|
+
};
|
|
565
|
+
/**
|
|
566
|
+
* A span is "collapsible" when it would otherwise render as an empty fork-and-merge:
|
|
567
|
+
* exactly two events that form a begin/end pair and no child sub-spans. In that case
|
|
568
|
+
* we emit a single commit for the end event on the parent branch.
|
|
569
|
+
*
|
|
570
|
+
* When `collapseCompletedSpans` is enabled, any completed span collapses to that single
|
|
571
|
+
* end commit — middle events, child sub-spans, and the begin fork are all omitted.
|
|
572
|
+
*
|
|
573
|
+
* A *pending* span (one whose end event has not yet been recorded) is never collapsed:
|
|
574
|
+
* its trailing events should keep rendering as middle commits on the span's own branch
|
|
575
|
+
* — never as a fake "end" commit on the parent branch.
|
|
576
|
+
*
|
|
577
|
+
* Both nested spans and top-level spans (whose parent is the synthetic root) are eligible
|
|
578
|
+
* once they have completed: a span with no inner activity is collapsed regardless of where
|
|
579
|
+
* it sits in the tree.
|
|
580
|
+
*/
|
|
581
|
+
var isCollapsibleSpan = (span, parent, collapseCompletedSpans) => {
|
|
582
|
+
if (span.id === "<main>") return false;
|
|
583
|
+
if (parent === null) return false;
|
|
584
|
+
if (span.events.length === 2 && span.children.length === 0) {
|
|
585
|
+
const firstEvent = span.events[0];
|
|
586
|
+
const lastEvent = span.events[span.events.length - 1];
|
|
587
|
+
if (isSpanBeginEvent(firstEvent) && isSpanEndEvent(lastEvent)) return true;
|
|
588
|
+
}
|
|
589
|
+
if (collapseCompletedSpans && isCompletedSpan(span)) return true;
|
|
590
|
+
return false;
|
|
591
|
+
};
|
|
592
|
+
/**
|
|
593
|
+
* Converts a span tree into a flat list of commits + branches suitable for `Timeline` rendering.
|
|
594
|
+
*
|
|
595
|
+
* For every span the algorithm:
|
|
596
|
+
* - emits the **first** event as a "begin" commit on the parent span's branch (fork);
|
|
597
|
+
* - emits **middle** events as commits on the span's own branch;
|
|
598
|
+
* - emits the **last** event as an "end" commit on the parent span's branch with two parents
|
|
599
|
+
* (the begin commit and the last commit on the span's own branch — a merge).
|
|
600
|
+
*
|
|
601
|
+
* Collapsible spans (`isCollapsibleSpan`) emit only the end commit on the parent branch with
|
|
602
|
+
* a single parent — a tidier rendering for sub-operations that have no inner detail.
|
|
603
|
+
*
|
|
604
|
+
* Events are processed in categorical span-tree order: each span's begin events, its child
|
|
605
|
+
* subtrees (depth-first), then its remaining events. Active-process running rows are inserted
|
|
606
|
+
* at the end of each matching span block — not appended after the entire tree.
|
|
607
|
+
*/
|
|
608
|
+
var spanTreeToCommits = (root, activeProcesses, toolCallContext, collapseCompletedSpans) => {
|
|
609
|
+
const builder = new GraphBuilder();
|
|
610
|
+
const details = {};
|
|
611
|
+
builder.addBranch(MAIN_BRANCH);
|
|
612
|
+
const parentBySpan = /* @__PURE__ */ new Map();
|
|
613
|
+
parentBySpan.set(root, null);
|
|
614
|
+
const indexParents = (span) => {
|
|
615
|
+
for (const child of span.children) {
|
|
616
|
+
parentBySpan.set(child, span);
|
|
617
|
+
indexParents(child);
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
indexParents(root);
|
|
621
|
+
const findParentSpan = (span) => parentBySpan.get(span) ?? null;
|
|
622
|
+
const collapsedSpanIds = /* @__PURE__ */ new Set();
|
|
623
|
+
walkSpanTree(root, (span) => {
|
|
624
|
+
if (isCollapsibleSpan(span, findParentSpan(span), collapseCompletedSpans)) collapsedSpanIds.add(span.id);
|
|
625
|
+
});
|
|
626
|
+
const isUnderCollapsedAncestor = (span) => {
|
|
627
|
+
let ancestor = findParentSpan(span);
|
|
628
|
+
while (ancestor) {
|
|
629
|
+
if (collapsedSpanIds.has(ancestor.id)) return true;
|
|
630
|
+
ancestor = findParentSpan(ancestor);
|
|
631
|
+
}
|
|
632
|
+
return false;
|
|
633
|
+
};
|
|
634
|
+
const branchOf = (span) => {
|
|
635
|
+
if (!span || span.id === "<main>") return MAIN_BRANCH;
|
|
636
|
+
return span.meta.pid ?? span.id;
|
|
637
|
+
};
|
|
638
|
+
const beginCommitIdBySpan = /* @__PURE__ */ new Map();
|
|
639
|
+
const lastInSpanContext = (span) => {
|
|
640
|
+
if (!span || span.id === "<main>") return CommitSelector.branch(MAIN_BRANCH).pipe(CommitSelector.compose(CommitSelector.last()));
|
|
641
|
+
const ownBranch = branchOf(span);
|
|
642
|
+
const beginId = beginCommitIdBySpan.get(span.id);
|
|
643
|
+
return CommitSelector.firstOf(CommitSelector.branch(ownBranch).pipe(CommitSelector.compose(CommitSelector.last())), beginId ? CommitSelector.id(beginId) : CommitSelector.filter(() => false), lastInSpanContext(findParentSpan(span)));
|
|
644
|
+
};
|
|
645
|
+
const lastCommitIdBySpan = /* @__PURE__ */ new Map();
|
|
646
|
+
let globalIndex = 0;
|
|
647
|
+
const insertedRunningPids = /* @__PURE__ */ new Set();
|
|
648
|
+
const activeProcessByPid = new Map(activeProcesses.map((process) => [process.pid, process]));
|
|
649
|
+
const emitRunningIndicator = (pid) => {
|
|
650
|
+
if (insertedRunningPids.has(pid)) return;
|
|
651
|
+
const process = activeProcessByPid.get(pid);
|
|
652
|
+
if (!process) return;
|
|
653
|
+
if (process.key === AGENT_PROCESS_KEY && Option.isSome(Annotation.getDictionary(process.params.annotations, Process.TargetAnnotation)) && (process.state === Process.State.RUNNING || process.state === Process.State.HYBERNATING)) {
|
|
654
|
+
builder.addCommit({
|
|
655
|
+
id: `running:${process.pid}`,
|
|
656
|
+
branch: process.pid,
|
|
657
|
+
parents: builder.computeParents(CommitSelector.branch(process.pid).pipe(CommitSelector.compose(CommitSelector.last()))),
|
|
658
|
+
icon: ICONS.agentRequestRunning.icon,
|
|
659
|
+
level: ICONS.agentRequestRunning.level,
|
|
660
|
+
message: "Generating...",
|
|
661
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
662
|
+
tags: [SHIMMER_EFFECT_TAG]
|
|
663
|
+
});
|
|
664
|
+
insertedRunningPids.add(pid);
|
|
665
|
+
} else if (process.state === Process.State.RUNNING && builder.hasBranch(process.pid)) {
|
|
666
|
+
builder.addCommit({
|
|
667
|
+
id: `running:${process.pid}`,
|
|
668
|
+
branch: process.pid,
|
|
669
|
+
parents: builder.computeParents(CommitSelector.branch(process.pid).pipe(CommitSelector.compose(CommitSelector.last()))),
|
|
670
|
+
icon: ICONS.processRunning.icon,
|
|
671
|
+
level: ICONS.processRunning.level,
|
|
672
|
+
message: "Running...",
|
|
673
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
674
|
+
tags: [SHIMMER_EFFECT_TAG]
|
|
675
|
+
});
|
|
676
|
+
insertedRunningPids.add(pid);
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
const emitEventCommit = (span, event, eventIndex) => {
|
|
680
|
+
const presentation = presentEvent(event, toolCallContext);
|
|
681
|
+
if (!presentation) return;
|
|
682
|
+
const isBeginEvent = isSpanBeginEvent(event);
|
|
683
|
+
const isEndEvent = isSpanEndEvent(event);
|
|
684
|
+
const parentSpan = findParentSpan(span);
|
|
685
|
+
const collapsible = isCollapsibleSpan(span, parentSpan, collapseCompletedSpans);
|
|
686
|
+
if (isUnderCollapsedAncestor(span)) return;
|
|
687
|
+
if (collapsible && !isEndEvent) return;
|
|
688
|
+
const parentBranch = branchOf(parentSpan);
|
|
689
|
+
const ownBranch = branchOf(span);
|
|
690
|
+
const ownPid = span.meta.pid;
|
|
691
|
+
const parentPid = parentSpan?.meta.pid;
|
|
692
|
+
const spanHasMiddle = span.events.some((spanEvent) => !isSpanBeginEvent(spanEvent) && !isSpanEndEvent(spanEvent));
|
|
693
|
+
const isProcessBoundary = ownPid != null && parentPid != null && ownPid !== parentPid && spanHasMiddle;
|
|
694
|
+
let branch;
|
|
695
|
+
let parents;
|
|
696
|
+
if (span.id === "<main>") {
|
|
697
|
+
branch = MAIN_BRANCH;
|
|
698
|
+
parents = builder.computeParents(lastInSpanContext(null));
|
|
699
|
+
} else if (collapsible) {
|
|
700
|
+
branch = parentBranch;
|
|
701
|
+
parents = builder.computeParents(lastInSpanContext(parentSpan));
|
|
702
|
+
} else if (isBeginEvent) {
|
|
703
|
+
branch = isProcessBoundary ? ownBranch : parentBranch;
|
|
704
|
+
parents = builder.computeParents(lastInSpanContext(parentSpan));
|
|
705
|
+
} else if (isEndEvent) {
|
|
706
|
+
branch = isProcessBoundary ? MAIN_BRANCH : parentBranch;
|
|
707
|
+
parents = builder.computeParents(CommitSelector.unionAll(CommitSelector.branch(branch).pipe(CommitSelector.compose(CommitSelector.last())), CommitSelector.branch(ownBranch).pipe(CommitSelector.compose(CommitSelector.last()))));
|
|
708
|
+
} else {
|
|
709
|
+
branch = ownBranch;
|
|
710
|
+
parents = builder.computeParents(lastInSpanContext(span));
|
|
711
|
+
}
|
|
712
|
+
const commitId = formatCommitId(span, globalIndex++, presentation.idSuffix);
|
|
713
|
+
const shimmer = shouldShimmerInProgressCommit(event, toolCallContext);
|
|
714
|
+
const commit = {
|
|
715
|
+
id: commitId,
|
|
716
|
+
branch,
|
|
717
|
+
parents,
|
|
718
|
+
timestamp: new Date(event.timestamp),
|
|
719
|
+
icon: presentation.icon,
|
|
720
|
+
level: presentation.level,
|
|
721
|
+
message: presentation.message,
|
|
722
|
+
...shimmer && { tags: [SHIMMER_EFFECT_TAG] }
|
|
723
|
+
};
|
|
724
|
+
builder.addCommit(commit);
|
|
725
|
+
details[commitId] = event;
|
|
726
|
+
lastCommitIdBySpan.set(span.id, commitId);
|
|
727
|
+
if (isBeginEvent && !collapsible && span.id !== "<main>") beginCommitIdBySpan.set(span.id, commitId);
|
|
728
|
+
};
|
|
729
|
+
const finishSpan = (span) => {
|
|
730
|
+
const pid = span.meta.pid;
|
|
731
|
+
if (pid) emitRunningIndicator(Process.ID.make(pid));
|
|
732
|
+
if (span.id === "<main>" || isCompletedSpan(span)) return;
|
|
733
|
+
if (pid && insertedRunningPids.has(pid)) return;
|
|
734
|
+
const lastCommitId = lastCommitIdBySpan.get(span.id);
|
|
735
|
+
if (lastCommitId) builder.addTag(lastCommitId, SHIMMER_EFFECT_TAG);
|
|
736
|
+
};
|
|
737
|
+
const emitSpanCommits = (span) => {
|
|
738
|
+
for (let eventIndex = 0; eventIndex < span.events.length; eventIndex += 1) {
|
|
739
|
+
const event = span.events[eventIndex];
|
|
740
|
+
if (isSpanBeginEvent(event)) emitEventCommit(span, event, eventIndex);
|
|
741
|
+
}
|
|
742
|
+
for (const child of span.children) emitSpanCommits(child);
|
|
743
|
+
for (let eventIndex = 0; eventIndex < span.events.length; eventIndex += 1) {
|
|
744
|
+
const event = span.events[eventIndex];
|
|
745
|
+
if (!isSpanBeginEvent(event)) emitEventCommit(span, event, eventIndex);
|
|
746
|
+
}
|
|
747
|
+
finishSpan(span);
|
|
748
|
+
};
|
|
749
|
+
emitSpanCommits(root);
|
|
750
|
+
for (const process of activeProcesses) emitRunningIndicator(process.pid);
|
|
751
|
+
const { commits, branches } = builder.build();
|
|
752
|
+
return {
|
|
753
|
+
commits,
|
|
754
|
+
branches,
|
|
755
|
+
details
|
|
756
|
+
};
|
|
757
|
+
};
|
|
758
|
+
var formatCommitId = (span, globalIndex, suffix) => {
|
|
759
|
+
const base = `${span.id}:${globalIndex}`;
|
|
760
|
+
return suffix ? `${base}:${suffix}` : base;
|
|
761
|
+
};
|
|
762
|
+
var trimText = (text) => text.slice(0, 100).trim().split("\n")[0];
|
|
763
|
+
var CommitSelector = {
|
|
764
|
+
make: (select) => ({
|
|
765
|
+
select,
|
|
766
|
+
pipe(...args) {
|
|
767
|
+
return Pipeable.pipeArguments(this, args);
|
|
768
|
+
}
|
|
769
|
+
}),
|
|
770
|
+
identity: () => CommitSelector.make((commits) => commits),
|
|
771
|
+
/**
|
|
772
|
+
* Selects commits that match the given predicate.
|
|
773
|
+
*/
|
|
774
|
+
filter: (predicate) => CommitSelector.make((commits) => commits.filter(predicate)),
|
|
775
|
+
/**
|
|
776
|
+
* Selects commits by id.
|
|
777
|
+
*/
|
|
778
|
+
id: (id) => CommitSelector.filter((commit) => commit.id === id),
|
|
779
|
+
/**
|
|
780
|
+
* Selects commits by tag.
|
|
781
|
+
*/
|
|
782
|
+
tag: (tag) => CommitSelector.filter((commit) => tag && commit.tags?.includes(tag)),
|
|
783
|
+
/**
|
|
784
|
+
* Selects commits by if any of the given tags are present.
|
|
785
|
+
*/
|
|
786
|
+
anyTags: (tags) => CommitSelector.filter((commit) => tags.some((tag) => tag && commit.tags?.includes(tag))),
|
|
787
|
+
/**
|
|
788
|
+
* Selects commits by branch.
|
|
789
|
+
*/
|
|
790
|
+
branch: (branch) => CommitSelector.filter((commit) => branch && commit.branch === branch),
|
|
791
|
+
/**
|
|
792
|
+
* Chains two selectors together, applying the second selector to the result of the first.
|
|
793
|
+
*
|
|
794
|
+
* Example:
|
|
795
|
+
*
|
|
796
|
+
* ```
|
|
797
|
+
* CommitSelector.tag('tag').pipe(CommitSelector.compose(CommitSelector.branch('main')));
|
|
798
|
+
* ```
|
|
799
|
+
*/
|
|
800
|
+
compose: (next) => (prev) => CommitSelector.make((commits) => next.select(prev.select(commits))),
|
|
801
|
+
/**
|
|
802
|
+
* If `prev` selector matches no commits, return `next` selector, otherwise return `prev` selector.
|
|
803
|
+
* Same as `CommitSelector.firstOf(prev, next)`.
|
|
804
|
+
*
|
|
805
|
+
* Example:
|
|
806
|
+
*
|
|
807
|
+
* ```
|
|
808
|
+
* CommitSelector.tag('tag').pipe(CommitSelector.orElse(CommitSelector.branch('main')));
|
|
809
|
+
* ```
|
|
810
|
+
*/
|
|
811
|
+
orElse: (next) => (prev) => CommitSelector.make((commits) => {
|
|
812
|
+
const selected = prev.select(commits);
|
|
813
|
+
if (selected.length > 0) return selected;
|
|
814
|
+
return next.select(commits);
|
|
815
|
+
}),
|
|
816
|
+
/**
|
|
817
|
+
* Selects commits that match either of the given selectors.
|
|
818
|
+
*/
|
|
819
|
+
andAlso: (next) => (prev) => CommitSelector.unionAll(prev, next),
|
|
820
|
+
/**
|
|
821
|
+
* Selects the first n commits.
|
|
822
|
+
*/
|
|
823
|
+
first: (n = 1) => CommitSelector.make((commits) => commits.slice(0, n)),
|
|
824
|
+
/**
|
|
825
|
+
* Selects the last n commits (reverses the order of the commits).
|
|
826
|
+
*/
|
|
827
|
+
last: (n = 1) => CommitSelector.make((commits) => commits.toReversed().slice(0, n)),
|
|
828
|
+
/**
|
|
829
|
+
* Selects commits that do not match the given selector.
|
|
830
|
+
*/
|
|
831
|
+
not: (selector) => CommitSelector.make((commits) => {
|
|
832
|
+
const selected = selector.select(commits);
|
|
833
|
+
return commits.filter((commit) => !selected.includes(commit));
|
|
834
|
+
}),
|
|
835
|
+
/**
|
|
836
|
+
* Selects commits that match any of the given selectors.
|
|
837
|
+
*/
|
|
838
|
+
unionAll: (...selectors) => CommitSelector.make((commits) => {
|
|
839
|
+
return Array.dedupeWith(selectors.flatMap((selector) => selector.select(commits)), (a, b) => a.id === b.id);
|
|
840
|
+
}),
|
|
841
|
+
/**
|
|
842
|
+
* Selects commits that match all of the given selectors.
|
|
843
|
+
*/
|
|
844
|
+
intersectAll: (...selectors) => CommitSelector.make((commits) => {
|
|
845
|
+
const selected = selectors.map((selector) => selector.select(commits));
|
|
846
|
+
if (selected.length === 0) return [];
|
|
847
|
+
return selected[0].filter((commit) => selected.every((selected) => selected.some((c) => c.id === commit.id)));
|
|
848
|
+
}),
|
|
849
|
+
/**
|
|
850
|
+
* Returns the result of the first selector that matches any commits.
|
|
851
|
+
*/
|
|
852
|
+
firstOf: (...selectors) => CommitSelector.make((commits) => {
|
|
853
|
+
for (const selector of selectors) {
|
|
854
|
+
const selected = selector.select(commits);
|
|
855
|
+
if (selected.length > 0) return selected;
|
|
856
|
+
}
|
|
857
|
+
return [];
|
|
858
|
+
})
|
|
859
|
+
};
|
|
860
|
+
var GraphBuilder = class {
|
|
861
|
+
#commits = [];
|
|
862
|
+
#branches = /* @__PURE__ */ new Set();
|
|
863
|
+
findCommits(selector) {
|
|
864
|
+
return selector.select(this.#commits);
|
|
865
|
+
}
|
|
866
|
+
hasBranch(branch) {
|
|
867
|
+
return this.#branches.has(branch);
|
|
868
|
+
}
|
|
869
|
+
addCommit(commit) {
|
|
870
|
+
this.addBranch(commit.branch);
|
|
871
|
+
this.#commits.push(commit);
|
|
872
|
+
}
|
|
873
|
+
addTag(commitId, tag) {
|
|
874
|
+
const index = this.#commits.findIndex((commit) => commit.id === commitId);
|
|
875
|
+
if (index < 0) return;
|
|
876
|
+
const commit = this.#commits[index];
|
|
877
|
+
if (commit.tags?.includes(tag)) return;
|
|
878
|
+
this.#commits[index] = {
|
|
879
|
+
...commit,
|
|
880
|
+
tags: [...commit.tags ?? [], tag]
|
|
881
|
+
};
|
|
882
|
+
}
|
|
883
|
+
/**
|
|
884
|
+
* Computes parents — picks first matching commit's id.
|
|
885
|
+
*/
|
|
886
|
+
computeParents(selector) {
|
|
887
|
+
return Array.dedupe(selector.select(this.#commits).map((commit) => commit.id));
|
|
888
|
+
}
|
|
889
|
+
addBranch(branch) {
|
|
890
|
+
this.#branches.add(branch);
|
|
891
|
+
}
|
|
892
|
+
/**
|
|
893
|
+
* Removes duplicate commits and dangling parents.
|
|
894
|
+
*/
|
|
895
|
+
doctor() {
|
|
896
|
+
this.#commits = pipe(this.#commits, Array.dedupeWith((a, b) => a.id === b.id), Array.map(Struct.evolve({ parents: (parents) => parents ? Array.filter(parents, (id) => this.#commits.some((commit) => commit.id === id)) : void 0 })));
|
|
897
|
+
}
|
|
898
|
+
build() {
|
|
899
|
+
this.doctor();
|
|
900
|
+
return {
|
|
901
|
+
commits: this.#commits,
|
|
902
|
+
branches: [...this.#branches]
|
|
903
|
+
};
|
|
904
|
+
}
|
|
905
|
+
};
|
|
906
|
+
//#endregion
|
|
907
|
+
//#region src/execution-graph/pending-block-status.ts
|
|
908
|
+
/**
|
|
909
|
+
* Approximate streamed token count from partial text (UTF-8 length / 4).
|
|
910
|
+
*/
|
|
911
|
+
var estimateTokenCount = (text) => Math.max(1, Math.ceil(new TextEncoder().encode(text).length / 4));
|
|
912
|
+
var formatOperationInputStatus = (data) => {
|
|
913
|
+
return `Calling ${data.name ?? data.key} (${new TextEncoder().encode(JSON.stringify(data.input)).length} bytes)...`;
|
|
914
|
+
};
|
|
915
|
+
/** Raw routine status updates (e.g. `Running 01KVB9WBRG…`) carry an opaque ULID, not a useful label. */
|
|
916
|
+
var ROUTINE_ULID_STATUS = /^Running [0-9A-HJKMNP-TV-Z]{26}$/i;
|
|
917
|
+
/**
|
|
918
|
+
* Formats a pending assistant block for the delegated-task status line.
|
|
919
|
+
*/
|
|
920
|
+
var formatPendingBlockStatus = (block) => {
|
|
921
|
+
if (!block.pending) return;
|
|
922
|
+
if (block._tag === "text") return `Generating ${estimateTokenCount(block.text)} tokens....`;
|
|
923
|
+
if (block._tag === "toolCall") {
|
|
924
|
+
const bytes = new TextEncoder().encode(block.input).length;
|
|
925
|
+
return `Calling ${block.operationName ?? block.name} (${bytes} bytes)...`;
|
|
926
|
+
}
|
|
927
|
+
};
|
|
928
|
+
/**
|
|
929
|
+
* Reads the latest pending partial block from an ephemeral trace message.
|
|
930
|
+
*/
|
|
931
|
+
var pendingStatusFromEphemeralMessage = (message) => {
|
|
932
|
+
for (const event of message.events) {
|
|
933
|
+
if (Trace.isOfType(PartialBlock, event)) {
|
|
934
|
+
const status = formatPendingBlockStatus(event.data.block);
|
|
935
|
+
if (status) return status;
|
|
936
|
+
continue;
|
|
937
|
+
}
|
|
938
|
+
if (Trace.isOfType(Trace.OperationInput, event)) return formatOperationInputStatus(event.data);
|
|
939
|
+
if (Trace.isOfType(Trace.StatusUpdate, event)) {
|
|
940
|
+
const message = event.data.message?.trim();
|
|
941
|
+
if (!message || ROUTINE_ULID_STATUS.test(message)) continue;
|
|
942
|
+
return message;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
};
|
|
946
|
+
/**
|
|
947
|
+
* Maps an ephemeral trace message to a task-status update.
|
|
948
|
+
*
|
|
949
|
+
* The status line is "sticky": a message without a pending line (e.g. a completed block during an
|
|
950
|
+
* LLM-thinking gap) leaves the previous line in place rather than clearing it, so the row keeps
|
|
951
|
+
* showing the latest meaningful activity until a new line arrives or the subscription ends.
|
|
952
|
+
*/
|
|
953
|
+
var resolveEphemeralStatusUpdate = (message) => {
|
|
954
|
+
const line = pendingStatusFromEphemeralMessage(message);
|
|
955
|
+
if (line) return { line };
|
|
956
|
+
return "unchanged";
|
|
957
|
+
};
|
|
958
|
+
//#endregion
|
|
959
|
+
export { BEGIN_EVENT_TYPES, CommitSelector, DEFAULT_SPAN_TIMEOUT_MS, END_EVENT_TYPES, ROOT_SPAN_ID, buildExecutionGraph, buildSpanTree, collectProcessActivityLines, deriveInFlightActivityLine, estimateTokenCount, flattenSpanTree, formatPendingBlockStatus, isSpanBeginEvent, isSpanEndEvent, pendingStatusFromEphemeralMessage, resolveEphemeralStatusUpdate, walkSpanTree };
|
|
960
|
+
|
|
961
|
+
//# sourceMappingURL=execution-graph.mjs.map
|