@orion-agents/orion-code 0.1.4 → 0.1.6
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 +73 -38
- package/README.zh-CN.md +32 -10
- 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 +4 -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 +74 -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 +617 -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 +805 -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 +175 -0
- package/dist/commands/diagnostic-commands.js.map +1 -0
- package/dist/commands/index.d.ts +9 -10
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +42 -3563
- 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 +15 -0
- package/dist/commands/model-command-handlers.d.ts.map +1 -0
- package/dist/commands/model-command-handlers.js +526 -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 +85 -0
- package/dist/commands/model-commands.js.map +1 -0
- package/dist/commands/parser.d.ts +12 -0
- package/dist/commands/parser.d.ts.map +1 -1
- package/dist/commands/parser.js +48 -7
- package/dist/commands/parser.js.map +1 -1
- package/dist/commands/registry.d.ts +4 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +566 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/session-command-handlers.d.ts +10 -0
- package/dist/commands/session-command-handlers.d.ts.map +1 -0
- package/dist/commands/session-command-handlers.js +626 -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 +102 -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 +80 -0
- package/dist/commands/system-commands.js.map +1 -0
- package/dist/commands/target-command.d.ts +1 -1
- package/dist/commands/target-command.d.ts.map +1 -1
- package/dist/commands/target-command.js +42 -6
- 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 +69 -5
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +3 -4
- 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 +32 -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 +124 -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 +17 -1
- package/dist/core/cost-tracker.d.ts.map +1 -1
- package/dist/core/cost-tracker.js +24 -8
- 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 +2 -2
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +57 -10
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/store.d.ts +15 -6
- package/dist/framework/store.d.ts.map +1 -1
- package/dist/framework/store.js +18 -0
- package/dist/framework/store.js.map +1 -1
- package/dist/framework/tool-scheduler.d.ts +16 -13
- package/dist/framework/tool-scheduler.d.ts.map +1 -1
- package/dist/framework/tool-scheduler.js +155 -38
- package/dist/framework/tool-scheduler.js.map +1 -1
- package/dist/framework/tool.d.ts +39 -2
- package/dist/framework/tool.d.ts.map +1 -1
- package/dist/framework/tool.js +27 -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/drift-guard.d.ts.map +1 -1
- package/dist/harness/drift-guard.js +9 -1
- package/dist/harness/drift-guard.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 +4 -3
- package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.js +103 -31
- package/dist/ink-ui/screens/ReplScreen.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 +3 -15
- 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 +116 -9
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/validation.d.ts +3 -0
- package/dist/memory/validation.d.ts.map +1 -1
- package/dist/memory/validation.js +123 -10
- package/dist/memory/validation.js.map +1 -1
- package/dist/memory/vector-store.d.ts +30 -0
- package/dist/memory/vector-store.d.ts.map +1 -1
- package/dist/memory/vector-store.js +160 -21
- 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 +59 -107
- 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 +13 -3
- package/dist/print-ui/launch.d.ts.map +1 -1
- package/dist/print-ui/launch.js +28 -3
- 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 +16 -11
- package/dist/product/paths.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.d.ts +4 -2
- package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-controller.js +129 -15
- package/dist/runtime/agent-runtime-controller.js.map +1 -1
- package/dist/runtime/agent-runtime-protocol.d.ts +15 -0
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-protocol.js +6 -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 +10 -51
- package/dist/runtime/chat-controller.d.ts.map +1 -1
- package/dist/runtime/chat-controller.js +256 -1070
- package/dist/runtime/chat-controller.js.map +1 -1
- package/dist/runtime/chat-effort.d.ts +5 -0
- package/dist/runtime/chat-effort.d.ts.map +1 -0
- package/dist/runtime/chat-effort.js +47 -0
- package/dist/runtime/chat-effort.js.map +1 -0
- 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 +56 -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 +4 -3
- package/dist/runtime/goals/prompt.js.map +1 -1
- package/dist/runtime/goals/tools.d.ts +32 -8
- package/dist/runtime/goals/tools.d.ts.map +1 -1
- package/dist/runtime/goals/tools.js +187 -11
- package/dist/runtime/goals/tools.js.map +1 -1
- package/dist/runtime/goals/types.d.ts +9 -0
- package/dist/runtime/goals/types.d.ts.map +1 -1
- package/dist/runtime/goals/types.js +1 -0
- package/dist/runtime/goals/types.js.map +1 -1
- package/dist/runtime/loop-budget.d.ts +2 -2
- package/dist/runtime/rich-text/markdown-parser.d.ts +2 -0
- package/dist/runtime/rich-text/markdown-parser.d.ts.map +1 -1
- package/dist/runtime/rich-text/markdown-parser.js +50 -10
- package/dist/runtime/rich-text/markdown-parser.js.map +1 -1
- package/dist/runtime/subagents/index.d.ts +2 -2
- package/dist/runtime/subagents/index.d.ts.map +1 -1
- package/dist/runtime/subagents/index.js +2 -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/research-artifact.d.ts +7 -0
- package/dist/runtime/subagents/research-artifact.d.ts.map +1 -1
- package/dist/runtime/subagents/research-artifact.js +73 -27
- package/dist/runtime/subagents/research-artifact.js.map +1 -1
- package/dist/runtime/subagents/research-contract.d.ts +18 -4
- package/dist/runtime/subagents/research-contract.d.ts.map +1 -1
- package/dist/runtime/subagents/research-contract.js +122 -17
- package/dist/runtime/subagents/research-contract.js.map +1 -1
- package/dist/runtime/subagents/research-renderer.d.ts +27 -11
- package/dist/runtime/subagents/research-renderer.d.ts.map +1 -1
- package/dist/runtime/subagents/research-renderer.js +34 -2
- package/dist/runtime/subagents/research-renderer.js.map +1 -1
- 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 +4 -2
- package/dist/runtime/subagents/web-research-adapter.d.ts.map +1 -1
- package/dist/runtime/subagents/web-research-adapter.js +81 -15
- package/dist/runtime/subagents/web-research-adapter.js.map +1 -1
- package/dist/runtime/ui-events.d.ts +36 -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 +53 -4
- package/dist/runtime/ui-view-model.d.ts.map +1 -1
- package/dist/runtime/ui-view-model.js +190 -10
- 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 +117 -31
- 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 +59 -12
- package/dist/services/concurrent-sessions.js.map +1 -1
- package/dist/services/config.d.ts +8 -4
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +15 -71
- 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/effort.d.ts +40 -0
- package/dist/services/effort.d.ts.map +1 -0
- package/dist/services/effort.js +88 -0
- package/dist/services/effort.js.map +1 -0
- 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 +193 -0
- package/dist/services/file-lock.js.map +1 -0
- package/dist/services/global-config.d.ts +9 -0
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/global-config.js +79 -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 +35 -11
- package/dist/services/goal-storage.js.map +1 -1
- package/dist/services/llm.d.ts +35 -17
- package/dist/services/llm.d.ts.map +1 -1
- package/dist/services/llm.js +249 -113
- 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-context.d.ts +8 -0
- package/dist/services/model-context.d.ts.map +1 -1
- package/dist/services/model-context.js +111 -7
- package/dist/services/model-context.js.map +1 -1
- package/dist/services/model-registry.d.ts +3 -0
- package/dist/services/model-registry.d.ts.map +1 -1
- package/dist/services/model-registry.js +59 -2
- package/dist/services/model-registry.js.map +1 -1
- package/dist/services/provider-diagnostics.d.ts +1 -1
- package/dist/services/provider-diagnostics.d.ts.map +1 -1
- package/dist/services/provider-diagnostics.js +30 -16
- package/dist/services/provider-diagnostics.js.map +1 -1
- package/dist/services/provider-resilience/coordinator.d.ts +8 -3
- package/dist/services/provider-resilience/coordinator.d.ts.map +1 -1
- package/dist/services/provider-resilience/coordinator.js +86 -19
- 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 -26
- 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/types.d.ts +10 -1
- 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 +12 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +301 -230
- 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 +25 -7
- package/dist/services/storage-maintenance.js.map +1 -1
- package/dist/services/task-manager.d.ts +6 -1
- 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 +20 -10
- package/dist/services/tool-allowlist.d.ts.map +1 -1
- package/dist/services/tool-allowlist.js +64 -15
- package/dist/services/tool-allowlist.js.map +1 -1
- package/dist/services/usage-state.d.ts +10 -0
- package/dist/services/usage-state.d.ts.map +1 -1
- package/dist/services/usage-state.js +116 -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/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 +23 -9
- 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 +26 -8
- package/dist/terminal-ui/launch.d.ts.map +1 -1
- package/dist/terminal-ui/launch.js +82 -39
- package/dist/terminal-ui/launch.js.map +1 -1
- package/dist/tools/bash_security.d.ts +17 -0
- package/dist/tools/bash_security.d.ts.map +1 -1
- package/dist/tools/bash_security.js +233 -27
- package/dist/tools/bash_security.js.map +1 -1
- package/dist/tools/git.d.ts +8 -8
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +248 -55
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/index.d.ts +13 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +262 -30
- 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 +11 -4
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/mcp.js +99 -3
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/plan.d.ts +4 -4
- package/dist/tools/sandbox.d.ts +5 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +29 -13
- package/dist/tools/sandbox.js.map +1 -1
- 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 +240 -26
- package/dist/tools/web.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 +3 -3
- 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 +19 -5
- package/dist/tui-ui/layout.js.map +1 -1
- package/dist/tui-ui/pickers.d.ts.map +1 -1
- package/dist/tui-ui/pickers.js +1 -0
- package/dist/tui-ui/pickers.js.map +1 -1
- package/dist/tui-ui/runner.d.ts +2 -1
- package/dist/tui-ui/runner.d.ts.map +1 -1
- package/dist/tui-ui/runner.js +18 -29
- package/dist/tui-ui/runner.js.map +1 -1
- package/dist/tui-ui/state.d.ts +13 -1
- package/dist/tui-ui/state.d.ts.map +1 -1
- package/dist/tui-ui/state.js +28 -1
- package/dist/tui-ui/state.js.map +1 -1
- package/dist/ui/markdown.js.map +1 -1
- package/dist/utils/debug-log.d.ts +3 -3
- package/dist/utils/debug-log.d.ts.map +1 -1
- package/dist/utils/debug-log.js +7 -4
- package/dist/utils/debug-log.js.map +1 -1
- 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 +8 -1
- package/dist/utils/mask.d.ts.map +1 -1
- package/dist/utils/mask.js +10 -12
- package/dist/utils/mask.js.map +1 -1
- 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 -8
|
@@ -1,989 +1,49 @@
|
|
|
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");
|
|
48
12
|
const tool_allowlist_1 = require("../services/tool-allowlist");
|
|
49
13
|
const framework_1 = require("../framework");
|
|
50
14
|
const prompt_1 = require("./goals/prompt");
|
|
51
15
|
const harness_1 = require("../harness");
|
|
52
16
|
const tools_1 = require("../tools");
|
|
17
|
+
const tool_scheduler_1 = require("../framework/tool-scheduler");
|
|
53
18
|
const tool_serializer_1 = require("../framework/tool-serializer");
|
|
54
19
|
const tool_artifacts_1 = require("../core/tool-artifacts");
|
|
55
|
-
const checkpoint_1 = require("../core/checkpoint");
|
|
56
20
|
const skills_1 = require("../skills");
|
|
57
21
|
const subagents_1 = require("./subagents");
|
|
58
22
|
const file_context_1 = require("../services/file-context");
|
|
59
23
|
const prompt_context_1 = require("../services/prompt-context");
|
|
60
|
-
const format_1 = require("../services/format");
|
|
61
24
|
const workspace_state_1 = require("../services/workspace-state");
|
|
62
25
|
const verification_profile_1 = require("../services/verification-profile");
|
|
63
26
|
const ui_events_1 = require("./ui-events");
|
|
64
|
-
const ui_view_model_1 = require("./ui-view-model");
|
|
65
27
|
const agent_status_1 = require("./agent-status");
|
|
66
28
|
const loop_budget_1 = require("./loop-budget");
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
function
|
|
77
|
-
if (abortSignal?.aborted)
|
|
78
|
-
return true;
|
|
79
|
-
if (error instanceof Error) {
|
|
80
|
-
return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');
|
|
81
|
-
}
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
function errorLayerForChatError(error) {
|
|
85
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
-
const lower = message.toLowerCase();
|
|
87
|
-
if (/NotEnoughCvError|code:\s*11210|provider|quota|rate.?limit|timeout|connection/i.test(message)) {
|
|
88
|
-
return 'provider';
|
|
89
|
-
}
|
|
90
|
-
if (/tool|command|exec_command|write_file|edit_file/i.test(message)) {
|
|
91
|
-
return 'tool';
|
|
92
|
-
}
|
|
93
|
-
if (/\bmcp\b/i.test(message))
|
|
94
|
-
return 'mcp';
|
|
95
|
-
if (/\b(session|resume|compact|harness)\b/i.test(message))
|
|
96
|
-
return 'session';
|
|
97
|
-
if (/\b(skill|skills)\b/i.test(message))
|
|
98
|
-
return 'skills';
|
|
99
|
-
if (/\b(memory|vector store|recall|forget)\b/i.test(message))
|
|
100
|
-
return 'memory';
|
|
101
|
-
if (/\b(renderer|terminal|tty|prompt|resize|scrollback)\b/i.test(message))
|
|
102
|
-
return 'renderer';
|
|
103
|
-
if (lower.includes('abort') || lower.includes('interrupted'))
|
|
104
|
-
return 'runtime';
|
|
105
|
-
return 'unknown';
|
|
106
|
-
}
|
|
107
|
-
function formatChatError(error) {
|
|
108
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
109
|
-
if (/NotEnoughCvError|code:\s*11210/i.test(message)) {
|
|
110
|
-
return [
|
|
111
|
-
message,
|
|
112
|
-
'',
|
|
113
|
-
'Provider quota or credit appears insufficient. The Orion Code session is still active; switch model/provider or recharge the provider account, then continue.',
|
|
114
|
-
].join('\n');
|
|
115
|
-
}
|
|
116
|
-
return message;
|
|
117
|
-
}
|
|
118
|
-
function compactMiddle(text, maxLength) {
|
|
119
|
-
const compact = text.replace(/\s+/g, ' ').trim();
|
|
120
|
-
if (compact.length <= maxLength)
|
|
121
|
-
return compact;
|
|
122
|
-
if (maxLength <= 3)
|
|
123
|
-
return compact.slice(0, maxLength);
|
|
124
|
-
const headLength = Math.ceil((maxLength - 3) * 0.55);
|
|
125
|
-
const tailLength = Math.floor((maxLength - 3) * 0.45);
|
|
126
|
-
return `${compact.slice(0, headLength)}...${compact.slice(-tailLength)}`;
|
|
127
|
-
}
|
|
128
|
-
function compactToolArgs(args, maxLength = 160) {
|
|
129
|
-
for (const key of [
|
|
130
|
-
'path',
|
|
131
|
-
'file_path',
|
|
132
|
-
'file',
|
|
133
|
-
'cwd',
|
|
134
|
-
'command',
|
|
135
|
-
'pattern',
|
|
136
|
-
'query',
|
|
137
|
-
'url',
|
|
138
|
-
'target',
|
|
139
|
-
'sessionId',
|
|
140
|
-
]) {
|
|
141
|
-
const value = args[key];
|
|
142
|
-
if (typeof value === 'string') {
|
|
143
|
-
return compactMiddle(value, maxLength);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const firstString = Object.values(args).find(value => typeof value === 'string');
|
|
147
|
-
if (typeof firstString === 'string') {
|
|
148
|
-
return compactMiddle(firstString, maxLength);
|
|
149
|
-
}
|
|
150
|
-
return '';
|
|
151
|
-
}
|
|
152
|
-
function fullToolArgsForTrace(name, args) {
|
|
153
|
-
if (name === 'exec_command' && typeof args.command === 'string') {
|
|
154
|
-
return `$ ${args.command}`;
|
|
155
|
-
}
|
|
156
|
-
try {
|
|
157
|
-
return JSON.stringify(args, null, 2);
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
return compactToolArgs(args, 2048);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
function buildTraceArgsDetails(projectPath, name, args) {
|
|
164
|
-
const argsSummary = compactToolArgs(args);
|
|
165
|
-
const fullArgs = (0, session_storage_1.redactTraceText)(fullToolArgsForTrace(name, args)).trim();
|
|
166
|
-
const argsBytes = byteLength(fullArgs);
|
|
167
|
-
if (!projectPath ||
|
|
168
|
-
!fullArgs ||
|
|
169
|
-
fullArgs === (0, session_storage_1.redactTraceText)(argsSummary) ||
|
|
170
|
-
argsBytes <= TRACE_ARGS_ARTIFACT_THRESHOLD_BYTES) {
|
|
171
|
-
return { argsSummary };
|
|
172
|
-
}
|
|
173
|
-
const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `${name}-args`, fullArgs, argsBytes);
|
|
174
|
-
return artifact ? { argsSummary, argsArtifactId: artifact.id, argsBytes } : { argsSummary };
|
|
175
|
-
}
|
|
176
|
-
function parseToolCallArgsForRuntime(toolCall) {
|
|
177
|
-
try {
|
|
178
|
-
const parsed = JSON.parse(toolCall.function.arguments || '{}');
|
|
179
|
-
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
|
|
180
|
-
? parsed
|
|
181
|
-
: null;
|
|
182
|
-
}
|
|
183
|
-
catch {
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
function resolveProjectScopedPath(cwd, filePath) {
|
|
188
|
-
const absolute = path.resolve(cwd, filePath);
|
|
189
|
-
const relative = path.relative(cwd, absolute);
|
|
190
|
-
if (relative.startsWith('..') || path.isAbsolute(relative))
|
|
191
|
-
return null;
|
|
192
|
-
return absolute;
|
|
193
|
-
}
|
|
194
|
-
function checkpointTargetsFromToolCalls(cwd, toolCalls) {
|
|
195
|
-
const targets = new Set();
|
|
196
|
-
for (const toolCall of toolCalls) {
|
|
197
|
-
const name = toolCall.function.name;
|
|
198
|
-
if (name !== 'write_file' && name !== 'edit_file')
|
|
199
|
-
continue;
|
|
200
|
-
const args = parseToolCallArgsForRuntime(toolCall);
|
|
201
|
-
if (!args || typeof args.path !== 'string')
|
|
202
|
-
continue;
|
|
203
|
-
if (name === 'edit_file' && args.preview === true)
|
|
204
|
-
continue;
|
|
205
|
-
const target = resolveProjectScopedPath(cwd, args.path);
|
|
206
|
-
if (target)
|
|
207
|
-
targets.add(target);
|
|
208
|
-
}
|
|
209
|
-
return Array.from(targets);
|
|
210
|
-
}
|
|
211
|
-
function createPreToolCheckpoint(events, sessionId, turnId, checkpointId, cwd, toolCalls) {
|
|
212
|
-
const targets = checkpointTargetsFromToolCalls(cwd, toolCalls);
|
|
213
|
-
if (targets.length === 0)
|
|
214
|
-
return { created: false, targetCount: 0, risky: false };
|
|
215
|
-
const risky = (0, checkpoint_1.shouldCreateMultiFileCheckpoint)(targets.length);
|
|
216
|
-
const checkpoint = (0, checkpoint_1.createCheckpoint)(cwd, checkpointId, targets);
|
|
217
|
-
if (!sessionId)
|
|
218
|
-
return { created: true, targetCount: targets.length, risky };
|
|
219
|
-
const relativeTargets = targets.map(target => path.relative(cwd, target));
|
|
220
|
-
recordTraceEvent(events, sessionId, {
|
|
221
|
-
turnId,
|
|
222
|
-
type: 'checkpoint',
|
|
223
|
-
checkpointId,
|
|
224
|
-
checkpointFileCount: checkpoint?.files.length ?? 0,
|
|
225
|
-
checkpointFiles: checkpoint?.files.map(file => file.path) ?? [],
|
|
226
|
-
workspaceFiles: relativeTargets,
|
|
227
|
-
note: checkpoint
|
|
228
|
-
? risky
|
|
229
|
-
? 'risky_multi_file_checkpoint'
|
|
230
|
-
: 'pre_edit_checkpoint'
|
|
231
|
-
: 'pre_edit_checkpoint_skipped',
|
|
232
|
-
});
|
|
233
|
-
return { created: true, targetCount: targets.length, risky };
|
|
234
|
-
}
|
|
235
|
-
function byteLength(text) {
|
|
236
|
-
return Buffer.byteLength(text, 'utf8');
|
|
237
|
-
}
|
|
238
|
-
function traceTurnId(turnId) {
|
|
239
|
-
return turnId == null ? `turn-${Date.now()}` : String(turnId);
|
|
240
|
-
}
|
|
241
|
-
function compactTraceError(error) {
|
|
242
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
243
|
-
return compactMiddle(message, 240);
|
|
244
|
-
}
|
|
245
|
-
function getLastRequestDiagnostics(llm) {
|
|
246
|
-
if (!llm)
|
|
247
|
-
return undefined;
|
|
248
|
-
const reader = llm.getLastRequestDiagnostics;
|
|
249
|
-
return typeof reader === 'function' ? reader.call(llm) : undefined;
|
|
250
|
-
}
|
|
251
|
-
function compactPathList(paths, maxItems = 40) {
|
|
252
|
-
return paths.slice(0, maxItems);
|
|
253
|
-
}
|
|
254
|
-
function formatWorkspaceFileForTrace(file) {
|
|
255
|
-
const metadata = [
|
|
256
|
-
typeof file.sizeBytes === 'number' ? `${file.sizeBytes}B` : '',
|
|
257
|
-
typeof file.mtimeMs === 'number' ? `mtime=${file.mtimeMs}` : '',
|
|
258
|
-
]
|
|
259
|
-
.filter(Boolean)
|
|
260
|
-
.join(' ');
|
|
261
|
-
return `${file.status} ${file.path}${metadata ? ` (${metadata})` : ''}`;
|
|
262
|
-
}
|
|
263
|
-
function appendWorkspaceSnapshotTrace(events, sessionId, turnId, phase, snapshot) {
|
|
264
|
-
if (!sessionId)
|
|
265
|
-
return;
|
|
266
|
-
recordTraceEvent(events, sessionId, {
|
|
267
|
-
turnId,
|
|
268
|
-
type: 'workspace_snapshot',
|
|
269
|
-
workspacePhase: phase,
|
|
270
|
-
workspaceGitAvailable: snapshot.gitAvailable,
|
|
271
|
-
workspaceDirty: snapshot.dirty,
|
|
272
|
-
workspaceBranch: snapshot.branch,
|
|
273
|
-
workspaceFileCount: snapshot.fileCount,
|
|
274
|
-
workspaceFiles: compactPathList(snapshot.files.map(formatWorkspaceFileForTrace)),
|
|
275
|
-
error: snapshot.error ? compactMiddle(snapshot.error, 240) : undefined,
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
function appendWorkspaceDeltaTrace(events, sessionId, turnId, before, after) {
|
|
279
|
-
const delta = (0, workspace_state_1.diffWorkspaceSnapshots)(before, after);
|
|
280
|
-
if (sessionId) {
|
|
281
|
-
recordTraceEvent(events, sessionId, {
|
|
282
|
-
turnId,
|
|
283
|
-
type: 'workspace_delta',
|
|
284
|
-
workspaceFileCount: delta.filesAfterTurn.length,
|
|
285
|
-
workspaceFiles: compactPathList(delta.filesAfterTurn),
|
|
286
|
-
workspaceNewByTurn: compactPathList(delta.newFilesByTurn),
|
|
287
|
-
workspaceChangedByTurn: compactPathList(delta.changedByTurn),
|
|
288
|
-
workspaceModifiedPreExistingByTurn: compactPathList(delta.modifiedPreExistingByTurn),
|
|
289
|
-
workspaceResolvedByTurn: compactPathList(delta.resolvedByTurn),
|
|
290
|
-
note: `pre_existing=${delta.preExistingFiles.length}`,
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
return delta;
|
|
294
|
-
}
|
|
295
|
-
function workspaceDeltaHasTurnChanges(delta) {
|
|
296
|
-
return (delta.newFilesByTurn.length > 0 ||
|
|
297
|
-
delta.changedByTurn.length > 0 ||
|
|
298
|
-
delta.resolvedByTurn.length > 0);
|
|
299
|
-
}
|
|
300
|
-
function formatFailureRecoveryNotice(turnId, delta, checkpointIds) {
|
|
301
|
-
const files = compactPathList([...delta.newFilesByTurn, ...delta.changedByTurn, ...delta.resolvedByTurn], 8);
|
|
302
|
-
const fileText = files.length > 0 ? files.join(', ') : 'workspace changes recorded';
|
|
303
|
-
const checkpointText = checkpointIds.length > 0
|
|
304
|
-
? ` Checkpoints: ${checkpointIds.join(', ')}. Preview rollback with /checkpoint restore <id>; restore each listed checkpoint if multiple.`
|
|
305
|
-
: '';
|
|
306
|
-
return `Turn failed after modifying files: ${fileText}. Inspect /trace ${turnId}.${checkpointText}`;
|
|
307
|
-
}
|
|
308
|
-
function appendVerificationProfileTrace(events, sessionId, turnId, profile) {
|
|
309
|
-
if (!sessionId || profile.changedFiles.length === 0)
|
|
310
|
-
return;
|
|
311
|
-
recordTraceEvent(events, sessionId, {
|
|
312
|
-
turnId,
|
|
313
|
-
type: 'verification_profile',
|
|
314
|
-
verificationProfile: profile.profile,
|
|
315
|
-
verificationRequired: profile.required,
|
|
316
|
-
verificationRisky: (0, verification_profile_1.isRiskyEdit)(profile.changedFiles),
|
|
317
|
-
verificationCommands: compactPathList(profile.commands, 8),
|
|
318
|
-
verificationChangedFiles: compactPathList(profile.changedFiles),
|
|
319
|
-
note: profile.reason,
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
function appendVerificationResultTrace(events, sessionId, turnId, result) {
|
|
323
|
-
if (!sessionId)
|
|
324
|
-
return;
|
|
325
|
-
recordTraceEvent(events, sessionId, {
|
|
326
|
-
turnId,
|
|
327
|
-
type: 'verification_result',
|
|
328
|
-
verificationCommand: result.command,
|
|
329
|
-
verificationPassed: result.success,
|
|
330
|
-
outputBytes: result.outputBytes,
|
|
331
|
-
error: result.error ? compactMiddle(result.error, 240) : undefined,
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
function appendVerificationSummaryTrace(events, sessionId, turnId, summary, changedFiles) {
|
|
335
|
-
if (!sessionId || changedFiles.length === 0)
|
|
336
|
-
return;
|
|
337
|
-
recordTraceEvent(events, sessionId, {
|
|
338
|
-
turnId,
|
|
339
|
-
type: 'verification_summary',
|
|
340
|
-
verificationProfile: summary.profile,
|
|
341
|
-
verificationRequired: summary.required,
|
|
342
|
-
verificationCommands: compactPathList(summary.commandsRun, 12),
|
|
343
|
-
verificationPassedCommands: compactPathList(summary.passedCommands, 12),
|
|
344
|
-
verificationFailedCommands: compactPathList(summary.failedCommands, 12),
|
|
345
|
-
verificationMissingCommands: compactPathList(summary.missingCommands, 12),
|
|
346
|
-
verificationChangedFiles: compactPathList(changedFiles),
|
|
347
|
-
verificationClaimAllowed: summary.claimAllowed,
|
|
348
|
-
note: summary.skippedReason,
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
function compactVerificationCommands(commands, maxItems = 12) {
|
|
352
|
-
return commands.slice(0, maxItems).map(session_storage_1.redactTraceText);
|
|
353
|
-
}
|
|
354
|
-
function withVerificationLoopStats(stats, summary) {
|
|
355
|
-
return {
|
|
356
|
-
...stats,
|
|
357
|
-
verificationProfile: summary.profile,
|
|
358
|
-
verificationRequired: summary.required,
|
|
359
|
-
verificationClaimAllowed: summary.claimAllowed,
|
|
360
|
-
verificationPassedCommands: compactVerificationCommands(summary.passedCommands),
|
|
361
|
-
verificationFailedCommands: compactVerificationCommands(summary.failedCommands),
|
|
362
|
-
verificationMissingCommands: compactVerificationCommands(summary.missingCommands),
|
|
363
|
-
verificationSkippedReason: summary.skippedReason
|
|
364
|
-
? (0, session_storage_1.redactTraceText)(summary.skippedReason)
|
|
365
|
-
: undefined,
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
function shouldRecordVerificationLoopStats(profile, summary) {
|
|
369
|
-
return (profile.changedFiles.length > 0 ||
|
|
370
|
-
summary.commandsRun.length > 0 ||
|
|
371
|
-
summary.passedCommands.length > 0 ||
|
|
372
|
-
summary.failedCommands.length > 0 ||
|
|
373
|
-
summary.missingCommands.length > 0);
|
|
374
|
-
}
|
|
375
|
-
function appendPostWorkspaceTrace(events, sessionId, turnId, cwd, before, verificationResults = []) {
|
|
376
|
-
const postWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(cwd);
|
|
377
|
-
appendWorkspaceSnapshotTrace(events, sessionId, turnId, 'post_turn', postWorkspace);
|
|
378
|
-
const delta = appendWorkspaceDeltaTrace(events, sessionId, turnId, before, postWorkspace);
|
|
379
|
-
const profile = (0, verification_profile_1.selectVerificationProfile)(cwd, delta.changedByTurn);
|
|
380
|
-
const summary = (0, verification_profile_1.summarizeVerificationState)(profile, verificationResults);
|
|
381
|
-
appendVerificationProfileTrace(events, sessionId, turnId, profile);
|
|
382
|
-
appendVerificationSummaryTrace(events, sessionId, turnId, summary, profile.changedFiles);
|
|
383
|
-
return { delta, profile, summary };
|
|
384
|
-
}
|
|
385
|
-
function appendAssistantNotice(messages, notice) {
|
|
386
|
-
for (let index = messages.length - 1; index >= 0; index--) {
|
|
387
|
-
const message = messages[index];
|
|
388
|
-
if (message.role === 'assistant' && !message.tool_calls) {
|
|
389
|
-
message.content = message.content ? `${message.content}\n\n${notice}` : notice;
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
messages.push({
|
|
394
|
-
role: 'assistant',
|
|
395
|
-
content: notice,
|
|
396
|
-
timestamp: Date.now(),
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
function recordTraceEvent(events, sessionId, event) {
|
|
400
|
-
if (!sessionId)
|
|
401
|
-
return null;
|
|
402
|
-
const goal = goalTraceContext.getStore();
|
|
403
|
-
const traceEvent = (0, session_storage_1.appendSessionTraceEvent)(sessionId, {
|
|
404
|
-
...event,
|
|
405
|
-
goalId: goal?.goalId,
|
|
406
|
-
goalRevision: goal?.goalRevision,
|
|
407
|
-
goalInputKind: goal?.goalInputKind,
|
|
408
|
-
goalStopReason: goal?.getStopReason(),
|
|
409
|
-
});
|
|
410
|
-
if (traceEvent) {
|
|
411
|
-
events.traceEventRecorded?.(traceEvent);
|
|
412
|
-
}
|
|
413
|
-
return traceEvent;
|
|
414
|
-
}
|
|
415
|
-
function recordProviderTraceEvents(events, sessionId, turnId, stats) {
|
|
416
|
-
if ((stats.providerRetryCount ?? 0) > 0) {
|
|
417
|
-
recordTraceEvent(events, sessionId, {
|
|
418
|
-
turnId,
|
|
419
|
-
type: 'provider_retry',
|
|
420
|
-
providerRetryCount: stats.providerRetryCount,
|
|
421
|
-
providerRetryDelayMs: stats.providerRetryDelayMs,
|
|
422
|
-
providerRetryErrorTypes: stats.providerRetryErrorTypes,
|
|
423
|
-
providerLastRetryErrorType: stats.providerLastRetryErrorType,
|
|
424
|
-
providerLastRetryStatus: stats.providerLastRetryStatus,
|
|
425
|
-
providerFinalModel: stats.providerFinalModel,
|
|
426
|
-
providerUsingFallback: stats.providerUsingFallback,
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
if ((stats.providerFallbackCount ?? 0) > 0 || stats.providerUsingFallback) {
|
|
430
|
-
recordTraceEvent(events, sessionId, {
|
|
431
|
-
turnId,
|
|
432
|
-
type: 'provider_fallback',
|
|
433
|
-
providerFallbackCount: stats.providerFallbackCount,
|
|
434
|
-
providerFallbackFromModel: stats.providerFallbackFromModel,
|
|
435
|
-
providerFallbackToModel: stats.providerFallbackToModel,
|
|
436
|
-
providerFinalModel: stats.providerFinalModel,
|
|
437
|
-
providerUsingFallback: stats.providerUsingFallback,
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
function toHarnessDiagnostics(state) {
|
|
442
|
-
const stats = state.promptAssemblyStats;
|
|
443
|
-
const redactOptional = (value) => typeof value === 'string' ? (0, session_storage_1.redactTraceText)(value) : undefined;
|
|
444
|
-
const redactList = (values) => values?.slice(0, 6).map(session_storage_1.redactTraceText);
|
|
445
|
-
return {
|
|
446
|
-
taskEpoch: state.taskEpoch,
|
|
447
|
-
rootObjective: redactOptional(state.rootObjective ?? state.contract?.objective),
|
|
448
|
-
activeInstruction: redactOptional(state.activeInstruction ?? state.contract?.userIntent),
|
|
449
|
-
openQuestions: redactList(state.openQuestions),
|
|
450
|
-
diagnostics: redactList(state.diagnostics?.slice(-6)),
|
|
451
|
-
ledgerSize: state.ledger?.length ?? 0,
|
|
452
|
-
evidenceSize: state.evidenceIndex?.length ?? 0,
|
|
453
|
-
turnSummaryCount: state.turnSummaries?.length ?? 0,
|
|
454
|
-
promptAssembly: stats
|
|
455
|
-
? {
|
|
456
|
-
modelId: stats.modelId,
|
|
457
|
-
estimatedTokens: stats.estimatedTokens,
|
|
458
|
-
budgetTokens: stats.budgetTokens,
|
|
459
|
-
sections: stats.sections.slice(0, 12),
|
|
460
|
-
includedEvidence: stats.includedEvidence.length,
|
|
461
|
-
omittedEvidence: stats.omittedEvidence.length,
|
|
462
|
-
}
|
|
463
|
-
: undefined,
|
|
464
|
-
};
|
|
465
|
-
}
|
|
466
|
-
function emitHarnessDiagnostics(events, state) {
|
|
467
|
-
events.harnessDiagnosticsUpdated?.(toHarnessDiagnostics(state));
|
|
468
|
-
}
|
|
469
|
-
function toolStartContent(event) {
|
|
470
|
-
return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromStarted)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
|
|
471
|
-
}
|
|
472
|
-
function toolFinishContent(event) {
|
|
473
|
-
return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromFinished)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
|
|
474
|
-
}
|
|
475
|
-
function structuredToolStartActivity(event, seq) {
|
|
476
|
-
const command = event.name === 'exec_command' && typeof event.args.command === 'string'
|
|
477
|
-
? event.args.command
|
|
478
|
-
: undefined;
|
|
479
|
-
const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
|
|
480
|
-
return {
|
|
481
|
-
state: 'running',
|
|
482
|
-
name: event.name,
|
|
483
|
-
detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
|
|
484
|
-
command: safeCommand,
|
|
485
|
-
body: '',
|
|
486
|
-
seq,
|
|
487
|
-
};
|
|
488
|
-
}
|
|
489
|
-
function structuredToolFinishActivity(event, seq, options = {}) {
|
|
490
|
-
const modelVisible = (0, tool_serializer_1.parseToolResultEnvelope)(event.modelVisibleResult);
|
|
491
|
-
const durable = (0, tool_serializer_1.parseToolResultEnvelope)(event.result);
|
|
492
|
-
const durableOutput = typeof durable.output === 'string' ? durable.output : '';
|
|
493
|
-
const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
|
|
494
|
-
const outputBytes = event.outputBytes ?? Buffer.byteLength(durableOutput, 'utf8');
|
|
495
|
-
const aggregatePresentation = (0, aggregate_tool_presenter_1.presentAggregateToolResult)(event.name, durableOutput, outputBytes);
|
|
496
|
-
const aggregate = aggregatePresentation?.view;
|
|
497
|
-
const storedArtifact = event.artifactRef ??
|
|
498
|
-
(options.projectPath &&
|
|
499
|
-
durableOutput &&
|
|
500
|
-
(outputBytes > tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY.inlineMaxBytes || aggregate)
|
|
501
|
-
? ((0, tool_artifacts_1.storeArtifact)(options.projectPath, event.name, durableOutput, outputBytes) ?? undefined)
|
|
502
|
-
: undefined);
|
|
503
|
-
const artifactRef = storedArtifact
|
|
504
|
-
? { id: storedArtifact.id, outputBytes: storedArtifact.outputBytes }
|
|
505
|
-
: undefined;
|
|
506
|
-
const outputView = (0, tool_output_presentation_1.createToolOutputView)({
|
|
507
|
-
toolName: event.name,
|
|
508
|
-
success: event.success,
|
|
509
|
-
summary: event.summary,
|
|
510
|
-
rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
|
|
511
|
-
outputBytes,
|
|
512
|
-
artifactRef,
|
|
513
|
-
callId: event.callId,
|
|
514
|
-
sequence: seq,
|
|
515
|
-
turnId: options.turnId,
|
|
516
|
-
policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
|
|
517
|
-
});
|
|
518
|
-
if (aggregate) {
|
|
519
|
-
outputView.aggregate = {
|
|
520
|
-
...aggregate,
|
|
521
|
-
steps: aggregate.steps.map(step => ({ ...step, detailRef: outputView.detailRef })),
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
const command = event.name === 'exec_command' && typeof event.args.command === 'string'
|
|
525
|
-
? event.args.command
|
|
526
|
-
: undefined;
|
|
527
|
-
const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
|
|
528
|
-
return {
|
|
529
|
-
state: event.success ? 'success' : 'error',
|
|
530
|
-
name: event.name,
|
|
531
|
-
detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
|
|
532
|
-
command: safeCommand,
|
|
533
|
-
duration: `${event.duration}ms`,
|
|
534
|
-
summary: event.summary ? (0, session_storage_1.redactTraceText)(event.summary.split(/\r?\n/u, 1)[0]) : undefined,
|
|
535
|
-
outputBytes,
|
|
536
|
-
body: (0, session_storage_1.redactTraceText)(modelVisible.output),
|
|
537
|
-
error: event.error ? (0, session_storage_1.redactTraceText)(event.error) : undefined,
|
|
538
|
-
seq,
|
|
539
|
-
artifactHint: artifactRef ? `/artifacts show ${artifactRef.id} --full` : undefined,
|
|
540
|
-
callId: event.callId,
|
|
541
|
-
turnId: options.turnId,
|
|
542
|
-
outputView,
|
|
543
|
-
};
|
|
544
|
-
}
|
|
545
|
-
function isSyntheticCompactContext(content) {
|
|
546
|
-
return (content.startsWith('[Orion Code Context State v2]') ||
|
|
547
|
-
content.startsWith('[Context Summary]') ||
|
|
548
|
-
content.startsWith('I will continue from this Orion Code Context State') ||
|
|
549
|
-
content.startsWith('I understand the context. I will continue the conversation with this background information.'));
|
|
550
|
-
}
|
|
551
|
-
function sessionToolCallSummaries(message) {
|
|
552
|
-
return (message.tool_calls ?? []).map(call => {
|
|
553
|
-
const args = parseToolCallArgs(call.function.arguments);
|
|
554
|
-
const detail = compactToolArgs(args);
|
|
555
|
-
return {
|
|
556
|
-
id: call.id,
|
|
557
|
-
content: `Requested ${call.function.name}${detail ? ` ${detail}` : ''}`,
|
|
558
|
-
};
|
|
559
|
-
});
|
|
560
|
-
}
|
|
561
|
-
function parseToolCallArgs(rawArgs) {
|
|
562
|
-
try {
|
|
563
|
-
return rawArgs ? JSON.parse(rawArgs) : {};
|
|
564
|
-
}
|
|
565
|
-
catch {
|
|
566
|
-
return rawArgs ? { arguments: rawArgs } : {};
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
function parseSessionToolResult(content) {
|
|
570
|
-
try {
|
|
571
|
-
const parsed = JSON.parse(content);
|
|
572
|
-
return {
|
|
573
|
-
success: parsed.success === true,
|
|
574
|
-
error: typeof parsed.error === 'string' ? parsed.error : undefined,
|
|
575
|
-
summary: typeof parsed.summary === 'string' ? parsed.summary : undefined,
|
|
576
|
-
};
|
|
577
|
-
}
|
|
578
|
-
catch {
|
|
579
|
-
return { success: false, error: 'Invalid JSON result' };
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
function removeTrailingUserMessage(runtime) {
|
|
583
|
-
const history = runtime.store.getSnapshot().conversationHistory;
|
|
584
|
-
if (history.length === 0)
|
|
585
|
-
return;
|
|
586
|
-
const lastMsg = history[history.length - 1];
|
|
587
|
-
if (lastMsg?.role === 'user') {
|
|
588
|
-
runtime.store.setState({ conversationHistory: history.slice(0, -1) });
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
function sessionToolResultSummary(message, toolCallsById) {
|
|
592
|
-
if (!message.toolCallId)
|
|
593
|
-
return null;
|
|
594
|
-
const call = toolCallsById.get(message.toolCallId);
|
|
595
|
-
if (!call)
|
|
596
|
-
return null;
|
|
597
|
-
const args = parseToolCallArgs(call.function.arguments);
|
|
598
|
-
const detail = compactToolArgs(args);
|
|
599
|
-
const parsed = parseSessionToolResult(message.content);
|
|
600
|
-
const firstLine = parsed.summary ||
|
|
601
|
-
`${parsed.success ? '✓' : '✗'} ${call.function.name}${detail ? ` ${detail}` : ''}`;
|
|
602
|
-
return parsed.error ? `${firstLine}\nError: ${parsed.error}` : firstLine;
|
|
603
|
-
}
|
|
604
|
-
function sessionMessagesToTranscriptEntries(sessionId, options = {}) {
|
|
605
|
-
const messages = (0, session_storage_1.loadSessionTranscriptMessages)(sessionId);
|
|
606
|
-
const resultTraces = options.includeToolOutputViews
|
|
607
|
-
? (0, session_storage_1.readSessionTraceEvents)(sessionId).filter(trace => trace.type === 'tool_result' && trace.callId)
|
|
608
|
-
: [];
|
|
609
|
-
const resultTraceByCallId = new Map(resultTraces.map(trace => [trace.callId, trace]));
|
|
610
|
-
const sequenceByCallId = new Map();
|
|
611
|
-
resultTraces.forEach((trace, index) => {
|
|
612
|
-
if (!sequenceByCallId.has(trace.callId))
|
|
613
|
-
sequenceByCallId.set(trace.callId, index + 1);
|
|
614
|
-
});
|
|
615
|
-
const entries = [];
|
|
616
|
-
const toolCallsById = new Map();
|
|
617
|
-
const completedToolCallIds = new Set();
|
|
618
|
-
let fallbackToolSequence = 0;
|
|
619
|
-
for (const message of messages) {
|
|
620
|
-
for (const call of message.tool_calls ?? []) {
|
|
621
|
-
toolCallsById.set(call.id, call);
|
|
622
|
-
}
|
|
623
|
-
if (message.role === 'tool' && message.toolCallId) {
|
|
624
|
-
completedToolCallIds.add(message.toolCallId);
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
messages.forEach((message, index) => {
|
|
628
|
-
if (isSyntheticCompactContext(message.content))
|
|
629
|
-
return;
|
|
630
|
-
const idBase = `session-${sessionId.slice(0, 8)}-${index}`;
|
|
631
|
-
if (message.role === 'user') {
|
|
632
|
-
entries.push({ id: `${idBase}-user`, role: 'user', content: message.content });
|
|
633
|
-
return;
|
|
634
|
-
}
|
|
635
|
-
if (message.role === 'assistant') {
|
|
636
|
-
if (message.content?.trim()) {
|
|
637
|
-
entries.push({ id: `${idBase}-assistant`, role: 'assistant', content: message.content });
|
|
638
|
-
}
|
|
639
|
-
for (const summary of sessionToolCallSummaries(message)) {
|
|
640
|
-
if (!completedToolCallIds.has(summary.id)) {
|
|
641
|
-
entries.push({
|
|
642
|
-
id: `${idBase}-tool-call-${entries.length}`,
|
|
643
|
-
role: 'tool',
|
|
644
|
-
content: summary.content,
|
|
645
|
-
});
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
return;
|
|
649
|
-
}
|
|
650
|
-
if (message.role === 'tool') {
|
|
651
|
-
const summary = sessionToolResultSummary(message, toolCallsById);
|
|
652
|
-
const call = message.toolCallId ? toolCallsById.get(message.toolCallId) : undefined;
|
|
653
|
-
const trace = message.toolCallId ? resultTraceByCallId.get(message.toolCallId) : undefined;
|
|
654
|
-
const durable = (0, tool_serializer_1.parseToolResultEnvelope)(message.content);
|
|
655
|
-
const modelVisible = message.modelVisibleContent
|
|
656
|
-
? (0, tool_serializer_1.parseToolResultEnvelope)(message.modelVisibleContent)
|
|
657
|
-
: durable;
|
|
658
|
-
const durableOutput = typeof durable.output === 'string' ? durable.output : '';
|
|
659
|
-
const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
|
|
660
|
-
const outputBytes = trace?.outputBytes ??
|
|
661
|
-
(durable.schemaVersion === 1 ? durable.outputBytes : undefined) ??
|
|
662
|
-
Buffer.byteLength(durableOutput, 'utf8');
|
|
663
|
-
const artifactId = durable.artifactRef?.id ?? trace?.artifactId;
|
|
664
|
-
fallbackToolSequence += 1;
|
|
665
|
-
const sequence = message.toolCallId
|
|
666
|
-
? (sequenceByCallId.get(message.toolCallId) ?? fallbackToolSequence)
|
|
667
|
-
: fallbackToolSequence;
|
|
668
|
-
const outputView = options.includeToolOutputViews && call && message.toolCallId
|
|
669
|
-
? (0, tool_output_presentation_1.createToolOutputView)({
|
|
670
|
-
toolName: call.function.name,
|
|
671
|
-
success: durable.success,
|
|
672
|
-
summary: durable.summary,
|
|
673
|
-
rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
|
|
674
|
-
outputBytes,
|
|
675
|
-
artifactRef: artifactId ? { id: artifactId, outputBytes } : undefined,
|
|
676
|
-
callId: message.toolCallId,
|
|
677
|
-
sequence,
|
|
678
|
-
turnId: trace?.turnId,
|
|
679
|
-
policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
|
|
680
|
-
})
|
|
681
|
-
: undefined;
|
|
682
|
-
entries.push({
|
|
683
|
-
id: `${idBase}-tool`,
|
|
684
|
-
role: 'tool',
|
|
685
|
-
content: summary ??
|
|
686
|
-
(message.toolCallId
|
|
687
|
-
? `Tool result ${message.toolCallId}\n${message.content}`
|
|
688
|
-
: message.content),
|
|
689
|
-
toolActivity: call && message.toolCallId && outputView
|
|
690
|
-
? {
|
|
691
|
-
state: durable.success ? 'success' : 'error',
|
|
692
|
-
name: call.function.name,
|
|
693
|
-
detail: (0, session_storage_1.redactTraceText)(compactToolArgs(parseToolCallArgs(call.function.arguments))),
|
|
694
|
-
summary: durable.summary
|
|
695
|
-
? (0, session_storage_1.redactTraceText)(durable.summary.split(/\r?\n/u, 1)[0])
|
|
696
|
-
: undefined,
|
|
697
|
-
outputBytes,
|
|
698
|
-
body: (0, session_storage_1.redactTraceText)(durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput),
|
|
699
|
-
error: durable.error ? (0, session_storage_1.redactTraceText)(durable.error) : undefined,
|
|
700
|
-
duration: typeof trace?.duration === 'number' ? `${trace.duration}ms` : undefined,
|
|
701
|
-
seq: sequence,
|
|
702
|
-
artifactHint: artifactId ? `/artifacts show ${artifactId} --full` : undefined,
|
|
703
|
-
callId: message.toolCallId,
|
|
704
|
-
turnId: trace?.turnId,
|
|
705
|
-
outputView,
|
|
706
|
-
}
|
|
707
|
-
: undefined,
|
|
708
|
-
});
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
if (message.role === 'system') {
|
|
712
|
-
entries.push({ id: `${idBase}-system`, role: 'system', content: message.content });
|
|
713
|
-
}
|
|
714
|
-
});
|
|
715
|
-
return entries;
|
|
716
|
-
}
|
|
717
|
-
function createAssistantStreamPresenter(events, abortSignal) {
|
|
718
|
-
let activeSegmentText = '';
|
|
719
|
-
let activeEntryId = null;
|
|
720
|
-
const ensureLiveEntry = () => {
|
|
721
|
-
if (abortSignal?.aborted || !activeSegmentText)
|
|
722
|
-
return null;
|
|
723
|
-
if (activeEntryId) {
|
|
724
|
-
events.update(activeEntryId, { content: activeSegmentText });
|
|
725
|
-
return activeEntryId;
|
|
726
|
-
}
|
|
727
|
-
activeEntryId = events.append({
|
|
728
|
-
role: 'assistant',
|
|
729
|
-
content: activeSegmentText,
|
|
730
|
-
live: true,
|
|
731
|
-
});
|
|
732
|
-
return activeEntryId;
|
|
733
|
-
};
|
|
734
|
-
const flushSegment = () => {
|
|
735
|
-
if (abortSignal?.aborted) {
|
|
736
|
-
if (activeEntryId)
|
|
737
|
-
events.remove(activeEntryId);
|
|
738
|
-
activeEntryId = null;
|
|
739
|
-
activeSegmentText = '';
|
|
740
|
-
return;
|
|
741
|
-
}
|
|
742
|
-
const entryId = ensureLiveEntry();
|
|
743
|
-
if (!entryId)
|
|
744
|
-
return;
|
|
745
|
-
events.finalize(entryId);
|
|
746
|
-
activeEntryId = null;
|
|
747
|
-
activeSegmentText = '';
|
|
748
|
-
};
|
|
749
|
-
return {
|
|
750
|
-
appendChunk(chunk) {
|
|
751
|
-
if (abortSignal?.aborted || !chunk)
|
|
752
|
-
return;
|
|
753
|
-
activeSegmentText += chunk;
|
|
754
|
-
ensureLiveEntry();
|
|
755
|
-
},
|
|
756
|
-
closeSegment() {
|
|
757
|
-
flushSegment();
|
|
758
|
-
},
|
|
759
|
-
discardSegment() {
|
|
760
|
-
if (activeEntryId)
|
|
761
|
-
events.remove(activeEntryId);
|
|
762
|
-
activeEntryId = null;
|
|
763
|
-
activeSegmentText = '';
|
|
764
|
-
},
|
|
765
|
-
ensureMessage(content) {
|
|
766
|
-
if (abortSignal?.aborted || !content || activeSegmentText.length > 0)
|
|
767
|
-
return;
|
|
768
|
-
activeSegmentText = content;
|
|
769
|
-
ensureLiveEntry();
|
|
770
|
-
},
|
|
771
|
-
replaceMessage(content) {
|
|
772
|
-
if (abortSignal?.aborted || !content)
|
|
773
|
-
return;
|
|
774
|
-
activeSegmentText = content;
|
|
775
|
-
ensureLiveEntry();
|
|
776
|
-
},
|
|
777
|
-
};
|
|
778
|
-
}
|
|
779
|
-
const goalTraceContext = new async_hooks_1.AsyncLocalStorage();
|
|
780
|
-
class LocalFastPathBlockedError extends Error {
|
|
781
|
-
constructor(message) {
|
|
782
|
-
super(message);
|
|
783
|
-
this.name = 'LocalFastPathBlockedError';
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
function parseLocalFastPath(input) {
|
|
787
|
-
const text = input.trim();
|
|
788
|
-
if (/^git\s+status$/i.test(text)) {
|
|
789
|
-
return { tool: 'git_status', args: {}, label: 'git status' };
|
|
790
|
-
}
|
|
791
|
-
const readMatch = /^(?:read|读取)\s+(.+)$/i.exec(text);
|
|
792
|
-
const readTarget = readMatch?.[1]?.trim();
|
|
793
|
-
const looksLikePath = Boolean(readTarget) &&
|
|
794
|
-
!/\s/.test(readTarget) &&
|
|
795
|
-
(/[/\\.]/.test(readTarget) || readTarget.startsWith('~'));
|
|
796
|
-
if (readTarget && looksLikePath) {
|
|
797
|
-
return { tool: 'read_file', args: { path: readTarget }, label: `read ${readTarget}` };
|
|
798
|
-
}
|
|
799
|
-
const grepMatch = /^(?:grep|搜索)\s+(.+)$/i.exec(text);
|
|
800
|
-
if (grepMatch?.[1]?.trim()) {
|
|
801
|
-
return {
|
|
802
|
-
tool: 'grep',
|
|
803
|
-
args: { pattern: grepMatch[1].trim() },
|
|
804
|
-
label: `grep ${grepMatch[1].trim()}`,
|
|
805
|
-
};
|
|
806
|
-
}
|
|
807
|
-
const runTestMatch = /^(?:run\s+test|运行测试)\s*[::]\s*(.+)$/i.exec(text);
|
|
808
|
-
if (runTestMatch?.[1]?.trim()) {
|
|
809
|
-
return {
|
|
810
|
-
tool: 'exec_command',
|
|
811
|
-
args: { command: runTestMatch[1].trim() },
|
|
812
|
-
label: `run test: ${runTestMatch[1].trim()}`,
|
|
813
|
-
};
|
|
814
|
-
}
|
|
815
|
-
return null;
|
|
816
|
-
}
|
|
817
|
-
function formatLocalFastPathAssistantContent(action, rawResult, projectPath) {
|
|
818
|
-
const envelope = (0, tool_serializer_1.parseToolResultEnvelope)(rawResult);
|
|
819
|
-
const rawOutput = typeof envelope.output === 'string' ? envelope.output : '';
|
|
820
|
-
const output = rawOutput.trim();
|
|
821
|
-
const summary = envelope.summary || `${action.tool} ${envelope.success ? 'completed' : 'failed'}`;
|
|
822
|
-
const lines = [
|
|
823
|
-
envelope.success
|
|
824
|
-
? `Local fast path completed ${action.label}.`
|
|
825
|
-
: `Local fast path failed ${action.label}.`,
|
|
826
|
-
'',
|
|
827
|
-
summary,
|
|
828
|
-
];
|
|
829
|
-
if (!envelope.success && envelope.error) {
|
|
830
|
-
lines.push(`Error: ${envelope.error}`);
|
|
831
|
-
}
|
|
832
|
-
if (!output) {
|
|
833
|
-
return { content: lines.join('\n'), artifactRef: envelope.artifactRef };
|
|
834
|
-
}
|
|
835
|
-
let artifactRef = envelope.artifactRef;
|
|
836
|
-
let preview = output;
|
|
837
|
-
const outputBytes = envelope.outputBytes ?? byteLength(rawOutput);
|
|
838
|
-
if (byteLength(rawOutput) > LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES) {
|
|
839
|
-
if (!artifactRef) {
|
|
840
|
-
const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, action.tool, rawOutput, outputBytes);
|
|
841
|
-
artifactRef = artifact ? { id: artifact.id, outputBytes: artifact.outputBytes } : undefined;
|
|
842
|
-
}
|
|
843
|
-
preview = (0, tool_artifacts_1.truncateForContext)(output, LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES);
|
|
844
|
-
}
|
|
845
|
-
if (artifactRef) {
|
|
846
|
-
lines.push('', `Full output: /artifacts show ${artifactRef.id} --full (${(0, format_1.formatBytes)(artifactRef.outputBytes)})`);
|
|
847
|
-
}
|
|
848
|
-
lines.push('', 'Preview:', preview);
|
|
849
|
-
return { content: lines.join('\n'), artifactRef };
|
|
850
|
-
}
|
|
851
|
-
function createToolEventPresenter(events, options = {}) {
|
|
852
|
-
const runningToolEntries = new Map();
|
|
853
|
-
let toolSequenceCounter = 0;
|
|
854
|
-
return {
|
|
855
|
-
start(event) {
|
|
856
|
-
const seq = ++toolSequenceCounter;
|
|
857
|
-
const entryId = events.append({
|
|
858
|
-
role: 'tool',
|
|
859
|
-
title: 'tool',
|
|
860
|
-
content: toolStartContent(event),
|
|
861
|
-
toolActivity: structuredToolStartActivity(event, seq),
|
|
862
|
-
});
|
|
863
|
-
runningToolEntries.set(event.callId, {
|
|
864
|
-
entryId,
|
|
865
|
-
name: event.name,
|
|
866
|
-
args: event.args,
|
|
867
|
-
sequence: seq,
|
|
868
|
-
batchCount: event.batchCount,
|
|
869
|
-
batchIndex: event.batchIndex,
|
|
870
|
-
});
|
|
871
|
-
events.toolStarted?.({
|
|
872
|
-
callId: event.callId,
|
|
873
|
-
name: event.name,
|
|
874
|
-
args: event.args,
|
|
875
|
-
sequence: seq,
|
|
876
|
-
batchCount: event.batchCount,
|
|
877
|
-
batchIndex: event.batchIndex,
|
|
878
|
-
});
|
|
879
|
-
},
|
|
880
|
-
finish(event) {
|
|
881
|
-
const content = toolFinishContent(event);
|
|
882
|
-
const stored = runningToolEntries.get(event.callId);
|
|
883
|
-
const seq = stored?.sequence ?? ++toolSequenceCounter;
|
|
884
|
-
const toolActivity = structuredToolFinishActivity(event, seq, options);
|
|
885
|
-
if (stored) {
|
|
886
|
-
events.finalize(stored.entryId, {
|
|
887
|
-
role: event.success ? 'tool' : 'error',
|
|
888
|
-
title: 'tool',
|
|
889
|
-
content,
|
|
890
|
-
toolActivity,
|
|
891
|
-
});
|
|
892
|
-
runningToolEntries.delete(event.callId);
|
|
893
|
-
}
|
|
894
|
-
else {
|
|
895
|
-
const entryId = events.append({
|
|
896
|
-
role: event.success ? 'tool' : 'error',
|
|
897
|
-
title: 'tool',
|
|
898
|
-
content,
|
|
899
|
-
toolActivity,
|
|
900
|
-
});
|
|
901
|
-
events.finalize(entryId);
|
|
902
|
-
}
|
|
903
|
-
events.toolFinished?.({
|
|
904
|
-
callId: event.callId,
|
|
905
|
-
name: event.name,
|
|
906
|
-
args: event.args,
|
|
907
|
-
success: event.success,
|
|
908
|
-
duration: event.duration,
|
|
909
|
-
summary: event.summary,
|
|
910
|
-
error: event.error,
|
|
911
|
-
outputBytes: event.outputBytes,
|
|
912
|
-
artifactRef: toolActivity.outputView?.detailRef?.artifactId
|
|
913
|
-
? {
|
|
914
|
-
id: toolActivity.outputView.detailRef.artifactId,
|
|
915
|
-
outputBytes: toolActivity.outputView.detailRef.outputBytes,
|
|
916
|
-
}
|
|
917
|
-
: event.artifactRef,
|
|
918
|
-
externalAssertion: event.externalAssertion,
|
|
919
|
-
sequence: seq,
|
|
920
|
-
batchCount: event.batchCount,
|
|
921
|
-
batchIndex: event.batchIndex,
|
|
922
|
-
});
|
|
923
|
-
},
|
|
924
|
-
finalizePendingAsSkipped(reason = 'permission denied') {
|
|
925
|
-
for (const [callId, entry] of runningToolEntries) {
|
|
926
|
-
events.finalize(entry.entryId, {
|
|
927
|
-
role: 'tool',
|
|
928
|
-
title: 'tool',
|
|
929
|
-
content: `Skipped · ${reason}`,
|
|
930
|
-
toolActivity: {
|
|
931
|
-
state: 'skipped',
|
|
932
|
-
name: entry.name,
|
|
933
|
-
detail: '',
|
|
934
|
-
body: '',
|
|
935
|
-
error: reason,
|
|
936
|
-
seq: entry.sequence,
|
|
937
|
-
},
|
|
938
|
-
});
|
|
939
|
-
events.toolFinished?.({
|
|
940
|
-
callId,
|
|
941
|
-
name: entry.name,
|
|
942
|
-
args: entry.args,
|
|
943
|
-
success: false,
|
|
944
|
-
skipped: true,
|
|
945
|
-
duration: 0,
|
|
946
|
-
error: reason,
|
|
947
|
-
sequence: entry.sequence,
|
|
948
|
-
batchCount: entry.batchCount,
|
|
949
|
-
batchIndex: entry.batchIndex,
|
|
950
|
-
});
|
|
951
|
-
}
|
|
952
|
-
runningToolEntries.clear();
|
|
953
|
-
},
|
|
954
|
-
};
|
|
955
|
-
}
|
|
956
|
-
async function captureConsoleOutput(fn) {
|
|
957
|
-
const lines = [];
|
|
958
|
-
const originalLog = console.log;
|
|
959
|
-
const originalError = console.error;
|
|
960
|
-
const originalWarn = console.warn;
|
|
961
|
-
const capture = (...args) => {
|
|
962
|
-
lines.push(stripAnsi(args.map(arg => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ')));
|
|
963
|
-
};
|
|
964
|
-
console.log = capture;
|
|
965
|
-
console.error = capture;
|
|
966
|
-
console.warn = capture;
|
|
967
|
-
try {
|
|
968
|
-
const result = await fn();
|
|
969
|
-
return { result, output: lines.join('\n').trim() };
|
|
970
|
-
}
|
|
971
|
-
finally {
|
|
972
|
-
console.log = originalLog;
|
|
973
|
-
console.error = originalError;
|
|
974
|
-
console.warn = originalWarn;
|
|
975
|
-
}
|
|
976
|
-
}
|
|
29
|
+
const observability_1 = require("../utils/observability");
|
|
30
|
+
const chat_trace_1 = require("./chat-trace");
|
|
31
|
+
const chat_checkpoint_1 = require("./chat-checkpoint");
|
|
32
|
+
const chat_workspace_1 = require("./chat-workspace");
|
|
33
|
+
const chat_presentation_1 = require("./chat-presentation");
|
|
34
|
+
const chat_effort_1 = require("./chat-effort");
|
|
35
|
+
var chat_presentation_2 = require("./chat-presentation");
|
|
36
|
+
Object.defineProperty(exports, "createAssistantStreamPresenter", { enumerable: true, get: function () { return chat_presentation_2.createAssistantStreamPresenter; } });
|
|
37
|
+
Object.defineProperty(exports, "createToolEventPresenter", { enumerable: true, get: function () { return chat_presentation_2.createToolEventPresenter; } });
|
|
38
|
+
Object.defineProperty(exports, "sessionMessagesToTranscriptEntries", { enumerable: true, get: function () { return chat_presentation_2.sessionMessagesToTranscriptEntries; } });
|
|
977
39
|
class AgentChatController {
|
|
978
40
|
setGoalCoordinator(coord) {
|
|
979
41
|
this.goalCoordinator = coord;
|
|
980
42
|
}
|
|
981
43
|
resolveToolAllowlist() {
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
}
|
|
986
|
-
return this.toolAllowlistCache.evaluator;
|
|
44
|
+
// Reload on every scheduling boundary so a project/global approval selected
|
|
45
|
+
// by the interactive prompt affects the very next tool call in this process.
|
|
46
|
+
return (0, tool_allowlist_1.resolveProjectToolAllowlist)(this.runtime.cwd).evaluator;
|
|
987
47
|
}
|
|
988
48
|
constructor(runtime, events, controllerOptions = {}) {
|
|
989
49
|
this.runtime = runtime;
|
|
@@ -1010,7 +70,7 @@ class AgentChatController {
|
|
|
1010
70
|
});
|
|
1011
71
|
const parsed = (0, parser_1.parseInput)(text);
|
|
1012
72
|
if (!parsed.isCommand) {
|
|
1013
|
-
const localFastPath = parseLocalFastPath(text);
|
|
73
|
+
const localFastPath = (0, chat_presentation_1.parseLocalFastPath)(text);
|
|
1014
74
|
if (localFastPath) {
|
|
1015
75
|
await this.runLocalFastPath(text, localFastPath, options);
|
|
1016
76
|
return;
|
|
@@ -1050,6 +110,23 @@ class AgentChatController {
|
|
|
1050
110
|
});
|
|
1051
111
|
return;
|
|
1052
112
|
}
|
|
113
|
+
const compatibilityAlias = command.compatibilityAliases?.find(alias => alias.name.toLowerCase() === parsed.name.toLowerCase());
|
|
114
|
+
const deprecation = compatibilityAlias?.lifecycle ??
|
|
115
|
+
(command.lifecycle.status === 'deprecated' ? command.lifecycle : undefined);
|
|
116
|
+
if (deprecation) {
|
|
117
|
+
this.events.append({
|
|
118
|
+
role: 'system',
|
|
119
|
+
title: `/${parsed.name} deprecated`,
|
|
120
|
+
content: `/${parsed.name} is deprecated${deprecation.replacement ? `; use ${deprecation.replacement}` : ''}. It will be removed in ${deprecation.removeIn ?? 'a future release'}.`,
|
|
121
|
+
statusTone: 'warning',
|
|
122
|
+
command: {
|
|
123
|
+
id: command.id,
|
|
124
|
+
name: command.name,
|
|
125
|
+
source: command.source,
|
|
126
|
+
success: true,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
1053
130
|
const ctx = this.createCommandContext(options.abortSignal, options.turnId);
|
|
1054
131
|
let commandProviderAttempts = 0;
|
|
1055
132
|
const commandProviderPreflight = async (context) => {
|
|
@@ -1073,7 +150,13 @@ class AgentChatController {
|
|
|
1073
150
|
let result;
|
|
1074
151
|
let output;
|
|
1075
152
|
try {
|
|
1076
|
-
|
|
153
|
+
if (command.audience === 'primary') {
|
|
154
|
+
result = await command.execute(ctx, parsed.args);
|
|
155
|
+
output = '';
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
({ result, output } = await (0, chat_presentation_1.captureConsoleOutput)(() => command.execute(ctx, parsed.args)));
|
|
159
|
+
}
|
|
1077
160
|
}
|
|
1078
161
|
finally {
|
|
1079
162
|
unsubscribeCommandUsage?.();
|
|
@@ -1083,7 +166,7 @@ class AgentChatController {
|
|
|
1083
166
|
}
|
|
1084
167
|
const providerRequests = Math.max(commandProviderAttempts, commandUsageEvents);
|
|
1085
168
|
if (providerRequests > 0) {
|
|
1086
|
-
const diagnostics = getLastRequestDiagnostics(this.runtime.llm);
|
|
169
|
+
const diagnostics = (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm);
|
|
1087
170
|
const retryCount = diagnostics?.retryCount ?? 0;
|
|
1088
171
|
const fallbackCount = diagnostics?.fallbackTriggered ? 1 : 0;
|
|
1089
172
|
this.setLoopStats({
|
|
@@ -1112,11 +195,18 @@ class AgentChatController {
|
|
|
1112
195
|
});
|
|
1113
196
|
}
|
|
1114
197
|
}
|
|
198
|
+
const commandMeta = {
|
|
199
|
+
id: command.id,
|
|
200
|
+
name: command.name,
|
|
201
|
+
source: command.source,
|
|
202
|
+
success: result.success,
|
|
203
|
+
};
|
|
1115
204
|
if (output) {
|
|
1116
205
|
this.events.append({
|
|
1117
206
|
role: result.success ? 'system' : 'error',
|
|
1118
207
|
title: `/${command.name}`,
|
|
1119
208
|
content: output,
|
|
209
|
+
command: commandMeta,
|
|
1120
210
|
});
|
|
1121
211
|
}
|
|
1122
212
|
if (result.output) {
|
|
@@ -1124,6 +214,7 @@ class AgentChatController {
|
|
|
1124
214
|
role: result.success ? 'system' : 'error',
|
|
1125
215
|
title: `/${command.name}`,
|
|
1126
216
|
content: result.output,
|
|
217
|
+
command: commandMeta,
|
|
1127
218
|
});
|
|
1128
219
|
}
|
|
1129
220
|
if (result.error) {
|
|
@@ -1132,6 +223,7 @@ class AgentChatController {
|
|
|
1132
223
|
title: `/${command.name}`,
|
|
1133
224
|
content: result.error,
|
|
1134
225
|
errorLayer: 'runtime',
|
|
226
|
+
command: commandMeta,
|
|
1135
227
|
});
|
|
1136
228
|
}
|
|
1137
229
|
if (result.sessionPicker) {
|
|
@@ -1146,6 +238,9 @@ class AgentChatController {
|
|
|
1146
238
|
this.events.showEditPreview(result.editPreview);
|
|
1147
239
|
return;
|
|
1148
240
|
}
|
|
241
|
+
if (result.effortEvent) {
|
|
242
|
+
this.events.effortEvent?.(result.effortEvent);
|
|
243
|
+
}
|
|
1149
244
|
if (result.continueAsChat) {
|
|
1150
245
|
await this.runChat(result.chatInput ?? parsed.args, options);
|
|
1151
246
|
}
|
|
@@ -1162,7 +257,7 @@ class AgentChatController {
|
|
|
1162
257
|
await run();
|
|
1163
258
|
return;
|
|
1164
259
|
}
|
|
1165
|
-
await goalTraceContext.run({
|
|
260
|
+
await chat_trace_1.goalTraceContext.run({
|
|
1166
261
|
goalId: request.goal.goalId,
|
|
1167
262
|
goalRevision: request.goal.revision,
|
|
1168
263
|
goalInputKind: request.inputKind,
|
|
@@ -1174,30 +269,35 @@ class AgentChatController {
|
|
|
1174
269
|
this.runtime.ensureSession() ??
|
|
1175
270
|
(0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
|
|
1176
271
|
const sessionId = activeSession?.id;
|
|
1177
|
-
const turnId = traceTurnId(options.turnId);
|
|
272
|
+
const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
|
|
273
|
+
(0, observability_1.setDiagnosticTraceContext)({
|
|
274
|
+
traceId: `${sessionId ?? 'local'}:${turnId}`,
|
|
275
|
+
...(sessionId ? { sessionId } : {}),
|
|
276
|
+
turnId,
|
|
277
|
+
});
|
|
1178
278
|
const localCallId = `local-${turnId}`;
|
|
1179
279
|
const start = Date.now();
|
|
1180
280
|
const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
|
|
1181
|
-
const traceArgs = buildTraceArgsDetails(this.runtime.cwd, action.tool, action.args);
|
|
281
|
+
const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, action.tool, action.args);
|
|
1182
282
|
if (sessionId) {
|
|
1183
283
|
(0, session_storage_1.appendSessionMessage)(sessionId, {
|
|
1184
284
|
role: 'user',
|
|
1185
285
|
content: input,
|
|
1186
286
|
timestamp: Date.now(),
|
|
1187
287
|
});
|
|
1188
|
-
recordTraceEvent(this.events, sessionId, {
|
|
288
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1189
289
|
turnId,
|
|
1190
290
|
type: 'turn_start',
|
|
1191
|
-
inputBytes: byteLength(input),
|
|
291
|
+
inputBytes: (0, chat_trace_1.byteLength)(input),
|
|
1192
292
|
localFastPathUsed: true,
|
|
1193
293
|
});
|
|
1194
|
-
appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
1195
|
-
recordTraceEvent(this.events, sessionId, {
|
|
294
|
+
(0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
295
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1196
296
|
turnId,
|
|
1197
297
|
type: 'local_fast_path',
|
|
1198
298
|
name: action.tool,
|
|
1199
299
|
...traceArgs,
|
|
1200
|
-
note: compactMiddle(action.label, 160),
|
|
300
|
+
note: (0, chat_trace_1.compactMiddle)(action.label, 160),
|
|
1201
301
|
});
|
|
1202
302
|
}
|
|
1203
303
|
if (options.persistAsUserMessage !== false) {
|
|
@@ -1206,6 +306,11 @@ class AgentChatController {
|
|
|
1206
306
|
this.events.setStatus(`Running local ${action.label}...`);
|
|
1207
307
|
try {
|
|
1208
308
|
const tool = (0, tools_1.getRuntimeTools)().find(candidate => candidate.name === action.tool);
|
|
309
|
+
if (!tool) {
|
|
310
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(`Local fast path tool ${action.tool} is unavailable.`);
|
|
311
|
+
}
|
|
312
|
+
const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
|
|
313
|
+
const toolAllowlist = this.resolveToolAllowlist();
|
|
1209
314
|
const toolContext = {
|
|
1210
315
|
cwd: this.runtime.cwd,
|
|
1211
316
|
config: {
|
|
@@ -1214,17 +319,57 @@ class AgentChatController {
|
|
|
1214
319
|
},
|
|
1215
320
|
sessionId,
|
|
1216
321
|
turnId,
|
|
322
|
+
permissionMode: effectivePermissionMode,
|
|
323
|
+
toolAllowlist,
|
|
324
|
+
toolConfirmation: this.runtime.config.toolConfirmation,
|
|
325
|
+
confirmToolUse: this.controllerOptions.confirmToolUse,
|
|
1217
326
|
};
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
throw new LocalFastPathBlockedError(reason);
|
|
327
|
+
let permission;
|
|
328
|
+
try {
|
|
329
|
+
permission = tool.checkPermissions?.(action.args, toolContext);
|
|
1222
330
|
}
|
|
1223
|
-
|
|
1224
|
-
|
|
331
|
+
catch (error) {
|
|
332
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
333
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(`Permission check failed closed: ${detail}`);
|
|
334
|
+
}
|
|
335
|
+
const effective = (0, tool_scheduler_1.resolveEffectivePermission)({
|
|
336
|
+
toolName: action.tool,
|
|
337
|
+
tool,
|
|
338
|
+
args: action.args,
|
|
339
|
+
permission,
|
|
340
|
+
permissionMode: effectivePermissionMode,
|
|
341
|
+
allowlist: toolAllowlist?.(action.tool, action.args),
|
|
342
|
+
toolConfirmation: this.runtime.config.toolConfirmation,
|
|
343
|
+
});
|
|
344
|
+
// Local exec is a hidden shortcut rather than a plan artifact. Even a
|
|
345
|
+
// read-only command must not execute through that shortcut in plan mode.
|
|
346
|
+
if (effectivePermissionMode === 'plan' && action.tool === 'exec_command') {
|
|
347
|
+
throw new chat_presentation_1.LocalFastPathBlockedError('Local run-test fast path is blocked in plan mode; switch mode before executing commands.');
|
|
348
|
+
}
|
|
349
|
+
if (effective.outcome === 'deny' || effective.outcome === 'block') {
|
|
350
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(effective.reason ||
|
|
351
|
+
`Local fast path blocked by ${effective.source ?? 'permission policy'}.`);
|
|
352
|
+
}
|
|
353
|
+
if (effective.outcome === 'confirm') {
|
|
354
|
+
if (this.runtime.config.toolConfirmation === 'deny' ||
|
|
355
|
+
!this.controllerOptions.confirmToolUse) {
|
|
356
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(effective.reason || 'Local fast path requires user confirmation.');
|
|
357
|
+
}
|
|
358
|
+
const approved = await this.controllerOptions.confirmToolUse({
|
|
359
|
+
name: action.tool,
|
|
360
|
+
args: action.args,
|
|
361
|
+
reason: effective.reason,
|
|
362
|
+
abortSignal: options.abortSignal,
|
|
363
|
+
});
|
|
364
|
+
if (!approved) {
|
|
365
|
+
throw new chat_presentation_1.LocalFastPathBlockedError(`Local fast path ${action.tool} requires confirmation and was denied by user.`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
if (options.abortSignal?.aborted) {
|
|
369
|
+
throw new chat_presentation_1.LocalFastPathBlockedError('Local fast path was cancelled before tool execution.');
|
|
1225
370
|
}
|
|
1226
371
|
if (sessionId) {
|
|
1227
|
-
recordTraceEvent(this.events, sessionId, {
|
|
372
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1228
373
|
turnId,
|
|
1229
374
|
type: 'tool_call',
|
|
1230
375
|
name: action.tool,
|
|
@@ -1242,7 +387,7 @@ class AgentChatController {
|
|
|
1242
387
|
const outputBytes = typeof envelope.outputBytes === 'number'
|
|
1243
388
|
? envelope.outputBytes
|
|
1244
389
|
: Buffer.byteLength(result, 'utf8');
|
|
1245
|
-
const formattedLocalResult = formatLocalFastPathAssistantContent(action, result, this.runtime.cwd);
|
|
390
|
+
const formattedLocalResult = (0, chat_presentation_1.formatLocalFastPathAssistantContent)(action, result, this.runtime.cwd);
|
|
1246
391
|
const assistantContent = formattedLocalResult.content;
|
|
1247
392
|
const stats = (0, framework_1.createLocalFastPathLoopStats)({
|
|
1248
393
|
finishReason: envelope.success ? 'completed' : 'failed',
|
|
@@ -1270,8 +415,8 @@ class AgentChatController {
|
|
|
1270
415
|
this.events.append({
|
|
1271
416
|
role: envelope.success ? 'tool' : 'error',
|
|
1272
417
|
title: 'local',
|
|
1273
|
-
content: toolFinishContent(localToolResultEvent),
|
|
1274
|
-
toolActivity: structuredToolFinishActivity(localToolResultEvent, 1, {
|
|
418
|
+
content: (0, chat_presentation_1.toolFinishContent)(localToolResultEvent),
|
|
419
|
+
toolActivity: (0, chat_presentation_1.structuredToolFinishActivity)(localToolResultEvent, 1, {
|
|
1275
420
|
projectPath: this.runtime.cwd,
|
|
1276
421
|
turnId,
|
|
1277
422
|
}),
|
|
@@ -1279,7 +424,7 @@ class AgentChatController {
|
|
|
1279
424
|
this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
|
|
1280
425
|
this.setLoopStats(stats);
|
|
1281
426
|
if (sessionId) {
|
|
1282
|
-
recordTraceEvent(this.events, sessionId, {
|
|
427
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1283
428
|
turnId,
|
|
1284
429
|
type: 'tool_result',
|
|
1285
430
|
name: action.tool,
|
|
@@ -1292,10 +437,10 @@ class AgentChatController {
|
|
|
1292
437
|
outputBytes,
|
|
1293
438
|
modelVisibleBytes: 0,
|
|
1294
439
|
artifactId: formattedLocalResult.artifactRef?.id,
|
|
1295
|
-
error: envelope.error ? compactMiddle(envelope.error, 240) : undefined,
|
|
440
|
+
error: envelope.error ? (0, chat_trace_1.compactMiddle)(envelope.error, 240) : undefined,
|
|
1296
441
|
});
|
|
1297
|
-
appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
1298
|
-
recordTraceEvent(this.events, sessionId, {
|
|
442
|
+
(0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
443
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1299
444
|
turnId,
|
|
1300
445
|
type: 'complete',
|
|
1301
446
|
finishReason: stats.finishReason,
|
|
@@ -1323,21 +468,21 @@ class AgentChatController {
|
|
|
1323
468
|
this.events.setStatus('Local command failed. Ready for the next input.');
|
|
1324
469
|
const assistantContent = `Local fast path failed for ${action.label}.\n\n${message}`;
|
|
1325
470
|
this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
|
|
1326
|
-
const finishReason = error instanceof LocalFastPathBlockedError ? 'blocked' : 'failed';
|
|
471
|
+
const finishReason = error instanceof chat_presentation_1.LocalFastPathBlockedError ? 'blocked' : 'failed';
|
|
1327
472
|
const stats = (0, framework_1.createLocalFastPathLoopStats)({
|
|
1328
473
|
finishReason,
|
|
1329
474
|
toolCalls: 0,
|
|
1330
475
|
});
|
|
1331
476
|
this.setLoopStats(stats);
|
|
1332
477
|
if (sessionId) {
|
|
1333
|
-
recordTraceEvent(this.events, sessionId, {
|
|
478
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1334
479
|
turnId,
|
|
1335
480
|
type: 'error',
|
|
1336
481
|
name: action.tool,
|
|
1337
|
-
error: compactTraceError(error),
|
|
482
|
+
error: (0, chat_trace_1.compactTraceError)(error),
|
|
1338
483
|
});
|
|
1339
|
-
appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
1340
|
-
recordTraceEvent(this.events, sessionId, {
|
|
484
|
+
(0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
|
|
485
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1341
486
|
turnId,
|
|
1342
487
|
type: 'complete',
|
|
1343
488
|
finishReason: stats.finishReason,
|
|
@@ -1367,8 +512,9 @@ class AgentChatController {
|
|
|
1367
512
|
ensureSession: this.runtime.ensureSession,
|
|
1368
513
|
setSession: session => {
|
|
1369
514
|
this.runtime.setSession(session);
|
|
515
|
+
(0, chat_effort_1.applySessionEffort)(this.runtime, this.events, session);
|
|
1370
516
|
const renderer = this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal';
|
|
1371
|
-
this.events.replaceTranscript(sessionMessagesToTranscriptEntries(session.id, {
|
|
517
|
+
this.events.replaceTranscript((0, chat_presentation_1.sessionMessagesToTranscriptEntries)(session.id, {
|
|
1372
518
|
includeToolOutputViews: renderer === 'tui',
|
|
1373
519
|
}));
|
|
1374
520
|
},
|
|
@@ -1423,7 +569,7 @@ class AgentChatController {
|
|
|
1423
569
|
if (sessionId) {
|
|
1424
570
|
const traceType = stateToTraceType[event.state];
|
|
1425
571
|
if (traceType) {
|
|
1426
|
-
recordTraceEvent(this.events, sessionId, {
|
|
572
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1427
573
|
turnId: String(turnId),
|
|
1428
574
|
type: traceType,
|
|
1429
575
|
name: `${event.role}:${event.taskId}`,
|
|
@@ -1501,11 +647,16 @@ class AgentChatController {
|
|
|
1501
647
|
// any provider request so failures without usage cannot inherit stale data.
|
|
1502
648
|
this.runtime.store.setState({ tokenUsage: null });
|
|
1503
649
|
const abortSignal = options.abortSignal;
|
|
1504
|
-
const turnId = traceTurnId(options.turnId);
|
|
650
|
+
const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
|
|
1505
651
|
const activeSession = this.runtime.getSession() ??
|
|
1506
652
|
this.runtime.ensureSession() ??
|
|
1507
653
|
(0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
|
|
1508
654
|
const sessionId = activeSession?.id;
|
|
655
|
+
(0, observability_1.setDiagnosticTraceContext)({
|
|
656
|
+
traceId: `${sessionId ?? 'unsaved'}:${turnId}`,
|
|
657
|
+
...(sessionId ? { sessionId } : {}),
|
|
658
|
+
turnId,
|
|
659
|
+
});
|
|
1509
660
|
const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
|
|
1510
661
|
const runtimeTools = (0, tools_1.getRuntimeTools)();
|
|
1511
662
|
const skillResolution = (0, skills_1.resolveSkillsForTurn)({
|
|
@@ -1523,19 +674,20 @@ class AgentChatController {
|
|
|
1523
674
|
timestamp: Date.now(),
|
|
1524
675
|
appliedSkills: appliedSkillNames.length > 0 ? appliedSkillNames : undefined,
|
|
1525
676
|
});
|
|
1526
|
-
recordTraceEvent(this.events, sessionId, {
|
|
677
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1527
678
|
turnId,
|
|
1528
679
|
type: 'turn_start',
|
|
1529
|
-
inputBytes: byteLength(input),
|
|
680
|
+
inputBytes: (0, chat_trace_1.byteLength)(input),
|
|
1530
681
|
note: appliedSkillNames.length > 0 ? `skills=${appliedSkillNames.join(',')}` : undefined,
|
|
1531
682
|
});
|
|
1532
|
-
appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
683
|
+
(0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
|
|
1533
684
|
}
|
|
1534
685
|
if (options.persistAsUserMessage !== false) {
|
|
1535
686
|
this.runtime.store.addMessage({ role: 'user', content: input });
|
|
1536
687
|
}
|
|
1537
688
|
(0, prompt_context_1.refreshProjectInstructions)(this.runtime.store, this.runtime.cwd);
|
|
1538
689
|
const snapshot = this.runtime.store.getSnapshot();
|
|
690
|
+
const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
|
|
1539
691
|
const harness = (0, harness_1.createContextHarness)({
|
|
1540
692
|
cwd: this.runtime.cwd,
|
|
1541
693
|
modelId: this.runtime.llm.getModel(),
|
|
@@ -1576,7 +728,7 @@ class AgentChatController {
|
|
|
1576
728
|
onSubtaskEvent: event => {
|
|
1577
729
|
this.handleSubtaskEvent(event, sessionId, turnId);
|
|
1578
730
|
},
|
|
1579
|
-
onSubtaskResult: (result, _batchId, objective) => {
|
|
731
|
+
onSubtaskResult: (result, _batchId, objective, researchContext) => {
|
|
1580
732
|
if (!projectPath)
|
|
1581
733
|
return;
|
|
1582
734
|
const json = JSON.stringify(result);
|
|
@@ -1586,7 +738,7 @@ class AgentChatController {
|
|
|
1586
738
|
// The subtask state transition (subtask_completed) is already
|
|
1587
739
|
// emitted by handleSubtaskEvent above.
|
|
1588
740
|
if (sessionId) {
|
|
1589
|
-
recordTraceEvent(this.events, sessionId, {
|
|
741
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1590
742
|
turnId: String(turnId),
|
|
1591
743
|
type: 'subtask_artifact_stored',
|
|
1592
744
|
name: `${result.role}:${result.id}`,
|
|
@@ -1606,19 +758,38 @@ class AgentChatController {
|
|
|
1606
758
|
const goal = this.goalCoordinator?.goal;
|
|
1607
759
|
const objectiveRevision = goal?.contract?.objectiveRevision;
|
|
1608
760
|
const hasGoalBinding = typeof goal?.goalId === 'string' && typeof objectiveRevision === 'number';
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
:
|
|
761
|
+
// Preserve the authoritative request produced from the
|
|
762
|
+
// original subtask capability. Reconstruct local-only only for
|
|
763
|
+
// legacy callers that predate the additive callback context.
|
|
764
|
+
const baseRequest = researchContext?.request ??
|
|
765
|
+
(0, subagents_1.createLocalResearchRequest)(objective?.trim() || result.summary || 'repository research', projectPath);
|
|
766
|
+
const request = {
|
|
767
|
+
...baseRequest,
|
|
768
|
+
scope: { ...baseRequest.scope, projectRoot: projectPath },
|
|
769
|
+
...(hasGoalBinding
|
|
770
|
+
? {
|
|
771
|
+
goalBinding: {
|
|
772
|
+
goalId: goal.goalId,
|
|
773
|
+
objectiveRevision,
|
|
774
|
+
},
|
|
775
|
+
}
|
|
776
|
+
: {}),
|
|
777
|
+
};
|
|
1617
778
|
const packet = (0, subagents_1.subtaskResultToPacket)(result, request, {
|
|
1618
779
|
projectPath,
|
|
1619
780
|
sessionId,
|
|
1620
781
|
...(hasGoalBinding ? { goalId: goal.goalId, objectiveRevision } : {}),
|
|
782
|
+
}, {
|
|
783
|
+
externalSources: researchContext?.web?.sources,
|
|
784
|
+
externalNotes: researchContext?.web?.notes,
|
|
785
|
+
externalTimedOut: researchContext?.web?.timedOut,
|
|
786
|
+
externalAborted: researchContext?.web?.aborted,
|
|
1621
787
|
});
|
|
788
|
+
// Citation resolution can downgrade claims and mark superseded
|
|
789
|
+
// same-URL sources stale. Resolve before validation/persistence so
|
|
790
|
+
// the CAS token, durable packet and renderer view describe the
|
|
791
|
+
// exact same final state (#105).
|
|
792
|
+
const resolution = (0, subagents_1.resolveCitations)(packet);
|
|
1622
793
|
const validation = (0, subagents_1.validatePacket)(packet);
|
|
1623
794
|
if (!validation.ok)
|
|
1624
795
|
return;
|
|
@@ -1628,12 +799,11 @@ class AgentChatController {
|
|
|
1628
799
|
packetId: packet.packetId,
|
|
1629
800
|
...(packet.goalId ? { goalId: packet.goalId } : {}),
|
|
1630
801
|
});
|
|
1631
|
-
const resolution = (0, subagents_1.resolveCitations)(packet);
|
|
1632
802
|
const view = (0, subagents_1.buildResearchView)(packet, resolution);
|
|
1633
803
|
for (const event of (0, subagents_1.toLifecycleEvents)(view, resolution)) {
|
|
1634
804
|
this.events.researchEvent?.(event);
|
|
1635
805
|
}
|
|
1636
|
-
recordTraceEvent(this.events, sessionId, {
|
|
806
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1637
807
|
turnId: String(turnId),
|
|
1638
808
|
type: 'subtask_artifact_stored',
|
|
1639
809
|
name: `research:${packet.packetId}`,
|
|
@@ -1690,8 +860,8 @@ class AgentChatController {
|
|
|
1690
860
|
let pendingCompact;
|
|
1691
861
|
const verificationResults = [];
|
|
1692
862
|
const sessionMessagesToRecord = [];
|
|
1693
|
-
const assistantStream = createAssistantStreamPresenter(this.events, abortSignal);
|
|
1694
|
-
const toolEvents = createToolEventPresenter(this.events, {
|
|
863
|
+
const assistantStream = (0, chat_presentation_1.createAssistantStreamPresenter)(this.events, abortSignal);
|
|
864
|
+
const toolEvents = (0, chat_presentation_1.createToolEventPresenter)(this.events, {
|
|
1695
865
|
projectPath: this.runtime.cwd,
|
|
1696
866
|
turnId,
|
|
1697
867
|
});
|
|
@@ -1731,6 +901,12 @@ class AgentChatController {
|
|
|
1731
901
|
},
|
|
1732
902
|
sessionId,
|
|
1733
903
|
turnId,
|
|
904
|
+
// Tools that fan out to other tools (batch_read) have to re-run the
|
|
905
|
+
// permission gate per sub-step; they need the mode and the allowlist.
|
|
906
|
+
permissionMode: effectivePermissionMode,
|
|
907
|
+
toolAllowlist: this.resolveToolAllowlist(),
|
|
908
|
+
toolConfirmation: this.runtime.config.toolConfirmation,
|
|
909
|
+
confirmToolUse: this.controllerOptions.confirmToolUse,
|
|
1734
910
|
});
|
|
1735
911
|
};
|
|
1736
912
|
const loopBudget = (0, loop_budget_1.resolveRuntimeLoopBudget)(input, this.runtime.config, harness.toJSON());
|
|
@@ -1769,7 +945,7 @@ class AgentChatController {
|
|
|
1769
945
|
llm: this.runtime.llm,
|
|
1770
946
|
streamCallbacks,
|
|
1771
947
|
costTracker: snapshot.costTracker,
|
|
1772
|
-
permissionMode:
|
|
948
|
+
permissionMode: effectivePermissionMode,
|
|
1773
949
|
toolConfirmation: this.runtime.config.toolConfirmation,
|
|
1774
950
|
toolAllowlist: this.resolveToolAllowlist(),
|
|
1775
951
|
confirmToolUse: this.controllerOptions.confirmToolUse,
|
|
@@ -1781,6 +957,10 @@ class AgentChatController {
|
|
|
1781
957
|
},
|
|
1782
958
|
sessionId,
|
|
1783
959
|
turnId,
|
|
960
|
+
permissionMode: effectivePermissionMode,
|
|
961
|
+
toolAllowlist: this.resolveToolAllowlist(),
|
|
962
|
+
toolConfirmation: this.runtime.config.toolConfirmation,
|
|
963
|
+
confirmToolUse: this.controllerOptions.confirmToolUse,
|
|
1784
964
|
},
|
|
1785
965
|
abortSignal,
|
|
1786
966
|
harness,
|
|
@@ -1798,7 +978,7 @@ class AgentChatController {
|
|
|
1798
978
|
assistantStream.discardSegment();
|
|
1799
979
|
this.events.setStatus((0, agent_status_1.agentStepStatus)(event.turn));
|
|
1800
980
|
if (sessionId) {
|
|
1801
|
-
recordTraceEvent(this.events, sessionId, {
|
|
981
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1802
982
|
turnId,
|
|
1803
983
|
type: 'request_start',
|
|
1804
984
|
model: event.model,
|
|
@@ -1808,7 +988,7 @@ class AgentChatController {
|
|
|
1808
988
|
break;
|
|
1809
989
|
case 'prompt_assembly':
|
|
1810
990
|
if (sessionId) {
|
|
1811
|
-
recordTraceEvent(this.events, sessionId, {
|
|
991
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1812
992
|
turnId,
|
|
1813
993
|
type: 'prompt_assembly',
|
|
1814
994
|
promptModelId: event.modelId,
|
|
@@ -1832,7 +1012,7 @@ class AgentChatController {
|
|
|
1832
1012
|
{
|
|
1833
1013
|
const batchReadOnlyCount = event.toolCalls.filter(tc => {
|
|
1834
1014
|
const def = skillResolution.tools.find(t => t.name === tc.function.name);
|
|
1835
|
-
const args = parseToolCallArgsForRuntime(tc);
|
|
1015
|
+
const args = (0, chat_checkpoint_1.parseToolCallArgsForRuntime)(tc);
|
|
1836
1016
|
return args && def?.isReadOnly?.(args) === true;
|
|
1837
1017
|
}).length;
|
|
1838
1018
|
const suggestion = (0, agent_status_1.batchingSuggestion)(batchReadOnlyCount);
|
|
@@ -1840,8 +1020,8 @@ class AgentChatController {
|
|
|
1840
1020
|
this.events.append({ role: 'status', content: suggestion });
|
|
1841
1021
|
}
|
|
1842
1022
|
}
|
|
1843
|
-
const checkpointId =
|
|
1844
|
-
const checkpointResult = createPreToolCheckpoint(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
|
|
1023
|
+
const checkpointId = `${turnId}-${checkpointSequence + 1}-${(0, crypto_1.randomUUID)()}`;
|
|
1024
|
+
const checkpointResult = (0, chat_checkpoint_1.createPreToolCheckpoint)(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
|
|
1845
1025
|
if (checkpointResult.created) {
|
|
1846
1026
|
checkpointIds.push(checkpointId);
|
|
1847
1027
|
checkpointSequence++;
|
|
@@ -1863,11 +1043,11 @@ class AgentChatController {
|
|
|
1863
1043
|
});
|
|
1864
1044
|
}
|
|
1865
1045
|
if (sessionId) {
|
|
1866
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1046
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1867
1047
|
turnId,
|
|
1868
1048
|
type: 'assistant_tool_calls',
|
|
1869
1049
|
toolCallCount: event.toolCalls.length,
|
|
1870
|
-
contentBytes: byteLength(event.content || ''),
|
|
1050
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
|
|
1871
1051
|
});
|
|
1872
1052
|
}
|
|
1873
1053
|
sessionMessagesToRecord.push({
|
|
@@ -1891,8 +1071,8 @@ class AgentChatController {
|
|
|
1891
1071
|
assistantStream.closeSegment();
|
|
1892
1072
|
toolEvents.start(event);
|
|
1893
1073
|
if (sessionId) {
|
|
1894
|
-
const traceArgs = buildTraceArgsDetails(this.runtime.cwd, event.name, event.args);
|
|
1895
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1074
|
+
const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, event.name, event.args);
|
|
1075
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1896
1076
|
turnId,
|
|
1897
1077
|
type: 'tool_call',
|
|
1898
1078
|
name: event.name,
|
|
@@ -1905,17 +1085,17 @@ class AgentChatController {
|
|
|
1905
1085
|
break;
|
|
1906
1086
|
case 'permission_decision':
|
|
1907
1087
|
if (sessionId) {
|
|
1908
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1088
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1909
1089
|
turnId,
|
|
1910
1090
|
type: 'permission_decision',
|
|
1911
1091
|
name: event.name,
|
|
1912
1092
|
callId: event.callId,
|
|
1913
|
-
argsSummary: compactToolArgs(event.args),
|
|
1093
|
+
argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
|
|
1914
1094
|
permissionBehavior: event.decision.behavior,
|
|
1915
1095
|
permissionApproved: event.decision.approved,
|
|
1916
1096
|
permissionSource: event.decision.source,
|
|
1917
1097
|
permissionReason: event.decision.reason
|
|
1918
|
-
? compactMiddle(event.decision.reason, 240)
|
|
1098
|
+
? (0, chat_trace_1.compactMiddle)(event.decision.reason, 240)
|
|
1919
1099
|
: undefined,
|
|
1920
1100
|
permissionDuration: event.decision.duration,
|
|
1921
1101
|
batchCount: event.batchCount,
|
|
@@ -1924,22 +1104,22 @@ class AgentChatController {
|
|
|
1924
1104
|
}
|
|
1925
1105
|
break;
|
|
1926
1106
|
case 'tool_result': {
|
|
1927
|
-
observedToolResultBytes += event.outputBytes ?? byteLength(event.result);
|
|
1928
|
-
observedModelVisibleToolBytes += byteLength(event.modelVisibleResult);
|
|
1107
|
+
observedToolResultBytes += event.outputBytes ?? (0, chat_trace_1.byteLength)(event.result);
|
|
1108
|
+
observedModelVisibleToolBytes += (0, chat_trace_1.byteLength)(event.modelVisibleResult);
|
|
1929
1109
|
toolEvents.finish(event);
|
|
1930
1110
|
if (sessionId) {
|
|
1931
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1111
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1932
1112
|
turnId,
|
|
1933
1113
|
type: 'tool_result',
|
|
1934
1114
|
name: event.name,
|
|
1935
1115
|
callId: event.callId,
|
|
1936
|
-
argsSummary: compactToolArgs(event.args),
|
|
1116
|
+
argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
|
|
1937
1117
|
success: event.success,
|
|
1938
1118
|
duration: event.duration,
|
|
1939
1119
|
outputBytes: event.outputBytes,
|
|
1940
|
-
modelVisibleBytes: byteLength(event.modelVisibleResult),
|
|
1120
|
+
modelVisibleBytes: (0, chat_trace_1.byteLength)(event.modelVisibleResult),
|
|
1941
1121
|
artifactId: event.artifactRef?.id,
|
|
1942
|
-
error: event.error ? compactMiddle(event.error, 240) : undefined,
|
|
1122
|
+
error: event.error ? (0, chat_trace_1.compactMiddle)(event.error, 240) : undefined,
|
|
1943
1123
|
batchCount: event.batchCount,
|
|
1944
1124
|
batchIndex: event.batchIndex,
|
|
1945
1125
|
});
|
|
@@ -1953,7 +1133,7 @@ class AgentChatController {
|
|
|
1953
1133
|
});
|
|
1954
1134
|
if (verificationResult) {
|
|
1955
1135
|
verificationResults.push(verificationResult);
|
|
1956
|
-
appendVerificationResultTrace(this.events, sessionId, turnId, verificationResult);
|
|
1136
|
+
(0, chat_workspace_1.appendVerificationResultTrace)(this.events, sessionId, turnId, verificationResult);
|
|
1957
1137
|
}
|
|
1958
1138
|
sessionMessagesToRecord.push({
|
|
1959
1139
|
role: 'tool',
|
|
@@ -1967,10 +1147,10 @@ class AgentChatController {
|
|
|
1967
1147
|
case 'strategy_exhausted':
|
|
1968
1148
|
this.events.append({ role: 'status', content: event.suggestion });
|
|
1969
1149
|
if (sessionId) {
|
|
1970
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1150
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1971
1151
|
turnId,
|
|
1972
1152
|
type: 'strategy_exhausted',
|
|
1973
|
-
note: compactMiddle(event.suggestion, 240),
|
|
1153
|
+
note: (0, chat_trace_1.compactMiddle)(event.suggestion, 240),
|
|
1974
1154
|
});
|
|
1975
1155
|
}
|
|
1976
1156
|
break;
|
|
@@ -1986,10 +1166,10 @@ class AgentChatController {
|
|
|
1986
1166
|
finalContent = event.content;
|
|
1987
1167
|
assistantStream.ensureMessage(event.content);
|
|
1988
1168
|
if (sessionId) {
|
|
1989
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1169
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
1990
1170
|
turnId,
|
|
1991
1171
|
type: 'message',
|
|
1992
|
-
contentBytes: byteLength(event.content),
|
|
1172
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content),
|
|
1993
1173
|
});
|
|
1994
1174
|
}
|
|
1995
1175
|
if (event.content) {
|
|
@@ -2023,12 +1203,12 @@ class AgentChatController {
|
|
|
2023
1203
|
pendingCompact = event.compact;
|
|
2024
1204
|
if (event.stats) {
|
|
2025
1205
|
pendingCompleteStats = event.stats;
|
|
2026
|
-
recordProviderTraceEvents(this.events, sessionId, turnId, event.stats);
|
|
1206
|
+
(0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, event.stats);
|
|
2027
1207
|
pendingCompleteTrace = {
|
|
2028
1208
|
turnId,
|
|
2029
1209
|
type: 'complete',
|
|
2030
1210
|
model: event.model,
|
|
2031
|
-
contentBytes: byteLength(event.content || ''),
|
|
1211
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
|
|
2032
1212
|
finishReason: event.stats.finishReason,
|
|
2033
1213
|
llmRequests: event.stats.llmRequests,
|
|
2034
1214
|
toolCalls: event.stats.toolCalls,
|
|
@@ -2052,7 +1232,7 @@ class AgentChatController {
|
|
|
2052
1232
|
turnId,
|
|
2053
1233
|
type: 'complete',
|
|
2054
1234
|
model: event.model,
|
|
2055
|
-
contentBytes: byteLength(event.content || ''),
|
|
1235
|
+
contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
|
|
2056
1236
|
};
|
|
2057
1237
|
}
|
|
2058
1238
|
break;
|
|
@@ -2063,7 +1243,7 @@ class AgentChatController {
|
|
|
2063
1243
|
const stats = pendingCompleteStats ??
|
|
2064
1244
|
(0, framework_1.createFailedLoopStats)({
|
|
2065
1245
|
loopBudget,
|
|
2066
|
-
diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
|
|
1246
|
+
diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
|
|
2067
1247
|
turnsStarted: observedTurnsStarted,
|
|
2068
1248
|
llmRequests: observedLlmRequests,
|
|
2069
1249
|
toolCalls: observedToolCalls,
|
|
@@ -2075,16 +1255,16 @@ class AgentChatController {
|
|
|
2075
1255
|
persistInterruptedAccounting(finalUsage, stats, finalUsage !== undefined || stats.llmRequests === 0);
|
|
2076
1256
|
assistantStream.discardSegment();
|
|
2077
1257
|
this.events.setStatus('Interrupted.');
|
|
2078
|
-
removeTrailingUserMessage(this.runtime);
|
|
1258
|
+
(0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
|
|
2079
1259
|
if (sessionId) {
|
|
2080
|
-
const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2081
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1260
|
+
const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1261
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2082
1262
|
turnId,
|
|
2083
1263
|
type: 'aborted',
|
|
2084
1264
|
note: 'aborted_after_query',
|
|
2085
1265
|
});
|
|
2086
|
-
const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
|
|
2087
|
-
? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
|
|
1266
|
+
const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
|
|
1267
|
+
? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
|
|
2088
1268
|
: undefined;
|
|
2089
1269
|
if (recoveryNotice) {
|
|
2090
1270
|
this.events.append({
|
|
@@ -2105,15 +1285,15 @@ class AgentChatController {
|
|
|
2105
1285
|
}
|
|
2106
1286
|
assistantStream.closeSegment();
|
|
2107
1287
|
if (sessionId) {
|
|
2108
|
-
const { profile, summary } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1288
|
+
const { profile, summary } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2109
1289
|
if (profile.changedFiles.length > 0 && profile.required) {
|
|
2110
1290
|
this.events.setStatus((0, agent_status_1.verifyingStatus)(profile.profile));
|
|
2111
1291
|
this.controllerOptions.onVerificationStateChange?.('running');
|
|
2112
1292
|
}
|
|
2113
|
-
if (shouldRecordVerificationLoopStats(profile, summary)) {
|
|
1293
|
+
if ((0, chat_workspace_1.shouldRecordVerificationLoopStats)(profile, summary)) {
|
|
2114
1294
|
const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
|
|
2115
1295
|
if (stats) {
|
|
2116
|
-
pendingCompleteStats = withVerificationLoopStats(stats, summary);
|
|
1296
|
+
pendingCompleteStats = (0, chat_workspace_1.withVerificationLoopStats)(stats, summary);
|
|
2117
1297
|
}
|
|
2118
1298
|
}
|
|
2119
1299
|
if ((0, verification_profile_1.shouldGateCompletion)(summary)) {
|
|
@@ -2127,16 +1307,16 @@ class AgentChatController {
|
|
|
2127
1307
|
content: notice,
|
|
2128
1308
|
});
|
|
2129
1309
|
finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
|
|
2130
|
-
appendAssistantNotice(sessionMessagesToRecord, notice);
|
|
1310
|
+
(0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
|
|
2131
1311
|
if (pendingCompleteTrace) {
|
|
2132
1312
|
pendingCompleteTrace.finishReason = 'completion_gate';
|
|
2133
|
-
pendingCompleteTrace.contentBytes = byteLength(finalContent);
|
|
1313
|
+
pendingCompleteTrace.contentBytes = (0, chat_trace_1.byteLength)(finalContent);
|
|
2134
1314
|
pendingCompleteTrace.note = 'verification_incomplete';
|
|
2135
1315
|
}
|
|
2136
1316
|
const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
|
|
2137
1317
|
if (stats) {
|
|
2138
1318
|
pendingCompleteStats = {
|
|
2139
|
-
...withVerificationLoopStats(stats, summary),
|
|
1319
|
+
...(0, chat_workspace_1.withVerificationLoopStats)(stats, summary),
|
|
2140
1320
|
finishReason: 'completion_gate',
|
|
2141
1321
|
};
|
|
2142
1322
|
}
|
|
@@ -2175,7 +1355,7 @@ class AgentChatController {
|
|
|
2175
1355
|
content: notice,
|
|
2176
1356
|
});
|
|
2177
1357
|
finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
|
|
2178
|
-
appendAssistantNotice(sessionMessagesToRecord, notice);
|
|
1358
|
+
(0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
|
|
2179
1359
|
}
|
|
2180
1360
|
if (pendingCompleteStats) {
|
|
2181
1361
|
this.setLoopStats(this.foldSubagentUsage(pendingCompleteStats, subagentBundle));
|
|
@@ -2212,7 +1392,7 @@ class AgentChatController {
|
|
|
2212
1392
|
}
|
|
2213
1393
|
this.runtime.store.setContextUsage(pendingCompact.after);
|
|
2214
1394
|
if (sessionId) {
|
|
2215
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1395
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2216
1396
|
turnId,
|
|
2217
1397
|
type: 'compact_completed',
|
|
2218
1398
|
checkpointId: committedCheckpointId,
|
|
@@ -2229,11 +1409,11 @@ class AgentChatController {
|
|
|
2229
1409
|
}
|
|
2230
1410
|
catch (error) {
|
|
2231
1411
|
if (sessionId) {
|
|
2232
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1412
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2233
1413
|
turnId,
|
|
2234
1414
|
type: 'compact_failed',
|
|
2235
1415
|
model: finalModel || this.runtime.llm.getModel(),
|
|
2236
|
-
error: compactTraceError(error),
|
|
1416
|
+
error: (0, chat_trace_1.compactTraceError)(error),
|
|
2237
1417
|
note: pendingCompact.mode,
|
|
2238
1418
|
});
|
|
2239
1419
|
}
|
|
@@ -2264,10 +1444,10 @@ class AgentChatController {
|
|
|
2264
1444
|
});
|
|
2265
1445
|
const harnessState = harness.toJSON();
|
|
2266
1446
|
this.runtime.store.setState({ harnessState });
|
|
2267
|
-
emitHarnessDiagnostics(this.events, harnessState);
|
|
1447
|
+
(0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
|
|
2268
1448
|
if (sessionId) {
|
|
2269
1449
|
if (pendingCompleteTrace) {
|
|
2270
|
-
recordTraceEvent(this.events, sessionId, pendingCompleteTrace);
|
|
1450
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, pendingCompleteTrace);
|
|
2271
1451
|
}
|
|
2272
1452
|
(0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
|
|
2273
1453
|
(0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
|
|
@@ -2280,7 +1460,7 @@ class AgentChatController {
|
|
|
2280
1460
|
}
|
|
2281
1461
|
catch (error) {
|
|
2282
1462
|
// v0.2.25: Provider retry exhausted is a recoverable turn failure.
|
|
2283
|
-
if (error instanceof
|
|
1463
|
+
if (error instanceof provider_resilience_1.ProviderRetryExhaustedError) {
|
|
2284
1464
|
const diag = error.diagnostics;
|
|
2285
1465
|
const attempts = diag?.attempts?.length ?? '?';
|
|
2286
1466
|
const kind = diag?.attempts?.[diag.attempts.length - 1]?.failureKind ?? 'unknown';
|
|
@@ -2304,12 +1484,12 @@ class AgentChatController {
|
|
|
2304
1484
|
}
|
|
2305
1485
|
return;
|
|
2306
1486
|
}
|
|
2307
|
-
if (isAbortError(error, abortSignal)) {
|
|
1487
|
+
if ((0, chat_trace_1.isAbortError)(error, abortSignal)) {
|
|
2308
1488
|
const interruptedStats = error instanceof framework_1.QueryLoopError
|
|
2309
1489
|
? error.stats
|
|
2310
1490
|
: (0, framework_1.createFailedLoopStats)({
|
|
2311
1491
|
loopBudget,
|
|
2312
|
-
diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
|
|
1492
|
+
diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
|
|
2313
1493
|
turnsStarted: observedTurnsStarted,
|
|
2314
1494
|
llmRequests: observedLlmRequests,
|
|
2315
1495
|
toolCalls: observedToolCalls,
|
|
@@ -2325,16 +1505,16 @@ class AgentChatController {
|
|
|
2325
1505
|
persistInterruptedAccounting(interruptedRootUsage, interruptedStats, interruptedStats.llmRequests === 0);
|
|
2326
1506
|
assistantStream.discardSegment();
|
|
2327
1507
|
this.events.setStatus('Interrupted.');
|
|
2328
|
-
removeTrailingUserMessage(this.runtime);
|
|
1508
|
+
(0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
|
|
2329
1509
|
if (sessionId) {
|
|
2330
|
-
const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2331
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1510
|
+
const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1511
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2332
1512
|
turnId,
|
|
2333
1513
|
type: 'aborted',
|
|
2334
1514
|
note: 'abort_error',
|
|
2335
1515
|
});
|
|
2336
|
-
const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
|
|
2337
|
-
? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
|
|
1516
|
+
const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
|
|
1517
|
+
? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
|
|
2338
1518
|
: undefined;
|
|
2339
1519
|
if (recoveryNotice) {
|
|
2340
1520
|
this.events.append({
|
|
@@ -2351,15 +1531,15 @@ class AgentChatController {
|
|
|
2351
1531
|
assistantStream.discardSegment();
|
|
2352
1532
|
this.events.append({
|
|
2353
1533
|
role: 'error',
|
|
2354
|
-
content: formatChatError(error),
|
|
2355
|
-
errorLayer: errorLayerForChatError(error),
|
|
1534
|
+
content: (0, chat_trace_1.formatChatError)(error),
|
|
1535
|
+
errorLayer: (0, chat_trace_1.errorLayerForChatError)(error),
|
|
2356
1536
|
});
|
|
2357
1537
|
this.events.setStatus('Turn failed. Ready for the next input.');
|
|
2358
1538
|
const failedStats = this.foldSubagentUsage(error instanceof framework_1.QueryLoopError
|
|
2359
1539
|
? error.stats
|
|
2360
1540
|
: (0, framework_1.createFailedLoopStats)({
|
|
2361
1541
|
loopBudget,
|
|
2362
|
-
diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
|
|
1542
|
+
diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
|
|
2363
1543
|
turnsStarted: observedTurnsStarted,
|
|
2364
1544
|
llmRequests: observedLlmRequests,
|
|
2365
1545
|
toolCalls: observedToolCalls,
|
|
@@ -2379,10 +1559,10 @@ class AgentChatController {
|
|
|
2379
1559
|
}
|
|
2380
1560
|
this.setLoopStats(failedStats);
|
|
2381
1561
|
if (sessionId) {
|
|
2382
|
-
recordProviderTraceEvents(this.events, sessionId, turnId, failedStats);
|
|
2383
|
-
const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
2384
|
-
const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
|
|
2385
|
-
? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
|
|
1562
|
+
(0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, failedStats);
|
|
1563
|
+
const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
|
|
1564
|
+
const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
|
|
1565
|
+
? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
|
|
2386
1566
|
: undefined;
|
|
2387
1567
|
if (recoveryNotice) {
|
|
2388
1568
|
this.events.append({
|
|
@@ -2392,13 +1572,13 @@ class AgentChatController {
|
|
|
2392
1572
|
content: recoveryNotice,
|
|
2393
1573
|
});
|
|
2394
1574
|
}
|
|
2395
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1575
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2396
1576
|
turnId,
|
|
2397
1577
|
type: 'error',
|
|
2398
|
-
error: compactTraceError(error),
|
|
1578
|
+
error: (0, chat_trace_1.compactTraceError)(error),
|
|
2399
1579
|
note: recoveryNotice,
|
|
2400
1580
|
});
|
|
2401
|
-
recordTraceEvent(this.events, sessionId, {
|
|
1581
|
+
(0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
|
|
2402
1582
|
turnId,
|
|
2403
1583
|
type: 'complete',
|
|
2404
1584
|
model: failedStats.providerFinalModel ?? this.runtime.llm.getModel(),
|
|
@@ -2418,6 +1598,12 @@ class AgentChatController {
|
|
|
2418
1598
|
localFastPathUsed: failedStats.localFastPathUsed,
|
|
2419
1599
|
});
|
|
2420
1600
|
(0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
|
|
1601
|
+
// A failed turn must not leave the user's prompt dangling in the
|
|
1602
|
+
// persisted session (it would replay on resume). The in-memory history
|
|
1603
|
+
// is cleaned above (2969-2972); mirror that for the on-disk transcript.
|
|
1604
|
+
if (options.persistAsUserMessage !== false) {
|
|
1605
|
+
(0, session_storage_1.removeTrailingSessionUserMessage)(sessionId);
|
|
1606
|
+
}
|
|
2421
1607
|
}
|
|
2422
1608
|
const history = this.runtime.store.getSnapshot().conversationHistory;
|
|
2423
1609
|
if (history.length > 0) {
|