@orion-agents/orion-code 0.1.2 → 0.1.4-2
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/README.md +98 -4
- package/README.zh-CN.md +116 -5
- package/dist/agents/coder.d.ts.map +1 -1
- package/dist/agents/coder.js.map +1 -1
- package/dist/agents/fork.d.ts +12 -4
- package/dist/agents/fork.d.ts.map +1 -1
- package/dist/agents/fork.js +28 -32
- package/dist/agents/fork.js.map +1 -1
- package/dist/agents/leader.d.ts.map +1 -1
- package/dist/agents/leader.js.map +1 -1
- package/dist/agents/worker-pool.d.ts.map +1 -1
- package/dist/agents/worker-pool.js +38 -29
- package/dist/agents/worker-pool.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/context-commands.d.ts +4 -0
- package/dist/commands/context-commands.d.ts.map +1 -0
- package/dist/commands/context-commands.js +52 -0
- package/dist/commands/context-commands.js.map +1 -0
- package/dist/commands/context-tool-command-handlers.d.ts +13 -0
- package/dist/commands/context-tool-command-handlers.d.ts.map +1 -0
- package/dist/commands/context-tool-command-handlers.js +573 -0
- package/dist/commands/context-tool-command-handlers.js.map +1 -0
- package/dist/commands/core-command-handlers.d.ts +12 -0
- package/dist/commands/core-command-handlers.d.ts.map +1 -0
- package/dist/commands/core-command-handlers.js +798 -0
- package/dist/commands/core-command-handlers.js.map +1 -0
- package/dist/commands/diagnostic-command-handlers.d.ts +14 -0
- package/dist/commands/diagnostic-command-handlers.d.ts.map +1 -0
- package/dist/commands/diagnostic-command-handlers.js +1043 -0
- package/dist/commands/diagnostic-command-handlers.js.map +1 -0
- package/dist/commands/diagnostic-commands.d.ts +4 -0
- package/dist/commands/diagnostic-commands.d.ts.map +1 -0
- package/dist/commands/diagnostic-commands.js +132 -0
- package/dist/commands/diagnostic-commands.js.map +1 -0
- package/dist/commands/index.d.ts +7 -8
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +34 -3448
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/legacy-commands.d.ts +4 -0
- package/dist/commands/legacy-commands.d.ts.map +1 -0
- package/dist/commands/legacy-commands.js +44 -0
- package/dist/commands/legacy-commands.js.map +1 -0
- package/dist/commands/model-command-handlers.d.ts +13 -0
- package/dist/commands/model-command-handlers.d.ts.map +1 -0
- package/dist/commands/model-command-handlers.js +314 -0
- package/dist/commands/model-command-handlers.js.map +1 -0
- package/dist/commands/model-commands.d.ts +4 -0
- package/dist/commands/model-commands.d.ts.map +1 -0
- package/dist/commands/model-commands.js +52 -0
- package/dist/commands/model-commands.js.map +1 -0
- package/dist/commands/session-command-handlers.d.ts +9 -0
- package/dist/commands/session-command-handlers.d.ts.map +1 -0
- package/dist/commands/session-command-handlers.js +566 -0
- package/dist/commands/session-command-handlers.js.map +1 -0
- package/dist/commands/session-commands.d.ts +4 -0
- package/dist/commands/session-commands.d.ts.map +1 -0
- package/dist/commands/session-commands.js +78 -0
- package/dist/commands/session-commands.js.map +1 -0
- package/dist/commands/system-commands.d.ts +4 -0
- package/dist/commands/system-commands.d.ts.map +1 -0
- package/dist/commands/system-commands.js +92 -0
- package/dist/commands/system-commands.js.map +1 -0
- package/dist/commands/target-command.d.ts.map +1 -1
- package/dist/commands/target-command.js +29 -2
- package/dist/commands/target-command.js.map +1 -1
- package/dist/commands/tool-commands.d.ts +4 -0
- package/dist/commands/tool-commands.d.ts.map +1 -0
- package/dist/commands/tool-commands.js +49 -0
- package/dist/commands/tool-commands.js.map +1 -0
- package/dist/commands/types.d.ts +7 -5
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/commands/workflow-command-handlers.d.ts +7 -0
- package/dist/commands/workflow-command-handlers.d.ts.map +1 -0
- package/dist/commands/workflow-command-handlers.js +35 -0
- package/dist/commands/workflow-command-handlers.js.map +1 -0
- package/dist/commands/workflow-commands.d.ts +4 -0
- package/dist/commands/workflow-commands.d.ts.map +1 -0
- package/dist/commands/workflow-commands.js +92 -0
- package/dist/commands/workflow-commands.js.map +1 -0
- package/dist/core/checkpoint.d.ts +12 -4
- package/dist/core/checkpoint.d.ts.map +1 -1
- package/dist/core/checkpoint.js +114 -28
- package/dist/core/checkpoint.js.map +1 -1
- package/dist/core/cost-tracker.d.ts +5 -1
- package/dist/core/cost-tracker.d.ts.map +1 -1
- package/dist/core/cost-tracker.js +12 -2
- package/dist/core/cost-tracker.js.map +1 -1
- package/dist/core/warn-dedup.d.ts +3 -0
- package/dist/core/warn-dedup.d.ts.map +1 -1
- package/dist/core/warn-dedup.js +6 -6
- package/dist/core/warn-dedup.js.map +1 -1
- package/dist/framework/index.d.ts +1 -1
- package/dist/framework/index.d.ts.map +1 -1
- package/dist/framework/index.js.map +1 -1
- package/dist/framework/prompt.d.ts +2 -2
- package/dist/framework/query.d.ts +5 -2
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +58 -10
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/store.d.ts +4 -4
- package/dist/framework/tool-scheduler.d.ts +67 -4
- package/dist/framework/tool-scheduler.d.ts.map +1 -1
- package/dist/framework/tool-scheduler.js +271 -50
- package/dist/framework/tool-scheduler.js.map +1 -1
- package/dist/framework/tool.d.ts +36 -2
- package/dist/framework/tool.d.ts.map +1 -1
- package/dist/framework/tool.js +29 -1
- package/dist/framework/tool.js.map +1 -1
- package/dist/harness/assembler.d.ts.map +1 -1
- package/dist/harness/assembler.js +4 -2
- package/dist/harness/assembler.js.map +1 -1
- package/dist/harness/evidence.d.ts.map +1 -1
- package/dist/harness/evidence.js +3 -2
- package/dist/harness/evidence.js.map +1 -1
- package/dist/harness/safety.d.ts +11 -1
- package/dist/harness/safety.d.ts.map +1 -1
- package/dist/harness/safety.js +112 -16
- package/dist/harness/safety.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +4 -8
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +4 -4
- package/dist/init.js.map +1 -1
- package/dist/ink-ui/App.d.ts +2 -2
- package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
- package/dist/ink-ui/components/Markdown.js.map +1 -1
- package/dist/ink-ui/components/PixelHorseBanner.d.ts +2 -2
- package/dist/ink-ui/components/StatusLine.d.ts +2 -2
- package/dist/ink-ui/launch.d.ts +2 -2
- package/dist/ink-ui/screens/ReplScreen.d.ts +3 -2
- package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.js +65 -0
- package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
- package/dist/memory/embeddings.d.ts.map +1 -1
- package/dist/memory/embeddings.js +3 -2
- package/dist/memory/embeddings.js.map +1 -1
- package/dist/memory/relevant-finder.d.ts +2 -1
- package/dist/memory/relevant-finder.d.ts.map +1 -1
- package/dist/memory/relevant-finder.js +17 -8
- package/dist/memory/relevant-finder.js.map +1 -1
- package/dist/memory/semantic-config.d.ts +9 -0
- package/dist/memory/semantic-config.d.ts.map +1 -0
- package/dist/memory/semantic-config.js +16 -0
- package/dist/memory/semantic-config.js.map +1 -0
- package/dist/memory/semantic-search.d.ts +1 -6
- package/dist/memory/semantic-search.d.ts.map +1 -1
- package/dist/memory/semantic-search.js +5 -16
- package/dist/memory/semantic-search.js.map +1 -1
- package/dist/memory/storage.d.ts +23 -0
- package/dist/memory/storage.d.ts.map +1 -1
- package/dist/memory/storage.js +109 -8
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/vector-store.d.ts +12 -0
- package/dist/memory/vector-store.d.ts.map +1 -1
- package/dist/memory/vector-store.js +139 -18
- package/dist/memory/vector-store.js.map +1 -1
- package/dist/migration/command.d.ts.map +1 -1
- package/dist/migration/command.js +0 -1
- package/dist/migration/command.js.map +1 -1
- package/dist/migration/migrate.d.ts.map +1 -1
- package/dist/migration/migrate.js +43 -109
- package/dist/migration/migrate.js.map +1 -1
- package/dist/migration/types.d.ts +0 -1
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/print-ui/launch.d.ts +11 -3
- package/dist/print-ui/launch.d.ts.map +1 -1
- package/dist/print-ui/launch.js +25 -0
- package/dist/print-ui/launch.js.map +1 -1
- package/dist/product/environment.d.ts +3 -5
- package/dist/product/environment.d.ts.map +1 -1
- package/dist/product/environment.js +4 -32
- package/dist/product/environment.js.map +1 -1
- package/dist/product/index.d.ts +1 -1
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +1 -3
- package/dist/product/index.js.map +1 -1
- package/dist/product/paths.d.ts.map +1 -1
- package/dist/product/paths.js +12 -0
- package/dist/product/paths.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.d.ts +3 -2
- package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-controller.js +24 -3
- package/dist/runtime/agent-runtime-controller.js.map +1 -1
- package/dist/runtime/agent-runtime-protocol.d.ts +16 -1
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-protocol.js +12 -0
- package/dist/runtime/agent-runtime-protocol.js.map +1 -1
- package/dist/runtime/chat-checkpoint.d.ts +17 -0
- package/dist/runtime/chat-checkpoint.d.ts.map +1 -0
- package/dist/runtime/chat-checkpoint.js +108 -0
- package/dist/runtime/chat-checkpoint.js.map +1 -0
- package/dist/runtime/chat-controller.d.ts +16 -46
- package/dist/runtime/chat-controller.d.ts.map +1 -1
- package/dist/runtime/chat-controller.js +212 -1051
- package/dist/runtime/chat-controller.js.map +1 -1
- package/dist/runtime/chat-presentation.d.ts +60 -0
- package/dist/runtime/chat-presentation.d.ts.map +1 -0
- package/dist/runtime/chat-presentation.js +537 -0
- package/dist/runtime/chat-presentation.js.map +1 -0
- package/dist/runtime/chat-trace.d.ts +52 -0
- package/dist/runtime/chat-trace.d.ts.map +1 -0
- package/dist/runtime/chat-trace.js +234 -0
- package/dist/runtime/chat-trace.js.map +1 -0
- package/dist/runtime/chat-workspace.d.ts +22 -0
- package/dist/runtime/chat-workspace.d.ts.map +1 -0
- package/dist/runtime/chat-workspace.js +154 -0
- package/dist/runtime/chat-workspace.js.map +1 -0
- package/dist/runtime/goals/accounting.js +1 -1
- package/dist/runtime/goals/accounting.js.map +1 -1
- package/dist/runtime/goals/completion-audit.d.ts.map +1 -1
- package/dist/runtime/goals/completion-audit.js +5 -4
- package/dist/runtime/goals/completion-audit.js.map +1 -1
- package/dist/runtime/goals/coordinator.d.ts +3 -0
- package/dist/runtime/goals/coordinator.d.ts.map +1 -1
- package/dist/runtime/goals/coordinator.js +30 -2
- package/dist/runtime/goals/coordinator.js.map +1 -1
- package/dist/runtime/goals/prompt.d.ts +1 -1
- package/dist/runtime/goals/prompt.d.ts.map +1 -1
- package/dist/runtime/goals/prompt.js +3 -2
- package/dist/runtime/goals/prompt.js.map +1 -1
- package/dist/runtime/goals/tools.d.ts +21 -8
- package/dist/runtime/goals/tools.d.ts.map +1 -1
- package/dist/runtime/goals/tools.js +152 -21
- package/dist/runtime/goals/tools.js.map +1 -1
- package/dist/runtime/goals/types.d.ts +6 -0
- package/dist/runtime/goals/types.d.ts.map +1 -1
- package/dist/runtime/goals/types.js.map +1 -1
- package/dist/runtime/loop-budget.d.ts +2 -2
- package/dist/runtime/model-coordinator.d.ts.map +1 -1
- package/dist/runtime/model-coordinator.js.map +1 -1
- package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -1
- package/dist/runtime/subagents/child-executor-guard.js +4 -0
- package/dist/runtime/subagents/child-executor-guard.js.map +1 -1
- package/dist/runtime/subagents/index.d.ts +10 -3
- package/dist/runtime/subagents/index.d.ts.map +1 -1
- package/dist/runtime/subagents/index.js +25 -1
- package/dist/runtime/subagents/index.js.map +1 -1
- package/dist/runtime/subagents/policy.d.ts +1 -1
- package/dist/runtime/subagents/policy.d.ts.map +1 -1
- package/dist/runtime/subagents/policy.js.map +1 -1
- package/dist/runtime/subagents/presets.d.ts +2 -2
- package/dist/runtime/subagents/provider-gate.d.ts.map +1 -1
- package/dist/runtime/subagents/provider-gate.js +0 -1
- package/dist/runtime/subagents/provider-gate.js.map +1 -1
- package/dist/runtime/subagents/research-artifact.d.ts +101 -0
- package/dist/runtime/subagents/research-artifact.d.ts.map +1 -0
- package/dist/runtime/subagents/research-artifact.js +210 -0
- package/dist/runtime/subagents/research-artifact.js.map +1 -0
- package/dist/runtime/subagents/research-citation.d.ts +66 -0
- package/dist/runtime/subagents/research-citation.d.ts.map +1 -0
- package/dist/runtime/subagents/research-citation.js +185 -0
- package/dist/runtime/subagents/research-citation.js.map +1 -0
- package/dist/runtime/subagents/research-contract.d.ts +83 -0
- package/dist/runtime/subagents/research-contract.d.ts.map +1 -0
- package/dist/runtime/subagents/research-contract.js +337 -0
- package/dist/runtime/subagents/research-contract.js.map +1 -0
- package/dist/runtime/subagents/research-quality.d.ts +47 -0
- package/dist/runtime/subagents/research-quality.d.ts.map +1 -0
- package/dist/runtime/subagents/research-quality.js +125 -0
- package/dist/runtime/subagents/research-quality.js.map +1 -0
- package/dist/runtime/subagents/research-renderer.d.ts +95 -0
- package/dist/runtime/subagents/research-renderer.d.ts.map +1 -0
- package/dist/runtime/subagents/research-renderer.js +186 -0
- package/dist/runtime/subagents/research-renderer.js.map +1 -0
- package/dist/runtime/subagents/research-types.d.ts +105 -0
- package/dist/runtime/subagents/research-types.d.ts.map +1 -0
- package/dist/runtime/subagents/research-types.js +16 -0
- package/dist/runtime/subagents/research-types.js.map +1 -0
- package/dist/runtime/subagents/result-parser.d.ts +1 -5
- package/dist/runtime/subagents/result-parser.d.ts.map +1 -1
- package/dist/runtime/subagents/result-parser.js +5 -72
- package/dist/runtime/subagents/result-parser.js.map +1 -1
- package/dist/runtime/subagents/runtime-integration.d.ts +13 -7
- package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
- package/dist/runtime/subagents/runtime-integration.js +112 -2
- package/dist/runtime/subagents/runtime-integration.js.map +1 -1
- package/dist/runtime/subagents/supervisor.d.ts +15 -1
- package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
- package/dist/runtime/subagents/supervisor.js +58 -3
- package/dist/runtime/subagents/supervisor.js.map +1 -1
- package/dist/runtime/subagents/tool.d.ts +2 -2
- package/dist/runtime/subagents/tool.d.ts.map +1 -1
- package/dist/runtime/subagents/tool.js +129 -9
- package/dist/runtime/subagents/tool.js.map +1 -1
- package/dist/runtime/subagents/types.d.ts +20 -0
- package/dist/runtime/subagents/types.d.ts.map +1 -1
- package/dist/runtime/subagents/types.js.map +1 -1
- package/dist/runtime/subagents/web-research-adapter.d.ts +85 -0
- package/dist/runtime/subagents/web-research-adapter.d.ts.map +1 -0
- package/dist/runtime/subagents/web-research-adapter.js +328 -0
- package/dist/runtime/subagents/web-research-adapter.js.map +1 -0
- package/dist/runtime/turn-controller.d.ts.map +1 -1
- package/dist/runtime/turn-controller.js +3 -1
- package/dist/runtime/turn-controller.js.map +1 -1
- package/dist/runtime/ui-events.d.ts +25 -8
- package/dist/runtime/ui-events.d.ts.map +1 -1
- package/dist/runtime/ui-events.js.map +1 -1
- package/dist/runtime/ui-view-model.d.ts +40 -0
- package/dist/runtime/ui-view-model.d.ts.map +1 -1
- package/dist/runtime/ui-view-model.js +126 -0
- package/dist/runtime/ui-view-model.js.map +1 -1
- package/dist/services/agent-runner.d.ts +5 -2
- package/dist/services/agent-runner.d.ts.map +1 -1
- package/dist/services/agent-runner.js +18 -18
- package/dist/services/agent-runner.js.map +1 -1
- package/dist/services/atomic-write.d.ts +9 -1
- package/dist/services/atomic-write.d.ts.map +1 -1
- package/dist/services/atomic-write.js +55 -2
- package/dist/services/atomic-write.js.map +1 -1
- package/dist/services/auth/auth.d.ts +11 -7
- package/dist/services/auth/auth.d.ts.map +1 -1
- package/dist/services/auth/auth.js +133 -34
- package/dist/services/auth/auth.js.map +1 -1
- package/dist/services/auth/aws.d.ts +2 -0
- package/dist/services/auth/aws.d.ts.map +1 -1
- package/dist/services/auth/aws.js +126 -12
- package/dist/services/auth/aws.js.map +1 -1
- package/dist/services/auth/index.d.ts +1 -1
- package/dist/services/auth/index.d.ts.map +1 -1
- package/dist/services/auth/index.js +2 -1
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/auto-fix/autoFixConfig.d.ts +0 -3
- package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -1
- package/dist/services/auto-fix/autoFixConfig.js +25 -8
- package/dist/services/auto-fix/autoFixConfig.js.map +1 -1
- package/dist/services/auto-fix/autoFixHook.d.ts +7 -0
- package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
- package/dist/services/auto-fix/autoFixHook.js +10 -1
- package/dist/services/auto-fix/autoFixHook.js.map +1 -1
- package/dist/services/compact/auto-compact.d.ts +2 -0
- package/dist/services/compact/auto-compact.d.ts.map +1 -1
- package/dist/services/compact/auto-compact.js +15 -1
- package/dist/services/compact/auto-compact.js.map +1 -1
- package/dist/services/compact/compact.d.ts.map +1 -1
- package/dist/services/compact/compact.js +9 -11
- package/dist/services/compact/compact.js.map +1 -1
- package/dist/services/compact/summary-generator.d.ts.map +1 -1
- package/dist/services/compact/summary-generator.js +28 -4
- package/dist/services/compact/summary-generator.js.map +1 -1
- package/dist/services/compact/tool-call-groups.d.ts +19 -0
- package/dist/services/compact/tool-call-groups.d.ts.map +1 -0
- package/dist/services/compact/tool-call-groups.js +105 -0
- package/dist/services/compact/tool-call-groups.js.map +1 -0
- package/dist/services/concurrent-sessions.d.ts +4 -0
- package/dist/services/concurrent-sessions.d.ts.map +1 -1
- package/dist/services/concurrent-sessions.js +76 -21
- package/dist/services/concurrent-sessions.js.map +1 -1
- package/dist/services/config-dir.d.ts.map +1 -1
- package/dist/services/config-dir.js +19 -5
- package/dist/services/config-dir.js.map +1 -1
- package/dist/services/config.d.ts +6 -4
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +16 -72
- package/dist/services/config.js.map +1 -1
- package/dist/services/doctor.d.ts +2 -2
- package/dist/services/doctor.js.map +1 -1
- package/dist/services/file-glob.d.ts.map +1 -1
- package/dist/services/file-glob.js +22 -2
- package/dist/services/file-glob.js.map +1 -1
- package/dist/services/file-lock.d.ts +7 -0
- package/dist/services/file-lock.d.ts.map +1 -0
- package/dist/services/file-lock.js +139 -0
- package/dist/services/file-lock.js.map +1 -0
- package/dist/services/global-config.d.ts +33 -0
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/global-config.js +67 -4
- package/dist/services/global-config.js.map +1 -1
- package/dist/services/goal-storage.d.ts.map +1 -1
- package/dist/services/goal-storage.js +52 -19
- package/dist/services/goal-storage.js.map +1 -1
- package/dist/services/llm.d.ts +12 -0
- package/dist/services/llm.d.ts.map +1 -1
- package/dist/services/llm.js +166 -69
- package/dist/services/llm.js.map +1 -1
- package/dist/services/mcp/transports.d.ts +0 -1
- package/dist/services/mcp/transports.d.ts.map +1 -1
- package/dist/services/mcp/transports.js +12 -13
- package/dist/services/mcp/transports.js.map +1 -1
- package/dist/services/model-catalog.d.ts +2 -0
- package/dist/services/model-catalog.d.ts.map +1 -1
- package/dist/services/model-catalog.js +25 -15
- package/dist/services/model-catalog.js.map +1 -1
- package/dist/services/model-context.d.ts +8 -0
- package/dist/services/model-context.d.ts.map +1 -1
- package/dist/services/model-context.js +147 -7
- package/dist/services/model-context.js.map +1 -1
- package/dist/services/model-registry.d.ts.map +1 -1
- package/dist/services/model-registry.js +32 -0
- package/dist/services/model-registry.js.map +1 -1
- package/dist/services/provider-resilience/coordinator.d.ts +9 -4
- package/dist/services/provider-resilience/coordinator.d.ts.map +1 -1
- package/dist/services/provider-resilience/coordinator.js +88 -21
- package/dist/services/provider-resilience/coordinator.js.map +1 -1
- package/dist/services/provider-resilience/error-classifier.d.ts +1 -0
- package/dist/services/provider-resilience/error-classifier.d.ts.map +1 -1
- package/dist/services/provider-resilience/error-classifier.js +50 -29
- package/dist/services/provider-resilience/error-classifier.js.map +1 -1
- package/dist/services/provider-resilience/index.d.ts +3 -3
- package/dist/services/provider-resilience/index.d.ts.map +1 -1
- package/dist/services/provider-resilience/index.js +3 -1
- package/dist/services/provider-resilience/index.js.map +1 -1
- package/dist/services/provider-resilience/request-gate.d.ts +6 -0
- package/dist/services/provider-resilience/request-gate.d.ts.map +1 -1
- package/dist/services/provider-resilience/request-gate.js +24 -9
- package/dist/services/provider-resilience/request-gate.js.map +1 -1
- package/dist/services/provider-resilience/stream-recovery.d.ts +1 -1
- package/dist/services/provider-resilience/stream-recovery.d.ts.map +1 -1
- package/dist/services/provider-resilience/stream-recovery.js +1 -1
- package/dist/services/provider-resilience/stream-recovery.js.map +1 -1
- package/dist/services/provider-resilience/types.d.ts +9 -0
- package/dist/services/provider-resilience/types.d.ts.map +1 -1
- package/dist/services/provider-resilience/types.js.map +1 -1
- package/dist/services/redaction.d.ts.map +1 -1
- package/dist/services/redaction.js +29 -1
- package/dist/services/redaction.js.map +1 -1
- package/dist/services/session-index.d.ts.map +1 -1
- package/dist/services/session-index.js +75 -44
- package/dist/services/session-index.js.map +1 -1
- package/dist/services/session-memory/sessionMemory.d.ts.map +1 -1
- package/dist/services/session-memory/sessionMemory.js +6 -3
- package/dist/services/session-memory/sessionMemory.js.map +1 -1
- package/dist/services/session-storage.d.ts +8 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +105 -27
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/storage-maintenance.d.ts.map +1 -1
- package/dist/services/storage-maintenance.js +62 -9
- package/dist/services/storage-maintenance.js.map +1 -1
- package/dist/services/task-manager.d.ts +9 -4
- package/dist/services/task-manager.d.ts.map +1 -1
- package/dist/services/task-manager.js +18 -4
- package/dist/services/task-manager.js.map +1 -1
- package/dist/services/tool-allowlist.d.ts +100 -0
- package/dist/services/tool-allowlist.d.ts.map +1 -0
- package/dist/services/tool-allowlist.js +250 -0
- package/dist/services/tool-allowlist.js.map +1 -0
- package/dist/services/usage-state.d.ts +1 -0
- package/dist/services/usage-state.d.ts.map +1 -1
- package/dist/services/usage-state.js +81 -45
- package/dist/services/usage-state.js.map +1 -1
- package/dist/services/verification-profile.d.ts.map +1 -1
- package/dist/services/verification-profile.js +23 -3
- package/dist/services/verification-profile.js.map +1 -1
- package/dist/services/web-search-adapters.d.ts.map +1 -1
- package/dist/services/web-search-adapters.js +48 -18
- package/dist/services/web-search-adapters.js.map +1 -1
- package/dist/services/web-search-mcp.d.ts.map +1 -1
- package/dist/services/web-search-mcp.js +27 -11
- package/dist/services/web-search-mcp.js.map +1 -1
- package/dist/services/workspace-diff.d.ts +14 -0
- package/dist/services/workspace-diff.d.ts.map +1 -1
- package/dist/services/workspace-diff.js +60 -11
- package/dist/services/workspace-diff.js.map +1 -1
- package/dist/services/yaml-config.d.ts.map +1 -1
- package/dist/services/yaml-config.js +2 -1
- package/dist/services/yaml-config.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +26 -11
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/runtime.d.ts +3 -3
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +37 -4
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/types.d.ts +1 -1
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/terminal-ui/launch.d.ts +36 -8
- package/dist/terminal-ui/launch.d.ts.map +1 -1
- package/dist/terminal-ui/launch.js +171 -1
- package/dist/terminal-ui/launch.js.map +1 -1
- package/dist/terminal-ui/raw-editor.js.map +1 -1
- package/dist/tools/bash_security.d.ts +58 -18
- package/dist/tools/bash_security.d.ts.map +1 -1
- package/dist/tools/bash_security.js +587 -80
- package/dist/tools/bash_security.js.map +1 -1
- package/dist/tools/git.d.ts +8 -4
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +518 -18
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/index.d.ts +14 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +292 -49
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.d.ts +74 -6
- package/dist/tools/lsp.d.ts.map +1 -1
- package/dist/tools/lsp.js +24 -5
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/mcp.d.ts +19 -6
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/mcp.js +143 -26
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/plan.d.ts +4 -4
- package/dist/tools/sandbox.d.ts +141 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +500 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/todo.d.ts +3 -3
- package/dist/tools/web.d.ts +15 -4
- package/dist/tools/web.d.ts.map +1 -1
- package/dist/tools/web.js +346 -61
- package/dist/tools/web.js.map +1 -1
- package/dist/tui-core/frame.js.map +1 -1
- package/dist/tui-ui/launch.d.ts +3 -3
- package/dist/tui-ui/launch.d.ts.map +1 -1
- package/dist/tui-ui/launch.js +46 -8
- package/dist/tui-ui/launch.js.map +1 -1
- package/dist/tui-ui/layout.d.ts.map +1 -1
- package/dist/tui-ui/layout.js +64 -0
- package/dist/tui-ui/layout.js.map +1 -1
- package/dist/tui-ui/runner.d.ts +6 -0
- package/dist/tui-ui/runner.d.ts.map +1 -1
- package/dist/tui-ui/runner.js +82 -1
- package/dist/tui-ui/runner.js.map +1 -1
- package/dist/tui-ui/state.d.ts +28 -2
- package/dist/tui-ui/state.d.ts.map +1 -1
- package/dist/tui-ui/state.js +48 -7
- package/dist/tui-ui/state.js.map +1 -1
- package/dist/tui-ui/terminal-image.d.ts +3 -13
- package/dist/tui-ui/terminal-image.d.ts.map +1 -1
- package/dist/tui-ui/terminal-image.js +5 -160
- package/dist/tui-ui/terminal-image.js.map +1 -1
- package/dist/ui/markdown.js.map +1 -1
- package/dist/utils/debug-log.d.ts +52 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/debug-log.js +94 -0
- package/dist/utils/debug-log.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +47 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/json.d.ts +6 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +66 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/mask.d.ts +35 -0
- package/dist/utils/mask.d.ts.map +1 -0
- package/dist/utils/mask.js +52 -0
- package/dist/utils/mask.js.map +1 -0
- package/dist/utils/observability.d.ts +22 -0
- package/dist/utils/observability.d.ts.map +1 -0
- package/dist/utils/observability.js +80 -0
- package/dist/utils/observability.js.map +1 -0
- package/dist/utils/token-estimate.d.ts +8 -0
- package/dist/utils/token-estimate.d.ts.map +1 -1
- package/dist/utils/token-estimate.js +30 -17
- package/dist/utils/token-estimate.js.map +1 -1
- package/package.json +9 -7
|
@@ -1,982 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.InkChatController = exports.AgentChatController = void 0;
|
|
37
|
-
exports.sessionMessagesToTranscriptEntries = sessionMessagesToTranscriptEntries;
|
|
38
|
-
exports.createAssistantStreamPresenter = createAssistantStreamPresenter;
|
|
39
|
-
exports.createToolEventPresenter = createToolEventPresenter;
|
|
3
|
+
exports.InkChatController = exports.AgentChatController = exports.sessionMessagesToTranscriptEntries = exports.createToolEventPresenter = exports.createAssistantStreamPresenter = void 0;
|
|
40
4
|
exports.loadSessionIntoRuntime = loadSessionIntoRuntime;
|
|
41
5
|
exports.closeSession = closeSession;
|
|
42
6
|
const commands_1 = require("../commands");
|
|
43
|
-
const
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
44
8
|
const parser_1 = require("../commands/parser");
|
|
45
|
-
const path = __importStar(require("path"));
|
|
46
9
|
const session_storage_1 = require("../services/session-storage");
|
|
47
10
|
const config_1 = require("../services/config");
|
|
11
|
+
const provider_resilience_1 = require("../services/provider-resilience");
|
|
12
|
+
const tool_allowlist_1 = require("../services/tool-allowlist");
|
|
48
13
|
const framework_1 = require("../framework");
|
|
49
14
|
const prompt_1 = require("./goals/prompt");
|
|
50
15
|
const harness_1 = require("../harness");
|
|
51
16
|
const tools_1 = require("../tools");
|
|
52
17
|
const tool_serializer_1 = require("../framework/tool-serializer");
|
|
53
18
|
const tool_artifacts_1 = require("../core/tool-artifacts");
|
|
54
|
-
const checkpoint_1 = require("../core/checkpoint");
|
|
55
19
|
const skills_1 = require("../skills");
|
|
56
20
|
const subagents_1 = require("./subagents");
|
|
57
21
|
const file_context_1 = require("../services/file-context");
|
|
58
22
|
const prompt_context_1 = require("../services/prompt-context");
|
|
59
|
-
const format_1 = require("../services/format");
|
|
60
23
|
const workspace_state_1 = require("../services/workspace-state");
|
|
61
24
|
const verification_profile_1 = require("../services/verification-profile");
|
|
62
25
|
const ui_events_1 = require("./ui-events");
|
|
63
|
-
const ui_view_model_1 = require("./ui-view-model");
|
|
64
26
|
const agent_status_1 = require("./agent-status");
|
|
65
27
|
const loop_budget_1 = require("./loop-budget");
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
function
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
function isAbortError(error, abortSignal) {
|
|
76
|
-
if (abortSignal?.aborted)
|
|
77
|
-
return true;
|
|
78
|
-
if (error instanceof Error) {
|
|
79
|
-
return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');
|
|
80
|
-
}
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
function errorLayerForChatError(error) {
|
|
84
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
85
|
-
const lower = message.toLowerCase();
|
|
86
|
-
if (/NotEnoughCvError|code:\s*11210|provider|quota|rate.?limit|timeout|connection/i.test(message)) {
|
|
87
|
-
return 'provider';
|
|
88
|
-
}
|
|
89
|
-
if (/tool|command|exec_command|write_file|edit_file/i.test(message)) {
|
|
90
|
-
return 'tool';
|
|
91
|
-
}
|
|
92
|
-
if (/\bmcp\b/i.test(message))
|
|
93
|
-
return 'mcp';
|
|
94
|
-
if (/\b(session|resume|compact|harness)\b/i.test(message))
|
|
95
|
-
return 'session';
|
|
96
|
-
if (/\b(skill|skills)\b/i.test(message))
|
|
97
|
-
return 'skills';
|
|
98
|
-
if (/\b(memory|vector store|recall|forget)\b/i.test(message))
|
|
99
|
-
return 'memory';
|
|
100
|
-
if (/\b(renderer|terminal|tty|prompt|resize|scrollback)\b/i.test(message))
|
|
101
|
-
return 'renderer';
|
|
102
|
-
if (lower.includes('abort') || lower.includes('interrupted'))
|
|
103
|
-
return 'runtime';
|
|
104
|
-
return 'unknown';
|
|
105
|
-
}
|
|
106
|
-
function formatChatError(error) {
|
|
107
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
108
|
-
if (/NotEnoughCvError|code:\s*11210/i.test(message)) {
|
|
109
|
-
return [
|
|
110
|
-
message,
|
|
111
|
-
'',
|
|
112
|
-
'Provider quota or credit appears insufficient. The Orion Code session is still active; switch model/provider or recharge the provider account, then continue.',
|
|
113
|
-
].join('\n');
|
|
114
|
-
}
|
|
115
|
-
return message;
|
|
116
|
-
}
|
|
117
|
-
function compactMiddle(text, maxLength) {
|
|
118
|
-
const compact = text.replace(/\s+/g, ' ').trim();
|
|
119
|
-
if (compact.length <= maxLength)
|
|
120
|
-
return compact;
|
|
121
|
-
if (maxLength <= 3)
|
|
122
|
-
return compact.slice(0, maxLength);
|
|
123
|
-
const headLength = Math.ceil((maxLength - 3) * 0.55);
|
|
124
|
-
const tailLength = Math.floor((maxLength - 3) * 0.45);
|
|
125
|
-
return `${compact.slice(0, headLength)}...${compact.slice(-tailLength)}`;
|
|
126
|
-
}
|
|
127
|
-
function compactToolArgs(args, maxLength = 160) {
|
|
128
|
-
for (const key of [
|
|
129
|
-
'path',
|
|
130
|
-
'file_path',
|
|
131
|
-
'file',
|
|
132
|
-
'cwd',
|
|
133
|
-
'command',
|
|
134
|
-
'pattern',
|
|
135
|
-
'query',
|
|
136
|
-
'url',
|
|
137
|
-
'target',
|
|
138
|
-
'sessionId',
|
|
139
|
-
]) {
|
|
140
|
-
const value = args[key];
|
|
141
|
-
if (typeof value === 'string') {
|
|
142
|
-
return compactMiddle(value, maxLength);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
const firstString = Object.values(args).find(value => typeof value === 'string');
|
|
146
|
-
if (typeof firstString === 'string') {
|
|
147
|
-
return compactMiddle(firstString, maxLength);
|
|
148
|
-
}
|
|
149
|
-
return '';
|
|
150
|
-
}
|
|
151
|
-
function fullToolArgsForTrace(name, args) {
|
|
152
|
-
if (name === 'exec_command' && typeof args.command === 'string') {
|
|
153
|
-
return `$ ${args.command}`;
|
|
154
|
-
}
|
|
155
|
-
try {
|
|
156
|
-
return JSON.stringify(args, null, 2);
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
return compactToolArgs(args, 2048);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function buildTraceArgsDetails(projectPath, name, args) {
|
|
163
|
-
const argsSummary = compactToolArgs(args);
|
|
164
|
-
const fullArgs = (0, session_storage_1.redactTraceText)(fullToolArgsForTrace(name, args)).trim();
|
|
165
|
-
const argsBytes = byteLength(fullArgs);
|
|
166
|
-
if (!projectPath ||
|
|
167
|
-
!fullArgs ||
|
|
168
|
-
fullArgs === (0, session_storage_1.redactTraceText)(argsSummary) ||
|
|
169
|
-
argsBytes <= TRACE_ARGS_ARTIFACT_THRESHOLD_BYTES) {
|
|
170
|
-
return { argsSummary };
|
|
171
|
-
}
|
|
172
|
-
const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `${name}-args`, fullArgs, argsBytes);
|
|
173
|
-
return artifact ? { argsSummary, argsArtifactId: artifact.id, argsBytes } : { argsSummary };
|
|
174
|
-
}
|
|
175
|
-
function parseToolCallArgsForRuntime(toolCall) {
|
|
176
|
-
try {
|
|
177
|
-
const parsed = JSON.parse(toolCall.function.arguments || '{}');
|
|
178
|
-
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
|
|
179
|
-
? parsed
|
|
180
|
-
: null;
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
function resolveProjectScopedPath(cwd, filePath) {
|
|
187
|
-
const absolute = path.resolve(cwd, filePath);
|
|
188
|
-
const relative = path.relative(cwd, absolute);
|
|
189
|
-
if (relative.startsWith('..') || path.isAbsolute(relative))
|
|
190
|
-
return null;
|
|
191
|
-
return absolute;
|
|
192
|
-
}
|
|
193
|
-
function checkpointTargetsFromToolCalls(cwd, toolCalls) {
|
|
194
|
-
const targets = new Set();
|
|
195
|
-
for (const toolCall of toolCalls) {
|
|
196
|
-
const name = toolCall.function.name;
|
|
197
|
-
if (name !== 'write_file' && name !== 'edit_file')
|
|
198
|
-
continue;
|
|
199
|
-
const args = parseToolCallArgsForRuntime(toolCall);
|
|
200
|
-
if (!args || typeof args.path !== 'string')
|
|
201
|
-
continue;
|
|
202
|
-
if (name === 'edit_file' && args.preview === true)
|
|
203
|
-
continue;
|
|
204
|
-
const target = resolveProjectScopedPath(cwd, args.path);
|
|
205
|
-
if (target)
|
|
206
|
-
targets.add(target);
|
|
207
|
-
}
|
|
208
|
-
return Array.from(targets);
|
|
209
|
-
}
|
|
210
|
-
function createPreToolCheckpoint(events, sessionId, turnId, checkpointId, cwd, toolCalls) {
|
|
211
|
-
const targets = checkpointTargetsFromToolCalls(cwd, toolCalls);
|
|
212
|
-
if (targets.length === 0)
|
|
213
|
-
return { created: false, targetCount: 0, risky: false };
|
|
214
|
-
const risky = (0, checkpoint_1.shouldCreateMultiFileCheckpoint)(targets.length);
|
|
215
|
-
const checkpoint = (0, checkpoint_1.createCheckpoint)(cwd, checkpointId, targets);
|
|
216
|
-
if (!sessionId)
|
|
217
|
-
return { created: true, targetCount: targets.length, risky };
|
|
218
|
-
const relativeTargets = targets.map(target => path.relative(cwd, target));
|
|
219
|
-
recordTraceEvent(events, sessionId, {
|
|
220
|
-
turnId,
|
|
221
|
-
type: 'checkpoint',
|
|
222
|
-
checkpointId,
|
|
223
|
-
checkpointFileCount: checkpoint?.files.length ?? 0,
|
|
224
|
-
checkpointFiles: checkpoint?.files.map(file => file.path) ?? [],
|
|
225
|
-
workspaceFiles: relativeTargets,
|
|
226
|
-
note: checkpoint
|
|
227
|
-
? risky
|
|
228
|
-
? 'risky_multi_file_checkpoint'
|
|
229
|
-
: 'pre_edit_checkpoint'
|
|
230
|
-
: 'pre_edit_checkpoint_skipped',
|
|
231
|
-
});
|
|
232
|
-
return { created: true, targetCount: targets.length, risky };
|
|
233
|
-
}
|
|
234
|
-
function byteLength(text) {
|
|
235
|
-
return Buffer.byteLength(text, 'utf8');
|
|
236
|
-
}
|
|
237
|
-
function traceTurnId(turnId) {
|
|
238
|
-
return turnId == null ? `turn-${Date.now()}` : String(turnId);
|
|
239
|
-
}
|
|
240
|
-
function compactTraceError(error) {
|
|
241
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
242
|
-
return compactMiddle(message, 240);
|
|
243
|
-
}
|
|
244
|
-
function getLastRequestDiagnostics(llm) {
|
|
245
|
-
if (!llm)
|
|
246
|
-
return undefined;
|
|
247
|
-
const reader = llm.getLastRequestDiagnostics;
|
|
248
|
-
return typeof reader === 'function' ? reader.call(llm) : undefined;
|
|
249
|
-
}
|
|
250
|
-
function compactPathList(paths, maxItems = 40) {
|
|
251
|
-
return paths.slice(0, maxItems);
|
|
252
|
-
}
|
|
253
|
-
function formatWorkspaceFileForTrace(file) {
|
|
254
|
-
const metadata = [
|
|
255
|
-
typeof file.sizeBytes === 'number' ? `${file.sizeBytes}B` : '',
|
|
256
|
-
typeof file.mtimeMs === 'number' ? `mtime=${file.mtimeMs}` : '',
|
|
257
|
-
]
|
|
258
|
-
.filter(Boolean)
|
|
259
|
-
.join(' ');
|
|
260
|
-
return `${file.status} ${file.path}${metadata ? ` (${metadata})` : ''}`;
|
|
261
|
-
}
|
|
262
|
-
function appendWorkspaceSnapshotTrace(events, sessionId, turnId, phase, snapshot) {
|
|
263
|
-
if (!sessionId)
|
|
264
|
-
return;
|
|
265
|
-
recordTraceEvent(events, sessionId, {
|
|
266
|
-
turnId,
|
|
267
|
-
type: 'workspace_snapshot',
|
|
268
|
-
workspacePhase: phase,
|
|
269
|
-
workspaceGitAvailable: snapshot.gitAvailable,
|
|
270
|
-
workspaceDirty: snapshot.dirty,
|
|
271
|
-
workspaceBranch: snapshot.branch,
|
|
272
|
-
workspaceFileCount: snapshot.fileCount,
|
|
273
|
-
workspaceFiles: compactPathList(snapshot.files.map(formatWorkspaceFileForTrace)),
|
|
274
|
-
error: snapshot.error ? compactMiddle(snapshot.error, 240) : undefined,
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
function appendWorkspaceDeltaTrace(events, sessionId, turnId, before, after) {
|
|
278
|
-
const delta = (0, workspace_state_1.diffWorkspaceSnapshots)(before, after);
|
|
279
|
-
if (sessionId) {
|
|
280
|
-
recordTraceEvent(events, sessionId, {
|
|
281
|
-
turnId,
|
|
282
|
-
type: 'workspace_delta',
|
|
283
|
-
workspaceFileCount: delta.filesAfterTurn.length,
|
|
284
|
-
workspaceFiles: compactPathList(delta.filesAfterTurn),
|
|
285
|
-
workspaceNewByTurn: compactPathList(delta.newFilesByTurn),
|
|
286
|
-
workspaceChangedByTurn: compactPathList(delta.changedByTurn),
|
|
287
|
-
workspaceModifiedPreExistingByTurn: compactPathList(delta.modifiedPreExistingByTurn),
|
|
288
|
-
workspaceResolvedByTurn: compactPathList(delta.resolvedByTurn),
|
|
289
|
-
note: `pre_existing=${delta.preExistingFiles.length}`,
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
return delta;
|
|
293
|
-
}
|
|
294
|
-
function workspaceDeltaHasTurnChanges(delta) {
|
|
295
|
-
return (delta.newFilesByTurn.length > 0 ||
|
|
296
|
-
delta.changedByTurn.length > 0 ||
|
|
297
|
-
delta.resolvedByTurn.length > 0);
|
|
298
|
-
}
|
|
299
|
-
function formatFailureRecoveryNotice(turnId, delta, checkpointIds) {
|
|
300
|
-
const files = compactPathList([...delta.newFilesByTurn, ...delta.changedByTurn, ...delta.resolvedByTurn], 8);
|
|
301
|
-
const fileText = files.length > 0 ? files.join(', ') : 'workspace changes recorded';
|
|
302
|
-
const checkpointText = checkpointIds.length > 0
|
|
303
|
-
? ` Checkpoints: ${checkpointIds.join(', ')}. Preview rollback with /checkpoint restore <id>; restore each listed checkpoint if multiple.`
|
|
304
|
-
: '';
|
|
305
|
-
return `Turn failed after modifying files: ${fileText}. Inspect /trace ${turnId}.${checkpointText}`;
|
|
306
|
-
}
|
|
307
|
-
function appendVerificationProfileTrace(events, sessionId, turnId, profile) {
|
|
308
|
-
if (!sessionId || profile.changedFiles.length === 0)
|
|
309
|
-
return;
|
|
310
|
-
recordTraceEvent(events, sessionId, {
|
|
311
|
-
turnId,
|
|
312
|
-
type: 'verification_profile',
|
|
313
|
-
verificationProfile: profile.profile,
|
|
314
|
-
verificationRequired: profile.required,
|
|
315
|
-
verificationRisky: (0, verification_profile_1.isRiskyEdit)(profile.changedFiles),
|
|
316
|
-
verificationCommands: compactPathList(profile.commands, 8),
|
|
317
|
-
verificationChangedFiles: compactPathList(profile.changedFiles),
|
|
318
|
-
note: profile.reason,
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
function appendVerificationResultTrace(events, sessionId, turnId, result) {
|
|
322
|
-
if (!sessionId)
|
|
323
|
-
return;
|
|
324
|
-
recordTraceEvent(events, sessionId, {
|
|
325
|
-
turnId,
|
|
326
|
-
type: 'verification_result',
|
|
327
|
-
verificationCommand: result.command,
|
|
328
|
-
verificationPassed: result.success,
|
|
329
|
-
outputBytes: result.outputBytes,
|
|
330
|
-
error: result.error ? compactMiddle(result.error, 240) : undefined,
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
function appendVerificationSummaryTrace(events, sessionId, turnId, summary, changedFiles) {
|
|
334
|
-
if (!sessionId || changedFiles.length === 0)
|
|
335
|
-
return;
|
|
336
|
-
recordTraceEvent(events, sessionId, {
|
|
337
|
-
turnId,
|
|
338
|
-
type: 'verification_summary',
|
|
339
|
-
verificationProfile: summary.profile,
|
|
340
|
-
verificationRequired: summary.required,
|
|
341
|
-
verificationCommands: compactPathList(summary.commandsRun, 12),
|
|
342
|
-
verificationPassedCommands: compactPathList(summary.passedCommands, 12),
|
|
343
|
-
verificationFailedCommands: compactPathList(summary.failedCommands, 12),
|
|
344
|
-
verificationMissingCommands: compactPathList(summary.missingCommands, 12),
|
|
345
|
-
verificationChangedFiles: compactPathList(changedFiles),
|
|
346
|
-
verificationClaimAllowed: summary.claimAllowed,
|
|
347
|
-
note: summary.skippedReason,
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
function compactVerificationCommands(commands, maxItems = 12) {
|
|
351
|
-
return commands.slice(0, maxItems).map(session_storage_1.redactTraceText);
|
|
352
|
-
}
|
|
353
|
-
function withVerificationLoopStats(stats, summary) {
|
|
354
|
-
return {
|
|
355
|
-
...stats,
|
|
356
|
-
verificationProfile: summary.profile,
|
|
357
|
-
verificationRequired: summary.required,
|
|
358
|
-
verificationClaimAllowed: summary.claimAllowed,
|
|
359
|
-
verificationPassedCommands: compactVerificationCommands(summary.passedCommands),
|
|
360
|
-
verificationFailedCommands: compactVerificationCommands(summary.failedCommands),
|
|
361
|
-
verificationMissingCommands: compactVerificationCommands(summary.missingCommands),
|
|
362
|
-
verificationSkippedReason: summary.skippedReason
|
|
363
|
-
? (0, session_storage_1.redactTraceText)(summary.skippedReason)
|
|
364
|
-
: undefined,
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
function shouldRecordVerificationLoopStats(profile, summary) {
|
|
368
|
-
return (profile.changedFiles.length > 0 ||
|
|
369
|
-
summary.commandsRun.length > 0 ||
|
|
370
|
-
summary.passedCommands.length > 0 ||
|
|
371
|
-
summary.failedCommands.length > 0 ||
|
|
372
|
-
summary.missingCommands.length > 0);
|
|
373
|
-
}
|
|
374
|
-
function appendPostWorkspaceTrace(events, sessionId, turnId, cwd, before, verificationResults = []) {
|
|
375
|
-
const postWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(cwd);
|
|
376
|
-
appendWorkspaceSnapshotTrace(events, sessionId, turnId, 'post_turn', postWorkspace);
|
|
377
|
-
const delta = appendWorkspaceDeltaTrace(events, sessionId, turnId, before, postWorkspace);
|
|
378
|
-
const profile = (0, verification_profile_1.selectVerificationProfile)(cwd, delta.changedByTurn);
|
|
379
|
-
const summary = (0, verification_profile_1.summarizeVerificationState)(profile, verificationResults);
|
|
380
|
-
appendVerificationProfileTrace(events, sessionId, turnId, profile);
|
|
381
|
-
appendVerificationSummaryTrace(events, sessionId, turnId, summary, profile.changedFiles);
|
|
382
|
-
return { delta, profile, summary };
|
|
383
|
-
}
|
|
384
|
-
function appendAssistantNotice(messages, notice) {
|
|
385
|
-
for (let index = messages.length - 1; index >= 0; index--) {
|
|
386
|
-
const message = messages[index];
|
|
387
|
-
if (message.role === 'assistant' && !message.tool_calls) {
|
|
388
|
-
message.content = message.content ? `${message.content}\n\n${notice}` : notice;
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
messages.push({
|
|
393
|
-
role: 'assistant',
|
|
394
|
-
content: notice,
|
|
395
|
-
timestamp: Date.now(),
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
function recordTraceEvent(events, sessionId, event) {
|
|
399
|
-
if (!sessionId)
|
|
400
|
-
return null;
|
|
401
|
-
const goal = goalTraceContext.getStore();
|
|
402
|
-
const traceEvent = (0, session_storage_1.appendSessionTraceEvent)(sessionId, {
|
|
403
|
-
...event,
|
|
404
|
-
goalId: goal?.goalId,
|
|
405
|
-
goalRevision: goal?.goalRevision,
|
|
406
|
-
goalInputKind: goal?.goalInputKind,
|
|
407
|
-
goalStopReason: goal?.getStopReason(),
|
|
408
|
-
});
|
|
409
|
-
if (traceEvent) {
|
|
410
|
-
events.traceEventRecorded?.(traceEvent);
|
|
411
|
-
}
|
|
412
|
-
return traceEvent;
|
|
413
|
-
}
|
|
414
|
-
function recordProviderTraceEvents(events, sessionId, turnId, stats) {
|
|
415
|
-
if ((stats.providerRetryCount ?? 0) > 0) {
|
|
416
|
-
recordTraceEvent(events, sessionId, {
|
|
417
|
-
turnId,
|
|
418
|
-
type: 'provider_retry',
|
|
419
|
-
providerRetryCount: stats.providerRetryCount,
|
|
420
|
-
providerRetryDelayMs: stats.providerRetryDelayMs,
|
|
421
|
-
providerRetryErrorTypes: stats.providerRetryErrorTypes,
|
|
422
|
-
providerLastRetryErrorType: stats.providerLastRetryErrorType,
|
|
423
|
-
providerLastRetryStatus: stats.providerLastRetryStatus,
|
|
424
|
-
providerFinalModel: stats.providerFinalModel,
|
|
425
|
-
providerUsingFallback: stats.providerUsingFallback,
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
if ((stats.providerFallbackCount ?? 0) > 0 || stats.providerUsingFallback) {
|
|
429
|
-
recordTraceEvent(events, sessionId, {
|
|
430
|
-
turnId,
|
|
431
|
-
type: 'provider_fallback',
|
|
432
|
-
providerFallbackCount: stats.providerFallbackCount,
|
|
433
|
-
providerFallbackFromModel: stats.providerFallbackFromModel,
|
|
434
|
-
providerFallbackToModel: stats.providerFallbackToModel,
|
|
435
|
-
providerFinalModel: stats.providerFinalModel,
|
|
436
|
-
providerUsingFallback: stats.providerUsingFallback,
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
function toHarnessDiagnostics(state) {
|
|
441
|
-
const stats = state.promptAssemblyStats;
|
|
442
|
-
const redactOptional = (value) => typeof value === 'string' ? (0, session_storage_1.redactTraceText)(value) : undefined;
|
|
443
|
-
const redactList = (values) => values?.slice(0, 6).map(session_storage_1.redactTraceText);
|
|
444
|
-
return {
|
|
445
|
-
taskEpoch: state.taskEpoch,
|
|
446
|
-
rootObjective: redactOptional(state.rootObjective ?? state.contract?.objective),
|
|
447
|
-
activeInstruction: redactOptional(state.activeInstruction ?? state.contract?.userIntent),
|
|
448
|
-
openQuestions: redactList(state.openQuestions),
|
|
449
|
-
diagnostics: redactList(state.diagnostics?.slice(-6)),
|
|
450
|
-
ledgerSize: state.ledger?.length ?? 0,
|
|
451
|
-
evidenceSize: state.evidenceIndex?.length ?? 0,
|
|
452
|
-
turnSummaryCount: state.turnSummaries?.length ?? 0,
|
|
453
|
-
promptAssembly: stats
|
|
454
|
-
? {
|
|
455
|
-
modelId: stats.modelId,
|
|
456
|
-
estimatedTokens: stats.estimatedTokens,
|
|
457
|
-
budgetTokens: stats.budgetTokens,
|
|
458
|
-
sections: stats.sections.slice(0, 12),
|
|
459
|
-
includedEvidence: stats.includedEvidence.length,
|
|
460
|
-
omittedEvidence: stats.omittedEvidence.length,
|
|
461
|
-
}
|
|
462
|
-
: undefined,
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
function emitHarnessDiagnostics(events, state) {
|
|
466
|
-
events.harnessDiagnosticsUpdated?.(toHarnessDiagnostics(state));
|
|
467
|
-
}
|
|
468
|
-
function toolStartContent(event) {
|
|
469
|
-
return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromStarted)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
|
|
470
|
-
}
|
|
471
|
-
function toolFinishContent(event) {
|
|
472
|
-
return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromFinished)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
|
|
473
|
-
}
|
|
474
|
-
function structuredToolStartActivity(event, seq) {
|
|
475
|
-
const command = event.name === 'exec_command' && typeof event.args.command === 'string'
|
|
476
|
-
? event.args.command
|
|
477
|
-
: undefined;
|
|
478
|
-
const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
|
|
479
|
-
return {
|
|
480
|
-
state: 'running',
|
|
481
|
-
name: event.name,
|
|
482
|
-
detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
|
|
483
|
-
command: safeCommand,
|
|
484
|
-
body: '',
|
|
485
|
-
seq,
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
function structuredToolFinishActivity(event, seq, options = {}) {
|
|
489
|
-
const modelVisible = (0, tool_serializer_1.parseToolResultEnvelope)(event.modelVisibleResult);
|
|
490
|
-
const durable = (0, tool_serializer_1.parseToolResultEnvelope)(event.result);
|
|
491
|
-
const durableOutput = typeof durable.output === 'string' ? durable.output : '';
|
|
492
|
-
const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
|
|
493
|
-
const outputBytes = event.outputBytes ?? Buffer.byteLength(durableOutput, 'utf8');
|
|
494
|
-
const aggregatePresentation = (0, aggregate_tool_presenter_1.presentAggregateToolResult)(event.name, durableOutput, outputBytes);
|
|
495
|
-
const aggregate = aggregatePresentation?.view;
|
|
496
|
-
const storedArtifact = event.artifactRef ??
|
|
497
|
-
(options.projectPath &&
|
|
498
|
-
durableOutput &&
|
|
499
|
-
(outputBytes > tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY.inlineMaxBytes || aggregate)
|
|
500
|
-
? ((0, tool_artifacts_1.storeArtifact)(options.projectPath, event.name, durableOutput, outputBytes) ?? undefined)
|
|
501
|
-
: undefined);
|
|
502
|
-
const artifactRef = storedArtifact
|
|
503
|
-
? { id: storedArtifact.id, outputBytes: storedArtifact.outputBytes }
|
|
504
|
-
: undefined;
|
|
505
|
-
const outputView = (0, tool_output_presentation_1.createToolOutputView)({
|
|
506
|
-
toolName: event.name,
|
|
507
|
-
success: event.success,
|
|
508
|
-
summary: event.summary,
|
|
509
|
-
rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
|
|
510
|
-
outputBytes,
|
|
511
|
-
artifactRef,
|
|
512
|
-
callId: event.callId,
|
|
513
|
-
sequence: seq,
|
|
514
|
-
turnId: options.turnId,
|
|
515
|
-
policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
|
|
516
|
-
});
|
|
517
|
-
if (aggregate) {
|
|
518
|
-
outputView.aggregate = {
|
|
519
|
-
...aggregate,
|
|
520
|
-
steps: aggregate.steps.map(step => ({ ...step, detailRef: outputView.detailRef })),
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
const command = event.name === 'exec_command' && typeof event.args.command === 'string'
|
|
524
|
-
? event.args.command
|
|
525
|
-
: undefined;
|
|
526
|
-
const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
|
|
527
|
-
return {
|
|
528
|
-
state: event.success ? 'success' : 'error',
|
|
529
|
-
name: event.name,
|
|
530
|
-
detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
|
|
531
|
-
command: safeCommand,
|
|
532
|
-
duration: `${event.duration}ms`,
|
|
533
|
-
summary: event.summary ? (0, session_storage_1.redactTraceText)(event.summary.split(/\r?\n/u, 1)[0]) : undefined,
|
|
534
|
-
outputBytes,
|
|
535
|
-
body: (0, session_storage_1.redactTraceText)(modelVisible.output),
|
|
536
|
-
error: event.error ? (0, session_storage_1.redactTraceText)(event.error) : undefined,
|
|
537
|
-
seq,
|
|
538
|
-
artifactHint: artifactRef ? `/artifacts show ${artifactRef.id} --full` : undefined,
|
|
539
|
-
callId: event.callId,
|
|
540
|
-
turnId: options.turnId,
|
|
541
|
-
outputView,
|
|
542
|
-
};
|
|
543
|
-
}
|
|
544
|
-
function isSyntheticCompactContext(content) {
|
|
545
|
-
return (content.startsWith('[Orion Code Context State v2]') ||
|
|
546
|
-
content.startsWith('[Context Summary]') ||
|
|
547
|
-
content.startsWith('I will continue from this Orion Code Context State') ||
|
|
548
|
-
content.startsWith('I understand the context. I will continue the conversation with this background information.'));
|
|
549
|
-
}
|
|
550
|
-
function sessionToolCallSummaries(message) {
|
|
551
|
-
return (message.tool_calls ?? []).map(call => {
|
|
552
|
-
const args = parseToolCallArgs(call.function.arguments);
|
|
553
|
-
const detail = compactToolArgs(args);
|
|
554
|
-
return {
|
|
555
|
-
id: call.id,
|
|
556
|
-
content: `Requested ${call.function.name}${detail ? ` ${detail}` : ''}`,
|
|
557
|
-
};
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
function parseToolCallArgs(rawArgs) {
|
|
561
|
-
try {
|
|
562
|
-
return rawArgs ? JSON.parse(rawArgs) : {};
|
|
563
|
-
}
|
|
564
|
-
catch {
|
|
565
|
-
return rawArgs ? { arguments: rawArgs } : {};
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
function parseSessionToolResult(content) {
|
|
569
|
-
try {
|
|
570
|
-
const parsed = JSON.parse(content);
|
|
571
|
-
return {
|
|
572
|
-
success: parsed.success === true,
|
|
573
|
-
error: typeof parsed.error === 'string' ? parsed.error : undefined,
|
|
574
|
-
summary: typeof parsed.summary === 'string' ? parsed.summary : undefined,
|
|
575
|
-
};
|
|
576
|
-
}
|
|
577
|
-
catch {
|
|
578
|
-
return { success: false, error: 'Invalid JSON result' };
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
function removeTrailingUserMessage(runtime) {
|
|
582
|
-
const history = runtime.store.getSnapshot().conversationHistory;
|
|
583
|
-
if (history.length === 0)
|
|
584
|
-
return;
|
|
585
|
-
const lastMsg = history[history.length - 1];
|
|
586
|
-
if (lastMsg?.role === 'user') {
|
|
587
|
-
runtime.store.setState({ conversationHistory: history.slice(0, -1) });
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
function sessionToolResultSummary(message, toolCallsById) {
|
|
591
|
-
if (!message.toolCallId)
|
|
592
|
-
return null;
|
|
593
|
-
const call = toolCallsById.get(message.toolCallId);
|
|
594
|
-
if (!call)
|
|
595
|
-
return null;
|
|
596
|
-
const args = parseToolCallArgs(call.function.arguments);
|
|
597
|
-
const detail = compactToolArgs(args);
|
|
598
|
-
const parsed = parseSessionToolResult(message.content);
|
|
599
|
-
const firstLine = parsed.summary ||
|
|
600
|
-
`${parsed.success ? '✓' : '✗'} ${call.function.name}${detail ? ` ${detail}` : ''}`;
|
|
601
|
-
return parsed.error ? `${firstLine}\nError: ${parsed.error}` : firstLine;
|
|
602
|
-
}
|
|
603
|
-
function sessionMessagesToTranscriptEntries(sessionId, options = {}) {
|
|
604
|
-
const messages = (0, session_storage_1.loadSessionTranscriptMessages)(sessionId);
|
|
605
|
-
const resultTraces = options.includeToolOutputViews
|
|
606
|
-
? (0, session_storage_1.readSessionTraceEvents)(sessionId).filter(trace => trace.type === 'tool_result' && trace.callId)
|
|
607
|
-
: [];
|
|
608
|
-
const resultTraceByCallId = new Map(resultTraces.map(trace => [trace.callId, trace]));
|
|
609
|
-
const sequenceByCallId = new Map();
|
|
610
|
-
resultTraces.forEach((trace, index) => {
|
|
611
|
-
if (!sequenceByCallId.has(trace.callId))
|
|
612
|
-
sequenceByCallId.set(trace.callId, index + 1);
|
|
613
|
-
});
|
|
614
|
-
const entries = [];
|
|
615
|
-
const toolCallsById = new Map();
|
|
616
|
-
const completedToolCallIds = new Set();
|
|
617
|
-
let fallbackToolSequence = 0;
|
|
618
|
-
for (const message of messages) {
|
|
619
|
-
for (const call of message.tool_calls ?? []) {
|
|
620
|
-
toolCallsById.set(call.id, call);
|
|
621
|
-
}
|
|
622
|
-
if (message.role === 'tool' && message.toolCallId) {
|
|
623
|
-
completedToolCallIds.add(message.toolCallId);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
messages.forEach((message, index) => {
|
|
627
|
-
if (isSyntheticCompactContext(message.content))
|
|
628
|
-
return;
|
|
629
|
-
const idBase = `session-${sessionId.slice(0, 8)}-${index}`;
|
|
630
|
-
if (message.role === 'user') {
|
|
631
|
-
entries.push({ id: `${idBase}-user`, role: 'user', content: message.content });
|
|
632
|
-
return;
|
|
633
|
-
}
|
|
634
|
-
if (message.role === 'assistant') {
|
|
635
|
-
if (message.content?.trim()) {
|
|
636
|
-
entries.push({ id: `${idBase}-assistant`, role: 'assistant', content: message.content });
|
|
637
|
-
}
|
|
638
|
-
for (const summary of sessionToolCallSummaries(message)) {
|
|
639
|
-
if (!completedToolCallIds.has(summary.id)) {
|
|
640
|
-
entries.push({
|
|
641
|
-
id: `${idBase}-tool-call-${entries.length}`,
|
|
642
|
-
role: 'tool',
|
|
643
|
-
content: summary.content,
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
return;
|
|
648
|
-
}
|
|
649
|
-
if (message.role === 'tool') {
|
|
650
|
-
const summary = sessionToolResultSummary(message, toolCallsById);
|
|
651
|
-
const call = message.toolCallId ? toolCallsById.get(message.toolCallId) : undefined;
|
|
652
|
-
const trace = message.toolCallId ? resultTraceByCallId.get(message.toolCallId) : undefined;
|
|
653
|
-
const durable = (0, tool_serializer_1.parseToolResultEnvelope)(message.content);
|
|
654
|
-
const modelVisible = message.modelVisibleContent
|
|
655
|
-
? (0, tool_serializer_1.parseToolResultEnvelope)(message.modelVisibleContent)
|
|
656
|
-
: durable;
|
|
657
|
-
const durableOutput = typeof durable.output === 'string' ? durable.output : '';
|
|
658
|
-
const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
|
|
659
|
-
const outputBytes = trace?.outputBytes ??
|
|
660
|
-
(durable.schemaVersion === 1 ? durable.outputBytes : undefined) ??
|
|
661
|
-
Buffer.byteLength(durableOutput, 'utf8');
|
|
662
|
-
const artifactId = durable.artifactRef?.id ?? trace?.artifactId;
|
|
663
|
-
fallbackToolSequence += 1;
|
|
664
|
-
const sequence = message.toolCallId
|
|
665
|
-
? (sequenceByCallId.get(message.toolCallId) ?? fallbackToolSequence)
|
|
666
|
-
: fallbackToolSequence;
|
|
667
|
-
const outputView = options.includeToolOutputViews && call && message.toolCallId
|
|
668
|
-
? (0, tool_output_presentation_1.createToolOutputView)({
|
|
669
|
-
toolName: call.function.name,
|
|
670
|
-
success: durable.success,
|
|
671
|
-
summary: durable.summary,
|
|
672
|
-
rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
|
|
673
|
-
outputBytes,
|
|
674
|
-
artifactRef: artifactId ? { id: artifactId, outputBytes } : undefined,
|
|
675
|
-
callId: message.toolCallId,
|
|
676
|
-
sequence,
|
|
677
|
-
turnId: trace?.turnId,
|
|
678
|
-
policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
|
|
679
|
-
})
|
|
680
|
-
: undefined;
|
|
681
|
-
entries.push({
|
|
682
|
-
id: `${idBase}-tool`,
|
|
683
|
-
role: 'tool',
|
|
684
|
-
content: summary ??
|
|
685
|
-
(message.toolCallId
|
|
686
|
-
? `Tool result ${message.toolCallId}\n${message.content}`
|
|
687
|
-
: message.content),
|
|
688
|
-
toolActivity: call && message.toolCallId && outputView
|
|
689
|
-
? {
|
|
690
|
-
state: durable.success ? 'success' : 'error',
|
|
691
|
-
name: call.function.name,
|
|
692
|
-
detail: (0, session_storage_1.redactTraceText)(compactToolArgs(parseToolCallArgs(call.function.arguments))),
|
|
693
|
-
summary: durable.summary
|
|
694
|
-
? (0, session_storage_1.redactTraceText)(durable.summary.split(/\r?\n/u, 1)[0])
|
|
695
|
-
: undefined,
|
|
696
|
-
outputBytes,
|
|
697
|
-
body: (0, session_storage_1.redactTraceText)(durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput),
|
|
698
|
-
error: durable.error ? (0, session_storage_1.redactTraceText)(durable.error) : undefined,
|
|
699
|
-
duration: typeof trace?.duration === 'number' ? `${trace.duration}ms` : undefined,
|
|
700
|
-
seq: sequence,
|
|
701
|
-
artifactHint: artifactId ? `/artifacts show ${artifactId} --full` : undefined,
|
|
702
|
-
callId: message.toolCallId,
|
|
703
|
-
turnId: trace?.turnId,
|
|
704
|
-
outputView,
|
|
705
|
-
}
|
|
706
|
-
: undefined,
|
|
707
|
-
});
|
|
708
|
-
return;
|
|
709
|
-
}
|
|
710
|
-
if (message.role === 'system') {
|
|
711
|
-
entries.push({ id: `${idBase}-system`, role: 'system', content: message.content });
|
|
712
|
-
}
|
|
713
|
-
});
|
|
714
|
-
return entries;
|
|
715
|
-
}
|
|
716
|
-
function createAssistantStreamPresenter(events, abortSignal) {
|
|
717
|
-
let activeSegmentText = '';
|
|
718
|
-
let activeEntryId = null;
|
|
719
|
-
const ensureLiveEntry = () => {
|
|
720
|
-
if (abortSignal?.aborted || !activeSegmentText)
|
|
721
|
-
return null;
|
|
722
|
-
if (activeEntryId) {
|
|
723
|
-
events.update(activeEntryId, { content: activeSegmentText });
|
|
724
|
-
return activeEntryId;
|
|
725
|
-
}
|
|
726
|
-
activeEntryId = events.append({
|
|
727
|
-
role: 'assistant',
|
|
728
|
-
content: activeSegmentText,
|
|
729
|
-
live: true,
|
|
730
|
-
});
|
|
731
|
-
return activeEntryId;
|
|
732
|
-
};
|
|
733
|
-
const flushSegment = () => {
|
|
734
|
-
if (abortSignal?.aborted) {
|
|
735
|
-
if (activeEntryId)
|
|
736
|
-
events.remove(activeEntryId);
|
|
737
|
-
activeEntryId = null;
|
|
738
|
-
activeSegmentText = '';
|
|
739
|
-
return;
|
|
740
|
-
}
|
|
741
|
-
const entryId = ensureLiveEntry();
|
|
742
|
-
if (!entryId)
|
|
743
|
-
return;
|
|
744
|
-
events.finalize(entryId);
|
|
745
|
-
activeEntryId = null;
|
|
746
|
-
activeSegmentText = '';
|
|
747
|
-
};
|
|
748
|
-
return {
|
|
749
|
-
appendChunk(chunk) {
|
|
750
|
-
if (abortSignal?.aborted || !chunk)
|
|
751
|
-
return;
|
|
752
|
-
activeSegmentText += chunk;
|
|
753
|
-
ensureLiveEntry();
|
|
754
|
-
},
|
|
755
|
-
closeSegment() {
|
|
756
|
-
flushSegment();
|
|
757
|
-
},
|
|
758
|
-
discardSegment() {
|
|
759
|
-
if (activeEntryId)
|
|
760
|
-
events.remove(activeEntryId);
|
|
761
|
-
activeEntryId = null;
|
|
762
|
-
activeSegmentText = '';
|
|
763
|
-
},
|
|
764
|
-
ensureMessage(content) {
|
|
765
|
-
if (abortSignal?.aborted || !content || activeSegmentText.length > 0)
|
|
766
|
-
return;
|
|
767
|
-
activeSegmentText = content;
|
|
768
|
-
ensureLiveEntry();
|
|
769
|
-
},
|
|
770
|
-
replaceMessage(content) {
|
|
771
|
-
if (abortSignal?.aborted || !content)
|
|
772
|
-
return;
|
|
773
|
-
activeSegmentText = content;
|
|
774
|
-
ensureLiveEntry();
|
|
775
|
-
},
|
|
776
|
-
};
|
|
777
|
-
}
|
|
778
|
-
const goalTraceContext = new async_hooks_1.AsyncLocalStorage();
|
|
779
|
-
class LocalFastPathBlockedError extends Error {
|
|
780
|
-
constructor(message) {
|
|
781
|
-
super(message);
|
|
782
|
-
this.name = 'LocalFastPathBlockedError';
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
function parseLocalFastPath(input) {
|
|
786
|
-
const text = input.trim();
|
|
787
|
-
if (/^git\s+status$/i.test(text)) {
|
|
788
|
-
return { tool: 'git_status', args: {}, label: 'git status' };
|
|
789
|
-
}
|
|
790
|
-
const readMatch = /^(?:read|读取)\s+(.+)$/i.exec(text);
|
|
791
|
-
const readTarget = readMatch?.[1]?.trim();
|
|
792
|
-
const looksLikePath = Boolean(readTarget) &&
|
|
793
|
-
!/\s/.test(readTarget) &&
|
|
794
|
-
(/[/\\.]/.test(readTarget) || readTarget.startsWith('~'));
|
|
795
|
-
if (readTarget && looksLikePath) {
|
|
796
|
-
return { tool: 'read_file', args: { path: readTarget }, label: `read ${readTarget}` };
|
|
797
|
-
}
|
|
798
|
-
const grepMatch = /^(?:grep|搜索)\s+(.+)$/i.exec(text);
|
|
799
|
-
if (grepMatch?.[1]?.trim()) {
|
|
800
|
-
return {
|
|
801
|
-
tool: 'grep',
|
|
802
|
-
args: { pattern: grepMatch[1].trim() },
|
|
803
|
-
label: `grep ${grepMatch[1].trim()}`,
|
|
804
|
-
};
|
|
805
|
-
}
|
|
806
|
-
const runTestMatch = /^(?:run\s+test|运行测试)\s*[::]\s*(.+)$/i.exec(text);
|
|
807
|
-
if (runTestMatch?.[1]?.trim()) {
|
|
808
|
-
return {
|
|
809
|
-
tool: 'exec_command',
|
|
810
|
-
args: { command: runTestMatch[1].trim() },
|
|
811
|
-
label: `run test: ${runTestMatch[1].trim()}`,
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
return null;
|
|
815
|
-
}
|
|
816
|
-
function formatLocalFastPathAssistantContent(action, rawResult, projectPath) {
|
|
817
|
-
const envelope = (0, tool_serializer_1.parseToolResultEnvelope)(rawResult);
|
|
818
|
-
const rawOutput = typeof envelope.output === 'string' ? envelope.output : '';
|
|
819
|
-
const output = rawOutput.trim();
|
|
820
|
-
const summary = envelope.summary || `${action.tool} ${envelope.success ? 'completed' : 'failed'}`;
|
|
821
|
-
const lines = [
|
|
822
|
-
envelope.success
|
|
823
|
-
? `Local fast path completed ${action.label}.`
|
|
824
|
-
: `Local fast path failed ${action.label}.`,
|
|
825
|
-
'',
|
|
826
|
-
summary,
|
|
827
|
-
];
|
|
828
|
-
if (!envelope.success && envelope.error) {
|
|
829
|
-
lines.push(`Error: ${envelope.error}`);
|
|
830
|
-
}
|
|
831
|
-
if (!output) {
|
|
832
|
-
return { content: lines.join('\n'), artifactRef: envelope.artifactRef };
|
|
833
|
-
}
|
|
834
|
-
let artifactRef = envelope.artifactRef;
|
|
835
|
-
let preview = output;
|
|
836
|
-
const outputBytes = envelope.outputBytes ?? byteLength(rawOutput);
|
|
837
|
-
if (byteLength(rawOutput) > LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES) {
|
|
838
|
-
if (!artifactRef) {
|
|
839
|
-
const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, action.tool, rawOutput, outputBytes);
|
|
840
|
-
artifactRef = artifact ? { id: artifact.id, outputBytes: artifact.outputBytes } : undefined;
|
|
841
|
-
}
|
|
842
|
-
preview = (0, tool_artifacts_1.truncateForContext)(output, LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES);
|
|
843
|
-
}
|
|
844
|
-
if (artifactRef) {
|
|
845
|
-
lines.push('', `Full output: /artifacts show ${artifactRef.id} --full (${(0, format_1.formatBytes)(artifactRef.outputBytes)})`);
|
|
846
|
-
}
|
|
847
|
-
lines.push('', 'Preview:', preview);
|
|
848
|
-
return { content: lines.join('\n'), artifactRef };
|
|
849
|
-
}
|
|
850
|
-
function createToolEventPresenter(events, options = {}) {
|
|
851
|
-
const runningToolEntries = new Map();
|
|
852
|
-
let toolSequenceCounter = 0;
|
|
853
|
-
return {
|
|
854
|
-
start(event) {
|
|
855
|
-
const seq = ++toolSequenceCounter;
|
|
856
|
-
const entryId = events.append({
|
|
857
|
-
role: 'tool',
|
|
858
|
-
title: 'tool',
|
|
859
|
-
content: toolStartContent(event),
|
|
860
|
-
toolActivity: structuredToolStartActivity(event, seq),
|
|
861
|
-
});
|
|
862
|
-
runningToolEntries.set(event.callId, {
|
|
863
|
-
entryId,
|
|
864
|
-
name: event.name,
|
|
865
|
-
args: event.args,
|
|
866
|
-
sequence: seq,
|
|
867
|
-
batchCount: event.batchCount,
|
|
868
|
-
batchIndex: event.batchIndex,
|
|
869
|
-
});
|
|
870
|
-
events.toolStarted?.({
|
|
871
|
-
callId: event.callId,
|
|
872
|
-
name: event.name,
|
|
873
|
-
args: event.args,
|
|
874
|
-
sequence: seq,
|
|
875
|
-
batchCount: event.batchCount,
|
|
876
|
-
batchIndex: event.batchIndex,
|
|
877
|
-
});
|
|
878
|
-
},
|
|
879
|
-
finish(event) {
|
|
880
|
-
const content = toolFinishContent(event);
|
|
881
|
-
const stored = runningToolEntries.get(event.callId);
|
|
882
|
-
const seq = stored?.sequence ?? ++toolSequenceCounter;
|
|
883
|
-
const toolActivity = structuredToolFinishActivity(event, seq, options);
|
|
884
|
-
if (stored) {
|
|
885
|
-
events.finalize(stored.entryId, {
|
|
886
|
-
role: event.success ? 'tool' : 'error',
|
|
887
|
-
title: 'tool',
|
|
888
|
-
content,
|
|
889
|
-
toolActivity,
|
|
890
|
-
});
|
|
891
|
-
runningToolEntries.delete(event.callId);
|
|
892
|
-
}
|
|
893
|
-
else {
|
|
894
|
-
const entryId = events.append({
|
|
895
|
-
role: event.success ? 'tool' : 'error',
|
|
896
|
-
title: 'tool',
|
|
897
|
-
content,
|
|
898
|
-
toolActivity,
|
|
899
|
-
});
|
|
900
|
-
events.finalize(entryId);
|
|
901
|
-
}
|
|
902
|
-
events.toolFinished?.({
|
|
903
|
-
callId: event.callId,
|
|
904
|
-
name: event.name,
|
|
905
|
-
args: event.args,
|
|
906
|
-
success: event.success,
|
|
907
|
-
duration: event.duration,
|
|
908
|
-
summary: event.summary,
|
|
909
|
-
error: event.error,
|
|
910
|
-
outputBytes: event.outputBytes,
|
|
911
|
-
artifactRef: toolActivity.outputView?.detailRef?.artifactId
|
|
912
|
-
? {
|
|
913
|
-
id: toolActivity.outputView.detailRef.artifactId,
|
|
914
|
-
outputBytes: toolActivity.outputView.detailRef.outputBytes,
|
|
915
|
-
}
|
|
916
|
-
: event.artifactRef,
|
|
917
|
-
externalAssertion: event.externalAssertion,
|
|
918
|
-
sequence: seq,
|
|
919
|
-
batchCount: event.batchCount,
|
|
920
|
-
batchIndex: event.batchIndex,
|
|
921
|
-
});
|
|
922
|
-
},
|
|
923
|
-
finalizePendingAsSkipped(reason = 'permission denied') {
|
|
924
|
-
for (const [callId, entry] of runningToolEntries) {
|
|
925
|
-
events.finalize(entry.entryId, {
|
|
926
|
-
role: 'tool',
|
|
927
|
-
title: 'tool',
|
|
928
|
-
content: `Skipped · ${reason}`,
|
|
929
|
-
toolActivity: {
|
|
930
|
-
state: 'skipped',
|
|
931
|
-
name: entry.name,
|
|
932
|
-
detail: '',
|
|
933
|
-
body: '',
|
|
934
|
-
error: reason,
|
|
935
|
-
seq: entry.sequence,
|
|
936
|
-
},
|
|
937
|
-
});
|
|
938
|
-
events.toolFinished?.({
|
|
939
|
-
callId,
|
|
940
|
-
name: entry.name,
|
|
941
|
-
args: entry.args,
|
|
942
|
-
success: false,
|
|
943
|
-
skipped: true,
|
|
944
|
-
duration: 0,
|
|
945
|
-
error: reason,
|
|
946
|
-
sequence: entry.sequence,
|
|
947
|
-
batchCount: entry.batchCount,
|
|
948
|
-
batchIndex: entry.batchIndex,
|
|
949
|
-
});
|
|
950
|
-
}
|
|
951
|
-
runningToolEntries.clear();
|
|
952
|
-
},
|
|
953
|
-
};
|
|
954
|
-
}
|
|
955
|
-
async function captureConsoleOutput(fn) {
|
|
956
|
-
const lines = [];
|
|
957
|
-
const originalLog = console.log;
|
|
958
|
-
const originalError = console.error;
|
|
959
|
-
const originalWarn = console.warn;
|
|
960
|
-
const capture = (...args) => {
|
|
961
|
-
lines.push(stripAnsi(args.map(arg => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ')));
|
|
962
|
-
};
|
|
963
|
-
console.log = capture;
|
|
964
|
-
console.error = capture;
|
|
965
|
-
console.warn = capture;
|
|
966
|
-
try {
|
|
967
|
-
const result = await fn();
|
|
968
|
-
return { result, output: lines.join('\n').trim() };
|
|
969
|
-
}
|
|
970
|
-
finally {
|
|
971
|
-
console.log = originalLog;
|
|
972
|
-
console.error = originalError;
|
|
973
|
-
console.warn = originalWarn;
|
|
974
|
-
}
|
|
975
|
-
}
|
|
28
|
+
const observability_1 = require("../utils/observability");
|
|
29
|
+
const chat_trace_1 = require("./chat-trace");
|
|
30
|
+
const chat_checkpoint_1 = require("./chat-checkpoint");
|
|
31
|
+
const chat_workspace_1 = require("./chat-workspace");
|
|
32
|
+
const chat_presentation_1 = require("./chat-presentation");
|
|
33
|
+
var chat_presentation_2 = require("./chat-presentation");
|
|
34
|
+
Object.defineProperty(exports, "createAssistantStreamPresenter", { enumerable: true, get: function () { return chat_presentation_2.createAssistantStreamPresenter; } });
|
|
35
|
+
Object.defineProperty(exports, "createToolEventPresenter", { enumerable: true, get: function () { return chat_presentation_2.createToolEventPresenter; } });
|
|
36
|
+
Object.defineProperty(exports, "sessionMessagesToTranscriptEntries", { enumerable: true, get: function () { return chat_presentation_2.sessionMessagesToTranscriptEntries; } });
|
|
976
37
|
class AgentChatController {
|
|
977
38
|
setGoalCoordinator(coord) {
|
|
978
39
|
this.goalCoordinator = coord;
|
|
979
40
|
}
|
|
41
|
+
resolveToolAllowlist() {
|
|
42
|
+
const cwd = this.runtime.cwd;
|
|
43
|
+
if (this.toolAllowlistCache?.cwd !== cwd) {
|
|
44
|
+
this.toolAllowlistCache = { cwd, evaluator: (0, tool_allowlist_1.resolveProjectToolAllowlist)(cwd).evaluator };
|
|
45
|
+
}
|
|
46
|
+
return this.toolAllowlistCache.evaluator;
|
|
47
|
+
}
|
|
980
48
|
constructor(runtime, events, controllerOptions = {}) {
|
|
981
49
|
this.runtime = runtime;
|
|
982
50
|
this.events = events;
|
|
@@ -1002,7 +70,7 @@ class AgentChatController {
|
|
|
1002
70
|
});
|
|
1003
71
|
const parsed = (0, parser_1.parseInput)(text);
|
|
1004
72
|
if (!parsed.isCommand) {
|
|
1005
|
-
const localFastPath = parseLocalFastPath(text);
|
|
73
|
+
const localFastPath = (0, chat_presentation_1.parseLocalFastPath)(text);
|
|
1006
74
|
if (localFastPath) {
|
|
1007
75
|
await this.runLocalFastPath(text, localFastPath, options);
|
|
1008
76
|
return;
|
|
@@ -1065,7 +133,7 @@ class AgentChatController {
|
|
|
1065
133
|
let result;
|
|
1066
134
|
let output;
|
|
1067
135
|
try {
|
|
1068
|
-
({ result, output } = await captureConsoleOutput(() => command.execute(ctx, parsed.args)));
|
|
136
|
+
({ result, output } = await (0, chat_presentation_1.captureConsoleOutput)(() => command.execute(ctx, parsed.args)));
|
|
1069
137
|
}
|
|
1070
138
|
finally {
|
|
1071
139
|
unsubscribeCommandUsage?.();
|
|
@@ -1075,7 +143,7 @@ class AgentChatController {
|
|
|
1075
143
|
}
|
|
1076
144
|
const providerRequests = Math.max(commandProviderAttempts, commandUsageEvents);
|
|
1077
145
|
if (providerRequests > 0) {
|
|
1078
|
-
const diagnostics = getLastRequestDiagnostics(this.runtime.llm);
|
|
146
|
+
const diagnostics = (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm);
|
|
1079
147
|
const retryCount = diagnostics?.retryCount ?? 0;
|
|
1080
148
|
const fallbackCount = diagnostics?.fallbackTriggered ? 1 : 0;
|
|
1081
149
|
this.setLoopStats({
|
|
@@ -1130,6 +198,10 @@ class AgentChatController {
|
|
|
1130
198
|
this.events.showSessionPicker(result.sessionPicker);
|
|
1131
199
|
return;
|
|
1132
200
|
}
|
|
201
|
+
if (result.modelPicker) {
|
|
202
|
+
this.events.showModelPicker?.(result.modelPicker);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
1133
205
|
if (result.editPreview) {
|
|
1134
206
|
this.events.showEditPreview(result.editPreview);
|
|
1135
207
|
return;
|
|
@@ -1150,7 +222,7 @@ class AgentChatController {
|
|
|
1150
222
|
await run();
|
|
1151
223
|
return;
|
|
1152
224
|
}
|
|
1153
|
-
await goalTraceContext.run({
|
|
225
|
+
await chat_trace_1.goalTraceContext.run({
|
|
1154
226
|
goalId: request.goal.goalId,
|
|
1155
227
|
goalRevision: request.goal.revision,
|
|
1156
228
|
goalInputKind: request.inputKind,
|
|
@@ -1162,30 +234,35 @@ class AgentChatController {
|
|
|
1162
234
|
this.runtime.ensureSession() ??
|
|
1163
235
|
(0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
|
|
1164
236
|
const sessionId = activeSession?.id;
|
|
1165
|
-
const turnId = traceTurnId(options.turnId);
|
|
237
|
+
const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
|
|
238
|
+
(0, observability_1.setDiagnosticTraceContext)({
|
|
239
|
+
traceId: `${sessionId ?? 'local'}:${turnId}`,
|
|
240
|
+
...(sessionId ? { sessionId } : {}),
|
|
241
|
+
turnId,
|
|
242
|
+
});
|
|
1166
243
|
const localCallId = `local-${turnId}`;
|
|
1167
244
|
const start = Date.now();
|
|
1168
245
|
const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
|
|
1169
|
-
const traceArgs = buildTraceArgsDetails(this.runtime.cwd, action.tool, action.args);
|
|
246
|
+
const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, action.tool, action.args);
|
|
1170
247
|
if (sessionId) {
|
|
1171
248
|
(0, session_storage_1.appendSessionMessage)(sessionId, {
|
|
1172
249
|
role: 'user',
|
|
1173
250
|
content: input,
|
|
1174
251
|
timestamp: Date.now(),
|
|
1175
252
|
});
|
|
1176
|
-
recordTraceEvent(this.events, sessionId, {
|
|
253
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1177
254
|
turnId,
|
|
1178
255
|
type: 'turn_start',
|
|
1179
|
-
inputBytes: byteLength(input),
|
|
256
|
+
inputBytes: (0, chat_trace_1.byteLength)(input),
|
|
1180
257
|
localFastPathUsed: true,
|
|
1181
258
|
});
|
|
1182
|
-
appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
1183
|
-
recordTraceEvent(this.events, sessionId, {
|
|
259
|
+
(0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
260
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1184
261
|
turnId,
|
|
1185
262
|
type: 'local_fast_path',
|
|
1186
263
|
name: action.tool,
|
|
1187
264
|
...traceArgs,
|
|
1188
|
-
note: compactMiddle(action.label, 160),
|
|
265
|
+
note: (0, chat_trace_1.compactMiddle)(action.label, 160),
|
|
1189
266
|
});
|
|
1190
267
|
}
|
|
1191
268
|
if (options.persistAsUserMessage !== false) {
|
|
@@ -1206,13 +283,13 @@ class AgentChatController {
|
|
|
1206
283
|
const permission = tool?.checkPermissions?.(action.args, toolContext);
|
|
1207
284
|
if (permission?.behavior === 'deny' || tool?.isDestructive?.(action.args) === true) {
|
|
1208
285
|
const reason = permission?.reason || 'Local fast path blocked a destructive tool request.';
|
|
1209
|
-
throw new LocalFastPathBlockedError(reason);
|
|
286
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(reason);
|
|
1210
287
|
}
|
|
1211
288
|
if (permission?.behavior === 'ask') {
|
|
1212
|
-
throw new LocalFastPathBlockedError(permission.reason || 'Local fast path requires an allow-safe command.');
|
|
289
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(permission.reason || 'Local fast path requires an allow-safe command.');
|
|
1213
290
|
}
|
|
1214
291
|
if (sessionId) {
|
|
1215
|
-
recordTraceEvent(this.events, sessionId, {
|
|
292
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1216
293
|
turnId,
|
|
1217
294
|
type: 'tool_call',
|
|
1218
295
|
name: action.tool,
|
|
@@ -1230,7 +307,7 @@ class AgentChatController {
|
|
|
1230
307
|
const outputBytes = typeof envelope.outputBytes === 'number'
|
|
1231
308
|
? envelope.outputBytes
|
|
1232
309
|
: Buffer.byteLength(result, 'utf8');
|
|
1233
|
-
const formattedLocalResult = formatLocalFastPathAssistantContent(action, result, this.runtime.cwd);
|
|
310
|
+
const formattedLocalResult = (0, chat_presentation_1.formatLocalFastPathAssistantContent)(action, result, this.runtime.cwd);
|
|
1234
311
|
const assistantContent = formattedLocalResult.content;
|
|
1235
312
|
const stats = (0, framework_1.createLocalFastPathLoopStats)({
|
|
1236
313
|
finishReason: envelope.success ? 'completed' : 'failed',
|
|
@@ -1258,8 +335,8 @@ class AgentChatController {
|
|
|
1258
335
|
this.events.append({
|
|
1259
336
|
role: envelope.success ? 'tool' : 'error',
|
|
1260
337
|
title: 'local',
|
|
1261
|
-
content: toolFinishContent(localToolResultEvent),
|
|
1262
|
-
toolActivity: structuredToolFinishActivity(localToolResultEvent, 1, {
|
|
338
|
+
content: (0, chat_presentation_1.toolFinishContent)(localToolResultEvent),
|
|
339
|
+
toolActivity: (0, chat_presentation_1.structuredToolFinishActivity)(localToolResultEvent, 1, {
|
|
1263
340
|
projectPath: this.runtime.cwd,
|
|
1264
341
|
turnId,
|
|
1265
342
|
}),
|
|
@@ -1267,7 +344,7 @@ class AgentChatController {
|
|
|
1267
344
|
this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
|
|
1268
345
|
this.setLoopStats(stats);
|
|
1269
346
|
if (sessionId) {
|
|
1270
|
-
recordTraceEvent(this.events, sessionId, {
|
|
347
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1271
348
|
turnId,
|
|
1272
349
|
type: 'tool_result',
|
|
1273
350
|
name: action.tool,
|
|
@@ -1280,10 +357,10 @@ class AgentChatController {
|
|
|
1280
357
|
outputBytes,
|
|
1281
358
|
modelVisibleBytes: 0,
|
|
1282
359
|
artifactId: formattedLocalResult.artifactRef?.id,
|
|
1283
|
-
error: envelope.error ? compactMiddle(envelope.error, 240) : undefined,
|
|
360
|
+
error: envelope.error ? (0, chat_trace_1.compactMiddle)(envelope.error, 240) : undefined,
|
|
1284
361
|
});
|
|
1285
|
-
appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
1286
|
-
recordTraceEvent(this.events, sessionId, {
|
|
362
|
+
(0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
363
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1287
364
|
turnId,
|
|
1288
365
|
type: 'complete',
|
|
1289
366
|
finishReason: stats.finishReason,
|
|
@@ -1311,21 +388,21 @@ class AgentChatController {
|
|
|
1311
388
|
this.events.setStatus('Local command failed. Ready for the next input.');
|
|
1312
389
|
const assistantContent = `Local fast path failed for ${action.label}.\n\n${message}`;
|
|
1313
390
|
this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
|
|
1314
|
-
const finishReason = error instanceof LocalFastPathBlockedError ? 'blocked' : 'failed';
|
|
391
|
+
const finishReason = error instanceof chat_presentation_1.LocalFastPathBlockedError ? 'blocked' : 'failed';
|
|
1315
392
|
const stats = (0, framework_1.createLocalFastPathLoopStats)({
|
|
1316
393
|
finishReason,
|
|
1317
394
|
toolCalls: 0,
|
|
1318
395
|
});
|
|
1319
396
|
this.setLoopStats(stats);
|
|
1320
397
|
if (sessionId) {
|
|
1321
|
-
recordTraceEvent(this.events, sessionId, {
|
|
398
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1322
399
|
turnId,
|
|
1323
400
|
type: 'error',
|
|
1324
401
|
name: action.tool,
|
|
1325
|
-
error: compactTraceError(error),
|
|
402
|
+
error: (0, chat_trace_1.compactTraceError)(error),
|
|
1326
403
|
});
|
|
1327
|
-
appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
1328
|
-
recordTraceEvent(this.events, sessionId, {
|
|
404
|
+
(0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
405
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1329
406
|
turnId,
|
|
1330
407
|
type: 'complete',
|
|
1331
408
|
finishReason: stats.finishReason,
|
|
@@ -1356,7 +433,7 @@ class AgentChatController {
|
|
|
1356
433
|
setSession: session => {
|
|
1357
434
|
this.runtime.setSession(session);
|
|
1358
435
|
const renderer = this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal';
|
|
1359
|
-
this.events.replaceTranscript(sessionMessagesToTranscriptEntries(session.id, {
|
|
436
|
+
this.events.replaceTranscript((0, chat_presentation_1.sessionMessagesToTranscriptEntries)(session.id, {
|
|
1360
437
|
includeToolOutputViews: renderer === 'tui',
|
|
1361
438
|
}));
|
|
1362
439
|
},
|
|
@@ -1411,7 +488,7 @@ class AgentChatController {
|
|
|
1411
488
|
if (sessionId) {
|
|
1412
489
|
const traceType = stateToTraceType[event.state];
|
|
1413
490
|
if (traceType) {
|
|
1414
|
-
recordTraceEvent(this.events, sessionId, {
|
|
491
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1415
492
|
turnId: String(turnId),
|
|
1416
493
|
type: traceType,
|
|
1417
494
|
name: `${event.role}:${event.taskId}`,
|
|
@@ -1489,11 +566,16 @@ class AgentChatController {
|
|
|
1489
566
|
// any provider request so failures without usage cannot inherit stale data.
|
|
1490
567
|
this.runtime.store.setState({ tokenUsage: null });
|
|
1491
568
|
const abortSignal = options.abortSignal;
|
|
1492
|
-
const turnId = traceTurnId(options.turnId);
|
|
569
|
+
const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
|
|
1493
570
|
const activeSession = this.runtime.getSession() ??
|
|
1494
571
|
this.runtime.ensureSession() ??
|
|
1495
572
|
(0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
|
|
1496
573
|
const sessionId = activeSession?.id;
|
|
574
|
+
(0, observability_1.setDiagnosticTraceContext)({
|
|
575
|
+
traceId: `${sessionId ?? 'unsaved'}:${turnId}`,
|
|
576
|
+
...(sessionId ? { sessionId } : {}),
|
|
577
|
+
turnId,
|
|
578
|
+
});
|
|
1497
579
|
const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
|
|
1498
580
|
const runtimeTools = (0, tools_1.getRuntimeTools)();
|
|
1499
581
|
const skillResolution = (0, skills_1.resolveSkillsForTurn)({
|
|
@@ -1511,13 +593,13 @@ class AgentChatController {
|
|
|
1511
593
|
timestamp: Date.now(),
|
|
1512
594
|
appliedSkills: appliedSkillNames.length > 0 ? appliedSkillNames : undefined,
|
|
1513
595
|
});
|
|
1514
|
-
recordTraceEvent(this.events, sessionId, {
|
|
596
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1515
597
|
turnId,
|
|
1516
598
|
type: 'turn_start',
|
|
1517
|
-
inputBytes: byteLength(input),
|
|
599
|
+
inputBytes: (0, chat_trace_1.byteLength)(input),
|
|
1518
600
|
note: appliedSkillNames.length > 0 ? `skills=${appliedSkillNames.join(',')}` : undefined,
|
|
1519
601
|
});
|
|
1520
|
-
appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
602
|
+
(0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
1521
603
|
}
|
|
1522
604
|
if (options.persistAsUserMessage !== false) {
|
|
1523
605
|
this.runtime.store.addMessage({ role: 'user', content: input });
|
|
@@ -1564,8 +646,8 @@ class AgentChatController {
|
|
|
1564
646
|
onSubtaskEvent: event => {
|
|
1565
647
|
this.handleSubtaskEvent(event, sessionId, turnId);
|
|
1566
648
|
},
|
|
1567
|
-
onSubtaskResult: (result, _batchId) => {
|
|
1568
|
-
if (!projectPath
|
|
649
|
+
onSubtaskResult: (result, _batchId, objective, researchContext) => {
|
|
650
|
+
if (!projectPath)
|
|
1569
651
|
return;
|
|
1570
652
|
const json = JSON.stringify(result);
|
|
1571
653
|
const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `subtask_${result.role}`, json, Buffer.byteLength(json, 'utf8'));
|
|
@@ -1574,7 +656,7 @@ class AgentChatController {
|
|
|
1574
656
|
// The subtask state transition (subtask_completed) is already
|
|
1575
657
|
// emitted by handleSubtaskEvent above.
|
|
1576
658
|
if (sessionId) {
|
|
1577
|
-
recordTraceEvent(this.events, sessionId, {
|
|
659
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1578
660
|
turnId: String(turnId),
|
|
1579
661
|
type: 'subtask_artifact_stored',
|
|
1580
662
|
name: `${result.role}:${result.id}`,
|
|
@@ -1584,6 +666,74 @@ class AgentChatController {
|
|
|
1584
666
|
});
|
|
1585
667
|
}
|
|
1586
668
|
}
|
|
669
|
+
// v0.1.4 Research-to-Evidence integration: normalize every
|
|
670
|
+
// terminal research result (including partial/failure states),
|
|
671
|
+
// persist it under a packet-specific CAS scope, and forward the
|
|
672
|
+
// canonical lifecycle stream to every renderer.
|
|
673
|
+
if (result.role !== 'research' || !sessionId)
|
|
674
|
+
return;
|
|
675
|
+
try {
|
|
676
|
+
const goal = this.goalCoordinator?.goal;
|
|
677
|
+
const objectiveRevision = goal?.contract?.objectiveRevision;
|
|
678
|
+
const hasGoalBinding = typeof goal?.goalId === 'string' && typeof objectiveRevision === 'number';
|
|
679
|
+
// Preserve the authoritative request produced from the
|
|
680
|
+
// original subtask capability. Reconstruct local-only only for
|
|
681
|
+
// legacy callers that predate the additive callback context.
|
|
682
|
+
const baseRequest = researchContext?.request ??
|
|
683
|
+
(0, subagents_1.createLocalResearchRequest)(objective?.trim() || result.summary || 'repository research', projectPath);
|
|
684
|
+
const request = {
|
|
685
|
+
...baseRequest,
|
|
686
|
+
scope: { ...baseRequest.scope, projectRoot: projectPath },
|
|
687
|
+
...(hasGoalBinding
|
|
688
|
+
? {
|
|
689
|
+
goalBinding: {
|
|
690
|
+
goalId: goal.goalId,
|
|
691
|
+
objectiveRevision,
|
|
692
|
+
},
|
|
693
|
+
}
|
|
694
|
+
: {}),
|
|
695
|
+
};
|
|
696
|
+
const packet = (0, subagents_1.subtaskResultToPacket)(result, request, {
|
|
697
|
+
projectPath,
|
|
698
|
+
sessionId,
|
|
699
|
+
...(hasGoalBinding ? { goalId: goal.goalId, objectiveRevision } : {}),
|
|
700
|
+
}, {
|
|
701
|
+
externalSources: researchContext?.web?.sources,
|
|
702
|
+
externalNotes: researchContext?.web?.notes,
|
|
703
|
+
externalTimedOut: researchContext?.web?.timedOut,
|
|
704
|
+
externalAborted: researchContext?.web?.aborted,
|
|
705
|
+
});
|
|
706
|
+
// Citation resolution can downgrade claims and mark superseded
|
|
707
|
+
// same-URL sources stale. Resolve before validation/persistence so
|
|
708
|
+
// the CAS token, durable packet and renderer view describe the
|
|
709
|
+
// exact same final state (#105).
|
|
710
|
+
const resolution = (0, subagents_1.resolveCitations)(packet);
|
|
711
|
+
const validation = (0, subagents_1.validatePacket)(packet);
|
|
712
|
+
if (!validation.ok)
|
|
713
|
+
return;
|
|
714
|
+
const saved = (0, subagents_1.saveResearchPacket)((0, subagents_1.createFileArtifactStore)(projectPath), packet, {
|
|
715
|
+
projectPath,
|
|
716
|
+
sessionId,
|
|
717
|
+
packetId: packet.packetId,
|
|
718
|
+
...(packet.goalId ? { goalId: packet.goalId } : {}),
|
|
719
|
+
});
|
|
720
|
+
const view = (0, subagents_1.buildResearchView)(packet, resolution);
|
|
721
|
+
for (const event of (0, subagents_1.toLifecycleEvents)(view, resolution)) {
|
|
722
|
+
this.events.researchEvent?.(event);
|
|
723
|
+
}
|
|
724
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
725
|
+
turnId: String(turnId),
|
|
726
|
+
type: 'subtask_artifact_stored',
|
|
727
|
+
name: `research:${packet.packetId}`,
|
|
728
|
+
argsSummary: `${view.stage}/${view.auditStatus}: ${packet.summary}`.slice(0, 200),
|
|
729
|
+
argsArtifactId: `research-${saved.casToken.slice(0, 16)}`,
|
|
730
|
+
argsBytes: Buffer.byteLength(JSON.stringify(packet), 'utf8'),
|
|
731
|
+
});
|
|
732
|
+
}
|
|
733
|
+
catch {
|
|
734
|
+
// Research persistence/rendering is observational. A storage
|
|
735
|
+
// failure must not alter the child result or root turn state.
|
|
736
|
+
}
|
|
1587
737
|
},
|
|
1588
738
|
// R6: wire live permission state so the subagent policy gate can
|
|
1589
739
|
// prevent background delegation while the user is deciding a tool
|
|
@@ -1628,8 +778,8 @@ class AgentChatController {
|
|
|
1628
778
|
let pendingCompact;
|
|
1629
779
|
const verificationResults = [];
|
|
1630
780
|
const sessionMessagesToRecord = [];
|
|
1631
|
-
const assistantStream = createAssistantStreamPresenter(this.events, abortSignal);
|
|
1632
|
-
const toolEvents = createToolEventPresenter(this.events, {
|
|
781
|
+
const assistantStream = (0, chat_presentation_1.createAssistantStreamPresenter)(this.events, abortSignal);
|
|
782
|
+
const toolEvents = (0, chat_presentation_1.createToolEventPresenter)(this.events, {
|
|
1633
783
|
projectPath: this.runtime.cwd,
|
|
1634
784
|
turnId,
|
|
1635
785
|
});
|
|
@@ -1669,6 +819,10 @@ class AgentChatController {
|
|
|
1669
819
|
},
|
|
1670
820
|
sessionId,
|
|
1671
821
|
turnId,
|
|
822
|
+
// Tools that fan out to other tools (batch_read) have to re-run the
|
|
823
|
+
// permission gate per sub-step; they need the mode and the allowlist.
|
|
824
|
+
permissionMode: snapshot.permissionMode,
|
|
825
|
+
toolAllowlist: this.resolveToolAllowlist(),
|
|
1672
826
|
});
|
|
1673
827
|
};
|
|
1674
828
|
const loopBudget = (0, loop_budget_1.resolveRuntimeLoopBudget)(input, this.runtime.config, harness.toJSON());
|
|
@@ -1709,6 +863,7 @@ class AgentChatController {
|
|
|
1709
863
|
costTracker: snapshot.costTracker,
|
|
1710
864
|
permissionMode: snapshot.permissionMode,
|
|
1711
865
|
toolConfirmation: this.runtime.config.toolConfirmation,
|
|
866
|
+
toolAllowlist: this.resolveToolAllowlist(),
|
|
1712
867
|
confirmToolUse: this.controllerOptions.confirmToolUse,
|
|
1713
868
|
toolContext: {
|
|
1714
869
|
cwd: this.runtime.cwd,
|
|
@@ -1735,7 +890,7 @@ class AgentChatController {
|
|
|
1735
890
|
assistantStream.discardSegment();
|
|
1736
891
|
this.events.setStatus((0, agent_status_1.agentStepStatus)(event.turn));
|
|
1737
892
|
if (sessionId) {
|
|
1738
|
-
recordTraceEvent(this.events, sessionId, {
|
|
893
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1739
894
|
turnId,
|
|
1740
895
|
type: 'request_start',
|
|
1741
896
|
model: event.model,
|
|
@@ -1745,7 +900,7 @@ class AgentChatController {
|
|
|
1745
900
|
break;
|
|
1746
901
|
case 'prompt_assembly':
|
|
1747
902
|
if (sessionId) {
|
|
1748
|
-
recordTraceEvent(this.events, sessionId, {
|
|
903
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1749
904
|
turnId,
|
|
1750
905
|
type: 'prompt_assembly',
|
|
1751
906
|
promptModelId: event.modelId,
|
|
@@ -1769,7 +924,7 @@ class AgentChatController {
|
|
|
1769
924
|
{
|
|
1770
925
|
const batchReadOnlyCount = event.toolCalls.filter(tc => {
|
|
1771
926
|
const def = skillResolution.tools.find(t => t.name === tc.function.name);
|
|
1772
|
-
const args = parseToolCallArgsForRuntime(tc);
|
|
927
|
+
const args = (0, chat_checkpoint_1.parseToolCallArgsForRuntime)(tc);
|
|
1773
928
|
return args && def?.isReadOnly?.(args) === true;
|
|
1774
929
|
}).length;
|
|
1775
930
|
const suggestion = (0, agent_status_1.batchingSuggestion)(batchReadOnlyCount);
|
|
@@ -1777,8 +932,8 @@ class AgentChatController {
|
|
|
1777
932
|
this.events.append({ role: 'status', content: suggestion });
|
|
1778
933
|
}
|
|
1779
934
|
}
|
|
1780
|
-
const checkpointId =
|
|
1781
|
-
const checkpointResult = createPreToolCheckpoint(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
|
|
935
|
+
const checkpointId = `${turnId}-${checkpointSequence + 1}-${(0, crypto_1.randomUUID)()}`;
|
|
936
|
+
const checkpointResult = (0, chat_checkpoint_1.createPreToolCheckpoint)(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
|
|
1782
937
|
if (checkpointResult.created) {
|
|
1783
938
|
checkpointIds.push(checkpointId);
|
|
1784
939
|
checkpointSequence++;
|
|
@@ -1800,11 +955,11 @@ class AgentChatController {
|
|
|
1800
955
|
});
|
|
1801
956
|
}
|
|
1802
957
|
if (sessionId) {
|
|
1803
|
-
recordTraceEvent(this.events, sessionId, {
|
|
958
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1804
959
|
turnId,
|
|
1805
960
|
type: 'assistant_tool_calls',
|
|
1806
961
|
toolCallCount: event.toolCalls.length,
|
|
1807
|
-
contentBytes: byteLength(event.content || ''),
|
|
962
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
|
|
1808
963
|
});
|
|
1809
964
|
}
|
|
1810
965
|
sessionMessagesToRecord.push({
|
|
@@ -1828,8 +983,8 @@ class AgentChatController {
|
|
|
1828
983
|
assistantStream.closeSegment();
|
|
1829
984
|
toolEvents.start(event);
|
|
1830
985
|
if (sessionId) {
|
|
1831
|
-
const traceArgs = buildTraceArgsDetails(this.runtime.cwd, event.name, event.args);
|
|
1832
|
-
recordTraceEvent(this.events, sessionId, {
|
|
986
|
+
const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, event.name, event.args);
|
|
987
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1833
988
|
turnId,
|
|
1834
989
|
type: 'tool_call',
|
|
1835
990
|
name: event.name,
|
|
@@ -1842,17 +997,17 @@ class AgentChatController {
|
|
|
1842
997
|
break;
|
|
1843
998
|
case 'permission_decision':
|
|
1844
999
|
if (sessionId) {
|
|
1845
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1000
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1846
1001
|
turnId,
|
|
1847
1002
|
type: 'permission_decision',
|
|
1848
1003
|
name: event.name,
|
|
1849
1004
|
callId: event.callId,
|
|
1850
|
-
argsSummary: compactToolArgs(event.args),
|
|
1005
|
+
argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
|
|
1851
1006
|
permissionBehavior: event.decision.behavior,
|
|
1852
1007
|
permissionApproved: event.decision.approved,
|
|
1853
1008
|
permissionSource: event.decision.source,
|
|
1854
1009
|
permissionReason: event.decision.reason
|
|
1855
|
-
? compactMiddle(event.decision.reason, 240)
|
|
1010
|
+
? (0, chat_trace_1.compactMiddle)(event.decision.reason, 240)
|
|
1856
1011
|
: undefined,
|
|
1857
1012
|
permissionDuration: event.decision.duration,
|
|
1858
1013
|
batchCount: event.batchCount,
|
|
@@ -1861,22 +1016,22 @@ class AgentChatController {
|
|
|
1861
1016
|
}
|
|
1862
1017
|
break;
|
|
1863
1018
|
case 'tool_result': {
|
|
1864
|
-
observedToolResultBytes += event.outputBytes ?? byteLength(event.result);
|
|
1865
|
-
observedModelVisibleToolBytes += byteLength(event.modelVisibleResult);
|
|
1019
|
+
observedToolResultBytes += event.outputBytes ?? (0, chat_trace_1.byteLength)(event.result);
|
|
1020
|
+
observedModelVisibleToolBytes += (0, chat_trace_1.byteLength)(event.modelVisibleResult);
|
|
1866
1021
|
toolEvents.finish(event);
|
|
1867
1022
|
if (sessionId) {
|
|
1868
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1023
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1869
1024
|
turnId,
|
|
1870
1025
|
type: 'tool_result',
|
|
1871
1026
|
name: event.name,
|
|
1872
1027
|
callId: event.callId,
|
|
1873
|
-
argsSummary: compactToolArgs(event.args),
|
|
1028
|
+
argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
|
|
1874
1029
|
success: event.success,
|
|
1875
1030
|
duration: event.duration,
|
|
1876
1031
|
outputBytes: event.outputBytes,
|
|
1877
|
-
modelVisibleBytes: byteLength(event.modelVisibleResult),
|
|
1032
|
+
modelVisibleBytes: (0, chat_trace_1.byteLength)(event.modelVisibleResult),
|
|
1878
1033
|
artifactId: event.artifactRef?.id,
|
|
1879
|
-
error: event.error ? compactMiddle(event.error, 240) : undefined,
|
|
1034
|
+
error: event.error ? (0, chat_trace_1.compactMiddle)(event.error, 240) : undefined,
|
|
1880
1035
|
batchCount: event.batchCount,
|
|
1881
1036
|
batchIndex: event.batchIndex,
|
|
1882
1037
|
});
|
|
@@ -1890,7 +1045,7 @@ class AgentChatController {
|
|
|
1890
1045
|
});
|
|
1891
1046
|
if (verificationResult) {
|
|
1892
1047
|
verificationResults.push(verificationResult);
|
|
1893
|
-
appendVerificationResultTrace(this.events, sessionId, turnId, verificationResult);
|
|
1048
|
+
(0, chat_workspace_1.appendVerificationResultTrace)(this.events, sessionId, turnId, verificationResult);
|
|
1894
1049
|
}
|
|
1895
1050
|
sessionMessagesToRecord.push({
|
|
1896
1051
|
role: 'tool',
|
|
@@ -1904,10 +1059,10 @@ class AgentChatController {
|
|
|
1904
1059
|
case 'strategy_exhausted':
|
|
1905
1060
|
this.events.append({ role: 'status', content: event.suggestion });
|
|
1906
1061
|
if (sessionId) {
|
|
1907
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1062
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1908
1063
|
turnId,
|
|
1909
1064
|
type: 'strategy_exhausted',
|
|
1910
|
-
note: compactMiddle(event.suggestion, 240),
|
|
1065
|
+
note: (0, chat_trace_1.compactMiddle)(event.suggestion, 240),
|
|
1911
1066
|
});
|
|
1912
1067
|
}
|
|
1913
1068
|
break;
|
|
@@ -1923,10 +1078,10 @@ class AgentChatController {
|
|
|
1923
1078
|
finalContent = event.content;
|
|
1924
1079
|
assistantStream.ensureMessage(event.content);
|
|
1925
1080
|
if (sessionId) {
|
|
1926
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1081
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1927
1082
|
turnId,
|
|
1928
1083
|
type: 'message',
|
|
1929
|
-
contentBytes: byteLength(event.content),
|
|
1084
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content),
|
|
1930
1085
|
});
|
|
1931
1086
|
}
|
|
1932
1087
|
if (event.content) {
|
|
@@ -1960,12 +1115,12 @@ class AgentChatController {
|
|
|
1960
1115
|
pendingCompact = event.compact;
|
|
1961
1116
|
if (event.stats) {
|
|
1962
1117
|
pendingCompleteStats = event.stats;
|
|
1963
|
-
recordProviderTraceEvents(this.events, sessionId, turnId, event.stats);
|
|
1118
|
+
(0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, event.stats);
|
|
1964
1119
|
pendingCompleteTrace = {
|
|
1965
1120
|
turnId,
|
|
1966
1121
|
type: 'complete',
|
|
1967
1122
|
model: event.model,
|
|
1968
|
-
contentBytes: byteLength(event.content || ''),
|
|
1123
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
|
|
1969
1124
|
finishReason: event.stats.finishReason,
|
|
1970
1125
|
llmRequests: event.stats.llmRequests,
|
|
1971
1126
|
toolCalls: event.stats.toolCalls,
|
|
@@ -1989,7 +1144,7 @@ class AgentChatController {
|
|
|
1989
1144
|
turnId,
|
|
1990
1145
|
type: 'complete',
|
|
1991
1146
|
model: event.model,
|
|
1992
|
-
contentBytes: byteLength(event.content || ''),
|
|
1147
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
|
|
1993
1148
|
};
|
|
1994
1149
|
}
|
|
1995
1150
|
break;
|
|
@@ -2000,7 +1155,7 @@ class AgentChatController {
|
|
|
2000
1155
|
const stats = pendingCompleteStats ??
|
|
2001
1156
|
(0, framework_1.createFailedLoopStats)({
|
|
2002
1157
|
loopBudget,
|
|
2003
|
-
diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
|
|
1158
|
+
diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
|
|
2004
1159
|
turnsStarted: observedTurnsStarted,
|
|
2005
1160
|
llmRequests: observedLlmRequests,
|
|
2006
1161
|
toolCalls: observedToolCalls,
|
|
@@ -2012,16 +1167,16 @@ class AgentChatController {
|
|
|
2012
1167
|
persistInterruptedAccounting(finalUsage, stats, finalUsage !== undefined || stats.llmRequests === 0);
|
|
2013
1168
|
assistantStream.discardSegment();
|
|
2014
1169
|
this.events.setStatus('Interrupted.');
|
|
2015
|
-
removeTrailingUserMessage(this.runtime);
|
|
1170
|
+
(0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
|
|
2016
1171
|
if (sessionId) {
|
|
2017
|
-
const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2018
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1172
|
+
const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1173
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2019
1174
|
turnId,
|
|
2020
1175
|
type: 'aborted',
|
|
2021
1176
|
note: 'aborted_after_query',
|
|
2022
1177
|
});
|
|
2023
|
-
const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
|
|
2024
|
-
? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
|
|
1178
|
+
const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
|
|
1179
|
+
? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
|
|
2025
1180
|
: undefined;
|
|
2026
1181
|
if (recoveryNotice) {
|
|
2027
1182
|
this.events.append({
|
|
@@ -2042,15 +1197,15 @@ class AgentChatController {
|
|
|
2042
1197
|
}
|
|
2043
1198
|
assistantStream.closeSegment();
|
|
2044
1199
|
if (sessionId) {
|
|
2045
|
-
const { profile, summary } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1200
|
+
const { profile, summary } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2046
1201
|
if (profile.changedFiles.length > 0 && profile.required) {
|
|
2047
1202
|
this.events.setStatus((0, agent_status_1.verifyingStatus)(profile.profile));
|
|
2048
1203
|
this.controllerOptions.onVerificationStateChange?.('running');
|
|
2049
1204
|
}
|
|
2050
|
-
if (shouldRecordVerificationLoopStats(profile, summary)) {
|
|
1205
|
+
if ((0, chat_workspace_1.shouldRecordVerificationLoopStats)(profile, summary)) {
|
|
2051
1206
|
const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
|
|
2052
1207
|
if (stats) {
|
|
2053
|
-
pendingCompleteStats = withVerificationLoopStats(stats, summary);
|
|
1208
|
+
pendingCompleteStats = (0, chat_workspace_1.withVerificationLoopStats)(stats, summary);
|
|
2054
1209
|
}
|
|
2055
1210
|
}
|
|
2056
1211
|
if ((0, verification_profile_1.shouldGateCompletion)(summary)) {
|
|
@@ -2064,16 +1219,16 @@ class AgentChatController {
|
|
|
2064
1219
|
content: notice,
|
|
2065
1220
|
});
|
|
2066
1221
|
finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
|
|
2067
|
-
appendAssistantNotice(sessionMessagesToRecord, notice);
|
|
1222
|
+
(0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
|
|
2068
1223
|
if (pendingCompleteTrace) {
|
|
2069
1224
|
pendingCompleteTrace.finishReason = 'completion_gate';
|
|
2070
|
-
pendingCompleteTrace.contentBytes = byteLength(finalContent);
|
|
1225
|
+
pendingCompleteTrace.contentBytes = (0, chat_trace_1.byteLength)(finalContent);
|
|
2071
1226
|
pendingCompleteTrace.note = 'verification_incomplete';
|
|
2072
1227
|
}
|
|
2073
1228
|
const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
|
|
2074
1229
|
if (stats) {
|
|
2075
1230
|
pendingCompleteStats = {
|
|
2076
|
-
...withVerificationLoopStats(stats, summary),
|
|
1231
|
+
...(0, chat_workspace_1.withVerificationLoopStats)(stats, summary),
|
|
2077
1232
|
finishReason: 'completion_gate',
|
|
2078
1233
|
};
|
|
2079
1234
|
}
|
|
@@ -2112,7 +1267,7 @@ class AgentChatController {
|
|
|
2112
1267
|
content: notice,
|
|
2113
1268
|
});
|
|
2114
1269
|
finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
|
|
2115
|
-
appendAssistantNotice(sessionMessagesToRecord, notice);
|
|
1270
|
+
(0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
|
|
2116
1271
|
}
|
|
2117
1272
|
if (pendingCompleteStats) {
|
|
2118
1273
|
this.setLoopStats(this.foldSubagentUsage(pendingCompleteStats, subagentBundle));
|
|
@@ -2149,7 +1304,7 @@ class AgentChatController {
|
|
|
2149
1304
|
}
|
|
2150
1305
|
this.runtime.store.setContextUsage(pendingCompact.after);
|
|
2151
1306
|
if (sessionId) {
|
|
2152
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1307
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2153
1308
|
turnId,
|
|
2154
1309
|
type: 'compact_completed',
|
|
2155
1310
|
checkpointId: committedCheckpointId,
|
|
@@ -2166,11 +1321,11 @@ class AgentChatController {
|
|
|
2166
1321
|
}
|
|
2167
1322
|
catch (error) {
|
|
2168
1323
|
if (sessionId) {
|
|
2169
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1324
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2170
1325
|
turnId,
|
|
2171
1326
|
type: 'compact_failed',
|
|
2172
1327
|
model: finalModel || this.runtime.llm.getModel(),
|
|
2173
|
-
error: compactTraceError(error),
|
|
1328
|
+
error: (0, chat_trace_1.compactTraceError)(error),
|
|
2174
1329
|
note: pendingCompact.mode,
|
|
2175
1330
|
});
|
|
2176
1331
|
}
|
|
@@ -2201,10 +1356,10 @@ class AgentChatController {
|
|
|
2201
1356
|
});
|
|
2202
1357
|
const harnessState = harness.toJSON();
|
|
2203
1358
|
this.runtime.store.setState({ harnessState });
|
|
2204
|
-
emitHarnessDiagnostics(this.events, harnessState);
|
|
1359
|
+
(0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
|
|
2205
1360
|
if (sessionId) {
|
|
2206
1361
|
if (pendingCompleteTrace) {
|
|
2207
|
-
recordTraceEvent(this.events, sessionId, pendingCompleteTrace);
|
|
1362
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, pendingCompleteTrace);
|
|
2208
1363
|
}
|
|
2209
1364
|
(0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
|
|
2210
1365
|
(0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
|
|
@@ -2217,7 +1372,7 @@ class AgentChatController {
|
|
|
2217
1372
|
}
|
|
2218
1373
|
catch (error) {
|
|
2219
1374
|
// v0.2.25: Provider retry exhausted is a recoverable turn failure.
|
|
2220
|
-
if (error instanceof
|
|
1375
|
+
if (error instanceof provider_resilience_1.ProviderRetryExhaustedError) {
|
|
2221
1376
|
const diag = error.diagnostics;
|
|
2222
1377
|
const attempts = diag?.attempts?.length ?? '?';
|
|
2223
1378
|
const kind = diag?.attempts?.[diag.attempts.length - 1]?.failureKind ?? 'unknown';
|
|
@@ -2241,12 +1396,12 @@ class AgentChatController {
|
|
|
2241
1396
|
}
|
|
2242
1397
|
return;
|
|
2243
1398
|
}
|
|
2244
|
-
if (isAbortError(error, abortSignal)) {
|
|
1399
|
+
if ((0, chat_trace_1.isAbortError)(error, abortSignal)) {
|
|
2245
1400
|
const interruptedStats = error instanceof framework_1.QueryLoopError
|
|
2246
1401
|
? error.stats
|
|
2247
1402
|
: (0, framework_1.createFailedLoopStats)({
|
|
2248
1403
|
loopBudget,
|
|
2249
|
-
diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
|
|
1404
|
+
diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
|
|
2250
1405
|
turnsStarted: observedTurnsStarted,
|
|
2251
1406
|
llmRequests: observedLlmRequests,
|
|
2252
1407
|
toolCalls: observedToolCalls,
|
|
@@ -2262,16 +1417,16 @@ class AgentChatController {
|
|
|
2262
1417
|
persistInterruptedAccounting(interruptedRootUsage, interruptedStats, interruptedStats.llmRequests === 0);
|
|
2263
1418
|
assistantStream.discardSegment();
|
|
2264
1419
|
this.events.setStatus('Interrupted.');
|
|
2265
|
-
removeTrailingUserMessage(this.runtime);
|
|
1420
|
+
(0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
|
|
2266
1421
|
if (sessionId) {
|
|
2267
|
-
const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2268
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1422
|
+
const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1423
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2269
1424
|
turnId,
|
|
2270
1425
|
type: 'aborted',
|
|
2271
1426
|
note: 'abort_error',
|
|
2272
1427
|
});
|
|
2273
|
-
const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
|
|
2274
|
-
? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
|
|
1428
|
+
const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
|
|
1429
|
+
? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
|
|
2275
1430
|
: undefined;
|
|
2276
1431
|
if (recoveryNotice) {
|
|
2277
1432
|
this.events.append({
|
|
@@ -2288,15 +1443,15 @@ class AgentChatController {
|
|
|
2288
1443
|
assistantStream.discardSegment();
|
|
2289
1444
|
this.events.append({
|
|
2290
1445
|
role: 'error',
|
|
2291
|
-
content: formatChatError(error),
|
|
2292
|
-
errorLayer: errorLayerForChatError(error),
|
|
1446
|
+
content: (0, chat_trace_1.formatChatError)(error),
|
|
1447
|
+
errorLayer: (0, chat_trace_1.errorLayerForChatError)(error),
|
|
2293
1448
|
});
|
|
2294
1449
|
this.events.setStatus('Turn failed. Ready for the next input.');
|
|
2295
1450
|
const failedStats = this.foldSubagentUsage(error instanceof framework_1.QueryLoopError
|
|
2296
1451
|
? error.stats
|
|
2297
1452
|
: (0, framework_1.createFailedLoopStats)({
|
|
2298
1453
|
loopBudget,
|
|
2299
|
-
diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
|
|
1454
|
+
diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
|
|
2300
1455
|
turnsStarted: observedTurnsStarted,
|
|
2301
1456
|
llmRequests: observedLlmRequests,
|
|
2302
1457
|
toolCalls: observedToolCalls,
|
|
@@ -2316,10 +1471,10 @@ class AgentChatController {
|
|
|
2316
1471
|
}
|
|
2317
1472
|
this.setLoopStats(failedStats);
|
|
2318
1473
|
if (sessionId) {
|
|
2319
|
-
recordProviderTraceEvents(this.events, sessionId, turnId, failedStats);
|
|
2320
|
-
const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2321
|
-
const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
|
|
2322
|
-
? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
|
|
1474
|
+
(0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, failedStats);
|
|
1475
|
+
const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1476
|
+
const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
|
|
1477
|
+
? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
|
|
2323
1478
|
: undefined;
|
|
2324
1479
|
if (recoveryNotice) {
|
|
2325
1480
|
this.events.append({
|
|
@@ -2329,13 +1484,13 @@ class AgentChatController {
|
|
|
2329
1484
|
content: recoveryNotice,
|
|
2330
1485
|
});
|
|
2331
1486
|
}
|
|
2332
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1487
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2333
1488
|
turnId,
|
|
2334
1489
|
type: 'error',
|
|
2335
|
-
error: compactTraceError(error),
|
|
1490
|
+
error: (0, chat_trace_1.compactTraceError)(error),
|
|
2336
1491
|
note: recoveryNotice,
|
|
2337
1492
|
});
|
|
2338
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1493
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2339
1494
|
turnId,
|
|
2340
1495
|
type: 'complete',
|
|
2341
1496
|
model: failedStats.providerFinalModel ?? this.runtime.llm.getModel(),
|
|
@@ -2355,6 +1510,12 @@ class AgentChatController {
|
|
|
2355
1510
|
localFastPathUsed: failedStats.localFastPathUsed,
|
|
2356
1511
|
});
|
|
2357
1512
|
(0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
|
|
1513
|
+
// A failed turn must not leave the user's prompt dangling in the
|
|
1514
|
+
// persisted session (it would replay on resume). The in-memory history
|
|
1515
|
+
// is cleaned above (2969-2972); mirror that for the on-disk transcript.
|
|
1516
|
+
if (options.persistAsUserMessage !== false) {
|
|
1517
|
+
(0, session_storage_1.removeTrailingSessionUserMessage)(sessionId);
|
|
1518
|
+
}
|
|
2358
1519
|
}
|
|
2359
1520
|
const history = this.runtime.store.getSnapshot().conversationHistory;
|
|
2360
1521
|
if (history.length > 0) {
|