@dxos/plugin-assistant 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc
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/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/neutral/AgentArticle-5XDDEXMP.mjs +169 -0
- package/dist/lib/neutral/AgentArticle-5XDDEXMP.mjs.map +7 -0
- package/dist/lib/neutral/AgentProperties-CNH4JMDZ.mjs +100 -0
- package/dist/lib/neutral/AgentProperties-CNH4JMDZ.mjs.map +7 -0
- package/dist/lib/neutral/AssistantPlugin.mjs +10 -0
- package/dist/lib/neutral/AssistantPlugin.node.mjs +46 -0
- package/dist/lib/neutral/AssistantPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/AssistantPlugin.workerd.mjs +40 -0
- package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/BlueprintArticle-U7LUBFOS.mjs +27 -0
- package/dist/lib/neutral/BlueprintArticle-U7LUBFOS.mjs.map +7 -0
- package/dist/lib/neutral/ChatArticle-WVAFZPVI.mjs +8 -0
- package/dist/lib/neutral/ChatCompanion-DFRMRUK3.mjs +133 -0
- package/dist/lib/neutral/ChatCompanion-DFRMRUK3.mjs.map +7 -0
- package/dist/lib/neutral/ChatDialog-QKZLG7SQ.mjs +72 -0
- package/dist/lib/neutral/ChatDialog-QKZLG7SQ.mjs.map +7 -0
- package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs +28 -0
- package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs.map +7 -0
- package/dist/lib/neutral/RoutineArticle-H7ECM7AH.mjs +116 -0
- package/dist/lib/neutral/RoutineArticle-H7ECM7AH.mjs.map +7 -0
- package/dist/lib/neutral/RoutineList-CLDXGQUD.mjs +48 -0
- package/dist/lib/neutral/RoutineList-CLDXGQUD.mjs.map +7 -0
- package/dist/lib/neutral/TracePanel-C77SPEIS.mjs +672 -0
- package/dist/lib/neutral/TracePanel-C77SPEIS.mjs.map +7 -0
- package/dist/lib/neutral/TriggerStatus-WTFYUIG5.mjs +92 -0
- package/dist/lib/neutral/TriggerStatus-WTFYUIG5.mjs.map +7 -0
- package/dist/lib/neutral/ai-service-GJXMI5OI.mjs +22 -0
- package/dist/lib/neutral/ai-service-GJXMI5OI.mjs.map +7 -0
- package/dist/lib/neutral/app-graph-builder-5QBICPYP.mjs +200 -0
- package/dist/lib/neutral/app-graph-builder-5QBICPYP.mjs.map +7 -0
- package/dist/lib/neutral/blueprint-definition-VXJYQ5AE.mjs +32 -0
- package/dist/lib/neutral/blueprint-definition-VXJYQ5AE.mjs.map +7 -0
- package/dist/lib/neutral/blueprints/index.mjs +8 -0
- package/dist/lib/neutral/capabilities/index.mjs +35 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-3FIV362Z.mjs +8 -0
- package/dist/lib/neutral/chunk-3FIV362Z.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4CQZCMRP.mjs +25 -0
- package/dist/lib/neutral/chunk-4CQZCMRP.mjs.map +7 -0
- package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5H6UJHLF.mjs} +4 -5
- package/dist/lib/neutral/chunk-5H6UJHLF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ITJX2YZZ.mjs +98 -0
- package/dist/lib/neutral/chunk-ITJX2YZZ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-IZQWGJNG.mjs +380 -0
- package/dist/lib/neutral/chunk-IZQWGJNG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SLIPV6NN.mjs +106 -0
- package/dist/lib/neutral/chunk-SLIPV6NN.mjs.map +7 -0
- package/dist/lib/neutral/companion-chat-provisioner-2Y6PRSDK.mjs +116 -0
- package/dist/lib/neutral/companion-chat-provisioner-2Y6PRSDK.mjs.map +7 -0
- package/dist/lib/{browser/chunk-VK53MITK.mjs → neutral/components/index.mjs} +139 -141
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +29 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/{browser/create-chat-E2ZLVTLP.mjs → neutral/create-chat-QQZURUBW.mjs} +10 -12
- package/dist/lib/neutral/create-chat-QQZURUBW.mjs.map +7 -0
- package/dist/lib/neutral/create-object-UZCJCPWM.mjs +93 -0
- package/dist/lib/neutral/create-object-UZCJCPWM.mjs.map +7 -0
- package/dist/lib/neutral/edge-model-resolver-XDNBZ3US.mjs +21 -0
- package/dist/lib/neutral/edge-model-resolver-XDNBZ3US.mjs.map +7 -0
- package/dist/lib/{browser/ensure-companion-chat-7GDMXSQW.mjs → neutral/ensure-companion-chat-5S4LZM2H.mjs} +9 -16
- package/dist/lib/neutral/ensure-companion-chat-5S4LZM2H.mjs.map +7 -0
- package/dist/lib/{browser/chunk-M55MBYG7.mjs → neutral/hooks/index.mjs} +106 -111
- package/dist/lib/neutral/hooks/index.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +32 -0
- package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs +24 -0
- package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs.map +7 -0
- package/dist/lib/neutral/markdown-KTBFOMFM.mjs +110 -0
- package/dist/lib/neutral/markdown-KTBFOMFM.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +12 -0
- package/dist/lib/neutral/migrations-7DEMVBOG.mjs +28 -0
- package/dist/lib/neutral/migrations-7DEMVBOG.mjs.map +7 -0
- package/dist/lib/{browser/on-create-space-4J3KTNAJ.mjs → neutral/on-create-space-Q2R7OSP6.mjs} +4 -7
- package/dist/lib/neutral/on-create-space-Q2R7OSP6.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-SF36MOB5.mjs +13 -0
- package/dist/lib/neutral/operation-handler-SF36MOB5.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-T4R65UJU.mjs +174 -0
- package/dist/lib/neutral/react-surface-T4R65UJU.mjs.map +7 -0
- package/dist/lib/{browser/resolve-navigation-targets-3ZPQE6SZ.mjs → neutral/resolve-navigation-targets-VXBSWV5L.mjs} +3 -5
- package/dist/lib/neutral/resolve-navigation-targets-VXBSWV5L.mjs.map +7 -0
- package/dist/lib/{browser/run-prompt-in-new-chat-AA3KPBDN.mjs → neutral/run-prompt-in-new-chat-VJXXZ6SI.mjs} +16 -19
- package/dist/lib/neutral/run-prompt-in-new-chat-VJXXZ6SI.mjs.map +7 -0
- package/dist/lib/{browser/set-current-chat-P4VHI3YF.mjs → neutral/set-current-chat-ZFDCYK5I.mjs} +4 -10
- package/dist/lib/neutral/set-current-chat-ZFDCYK5I.mjs.map +7 -0
- package/dist/lib/neutral/settings-W4BLWQ53.mjs +28 -0
- package/dist/lib/neutral/settings-W4BLWQ53.mjs.map +7 -0
- package/dist/lib/neutral/state-H3G7QCU6.mjs +28 -0
- package/dist/lib/neutral/state-H3G7QCU6.mjs.map +7 -0
- package/dist/lib/neutral/testing.mjs +8 -0
- package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs +21 -0
- package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs.map +7 -0
- package/dist/lib/neutral/toolkit-GVWXPDLJ.mjs +14 -0
- package/dist/lib/neutral/toolkit-GVWXPDLJ.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/translations.mjs +5 -2
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +20 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/lib/{browser/update-chat-name-VWKNUON7.mjs → neutral/update-chat-name-ENXRUMDJ.mjs} +3 -5
- package/dist/lib/neutral/update-chat-name-ENXRUMDJ.mjs.map +7 -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 +4 -0
- package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/capabilities/companion-chat-provisioner.d.ts.map +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +31 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +27 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +1 -1
- package/dist/types/src/capabilities/migrations.d.ts +2 -1
- package/dist/types/src/capabilities/migrations.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +11 -5
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +2 -2
- package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +2 -2
- package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +2 -3
- package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/StatusWidget.d.ts +2 -15
- package/dist/types/src/components/ChatThread/widgets/StatusWidget.d.ts.map +1 -1
- package/dist/types/src/components/ChatThread/widgets/SummaryWidget.d.ts.map +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.d.ts +10 -0
- package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -0
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts +16 -0
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -0
- package/dist/types/src/components/TaskList/index.d.ts +2 -0
- package/dist/types/src/components/TaskList/index.d.ts.map +1 -0
- package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +1 -2
- package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +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.map +1 -1
- package/dist/types/src/containers/{ChatContainer/ChatContainer.d.ts → ChatArticle/ChatArticle.d.ts} +3 -3
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -0
- package/dist/types/src/containers/ChatArticle/index.d.ts +2 -0
- package/dist/types/src/containers/ChatArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts +6 -0
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +1 -0
- package/dist/types/src/containers/PlanArticle/index.d.ts +2 -0
- package/dist/types/src/containers/PlanArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts +15 -0
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts.map +1 -0
- 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/TracePanel/execution-graph.d.ts +11 -2
- package/dist/types/src/containers/TracePanel/execution-graph.d.ts.map +1 -1
- package/dist/types/src/containers/TracePanel/span-tree.d.ts +73 -0
- package/dist/types/src/containers/TracePanel/span-tree.d.ts.map +1 -0
- package/dist/types/src/containers/TracePanel/span-tree.test.d.ts +2 -0
- package/dist/types/src/containers/TracePanel/span-tree.test.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +4 -3
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/feed-logger.d.ts +13 -0
- package/dist/types/src/feed-logger.d.ts.map +1 -0
- package/dist/types/src/hooks/useBlueprintRegistry.d.ts +3 -3
- package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts +1 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatServices.d.ts +1 -1
- package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
- package/dist/types/src/hooks/useContextBinder.d.ts +2 -2
- package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
- package/dist/types/src/hooks/useContextObjects.d.ts +2 -2
- package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/create-chat.d.ts +2 -2
- package/dist/types/src/operations/create-chat.d.ts.map +1 -1
- package/dist/types/src/operations/ensure-companion-chat.d.ts +2 -2
- package/dist/types/src/operations/ensure-companion-chat.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +0 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/on-create-space.d.ts +2 -2
- package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
- package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +2 -2
- package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
- package/dist/types/src/operations/set-current-chat.d.ts +2 -2
- package/dist/types/src/operations/set-current-chat.d.ts.map +1 -1
- package/dist/types/src/operations/toggle-trace-panel-debug.d.ts +5 -0
- package/dist/types/src/operations/toggle-trace-panel-debug.d.ts.map +1 -0
- package/dist/types/src/operations/update-chat-name.d.ts +2 -2
- package/dist/types/src/operations/update-chat-name.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/processor/processor.d.ts +11 -11
- package/dist/types/src/processor/processor.d.ts.map +1 -1
- package/dist/types/src/testing/test-generator.d.ts +2 -3
- package/dist/types/src/testing/test-generator.d.ts.map +1 -1
- package/dist/types/src/testing/test-sequence.d.ts +3 -3
- package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
- package/dist/types/src/testing.d.ts +2 -0
- package/dist/types/src/testing.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Assistant.d.ts +1 -0
- package/dist/types/src/types/Assistant.d.ts.map +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts +30 -0
- package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -0
- package/dist/types/src/types/AssistantEvents.d.ts +3 -0
- package/dist/types/src/types/AssistantEvents.d.ts.map +1 -0
- package/dist/types/src/{operations/definitions.d.ts → types/AssistantOperation.d.ts} +10 -6
- package/dist/types/src/types/AssistantOperation.d.ts.map +1 -0
- package/dist/types/src/types/Settings.d.ts +1 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +3 -2
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/util/suggestions.d.ts +9 -0
- package/dist/types/src/util/suggestions.d.ts.map +1 -0
- package/dist/types/src/util/suggestions.test.d.ts +2 -0
- package/dist/types/src/util/suggestions.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +152 -128
- package/src/AssistantPlugin.node.ts +7 -88
- package/src/AssistantPlugin.test.ts +3 -3
- package/src/AssistantPlugin.ts +126 -0
- package/src/AssistantPlugin.workerd.ts +41 -0
- package/src/blueprints/assistant/blueprint.ts +1 -1
- package/src/capabilities/app-graph-builder.ts +48 -9
- package/src/capabilities/companion-chat-provisioner.ts +4 -5
- package/src/capabilities/create-object.ts +107 -0
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/markdown.ts +2 -2
- package/src/capabilities/migrations.ts +3 -3
- package/src/capabilities/react-surface.tsx +15 -7
- package/src/components/Chat/Chat.tsx +35 -5
- package/src/components/ChatPrompt/ChatMcpErrors.tsx +1 -1
- package/src/components/ChatPrompt/ChatOptions.stories.tsx +4 -4
- package/src/components/ChatPrompt/ChatOptions.tsx +12 -11
- package/src/components/ChatPrompt/ChatPrompt.tsx +3 -3
- package/src/components/ChatPrompt/ChatReferences.tsx +3 -3
- package/src/components/ChatPrompt/ChatStatus.tsx +1 -1
- package/src/components/ChatPrompt/ChatStatusIndicator.tsx +1 -1
- package/src/components/ChatThread/Anchor.stories.tsx +3 -3
- package/src/components/ChatThread/ChatThread.stories.tsx +25 -29
- package/src/components/ChatThread/ChatThread.tsx +1 -1
- package/src/components/ChatThread/registry.tsx +8 -4
- package/src/components/ChatThread/sync.test.ts +4 -6
- package/src/components/ChatThread/widgets/ReasoningWidget.ts +2 -2
- package/src/components/ChatThread/widgets/StatusWidget.ts +3 -83
- package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -3
- package/src/components/ProcessTree/ProcessTree.tsx +2 -1
- package/src/components/TaskList/TaskList.stories.tsx +44 -0
- package/src/components/TaskList/TaskList.tsx +45 -0
- package/src/{cli → components/TaskList}/index.ts +1 -1
- package/src/components/TemplateEditor/TemplateEditor.stories.tsx +1 -1
- package/src/components/TemplateEditor/TemplateForm.stories.tsx +2 -6
- package/src/components/TemplateEditor/TemplateForm.tsx +48 -69
- package/src/components/Toolbox/Toolbox.stories.tsx +4 -4
- package/src/components/Toolbox/Toolbox.tsx +2 -2
- package/src/components/index.ts +1 -0
- package/src/containers/AgentArticle/AgentArticle.stories.tsx +7 -7
- package/src/containers/AgentArticle/AgentArticle.tsx +11 -7
- package/src/containers/AgentProperties/AgentProperties.stories.tsx +4 -4
- package/src/containers/AgentProperties/AgentProperties.tsx +4 -4
- package/src/containers/{ChatContainer/ChatContainer.tsx → ChatArticle/ChatArticle.tsx} +11 -9
- package/src/containers/ChatArticle/index.ts +5 -0
- package/src/containers/ChatCompanion/ChatCompanion.tsx +20 -29
- package/src/containers/PlanArticle/PlanArticle.tsx +33 -0
- package/src/containers/PlanArticle/index.ts +5 -0
- package/src/containers/RoutineArticle/RoutineArticle.stories.tsx +75 -0
- package/src/containers/RoutineArticle/RoutineArticle.tsx +74 -24
- package/src/containers/RoutineList/RoutineList.stories.tsx +3 -3
- package/src/containers/RoutineList/RoutineList.tsx +3 -3
- package/src/containers/TracePanel/TracePanel.stories.tsx +33 -26
- package/src/containers/TracePanel/TracePanel.tsx +72 -33
- package/src/containers/TracePanel/dxn-extractor.ts +7 -7
- package/src/containers/TracePanel/execution-graph.test.ts +218 -213
- package/src/containers/TracePanel/execution-graph.ts +316 -271
- package/src/containers/TracePanel/span-tree.test.ts +166 -0
- package/src/containers/TracePanel/span-tree.ts +214 -0
- package/src/containers/index.ts +4 -3
- package/src/{queue-logger.ts → feed-logger.ts} +37 -27
- package/src/hooks/useBlueprintRegistry.ts +12 -6
- package/src/hooks/useChatProcessor.ts +3 -3
- package/src/hooks/useChatServices.ts +1 -1
- package/src/hooks/useChatToolbarActions.ts +86 -88
- package/src/hooks/useContextBinder.ts +4 -4
- package/src/hooks/useContextObjects.ts +2 -2
- package/src/index.ts +2 -9
- package/src/operations/create-chat.ts +16 -11
- package/src/operations/ensure-companion-chat.ts +47 -45
- package/src/operations/index.ts +1 -2
- package/src/operations/on-create-space.ts +3 -3
- package/src/operations/prompt.test.ts +5 -5
- package/src/operations/resolve-navigation-targets.ts +2 -2
- package/src/operations/run-prompt-in-new-chat.ts +85 -84
- package/src/operations/set-current-chat.ts +3 -4
- package/src/operations/toggle-trace-panel-debug.ts +27 -0
- package/src/operations/update-chat-name.ts +2 -2
- package/src/plugin.ts +11 -0
- package/src/processor/processor.test.ts +1 -1
- package/src/processor/processor.ts +15 -15
- package/src/testing/test-generator.test.ts +41 -52
- package/src/testing/test-generator.ts +174 -189
- package/src/testing/test-sequence.ts +3 -3
- package/src/testing/trace-timeline.conversations.json +1 -1
- package/src/testing/trace-timeline.test.ts +3 -5
- package/src/testing.ts +7 -0
- package/src/translations.ts +5 -2
- package/src/types/Assistant.ts +2 -1
- package/src/types/AssistantCapabilities.ts +35 -0
- package/src/types/AssistantEvents.ts +11 -0
- package/src/{operations/definitions.ts → types/AssistantOperation.ts} +15 -0
- package/src/types/Settings.ts +6 -0
- package/src/types/index.ts +5 -2
- package/src/util/suggestions.test.ts +52 -0
- package/src/util/suggestions.ts +42 -0
- package/dist/lib/browser/blueprints/index.mjs.map +0 -7
- package/dist/lib/browser/chunk-DVOOFAWU.mjs +0 -175
- package/dist/lib/browser/chunk-DVOOFAWU.mjs.map +0 -7
- package/dist/lib/browser/chunk-M55MBYG7.mjs.map +0 -7
- package/dist/lib/browser/chunk-SEMCG4ZK.mjs +0 -195
- package/dist/lib/browser/chunk-SEMCG4ZK.mjs.map +0 -7
- package/dist/lib/browser/chunk-VK53MITK.mjs.map +0 -7
- package/dist/lib/browser/cli/index.mjs +0 -73
- package/dist/lib/browser/cli/index.mjs.map +0 -7
- package/dist/lib/browser/components/index.mjs +0 -20
- package/dist/lib/browser/create-chat-E2ZLVTLP.mjs.map +0 -7
- package/dist/lib/browser/ensure-companion-chat-7GDMXSQW.mjs.map +0 -7
- package/dist/lib/browser/hooks/index.mjs +0 -39
- package/dist/lib/browser/index.mjs +0 -84
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/on-create-space-4J3KTNAJ.mjs.map +0 -7
- package/dist/lib/browser/operations/index.mjs +0 -13
- package/dist/lib/browser/operations/index.mjs.map +0 -7
- package/dist/lib/browser/resolve-navigation-targets-3ZPQE6SZ.mjs.map +0 -7
- package/dist/lib/browser/run-prompt-in-new-chat-AA3KPBDN.mjs.map +0 -7
- package/dist/lib/browser/set-current-chat-P4VHI3YF.mjs.map +0 -7
- package/dist/lib/browser/translations.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -18
- package/dist/lib/browser/update-chat-name-VWKNUON7.mjs.map +0 -7
- package/dist/lib/node-esm/AssistantSettings-23A5IMHS.mjs +0 -41
- package/dist/lib/node-esm/AssistantSettings-23A5IMHS.mjs.map +0 -7
- package/dist/lib/node-esm/blueprints/index.mjs +0 -32
- package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FWC3ZGPH.mjs +0 -933
- package/dist/lib/node-esm/chunk-FWC3ZGPH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-JKEB3NFZ.mjs +0 -2302
- package/dist/lib/node-esm/chunk-JKEB3NFZ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MBDVPB4V.mjs +0 -176
- package/dist/lib/node-esm/chunk-MBDVPB4V.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XAFVSEUJ.mjs +0 -196
- package/dist/lib/node-esm/chunk-XAFVSEUJ.mjs.map +0 -7
- package/dist/lib/node-esm/cli/index.mjs +0 -74
- package/dist/lib/node-esm/cli/index.mjs.map +0 -7
- package/dist/lib/node-esm/components/index.mjs +0 -21
- package/dist/lib/node-esm/create-chat-UQQ3542N.mjs +0 -74
- package/dist/lib/node-esm/create-chat-UQQ3542N.mjs.map +0 -7
- package/dist/lib/node-esm/ensure-companion-chat-LVCPD4DJ.mjs +0 -66
- package/dist/lib/node-esm/ensure-companion-chat-LVCPD4DJ.mjs.map +0 -7
- package/dist/lib/node-esm/hooks/index.mjs +0 -40
- package/dist/lib/node-esm/index.mjs +0 -85
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/on-create-space-M63UBTTT.mjs +0 -23
- package/dist/lib/node-esm/on-create-space-M63UBTTT.mjs.map +0 -7
- package/dist/lib/node-esm/operations/index.mjs +0 -14
- package/dist/lib/node-esm/operations/index.mjs.map +0 -7
- package/dist/lib/node-esm/resolve-navigation-targets-HO77CAFT.mjs +0 -23
- package/dist/lib/node-esm/resolve-navigation-targets-HO77CAFT.mjs.map +0 -7
- package/dist/lib/node-esm/run-prompt-in-new-chat-RIRYYYPK.mjs +0 -107
- package/dist/lib/node-esm/run-prompt-in-new-chat-RIRYYYPK.mjs.map +0 -7
- package/dist/lib/node-esm/set-current-chat-Z7GJ52VX.mjs +0 -55
- package/dist/lib/node-esm/set-current-chat-Z7GJ52VX.mjs.map +0 -7
- package/dist/lib/node-esm/translations.mjs +0 -173
- package/dist/lib/node-esm/translations.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -19
- package/dist/lib/node-esm/update-chat-name-GV4HX32Z.mjs +0 -57
- package/dist/lib/node-esm/update-chat-name-GV4HX32Z.mjs.map +0 -7
- package/dist/types/src/cli/index.d.ts +0 -2
- package/dist/types/src/cli/index.d.ts.map +0 -1
- package/dist/types/src/cli/plugin.d.ts +0 -10
- package/dist/types/src/cli/plugin.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/index.d.ts +0 -2
- package/dist/types/src/containers/ChatContainer/index.d.ts.map +0 -1
- package/dist/types/src/operations/definitions.d.ts.map +0 -1
- package/dist/types/src/queue-logger.d.ts +0 -11
- package/dist/types/src/queue-logger.d.ts.map +0 -1
- package/dist/types/src/types/capabilities.d.ts +0 -32
- package/dist/types/src/types/capabilities.d.ts.map +0 -1
- package/dist/types/src/types/events.d.ts +0 -5
- package/dist/types/src/types/events.d.ts.map +0 -1
- package/src/AssistantPlugin.tsx +0 -238
- package/src/cli/plugin.ts +0 -83
- package/src/containers/ChatContainer/index.ts +0 -5
- package/src/types/capabilities.ts +0 -35
- package/src/types/events.ts +0 -11
- /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/AssistantPlugin.mjs.map} +0 -0
- /package/dist/lib/{browser → neutral}/AssistantSettings-GG52BLKS.mjs +0 -0
- /package/dist/lib/{browser → neutral}/AssistantSettings-GG52BLKS.mjs.map +0 -0
- /package/dist/lib/{browser/components/index.mjs.map → neutral/ChatArticle-WVAFZPVI.mjs.map} +0 -0
- /package/dist/lib/{browser/hooks → neutral/blueprints}/index.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
- /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/components → neutral}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/meta.mjs.map} +0 -0
- /package/dist/lib/{node-esm/hooks → neutral/operations}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/types/index.mjs.map → neutral/testing.mjs.map} +0 -0
|
@@ -4,9 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, test } from 'vitest';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { AgentRequestBegin, AgentRequestEnd, CompleteBlock } from '@dxos/assistant';
|
|
8
|
+
import { Trace } from '@dxos/compute';
|
|
9
|
+
import { Obj } from '@dxos/echo';
|
|
10
|
+
import { ObjectId } from '@dxos/keys';
|
|
11
|
+
import { type Commit, renderTimelineAscii } from '@dxos/react-ui-components';
|
|
8
12
|
|
|
9
|
-
import { CommitSelector } from './execution-graph';
|
|
13
|
+
import { CommitSelector, buildExecutionGraph } from './execution-graph';
|
|
14
|
+
|
|
15
|
+
ObjectId.dangerouslyDisableRandomness();
|
|
10
16
|
|
|
11
17
|
const makeCommit = (id: string, opts: Partial<Commit> = {}): Commit => ({
|
|
12
18
|
id,
|
|
@@ -17,6 +23,23 @@ const makeCommit = (id: string, opts: Partial<Commit> = {}): Commit => ({
|
|
|
17
23
|
|
|
18
24
|
const ids = (commits: Commit[]) => commits.map((commit) => commit.id);
|
|
19
25
|
|
|
26
|
+
const makeMessage = (
|
|
27
|
+
meta: Trace.Meta,
|
|
28
|
+
events: Array<{ type: string; timestamp: number; data?: unknown }>,
|
|
29
|
+
isEphemeral = false,
|
|
30
|
+
): Trace.Message =>
|
|
31
|
+
Obj.make(Trace.Message, {
|
|
32
|
+
meta,
|
|
33
|
+
isEphemeral,
|
|
34
|
+
events: events.map((event) => ({
|
|
35
|
+
type: event.type,
|
|
36
|
+
timestamp: event.timestamp,
|
|
37
|
+
data: event.data ?? {},
|
|
38
|
+
})),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const textBlock = (text: string) => ({ _tag: 'text' as const, text, pending: false });
|
|
42
|
+
|
|
20
43
|
describe('CommitSelector', () => {
|
|
21
44
|
describe('make', () => {
|
|
22
45
|
test('wraps a select function', ({ expect }) => {
|
|
@@ -62,14 +85,6 @@ describe('CommitSelector', () => {
|
|
|
62
85
|
const a = makeCommit('a');
|
|
63
86
|
expect(CommitSelector.filter(() => false).select([a])).toEqual([]);
|
|
64
87
|
});
|
|
65
|
-
|
|
66
|
-
test('coerces predicate return values', ({ expect }) => {
|
|
67
|
-
const a = makeCommit('a', { tags: ['x'] });
|
|
68
|
-
const b = makeCommit('b');
|
|
69
|
-
// `unknown` truthy/falsy values are accepted.
|
|
70
|
-
const selector = CommitSelector.filter((commit) => commit.tags?.length);
|
|
71
|
-
expect(selector.select([a, b])).toEqual([a]);
|
|
72
|
-
});
|
|
73
88
|
});
|
|
74
89
|
|
|
75
90
|
describe('id', () => {
|
|
@@ -82,10 +97,6 @@ describe('CommitSelector', () => {
|
|
|
82
97
|
test('returns empty when id is missing', ({ expect }) => {
|
|
83
98
|
expect(CommitSelector.id('missing').select([makeCommit('a')])).toEqual([]);
|
|
84
99
|
});
|
|
85
|
-
|
|
86
|
-
test('returns empty for empty input', ({ expect }) => {
|
|
87
|
-
expect(CommitSelector.id('a').select([])).toEqual([]);
|
|
88
|
-
});
|
|
89
100
|
});
|
|
90
101
|
|
|
91
102
|
describe('tag', () => {
|
|
@@ -95,11 +106,6 @@ describe('CommitSelector', () => {
|
|
|
95
106
|
expect(CommitSelector.tag('x').select([a, b])).toEqual([a]);
|
|
96
107
|
});
|
|
97
108
|
|
|
98
|
-
test('matches commits with multiple tags', ({ expect }) => {
|
|
99
|
-
const a = makeCommit('a', { tags: ['x', 'y'] });
|
|
100
|
-
expect(CommitSelector.tag('y').select([a])).toEqual([a]);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
109
|
test('returns empty for falsy tag (undefined / null / false)', ({ expect }) => {
|
|
104
110
|
const a = makeCommit('a', { tags: ['x'] });
|
|
105
111
|
expect(CommitSelector.tag(undefined).select([a])).toEqual([]);
|
|
@@ -112,39 +118,12 @@ describe('CommitSelector', () => {
|
|
|
112
118
|
});
|
|
113
119
|
});
|
|
114
120
|
|
|
115
|
-
describe('anyTags', () => {
|
|
116
|
-
test('matches commits if any tag is present', ({ expect }) => {
|
|
117
|
-
const a = makeCommit('a', { tags: ['x'] });
|
|
118
|
-
const b = makeCommit('b', { tags: ['y'] });
|
|
119
|
-
const c = makeCommit('c', { tags: ['z'] });
|
|
120
|
-
expect(CommitSelector.anyTags(['x', 'y']).select([a, b, c])).toEqual([a, b]);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test('ignores falsy tags in the input list', ({ expect }) => {
|
|
124
|
-
const a = makeCommit('a', { tags: ['x'] });
|
|
125
|
-
expect(CommitSelector.anyTags([null, undefined, false, 'x']).select([a])).toEqual([a]);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test('returns empty when all tags are falsy', ({ expect }) => {
|
|
129
|
-
const a = makeCommit('a', { tags: ['x'] });
|
|
130
|
-
expect(CommitSelector.anyTags([null, undefined, false]).select([a])).toEqual([]);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test('returns empty when no commit carries any of the tags', ({ expect }) => {
|
|
134
|
-
expect(CommitSelector.anyTags(['x']).select([makeCommit('a')])).toEqual([]);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
121
|
describe('branch', () => {
|
|
139
122
|
test('matches commits by branch', ({ expect }) => {
|
|
140
123
|
const a = makeCommit('a', { branch: 'main' });
|
|
141
124
|
const b = makeCommit('b', { branch: 'feature' });
|
|
142
125
|
expect(CommitSelector.branch('feature').select([a, b])).toEqual([b]);
|
|
143
126
|
});
|
|
144
|
-
|
|
145
|
-
test('returns empty when no commit is on the branch', ({ expect }) => {
|
|
146
|
-
expect(CommitSelector.branch('feature').select([makeCommit('a', { branch: 'main' })])).toEqual([]);
|
|
147
|
-
});
|
|
148
127
|
});
|
|
149
128
|
|
|
150
129
|
describe('compose', () => {
|
|
@@ -155,17 +134,6 @@ describe('CommitSelector', () => {
|
|
|
155
134
|
const selector = CommitSelector.branch('main').pipe(CommitSelector.compose(CommitSelector.tag('keep')));
|
|
156
135
|
expect(selector.select([a, b, c])).toEqual([a]);
|
|
157
136
|
});
|
|
158
|
-
|
|
159
|
-
test('multiple composes chain left-to-right', ({ expect }) => {
|
|
160
|
-
const a = makeCommit('a', { branch: 'main', tags: ['x'] });
|
|
161
|
-
const b = makeCommit('b', { branch: 'main', tags: ['y'] });
|
|
162
|
-
const c = makeCommit('c', { branch: 'main', tags: ['x'] });
|
|
163
|
-
const selector = CommitSelector.branch('main').pipe(
|
|
164
|
-
CommitSelector.compose(CommitSelector.tag('x')),
|
|
165
|
-
CommitSelector.compose(CommitSelector.first()),
|
|
166
|
-
);
|
|
167
|
-
expect(selector.select([a, b, c])).toEqual([a]);
|
|
168
|
-
});
|
|
169
137
|
});
|
|
170
138
|
|
|
171
139
|
describe('orElse', () => {
|
|
@@ -181,50 +149,6 @@ describe('CommitSelector', () => {
|
|
|
181
149
|
const selector = CommitSelector.branch('main').pipe(CommitSelector.orElse(CommitSelector.branch('feature')));
|
|
182
150
|
expect(selector.select([b])).toEqual([b]);
|
|
183
151
|
});
|
|
184
|
-
|
|
185
|
-
test('returns empty when both prev and next are empty', ({ expect }) => {
|
|
186
|
-
const z = makeCommit('z', { branch: 'other' });
|
|
187
|
-
const selector = CommitSelector.branch('main').pipe(CommitSelector.orElse(CommitSelector.branch('feature')));
|
|
188
|
-
expect(selector.select([z])).toEqual([]);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
describe('andAlso', () => {
|
|
193
|
-
test('returns the union of prev and next', ({ expect }) => {
|
|
194
|
-
const a = makeCommit('a', { branch: 'main' });
|
|
195
|
-
const b = makeCommit('b', { branch: 'feature' });
|
|
196
|
-
const selector = CommitSelector.branch('main').pipe(CommitSelector.andAlso(CommitSelector.branch('feature')));
|
|
197
|
-
expect(ids(selector.select([a, b])).toSorted()).toEqual(['a', 'b']);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
test('dedupes by id', ({ expect }) => {
|
|
201
|
-
const a = makeCommit('a', { branch: 'main', tags: ['x'] });
|
|
202
|
-
const selector = CommitSelector.branch('main').pipe(CommitSelector.andAlso(CommitSelector.tag('x')));
|
|
203
|
-
expect(selector.select([a])).toHaveLength(1);
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
describe('first', () => {
|
|
208
|
-
test('returns first n commits, defaulting to 1', ({ expect }) => {
|
|
209
|
-
const a = makeCommit('a');
|
|
210
|
-
const b = makeCommit('b');
|
|
211
|
-
const c = makeCommit('c');
|
|
212
|
-
expect(CommitSelector.first().select([a, b, c])).toEqual([a]);
|
|
213
|
-
expect(CommitSelector.first(2).select([a, b, c])).toEqual([a, b]);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
test('returns all when n exceeds length', ({ expect }) => {
|
|
217
|
-
const a = makeCommit('a');
|
|
218
|
-
expect(CommitSelector.first(5).select([a])).toEqual([a]);
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
test('returns empty when n=0', ({ expect }) => {
|
|
222
|
-
expect(CommitSelector.first(0).select([makeCommit('a')])).toEqual([]);
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
test('returns empty for empty input', ({ expect }) => {
|
|
226
|
-
expect(CommitSelector.first().select([])).toEqual([]);
|
|
227
|
-
});
|
|
228
152
|
});
|
|
229
153
|
|
|
230
154
|
describe('last', () => {
|
|
@@ -232,34 +156,10 @@ describe('CommitSelector', () => {
|
|
|
232
156
|
const a = makeCommit('a');
|
|
233
157
|
const b = makeCommit('b');
|
|
234
158
|
const c = makeCommit('c');
|
|
235
|
-
|
|
236
|
-
expect(ids(result)).toEqual(['c']);
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test('returns last n commits', ({ expect }) => {
|
|
240
|
-
const a = makeCommit('a');
|
|
241
|
-
const b = makeCommit('b');
|
|
242
|
-
const c = makeCommit('c');
|
|
243
|
-
const result = CommitSelector.last(2).select([a, b, c]);
|
|
244
|
-
expect(ids(result).toSorted()).toEqual(['b', 'c']);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
test('returns all when n exceeds length', ({ expect }) => {
|
|
248
|
-
const a = makeCommit('a');
|
|
249
|
-
const result = CommitSelector.last(5).select([a]);
|
|
250
|
-
expect(ids(result)).toEqual(['a']);
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
test('returns empty when n=0', ({ expect }) => {
|
|
254
|
-
expect(CommitSelector.last(0).select([makeCommit('a')])).toEqual([]);
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
test('returns empty for empty input', ({ expect }) => {
|
|
258
|
-
expect(CommitSelector.last().select([])).toEqual([]);
|
|
159
|
+
expect(ids(CommitSelector.last().select([a, b, c]))).toEqual(['c']);
|
|
259
160
|
});
|
|
260
161
|
|
|
261
162
|
test('produces the most recent commit on a branch when composed', ({ expect }) => {
|
|
262
|
-
// Common usage pattern in execution-graph: pick the most recent commit on a branch.
|
|
263
163
|
const a = makeCommit('a', { branch: 'main' });
|
|
264
164
|
const b = makeCommit('b', { branch: 'main' });
|
|
265
165
|
const c = makeCommit('c', { branch: 'main' });
|
|
@@ -268,25 +168,6 @@ describe('CommitSelector', () => {
|
|
|
268
168
|
});
|
|
269
169
|
});
|
|
270
170
|
|
|
271
|
-
describe('not', () => {
|
|
272
|
-
test('inverts the selection', ({ expect }) => {
|
|
273
|
-
const a = makeCommit('a', { tags: ['x'] });
|
|
274
|
-
const b = makeCommit('b');
|
|
275
|
-
expect(CommitSelector.not(CommitSelector.tag('x')).select([a, b])).toEqual([b]);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
test('returns all when inner selector matches nothing', ({ expect }) => {
|
|
279
|
-
const a = makeCommit('a');
|
|
280
|
-
expect(CommitSelector.not(CommitSelector.id('missing')).select([a])).toEqual([a]);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
test('returns empty when inner selector matches everything', ({ expect }) => {
|
|
284
|
-
const a = makeCommit('a');
|
|
285
|
-
const b = makeCommit('b');
|
|
286
|
-
expect(CommitSelector.not(CommitSelector.identity()).select([a, b])).toEqual([]);
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
|
|
290
171
|
describe('unionAll', () => {
|
|
291
172
|
test('combines results from multiple selectors', ({ expect }) => {
|
|
292
173
|
const a = makeCommit('a', { branch: 'main' });
|
|
@@ -300,83 +181,207 @@ describe('CommitSelector', () => {
|
|
|
300
181
|
const selector = CommitSelector.unionAll(CommitSelector.branch('main'), CommitSelector.tag('x'));
|
|
301
182
|
expect(selector.select([a])).toHaveLength(1);
|
|
302
183
|
});
|
|
303
|
-
|
|
304
|
-
test('returns empty when called with no selectors', ({ expect }) => {
|
|
305
|
-
expect(CommitSelector.unionAll().select([makeCommit('a')])).toEqual([]);
|
|
306
|
-
});
|
|
307
184
|
});
|
|
185
|
+
});
|
|
308
186
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
const selector = CommitSelector.intersectAll(CommitSelector.branch('main'), CommitSelector.tag('x'));
|
|
315
|
-
expect(selector.select([a, b, c])).toEqual([a]);
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
test('returns empty when called with no selectors', ({ expect }) => {
|
|
319
|
-
expect(CommitSelector.intersectAll().select([makeCommit('a')])).toEqual([]);
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
test('returns empty when no commit matches all selectors', ({ expect }) => {
|
|
323
|
-
const a = makeCommit('a', { branch: 'main' });
|
|
324
|
-
const selector = CommitSelector.intersectAll(CommitSelector.branch('main'), CommitSelector.tag('x'));
|
|
325
|
-
expect(selector.select([a])).toEqual([]);
|
|
326
|
-
});
|
|
187
|
+
describe('buildExecutionGraph (span-tree based)', () => {
|
|
188
|
+
test('empty input → no commits', ({ expect }) => {
|
|
189
|
+
const { commits, branches } = buildExecutionGraph({ traceMessages: [] });
|
|
190
|
+
expect(commits).toEqual([]);
|
|
191
|
+
expect(branches).toEqual(['main']);
|
|
327
192
|
});
|
|
328
193
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
194
|
+
test('top-level operation with no inner events → collapsed to single end commit on main', ({ expect }) => {
|
|
195
|
+
const { commits, branches } = buildExecutionGraph({
|
|
196
|
+
traceMessages: [
|
|
197
|
+
makeMessage({ pid: 'op-1' }, [
|
|
198
|
+
{
|
|
199
|
+
type: Trace.OperationStart.key,
|
|
200
|
+
timestamp: 1,
|
|
201
|
+
data: { key: 'reply', name: 'Reply' },
|
|
202
|
+
},
|
|
203
|
+
]),
|
|
204
|
+
makeMessage({ pid: 'op-1' }, [
|
|
205
|
+
{
|
|
206
|
+
type: Trace.OperationEnd.key,
|
|
207
|
+
timestamp: 2,
|
|
208
|
+
data: { key: 'reply', name: 'Reply', outcome: 'success' as const },
|
|
209
|
+
},
|
|
210
|
+
]),
|
|
211
|
+
],
|
|
212
|
+
});
|
|
213
|
+
expect(branches).toEqual(['main']);
|
|
214
|
+
expect(commits).toHaveLength(1);
|
|
215
|
+
expect(commits[0].branch).toBe('main');
|
|
216
|
+
expect(`\n${renderTimelineAscii(commits, branches)}\n`).toMatchInlineSnapshot(`
|
|
217
|
+
"
|
|
218
|
+
● [function] Reply - Success
|
|
219
|
+
"
|
|
220
|
+
`);
|
|
221
|
+
});
|
|
340
222
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
223
|
+
test('nested operation under an agent → collapsed to a single end commit', ({ expect }) => {
|
|
224
|
+
const { commits, branches } = buildExecutionGraph({
|
|
225
|
+
traceMessages: [
|
|
226
|
+
// Agent begin.
|
|
227
|
+
makeMessage({ pid: 'agent-1' }, [{ type: AgentRequestBegin.key, timestamp: 1, data: {} }]),
|
|
228
|
+
// User message inside the agent.
|
|
229
|
+
makeMessage({ pid: 'agent-1' }, [
|
|
230
|
+
{
|
|
231
|
+
type: CompleteBlock.key,
|
|
232
|
+
timestamp: 2,
|
|
233
|
+
data: { messageId: '01HQ0000000000000000000000', role: 'user', block: textBlock('hello') },
|
|
234
|
+
},
|
|
235
|
+
]),
|
|
236
|
+
// Nested operation start + end.
|
|
237
|
+
makeMessage({ pid: 'op-1', parentPid: 'agent-1' }, [
|
|
238
|
+
{ type: Trace.OperationStart.key, timestamp: 3, data: { key: 'lookup', name: 'Lookup' } },
|
|
239
|
+
]),
|
|
240
|
+
makeMessage({ pid: 'op-1', parentPid: 'agent-1' }, [
|
|
241
|
+
{
|
|
242
|
+
type: Trace.OperationEnd.key,
|
|
243
|
+
timestamp: 4,
|
|
244
|
+
data: { key: 'lookup', name: 'Lookup', outcome: 'success' as const },
|
|
245
|
+
},
|
|
246
|
+
]),
|
|
247
|
+
// Agent end.
|
|
248
|
+
makeMessage({ pid: 'agent-1' }, [{ type: AgentRequestEnd.key, timestamp: 5, data: {} }]),
|
|
249
|
+
],
|
|
250
|
+
});
|
|
251
|
+
expect(branches).toEqual(['main', 'agent-1']);
|
|
252
|
+
expect(`\n${renderTimelineAscii(commits, branches)}\n`).toMatchInlineSnapshot(`
|
|
253
|
+
"
|
|
254
|
+
● [atom] Agent processing request...
|
|
255
|
+
├──● [user] hello
|
|
256
|
+
│ ● [function] Lookup - Success
|
|
257
|
+
◆──╯ [atom] Agent completed request
|
|
258
|
+
"
|
|
259
|
+
`);
|
|
260
|
+
});
|
|
345
261
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
262
|
+
test('nested operation with its own inner status message → expanded fork/merge', ({ expect }) => {
|
|
263
|
+
const { commits, branches } = buildExecutionGraph({
|
|
264
|
+
traceMessages: [
|
|
265
|
+
makeMessage({ pid: 'op-1' }, [
|
|
266
|
+
{ type: Trace.OperationStart.key, timestamp: 1, data: { key: 'work', name: 'Work' } },
|
|
267
|
+
]),
|
|
268
|
+
makeMessage({ pid: 'op-1' }, [
|
|
269
|
+
{
|
|
270
|
+
type: CompleteBlock.key,
|
|
271
|
+
timestamp: 2,
|
|
272
|
+
data: {
|
|
273
|
+
messageId: '01HQ0000000000000000000000',
|
|
274
|
+
role: 'assistant',
|
|
275
|
+
block: { _tag: 'status', statusText: 'thinking', pending: false },
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
]),
|
|
279
|
+
makeMessage({ pid: 'op-1' }, [
|
|
280
|
+
{
|
|
281
|
+
type: Trace.OperationEnd.key,
|
|
282
|
+
timestamp: 3,
|
|
283
|
+
data: { key: 'work', name: 'Work', outcome: 'success' as const },
|
|
284
|
+
},
|
|
285
|
+
]),
|
|
286
|
+
],
|
|
287
|
+
});
|
|
288
|
+
// Three commits: begin on main, status on op-1 branch, end on main as merge.
|
|
289
|
+
expect(commits).toHaveLength(3);
|
|
290
|
+
expect(commits[0].branch).toBe('main');
|
|
291
|
+
expect(commits[1].branch).toBe('op-1');
|
|
292
|
+
expect(commits[2].branch).toBe('main');
|
|
293
|
+
expect(commits[2].parents?.length).toBe(2);
|
|
349
294
|
});
|
|
350
295
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
296
|
+
test('pending span with user message → user lands on own branch, not parent', ({ expect }) => {
|
|
297
|
+
const { commits, branches } = buildExecutionGraph({
|
|
298
|
+
traceMessages: [
|
|
299
|
+
// Agent has begun and emitted a user message, but has NOT yet completed.
|
|
300
|
+
makeMessage({ pid: 'agent-1' }, [{ type: AgentRequestBegin.key, timestamp: 1, data: {} }]),
|
|
301
|
+
makeMessage({ pid: 'agent-1' }, [
|
|
302
|
+
{
|
|
303
|
+
type: CompleteBlock.key,
|
|
304
|
+
timestamp: 2,
|
|
305
|
+
data: { messageId: '01HQ0000000000000000000000', role: 'user', block: textBlock('hello') },
|
|
306
|
+
},
|
|
307
|
+
]),
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
// Two commits: AgentBegin on main (fork), user "hello" on agent-1 branch (middle).
|
|
311
|
+
// No end commit yet — the span is pending.
|
|
312
|
+
expect(commits).toHaveLength(2);
|
|
313
|
+
expect(commits[0].branch).toBe('main');
|
|
314
|
+
expect(commits[0].message).toBe('Agent processing request...');
|
|
315
|
+
expect(commits[1].branch).toBe('agent-1');
|
|
316
|
+
expect(commits[1].message).toBe('hello');
|
|
317
|
+
expect(`\n${renderTimelineAscii(commits, branches)}\n`).toMatchInlineSnapshot(`
|
|
318
|
+
"
|
|
319
|
+
● [atom] Agent processing request...
|
|
320
|
+
├──● [user] hello
|
|
321
|
+
"
|
|
322
|
+
`);
|
|
323
|
+
});
|
|
362
324
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
325
|
+
test('pending span with collapsed sub-span then user message → user on own branch', ({ expect }) => {
|
|
326
|
+
const { commits, branches } = buildExecutionGraph({
|
|
327
|
+
traceMessages: [
|
|
328
|
+
makeMessage({ pid: 'agent-1' }, [{ type: AgentRequestBegin.key, timestamp: 1, data: {} }]),
|
|
329
|
+
// Sub-span completes (will be collapsed).
|
|
330
|
+
makeMessage({ pid: 'op-1', parentPid: 'agent-1' }, [
|
|
331
|
+
{ type: Trace.OperationStart.key, timestamp: 2, data: { key: 'lookup', name: 'Lookup' } },
|
|
332
|
+
{
|
|
333
|
+
type: Trace.OperationEnd.key,
|
|
334
|
+
timestamp: 3,
|
|
335
|
+
data: { key: 'lookup', name: 'Lookup', outcome: 'success' as const },
|
|
336
|
+
},
|
|
337
|
+
]),
|
|
338
|
+
// User message arrives after the sub-span; agent is still pending.
|
|
339
|
+
makeMessage({ pid: 'agent-1' }, [
|
|
340
|
+
{
|
|
341
|
+
type: CompleteBlock.key,
|
|
342
|
+
timestamp: 4,
|
|
343
|
+
data: { messageId: '01HQ0000000000000000000001', role: 'user', block: textBlock('hello') },
|
|
344
|
+
},
|
|
345
|
+
]),
|
|
346
|
+
],
|
|
347
|
+
});
|
|
348
|
+
// AgentBegin on main, Lookup-Success on agent branch, user "hello" on agent branch.
|
|
349
|
+
expect(commits).toHaveLength(3);
|
|
350
|
+
expect(commits[0].branch).toBe('main');
|
|
351
|
+
expect(commits[1].branch).toBe('agent-1');
|
|
352
|
+
expect(commits[2].branch).toBe('agent-1');
|
|
353
|
+
expect(commits[2].message).toBe('hello');
|
|
354
|
+
});
|
|
370
355
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
356
|
+
test('orders sub-spans chronologically under their parent', ({ expect }) => {
|
|
357
|
+
const { commits } = buildExecutionGraph({
|
|
358
|
+
traceMessages: [
|
|
359
|
+
makeMessage({ pid: 'agent-1' }, [{ type: AgentRequestBegin.key, timestamp: 1, data: {} }]),
|
|
360
|
+
makeMessage({ pid: 'op-1', parentPid: 'agent-1' }, [
|
|
361
|
+
{ type: Trace.OperationStart.key, timestamp: 2, data: { key: 'a', name: 'A' } },
|
|
362
|
+
{
|
|
363
|
+
type: Trace.OperationEnd.key,
|
|
364
|
+
timestamp: 3,
|
|
365
|
+
data: { key: 'a', name: 'A', outcome: 'success' as const },
|
|
366
|
+
},
|
|
367
|
+
]),
|
|
368
|
+
makeMessage({ pid: 'op-2', parentPid: 'agent-1' }, [
|
|
369
|
+
{ type: Trace.OperationStart.key, timestamp: 4, data: { key: 'b', name: 'B' } },
|
|
370
|
+
{
|
|
371
|
+
type: Trace.OperationEnd.key,
|
|
372
|
+
timestamp: 5,
|
|
373
|
+
data: { key: 'b', name: 'B', outcome: 'success' as const },
|
|
374
|
+
},
|
|
375
|
+
]),
|
|
376
|
+
makeMessage({ pid: 'agent-1' }, [{ type: AgentRequestEnd.key, timestamp: 6, data: {} }]),
|
|
377
|
+
],
|
|
378
|
+
});
|
|
379
|
+
// After collapsing, expect: AgentBegin, Op1.End, Op2.End, AgentEnd → 4 commits.
|
|
380
|
+
expect(commits.map((commit) => commit.message)).toEqual([
|
|
381
|
+
'Agent processing request...',
|
|
382
|
+
'A - Success',
|
|
383
|
+
'B - Success',
|
|
384
|
+
'Agent completed request',
|
|
385
|
+
]);
|
|
381
386
|
});
|
|
382
387
|
});
|