@ashx-j/lunr-dev 0.2.16-dev.9.1 → 0.2.21-dev.12.1
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/CHANGELOG.md +67 -1
- package/README.md +7 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +44 -19
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-computer-use.js +158 -0
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
- package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +9 -7
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts +6 -4
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js +114 -61
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +360 -351
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +10 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +5 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +26 -4
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +37 -27
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +8 -6
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +179 -79
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +18 -8
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +44 -15
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +24 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +8 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +247 -18
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts +29 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +179 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +89 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +541 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +11 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +38 -12
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +35 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +7 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +26 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +55 -38
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +3 -6
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +64 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +7 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +21 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts +10 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js +38 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +74 -41
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +75 -18
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +13 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +67 -11
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +13 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +68 -11
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +12 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +21 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +21 -4
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +6 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +46 -29
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +47 -4
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +428 -431
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -13
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js +5 -91
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +103 -102
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts +23 -0
- package/dist/core/computer-use/adapter.d.ts.map +1 -0
- package/dist/core/computer-use/adapter.js +116 -0
- package/dist/core/computer-use/adapter.js.map +1 -0
- package/dist/core/computer-use/image.d.ts +26 -0
- package/dist/core/computer-use/image.d.ts.map +1 -0
- package/dist/core/computer-use/image.js +64 -0
- package/dist/core/computer-use/image.js.map +1 -0
- package/dist/core/computer-use/lease.d.ts +18 -0
- package/dist/core/computer-use/lease.d.ts.map +1 -0
- package/dist/core/computer-use/lease.js +129 -0
- package/dist/core/computer-use/lease.js.map +1 -0
- package/dist/core/computer-use/macos-runtime.d.ts +14 -0
- package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
- package/dist/core/computer-use/macos-runtime.js +148 -0
- package/dist/core/computer-use/macos-runtime.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts +19 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -0
- package/dist/core/computer-use/policy.js +62 -0
- package/dist/core/computer-use/policy.js.map +1 -0
- package/dist/core/computer-use/release.generated.d.ts +31 -0
- package/dist/core/computer-use/release.generated.d.ts.map +1 -0
- package/dist/core/computer-use/release.generated.js +36 -0
- package/dist/core/computer-use/release.generated.js.map +1 -0
- package/dist/core/computer-use/runtime.d.ts +13 -0
- package/dist/core/computer-use/runtime.d.ts.map +1 -0
- package/dist/core/computer-use/runtime.js +158 -0
- package/dist/core/computer-use/runtime.js.map +1 -0
- package/dist/core/computer-use/schemas.d.ts +91 -0
- package/dist/core/computer-use/schemas.d.ts.map +1 -0
- package/dist/core/computer-use/schemas.js +71 -0
- package/dist/core/computer-use/schemas.js.map +1 -0
- package/dist/core/computer-use/windows-desktop.d.ts +3 -0
- package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
- package/dist/core/computer-use/windows-desktop.js +48 -0
- package/dist/core/computer-use/windows-desktop.js.map +1 -0
- package/dist/core/computer-use/workflow.d.ts +32 -0
- package/dist/core/computer-use/workflow.d.ts.map +1 -0
- package/dist/core/computer-use/workflow.js +341 -0
- package/dist/core/computer-use/workflow.js.map +1 -0
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +3 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-runtime.d.ts +0 -3
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +1 -10
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +2 -1
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +31 -11
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +9 -5
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +13 -90
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/runtime-bridges.d.ts.map +1 -1
- package/dist/core/runtime-bridges.js +0 -2
- package/dist/core/runtime-bridges.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +21 -79
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +10 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +30 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-cancellation.d.ts +21 -0
- package/dist/core/subagent-cancellation.d.ts.map +1 -0
- package/dist/core/subagent-cancellation.js +53 -0
- package/dist/core/subagent-cancellation.js.map +1 -0
- package/dist/core/subagent-spinner-setting.d.ts +6 -0
- package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
- package/dist/core/subagent-spinner-setting.js +12 -0
- package/dist/core/subagent-spinner-setting.js.map +1 -0
- package/dist/core/subagent-spinner.d.ts +4 -0
- package/dist/core/subagent-spinner.d.ts.map +1 -0
- package/dist/core/subagent-spinner.js +6 -0
- package/dist/core/subagent-spinner.js.map +1 -0
- package/dist/dev-cli.js +0 -0
- package/dist/gateway/agent-bridge.d.ts +6 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +23 -6
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +23 -7
- package/dist/gateway/cron.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +12 -18
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +4 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +23 -32
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +2 -3
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +5 -10
- package/dist/modes/interactive/components/processes-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +93 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
- package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
- package/dist/modes/interactive/extension-widget-order.js +37 -0
- package/dist/modes/interactive/extension-widget-order.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +58 -26
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
- package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
- package/dist/modes/interactive/thinking-level-slash.js +23 -0
- package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
- package/dist/node-runtime/adapter-AZMY335J.js +279 -0
- package/dist/node-runtime/{agent-session-services-IFJMSX7Z.js → agent-session-services-QANFGM2V.js} +15 -11
- package/dist/node-runtime/{builtin-extensions-LYZ3BFWQ.js → builtin-extensions-SRCYQPZ6.js} +5 -3
- package/dist/node-runtime/chunk-2IDTZAG5.js +1415 -0
- package/dist/node-runtime/chunk-3ONQTOMR.js +68 -0
- package/dist/node-runtime/{chunk-TQNSPERU.js → chunk-5SQDLSZJ.js} +1 -1
- package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
- package/dist/node-runtime/{chunk-PBC2Y6GS.js → chunk-6UB6NKA3.js} +29 -72
- package/dist/node-runtime/{chunk-A2KQXUJD.js → chunk-7AFOFSDY.js} +1 -1
- package/dist/node-runtime/chunk-A3KMVBZV.js +60 -0
- package/dist/node-runtime/{chunk-N77MY65L.js → chunk-BJ6H7DPI.js} +25 -25
- package/dist/node-runtime/{chunk-PGAJ5MO5.js → chunk-BYQ2MOFI.js} +6 -6
- package/dist/node-runtime/{chunk-QH42CDX3.js → chunk-CZUBYPFP.js} +234 -124
- package/dist/node-runtime/{chunk-LZAW4ZX3.js → chunk-D466UAID.js} +34 -13
- package/dist/node-runtime/{chunk-ZKMFUD3Q.js → chunk-GT5F3OKM.js} +3 -3
- package/dist/node-runtime/chunk-H2BI7G7T.js +73 -0
- package/dist/node-runtime/{chunk-5P7PZMRU.js → chunk-HRS4HMDX.js} +1 -1
- package/dist/node-runtime/{chunk-IPA627GP.js → chunk-HXJS2PJM.js} +4 -4
- package/dist/node-runtime/chunk-JZHEUQRL.js +180 -0
- package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
- package/dist/node-runtime/chunk-LOYUC2ID.js +2185 -0
- package/dist/node-runtime/{chunk-2QKLKMKC.js → chunk-LTXUQJI4.js} +1 -1
- package/dist/node-runtime/{chunk-YF63P5ZT.js → chunk-LTYWTR3V.js} +1 -426
- package/dist/node-runtime/{chunk-MKKH27PH.js → chunk-LWJXTA6Z.js} +274 -2416
- package/dist/node-runtime/chunk-MW2XJZIK.js +108 -0
- package/dist/node-runtime/{chunk-CDFZEWPU.js → chunk-N3PNL74S.js} +537 -262
- package/dist/node-runtime/{chunk-4TLO4PO2.js → chunk-U6C7VTR5.js} +7 -1401
- package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
- package/dist/node-runtime/{chunk-HQCKFM2O.js → chunk-VGYZ3APQ.js} +3 -0
- package/dist/node-runtime/{chunk-AJX357CL.js → chunk-VQ4UBWSA.js} +30 -1013
- package/dist/node-runtime/{chunk-F4VQFJI2.js → chunk-VTGEKB7R.js} +2 -2
- package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-VTPM5V35.js} +5 -100
- package/dist/node-runtime/chunk-W3SILANP.js +24 -0
- package/dist/node-runtime/{chunk-WOVTOV5P.js → chunk-XAUQOKYK.js} +421 -63
- package/dist/node-runtime/{chunk-ECD5L7YI.js → chunk-XSRCAQK2.js} +390 -16
- package/dist/node-runtime/{chunk-PCGNAY2O.js → chunk-ZOIIMEN6.js} +54 -433
- package/dist/node-runtime/{chunk-EDBJNRSM.js → chunk-ZVSORYRM.js} +1 -1
- package/dist/node-runtime/cli-runtime.js +1 -1
- package/dist/node-runtime/{command-L3LAHDIH.js → command-ZURZJDXF.js} +1 -1
- package/dist/node-runtime/{commands-RL5YBW5I.js → commands-BZGSLIP7.js} +4 -2
- package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-LF5VST47.js} +1 -1
- package/dist/node-runtime/{direct-tool-executor-JVDXTO7A.js → direct-tool-executor-BSZDHIYR.js} +7 -4
- package/dist/node-runtime/{export-html-KR26FOUZ.js → export-html-E4DT6ZJQ.js} +1 -1
- package/dist/node-runtime/{gateway-X2TI5X7F.js → gateway-FWHRIBK5.js} +24 -369
- package/dist/node-runtime/index.js +49 -42
- package/dist/node-runtime/{init-NJV2T55N.js → init-DVJUAOUO.js} +4 -2
- package/dist/node-runtime/{interactive-mode-KOM35YF2.js → interactive-mode-BBASNWHN.js} +23 -17
- package/dist/node-runtime/{interactive-view-U6OILKF3.js → interactive-view-N6F4KUIT.js} +3 -5
- package/dist/node-runtime/lunr-computer-use-TJNDAMWM.js +135 -0
- package/dist/node-runtime/{lunr-cron-YJ5UHYRD.js → lunr-cron-J64I72C6.js} +7 -1
- package/dist/node-runtime/main.js +25 -20
- package/dist/node-runtime/{mcp-auth-flow-QIXHW6QN.js → mcp-auth-flow-YL6RWPYG.js} +2 -1
- package/dist/node-runtime/{package-manager-cli-TZZHJCVI.js → package-manager-cli-VMYX4Y2S.js} +10 -7
- package/dist/node-runtime/{pi-intercom-EEMBGQID.js → pi-intercom-NV2LW6X7.js} +108 -87
- package/dist/node-runtime/{pi-mcp-adapter-QFB37AVN.js → pi-mcp-adapter-JLB5YL2F.js} +31 -25
- package/dist/node-runtime/{pi-subagents-7XJ4H53P.js → pi-subagents-WEHV3W7H.js} +1321 -631
- package/dist/node-runtime/{pi-web-access-DPGAVKOA.js → pi-web-access-FN5YC5T6.js} +67 -64
- package/dist/node-runtime/{proxy-modes-HEEFK4KC.js → proxy-modes-OR7ISBXK.js} +7 -4
- package/dist/node-runtime/rpc-entry.js +25 -20
- package/dist/node-runtime/runtime-3SB5ATHQ.js +21 -0
- package/dist/node-runtime/{runtime-bridges-PPHNBFWL.js → runtime-bridges-2VQTLPOZ.js} +3 -5
- package/dist/node-runtime/{session-manager-MQNBYACL.js → session-manager-QEMZBMTM.js} +3 -5
- package/dist/node-runtime/{session-selector-5AZLJS6U.js → session-selector-URVJLOTK.js} +2 -2
- package/dist/node-runtime/{settings-manager-5LF2VQWC.js → settings-manager-3CCU326G.js} +4 -1
- package/dist/node-runtime/{src-Y7JSCK64.js → src-BPQFJR76.js} +27 -7
- package/dist/node-runtime/{subagent-executor-5RNDEPIJ.js → subagent-executor-CXKXQDHH.js} +189 -284
- package/dist/node-runtime/{update-cli-A253SZ7P.js → update-cli-NM7B4CKL.js} +4 -1
- package/dist/node-runtime/workflow-C26QCUTW.js +468 -0
- package/dist/rpc.d.ts +3 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +18 -0
- package/dist/rpc.js.map +1 -0
- package/dist/startup/interactive-view.d.ts.map +1 -1
- package/dist/startup/interactive-view.js +1 -2
- package/dist/startup/interactive-view.js.map +1 -1
- package/docs/computer-use.md +242 -0
- package/docs/development.md +0 -32
- package/docs/features.md +24 -6
- package/docs/interactive-startup.md +10 -3
- package/docs/keybindings.md +5 -3
- package/docs/settings.md +3 -2
- package/docs/terminal-setup.md +1 -1
- package/docs/usage.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/install-lock/package-lock.json +3827 -0
- package/install-lock/package.json +18 -0
- package/native/computer-use/LICENSE.md +21 -0
- package/npm-shrinkwrap.json +3808 -0
- package/package.json +16 -10
- package/dist/builtin-extensions/lunr-settings-tools.d.ts +0 -4
- package/dist/builtin-extensions/lunr-settings-tools.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-settings-tools.js +0 -120
- package/dist/builtin-extensions/lunr-settings-tools.js.map +0 -1
- package/dist/core/settings-tools-bridge.d.ts +0 -35
- package/dist/core/settings-tools-bridge.d.ts.map +0 -1
- package/dist/core/settings-tools-bridge.js +0 -56
- package/dist/core/settings-tools-bridge.js.map +0 -1
- package/dist/node-runtime/chunk-AHSTJBIB.js +0 -64
- package/dist/startup/interactive-shell.d.ts +0 -55
- package/dist/startup/interactive-shell.d.ts.map +0 -1
- package/dist/startup/interactive-shell.js +0 -264
- package/dist/startup/interactive-shell.js.map +0 -1
- package/dist/node-runtime/{chunk-YSKSB3BJ.js → chunk-CH6OL6P2.js} +2 -2
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import { SubagentWaitParams } from "../../extension/schemas.js";
|
|
2
2
|
import { resolveWaitToolConfig, waitForSubagents } from "./subagent-wait.js";
|
|
3
|
-
export function registerWaitTool(pi, state, enabled = resolveWaitToolConfig().enabled) {
|
|
3
|
+
export function registerWaitTool(pi, state, enabled = resolveWaitToolConfig().enabled, waitForPendingLaunches) {
|
|
4
4
|
const tool = {
|
|
5
5
|
name: "subagent_wait",
|
|
6
6
|
label: "Subagent Wait",
|
|
7
7
|
description: `Block until background work owned by this session changes, then return.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Call this when the current turn or skill must finish after its children. For normal interactive completion, yield and let lunR wake the session. Headless sessions auto-drain current-session work after the agent turn.
|
|
10
10
|
|
|
11
11
|
• { } — return when the first initially active async run or registered provider item finishes, or when a subagent needs attention.
|
|
12
12
|
• { all: true } — wait for every async run and provider item that was active when the call began.
|
|
13
13
|
• { id: "..." } — wait for one async or remembered detached foreground subagent run (id or prefix).
|
|
14
|
+
• { questionId: "..." } — wait for one supervisor question from subagent_supervisor action='ask' (answered/expired/cancelled). Separate from final run results.
|
|
14
15
|
• { timeoutMs: 600000 } — stop waiting after N ms; active work keeps running.
|
|
15
16
|
|
|
16
17
|
Provider jobs are session-scoped and identified exactly, so replacing one job with another cannot hide a completion. Provider extensions must be explicitly loaded in this process. In a child agent, keep \`subagent_wait\` in the child tool allowlist and load each provider through the agent's extensions or subagentOnlyExtensions; this tool never loads providers or grants tools itself.${enabled ? "" : "\n\nConfigured behavior: subagent_wait is disabled by config.waitTool or PI_SUBAGENT_WAIT_TOOL_ENABLED and returns immediately without blocking."}`,
|
|
17
18
|
parameters: SubagentWaitParams,
|
|
18
|
-
execute(_id, params, signal) {
|
|
19
|
+
async execute(_id, params, signal) {
|
|
20
|
+
await Promise.resolve();
|
|
21
|
+
await waitForPendingLaunches?.(signal);
|
|
22
|
+
signal?.throwIfAborted();
|
|
19
23
|
return waitForSubagents(params, signal, { state, events: pi.events, enabled });
|
|
20
24
|
},
|
|
21
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-tool.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/wait-tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,UAAU,gBAAgB,
|
|
1
|
+
{"version":3,"file":"wait-tool.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/wait-tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,UAAU,gBAAgB,CAC/B,EAAgB,EAChB,KAAoB,EACpB,OAAO,GAAG,qBAAqB,EAAE,CAAC,OAAO,EACzC,sBAAgE,EACzD;IACP,MAAM,IAAI,GAAuD;QAChE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;;;;;mYAUoX,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kJAAkJ,EAAE;QACpiB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;YAClC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,OAAO,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAAA,CAC/E;KACD,CAAC;IACF,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAAA,CACtB","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr-dev\";\nimport { SubagentWaitParams } from \"../../extension/schemas.ts\";\nimport type { Details, SubagentState } from \"../../shared/types.ts\";\nimport { resolveWaitToolConfig, waitForSubagents } from \"./subagent-wait.ts\";\n\nexport function registerWaitTool(\n\tpi: ExtensionAPI,\n\tstate: SubagentState,\n\tenabled = resolveWaitToolConfig().enabled,\n\twaitForPendingLaunches?: (signal?: AbortSignal) => Promise<void>,\n): void {\n\tconst tool: ToolDefinition<typeof SubagentWaitParams, Details> = {\n\t\tname: \"subagent_wait\",\n\t\tlabel: \"Subagent Wait\",\n\t\tdescription: `Block until background work owned by this session changes, then return.\n\nCall this when the current turn or skill must finish after its children. For normal interactive completion, yield and let lunR wake the session. Headless sessions auto-drain current-session work after the agent turn.\n\n• { } — return when the first initially active async run or registered provider item finishes, or when a subagent needs attention.\n• { all: true } — wait for every async run and provider item that was active when the call began.\n• { id: \"...\" } — wait for one async or remembered detached foreground subagent run (id or prefix).\n• { questionId: \"...\" } — wait for one supervisor question from subagent_supervisor action='ask' (answered/expired/cancelled). Separate from final run results.\n• { timeoutMs: 600000 } — stop waiting after N ms; active work keeps running.\n\nProvider jobs are session-scoped and identified exactly, so replacing one job with another cannot hide a completion. Provider extensions must be explicitly loaded in this process. In a child agent, keep \\`subagent_wait\\` in the child tool allowlist and load each provider through the agent's extensions or subagentOnlyExtensions; this tool never loads providers or grants tools itself.${enabled ? \"\" : \"\\n\\nConfigured behavior: subagent_wait is disabled by config.waitTool or PI_SUBAGENT_WAIT_TOOL_ENABLED and returns immediately without blocking.\"}`,\n\t\tparameters: SubagentWaitParams,\n\t\tasync execute(_id, params, signal) {\n\t\t\tawait Promise.resolve();\n\t\t\tawait waitForPendingLaunches?.(signal);\n\t\t\tsignal?.throwIfAborted();\n\t\t\treturn waitForSubagents(params, signal, { state, events: pi.events, enabled });\n\t\t},\n\t};\n\tpi.registerTool(tool);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-execution.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAKhE,OAAO,EAcN,KAAK,SAAS,EAMd,MAAM,0BAA0B,CAAC;AAiBlC,OAAO,EACN,KAAK,aAAa,EAElB,KAAK,cAAc,EAEnB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAGrB,MAAM,uBAAuB,CAAC;AAsW/B,UAAU,oBAAoB;IAC7B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,GAAG,EAAE,gBAAgB,CAAC;IACtB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzD,mBAAmB,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACrG,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,kBAAkB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IAClI,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,qBAAqB,CAAC;IACrC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3E,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACrC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;KAC1B,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/D,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,kHAAkH;IAClH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,UAAU,oBAAoB;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2FAA2F;IAC3F,cAAc,CAAC,EAAE;QAChB,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAs1B9F","sourcesContent":["// @ts-nocheck\n/**\n * Chain execution logic for subagent tool\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport type { ExtensionContext } from \"@ashx-j/lunr-dev\";\nimport type { ChildRuntimeConfig } from \"../../shared/types.ts\";\nimport { normalizeChildSpec } from \"../../shared/child-spec.ts\";\nimport { snapshotParentPermissionMode } from \"../../../../../core/subagent-permission-inherit.ts\";\nimport { ChainClarifyComponent, type ChainClarifyResult, type BehaviorOverride } from \"./chain-clarify.ts\";\nimport { toModelInfo, type ModelInfo } from \"../../shared/model-info.ts\";\nimport {\n\tresolveChainTemplates,\n\tcreateChainDir,\n\tremoveChainDir,\n\tresolveStepBehavior,\n\tresolveParallelBehaviors,\n\tbuildChainInstructions,\n\twriteInitialProgressFile,\n\tcreateParallelDirs,\n\tsuppressProgressForReadOnlyTask,\n\taggregateParallelOutputs,\n\tisDynamicParallelStep,\n\tisParallelStep,\n\ttype StepOverrides,\n\ttype ChainStep,\n\ttype ParallelStep,\n\ttype SequentialStep,\n\ttype ParallelTaskResult,\n\ttype ResolvedStepBehavior,\n\ttype ResolvedTemplates,\n} from \"../../shared/settings.ts\";\nimport { discoverAvailableSkills, normalizeSkillInput } from \"../../agents/skills.ts\";\nimport { INTERCOM_BRIDGE_MARKER } from \"../../intercom/intercom-bridge.ts\";\nimport { runSync } from \"./execution.ts\";\nimport { buildChainSummary } from \"../../shared/formatters.ts\";\nimport { compactForegroundDetails, getSingleResultOutput, mapConcurrent, resolveChildCwd, sumResultsCost, sumResultsUsage } from \"../../shared/utils.ts\";\nimport { DEFAULT_GLOBAL_CONCURRENCY_LIMIT, Semaphore } from \"../shared/parallel-utils.ts\";\nimport { recordRun } from \"../shared/run-history.ts\";\nimport {\n\tcleanupWorktrees,\n\tcreateWorktrees,\n\tdiffWorktrees,\n\tfindWorktreeTaskCwdConflict,\n\tformatWorktreeDiffSummary,\n\tformatWorktreeTaskCwdConflict,\n\ttype WorktreeSetup,\n} from \"../shared/worktree.ts\";\nimport {\n\ttype ActivityState,\n\ttype AgentProgress,\n\ttype ArtifactConfig,\n\ttype ArtifactPaths,\n\ttype ControlEvent,\n\ttype Details,\n\ttype IntercomEventBus,\n\ttype NestedRouteInfo,\n\ttype ResolvedControlConfig,\n\ttype ResolvedTurnBudget,\n\ttype ResolvedToolBudget,\n\ttype SingleResult,\n\ttype ToolBudgetConfig,\n\tMAX_CONCURRENCY,\n\tresolveChildMaxSubagentDepth,\n} from \"../../shared/types.ts\";\nimport { captureModelSelection, resolveRequiredTierModel } from \"../shared/model-fallback.ts\";\nimport type { ModelScopeConfig } from \"../shared/model-scope.ts\";\nimport { injectSingleOutputInstruction, validateFileOnlyOutputMode } from \"../shared/single-output.ts\";\nimport { buildWorkflowGraphSnapshot } from \"../shared/workflow-graph.ts\";\nimport { ChainOutputValidationError, outputEntryFromResult, resolveOutputReferences, validateChainOutputBindings } from \"../shared/chain-outputs.ts\";\nimport { createStructuredOutputRuntime } from \"../shared/structured-output.ts\";\nimport { collectDynamicResults, DynamicFanoutError, materializeDynamicParallelStep, validateDynamicCollection, type DynamicCollectedResult } from \"../shared/dynamic-fanout.ts\";\nimport { acceptanceFailureMessage, aggregateAcceptanceReport, evaluateAcceptance, resolveEffectiveAcceptance } from \"../shared/acceptance.ts\";\nimport type { ChainOutputMap } from \"../../shared/types.ts\";\nimport { validateToolBudgetConfig } from \"../shared/tool-budget.ts\";\n\ninterface ChainExecutionDetailsInput {\n\tresults: SingleResult[];\n\tincludeProgress?: boolean;\n\tallProgress: AgentProgress[];\n\tallArtifactPaths: ArtifactPaths[];\n\tartifactsDir: string;\n\tchainAgents: string[];\n\tchainSteps: ChainStep[];\n\ttotalSteps: number;\n\tcurrentStepIndex?: number;\n\trunId: string;\n\toutputs?: ChainOutputMap;\n\tcurrentFlatIndex?: number;\n\tdynamicChildren?: Record<number, Array<{ agent: string; label?: string; flatIndex: number; itemKey: string; outputName?: string; structured?: boolean; error?: string }>>;\n\tdynamicGroupStatuses?: Record<number, { status: \"pending\" | \"running\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\" | \"detached\"; error?: string; acceptance?: SingleResult[\"acceptance\"] }>;\n}\n\ninterface ParallelChainRunInput {\n\tstep: ParallelStep;\n\tparallelTemplates: string[];\n\tparallelBehaviors: ResolvedStepBehavior[];\n\tagents: ChildRuntimeConfig[];\n\tstepIndex: number;\n\tavailableModels: ModelInfo[];\n\tmodelScope?: ModelScopeConfig;\n\tchainDir: string;\n\tprev: string;\n\toriginalTask: string;\n\tctx: ExtensionContext;\n\tintercomEvents?: IntercomEventBus;\n\tcwd?: string;\n\trunId: string;\n\tglobalTaskIndex: number;\n\tsessionDirForIndex: (idx?: number) => string | undefined;\n\tsessionFileForIndex?: (idx?: number) => string | undefined;\n\tsessionFileForTask?: (agentName: string, idx?: number, modelOverride?: string) => string | undefined;\n\tthinkingOverrideForTask?: (agentName: string, idx?: number, modelOverride?: string) => ChildRuntimeConfig[\"thinking\"] | undefined;\n\tshareEnabled: boolean;\n\tartifactConfig: ArtifactConfig;\n\tartifactsDir: string;\n\tsignal?: AbortSignal;\n\tonUpdate?: (r: AgentToolResult<Details>) => void;\n\tonControlEvent?: (event: ControlEvent) => void;\n\tcontrolConfig: ResolvedControlConfig;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\torchestratorIntercomTarget?: string;\n\tforegroundControl?: {\n\t\tupdatedAt: number;\n\t\tcurrentAgent?: string;\n\t\tcurrentChildId?: string;\n\t\tcurrentIndex?: number;\n\t\tcurrentActivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\tturnCount?: number;\n\t\ttokens?: number;\n\t\ttoolCount?: number;\n\t\tinterrupt?: () => boolean;\n\t};\n\tresults: SingleResult[];\n\tallProgress: AgentProgress[];\n\toutputs: ChainOutputMap;\n\tchainAgents: string[];\n\tchainSteps: ChainStep[];\n\ttotalSteps: number;\n\tdynamicChildren?: ChainExecutionDetailsInput[\"dynamicChildren\"];\n\tdynamicGroupStatuses?: ChainExecutionDetailsInput[\"dynamicGroupStatuses\"];\n\tworktreeSetup?: WorktreeSetup;\n\tmaxSubagentDepth: number;\n\tnestedRoute?: NestedRouteInfo;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\tonDetachedExit?: (index: number, result: SingleResult) => void;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ToolBudgetConfig;\n\tglobalSemaphore?: Semaphore;\n\tdynamic?: boolean;\n}\n\nfunction buildChainExecutionDetails(input: ChainExecutionDetailsInput): Details {\n\treturn compactForegroundDetails({\n\t\tmode: \"chain\",\n\t\tresults: input.results,\n\t\tprogress: input.includeProgress ? input.allProgress : undefined,\n\t\tartifacts: input.allArtifactPaths.length ? { dir: input.artifactsDir, files: input.allArtifactPaths } : undefined,\n\t\tchainAgents: input.chainAgents,\n\t\ttotalSteps: input.totalSteps,\n\t\tcurrentStepIndex: input.currentStepIndex,\n\t\toutputs: input.outputs,\n\t\ttotalChildUsage: sumResultsUsage(input.results),\n\t\ttotalCost: sumResultsCost(input.results),\n\t\tworkflowGraph: buildWorkflowGraphSnapshot({\n\t\t\trunId: input.runId,\n\t\t\tmode: \"chain\",\n\t\t\tsteps: input.chainSteps,\n\t\t\tresults: input.results,\n\t\t\tcurrentStepIndex: input.currentStepIndex,\n\t\t\tcurrentFlatIndex: input.currentFlatIndex,\n\t\t\tdynamicChildren: input.dynamicChildren,\n\t\t\tdynamicGroupStatuses: input.dynamicGroupStatuses,\n\t\t}),\n\t});\n}\n\nfunction buildChainExecutionErrorResult(message: string, input: ChainExecutionDetailsInput): ChainExecutionResult {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tisError: true,\n\t\tdetails: buildChainExecutionDetails(input),\n\t};\n}\n\nfunction ensureParallelProgressFile(\n\tchainDir: string,\n\tprogressCreated: boolean,\n\tparallelBehaviors: ResolvedStepBehavior[],\n): boolean {\n\tif (progressCreated || !parallelBehaviors.some((behavior) => behavior.progress)) {\n\t\treturn progressCreated;\n\t}\n\twriteInitialProgressFile(chainDir);\n\treturn true;\n}\n\nfunction appendParallelWorktreeSummary(\n\toutput: string,\n\tworktreeSetup: WorktreeSetup | undefined,\n\tdiffsDir: string,\n\tagents: string[],\n): string {\n\tif (!worktreeSetup) return output;\n\tconst diffs = diffWorktrees(worktreeSetup, agents, diffsDir);\n\tconst diffSummary = formatWorktreeDiffSummary(diffs);\n\tif (!diffSummary) return output;\n\treturn `${output}\\n\\n${diffSummary}`;\n}\n\nfunction resolveChainToolBudget(input: { stepBudget?: ToolBudgetConfig; runBudget?: ResolvedToolBudget; agentBudget?: ToolBudgetConfig; configBudget?: ToolBudgetConfig }): { toolBudget?: ResolvedToolBudget; error?: string } {\n\tif (input.stepBudget !== undefined) {\n\t\tconst resolved = validateToolBudgetConfig(input.stepBudget, \"toolBudget\");\n\t\treturn { toolBudget: resolved.budget, error: resolved.error };\n\t}\n\tif (input.runBudget !== undefined) return { toolBudget: input.runBudget };\n\tif (input.agentBudget !== undefined) {\n\t\tconst resolved = validateToolBudgetConfig(input.agentBudget, \"agent.toolBudget\");\n\t\treturn { toolBudget: resolved.budget, error: resolved.error };\n\t}\n\tconst resolved = validateToolBudgetConfig(input.configBudget, \"config.toolBudget\");\n\treturn { toolBudget: resolved.budget, error: resolved.error };\n}\n\nasync function runParallelChainTasks(input: ParallelChainRunInput): Promise<SingleResult[]> {\n\tconst concurrency = input.step.concurrency ?? MAX_CONCURRENCY;\n\tconst failFast = input.step.failFast ?? false;\n\tlet aborted = false;\n\tconst effectiveModels = input.step.parallel.map((task) => {\n\t\tconst taskChildConfig = input.agents.find((child) => child.name === task.agent);\n\t\treturn resolveRequiredTierModel(task.tier, input.availableModels, input.ctx.model?.provider);\n\t});\n\tfor (let taskIndex = 0; taskIndex < input.step.parallel.length; taskIndex++) {\n\t\tconst task = input.step.parallel[taskIndex]!;\n\t\tinput.sessionFileForTask?.(task.agent, input.globalTaskIndex + taskIndex, effectiveModels[taskIndex]);\n\t}\n\n\tconst parallelResults = await mapConcurrent(\n\t\tinput.step.parallel,\n\t\tconcurrency,\n\t\tasync (task, taskIndex) => {\n\t\t\tif (aborted && failFast) {\n\t\t\t\treturn {\n\t\t\t\t\tagent: task.agent,\n\t\t\t\t\ttask: \"(skipped)\",\n\t\t\t\t\texitCode: -1,\n\t\t\t\t\tmessages: [],\n\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },\n\t\t\t\t\terror: \"Skipped due to fail-fast\",\n\t\t\t\t} as SingleResult;\n\t\t\t}\n\n\t\t\tconst taskTemplate = input.parallelTemplates[taskIndex] ?? \"{previous}\";\n\t\t\tconst behavior = suppressProgressForReadOnlyTask(input.parallelBehaviors[taskIndex]!, taskTemplate, input.originalTask);\n\t\t\tconst taskChildConfig = input.agents.find((child) => child.name === task.agent);\n\t\t\tconst templateHasPrevious = taskTemplate.includes(\"{previous}\");\n\t\t\tconst { prefix, suffix } = buildChainInstructions(\n\t\t\t\t{ ...behavior, output: false },\n\t\t\t\tinput.chainDir,\n\t\t\t\tfalse,\n\t\t\t\ttemplateHasPrevious ? undefined : input.prev,\n\t\t\t);\n\n\t\t\tlet taskStr = resolveOutputReferences(taskTemplate, input.outputs);\n\t\t\ttaskStr = taskStr.replace(/\\{task\\}/g, input.originalTask);\n\t\t\ttaskStr = taskStr.replace(/\\{previous\\}/g, input.prev);\n\t\t\ttaskStr = taskStr.replace(/\\{chain_dir\\}/g, input.chainDir);\n\t\t\tconst cleanTask = taskStr;\n\t\t\ttaskStr = prefix + taskStr + suffix;\n\n\t\t\tconst effectiveModel = effectiveModels[taskIndex];\n\t\t\tconst maxSubagentDepth = resolveChildMaxSubagentDepth(input.maxSubagentDepth, taskChildConfig?.maxSubagentDepth);\n\t\t\tconst toolBudget = resolveChainToolBudget({ stepBudget: task.toolBudget, runBudget: input.toolBudget, agentBudget: taskChildConfig?.toolBudget, configBudget: input.configToolBudget });\n\t\t\tif (toolBudget.error) throw new Error(toolBudget.error);\n\n\t\t\tconst taskCwd = input.worktreeSetup\n\t\t\t\t? input.worktreeSetup.worktrees[taskIndex]!.agentCwd\n\t\t\t\t: resolveChildCwd(input.cwd ?? input.ctx.cwd, task.cwd);\n\n\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(input.chainDir, behavior.output))\n\t\t\t\t: undefined;\n\t\t\ttaskStr = injectSingleOutputInstruction(taskStr, outputPath, taskChildConfig);\n\t\t\tconst interruptController = new AbortController();\n\t\t\tif (input.foregroundControl) {\n\t\t\t\tinput.foregroundControl.currentAgent = task.description || task.agent;\n\t\t\t\tinput.foregroundControl.currentChildId = task.agent;\n\t\t\t\tinput.foregroundControl.currentIndex = input.globalTaskIndex + taskIndex;\n\t\t\t\tinput.foregroundControl.currentActivityState = undefined;\n\t\t\t\tinput.foregroundControl.updatedAt = Date.now();\n\t\t\t\tinput.foregroundControl.interrupt = () => {\n\t\t\t\t\tif (interruptController.signal.aborted) return false;\n\t\t\t\t\tinterruptController.abort();\n\t\t\t\t\tinput.foregroundControl!.currentActivityState = undefined;\n\t\t\t\t\tinput.foregroundControl!.updatedAt = Date.now();\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst structuredRuntime = task.outputSchema\n\t\t\t\t? createStructuredOutputRuntime(task.outputSchema, path.join(input.chainDir, \"structured-output\"))\n\t\t\t\t: undefined;\n\t\t\tconst result = await runSync(input.ctx.cwd, normalizeChildSpec({\n\t\t\t\ttask: taskStr,\n\t\t\t\tdescription: task.description,\n\t\t\t\tpermissions: task.permissions,\n\t\t\t\tmodel: effectiveModel ?? task.model,\n\t\t\t\ttier: task.tier,\n\t\t\t\tmodelSelection: captureModelSelection({ tier: task.tier }),\n\t\t\t\tskill: task.skill,\n\t\t\t\tcwd: taskCwd,\n\t\t\t\toutput: task.output,\n\t\t\t\toutputMode: task.outputMode,\n\t\t\t\tacceptance: task.acceptance,\n\t\t\t\ttoolBudget: task.toolBudget,\n\t\t\t}, { parentMode: snapshotParentPermissionMode(input.ctx.sessionManager.getSessionId() ?? undefined), runId: input.runId, index: input.globalTaskIndex + taskIndex }), {\n\t\t\t\tparentSessionId: input.ctx.sessionManager.getSessionId() ?? undefined,\n\t\t\t\tcwd: taskCwd,\n\t\t\t\tsignal: input.signal,\n\t\t\t\tinterruptSignal: interruptController.signal,\n\t\t\t\tallowIntercomDetach: taskChildConfig?.systemPrompt?.includes(INTERCOM_BRIDGE_MARKER) === true,\n\t\t\t\tintercomEvents: input.intercomEvents,\n\t\t\t\trunId: input.runId,\n\t\t\t\tindex: input.globalTaskIndex + taskIndex,\n\t\t\t\tsessionDir: input.sessionDirForIndex(input.globalTaskIndex + taskIndex),\n\t\t\t\tsessionFile: input.sessionFileForTask?.(task.agent, input.globalTaskIndex + taskIndex, effectiveModel)\n\t\t\t\t\t?? input.sessionFileForIndex?.(input.globalTaskIndex + taskIndex),\n\t\t\t\tthinkingOverride: input.thinkingOverrideForTask?.(task.agent, input.globalTaskIndex + taskIndex, effectiveModel),\n\t\t\t\tshare: input.shareEnabled,\n\t\t\t\tartifactsDir: input.artifactConfig.enabled ? input.artifactsDir : undefined,\n\t\t\t\tartifactConfig: input.artifactConfig,\n\t\t\t\toutputPath,\n\t\t\t\toutputMode: behavior.outputMode,\n\t\t\t\tmaxSubagentDepth,\n\t\t\t\tcontrolConfig: input.controlConfig,\n\t\t\t\tonControlEvent: input.onControlEvent,\n\t\t\t\tintercomSessionName: input.childIntercomTarget?.(task.agent, input.globalTaskIndex + taskIndex),\n\t\t\t\torchestratorIntercomTarget: input.orchestratorIntercomTarget,\n\t\t\t\tnestedRoute: input.nestedRoute,\n\t\t\t\tmodelOverride: effectiveModel,\n\t\t\t\tavailableModels: input.availableModels,\n\t\t\t\tpreferredModelProvider: input.ctx.model?.provider,\n\t\t\t\tmodelScope: input.modelScope,\n\t\t\t\tskills: behavior.skills === false ? [] : behavior.skills,\n\t\t\t\tstructuredOutput: structuredRuntime,\n\t\t\t\tacceptance: task.acceptance,\n\t\t\t\tacceptanceContext: { mode: \"chain\", dynamic: input.dynamic && task.acceptance === undefined },\n\t\t\t\ttimeoutMs: input.timeoutMs,\n\t\t\t\tdeadlineAt: input.deadlineAt,\n\t\t\t\tturnBudget: input.turnBudget,\n\t\t\t\tonDetachedExit: input.onDetachedExit\n\t\t\t\t\t? (result) => input.onDetachedExit?.(input.globalTaskIndex + taskIndex, result)\n\t\t\t\t\t: undefined,\n\t\t\t\ttoolBudget: toolBudget.toolBudget,\n\t\t\t\tonUpdate: input.onUpdate\n\t\t\t\t\t? (progressUpdate) => {\n\t\t\t\t\t\tconst stepResults = progressUpdate.details?.results || [];\n\t\t\t\t\t\tconst stepProgress = progressUpdate.details?.progress || [];\n\t\t\t\t\t\tif (input.foregroundControl && stepProgress.length > 0) {\n\t\t\t\t\t\t\tconst current = stepProgress[0];\n\t\t\t\t\t\t\tinput.foregroundControl.currentAgent = task.description || task.agent;\n\t\t\t\t\t\t\tinput.foregroundControl.currentChildId = task.agent;\n\t\t\t\t\t\t\tinput.foregroundControl.currentIndex = input.globalTaskIndex + taskIndex;\n\t\t\t\t\t\t\tinput.foregroundControl.currentActivityState = current?.activityState;\n\t\t\t\t\t\t\tinput.foregroundControl.lastActivityAt = current?.lastActivityAt;\n\t\t\t\t\t\t\tinput.foregroundControl.currentTool = current?.currentTool;\n\t\t\t\t\t\t\tinput.foregroundControl.currentToolStartedAt = current?.currentToolStartedAt;\n\t\t\t\t\t\t\tinput.foregroundControl.currentPath = current?.currentPath;\n\t\t\t\t\t\t\tinput.foregroundControl.turnCount = current?.turnCount;\n\t\t\t\t\t\t\tinput.foregroundControl.tokens = current?.tokens;\n\t\t\t\t\t\t\tinput.foregroundControl.toolCount = current?.toolCount;\n\t\t\t\t\t\t\tinput.foregroundControl.updatedAt = Date.now();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinput.onUpdate?.({\n\t\t\t\t\t\t\t...progressUpdate,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\tresults: input.results.concat(stepResults),\n\t\t\t\t\t\t\t\tprogress: input.allProgress.concat(stepProgress),\n\t\t\t\t\t\t\t\tcontrolEvents: progressUpdate.details?.controlEvents,\n\t\t\t\t\t\t\t\tchainAgents: input.chainAgents,\n\t\t\t\t\t\t\t\ttotalSteps: input.totalSteps,\n\t\t\t\t\t\t\t\tcurrentStepIndex: input.stepIndex,\n\t\t\t\t\t\t\t\toutputs: input.outputs,\n\t\t\t\t\t\t\t\tworkflowGraph: buildWorkflowGraphSnapshot({\n\t\t\t\t\t\t\t\t\trunId: input.runId,\n\t\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\t\tsteps: input.chainSteps,\n\t\t\t\t\t\t\t\t\tresults: input.results.concat(stepResults),\n\t\t\t\t\t\t\t\t\tcurrentStepIndex: input.stepIndex,\n\t\t\t\t\t\t\t\t\tcurrentFlatIndex: input.globalTaskIndex + taskIndex,\n\t\t\t\t\t\t\t\t\tdynamicChildren: input.dynamicChildren,\n\t\t\t\t\t\t\t\t\tdynamicGroupStatuses: input.dynamicGroupStatuses,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tif (input.foregroundControl?.currentIndex === input.globalTaskIndex + taskIndex) {\n\t\t\t\tinput.foregroundControl.interrupt = undefined;\n\t\t\t\tinput.foregroundControl.updatedAt = Date.now();\n\t\t\t}\n\n\t\t\tif (result.exitCode !== 0 && failFast) {\n\t\t\t\taborted = true;\n\t\t\t}\n\t\t\trecordRun(task.agent, cleanTask, result.exitCode, result.progressSummary?.durationMs ?? 0);\n\t\t\treturn result;\n\t\t},\n\t\tinput.globalSemaphore,\n\t);\n\n\treturn parallelResults;\n}\n\ninterface ChainExecutionParams {\n\tchain: ChainStep[];\n\ttask?: string;\n\tagents: ChildRuntimeConfig[];\n\tctx: ExtensionContext;\n\tintercomEvents?: IntercomEventBus;\n\tsignal?: AbortSignal;\n\trunId: string;\n\tcwd?: string;\n\tshareEnabled: boolean;\n\tsessionDirForIndex: (idx?: number) => string | undefined;\n\tsessionFileForIndex?: (idx?: number) => string | undefined;\n\tsessionFileForTask?: (agentName: string, idx?: number, modelOverride?: string) => string | undefined;\n\tthinkingOverrideForTask?: (agentName: string, idx?: number, modelOverride?: string) => ChildRuntimeConfig[\"thinking\"] | undefined;\n\tartifactsDir: string;\n\tartifactConfig: ArtifactConfig;\n\tincludeProgress?: boolean;\n\tclarify?: boolean;\n\tonUpdate?: (r: AgentToolResult<Details>) => void;\n\tonControlEvent?: (event: ControlEvent) => void;\n\tcontrolConfig: ResolvedControlConfig;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\torchestratorIntercomTarget?: string;\n\tforegroundControl?: {\n\t\tupdatedAt: number;\n\t\tcurrentAgent?: string;\n\t\tcurrentChildId?: string;\n\t\tcurrentIndex?: number;\n\t\tcurrentActivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\tturnCount?: number;\n\t\ttokens?: number;\n\t\ttoolCount?: number;\n\t\tinterrupt?: () => boolean;\n\t};\n\tchainSkills?: string[];\n\tchainDir?: string;\n\tdynamicFanoutMaxItems?: number;\n\tmaxSubagentDepth: number;\n\tnestedRoute?: NestedRouteInfo;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\tonDetachedExit?: (index: number, result: SingleResult) => void;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ToolBudgetConfig;\n\t/** Global cap on simultaneously-running tasks within this chain. Defaults to DEFAULT_GLOBAL_CONCURRENCY_LIMIT. */\n\tglobalConcurrencyLimit?: number;\n}\n\ninterface ChainExecutionResult {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Details;\n\tisError?: boolean;\n\t/** User requested async execution via TUI - caller should dispatch to executeAsyncChain */\n\trequestedAsync?: {\n\t\tchain: ChainStep[];\n\t\tchainSkills: string[];\n\t};\n}\n\n/**\n * Execute a chain of subagent steps\n */\nexport async function executeChain(params: ChainExecutionParams): Promise<ChainExecutionResult> {\n\tconst {\n\t\tchain: chainSteps,\n\t\tagents,\n\t\tctx,\n\t\tsignal,\n\t\trunId,\n\t\tcwd,\n\t\tshareEnabled,\n\t\tsessionDirForIndex,\n\t\tsessionFileForIndex,\n\t\tsessionFileForTask,\n\t\tthinkingOverrideForTask,\n\t\tartifactsDir,\n\t\tartifactConfig,\n\t\tincludeProgress,\n\t\tclarify,\n\t\tonUpdate,\n\t\tonControlEvent,\n\t\tcontrolConfig,\n\t\tonDetachedExit,\n\t\tchildIntercomTarget,\n\t\torchestratorIntercomTarget,\n\t\tforegroundControl,\n\t\tintercomEvents,\n\t\tchainSkills: chainSkillsParam,\n\t\tchainDir: chainDirBase,\n\t\tmodelScope,\n\t} = params;\n\tconst chainSkills = chainSkillsParam ?? [];\n\n\tconst results: SingleResult[] = [];\n\tconst outputs: ChainOutputMap = {};\n\tconst dynamicChildren: ChainExecutionDetailsInput[\"dynamicChildren\"] = {};\n\tconst dynamicGroupStatuses: ChainExecutionDetailsInput[\"dynamicGroupStatuses\"] = {};\n\tconst allProgress: AgentProgress[] = [];\n\tconst allArtifactPaths: ArtifactPaths[] = [];\n\n\tconst chainAgents: string[] = chainSteps.map((step) =>\n\t\tisParallelStep(step)\n\t\t\t? `[${step.parallel.map((t) => t.description || t.label || t.agent || \"child\").join(\"+\")}]`\n\t\t\t: isDynamicParallelStep(step)\n\t\t\t\t? `expand:${step.parallel.description || step.parallel.label || step.parallel.agent || \"child\"}`\n\t\t\t: ((step as SequentialStep).description || (step as SequentialStep).label || (step as SequentialStep).agent || \"child\"),\n\t);\n\tconst totalSteps = chainSteps.length;\n\n\tconst makeDetailsInput = (overrides: Pick<Partial<ChainExecutionDetailsInput>, \"currentStepIndex\" | \"currentFlatIndex\"> = {}): ChainExecutionDetailsInput => ({\n\t\tresults,\n\t\t...(includeProgress !== undefined ? { includeProgress } : {}),\n\t\tallProgress,\n\t\tallArtifactPaths,\n\t\tartifactsDir,\n\t\tchainAgents,\n\t\tchainSteps,\n\t\ttotalSteps,\n\t\trunId,\n\t\toutputs,\n\t\tdynamicChildren,\n\t\tdynamicGroupStatuses,\n\t\t...overrides,\n\t});\n\n\tconst firstStep = chainSteps[0]!;\n\tconst originalTask = params.task\n\t\t?? (isParallelStep(firstStep)\n\t\t\t? firstStep.parallel[0]!.task!\n\t\t\t: isDynamicParallelStep(firstStep)\n\t\t\t\t? firstStep.parallel.task!\n\t\t\t\t: (firstStep as SequentialStep).task!);\n\ttry {\n\t\tvalidateChainOutputBindings(chainSteps, { maxItems: params.dynamicFanoutMaxItems });\n\t} catch (error) {\n\t\tif (error instanceof ChainOutputValidationError) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: error.message }],\n\t\t\t\tisError: true,\n\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t\t\t};\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst chainDir = createChainDir(runId, chainDirBase);\n\tconst hasParallelSteps = chainSteps.some((step) => isParallelStep(step) || isDynamicParallelStep(step));\n\tlet templates: ResolvedTemplates = resolveChainTemplates(chainSteps);\n\tconst shouldClarify = clarify === true && ctx.hasUI && !hasParallelSteps;\n\tlet tuiBehaviorOverrides: (BehaviorOverride | undefined)[] | undefined;\n\tconst availableModels: ModelInfo[] = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst availableSkills = discoverAvailableSkills(cwd ?? ctx.cwd);\n\n\tif (shouldClarify) {\n\t\tconst seqSteps = chainSteps as SequentialStep[];\n\t\tconst agentConfigs: ChildRuntimeConfig[] = [];\n\t\tfor (const step of seqSteps) {\n\t\t\tconst config = agents.find((a) => a.name === step.agent);\n\t\t\tif (!config) {\n\t\t\t\tremoveChainDir(chainDir);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Unknown agent: ${step.agent}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: seqSteps.indexOf(step) })),\n\t\t\t\t};\n\t\t\t}\n\t\t\tagentConfigs.push(config);\n\t\t}\n\n\t\tconst stepOverrides: StepOverrides[] = seqSteps.map((step) => ({\n\t\t\toutput: step.output,\n\t\t\toutputMode: step.outputMode,\n\t\t\treads: step.reads,\n\t\t\tprogress: step.progress,\n\t\t\tskills: normalizeSkillInput(step.skill),\n\t\t\tmodel: step.model,\n\t\t}));\n\n\t\tconst resolvedBehaviors = agentConfigs.map((_config, i) =>\n\t\t\tresolveStepBehavior(stepOverrides[i]!, chainSkills),\n\t\t);\n\t\tconst flatTemplates = templates as string[];\n\n\t\tconst result = await ctx.ui.custom<ChainClarifyResult>(\n\t\t\t(tui, theme, _kb, done) =>\n\t\t\t\tnew ChainClarifyComponent(\n\t\t\t\t\ttui,\n\t\t\t\t\ttheme,\n\t\t\t\t\tagentConfigs,\n\t\t\t\t\tflatTemplates,\n\t\t\t\t\toriginalTask,\n\t\t\t\t\tchainDir,\n\t\t\t\t\tresolvedBehaviors,\n\t\t\t\t\tavailableModels,\n\t\t\t\t\tctx.model?.provider,\n\t\t\t\t\tavailableSkills,\n\t\t\t\t\tdone,\n\t\t\t\t),\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 84, maxHeight: \"80%\" },\n\t\t\t},\n\t\t);\n\n\t\tif (!result || !result.confirmed) {\n\t\t\tremoveChainDir(chainDir);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: \"Chain cancelled\" }],\n\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t\t\t};\n\t\t}\n\n\t\tif (result.runInBackground) {\n\t\t\tremoveChainDir(chainDir);\n\t\t\tconst updatedChain: ChainStep[] = chainSteps.map((step, i) => {\n\t\t\t\tif (isParallelStep(step)) return step;\n\t\t\t\tconst override = result.behaviorOverrides[i];\n\t\t\t\treturn {\n\t\t\t\t\t...step,\n\t\t\t\t\ttask: result.templates[i]!,\n\t\t\t\t\t...(override?.output !== undefined ? { output: override.output } : {}),\n\t\t\t\t\t...(\"outputMode\" in step && step.outputMode !== undefined ? { outputMode: step.outputMode } : {}),\n\t\t\t\t\t...(override?.reads !== undefined ? { reads: override.reads } : {}),\n\t\t\t\t\t...(override?.progress !== undefined ? { progress: override.progress } : {}),\n\t\t\t\t\t...(override?.skills !== undefined ? { skill: override.skills } : {}),\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: \"Launching in background...\" }],\n\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t\t\t\trequestedAsync: { chain: updatedChain, chainSkills },\n\t\t\t};\n\t\t}\n\n\t\ttemplates = result.templates;\n\t\ttuiBehaviorOverrides = result.behaviorOverrides;\n\t}\n\n\tconst deadlineAt = params.deadlineAt ?? (params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined);\n\tconst globalSemaphore = new Semaphore(params.globalConcurrencyLimit ?? DEFAULT_GLOBAL_CONCURRENCY_LIMIT);\n\tlet prev = \"\";\n\tlet globalTaskIndex = 0;\n\tlet progressCreated = false;\n\n\tfor (let stepIndex = 0; stepIndex < chainSteps.length; stepIndex++) {\n\t\tconst step = chainSteps[stepIndex]!;\n\t\tconst stepTemplates = templates[stepIndex]!;\n\n\t\tif (isParallelStep(step)) {\n\t\t\tconst parallelTemplates = stepTemplates as string[];\n\t\t\tconst parallelCwd = resolveChildCwd(cwd ?? ctx.cwd, step.cwd);\n\t\t\tlet worktreeSetup: WorktreeSetup | undefined;\n\t\t\tif (step.worktree) {\n\t\t\t\tconst worktreeTaskCwdConflict = findWorktreeTaskCwdConflict(step.parallel, parallelCwd);\n\t\t\t\tif (worktreeTaskCwdConflict) {\n\t\t\t\t\treturn buildChainExecutionErrorResult(\n\t\t\t\t\t\t`parallel chain step ${stepIndex + 1}: ${formatWorktreeTaskCwdConflict(worktreeTaskCwdConflict, parallelCwd)}`,\n\t\t\t\t\t\tmakeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tworktreeSetup = createWorktrees(parallelCwd, `${runId}-s${stepIndex}`, step.parallel.length, {\n\t\t\t\t\t\tagents: step.parallel.map((task) => task.agent),\n\t\t\t\t\t\tsetupHook: params.worktreeSetupHook\n\t\t\t\t\t\t\t? { hookPath: params.worktreeSetupHook, timeoutMs: params.worktreeSetupHookTimeoutMs }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tbaseDir: params.worktreeBaseDir,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst agentNames = step.parallel.map((task) => task.agent);\n\t\t\t\tconst parallelBehaviors = resolveParallelBehaviors(step.parallel, stepIndex, chainSkills)\n\t\t\t\t\t.map((behavior, taskIndex) => suppressProgressForReadOnlyTask(behavior, parallelTemplates[taskIndex] ?? step.parallel[taskIndex]?.task, originalTask));\n\t\t\t\tfor (let taskIndex = 0; taskIndex < step.parallel.length; taskIndex++) {\n\t\t\t\t\tconst behavior = parallelBehaviors[taskIndex]!;\n\t\t\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Parallel chain step ${stepIndex + 1} task ${taskIndex + 1} (${step.parallel[taskIndex]!.agent})`);\n\t\t\t\t\tif (validationError) return buildChainExecutionErrorResult(validationError, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex + taskIndex }));\n\t\t\t\t}\n\t\t\t\tprogressCreated = ensureParallelProgressFile(chainDir, progressCreated, parallelBehaviors);\n\t\t\t\tcreateParallelDirs(chainDir, stepIndex, step.parallel.length, agentNames);\n\n\t\t\t\tconst parallelResults = await runParallelChainTasks({\n\t\t\t\t\tstep,\n\t\t\t\t\tparallelTemplates,\n\t\t\t\t\tparallelBehaviors,\n\t\t\t\t\tagents,\n\t\t\t\t\tstepIndex,\n\t\t\t\t\tavailableModels,\n\t\t\t\t\tmodelScope,\n\t\t\t\t\tchainDir,\n\t\t\t\t\tprev,\n\t\t\t\t\toriginalTask,\n\t\t\t\t\tctx,\n\t\t\t\t\tintercomEvents,\n\t\t\t\t\tcwd,\n\t\t\t\t\trunId,\n\t\t\t\t\tglobalTaskIndex,\n\t\t\t\t\tsessionDirForIndex,\n\t\t\t\t\tsessionFileForIndex,\n\t\t\t\t\tsessionFileForTask,\n\t\t\t\t\tthinkingOverrideForTask,\n\t\t\t\t\tshareEnabled,\n\t\t\t\t\tartifactConfig,\n\t\t\t\t\tartifactsDir,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tresults,\n\t\t\t\t\tallProgress,\n\t\t\t\t\toutputs,\n\t\t\t\t\tchainAgents,\n\t\t\t\t\tchainSteps,\n\t\t\t\t\ttotalSteps,\n\t\t\t\t\tdynamicChildren,\n\t\t\t\t\tdynamicGroupStatuses,\n\t\t\t\t\tcontrolConfig,\n\t\t\t\t\tonControlEvent,\n\t\t\t\t\tchildIntercomTarget,\n\t\t\t\t\torchestratorIntercomTarget,\n\t\t\t\t\tforegroundControl,\n\t\t\t\t\tnestedRoute: params.nestedRoute,\n\t\t\t\t\tworktreeSetup,\n\t\t\t\t\tmaxSubagentDepth: params.maxSubagentDepth,\n\t\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\t\tdeadlineAt,\n\t\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\t\tonDetachedExit,\n\t\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\t\tconfigToolBudget: params.configToolBudget,\n\t\t\t\t\tglobalSemaphore,\n\t\t\t\t});\n\t\t\t\tglobalTaskIndex += step.parallel.length;\n\n\t\t\t\tfor (const result of parallelResults) {\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\tif (result.progress) allProgress.push(result.progress);\n\t\t\t\t\tif (result.artifactPaths) allArtifactPaths.push(result.artifactPaths);\n\t\t\t\t}\n\t\t\t\tconst interruptedIndexInStep = parallelResults.findIndex((result) => result.interrupted);\n\t\t\t\tconst interrupted = interruptedIndexInStep >= 0 ? parallelResults[interruptedIndexInStep] : undefined;\n\t\t\t\tif (interrupted) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain paused after interrupt at step ${stepIndex + 1} (${interrupted.agent}). Waiting for explicit next action.` }],\n\t\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\tcurrentFlatIndex: globalTaskIndex - step.parallel.length + interruptedIndexInStep,\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst detachedIndexInStep = parallelResults.findIndex((result) => result.detached);\n\t\t\t\tconst detached = detachedIndexInStep >= 0 ? parallelResults[detachedIndexInStep] : undefined;\n\t\t\t\tif (detached) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain detached for intercom coordination at step ${stepIndex + 1} (${detached.agent}). Reply to the supervisor request first, then wait with subagent_wait({ id: \"${runId}\" }). Use subagent({ action: \"status\", id: \"${runId}\" }) to recover the result; do not resume or launch a replacement while it remains detached.` }],\n\t\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\tcurrentFlatIndex: globalTaskIndex - step.parallel.length + detachedIndexInStep,\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst failures = parallelResults\n\t\t\t\t\t.map((result, originalIndex) => ({ ...result, originalIndex }))\n\t\t\t\t\t.filter((result) => result.exitCode !== 0 && result.exitCode !== -1);\n\t\t\t\tif (failures.length > 0) {\n\t\t\t\t\tconst failureSummary = failures\n\t\t\t\t\t\t.map((failure) => `- Task ${failure.originalIndex + 1} (${failure.agent}): ${failure.error || \"failed\"}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tconst errorMsg = `Parallel step ${stepIndex + 1} failed:\\n${failureSummary}`;\n\t\t\t\t\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"failed\", {\n\t\t\t\t\t\tindex: stepIndex,\n\t\t\t\t\t\terror: errorMsg,\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: summary }],\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\tcurrentFlatIndex: globalTaskIndex - step.parallel.length + failures[0]!.originalIndex,\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfor (let taskIndex = 0; taskIndex < parallelResults.length; taskIndex++) {\n\t\t\t\t\tconst outputName = step.parallel[taskIndex]?.as;\n\t\t\t\t\tif (outputName) outputs[outputName] = outputEntryFromResult(parallelResults[taskIndex]!, stepIndex);\n\t\t\t\t}\n\n\t\t\t\tconst taskResults: ParallelTaskResult[] = parallelResults.map((result, i) => {\n\t\t\t\t\tconst outputTarget = parallelBehaviors[i]?.output;\n\t\t\t\t\tconst outputTargetPath = typeof outputTarget === \"string\"\n\t\t\t\t\t\t? (path.isAbsolute(outputTarget) ? outputTarget : path.join(chainDir, outputTarget))\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tagent: result.agent,\n\t\t\t\t\t\ttaskIndex: i,\n\t\t\t\t\t\toutput: getSingleResultOutput(result),\n\t\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\ttimedOut: result.timedOut,\n\t\t\t\t\t\toutputTargetPath,\n\t\t\t\t\t\toutputTargetExists: outputTargetPath ? fs.existsSync(outputTargetPath) : undefined,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tprev = aggregateParallelOutputs(taskResults);\n\t\t\t\tprev = appendParallelWorktreeSummary(\n\t\t\t\t\tprev,\n\t\t\t\t\tworktreeSetup,\n\t\t\t\t\tpath.join(chainDir, \"worktree-diffs\", `step-${stepIndex}`),\n\t\t\t\t\tagentNames,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (worktreeSetup) cleanupWorktrees(worktreeSetup);\n\t\t\t}\n\t\t} else if (isDynamicParallelStep(step)) {\n\t\t\tconst dynamicStartIndex = globalTaskIndex;\n\t\t\tconst reservedDynamicItems = step.expand.maxItems ?? params.dynamicFanoutMaxItems ?? 0;\n\t\t\tlet materialized: ReturnType<typeof materializeDynamicParallelStep>;\n\t\t\ttry {\n\t\t\t\tmaterialized = materializeDynamicParallelStep(step, outputs, stepIndex, { maxItems: params.dynamicFanoutMaxItems });\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: message };\n\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t}\n\n\t\t\tdynamicChildren[stepIndex] = materialized.items.map((item, itemIndex) => ({\n\t\t\t\tagent: step.parallel.agent,\n\t\t\t\tlabel: materialized.parallel[itemIndex]?.label,\n\t\t\t\tflatIndex: globalTaskIndex + itemIndex,\n\t\t\t\titemKey: item.key,\n\t\t\t\tstructured: Boolean(step.parallel.outputSchema),\n\t\t\t}));\n\n\t\t\tif (materialized.parallel.length === 0) {\n\t\t\t\tconst collection: DynamicCollectedResult[] = [];\n\t\t\t\ttry {\n\t\t\t\t\tvalidateDynamicCollection(step.collect.outputSchema, collection);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);\n\t\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: message };\n\t\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t\t}\n\t\t\t\toutputs[step.collect.as] = {\n\t\t\t\t\ttext: JSON.stringify(collection),\n\t\t\t\t\tstructured: collection,\n\t\t\t\t\tagent: step.parallel.agent,\n\t\t\t\t\tstepIndex,\n\t\t\t\t};\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"completed\" };\n\t\t\t\tif (step.acceptance !== undefined) {\n\t\t\t\t\tconst effectiveGroupAcceptance = resolveEffectiveAcceptance({\n\t\t\t\t\t\texplicit: step.acceptance,\n\t\t\t\t\t\tagentName: step.parallel.agent,\n\t\t\t\t\t\tacceptanceRole: agents.find((agent) => agent.name === step.parallel.agent)?.acceptanceRole,\n\t\t\t\t\t\ttask: (step.parallel.task ?? originalTask ?? \"\").replace(/\\{task\\}/g, originalTask ?? \"\"),\n\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\tdynamicGroup: true,\n\t\t\t\t\t});\n\t\t\t\t\tconst groupAcceptance = await evaluateAcceptance({\n\t\t\t\t\t\tacceptance: effectiveGroupAcceptance,\n\t\t\t\t\t\toutput: \"\",\n\t\t\t\t\t\treport: aggregateAcceptanceReport({\n\t\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\t\tnotes: \"Dynamic fanout produced 0 results.\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tcwd: cwd ?? ctx.cwd,\n\t\t\t\t\t});\n\t\t\t\t\tdynamicGroupStatuses[stepIndex].acceptance = groupAcceptance;\n\t\t\t\t\tconst groupAcceptanceFailure = acceptanceFailureMessage(groupAcceptance);\n\t\t\t\t\tif (groupAcceptanceFailure) {\n\t\t\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: groupAcceptanceFailure, acceptance: groupAcceptance };\n\t\t\t\t\t\treturn buildChainExecutionErrorResult(groupAcceptanceFailure, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprev = \"Dynamic fanout produced 0 results.\";\n\t\t\t\tglobalTaskIndex = dynamicStartIndex + reservedDynamicItems;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dynamicParallelStep: ParallelStep = {\n\t\t\t\tparallel: materialized.parallel,\n\t\t\t\tconcurrency: step.concurrency,\n\t\t\t\tfailFast: step.failFast,\n\t\t\t};\n\t\t\tconst parallelTemplates = materialized.parallel.map((task) => task.task ?? \"{previous}\");\n\t\t\tconst parallelBehaviors = resolveParallelBehaviors(dynamicParallelStep.parallel, stepIndex, chainSkills)\n\t\t\t\t.map((behavior, taskIndex) => suppressProgressForReadOnlyTask(behavior, parallelTemplates[taskIndex] ?? dynamicParallelStep.parallel[taskIndex]?.task, originalTask));\n\n\t\t\tfor (let taskIndex = 0; taskIndex < dynamicParallelStep.parallel.length; taskIndex++) {\n\t\t\t\tconst behavior = parallelBehaviors[taskIndex]!;\n\t\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))\n\t\t\t\t\t: undefined;\n\t\t\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Dynamic chain step ${stepIndex + 1} item ${taskIndex + 1} (${dynamicParallelStep.parallel[taskIndex]!.agent})`);\n\t\t\t\tif (validationError) {\n\t\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: validationError };\n\t\t\t\t\treturn buildChainExecutionErrorResult(validationError, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex + taskIndex }));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprogressCreated = ensureParallelProgressFile(chainDir, progressCreated, parallelBehaviors);\n\t\t\tcreateParallelDirs(chainDir, stepIndex, dynamicParallelStep.parallel.length, dynamicParallelStep.parallel.map((task) => task.agent));\n\t\t\tconst parallelResults = await runParallelChainTasks({\n\t\t\t\tstep: dynamicParallelStep,\n\t\t\t\tparallelTemplates,\n\t\t\t\tparallelBehaviors,\n\t\t\t\tagents,\n\t\t\t\tstepIndex,\n\t\t\t\tavailableModels,\n\t\t\t\tmodelScope,\n\t\t\t\tchainDir,\n\t\t\t\tprev,\n\t\t\t\toriginalTask,\n\t\t\t\tctx,\n\t\t\t\tintercomEvents,\n\t\t\t\tcwd,\n\t\t\t\trunId,\n\t\t\t\tglobalTaskIndex,\n\t\t\t\tsessionDirForIndex,\n\t\t\t\tsessionFileForIndex,\n\t\t\t\tsessionFileForTask,\n\t\t\t\tthinkingOverrideForTask,\n\t\t\t\tshareEnabled,\n\t\t\t\tartifactConfig,\n\t\t\t\tartifactsDir,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tresults,\n\t\t\t\tallProgress,\n\t\t\t\toutputs,\n\t\t\t\tchainAgents,\n\t\t\t\tchainSteps,\n\t\t\t\ttotalSteps,\n\t\t\t\tdynamicChildren,\n\t\t\t\tdynamicGroupStatuses,\n\t\t\t\tcontrolConfig,\n\t\t\t\tonControlEvent,\n\t\t\t\tchildIntercomTarget,\n\t\t\t\torchestratorIntercomTarget,\n\t\t\t\tforegroundControl,\n\t\t\t\tnestedRoute: params.nestedRoute,\n\t\t\t\tmaxSubagentDepth: params.maxSubagentDepth,\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\tonDetachedExit,\n\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\tconfigToolBudget: params.configToolBudget,\n\t\t\t\tglobalSemaphore,\n\t\t\t\tdynamic: true,\n\t\t\t});\n\t\t\tglobalTaskIndex = dynamicStartIndex + reservedDynamicItems;\n\n\t\t\tfor (const result of parallelResults) {\n\t\t\t\tresults.push(result);\n\t\t\t\tif (result.progress) allProgress.push(result.progress);\n\t\t\t\tif (result.artifactPaths) allArtifactPaths.push(result.artifactPaths);\n\t\t\t}\n\t\t\tconst collected = collectDynamicResults(step, materialized.items, parallelResults);\n\t\t\tconst interruptedIndexInStep = parallelResults.findIndex((result) => result.interrupted);\n\t\t\tconst interrupted = interruptedIndexInStep >= 0 ? parallelResults[interruptedIndexInStep] : undefined;\n\t\t\tif (interrupted) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain paused after interrupt at step ${stepIndex + 1} (${interrupted.agent}). Waiting for explicit next action.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\tcurrentFlatIndex: dynamicStartIndex + interruptedIndexInStep,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst detachedIndexInStep = parallelResults.findIndex((result) => result.detached);\n\t\t\tconst detached = detachedIndexInStep >= 0 ? parallelResults[detachedIndexInStep] : undefined;\n\t\t\tif (detached) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain detached for intercom coordination at step ${stepIndex + 1} (${detached.agent}). Reply to the supervisor request first, then wait with subagent_wait({ id: \"${runId}\" }). Use subagent({ action: \"status\", id: \"${runId}\" }) to recover the result; do not resume or launch a replacement while it remains detached.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\tcurrentFlatIndex: dynamicStartIndex + detachedIndexInStep,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst failures = parallelResults\n\t\t\t\t.map((result, originalIndex) => ({ ...result, originalIndex }))\n\t\t\t\t.filter((result) => result.exitCode !== 0 && result.exitCode !== -1);\n\t\t\tif (failures.length > 0) {\n\t\t\t\tconst failureSummary = failures\n\t\t\t\t\t.map((failure) => `- Item ${failure.originalIndex + 1} (${failure.agent}, key ${materialized.items[failure.originalIndex]?.key ?? failure.originalIndex}): ${failure.error || \"failed\"}`)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tconst errorMsg = `Dynamic step ${stepIndex + 1} failed:\\n${failureSummary}`;\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: errorMsg };\n\t\t\t\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"failed\", {\n\t\t\t\t\tindex: stepIndex,\n\t\t\t\t\terror: errorMsg,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: summary }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\tcurrentFlatIndex: dynamicStartIndex + failures[0]!.originalIndex,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvalidateDynamicCollection(step.collect.outputSchema, collected);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: message };\n\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: dynamicStartIndex }));\n\t\t\t}\n\t\t\toutputs[step.collect.as] = {\n\t\t\t\ttext: JSON.stringify(collected),\n\t\t\t\tstructured: collected,\n\t\t\t\tagent: step.parallel.agent,\n\t\t\t\tstepIndex,\n\t\t\t};\n\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"completed\" };\n\t\t\tconst effectiveGroupAcceptance = resolveEffectiveAcceptance({\n\t\t\t\texplicit: step.acceptance,\n\t\t\t\tagentName: step.parallel.agent,\n\t\t\t\tacceptanceRole: agents.find((agent) => agent.name === step.parallel.agent)?.acceptanceRole,\n\t\t\t\ttask: materialized.parallel\n\t\t\t\t\t.map((task) => (task.task ?? originalTask ?? \"\").replace(/\\{task\\}/g, originalTask ?? \"\"))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\tmode: \"chain\",\n\t\t\t\tdynamicGroup: true,\n\t\t\t});\n\t\t\tconst groupAcceptance = await evaluateAcceptance({\n\t\t\t\tacceptance: effectiveGroupAcceptance,\n\t\t\t\toutput: \"\",\n\t\t\t\treport: aggregateAcceptanceReport({\n\t\t\t\t\tresults: parallelResults,\n\t\t\t\t\tnotes: `Dynamic fanout collected ${collected.length} result(s) into ${step.collect.as}.`,\n\t\t\t\t}),\n\t\t\t\tcwd: cwd ?? ctx.cwd,\n\t\t\t});\n\t\t\tdynamicGroupStatuses[stepIndex].acceptance = groupAcceptance;\n\t\t\tconst groupAcceptanceFailure = effectiveGroupAcceptance.explicit ? acceptanceFailureMessage(groupAcceptance) : undefined;\n\t\t\tif (groupAcceptanceFailure) {\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: groupAcceptanceFailure, acceptance: groupAcceptance };\n\t\t\t\treturn buildChainExecutionErrorResult(groupAcceptanceFailure, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex - dynamicParallelStep.parallel.length }));\n\t\t\t}\n\t\t\tconst taskResults: ParallelTaskResult[] = parallelResults.map((result, i) => ({\n\t\t\t\tagent: result.agent,\n\t\t\t\ttaskIndex: i,\n\t\t\t\toutput: getSingleResultOutput(result),\n\t\t\t\texitCode: result.exitCode,\n\t\t\t\terror: result.error,\n\t\t\t\ttimedOut: result.timedOut,\n\t\t\t}));\n\t\t\tprev = aggregateParallelOutputs(taskResults, (i, agent) => `=== Dynamic Item ${i + 1} (${agent}, key ${materialized.items[i]?.key ?? i}) ===`);\n\t\t} else {\n\t\t\tconst seqStep = step as SequentialStep;\n\t\t\tconst stepTemplate = stepTemplates as string;\n\n\t\t\tconst agentConfig = agents.find((a) => a.name === seqStep.agent);\n\t\t\tif (!agentConfig) {\n\t\t\t\tremoveChainDir(chainDir);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Unknown agent: ${seqStep.agent}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex })),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst tuiOverride = tuiBehaviorOverrides?.[stepIndex];\n\t\t\tconst stepOverride: StepOverrides = {\n\t\t\t\toutput: tuiOverride?.output !== undefined ? tuiOverride.output : seqStep.output,\n\t\t\t\toutputMode: seqStep.outputMode,\n\t\t\t\treads: tuiOverride?.reads !== undefined ? tuiOverride.reads : seqStep.reads,\n\t\t\t\tprogress: tuiOverride?.progress !== undefined ? tuiOverride.progress : seqStep.progress,\n\t\t\t\tskills:\n\t\t\t\t\ttuiOverride?.skills !== undefined\n\t\t\t\t\t\t? tuiOverride.skills\n\t\t\t\t\t\t: normalizeSkillInput(seqStep.skill),\n\t\t\t};\n\t\t\tconst behavior = suppressProgressForReadOnlyTask(resolveStepBehavior(stepOverride, chainSkills), stepTemplate, originalTask);\n\n\t\t\tconst isFirstProgress = behavior.progress && !progressCreated;\n\t\t\tif (isFirstProgress) {\n\t\t\t\tprogressCreated = true;\n\t\t\t}\n\n\t\t\tconst templateHasPrevious = stepTemplate.includes(\"{previous}\");\n\t\t\tconst { prefix, suffix } = buildChainInstructions(\n\t\t\t\t{ ...behavior, output: false },\n\t\t\t\tchainDir,\n\t\t\t\tisFirstProgress,\n\t\t\t\ttemplateHasPrevious ? undefined : prev,\n\t\t\t);\n\n\t\t\tlet stepTask = resolveOutputReferences(stepTemplate, outputs);\n\t\t\tstepTask = stepTask.replace(/\\{task\\}/g, originalTask);\n\t\t\tstepTask = stepTask.replace(/\\{previous\\}/g, prev);\n\t\t\tstepTask = stepTask.replace(/\\{chain_dir\\}/g, chainDir);\n\t\t\tconst cleanTask = stepTask;\n\t\t\tstepTask = prefix + stepTask + suffix;\n\n\t\t\tconst effectiveModel = resolveRequiredTierModel(seqStep.tier, availableModels, ctx.model?.provider);\n\n\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))\n\t\t\t\t: undefined;\n\t\t\tstepTask = injectSingleOutputInstruction(stepTask, outputPath, agentConfig);\n\t\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Chain step ${stepIndex + 1} (${seqStep.agent})`);\n\t\t\tif (validationError) {\n\t\t\t\treturn buildChainExecutionErrorResult(validationError, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t}\n\t\t\tconst maxSubagentDepth = resolveChildMaxSubagentDepth(params.maxSubagentDepth, agentConfig.maxSubagentDepth);\n\t\t\tconst childIndex = globalTaskIndex;\n\t\t\tconst interruptController = new AbortController();\n\t\t\tif (foregroundControl) {\n\t\t\t\tforegroundControl.currentAgent = seqStep.description || seqStep.agent;\n\t\t\t\tforegroundControl.currentChildId = seqStep.agent;\n\t\t\t\tforegroundControl.currentIndex = childIndex;\n\t\t\t\tforegroundControl.currentActivityState = undefined;\n\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t\tforegroundControl.interrupt = () => {\n\t\t\t\t\tif (interruptController.signal.aborted) return false;\n\t\t\t\t\tinterruptController.abort();\n\t\t\t\t\tforegroundControl.currentActivityState = undefined;\n\t\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst structuredRuntime = seqStep.outputSchema\n\t\t\t\t? createStructuredOutputRuntime(seqStep.outputSchema, path.join(chainDir, \"structured-output\"))\n\t\t\t\t: undefined;\n\t\t\tconst toolBudget = resolveChainToolBudget({ stepBudget: seqStep.toolBudget, runBudget: params.toolBudget, agentBudget: agentConfig?.toolBudget, configBudget: params.configToolBudget });\n\t\t\tif (toolBudget.error) return buildChainExecutionErrorResult(toolBudget.error, {\n\t\t\t\tresults,\n\t\t\t\tincludeProgress,\n\t\t\t\tallProgress,\n\t\t\t\tallArtifactPaths,\n\t\t\t\tartifactsDir: params.artifactsDir,\n\t\t\t\tchainAgents,\n\t\t\t\tchainSteps,\n\t\t\t\ttotalSteps,\n\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\trunId: params.runId,\n\t\t\t\toutputs,\n\t\t\t\tcurrentFlatIndex: globalTaskIndex,\n\t\t\t\tdynamicChildren,\n\t\t\t\tdynamicGroupStatuses,\n\t\t\t});\n\t\t\tconst r = await runSync(ctx.cwd, normalizeChildSpec({\n\t\t\t\ttask: stepTask,\n\t\t\t\tdescription: seqStep.description,\n\t\t\t\tpermissions: seqStep.permissions,\n\t\t\t\tmodel: effectiveModel ?? seqStep.model,\n\t\t\t\ttier: seqStep.tier,\n\t\t\t\tmodelSelection: captureModelSelection({ tier: seqStep.tier }),\n\t\t\t\tskill: seqStep.skill,\n\t\t\t\tcwd: seqStep.cwd,\n\t\t\t\toutput: seqStep.output,\n\t\t\t\toutputMode: seqStep.outputMode,\n\t\t\t\tacceptance: seqStep.acceptance,\n\t\t\t\ttoolBudget: seqStep.toolBudget,\n\t\t\t}, { parentMode: snapshotParentPermissionMode(ctx.sessionManager.getSessionId() ?? undefined), runId, index: childIndex }), {\n\t\t\t\tparentSessionId: ctx.sessionManager.getSessionId() ?? undefined,\n\t\t\t\tcwd: resolveChildCwd(cwd ?? ctx.cwd, seqStep.cwd),\n\t\t\t\tsignal,\n\t\t\t\tinterruptSignal: interruptController.signal,\n\t\t\t\tallowIntercomDetach: agentConfig.systemPrompt?.includes(INTERCOM_BRIDGE_MARKER) === true,\n\t\t\t\tintercomEvents,\n\t\t\t\trunId,\n\t\t\t\tindex: childIndex,\n\t\t\t\tsessionDir: sessionDirForIndex(childIndex),\n\t\t\t\tsessionFile: sessionFileForTask?.(seqStep.agent, childIndex, effectiveModel)\n\t\t\t\t\t?? sessionFileForIndex?.(childIndex),\n\t\t\t\tthinkingOverride: thinkingOverrideForTask?.(seqStep.agent, childIndex, effectiveModel),\n\t\t\t\tshare: shareEnabled,\n\t\t\t\tartifactsDir: artifactConfig.enabled ? artifactsDir : undefined,\n\t\t\t\tartifactConfig,\n\t\t\t\toutputPath,\n\t\t\t\toutputMode: behavior.outputMode,\n\t\t\t\tmaxSubagentDepth,\n\t\t\t\tcontrolConfig,\n\t\t\t\tonControlEvent,\n\t\t\t\tintercomSessionName: childIntercomTarget?.(seqStep.agent, childIndex),\n\t\t\t\torchestratorIntercomTarget,\n\t\t\t\tnestedRoute: params.nestedRoute,\n\t\t\t\tmodelOverride: effectiveModel,\n\t\t\t\tavailableModels,\n\t\t\t\tpreferredModelProvider: ctx.model?.provider,\n\t\t\t\tmodelScope,\n\t\t\t\tskills: behavior.skills === false ? [] : behavior.skills,\n\t\t\t\tstructuredOutput: structuredRuntime,\n\t\t\t\tacceptance: seqStep.acceptance,\n\t\t\t\tacceptanceContext: { mode: \"chain\" },\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\tonDetachedExit: onDetachedExit\n\t\t\t\t\t? (result) => onDetachedExit(childIndex, result)\n\t\t\t\t\t: undefined,\n\t\t\t\ttoolBudget: toolBudget.toolBudget,\n\t\t\t\tonUpdate: onUpdate\n\t\t\t\t\t? (p) => {\n\t\t\t\t\t\tconst stepResults = p.details?.results || [];\n\t\t\t\t\t\tconst stepProgress = p.details?.progress || [];\n\t\t\t\t\t\tif (foregroundControl && stepProgress.length > 0) {\n\t\t\t\t\t\t\tconst current = stepProgress[0];\n\t\t\t\t\t\t\tforegroundControl.currentAgent = seqStep.description || seqStep.agent;\n\t\t\t\t\t\t\tforegroundControl.currentChildId = seqStep.agent;\n\t\t\t\t\t\t\tforegroundControl.currentIndex = childIndex;\n\t\t\t\t\t\t\tforegroundControl.currentActivityState = current?.activityState;\n\t\t\t\t\t\t\tforegroundControl.lastActivityAt = current?.lastActivityAt;\n\t\t\t\t\t\t\tforegroundControl.currentTool = current?.currentTool;\n\t\t\t\t\t\t\tforegroundControl.currentToolStartedAt = current?.currentToolStartedAt;\n\t\t\t\t\t\t\tforegroundControl.currentPath = current?.currentPath;\n\t\t\t\t\t\t\tforegroundControl.turnCount = current?.turnCount;\n\t\t\t\t\t\t\tforegroundControl.tokens = current?.tokens;\n\t\t\t\t\t\t\tforegroundControl.toolCount = current?.toolCount;\n\t\t\t\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUpdate({\n\t\t\t\t\t\t\t...p,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\tresults: results.concat(stepResults),\n\t\t\t\t\t\t\t\tprogress: allProgress.concat(stepProgress),\n\t\t\t\t\t\t\t\tcontrolEvents: p.details?.controlEvents,\n\t\t\t\t\t\t\t\tchainAgents,\n\t\t\t\t\t\t\t\ttotalSteps,\n\t\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\t\toutputs,\n\t\t\t\t\t\t\t\tworkflowGraph: buildWorkflowGraphSnapshot({\n\t\t\t\t\t\t\t\t\trunId,\n\t\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\t\tsteps: chainSteps,\n\t\t\t\t\t\t\t\t\tresults: results.concat(stepResults),\n\t\t\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\t\t\tcurrentFlatIndex: childIndex,\n\t\t\t\t\t\t\t\t\tdynamicChildren,\n\t\t\t\t\t\t\t\t\tdynamicGroupStatuses,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tif (foregroundControl?.currentIndex === childIndex) {\n\t\t\t\tforegroundControl.interrupt = undefined;\n\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t}\n\t\t\trecordRun(seqStep.agent, cleanTask, r.exitCode, r.progressSummary?.durationMs ?? 0);\n\n\t\t\tglobalTaskIndex++;\n\t\t\tresults.push(r);\n\t\t\tif (r.progress) allProgress.push(r.progress);\n\t\t\tif (r.artifactPaths) allArtifactPaths.push(r.artifactPaths);\n\n\t\t\tif (r.interrupted) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain paused after interrupt at step ${stepIndex + 1} (${r.agent}). Waiting for explicit next action.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: childIndex })),\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (r.detached) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain detached for intercom coordination at step ${stepIndex + 1} (${r.agent}). Reply to the supervisor request first, then wait with subagent_wait({ id: \"${runId}\" }). Use subagent({ action: \"status\", id: \"${runId}\" }) to recover the result; do not resume or launch a replacement while it remains detached.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: childIndex })),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (r.exitCode !== 0) {\n\t\t\t\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"failed\", {\n\t\t\t\t\tindex: stepIndex,\n\t\t\t\t\terror: r.error || \"Chain failed\",\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: summary }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: childIndex })),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (behavior.output) {\n\t\t\t\ttry {\n\t\t\t\t\tconst expectedPath = path.isAbsolute(behavior.output)\n\t\t\t\t\t\t? behavior.output\n\t\t\t\t\t\t: path.join(chainDir, behavior.output);\n\t\t\t\t\tif (!fs.existsSync(expectedPath)) {\n\t\t\t\t\t\tconst dirFiles = fs.readdirSync(chainDir);\n\t\t\t\t\t\tconst mdFiles = dirFiles.filter((file) => file.endsWith(\".md\") && file !== \"progress.md\");\n\t\t\t\t\t\tconst warning = mdFiles.length > 0\n\t\t\t\t\t\t\t? `Agent wrote to different file(s): ${mdFiles.join(\", \")} instead of ${behavior.output}`\n\t\t\t\t\t\t\t: `Agent did not create expected output file: ${behavior.output}`;\n\t\t\t\t\t\tr.error = r.error ? `${r.error}\\n${warning}` : warning;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore validation errors; this diagnostic should not mask successful chain output.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (seqStep.as) outputs[seqStep.as] = outputEntryFromResult(r, stepIndex);\n\t\t\tprev = getSingleResultOutput(r);\n\t\t}\n\t}\n\n\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"completed\");\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: summary }],\n\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chain-execution.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAKhE,OAAO,EAcN,KAAK,SAAS,EAMd,MAAM,0BAA0B,CAAC;AAiBlC,OAAO,EACN,KAAK,aAAa,EAElB,KAAK,cAAc,EAEnB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAGrB,MAAM,uBAAuB,CAAC;AA4W/B,UAAU,oBAAoB;IAC7B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,GAAG,EAAE,gBAAgB,CAAC;IACtB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzD,mBAAmB,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACrG,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,kBAAkB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IAClI,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,qBAAqB,CAAC;IACrC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3E,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACrC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;KAC1B,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/D,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,kHAAkH;IAClH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,UAAU,oBAAoB;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2FAA2F;IAC3F,cAAc,CAAC,EAAE;QAChB,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA61B9F","sourcesContent":["// @ts-nocheck\n/**\n * Chain execution logic for subagent tool\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport type { ExtensionContext } from \"@ashx-j/lunr-dev\";\nimport type { ChildRuntimeConfig } from \"../../shared/types.ts\";\nimport { normalizeChildSpec } from \"../../shared/child-spec.ts\";\nimport { snapshotParentPermissionMode } from \"../../../../../core/subagent-permission-inherit.ts\";\nimport { ChainClarifyComponent, type ChainClarifyResult, type BehaviorOverride } from \"./chain-clarify.ts\";\nimport { toModelInfo, type ModelInfo } from \"../../shared/model-info.ts\";\nimport {\n\tresolveChainTemplates,\n\tcreateChainDir,\n\tremoveChainDir,\n\tresolveStepBehavior,\n\tresolveParallelBehaviors,\n\tbuildChainInstructions,\n\twriteInitialProgressFile,\n\tcreateParallelDirs,\n\tsuppressProgressForReadOnlyTask,\n\taggregateParallelOutputs,\n\tisDynamicParallelStep,\n\tisParallelStep,\n\ttype StepOverrides,\n\ttype ChainStep,\n\ttype ParallelStep,\n\ttype SequentialStep,\n\ttype ParallelTaskResult,\n\ttype ResolvedStepBehavior,\n\ttype ResolvedTemplates,\n} from \"../../shared/settings.ts\";\nimport { discoverAvailableSkills, normalizeSkillInput } from \"../../agents/skills.ts\";\nimport { INTERCOM_BRIDGE_MARKER } from \"../../intercom/intercom-bridge.ts\";\nimport { runSync } from \"./execution.ts\";\nimport { buildChainSummary } from \"../../shared/formatters.ts\";\nimport { compactForegroundDetails, getSingleResultOutput, mapConcurrent, resolveChildCwd, sumResultsCost, sumResultsUsage } from \"../../shared/utils.ts\";\nimport { DEFAULT_GLOBAL_CONCURRENCY_LIMIT, Semaphore } from \"../shared/parallel-utils.ts\";\nimport { recordRun } from \"../shared/run-history.ts\";\nimport {\n\tcleanupWorktrees,\n\tcreateWorktrees,\n\tdiffWorktrees,\n\tfindWorktreeTaskCwdConflict,\n\tformatWorktreeDiffSummary,\n\tformatWorktreeTaskCwdConflict,\n\ttype WorktreeSetup,\n} from \"../shared/worktree.ts\";\nimport {\n\ttype ActivityState,\n\ttype AgentProgress,\n\ttype ArtifactConfig,\n\ttype ArtifactPaths,\n\ttype ControlEvent,\n\ttype Details,\n\ttype IntercomEventBus,\n\ttype NestedRouteInfo,\n\ttype ResolvedControlConfig,\n\ttype ResolvedTurnBudget,\n\ttype ResolvedToolBudget,\n\ttype SingleResult,\n\ttype ToolBudgetConfig,\n\tMAX_CONCURRENCY,\n\tresolveChildMaxSubagentDepth,\n} from \"../../shared/types.ts\";\nimport { captureModelSelection, resolveExecutableChildModel } from \"../shared/model-fallback.ts\";\nimport type { ModelScopeConfig } from \"../shared/model-scope.ts\";\nimport { injectSingleOutputInstruction, validateFileOnlyOutputMode } from \"../shared/single-output.ts\";\nimport { buildWorkflowGraphSnapshot } from \"../shared/workflow-graph.ts\";\nimport { ChainOutputValidationError, outputEntryFromResult, resolveOutputReferences, validateChainOutputBindings } from \"../shared/chain-outputs.ts\";\nimport { createStructuredOutputRuntime } from \"../shared/structured-output.ts\";\nimport { collectDynamicResults, DynamicFanoutError, materializeDynamicParallelStep, validateDynamicCollection, type DynamicCollectedResult } from \"../shared/dynamic-fanout.ts\";\nimport { acceptanceFailureMessage, aggregateAcceptanceReport, evaluateAcceptance, resolveEffectiveAcceptance } from \"../shared/acceptance.ts\";\nimport type { ChainOutputMap } from \"../../shared/types.ts\";\nimport { validateToolBudgetConfig } from \"../shared/tool-budget.ts\";\n\ninterface ChainExecutionDetailsInput {\n\tresults: SingleResult[];\n\tincludeProgress?: boolean;\n\tallProgress: AgentProgress[];\n\tallArtifactPaths: ArtifactPaths[];\n\tartifactsDir: string;\n\tchainAgents: string[];\n\tchainSteps: ChainStep[];\n\ttotalSteps: number;\n\tcurrentStepIndex?: number;\n\trunId: string;\n\toutputs?: ChainOutputMap;\n\tcurrentFlatIndex?: number;\n\tdynamicChildren?: Record<number, Array<{ agent: string; label?: string; flatIndex: number; itemKey: string; outputName?: string; structured?: boolean; error?: string }>>;\n\tdynamicGroupStatuses?: Record<number, { status: \"pending\" | \"running\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\" | \"detached\"; error?: string; acceptance?: SingleResult[\"acceptance\"] }>;\n}\n\ninterface ParallelChainRunInput {\n\tstep: ParallelStep;\n\tparallelTemplates: string[];\n\tparallelBehaviors: ResolvedStepBehavior[];\n\tagents: ChildRuntimeConfig[];\n\tstepIndex: number;\n\tavailableModels: ModelInfo[];\n\tmodelScope?: ModelScopeConfig;\n\tchainDir: string;\n\tprev: string;\n\toriginalTask: string;\n\tctx: ExtensionContext;\n\tintercomEvents?: IntercomEventBus;\n\tcwd?: string;\n\trunId: string;\n\tglobalTaskIndex: number;\n\tsessionDirForIndex: (idx?: number) => string | undefined;\n\tsessionFileForIndex?: (idx?: number) => string | undefined;\n\tsessionFileForTask?: (agentName: string, idx?: number, modelOverride?: string) => string | undefined;\n\tthinkingOverrideForTask?: (agentName: string, idx?: number, modelOverride?: string) => ChildRuntimeConfig[\"thinking\"] | undefined;\n\tshareEnabled: boolean;\n\tartifactConfig: ArtifactConfig;\n\tartifactsDir: string;\n\tsignal?: AbortSignal;\n\tonUpdate?: (r: AgentToolResult<Details>) => void;\n\tonControlEvent?: (event: ControlEvent) => void;\n\tcontrolConfig: ResolvedControlConfig;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\torchestratorIntercomTarget?: string;\n\tforegroundControl?: {\n\t\tupdatedAt: number;\n\t\tcurrentAgent?: string;\n\t\tcurrentChildId?: string;\n\t\tcurrentIndex?: number;\n\t\tcurrentActivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\tturnCount?: number;\n\t\ttokens?: number;\n\t\ttoolCount?: number;\n\t\tinterrupt?: () => boolean;\n\t};\n\tresults: SingleResult[];\n\tallProgress: AgentProgress[];\n\toutputs: ChainOutputMap;\n\tchainAgents: string[];\n\tchainSteps: ChainStep[];\n\ttotalSteps: number;\n\tdynamicChildren?: ChainExecutionDetailsInput[\"dynamicChildren\"];\n\tdynamicGroupStatuses?: ChainExecutionDetailsInput[\"dynamicGroupStatuses\"];\n\tworktreeSetup?: WorktreeSetup;\n\tmaxSubagentDepth: number;\n\tnestedRoute?: NestedRouteInfo;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\tonDetachedExit?: (index: number, result: SingleResult) => void;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ToolBudgetConfig;\n\tglobalSemaphore?: Semaphore;\n\tdynamic?: boolean;\n}\n\nfunction buildChainExecutionDetails(input: ChainExecutionDetailsInput): Details {\n\treturn compactForegroundDetails({\n\t\tmode: \"chain\",\n\t\tresults: input.results,\n\t\tprogress: input.includeProgress ? input.allProgress : undefined,\n\t\tartifacts: input.allArtifactPaths.length ? { dir: input.artifactsDir, files: input.allArtifactPaths } : undefined,\n\t\tchainAgents: input.chainAgents,\n\t\ttotalSteps: input.totalSteps,\n\t\tcurrentStepIndex: input.currentStepIndex,\n\t\toutputs: input.outputs,\n\t\ttotalChildUsage: sumResultsUsage(input.results),\n\t\ttotalCost: sumResultsCost(input.results),\n\t\tworkflowGraph: buildWorkflowGraphSnapshot({\n\t\t\trunId: input.runId,\n\t\t\tmode: \"chain\",\n\t\t\tsteps: input.chainSteps,\n\t\t\tresults: input.results,\n\t\t\tcurrentStepIndex: input.currentStepIndex,\n\t\t\tcurrentFlatIndex: input.currentFlatIndex,\n\t\t\tdynamicChildren: input.dynamicChildren,\n\t\t\tdynamicGroupStatuses: input.dynamicGroupStatuses,\n\t\t}),\n\t});\n}\n\nfunction buildChainExecutionErrorResult(message: string, input: ChainExecutionDetailsInput): ChainExecutionResult {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tisError: true,\n\t\tdetails: buildChainExecutionDetails(input),\n\t};\n}\n\nfunction ensureParallelProgressFile(\n\tchainDir: string,\n\tprogressCreated: boolean,\n\tparallelBehaviors: ResolvedStepBehavior[],\n): boolean {\n\tif (progressCreated || !parallelBehaviors.some((behavior) => behavior.progress)) {\n\t\treturn progressCreated;\n\t}\n\twriteInitialProgressFile(chainDir);\n\treturn true;\n}\n\nfunction appendParallelWorktreeSummary(\n\toutput: string,\n\tworktreeSetup: WorktreeSetup | undefined,\n\tdiffsDir: string,\n\tagents: string[],\n): string {\n\tif (!worktreeSetup) return output;\n\tconst diffs = diffWorktrees(worktreeSetup, agents, diffsDir);\n\tconst diffSummary = formatWorktreeDiffSummary(diffs);\n\tif (!diffSummary) return output;\n\treturn `${output}\\n\\n${diffSummary}`;\n}\n\nfunction resolveChainToolBudget(input: { stepBudget?: ToolBudgetConfig; runBudget?: ResolvedToolBudget; agentBudget?: ToolBudgetConfig; configBudget?: ToolBudgetConfig }): { toolBudget?: ResolvedToolBudget; error?: string } {\n\tif (input.stepBudget !== undefined) {\n\t\tconst resolved = validateToolBudgetConfig(input.stepBudget, \"toolBudget\");\n\t\treturn { toolBudget: resolved.budget, error: resolved.error };\n\t}\n\tif (input.runBudget !== undefined) return { toolBudget: input.runBudget };\n\tif (input.agentBudget !== undefined) {\n\t\tconst resolved = validateToolBudgetConfig(input.agentBudget, \"agent.toolBudget\");\n\t\treturn { toolBudget: resolved.budget, error: resolved.error };\n\t}\n\tconst resolved = validateToolBudgetConfig(input.configBudget, \"config.toolBudget\");\n\treturn { toolBudget: resolved.budget, error: resolved.error };\n}\n\nasync function runParallelChainTasks(input: ParallelChainRunInput): Promise<SingleResult[]> {\n\tconst concurrency = input.step.concurrency ?? MAX_CONCURRENCY;\n\tconst failFast = input.step.failFast ?? false;\n\tlet aborted = false;\n\tconst effectiveModels = input.step.parallel.map((task) => {\n\t\treturn resolveExecutableChildModel({\n\t\t\tmodel: task.model,\n\t\t\ttier: task.tier,\n\t\t\tthinking: task.thinking,\n\t\t\tavailableModels: input.availableModels,\n\t\t\tpreferredProvider: input.ctx.model?.provider,\n\t\t});\n\t});\n\tfor (let taskIndex = 0; taskIndex < input.step.parallel.length; taskIndex++) {\n\t\tconst task = input.step.parallel[taskIndex]!;\n\t\tinput.sessionFileForTask?.(task.agent, input.globalTaskIndex + taskIndex, effectiveModels[taskIndex]);\n\t}\n\n\tconst parallelResults = await mapConcurrent(\n\t\tinput.step.parallel,\n\t\tconcurrency,\n\t\tasync (task, taskIndex) => {\n\t\t\tif (aborted && failFast) {\n\t\t\t\treturn {\n\t\t\t\t\tagent: task.agent,\n\t\t\t\t\ttask: \"(skipped)\",\n\t\t\t\t\texitCode: -1,\n\t\t\t\t\tmessages: [],\n\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },\n\t\t\t\t\terror: \"Skipped due to fail-fast\",\n\t\t\t\t} as SingleResult;\n\t\t\t}\n\n\t\t\tconst taskTemplate = input.parallelTemplates[taskIndex] ?? \"{previous}\";\n\t\t\tconst behavior = suppressProgressForReadOnlyTask(input.parallelBehaviors[taskIndex]!, taskTemplate, input.originalTask);\n\t\t\tconst taskChildConfig = input.agents.find((child) => child.name === task.agent);\n\t\t\tconst templateHasPrevious = taskTemplate.includes(\"{previous}\");\n\t\t\tconst { prefix, suffix } = buildChainInstructions(\n\t\t\t\t{ ...behavior, output: false },\n\t\t\t\tinput.chainDir,\n\t\t\t\tfalse,\n\t\t\t\ttemplateHasPrevious ? undefined : input.prev,\n\t\t\t);\n\n\t\t\tlet taskStr = resolveOutputReferences(taskTemplate, input.outputs);\n\t\t\ttaskStr = taskStr.replace(/\\{task\\}/g, input.originalTask);\n\t\t\ttaskStr = taskStr.replace(/\\{previous\\}/g, input.prev);\n\t\t\ttaskStr = taskStr.replace(/\\{chain_dir\\}/g, input.chainDir);\n\t\t\tconst cleanTask = taskStr;\n\t\t\ttaskStr = prefix + taskStr + suffix;\n\n\t\t\tconst effectiveModel = effectiveModels[taskIndex];\n\t\t\tconst maxSubagentDepth = resolveChildMaxSubagentDepth(input.maxSubagentDepth, taskChildConfig?.maxSubagentDepth);\n\t\t\tconst toolBudget = resolveChainToolBudget({ stepBudget: task.toolBudget, runBudget: input.toolBudget, agentBudget: taskChildConfig?.toolBudget, configBudget: input.configToolBudget });\n\t\t\tif (toolBudget.error) throw new Error(toolBudget.error);\n\n\t\t\tconst taskCwd = input.worktreeSetup\n\t\t\t\t? input.worktreeSetup.worktrees[taskIndex]!.agentCwd\n\t\t\t\t: resolveChildCwd(input.cwd ?? input.ctx.cwd, task.cwd);\n\n\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(input.chainDir, behavior.output))\n\t\t\t\t: undefined;\n\t\t\ttaskStr = injectSingleOutputInstruction(taskStr, outputPath, taskChildConfig);\n\t\t\tconst interruptController = new AbortController();\n\t\t\tif (input.foregroundControl) {\n\t\t\t\tinput.foregroundControl.currentAgent = task.description || task.agent;\n\t\t\t\tinput.foregroundControl.currentChildId = task.agent;\n\t\t\t\tinput.foregroundControl.currentIndex = input.globalTaskIndex + taskIndex;\n\t\t\t\tinput.foregroundControl.currentActivityState = undefined;\n\t\t\t\tinput.foregroundControl.updatedAt = Date.now();\n\t\t\t\tinput.foregroundControl.interrupt = () => {\n\t\t\t\t\tif (interruptController.signal.aborted) return false;\n\t\t\t\t\tinterruptController.abort();\n\t\t\t\t\tinput.foregroundControl!.currentActivityState = undefined;\n\t\t\t\t\tinput.foregroundControl!.updatedAt = Date.now();\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst structuredRuntime = task.outputSchema\n\t\t\t\t? createStructuredOutputRuntime(task.outputSchema, path.join(input.chainDir, \"structured-output\"))\n\t\t\t\t: undefined;\n\t\t\tconst result = await runSync(input.ctx.cwd, normalizeChildSpec({\n\t\t\t\ttask: taskStr,\n\t\t\t\tdescription: task.description,\n\t\t\t\tpermissions: task.permissions,\n\t\t\t\tmodel: task.model,\n\t\t\t\ttier: task.tier,\n\t\t\t\tthinking: task.thinking,\n\t\t\t\tmodelSelection: captureModelSelection({ model: task.model, tier: task.tier }),\n\t\t\t\tskill: task.skill,\n\t\t\t\tcwd: taskCwd,\n\t\t\t\toutput: task.output,\n\t\t\t\toutputMode: task.outputMode,\n\t\t\t\tacceptance: task.acceptance,\n\t\t\t\ttoolBudget: task.toolBudget,\n\t\t\t}, { parentMode: snapshotParentPermissionMode(input.ctx.sessionManager.getSessionId() ?? undefined), runId: input.runId, index: input.globalTaskIndex + taskIndex }), {\n\t\t\t\tparentSessionId: input.ctx.sessionManager.getSessionId() ?? undefined,\n\t\t\t\tcwd: taskCwd,\n\t\t\t\tsignal: input.signal,\n\t\t\t\tinterruptSignal: interruptController.signal,\n\t\t\t\tallowIntercomDetach: taskChildConfig?.systemPrompt?.includes(INTERCOM_BRIDGE_MARKER) === true,\n\t\t\t\tintercomEvents: input.intercomEvents,\n\t\t\t\trunId: input.runId,\n\t\t\t\tindex: input.globalTaskIndex + taskIndex,\n\t\t\t\tsessionDir: input.sessionDirForIndex(input.globalTaskIndex + taskIndex),\n\t\t\t\tsessionFile: input.sessionFileForTask?.(task.agent, input.globalTaskIndex + taskIndex, effectiveModel)\n\t\t\t\t\t?? input.sessionFileForIndex?.(input.globalTaskIndex + taskIndex),\n\t\t\t\tthinkingOverride: input.thinkingOverrideForTask?.(task.agent, input.globalTaskIndex + taskIndex, effectiveModel),\n\t\t\t\tshare: input.shareEnabled,\n\t\t\t\tartifactsDir: input.artifactConfig.enabled ? input.artifactsDir : undefined,\n\t\t\t\tartifactConfig: input.artifactConfig,\n\t\t\t\toutputPath,\n\t\t\t\toutputMode: behavior.outputMode,\n\t\t\t\tmaxSubagentDepth,\n\t\t\t\tcontrolConfig: input.controlConfig,\n\t\t\t\tonControlEvent: input.onControlEvent,\n\t\t\t\tintercomSessionName: input.childIntercomTarget?.(task.agent, input.globalTaskIndex + taskIndex),\n\t\t\t\torchestratorIntercomTarget: input.orchestratorIntercomTarget,\n\t\t\t\tnestedRoute: input.nestedRoute,\n\t\t\t\tmodelOverride: effectiveModel,\n\t\t\t\tavailableModels: input.availableModels,\n\t\t\t\tpreferredModelProvider: input.ctx.model?.provider,\n\t\t\t\tmodelScope: input.modelScope,\n\t\t\t\tskills: behavior.skills === false ? [] : behavior.skills,\n\t\t\t\tstructuredOutput: structuredRuntime,\n\t\t\t\tacceptance: task.acceptance,\n\t\t\t\tacceptanceContext: { mode: \"chain\", dynamic: input.dynamic && task.acceptance === undefined },\n\t\t\t\ttimeoutMs: input.timeoutMs,\n\t\t\t\tdeadlineAt: input.deadlineAt,\n\t\t\t\tturnBudget: input.turnBudget,\n\t\t\t\tonDetachedExit: input.onDetachedExit\n\t\t\t\t\t? (result) => input.onDetachedExit?.(input.globalTaskIndex + taskIndex, result)\n\t\t\t\t\t: undefined,\n\t\t\t\ttoolBudget: toolBudget.toolBudget,\n\t\t\t\tonUpdate: input.onUpdate\n\t\t\t\t\t? (progressUpdate) => {\n\t\t\t\t\t\tconst stepResults = progressUpdate.details?.results || [];\n\t\t\t\t\t\tconst stepProgress = progressUpdate.details?.progress || [];\n\t\t\t\t\t\tif (input.foregroundControl && stepProgress.length > 0) {\n\t\t\t\t\t\t\tconst current = stepProgress[0];\n\t\t\t\t\t\t\tinput.foregroundControl.currentAgent = task.description || task.agent;\n\t\t\t\t\t\t\tinput.foregroundControl.currentChildId = task.agent;\n\t\t\t\t\t\t\tinput.foregroundControl.currentIndex = input.globalTaskIndex + taskIndex;\n\t\t\t\t\t\t\tinput.foregroundControl.currentActivityState = current?.activityState;\n\t\t\t\t\t\t\tinput.foregroundControl.lastActivityAt = current?.lastActivityAt;\n\t\t\t\t\t\t\tinput.foregroundControl.currentTool = current?.currentTool;\n\t\t\t\t\t\t\tinput.foregroundControl.currentToolStartedAt = current?.currentToolStartedAt;\n\t\t\t\t\t\t\tinput.foregroundControl.currentPath = current?.currentPath;\n\t\t\t\t\t\t\tinput.foregroundControl.turnCount = current?.turnCount;\n\t\t\t\t\t\t\tinput.foregroundControl.tokens = current?.tokens;\n\t\t\t\t\t\t\tinput.foregroundControl.toolCount = current?.toolCount;\n\t\t\t\t\t\t\tinput.foregroundControl.updatedAt = Date.now();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinput.onUpdate?.({\n\t\t\t\t\t\t\t...progressUpdate,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\tresults: input.results.concat(stepResults),\n\t\t\t\t\t\t\t\tprogress: input.allProgress.concat(stepProgress),\n\t\t\t\t\t\t\t\tcontrolEvents: progressUpdate.details?.controlEvents,\n\t\t\t\t\t\t\t\tchainAgents: input.chainAgents,\n\t\t\t\t\t\t\t\ttotalSteps: input.totalSteps,\n\t\t\t\t\t\t\t\tcurrentStepIndex: input.stepIndex,\n\t\t\t\t\t\t\t\toutputs: input.outputs,\n\t\t\t\t\t\t\t\tworkflowGraph: buildWorkflowGraphSnapshot({\n\t\t\t\t\t\t\t\t\trunId: input.runId,\n\t\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\t\tsteps: input.chainSteps,\n\t\t\t\t\t\t\t\t\tresults: input.results.concat(stepResults),\n\t\t\t\t\t\t\t\t\tcurrentStepIndex: input.stepIndex,\n\t\t\t\t\t\t\t\t\tcurrentFlatIndex: input.globalTaskIndex + taskIndex,\n\t\t\t\t\t\t\t\t\tdynamicChildren: input.dynamicChildren,\n\t\t\t\t\t\t\t\t\tdynamicGroupStatuses: input.dynamicGroupStatuses,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tif (input.foregroundControl?.currentIndex === input.globalTaskIndex + taskIndex) {\n\t\t\t\tinput.foregroundControl.interrupt = undefined;\n\t\t\t\tinput.foregroundControl.updatedAt = Date.now();\n\t\t\t}\n\n\t\t\tif (result.exitCode !== 0 && failFast) {\n\t\t\t\taborted = true;\n\t\t\t}\n\t\t\trecordRun(task.agent, cleanTask, result.exitCode, result.progressSummary?.durationMs ?? 0);\n\t\t\treturn result;\n\t\t},\n\t\tinput.globalSemaphore,\n\t);\n\n\treturn parallelResults;\n}\n\ninterface ChainExecutionParams {\n\tchain: ChainStep[];\n\ttask?: string;\n\tagents: ChildRuntimeConfig[];\n\tctx: ExtensionContext;\n\tintercomEvents?: IntercomEventBus;\n\tsignal?: AbortSignal;\n\trunId: string;\n\tcwd?: string;\n\tshareEnabled: boolean;\n\tsessionDirForIndex: (idx?: number) => string | undefined;\n\tsessionFileForIndex?: (idx?: number) => string | undefined;\n\tsessionFileForTask?: (agentName: string, idx?: number, modelOverride?: string) => string | undefined;\n\tthinkingOverrideForTask?: (agentName: string, idx?: number, modelOverride?: string) => ChildRuntimeConfig[\"thinking\"] | undefined;\n\tartifactsDir: string;\n\tartifactConfig: ArtifactConfig;\n\tincludeProgress?: boolean;\n\tclarify?: boolean;\n\tonUpdate?: (r: AgentToolResult<Details>) => void;\n\tonControlEvent?: (event: ControlEvent) => void;\n\tcontrolConfig: ResolvedControlConfig;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\torchestratorIntercomTarget?: string;\n\tforegroundControl?: {\n\t\tupdatedAt: number;\n\t\tcurrentAgent?: string;\n\t\tcurrentChildId?: string;\n\t\tcurrentIndex?: number;\n\t\tcurrentActivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\tturnCount?: number;\n\t\ttokens?: number;\n\t\ttoolCount?: number;\n\t\tinterrupt?: () => boolean;\n\t};\n\tchainSkills?: string[];\n\tchainDir?: string;\n\tdynamicFanoutMaxItems?: number;\n\tmaxSubagentDepth: number;\n\tnestedRoute?: NestedRouteInfo;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\tonDetachedExit?: (index: number, result: SingleResult) => void;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ToolBudgetConfig;\n\t/** Global cap on simultaneously-running tasks within this chain. Defaults to DEFAULT_GLOBAL_CONCURRENCY_LIMIT. */\n\tglobalConcurrencyLimit?: number;\n}\n\ninterface ChainExecutionResult {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Details;\n\tisError?: boolean;\n\t/** User requested async execution via TUI - caller should dispatch to executeAsyncChain */\n\trequestedAsync?: {\n\t\tchain: ChainStep[];\n\t\tchainSkills: string[];\n\t};\n}\n\n/**\n * Execute a chain of subagent steps\n */\nexport async function executeChain(params: ChainExecutionParams): Promise<ChainExecutionResult> {\n\tconst {\n\t\tchain: chainSteps,\n\t\tagents,\n\t\tctx,\n\t\tsignal,\n\t\trunId,\n\t\tcwd,\n\t\tshareEnabled,\n\t\tsessionDirForIndex,\n\t\tsessionFileForIndex,\n\t\tsessionFileForTask,\n\t\tthinkingOverrideForTask,\n\t\tartifactsDir,\n\t\tartifactConfig,\n\t\tincludeProgress,\n\t\tclarify,\n\t\tonUpdate,\n\t\tonControlEvent,\n\t\tcontrolConfig,\n\t\tonDetachedExit,\n\t\tchildIntercomTarget,\n\t\torchestratorIntercomTarget,\n\t\tforegroundControl,\n\t\tintercomEvents,\n\t\tchainSkills: chainSkillsParam,\n\t\tchainDir: chainDirBase,\n\t\tmodelScope,\n\t} = params;\n\tconst chainSkills = chainSkillsParam ?? [];\n\n\tconst results: SingleResult[] = [];\n\tconst outputs: ChainOutputMap = {};\n\tconst dynamicChildren: ChainExecutionDetailsInput[\"dynamicChildren\"] = {};\n\tconst dynamicGroupStatuses: ChainExecutionDetailsInput[\"dynamicGroupStatuses\"] = {};\n\tconst allProgress: AgentProgress[] = [];\n\tconst allArtifactPaths: ArtifactPaths[] = [];\n\n\tconst chainAgents: string[] = chainSteps.map((step) =>\n\t\tisParallelStep(step)\n\t\t\t? `[${step.parallel.map((t) => t.description || t.label || t.agent || \"child\").join(\"+\")}]`\n\t\t\t: isDynamicParallelStep(step)\n\t\t\t\t? `expand:${step.parallel.description || step.parallel.label || step.parallel.agent || \"child\"}`\n\t\t\t: ((step as SequentialStep).description || (step as SequentialStep).label || (step as SequentialStep).agent || \"child\"),\n\t);\n\tconst totalSteps = chainSteps.length;\n\n\tconst makeDetailsInput = (overrides: Pick<Partial<ChainExecutionDetailsInput>, \"currentStepIndex\" | \"currentFlatIndex\"> = {}): ChainExecutionDetailsInput => ({\n\t\tresults,\n\t\t...(includeProgress !== undefined ? { includeProgress } : {}),\n\t\tallProgress,\n\t\tallArtifactPaths,\n\t\tartifactsDir,\n\t\tchainAgents,\n\t\tchainSteps,\n\t\ttotalSteps,\n\t\trunId,\n\t\toutputs,\n\t\tdynamicChildren,\n\t\tdynamicGroupStatuses,\n\t\t...overrides,\n\t});\n\n\tconst firstStep = chainSteps[0]!;\n\tconst originalTask = params.task\n\t\t?? (isParallelStep(firstStep)\n\t\t\t? firstStep.parallel[0]!.task!\n\t\t\t: isDynamicParallelStep(firstStep)\n\t\t\t\t? firstStep.parallel.task!\n\t\t\t\t: (firstStep as SequentialStep).task!);\n\ttry {\n\t\tvalidateChainOutputBindings(chainSteps, { maxItems: params.dynamicFanoutMaxItems });\n\t} catch (error) {\n\t\tif (error instanceof ChainOutputValidationError) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: error.message }],\n\t\t\t\tisError: true,\n\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t\t\t};\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst chainDir = createChainDir(runId, chainDirBase);\n\tconst hasParallelSteps = chainSteps.some((step) => isParallelStep(step) || isDynamicParallelStep(step));\n\tlet templates: ResolvedTemplates = resolveChainTemplates(chainSteps);\n\tconst shouldClarify = clarify === true && ctx.hasUI && !hasParallelSteps;\n\tlet tuiBehaviorOverrides: (BehaviorOverride | undefined)[] | undefined;\n\tconst availableModels: ModelInfo[] = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst availableSkills = discoverAvailableSkills(cwd ?? ctx.cwd);\n\n\tif (shouldClarify) {\n\t\tconst seqSteps = chainSteps as SequentialStep[];\n\t\tconst agentConfigs: ChildRuntimeConfig[] = [];\n\t\tfor (const step of seqSteps) {\n\t\t\tconst config = agents.find((a) => a.name === step.agent);\n\t\t\tif (!config) {\n\t\t\t\tremoveChainDir(chainDir);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Unknown agent: ${step.agent}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: seqSteps.indexOf(step) })),\n\t\t\t\t};\n\t\t\t}\n\t\t\tagentConfigs.push(config);\n\t\t}\n\n\t\tconst stepOverrides: StepOverrides[] = seqSteps.map((step) => ({\n\t\t\toutput: step.output,\n\t\t\toutputMode: step.outputMode,\n\t\t\treads: step.reads,\n\t\t\tprogress: step.progress,\n\t\t\tskills: normalizeSkillInput(step.skill),\n\t\t\tmodel: step.model,\n\t\t}));\n\n\t\tconst resolvedBehaviors = agentConfigs.map((_config, i) =>\n\t\t\tresolveStepBehavior(stepOverrides[i]!, chainSkills),\n\t\t);\n\t\tconst flatTemplates = templates as string[];\n\n\t\tconst result = await ctx.ui.custom<ChainClarifyResult>(\n\t\t\t(tui, theme, _kb, done) =>\n\t\t\t\tnew ChainClarifyComponent(\n\t\t\t\t\ttui,\n\t\t\t\t\ttheme,\n\t\t\t\t\tagentConfigs,\n\t\t\t\t\tflatTemplates,\n\t\t\t\t\toriginalTask,\n\t\t\t\t\tchainDir,\n\t\t\t\t\tresolvedBehaviors,\n\t\t\t\t\tavailableModels,\n\t\t\t\t\tctx.model?.provider,\n\t\t\t\t\tavailableSkills,\n\t\t\t\t\tdone,\n\t\t\t\t),\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 84, maxHeight: \"80%\" },\n\t\t\t},\n\t\t);\n\n\t\tif (!result || !result.confirmed) {\n\t\t\tremoveChainDir(chainDir);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: \"Chain cancelled\" }],\n\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t\t\t};\n\t\t}\n\n\t\tif (result.runInBackground) {\n\t\t\tremoveChainDir(chainDir);\n\t\t\tconst updatedChain: ChainStep[] = chainSteps.map((step, i) => {\n\t\t\t\tif (isParallelStep(step)) return step;\n\t\t\t\tconst override = result.behaviorOverrides[i];\n\t\t\t\treturn {\n\t\t\t\t\t...step,\n\t\t\t\t\ttask: result.templates[i]!,\n\t\t\t\t\t...(override?.output !== undefined ? { output: override.output } : {}),\n\t\t\t\t\t...(\"outputMode\" in step && step.outputMode !== undefined ? { outputMode: step.outputMode } : {}),\n\t\t\t\t\t...(override?.reads !== undefined ? { reads: override.reads } : {}),\n\t\t\t\t\t...(override?.progress !== undefined ? { progress: override.progress } : {}),\n\t\t\t\t\t...(override?.skills !== undefined ? { skill: override.skills } : {}),\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: \"Launching in background...\" }],\n\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t\t\t\trequestedAsync: { chain: updatedChain, chainSkills },\n\t\t\t};\n\t\t}\n\n\t\ttemplates = result.templates;\n\t\ttuiBehaviorOverrides = result.behaviorOverrides;\n\t}\n\n\tconst deadlineAt = params.deadlineAt ?? (params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined);\n\tconst globalSemaphore = new Semaphore(params.globalConcurrencyLimit ?? DEFAULT_GLOBAL_CONCURRENCY_LIMIT);\n\tlet prev = \"\";\n\tlet globalTaskIndex = 0;\n\tlet progressCreated = false;\n\n\tfor (let stepIndex = 0; stepIndex < chainSteps.length; stepIndex++) {\n\t\tconst step = chainSteps[stepIndex]!;\n\t\tconst stepTemplates = templates[stepIndex]!;\n\n\t\tif (isParallelStep(step)) {\n\t\t\tconst parallelTemplates = stepTemplates as string[];\n\t\t\tconst parallelCwd = resolveChildCwd(cwd ?? ctx.cwd, step.cwd);\n\t\t\tlet worktreeSetup: WorktreeSetup | undefined;\n\t\t\tif (step.worktree) {\n\t\t\t\tconst worktreeTaskCwdConflict = findWorktreeTaskCwdConflict(step.parallel, parallelCwd);\n\t\t\t\tif (worktreeTaskCwdConflict) {\n\t\t\t\t\treturn buildChainExecutionErrorResult(\n\t\t\t\t\t\t`parallel chain step ${stepIndex + 1}: ${formatWorktreeTaskCwdConflict(worktreeTaskCwdConflict, parallelCwd)}`,\n\t\t\t\t\t\tmakeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tworktreeSetup = createWorktrees(parallelCwd, `${runId}-s${stepIndex}`, step.parallel.length, {\n\t\t\t\t\t\tagents: step.parallel.map((task) => task.agent),\n\t\t\t\t\t\tsetupHook: params.worktreeSetupHook\n\t\t\t\t\t\t\t? { hookPath: params.worktreeSetupHook, timeoutMs: params.worktreeSetupHookTimeoutMs }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tbaseDir: params.worktreeBaseDir,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst agentNames = step.parallel.map((task) => task.agent);\n\t\t\t\tconst parallelBehaviors = resolveParallelBehaviors(step.parallel, stepIndex, chainSkills)\n\t\t\t\t\t.map((behavior, taskIndex) => suppressProgressForReadOnlyTask(behavior, parallelTemplates[taskIndex] ?? step.parallel[taskIndex]?.task, originalTask));\n\t\t\t\tfor (let taskIndex = 0; taskIndex < step.parallel.length; taskIndex++) {\n\t\t\t\t\tconst behavior = parallelBehaviors[taskIndex]!;\n\t\t\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Parallel chain step ${stepIndex + 1} task ${taskIndex + 1} (${step.parallel[taskIndex]!.agent})`);\n\t\t\t\t\tif (validationError) return buildChainExecutionErrorResult(validationError, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex + taskIndex }));\n\t\t\t\t}\n\t\t\t\tprogressCreated = ensureParallelProgressFile(chainDir, progressCreated, parallelBehaviors);\n\t\t\t\tcreateParallelDirs(chainDir, stepIndex, step.parallel.length, agentNames);\n\n\t\t\t\tconst parallelResults = await runParallelChainTasks({\n\t\t\t\t\tstep,\n\t\t\t\t\tparallelTemplates,\n\t\t\t\t\tparallelBehaviors,\n\t\t\t\t\tagents,\n\t\t\t\t\tstepIndex,\n\t\t\t\t\tavailableModels,\n\t\t\t\t\tmodelScope,\n\t\t\t\t\tchainDir,\n\t\t\t\t\tprev,\n\t\t\t\t\toriginalTask,\n\t\t\t\t\tctx,\n\t\t\t\t\tintercomEvents,\n\t\t\t\t\tcwd,\n\t\t\t\t\trunId,\n\t\t\t\t\tglobalTaskIndex,\n\t\t\t\t\tsessionDirForIndex,\n\t\t\t\t\tsessionFileForIndex,\n\t\t\t\t\tsessionFileForTask,\n\t\t\t\t\tthinkingOverrideForTask,\n\t\t\t\t\tshareEnabled,\n\t\t\t\t\tartifactConfig,\n\t\t\t\t\tartifactsDir,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tresults,\n\t\t\t\t\tallProgress,\n\t\t\t\t\toutputs,\n\t\t\t\t\tchainAgents,\n\t\t\t\t\tchainSteps,\n\t\t\t\t\ttotalSteps,\n\t\t\t\t\tdynamicChildren,\n\t\t\t\t\tdynamicGroupStatuses,\n\t\t\t\t\tcontrolConfig,\n\t\t\t\t\tonControlEvent,\n\t\t\t\t\tchildIntercomTarget,\n\t\t\t\t\torchestratorIntercomTarget,\n\t\t\t\t\tforegroundControl,\n\t\t\t\t\tnestedRoute: params.nestedRoute,\n\t\t\t\t\tworktreeSetup,\n\t\t\t\t\tmaxSubagentDepth: params.maxSubagentDepth,\n\t\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\t\tdeadlineAt,\n\t\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\t\tonDetachedExit,\n\t\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\t\tconfigToolBudget: params.configToolBudget,\n\t\t\t\t\tglobalSemaphore,\n\t\t\t\t});\n\t\t\t\tglobalTaskIndex += step.parallel.length;\n\n\t\t\t\tfor (const result of parallelResults) {\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\tif (result.progress) allProgress.push(result.progress);\n\t\t\t\t\tif (result.artifactPaths) allArtifactPaths.push(result.artifactPaths);\n\t\t\t\t}\n\t\t\t\tconst interruptedIndexInStep = parallelResults.findIndex((result) => result.interrupted);\n\t\t\t\tconst interrupted = interruptedIndexInStep >= 0 ? parallelResults[interruptedIndexInStep] : undefined;\n\t\t\t\tif (interrupted) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain paused after interrupt at step ${stepIndex + 1} (${interrupted.agent}). Waiting for explicit next action.` }],\n\t\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\tcurrentFlatIndex: globalTaskIndex - step.parallel.length + interruptedIndexInStep,\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst detachedIndexInStep = parallelResults.findIndex((result) => result.detached);\n\t\t\t\tconst detached = detachedIndexInStep >= 0 ? parallelResults[detachedIndexInStep] : undefined;\n\t\t\t\tif (detached) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain detached for intercom coordination at step ${stepIndex + 1} (${detached.agent}). Reply to the supervisor request first, then wait with subagent_wait({ id: \"${runId}\" }). Use subagent({ action: \"status\", id: \"${runId}\" }) to recover the result; do not resume or launch a replacement while it remains detached.` }],\n\t\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\tcurrentFlatIndex: globalTaskIndex - step.parallel.length + detachedIndexInStep,\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst failures = parallelResults\n\t\t\t\t\t.map((result, originalIndex) => ({ ...result, originalIndex }))\n\t\t\t\t\t.filter((result) => result.exitCode !== 0 && result.exitCode !== -1);\n\t\t\t\tif (failures.length > 0) {\n\t\t\t\t\tconst failureSummary = failures\n\t\t\t\t\t\t.map((failure) => `- Task ${failure.originalIndex + 1} (${failure.agent}): ${failure.error || \"failed\"}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tconst errorMsg = `Parallel step ${stepIndex + 1} failed:\\n${failureSummary}`;\n\t\t\t\t\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"failed\", {\n\t\t\t\t\t\tindex: stepIndex,\n\t\t\t\t\t\terror: errorMsg,\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: summary }],\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\tcurrentFlatIndex: globalTaskIndex - step.parallel.length + failures[0]!.originalIndex,\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfor (let taskIndex = 0; taskIndex < parallelResults.length; taskIndex++) {\n\t\t\t\t\tconst outputName = step.parallel[taskIndex]?.as;\n\t\t\t\t\tif (outputName) outputs[outputName] = outputEntryFromResult(parallelResults[taskIndex]!, stepIndex);\n\t\t\t\t}\n\n\t\t\t\tconst taskResults: ParallelTaskResult[] = parallelResults.map((result, i) => {\n\t\t\t\t\tconst outputTarget = parallelBehaviors[i]?.output;\n\t\t\t\t\tconst outputTargetPath = typeof outputTarget === \"string\"\n\t\t\t\t\t\t? (path.isAbsolute(outputTarget) ? outputTarget : path.join(chainDir, outputTarget))\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tagent: result.agent,\n\t\t\t\t\t\ttaskIndex: i,\n\t\t\t\t\t\toutput: getSingleResultOutput(result),\n\t\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\ttimedOut: result.timedOut,\n\t\t\t\t\t\toutputTargetPath,\n\t\t\t\t\t\toutputTargetExists: outputTargetPath ? fs.existsSync(outputTargetPath) : undefined,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tprev = aggregateParallelOutputs(taskResults);\n\t\t\t\tprev = appendParallelWorktreeSummary(\n\t\t\t\t\tprev,\n\t\t\t\t\tworktreeSetup,\n\t\t\t\t\tpath.join(chainDir, \"worktree-diffs\", `step-${stepIndex}`),\n\t\t\t\t\tagentNames,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (worktreeSetup) cleanupWorktrees(worktreeSetup);\n\t\t\t}\n\t\t} else if (isDynamicParallelStep(step)) {\n\t\t\tconst dynamicStartIndex = globalTaskIndex;\n\t\t\tconst reservedDynamicItems = step.expand.maxItems ?? params.dynamicFanoutMaxItems ?? 0;\n\t\t\tlet materialized: ReturnType<typeof materializeDynamicParallelStep>;\n\t\t\ttry {\n\t\t\t\tmaterialized = materializeDynamicParallelStep(step, outputs, stepIndex, { maxItems: params.dynamicFanoutMaxItems });\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: message };\n\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t}\n\n\t\t\tdynamicChildren[stepIndex] = materialized.items.map((item, itemIndex) => ({\n\t\t\t\tagent: step.parallel.agent,\n\t\t\t\tlabel: materialized.parallel[itemIndex]?.label,\n\t\t\t\tflatIndex: globalTaskIndex + itemIndex,\n\t\t\t\titemKey: item.key,\n\t\t\t\tstructured: Boolean(step.parallel.outputSchema),\n\t\t\t}));\n\n\t\t\tif (materialized.parallel.length === 0) {\n\t\t\t\tconst collection: DynamicCollectedResult[] = [];\n\t\t\t\ttry {\n\t\t\t\t\tvalidateDynamicCollection(step.collect.outputSchema, collection);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);\n\t\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: message };\n\t\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t\t}\n\t\t\t\toutputs[step.collect.as] = {\n\t\t\t\t\ttext: JSON.stringify(collection),\n\t\t\t\t\tstructured: collection,\n\t\t\t\t\tagent: step.parallel.agent,\n\t\t\t\t\tstepIndex,\n\t\t\t\t};\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"completed\" };\n\t\t\t\tif (step.acceptance !== undefined) {\n\t\t\t\t\tconst effectiveGroupAcceptance = resolveEffectiveAcceptance({\n\t\t\t\t\t\texplicit: step.acceptance,\n\t\t\t\t\t\tagentName: step.parallel.agent,\n\t\t\t\t\t\tacceptanceRole: agents.find((agent) => agent.name === step.parallel.agent)?.acceptanceRole,\n\t\t\t\t\t\ttask: (step.parallel.task ?? originalTask ?? \"\").replace(/\\{task\\}/g, originalTask ?? \"\"),\n\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\tdynamicGroup: true,\n\t\t\t\t\t});\n\t\t\t\t\tconst groupAcceptance = await evaluateAcceptance({\n\t\t\t\t\t\tacceptance: effectiveGroupAcceptance,\n\t\t\t\t\t\toutput: \"\",\n\t\t\t\t\t\treport: aggregateAcceptanceReport({\n\t\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\t\tnotes: \"Dynamic fanout produced 0 results.\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tcwd: cwd ?? ctx.cwd,\n\t\t\t\t\t});\n\t\t\t\t\tdynamicGroupStatuses[stepIndex].acceptance = groupAcceptance;\n\t\t\t\t\tconst groupAcceptanceFailure = acceptanceFailureMessage(groupAcceptance);\n\t\t\t\t\tif (groupAcceptanceFailure) {\n\t\t\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: groupAcceptanceFailure, acceptance: groupAcceptance };\n\t\t\t\t\t\treturn buildChainExecutionErrorResult(groupAcceptanceFailure, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprev = \"Dynamic fanout produced 0 results.\";\n\t\t\t\tglobalTaskIndex = dynamicStartIndex + reservedDynamicItems;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dynamicParallelStep: ParallelStep = {\n\t\t\t\tparallel: materialized.parallel,\n\t\t\t\tconcurrency: step.concurrency,\n\t\t\t\tfailFast: step.failFast,\n\t\t\t};\n\t\t\tconst parallelTemplates = materialized.parallel.map((task) => task.task ?? \"{previous}\");\n\t\t\tconst parallelBehaviors = resolveParallelBehaviors(dynamicParallelStep.parallel, stepIndex, chainSkills)\n\t\t\t\t.map((behavior, taskIndex) => suppressProgressForReadOnlyTask(behavior, parallelTemplates[taskIndex] ?? dynamicParallelStep.parallel[taskIndex]?.task, originalTask));\n\n\t\t\tfor (let taskIndex = 0; taskIndex < dynamicParallelStep.parallel.length; taskIndex++) {\n\t\t\t\tconst behavior = parallelBehaviors[taskIndex]!;\n\t\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))\n\t\t\t\t\t: undefined;\n\t\t\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Dynamic chain step ${stepIndex + 1} item ${taskIndex + 1} (${dynamicParallelStep.parallel[taskIndex]!.agent})`);\n\t\t\t\tif (validationError) {\n\t\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: validationError };\n\t\t\t\t\treturn buildChainExecutionErrorResult(validationError, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex + taskIndex }));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprogressCreated = ensureParallelProgressFile(chainDir, progressCreated, parallelBehaviors);\n\t\t\tcreateParallelDirs(chainDir, stepIndex, dynamicParallelStep.parallel.length, dynamicParallelStep.parallel.map((task) => task.agent));\n\t\t\tconst parallelResults = await runParallelChainTasks({\n\t\t\t\tstep: dynamicParallelStep,\n\t\t\t\tparallelTemplates,\n\t\t\t\tparallelBehaviors,\n\t\t\t\tagents,\n\t\t\t\tstepIndex,\n\t\t\t\tavailableModels,\n\t\t\t\tmodelScope,\n\t\t\t\tchainDir,\n\t\t\t\tprev,\n\t\t\t\toriginalTask,\n\t\t\t\tctx,\n\t\t\t\tintercomEvents,\n\t\t\t\tcwd,\n\t\t\t\trunId,\n\t\t\t\tglobalTaskIndex,\n\t\t\t\tsessionDirForIndex,\n\t\t\t\tsessionFileForIndex,\n\t\t\t\tsessionFileForTask,\n\t\t\t\tthinkingOverrideForTask,\n\t\t\t\tshareEnabled,\n\t\t\t\tartifactConfig,\n\t\t\t\tartifactsDir,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tresults,\n\t\t\t\tallProgress,\n\t\t\t\toutputs,\n\t\t\t\tchainAgents,\n\t\t\t\tchainSteps,\n\t\t\t\ttotalSteps,\n\t\t\t\tdynamicChildren,\n\t\t\t\tdynamicGroupStatuses,\n\t\t\t\tcontrolConfig,\n\t\t\t\tonControlEvent,\n\t\t\t\tchildIntercomTarget,\n\t\t\t\torchestratorIntercomTarget,\n\t\t\t\tforegroundControl,\n\t\t\t\tnestedRoute: params.nestedRoute,\n\t\t\t\tmaxSubagentDepth: params.maxSubagentDepth,\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\tonDetachedExit,\n\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\tconfigToolBudget: params.configToolBudget,\n\t\t\t\tglobalSemaphore,\n\t\t\t\tdynamic: true,\n\t\t\t});\n\t\t\tglobalTaskIndex = dynamicStartIndex + reservedDynamicItems;\n\n\t\t\tfor (const result of parallelResults) {\n\t\t\t\tresults.push(result);\n\t\t\t\tif (result.progress) allProgress.push(result.progress);\n\t\t\t\tif (result.artifactPaths) allArtifactPaths.push(result.artifactPaths);\n\t\t\t}\n\t\t\tconst collected = collectDynamicResults(step, materialized.items, parallelResults);\n\t\t\tconst interruptedIndexInStep = parallelResults.findIndex((result) => result.interrupted);\n\t\t\tconst interrupted = interruptedIndexInStep >= 0 ? parallelResults[interruptedIndexInStep] : undefined;\n\t\t\tif (interrupted) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain paused after interrupt at step ${stepIndex + 1} (${interrupted.agent}). Waiting for explicit next action.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\tcurrentFlatIndex: dynamicStartIndex + interruptedIndexInStep,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst detachedIndexInStep = parallelResults.findIndex((result) => result.detached);\n\t\t\tconst detached = detachedIndexInStep >= 0 ? parallelResults[detachedIndexInStep] : undefined;\n\t\t\tif (detached) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain detached for intercom coordination at step ${stepIndex + 1} (${detached.agent}). Reply to the supervisor request first, then wait with subagent_wait({ id: \"${runId}\" }). Use subagent({ action: \"status\", id: \"${runId}\" }) to recover the result; do not resume or launch a replacement while it remains detached.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\tcurrentFlatIndex: dynamicStartIndex + detachedIndexInStep,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst failures = parallelResults\n\t\t\t\t.map((result, originalIndex) => ({ ...result, originalIndex }))\n\t\t\t\t.filter((result) => result.exitCode !== 0 && result.exitCode !== -1);\n\t\t\tif (failures.length > 0) {\n\t\t\t\tconst failureSummary = failures\n\t\t\t\t\t.map((failure) => `- Item ${failure.originalIndex + 1} (${failure.agent}, key ${materialized.items[failure.originalIndex]?.key ?? failure.originalIndex}): ${failure.error || \"failed\"}`)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tconst errorMsg = `Dynamic step ${stepIndex + 1} failed:\\n${failureSummary}`;\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: errorMsg };\n\t\t\t\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"failed\", {\n\t\t\t\t\tindex: stepIndex,\n\t\t\t\t\terror: errorMsg,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: summary }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({\n\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\tcurrentFlatIndex: dynamicStartIndex + failures[0]!.originalIndex,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvalidateDynamicCollection(step.collect.outputSchema, collected);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: message };\n\t\t\t\treturn buildChainExecutionErrorResult(message, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: dynamicStartIndex }));\n\t\t\t}\n\t\t\toutputs[step.collect.as] = {\n\t\t\t\ttext: JSON.stringify(collected),\n\t\t\t\tstructured: collected,\n\t\t\t\tagent: step.parallel.agent,\n\t\t\t\tstepIndex,\n\t\t\t};\n\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"completed\" };\n\t\t\tconst effectiveGroupAcceptance = resolveEffectiveAcceptance({\n\t\t\t\texplicit: step.acceptance,\n\t\t\t\tagentName: step.parallel.agent,\n\t\t\t\tacceptanceRole: agents.find((agent) => agent.name === step.parallel.agent)?.acceptanceRole,\n\t\t\t\ttask: materialized.parallel\n\t\t\t\t\t.map((task) => (task.task ?? originalTask ?? \"\").replace(/\\{task\\}/g, originalTask ?? \"\"))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\tmode: \"chain\",\n\t\t\t\tdynamicGroup: true,\n\t\t\t});\n\t\t\tconst groupAcceptance = await evaluateAcceptance({\n\t\t\t\tacceptance: effectiveGroupAcceptance,\n\t\t\t\toutput: \"\",\n\t\t\t\treport: aggregateAcceptanceReport({\n\t\t\t\t\tresults: parallelResults,\n\t\t\t\t\tnotes: `Dynamic fanout collected ${collected.length} result(s) into ${step.collect.as}.`,\n\t\t\t\t}),\n\t\t\t\tcwd: cwd ?? ctx.cwd,\n\t\t\t});\n\t\t\tdynamicGroupStatuses[stepIndex].acceptance = groupAcceptance;\n\t\t\tconst groupAcceptanceFailure = effectiveGroupAcceptance.explicit ? acceptanceFailureMessage(groupAcceptance) : undefined;\n\t\t\tif (groupAcceptanceFailure) {\n\t\t\t\tdynamicGroupStatuses[stepIndex] = { status: \"failed\", error: groupAcceptanceFailure, acceptance: groupAcceptance };\n\t\t\t\treturn buildChainExecutionErrorResult(groupAcceptanceFailure, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex - dynamicParallelStep.parallel.length }));\n\t\t\t}\n\t\t\tconst taskResults: ParallelTaskResult[] = parallelResults.map((result, i) => ({\n\t\t\t\tagent: result.agent,\n\t\t\t\ttaskIndex: i,\n\t\t\t\toutput: getSingleResultOutput(result),\n\t\t\t\texitCode: result.exitCode,\n\t\t\t\terror: result.error,\n\t\t\t\ttimedOut: result.timedOut,\n\t\t\t}));\n\t\t\tprev = aggregateParallelOutputs(taskResults, (i, agent) => `=== Dynamic Item ${i + 1} (${agent}, key ${materialized.items[i]?.key ?? i}) ===`);\n\t\t} else {\n\t\t\tconst seqStep = step as SequentialStep;\n\t\t\tconst stepTemplate = stepTemplates as string;\n\n\t\t\tconst agentConfig = agents.find((a) => a.name === seqStep.agent);\n\t\t\tif (!agentConfig) {\n\t\t\t\tremoveChainDir(chainDir);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Unknown agent: ${seqStep.agent}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex })),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst tuiOverride = tuiBehaviorOverrides?.[stepIndex];\n\t\t\tconst stepOverride: StepOverrides = {\n\t\t\t\toutput: tuiOverride?.output !== undefined ? tuiOverride.output : seqStep.output,\n\t\t\t\toutputMode: seqStep.outputMode,\n\t\t\t\treads: tuiOverride?.reads !== undefined ? tuiOverride.reads : seqStep.reads,\n\t\t\t\tprogress: tuiOverride?.progress !== undefined ? tuiOverride.progress : seqStep.progress,\n\t\t\t\tskills:\n\t\t\t\t\ttuiOverride?.skills !== undefined\n\t\t\t\t\t\t? tuiOverride.skills\n\t\t\t\t\t\t: normalizeSkillInput(seqStep.skill),\n\t\t\t};\n\t\t\tconst behavior = suppressProgressForReadOnlyTask(resolveStepBehavior(stepOverride, chainSkills), stepTemplate, originalTask);\n\n\t\t\tconst isFirstProgress = behavior.progress && !progressCreated;\n\t\t\tif (isFirstProgress) {\n\t\t\t\tprogressCreated = true;\n\t\t\t}\n\n\t\t\tconst templateHasPrevious = stepTemplate.includes(\"{previous}\");\n\t\t\tconst { prefix, suffix } = buildChainInstructions(\n\t\t\t\t{ ...behavior, output: false },\n\t\t\t\tchainDir,\n\t\t\t\tisFirstProgress,\n\t\t\t\ttemplateHasPrevious ? undefined : prev,\n\t\t\t);\n\n\t\t\tlet stepTask = resolveOutputReferences(stepTemplate, outputs);\n\t\t\tstepTask = stepTask.replace(/\\{task\\}/g, originalTask);\n\t\t\tstepTask = stepTask.replace(/\\{previous\\}/g, prev);\n\t\t\tstepTask = stepTask.replace(/\\{chain_dir\\}/g, chainDir);\n\t\t\tconst cleanTask = stepTask;\n\t\t\tstepTask = prefix + stepTask + suffix;\n\n\t\t\tconst effectiveModel = resolveExecutableChildModel({\n\t\t\t\tmodel: seqStep.model,\n\t\t\t\ttier: seqStep.tier,\n\t\t\t\tthinking: seqStep.thinking,\n\t\t\t\tavailableModels,\n\t\t\t\tpreferredProvider: ctx.model?.provider,\n\t\t\t});\n\n\t\t\tconst outputPath = typeof behavior.output === \"string\"\n\t\t\t\t? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))\n\t\t\t\t: undefined;\n\t\t\tstepTask = injectSingleOutputInstruction(stepTask, outputPath, agentConfig);\n\t\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Chain step ${stepIndex + 1} (${seqStep.agent})`);\n\t\t\tif (validationError) {\n\t\t\t\treturn buildChainExecutionErrorResult(validationError, makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: globalTaskIndex }));\n\t\t\t}\n\t\t\tconst maxSubagentDepth = resolveChildMaxSubagentDepth(params.maxSubagentDepth, agentConfig.maxSubagentDepth);\n\t\t\tconst childIndex = globalTaskIndex;\n\t\t\tconst interruptController = new AbortController();\n\t\t\tif (foregroundControl) {\n\t\t\t\tforegroundControl.currentAgent = seqStep.description || seqStep.agent;\n\t\t\t\tforegroundControl.currentChildId = seqStep.agent;\n\t\t\t\tforegroundControl.currentIndex = childIndex;\n\t\t\t\tforegroundControl.currentActivityState = undefined;\n\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t\tforegroundControl.interrupt = () => {\n\t\t\t\t\tif (interruptController.signal.aborted) return false;\n\t\t\t\t\tinterruptController.abort();\n\t\t\t\t\tforegroundControl.currentActivityState = undefined;\n\t\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst structuredRuntime = seqStep.outputSchema\n\t\t\t\t? createStructuredOutputRuntime(seqStep.outputSchema, path.join(chainDir, \"structured-output\"))\n\t\t\t\t: undefined;\n\t\t\tconst toolBudget = resolveChainToolBudget({ stepBudget: seqStep.toolBudget, runBudget: params.toolBudget, agentBudget: agentConfig?.toolBudget, configBudget: params.configToolBudget });\n\t\t\tif (toolBudget.error) return buildChainExecutionErrorResult(toolBudget.error, {\n\t\t\t\tresults,\n\t\t\t\tincludeProgress,\n\t\t\t\tallProgress,\n\t\t\t\tallArtifactPaths,\n\t\t\t\tartifactsDir: params.artifactsDir,\n\t\t\t\tchainAgents,\n\t\t\t\tchainSteps,\n\t\t\t\ttotalSteps,\n\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\trunId: params.runId,\n\t\t\t\toutputs,\n\t\t\t\tcurrentFlatIndex: globalTaskIndex,\n\t\t\t\tdynamicChildren,\n\t\t\t\tdynamicGroupStatuses,\n\t\t\t});\n\t\t\tconst r = await runSync(ctx.cwd, normalizeChildSpec({\n\t\t\t\ttask: stepTask,\n\t\t\t\tdescription: seqStep.description,\n\t\t\t\tpermissions: seqStep.permissions,\n\t\t\t\tmodel: seqStep.model,\n\t\t\t\ttier: seqStep.tier,\n\t\t\t\tthinking: seqStep.thinking,\n\t\t\t\tmodelSelection: captureModelSelection({ model: seqStep.model, tier: seqStep.tier }),\n\t\t\t\tskill: seqStep.skill,\n\t\t\t\tcwd: seqStep.cwd,\n\t\t\t\toutput: seqStep.output,\n\t\t\t\toutputMode: seqStep.outputMode,\n\t\t\t\tacceptance: seqStep.acceptance,\n\t\t\t\ttoolBudget: seqStep.toolBudget,\n\t\t\t}, { parentMode: snapshotParentPermissionMode(ctx.sessionManager.getSessionId() ?? undefined), runId, index: childIndex }), {\n\t\t\t\tparentSessionId: ctx.sessionManager.getSessionId() ?? undefined,\n\t\t\t\tcwd: resolveChildCwd(cwd ?? ctx.cwd, seqStep.cwd),\n\t\t\t\tsignal,\n\t\t\t\tinterruptSignal: interruptController.signal,\n\t\t\t\tallowIntercomDetach: agentConfig.systemPrompt?.includes(INTERCOM_BRIDGE_MARKER) === true,\n\t\t\t\tintercomEvents,\n\t\t\t\trunId,\n\t\t\t\tindex: childIndex,\n\t\t\t\tsessionDir: sessionDirForIndex(childIndex),\n\t\t\t\tsessionFile: sessionFileForTask?.(seqStep.agent, childIndex, effectiveModel)\n\t\t\t\t\t?? sessionFileForIndex?.(childIndex),\n\t\t\t\tthinkingOverride: thinkingOverrideForTask?.(seqStep.agent, childIndex, effectiveModel),\n\t\t\t\tshare: shareEnabled,\n\t\t\t\tartifactsDir: artifactConfig.enabled ? artifactsDir : undefined,\n\t\t\t\tartifactConfig,\n\t\t\t\toutputPath,\n\t\t\t\toutputMode: behavior.outputMode,\n\t\t\t\tmaxSubagentDepth,\n\t\t\t\tcontrolConfig,\n\t\t\t\tonControlEvent,\n\t\t\t\tintercomSessionName: childIntercomTarget?.(seqStep.agent, childIndex),\n\t\t\t\torchestratorIntercomTarget,\n\t\t\t\tnestedRoute: params.nestedRoute,\n\t\t\t\tmodelOverride: effectiveModel,\n\t\t\t\tavailableModels,\n\t\t\t\tpreferredModelProvider: ctx.model?.provider,\n\t\t\t\tmodelScope,\n\t\t\t\tskills: behavior.skills === false ? [] : behavior.skills,\n\t\t\t\tstructuredOutput: structuredRuntime,\n\t\t\t\tacceptance: seqStep.acceptance,\n\t\t\t\tacceptanceContext: { mode: \"chain\" },\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\tonDetachedExit: onDetachedExit\n\t\t\t\t\t? (result) => onDetachedExit(childIndex, result)\n\t\t\t\t\t: undefined,\n\t\t\t\ttoolBudget: toolBudget.toolBudget,\n\t\t\t\tonUpdate: onUpdate\n\t\t\t\t\t? (p) => {\n\t\t\t\t\t\tconst stepResults = p.details?.results || [];\n\t\t\t\t\t\tconst stepProgress = p.details?.progress || [];\n\t\t\t\t\t\tif (foregroundControl && stepProgress.length > 0) {\n\t\t\t\t\t\t\tconst current = stepProgress[0];\n\t\t\t\t\t\t\tforegroundControl.currentAgent = seqStep.description || seqStep.agent;\n\t\t\t\t\t\t\tforegroundControl.currentChildId = seqStep.agent;\n\t\t\t\t\t\t\tforegroundControl.currentIndex = childIndex;\n\t\t\t\t\t\t\tforegroundControl.currentActivityState = current?.activityState;\n\t\t\t\t\t\t\tforegroundControl.lastActivityAt = current?.lastActivityAt;\n\t\t\t\t\t\t\tforegroundControl.currentTool = current?.currentTool;\n\t\t\t\t\t\t\tforegroundControl.currentToolStartedAt = current?.currentToolStartedAt;\n\t\t\t\t\t\t\tforegroundControl.currentPath = current?.currentPath;\n\t\t\t\t\t\t\tforegroundControl.turnCount = current?.turnCount;\n\t\t\t\t\t\t\tforegroundControl.tokens = current?.tokens;\n\t\t\t\t\t\t\tforegroundControl.toolCount = current?.toolCount;\n\t\t\t\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUpdate({\n\t\t\t\t\t\t\t...p,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\tresults: results.concat(stepResults),\n\t\t\t\t\t\t\t\tprogress: allProgress.concat(stepProgress),\n\t\t\t\t\t\t\t\tcontrolEvents: p.details?.controlEvents,\n\t\t\t\t\t\t\t\tchainAgents,\n\t\t\t\t\t\t\t\ttotalSteps,\n\t\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\t\toutputs,\n\t\t\t\t\t\t\t\tworkflowGraph: buildWorkflowGraphSnapshot({\n\t\t\t\t\t\t\t\t\trunId,\n\t\t\t\t\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\t\t\t\t\tsteps: chainSteps,\n\t\t\t\t\t\t\t\t\tresults: results.concat(stepResults),\n\t\t\t\t\t\t\t\t\tcurrentStepIndex: stepIndex,\n\t\t\t\t\t\t\t\t\tcurrentFlatIndex: childIndex,\n\t\t\t\t\t\t\t\t\tdynamicChildren,\n\t\t\t\t\t\t\t\t\tdynamicGroupStatuses,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tif (foregroundControl?.currentIndex === childIndex) {\n\t\t\t\tforegroundControl.interrupt = undefined;\n\t\t\t\tforegroundControl.updatedAt = Date.now();\n\t\t\t}\n\t\t\trecordRun(seqStep.agent, cleanTask, r.exitCode, r.progressSummary?.durationMs ?? 0);\n\n\t\t\tglobalTaskIndex++;\n\t\t\tresults.push(r);\n\t\t\tif (r.progress) allProgress.push(r.progress);\n\t\t\tif (r.artifactPaths) allArtifactPaths.push(r.artifactPaths);\n\n\t\t\tif (r.interrupted) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain paused after interrupt at step ${stepIndex + 1} (${r.agent}). Waiting for explicit next action.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: childIndex })),\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (r.detached) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Chain detached for intercom coordination at step ${stepIndex + 1} (${r.agent}). Reply to the supervisor request first, then wait with subagent_wait({ id: \"${runId}\" }). Use subagent({ action: \"status\", id: \"${runId}\" }) to recover the result; do not resume or launch a replacement while it remains detached.` }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: childIndex })),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (r.exitCode !== 0) {\n\t\t\t\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"failed\", {\n\t\t\t\t\tindex: stepIndex,\n\t\t\t\t\terror: r.error || \"Chain failed\",\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: summary }],\n\t\t\t\t\tdetails: buildChainExecutionDetails(makeDetailsInput({ currentStepIndex: stepIndex, currentFlatIndex: childIndex })),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (behavior.output) {\n\t\t\t\ttry {\n\t\t\t\t\tconst expectedPath = path.isAbsolute(behavior.output)\n\t\t\t\t\t\t? behavior.output\n\t\t\t\t\t\t: path.join(chainDir, behavior.output);\n\t\t\t\t\tif (!fs.existsSync(expectedPath)) {\n\t\t\t\t\t\tconst dirFiles = fs.readdirSync(chainDir);\n\t\t\t\t\t\tconst mdFiles = dirFiles.filter((file) => file.endsWith(\".md\") && file !== \"progress.md\");\n\t\t\t\t\t\tconst warning = mdFiles.length > 0\n\t\t\t\t\t\t\t? `Agent wrote to different file(s): ${mdFiles.join(\", \")} instead of ${behavior.output}`\n\t\t\t\t\t\t\t: `Agent did not create expected output file: ${behavior.output}`;\n\t\t\t\t\t\tr.error = r.error ? `${r.error}\\n${warning}` : warning;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore validation errors; this diagnostic should not mask successful chain output.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (seqStep.as) outputs[seqStep.as] = outputEntryFromResult(r, stepIndex);\n\t\t\tprev = getSingleResultOutput(r);\n\t\t}\n\t}\n\n\tconst summary = buildChainSummary(chainSteps, results, chainDir, \"completed\");\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: summary }],\n\t\tdetails: buildChainExecutionDetails(makeDetailsInput()),\n\t};\n}\n"]}
|
|
@@ -18,7 +18,7 @@ import { DEFAULT_GLOBAL_CONCURRENCY_LIMIT, Semaphore } from "../shared/parallel-
|
|
|
18
18
|
import { recordRun } from "../shared/run-history.js";
|
|
19
19
|
import { cleanupWorktrees, createWorktrees, diffWorktrees, findWorktreeTaskCwdConflict, formatWorktreeDiffSummary, formatWorktreeTaskCwdConflict, } from "../shared/worktree.js";
|
|
20
20
|
import { MAX_CONCURRENCY, resolveChildMaxSubagentDepth, } from "../../shared/types.js";
|
|
21
|
-
import { captureModelSelection,
|
|
21
|
+
import { captureModelSelection, resolveExecutableChildModel } from "../shared/model-fallback.js";
|
|
22
22
|
import { injectSingleOutputInstruction, validateFileOnlyOutputMode } from "../shared/single-output.js";
|
|
23
23
|
import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.js";
|
|
24
24
|
import { ChainOutputValidationError, outputEntryFromResult, resolveOutputReferences, validateChainOutputBindings } from "../shared/chain-outputs.js";
|
|
@@ -92,8 +92,13 @@ async function runParallelChainTasks(input) {
|
|
|
92
92
|
const failFast = input.step.failFast ?? false;
|
|
93
93
|
let aborted = false;
|
|
94
94
|
const effectiveModels = input.step.parallel.map((task) => {
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
return resolveExecutableChildModel({
|
|
96
|
+
model: task.model,
|
|
97
|
+
tier: task.tier,
|
|
98
|
+
thinking: task.thinking,
|
|
99
|
+
availableModels: input.availableModels,
|
|
100
|
+
preferredProvider: input.ctx.model?.provider,
|
|
101
|
+
});
|
|
97
102
|
});
|
|
98
103
|
for (let taskIndex = 0; taskIndex < input.step.parallel.length; taskIndex++) {
|
|
99
104
|
const task = input.step.parallel[taskIndex];
|
|
@@ -156,9 +161,10 @@ async function runParallelChainTasks(input) {
|
|
|
156
161
|
task: taskStr,
|
|
157
162
|
description: task.description,
|
|
158
163
|
permissions: task.permissions,
|
|
159
|
-
model:
|
|
164
|
+
model: task.model,
|
|
160
165
|
tier: task.tier,
|
|
161
|
-
|
|
166
|
+
thinking: task.thinking,
|
|
167
|
+
modelSelection: captureModelSelection({ model: task.model, tier: task.tier }),
|
|
162
168
|
skill: task.skill,
|
|
163
169
|
cwd: taskCwd,
|
|
164
170
|
output: task.output,
|
|
@@ -830,7 +836,13 @@ export async function executeChain(params) {
|
|
|
830
836
|
stepTask = stepTask.replace(/\{chain_dir\}/g, chainDir);
|
|
831
837
|
const cleanTask = stepTask;
|
|
832
838
|
stepTask = prefix + stepTask + suffix;
|
|
833
|
-
const effectiveModel =
|
|
839
|
+
const effectiveModel = resolveExecutableChildModel({
|
|
840
|
+
model: seqStep.model,
|
|
841
|
+
tier: seqStep.tier,
|
|
842
|
+
thinking: seqStep.thinking,
|
|
843
|
+
availableModels,
|
|
844
|
+
preferredProvider: ctx.model?.provider,
|
|
845
|
+
});
|
|
834
846
|
const outputPath = typeof behavior.output === "string"
|
|
835
847
|
? (path.isAbsolute(behavior.output) ? behavior.output : path.join(chainDir, behavior.output))
|
|
836
848
|
: undefined;
|
|
@@ -882,9 +894,10 @@ export async function executeChain(params) {
|
|
|
882
894
|
task: stepTask,
|
|
883
895
|
description: seqStep.description,
|
|
884
896
|
permissions: seqStep.permissions,
|
|
885
|
-
model:
|
|
897
|
+
model: seqStep.model,
|
|
886
898
|
tier: seqStep.tier,
|
|
887
|
-
|
|
899
|
+
thinking: seqStep.thinking,
|
|
900
|
+
modelSelection: captureModelSelection({ model: seqStep.model, tier: seqStep.tier }),
|
|
888
901
|
skill: seqStep.skill,
|
|
889
902
|
cwd: seqStep.cwd,
|
|
890
903
|
output: seqStep.output,
|