@ashx-j/lunr 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builtin-extensions/ashxj-spinners.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-spinners.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-spinners.js.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +5 -5
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +3 -3
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +2 -2
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +2 -2
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.d.ts +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js.map +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.d.ts +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +1 -1
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts +2 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +2 -2
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +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 +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts +3 -3
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts +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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +1 -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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +1 -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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts +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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +1 -1
- 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.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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +2 -2
- 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.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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +2 -2
- 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.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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts +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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +1 -1
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
- 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 +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts +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/render.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -2
- 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.map +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +2 -2
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.js +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.js +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.js.map +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/register-bedrock.js +2 -2
- package/dist/bun/register-bedrock.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cache-stats.d.ts +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/catalog-merge.d.ts +1 -1
- package/dist/core/catalog-merge.d.ts.map +1 -1
- package/dist/core/catalog-merge.js +7 -1
- package/dist/core/catalog-merge.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +2 -2
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +1 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/export-html/index.d.ts +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +25 -25
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +5 -5
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/grok-cli-auth.d.ts +32 -0
- package/dist/core/grok-cli-auth.d.ts.map +1 -0
- package/dist/core/grok-cli-auth.js +218 -0
- package/dist/core/grok-cli-auth.js.map +1 -0
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/live-catalog.d.ts +1 -1
- package/dist/core/live-catalog.d.ts.map +1 -1
- package/dist/core/live-catalog.js.map +1 -1
- package/dist/core/messages.d.ts +3 -3
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +10 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +24 -5
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/official-catalog.d.ts +1 -1
- package/dist/core/official-catalog.d.ts.map +1 -1
- package/dist/core/official-catalog.js.map +1 -1
- package/dist/core/provider-attribution.d.ts +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-composer.d.ts +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +2 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subscriptions.d.ts +1 -1
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +2 -2
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +4 -0
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-history.d.ts.map +1 -1
- package/dist/core/usage-history.js.map +1 -1
- package/dist/core/usage-service.d.ts +11 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +45 -9
- package/dist/core/usage-service.js.map +1 -1
- package/dist/core/user-models.d.ts +1 -1
- package/dist/core/user-models.d.ts.map +1 -1
- package/dist/core/user-models.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +3 -3
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/boot-screen.d.ts +1 -1
- package/dist/modes/interactive/components/boot-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/boot-screen.js +1 -1
- package/dist/modes/interactive/components/boot-screen.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +1 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -2
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +2 -2
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +1 -1
- package/dist/modes/interactive/components/processes-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +1 -1
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-summary.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-summary.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-summary.js.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.js +1 -1
- package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +1 -1
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +1 -1
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +29 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
- package/dist/modes/interactive/smooth-streaming.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +2 -2
- package/examples/extensions/bookmark.ts +1 -1
- package/examples/extensions/border-status-editor.ts +3 -3
- package/examples/extensions/built-in-tool-renderer.ts +3 -3
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/confirm-destructive.ts +1 -1
- package/examples/extensions/custom-compaction.ts +3 -3
- package/examples/extensions/custom-footer.ts +3 -3
- package/examples/extensions/custom-header.ts +2 -2
- package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
- 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/index.ts +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
- package/examples/extensions/dirty-repo-guard.ts +1 -1
- package/examples/extensions/doom-overlay/doom-component.ts +2 -2
- package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/dynamic-resources/index.ts +1 -1
- package/examples/extensions/dynamic-tools.ts +1 -1
- package/examples/extensions/entry-renderer.ts +2 -2
- package/examples/extensions/event-bus.ts +1 -1
- package/examples/extensions/file-trigger.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +1 -1
- package/examples/extensions/github-issue-autocomplete.ts +2 -2
- package/examples/extensions/gondolin/index.ts +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +4 -4
- package/examples/extensions/hello.ts +2 -2
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +1 -1
- package/examples/extensions/input-transform-streaming.ts +1 -1
- package/examples/extensions/input-transform.ts +1 -1
- package/examples/extensions/interactive-shell.ts +1 -1
- package/examples/extensions/kimi-deferred-tools.ts +1 -1
- package/examples/extensions/mac-system-theme.ts +1 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/examples/extensions/minimal-mode.ts +3 -3
- package/examples/extensions/modal-editor.ts +2 -2
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +1 -1
- package/examples/extensions/overlay-qa-tests.ts +3 -3
- package/examples/extensions/overlay-test.ts +2 -2
- package/examples/extensions/permission-gate.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/plan-mode/index.ts +4 -4
- package/examples/extensions/preset.ts +4 -4
- package/examples/extensions/project-trust.ts +1 -1
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/protected-paths.ts +1 -1
- package/examples/extensions/provider-payload.ts +1 -1
- package/examples/extensions/qna.ts +3 -3
- package/examples/extensions/question.ts +2 -2
- package/examples/extensions/questionnaire.ts +2 -2
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/reload-runtime.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +2 -2
- package/examples/extensions/send-user-message.ts +1 -1
- package/examples/extensions/session-name.ts +1 -1
- package/examples/extensions/shutdown-command.ts +1 -1
- package/examples/extensions/snake.ts +2 -2
- package/examples/extensions/space-invaders.ts +2 -2
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/status-line.ts +1 -1
- package/examples/extensions/structured-output.ts +2 -2
- package/examples/extensions/subagent/agents.ts +1 -1
- package/examples/extensions/subagent/index.ts +5 -5
- package/examples/extensions/summarize.ts +4 -4
- package/examples/extensions/system-prompt-header.ts +1 -1
- package/examples/extensions/tic-tac-toe.ts +3 -3
- package/examples/extensions/timed-confirm.ts +1 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/todo.ts +3 -3
- package/examples/extensions/tool-override.ts +2 -2
- package/examples/extensions/tools.ts +3 -3
- package/examples/extensions/trigger-compact.ts +1 -1
- package/examples/extensions/truncated-tool.ts +3 -3
- package/examples/extensions/widget-placement.ts +1 -1
- package/examples/extensions/with-deps/index.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/working-indicator.ts +1 -1
- package/examples/extensions/working-message-test.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/02-custom-model.ts +2 -2
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/05-tools.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/07-context-files.ts +1 -1
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
- package/examples/sdk/10-settings.ts +1 -1
- package/examples/sdk/11-sessions.ts +1 -1
- package/examples/sdk/12-full-control.ts +2 -2
- package/examples/sdk/13-session-runtime.ts +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAA6C,MAAM,iCAAiC,CAAC;AA4G/G,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAE,EAAE,YAAY,QAwoD5D","sourcesContent":["// @ts-nocheck\nimport { existsSync } from \"node:fs\";\nimport { resolve as resolvePath } from \"node:path\";\nimport type { Model } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport {\n\textractChainContextFlag,\n\textractLineupOverrides,\n\textractLoopCount,\n\textractLoopFlags,\n\textractSubagentOverride,\n\textractWorktreeFlag,\n\tparseCommandArgs,\n\tsubstituteArgs,\n\ttype LineupOverrideAction,\n\ttype SubagentOverride,\n} from \"./args.ts\";\nimport { parseChainSteps, parseChainDeclaration, type ChainStep, type ChainStepOrParallel, type ParallelChainStep } from \"./chain-parser.ts\";\nimport { generateBoomerangSummary, generateChainStepSummary, generateIterationSummary, didIterationMakeChanges, getIterationEntries, wasIterationAborted } from \"./loop-utils.ts\";\nimport { selectModelCandidate } from \"./model-selection.ts\";\nimport { notify, summarizePromptDiagnostics, diagnosticsFingerprint } from \"./notifications.ts\";\nimport { preparePromptExecution, renderPromptForResolvedModel } from \"./prompt-execution.ts\";\nimport {\n\tbuildPromptCommandDescription,\n\texpandCwdPath,\n\tloadPromptsWithModel,\n\treadSkillContent,\n\tresolveSkillPath,\n\ttype DelegationLineupSlot,\n\ttype PromptWithModel,\n} from \"./prompt-loader.ts\";\nimport { renderSkillLoaded, type SkillLoadedDetails } from \"./skill-loaded-renderer.ts\";\nimport { createToolManager } from \"./tool-manager.ts\";\nimport { executeSubagentPromptStep, type DelegatedPromptParallelResult } from \"./subagent-step.ts\";\nimport { DEFAULT_SUBAGENT_NAME, PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE } from \"./subagent-runtime.ts\";\nimport { renderDelegatedSubagentResult } from \"./subagent-renderer.ts\";\nimport {\n\tPROMPT_TEMPLATE_DETERMINISTIC_COMPLETION_MESSAGE_TYPE,\n\tPROMPT_TEMPLATE_DETERMINISTIC_MESSAGE_TYPE,\n\tbuildDeterministicPreamble,\n\trunDeterministicStep,\n\tshouldHandoffToLlm,\n} from \"./deterministic-step.ts\";\nimport { renderDeterministicCompletion, renderDeterministicResult } from \"./deterministic-renderer.ts\";\n\ninterface LoopState {\n\tcurrentIteration: number;\n\ttotalIterations: number | null;\n\trotationLabel?: string;\n}\n\ninterface FreshCollapse {\n\ttargetId: string;\n\ttask: string;\n\titeration: number;\n\ttotalIterations: number | null;\n}\n\ninterface BoomerangCollapse {\n\ttargetId: string;\n\ttask: string;\n\tpreviousSummaries: string[];\n}\n\ninterface PendingSkillMessage {\n\tcustomType: \"skill-loaded\";\n\tcontent: string;\n\tdisplay: true;\n\tdetails: SkillLoadedDetails;\n}\n\ntype SkillMessageResolution =\n\t| { kind: \"none\" }\n\t| { kind: \"ready\"; message: PendingSkillMessage }\n\t| { kind: \"error\"; error: string };\n\ninterface ExecutionErrorState {\n\thasError: boolean;\n\terror: unknown;\n}\n\ninterface PromptStepResult {\n\tchanged: boolean;\n\ttext?: string;\n}\n\ninterface PromptTurnRestore {\n\toriginalModel: Model<any> | undefined;\n\toriginalThinking: ThinkingLevel | undefined;\n}\n\nconst DEFAULT_COMPARE_REVIEWER_TASK = [\n\t\"Review the worker variants and produce findings only.\",\n\t\"Required output:\",\n\t\"1. Summarize concrete strengths with patch/diff evidence, including worktree change summaries when present.\",\n\t\"2. Call out concrete correctness risks and regression risks.\",\n\t\"3. Extract cherry-pick ideas from non-winning variants.\",\n\t\"4. Do not rank variants or select a winner.\",\n\t\"5. Do not include manual apply commands.\",\n].join(\"\\n\");\n\nconst DEFAULT_COMPARE_FINAL_APPLIER_TASK = [\n\t\"Apply the final implementation directly in the current repo.\",\n\t\"Required output:\",\n\t\"1. Pick the best single variant or synthesize/cherry-pick across variants.\",\n\t\"2. Apply changes directly on the current branch.\",\n\t\"3. Keep edits minimal and focused on the implementation task.\",\n\t\"4. Run obvious relevant verification when practical.\",\n\t\"5. Report changed files and verification commands run.\",\n].join(\"\\n\");\n\nexport default function promptModelExtension(pi: ExtensionAPI) {\n\tlet prompts = new Map<string, PromptWithModel>();\n\tlet chainPrompts = new Map<string, PromptWithModel>();\n\tlet previousModel: Model<any> | undefined;\n\tlet previousThinking: ThinkingLevel | undefined;\n\tlet pendingSkillMessage: PendingSkillMessage | undefined;\n\tlet runtimeModel: Model<any> | undefined;\n\tlet chainActive = false;\n\tlet loopState: LoopState | null = null;\n\tlet freshCollapse: FreshCollapse | null = null;\n\tlet boomerangCollapse: BoomerangCollapse | null = null;\n\tlet accumulatedSummaries: string[] = [];\n\tlet lastDiagnostics = \"\";\n\tlet storedCommandCtx: ExtensionCommandContext | null = null;\n\tconst UNLIMITED_LOOP_CAP = 999;\n\n\tconst toolManager = createToolManager(pi, {\n\t\tisActive: () => !!(loopState || chainActive),\n\t\tgetStoredCtx: () => storedCommandCtx,\n\t\tsetStoredCtx: (ctx) => {\n\t\t\tstoredCommandCtx = ctx;\n\t\t},\n\t\texecuteCommand: executeToolCommand,\n\t});\n\n\tfunction sameModel(a: Model<any> | undefined, b: Model<any> | undefined): boolean {\n\t\tif (!a || !b) return a === b;\n\t\treturn a.provider === b.provider && a.id === b.id;\n\t}\n\n\tfunction getCurrentModel(ctx: Pick<ExtensionContext, \"model\">): Model<any> | undefined {\n\t\treturn runtimeModel ?? ctx.model;\n\t}\n\n\tpi.registerMessageRenderer<SkillLoadedDetails>(\"skill-loaded\", renderSkillLoaded);\n\tpi.registerMessageRenderer(PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE, renderDelegatedSubagentResult);\n\tpi.registerMessageRenderer(PROMPT_TEMPLATE_DETERMINISTIC_MESSAGE_TYPE, renderDeterministicResult);\n\tpi.registerMessageRenderer(PROMPT_TEMPLATE_DETERMINISTIC_COMPLETION_MESSAGE_TYPE, renderDeterministicCompletion);\n\n\tfunction registerPromptCommand(name: string) {\n\t\tpi.registerCommand(name, {\n\t\t\tdescription: buildPromptCommandDescription(prompts.get(name)!),\n\t\t\thandler: async (args, ctx) => {\n\t\t\t\tawait runPromptCommand(name, args, ctx);\n\t\t\t},\n\t\t});\n\t}\n\n\tfunction refreshPrompts(cwd: string, ctx?: ExtensionContext) {\n\t\tconst result = loadPromptsWithModel(cwd);\n\t\tconst chainResult = loadPromptsWithModel(cwd, true);\n\t\tprompts = result.prompts;\n\t\tchainPrompts = chainResult.prompts;\n\n\t\tfor (const name of prompts.keys()) {\n\t\t\tregisterPromptCommand(name);\n\t\t}\n\n\t\tconst summary = summarizePromptDiagnostics(result.diagnostics);\n\t\tconst fingerprint = diagnosticsFingerprint(result.diagnostics);\n\t\tif (summary && fingerprint !== lastDiagnostics) {\n\t\t\tnotify(ctx, summary, \"warning\");\n\t\t}\n\t\tlastDiagnostics = fingerprint;\n\t}\n\n\tfunction consumePendingSkillMessage() {\n\t\tif (!pendingSkillMessage) return undefined;\n\t\tconst message = pendingSkillMessage;\n\t\tpendingSkillMessage = undefined;\n\t\treturn message;\n\t}\n\n\tfunction normalizeSkillName(skillName: string): string {\n\t\treturn skillName.startsWith(\"skill:\") ? skillName.slice(\"skill:\".length) : skillName;\n\t}\n\n\tfunction isPathResolvableSkillName(skillName: string): boolean {\n\t\tif (skillName === \".\" || skillName === \"..\") return false;\n\t\tif (skillName.includes(\"/\")) return false;\n\t\tif (skillName.includes(\"\\\\\")) return false;\n\t\treturn true;\n\t}\n\n\tfunction resolveRegisteredSkillPath(skillName: string): string | undefined {\n\t\tconst normalizedSkillName = normalizeSkillName(skillName);\n\t\tif (!normalizedSkillName) return undefined;\n\t\tconst candidates = new Set([normalizedSkillName, `skill:${normalizedSkillName}`]);\n\n\t\tfor (const command of pi.getCommands()) {\n\t\t\tif (command.source !== \"skill\") continue;\n\t\t\tconst sourceInfo = \"sourceInfo\" in command\n\t\t\t\t? (command as { sourceInfo?: { path?: string } }).sourceInfo\n\t\t\t\t: undefined;\n\t\t\tif (!sourceInfo?.path) continue;\n\t\t\tif (!candidates.has(command.name)) continue;\n\t\t\treturn sourceInfo.path;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tfunction resolveSkillMessage(skillName: string | undefined, cwd: string): SkillMessageResolution {\n\t\tif (!skillName) {\n\t\t\treturn { kind: \"none\" };\n\t\t}\n\n\t\tconst normalizedSkillName = normalizeSkillName(skillName);\n\t\tif (!normalizedSkillName) {\n\t\t\treturn { kind: \"error\", error: `Skill \"${skillName}\" not found` };\n\t\t}\n\n\t\tconst skillPath =\n\t\t\tresolveRegisteredSkillPath(skillName) ?? (isPathResolvableSkillName(normalizedSkillName) ? resolveSkillPath(normalizedSkillName, cwd) : undefined);\n\t\tif (!skillPath) {\n\t\t\treturn { kind: \"error\", error: `Skill \"${skillName}\" not found` };\n\t\t}\n\n\t\ttry {\n\t\t\tconst skillContent = readSkillContent(skillPath);\n\t\t\treturn {\n\t\t\t\tkind: \"ready\",\n\t\t\t\tmessage: {\n\t\t\t\t\tcustomType: \"skill-loaded\",\n\t\t\t\t\tcontent: `<skill name=\"${normalizedSkillName}\">\\n${skillContent}\\n</skill>`,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { skillName: normalizedSkillName, skillContent, skillPath },\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tkind: \"error\",\n\t\t\t\terror: `Failed to read skill \"${skillName}\": ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function waitForTurnStart(ctx: ExtensionContext) {\n\t\twhile (ctx.isIdle()) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10));\n\t\t}\n\t}\n\n\tfunction shouldDelegatePrompt(prompt: PromptWithModel, override?: SubagentOverride): boolean {\n\t\treturn prompt.subagent !== undefined || override?.enabled === true;\n\t}\n\n\tfunction isParallelChainStep(step: ChainStepOrParallel): step is ParallelChainStep {\n\t\treturn \"parallel\" in step;\n\t}\n\n\tasync function executePromptStep(\n\t\tprompt: PromptWithModel,\n\t\targs: string[],\n\t\tctx: ExtensionCommandContext,\n\t\tcurrentModel: Model<any> | undefined,\n\t\toverride?: SubagentOverride,\n\t\tinheritedModel?: Model<any>,\n\t\ttaskPreamble?: string,\n\t\tloopContext?: string,\n\t\tpromptTurnRestore?: PromptTurnRestore,\n\t): Promise<PromptStepResult | \"aborted\"> {\n\t\tlet deterministicPreamble: string | undefined;\n\t\tif (prompt.deterministic) {\n\t\t\ttry {\n\t\t\t\tconst deterministicResult = await runDeterministicStep(prompt, prompt.deterministic, ctx.cwd);\n\t\t\t\tconst deterministicPreambleText = buildDeterministicPreamble(deterministicResult);\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: PROMPT_TEMPLATE_DETERMINISTIC_MESSAGE_TYPE,\n\t\t\t\t\tcontent: deterministicPreambleText,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: deterministicResult,\n\t\t\t\t});\n\t\t\t\tif (!shouldHandoffToLlm(prompt.deterministic, deterministicResult)) {\n\t\t\t\t\tpi.sendMessage({\n\t\t\t\t\t\tcustomType: PROMPT_TEMPLATE_DETERMINISTIC_COMPLETION_MESSAGE_TYPE,\n\t\t\t\t\t\tcontent: `[Deterministic complete: ${prompt.name}]`,\n\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tpromptName: prompt.name,\n\t\t\t\t\t\t\texitCode: deterministicResult.exitCode,\n\t\t\t\t\t\t\ttimedOut: deterministicResult.timedOut,\n\t\t\t\t\t\t\tstatus: deterministicResult.exitCode === 0 ? \"succeeded\" : \"failed\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\treturn { changed: false };\n\t\t\t\t}\n\t\t\t\tdeterministicPreamble = deterministicPreambleText;\n\t\t\t} catch (error) {\n\t\t\t\tnotify(ctx, `Deterministic step failed: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\t\treturn \"aborted\";\n\t\t\t}\n\t\t}\n\n\t\tconst combinedTaskPreamble = [taskPreamble, deterministicPreamble].filter(Boolean).join(\"\\n\\n\");\n\n\t\tif (shouldDelegatePrompt(prompt, override)) {\n\t\t\ttry {\n\t\t\t\tconst delegated =\n\t\t\t\t\tprompt.parallel && prompt.parallel > 1\n\t\t\t\t\t\t? await executeSubagentPromptStep({\n\t\t\t\t\t\t\tpi,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\toverride,\n\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\tinheritedModel,\n\t\t\t\t\t\t\ttaskPreamble: combinedTaskPreamble || undefined,\n\t\t\t\t\t\t\tparallel: Array.from({ length: prompt.parallel }, (_, index) => ({\n\t\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\t\ttaskPrefix: `[Parallel subagent ${index + 1}/${prompt.parallel}]`,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tworktree: prompt.worktree === true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t: await executeSubagentPromptStep({\n\t\t\t\t\t\t\tpi,\n\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\toverride,\n\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\tinheritedModel,\n\t\t\t\t\t\t\ttaskPreamble: combinedTaskPreamble || undefined,\n\t\t\t\t\t\t});\n\t\t\t\tif (!delegated) {\n\t\t\t\t\tnotify(ctx, `Prompt \\`${prompt.name}\\` is not configured for delegated execution.`, \"error\");\n\t\t\t\t\treturn \"aborted\";\n\t\t\t\t}\n\t\t\t\treturn { changed: delegated.changed, text: delegated.text };\n\t\t\t} catch (error) {\n\t\t\t\tnotify(ctx, error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t\treturn { changed: false };\n\t\t\t}\n\t\t}\n\n\t\tconst prepared =\n\t\t\tinheritedModel === undefined\n\t\t\t\t? await preparePromptExecution(prompt, args, currentModel, ctx.modelRegistry)\n\t\t\t\t: await preparePromptExecution(prompt, args, currentModel, ctx.modelRegistry, { inheritedModel });\n\t\tif (!prepared) {\n\t\t\tnotify(ctx, `No available model from: ${prompt.models.join(\", \")}`, \"error\");\n\t\t\treturn \"aborted\";\n\t\t}\n\t\tif (\"message\" in prepared) {\n\t\t\tif (prepared.warning) notify(ctx, prepared.warning, \"warning\");\n\t\t\tnotify(ctx, prepared.message, \"error\");\n\t\t\treturn \"aborted\";\n\t\t}\n\t\tif (prepared.warning) {\n\t\t\tnotify(ctx, prepared.warning, \"warning\");\n\t\t}\n\n\t\tconst skillResolution = resolveSkillMessage(prompt.skill, ctx.cwd);\n\t\tif (skillResolution.kind === \"error\") {\n\t\t\tnotify(ctx, skillResolution.error, \"error\");\n\t\t\treturn \"aborted\";\n\t\t}\n\n\t\tif (!prepared.selectedModel.alreadyActive) {\n\t\t\tconst switched = await pi.setModel(prepared.selectedModel.model);\n\t\t\tif (!switched) {\n\t\t\t\tnotify(ctx, `Failed to switch to model ${prepared.selectedModel.model.provider}/${prepared.selectedModel.model.id}`, \"error\");\n\t\t\t\treturn \"aborted\";\n\t\t\t}\n\t\t\truntimeModel = prepared.selectedModel.model;\n\t\t}\n\n\t\tif (prompt.thinking) {\n\t\t\tpi.setThinkingLevel(prompt.thinking);\n\t\t}\n\t\tpendingSkillMessage = skillResolution.kind === \"ready\" ? skillResolution.message : undefined;\n\n\t\tif (promptTurnRestore) {\n\t\t\tconst currentModel = getCurrentModel(ctx);\n\t\t\tif (promptTurnRestore.originalModel && currentModel && !sameModel(promptTurnRestore.originalModel, currentModel)) {\n\t\t\t\tpreviousModel = promptTurnRestore.originalModel;\n\t\t\t\tpreviousThinking = promptTurnRestore.originalThinking;\n\t\t\t}\n\t\t\tif (prompt.thinking && previousThinking === undefined && prompt.thinking !== promptTurnRestore.originalThinking) {\n\t\t\t\tpreviousThinking = promptTurnRestore.originalThinking;\n\t\t\t}\n\t\t}\n\n\t\tconst startId = ctx.sessionManager.getLeafId();\n\t\tconst effectiveContent = combinedTaskPreamble\n\t\t\t? `${combinedTaskPreamble}\\n\\n${prepared.content}`\n\t\t\t: prepared.content;\n\t\tconst content = loopContext ? `[${loopContext}]\\n\\n${effectiveContent}` : effectiveContent;\n\t\tpi.sendUserMessage(content);\n\t\tawait waitForTurnStart(ctx);\n\t\tawait ctx.waitForIdle();\n\n\t\tconst entries = getIterationEntries(ctx, startId);\n\t\tif (wasIterationAborted(entries)) return \"aborted\";\n\t\treturn { changed: didIterationMakeChanges(entries) };\n\t}\n\n\tasync function restoreSessionState(\n\t\tctx: ExtensionContext,\n\t\toriginalModel: Model<any> | undefined,\n\t\toriginalThinking: ThinkingLevel | undefined,\n\t\tcurrentModel?: Model<any>,\n\t\tcurrentThinking?: ThinkingLevel,\n\t) {\n\t\tconst restoredParts: string[] = [];\n\t\tconst shouldRestoreThinking =\n\t\t\toriginalThinking !== undefined && (currentThinking === undefined || currentThinking !== originalThinking);\n\n\t\tif (originalModel && !sameModel(originalModel, currentModel)) {\n\t\t\tconst restoredModel = await pi.setModel(originalModel);\n\t\t\tif (restoredModel) {\n\t\t\t\truntimeModel = originalModel;\n\t\t\t\trestoredParts.push(originalModel.id);\n\t\t\t} else {\n\t\t\t\tnotify(ctx, `Failed to restore model ${originalModel.provider}/${originalModel.id}`, \"error\");\n\t\t\t}\n\t\t}\n\t\tif (shouldRestoreThinking) {\n\t\t\trestoredParts.push(`thinking:${originalThinking}`);\n\t\t\tpi.setThinkingLevel(originalThinking);\n\t\t}\n\t\tif (restoredParts.length > 0) {\n\t\t\tnotify(ctx, `Restored to ${restoredParts.join(\", \")}`, \"info\");\n\t\t}\n\t}\n\n\tasync function restoreAfterExecution(\n\t\tctx: ExtensionContext,\n\t\tshouldRestore: boolean,\n\t\toriginalModel: Model<any> | undefined,\n\t\toriginalThinking: ThinkingLevel | undefined,\n\t\tcurrentModel: Model<any> | undefined,\n\t\tcurrentThinking: ThinkingLevel | undefined,\n\t\terrorState: ExecutionErrorState,\n\t\tphase: \"loop\" | \"chain\",\n\t): Promise<ExecutionErrorState> {\n\t\tif (!shouldRestore) return errorState;\n\n\t\ttry {\n\t\t\tawait restoreSessionState(ctx, originalModel, originalThinking, currentModel, currentThinking);\n\t\t} catch (error) {\n\t\t\tif (errorState.hasError) {\n\t\t\t\tnotify(\n\t\t\t\t\tctx,\n\t\t\t\t\t`Failed to restore session state after ${phase} error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn errorState;\n\t\t\t}\n\t\t\treturn { hasError: true, error };\n\t\t}\n\n\t\treturn errorState;\n\t}\n\n\tfunction notifyLoopCompletion(\n\t\tctx: ExtensionContext,\n\t\tcompletedIterations: number,\n\t\ttotalIterations: number | null,\n\t\teffectiveMax: number,\n\t\tconverged: boolean,\n\t\trequireMultipleIterations: boolean,\n\t) {\n\t\tif (converged) {\n\t\t\tconst convergedLabel = totalIterations !== null ? `${completedIterations}/${totalIterations}` : `${completedIterations}`;\n\t\t\tnotify(ctx, `Loop converged at ${convergedLabel} (no changes)`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (completedIterations === 0) return;\n\t\tif (requireMultipleIterations && effectiveMax <= 1) return;\n\n\t\tif (totalIterations !== null) {\n\t\t\tnotify(ctx, `Loop finished: ${completedIterations}/${totalIterations} iterations`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tif (completedIterations === effectiveMax) {\n\t\t\tnotify(ctx, `Loop finished: ${completedIterations} iterations (cap reached)`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tnotify(ctx, `Loop finished: ${completedIterations} iterations`, \"info\");\n\t}\n\n\tfunction updateLoopStatus(ctx: ExtensionContext) {\n\t\tif (!ctx.hasUI) return;\n\t\tif (loopState) {\n\t\t\tconst suffix = loopState.rotationLabel ? ` · ${loopState.rotationLabel}` : \"\";\n\t\t\tconst label =\n\t\t\t\tloopState.totalIterations !== null\n\t\t\t\t\t? `loop ${loopState.currentIteration}/${loopState.totalIterations}${suffix}`\n\t\t\t\t\t: `loop ${loopState.currentIteration}${suffix}`;\n\t\t\tctx.ui.setStatus(\"prompt-loop\", ctx.ui.theme.fg(\"warning\", label));\n\t\t} else {\n\t\t\tctx.ui.setStatus(\"prompt-loop\", undefined);\n\t\t}\n\t}\n\n\tasync function executeToolCommand(command: string, ctx: ExtensionCommandContext) {\n\t\tconst stripped = command.startsWith(\"/\") ? command.slice(1) : command;\n\t\tconst spaceIdx = stripped.indexOf(\" \");\n\t\tconst name = spaceIdx >= 0 ? stripped.slice(0, spaceIdx) : stripped;\n\t\tconst args = spaceIdx >= 0 ? stripped.slice(spaceIdx + 1) : \"\";\n\n\t\tif (name === \"chain-prompts\") {\n\t\t\tawait runChainCommand(args, ctx);\n\t\t} else {\n\t\t\tawait runPromptCommand(name, args, ctx);\n\t\t}\n\t}\n\n\tfunction cloneLineup(slots: DelegationLineupSlot[] | undefined): DelegationLineupSlot[] | undefined {\n\t\treturn slots?.map((slot) => ({ ...slot }));\n\t}\n\n\tfunction expandLineupCounts(slots: DelegationLineupSlot[]): DelegationLineupSlot[] {\n\t\tconst expanded: DelegationLineupSlot[] = [];\n\t\tfor (const slot of slots) {\n\t\t\tconst { count, ...concreteSlot } = slot;\n\t\t\tfor (let index = 0; index < (count ?? 1); index++) {\n\t\t\t\texpanded.push({ ...concreteSlot });\n\t\t\t}\n\t\t}\n\t\treturn expanded;\n\t}\n\n\tfunction applyLineupActions(\n\t\tdefaultSlots: DelegationLineupSlot[] | undefined,\n\t\tactions: LineupOverrideAction[],\n\t\ttarget: \"workers\" | \"reviewers\",\n\t): DelegationLineupSlot[] | undefined {\n\t\tlet lineup = cloneLineup(defaultSlots);\n\t\tfor (const action of actions) {\n\t\t\tif (action.target !== target) continue;\n\t\t\tconst incoming = action.slots.map((slot) => ({ ...slot }));\n\t\t\tlineup = action.mode === \"replace\" ? incoming : [...(lineup ?? []), ...incoming];\n\t\t}\n\t\treturn lineup;\n\t}\n\n\tfunction applyFinalApplierAction(\n\t\tdefaultSlot: DelegationLineupSlot | undefined,\n\t\tactions: LineupOverrideAction[],\n\t): DelegationLineupSlot | undefined {\n\t\tlet slot = defaultSlot ? { ...defaultSlot } : undefined;\n\t\tfor (const action of actions) {\n\t\t\tif (action.target !== \"finalApplier\") continue;\n\t\t\tslot = action.slots[0] ? { ...action.slots[0] } : undefined;\n\t\t}\n\t\treturn slot;\n\t}\n\n\tasync function resolveCompareBaseModel(\n\t\tprompt: PromptWithModel,\n\t\tcurrentModel: Model<any> | undefined,\n\t\tctx: ExtensionCommandContext,\n\t\tmodelOverride?: string,\n\t): Promise<Model<any> | undefined> {\n\t\tconst requestedModels = modelOverride ? [modelOverride] : prompt.models;\n\t\tif (requestedModels.length > 0) {\n\t\t\tconst selected = await selectModelCandidate(requestedModels, currentModel, ctx.modelRegistry);\n\t\t\tif (!selected) {\n\t\t\t\tnotify(ctx, `No available model from: ${requestedModels.join(\", \")}`, \"error\");\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn selected.model;\n\t\t}\n\t\tif (currentModel) return currentModel;\n\t\tnotify(ctx, `Prompt \\`${prompt.name}\\` requires an active model or a runtime --model override.`, \"error\");\n\t\treturn undefined;\n\t}\n\n\tfunction resolveCompareCwd(raw: string, ctx: ExtensionCommandContext): string {\n\t\treturn expandCwdPath(raw) ?? resolvePath(ctx.cwd, raw);\n\t}\n\n\tfunction normalizeLineupCwds(\n\t\tslots: DelegationLineupSlot[],\n\t\tdefaultCwd: string,\n\t\tctx: ExtensionCommandContext,\n\t): DelegationLineupSlot[] | undefined {\n\t\tconst normalized: DelegationLineupSlot[] = [];\n\t\tfor (const slot of slots) {\n\t\t\tconst slotCwd = slot.cwd ? resolveCompareCwd(slot.cwd, ctx) : defaultCwd;\n\t\t\tif (!existsSync(slotCwd)) {\n\t\t\t\tnotify(ctx, `cwd directory does not exist: ${slotCwd}`, \"error\");\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tnormalized.push({\n\t\t\t\t...slot,\n\t\t\t\tcwd: slotCwd,\n\t\t\t});\n\t\t}\n\t\treturn normalized;\n\t}\n\n\tfunction formatCompareSlotLabel(slot: DelegationLineupSlot, fallbackAgent: string): string {\n\t\treturn slot.model ? `${fallbackAgent}, ${slot.model}` : fallbackAgent;\n\t}\n\n\tfunction renderComparePhaseResults(\n\t\tlabel: string,\n\t\tentries: Array<{ index: number; slot: DelegationLineupSlot; result: DelegatedPromptParallelResult }>,\n\t): string {\n\t\treturn entries\n\t\t\t.map(({ index, slot, result }) => {\n\t\t\t\tconst body = result.text || \"(no assistant text)\";\n\t\t\t\treturn `=== ${label} ${index + 1} (${formatCompareSlotLabel(slot, result.agent)}) ===\\n${body}`;\n\t\t\t})\n\t\t\t.join(\"\\n\\n\");\n\t}\n\n\tfunction formatPhaseFailureSummary(\n\t\tlabel: string,\n\t\tentries: Array<{ index: number; slot: DelegationLineupSlot; result: DelegatedPromptParallelResult }>,\n\t): string | undefined {\n\t\tif (entries.length === 0) return undefined;\n\t\treturn [\n\t\t\t`[${label} failures]`,\n\t\t\t...entries.map(({ index, slot, result }) =>\n\t\t\t\t`- ${label} ${index + 1} (${formatCompareSlotLabel(slot, result.agent)}): ${result.errorText || \"unknown delegated error\"}`,\n\t\t\t),\n\t\t].join(\"\\n\");\n\t}\n\n\tfunction extractSuccessfulWorktreeChanges(aggregateText: string | undefined, successfulIndexes: number[]): string | undefined {\n\t\tif (!aggregateText) return undefined;\n\t\tconst marker = \"=== Worktree Changes ===\";\n\t\tconst markerIndex = aggregateText.indexOf(marker);\n\t\tif (markerIndex < 0) return undefined;\n\t\tconst worktreeText = aggregateText.slice(markerIndex + marker.length).trim();\n\t\tif (!worktreeText) return undefined;\n\t\tconst successfulTaskNumbers = new Set(successfulIndexes.map((index) => index + 1));\n\t\tconst sections = worktreeText\n\t\t\t.split(/\\n(?=--- Task \\d+ \\()/)\n\t\t\t.map((section) => section.trim())\n\t\t\t.filter(Boolean)\n\t\t\t.filter((section) => {\n\t\t\t\tconst match = section.match(/^--- Task (\\d+) \\(/);\n\t\t\t\treturn match ? successfulTaskNumbers.has(parseInt(match[1]!, 10)) : false;\n\t\t\t});\n\t\tif (sections.length === 0) return undefined;\n\t\treturn `${marker}\\n\\n${sections.join(\"\\n\\n\")}`;\n\t}\n\n\tfunction buildReviewerPreamble(sharedTask: string, workerAggregation: string, workerFailureSummary?: string): string {\n\t\treturn [\n\t\t\t\"[Original implementation task]\",\n\t\t\tsharedTask,\n\t\t\t\"\",\n\t\t\t\"[Worker outputs and worktree summaries]\",\n\t\t\tworkerAggregation,\n\t\t\t...(workerFailureSummary ? [\"\", workerFailureSummary] : []),\n\t\t].join(\"\\n\");\n\t}\n\n\tfunction buildFinalApplierPreamble(\n\t\tsharedTask: string,\n\t\tworkerAggregation: string,\n\t\tworkerFailureSummary?: string,\n\t\treviewerAggregation?: string,\n\t\treviewerFailureSummary?: string,\n\t): string {\n\t\treturn [\n\t\t\t\"[Original implementation task]\",\n\t\t\tsharedTask,\n\t\t\t\"\",\n\t\t\t\"[Worker outputs and worktree summaries]\",\n\t\t\tworkerAggregation,\n\t\t\t...(workerFailureSummary ? [\"\", workerFailureSummary] : []),\n\t\t\t\"\",\n\t\t\t\"[Reviewer findings]\",\n\t\t\treviewerAggregation ?? \"All reviewer runs failed. Synthesize directly from the worker variants.\",\n\t\t\t...(reviewerFailureSummary ? [\"\", reviewerFailureSummary] : []),\n\t\t\t\"\",\n\t\t\t\"[Final apply instructions]\",\n\t\t\t\"Pick one winner or synthesize/cherry-pick from multiple variants, apply the final patch directly in the current repo, keep edits minimal, run obvious relevant verification when practical, and report changed files plus verification run.\",\n\t\t].join(\"\\n\");\n\t}\n\n\tfunction buildLineupSlotTask(\n\t\tbaseTask: string,\n\t\tslot: DelegationLineupSlot,\n\t\ttaskArgs: string[],\n\t): string {\n\t\tconst effectiveBaseTask = slot.task ? substituteArgs(slot.task, taskArgs) : baseTask;\n\t\tif (!slot.taskSuffix) return effectiveBaseTask;\n\t\treturn `${effectiveBaseTask}\\n\\n${substituteArgs(slot.taskSuffix, taskArgs)}`;\n\t}\n\n\tfunction buildComparePrompt(\n\t\tbase: PromptWithModel,\n\t\toptions: {\n\t\t\tname: string;\n\t\t\tagent: string;\n\t\t\ttask: string;\n\t\t\tmodel?: string;\n\t\t\tcwd: string;\n\t\t\tinheritContext?: boolean;\n\t\t},\n\t): PromptWithModel {\n\t\treturn {\n\t\t\t...base,\n\t\t\tname: options.name,\n\t\t\tcontent: options.task,\n\t\t\tmodels: options.model ? [options.model] : [],\n\t\t\tchain: undefined,\n\t\t\tchainContext: undefined,\n\t\t\tparallel: undefined,\n\t\t\tworktree: undefined,\n\t\t\tsubagent: options.agent,\n\t\t\tinheritContext: options.inheritContext ? true : undefined,\n\t\t\tcwd: options.cwd,\n\t\t\tworkers: undefined,\n\t\t\treviewers: undefined,\n\t\t\tfinalApplier: undefined,\n\t\t};\n\t}\n\n\tasync function runComparePrompt(\n\t\tname: string,\n\t\tprompt: PromptWithModel,\n\t\targs: string,\n\t\tctx: ExtensionCommandContext,\n\t\tcurrentModel: Model<any> | undefined,\n\t\truntime: { cwd?: string; model?: string; subagentOverride?: SubagentOverride; fork?: boolean },\n\t) {\n\t\tif (runtime.subagentOverride) {\n\t\t\tnotify(ctx, `--subagent is not supported for compare prompts (ignored)`, \"warning\");\n\t\t}\n\t\tif (runtime.fork) {\n\t\t\tnotify(ctx, `--fork is not supported for compare prompts (ignored)`, \"warning\");\n\t\t}\n\n\t\tconst lineupExtraction = extractLineupOverrides(args);\n\t\tif (lineupExtraction.errors.length > 0) {\n\t\t\tfor (const error of lineupExtraction.errors) {\n\t\t\t\tnotify(ctx, error, \"error\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet taskArgs = parseCommandArgs(lineupExtraction.args);\n\t\tlet compareCwd = runtime.cwd ?? prompt.cwd ?? ctx.cwd;\n\t\tif (name === \"parallel-patch-compare-at-path\") {\n\t\t\tif (taskArgs.length === 0) {\n\t\t\t\tnotify(ctx, \"parallel-patch-compare-at-path requires a repo path as the first argument.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (runtime.cwd) {\n\t\t\t\tnotify(ctx, \"--cwd is ignored for parallel-patch-compare-at-path (using first positional path).\", \"warning\");\n\t\t\t}\n\t\t\tcompareCwd = resolveCompareCwd(taskArgs[0]!, ctx);\n\t\t\ttaskArgs = taskArgs.slice(1);\n\t\t\tif (taskArgs.length === 0) {\n\t\t\t\tnotify(ctx, \"parallel-patch-compare-at-path requires an implementation task after the repo path.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!existsSync(compareCwd)) {\n\t\t\tnotify(ctx, `cwd directory does not exist: ${compareCwd}`, \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst baseModel = await resolveCompareBaseModel(prompt, currentModel, ctx, runtime.model);\n\t\tif (!baseModel) return;\n\n\t\tconst rendered = renderPromptForResolvedModel(prompt, taskArgs, baseModel);\n\t\tif (rendered.warning) notify(ctx, rendered.warning, \"warning\");\n\t\tif (rendered.empty || !rendered.content) {\n\t\t\tnotify(ctx, rendered.empty ?? `Prompt \\`${prompt.name}\\` rendered to an empty message.`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst sharedTask = rendered.content;\n\n\t\tconst requestedWorkers = applyLineupActions(prompt.workers, lineupExtraction.actions, \"workers\") ?? [];\n\t\tconst requestedReviewers = applyLineupActions(prompt.reviewers, lineupExtraction.actions, \"reviewers\") ?? [];\n\t\tconst requestedFinalApplier = applyFinalApplierAction(prompt.finalApplier, lineupExtraction.actions);\n\t\tif (requestedFinalApplier && prompt.worktree !== true) {\n\t\t\tnotify(ctx, \"Compare prompts with finalApplier require worktree: true.\", \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst workerSlots = expandLineupCounts(\n\t\t\trequestedWorkers.length > 0\n\t\t\t\t? requestedWorkers\n\t\t\t\t: [{ agent: DEFAULT_SUBAGENT_NAME }],\n\t\t);\n\t\tconst reviewerSlots = expandLineupCounts(\n\t\t\trequestedReviewers.length > 0\n\t\t\t\t? requestedReviewers\n\t\t\t\t: [{ agent: \"reviewer\" }],\n\t\t);\n\n\t\tconst normalizedWorkers = normalizeLineupCwds(workerSlots, compareCwd, ctx);\n\t\tif (!normalizedWorkers) return;\n\t\tconst normalizedReviewers = normalizeLineupCwds(reviewerSlots, compareCwd, ctx);\n\t\tif (!normalizedReviewers) return;\n\t\tconst normalizedFinalApplier = requestedFinalApplier\n\t\t\t? {\n\t\t\t\t...requestedFinalApplier,\n\t\t\t\tcwd: compareCwd,\n\t\t\t}\n\t\t\t: undefined;\n\n\t\tif (prompt.worktree === true) {\n\t\t\tconst uniqueWorkerCwds = new Set(normalizedWorkers.map((slot) => slot.cwd));\n\t\t\tif (uniqueWorkerCwds.size > 1) {\n\t\t\t\tnotify(ctx, \"worktree compare runs require all worker slots to use the same cwd.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workerResult = await executeSubagentPromptStep({\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcurrentModel: baseModel,\n\t\t\t\tsignal: ctx.signal,\n\t\t\t\tworktree: prompt.worktree === true,\n\t\t\t\tallowPartialFailures: true,\n\t\t\t\tparallel: normalizedWorkers.map((slot, index) => ({\n\t\t\t\t\tprompt: buildComparePrompt(prompt, {\n\t\t\t\t\t\tname: `${prompt.name}-worker-${index + 1}`,\n\t\t\t\t\t\tagent: slot.agent,\n\t\t\t\t\t\ttask: buildLineupSlotTask(sharedTask, slot, taskArgs),\n\t\t\t\t\t\tmodel: slot.model,\n\t\t\t\t\t\tcwd: slot.cwd!,\n\t\t\t\t\t\tinheritContext: true,\n\t\t\t\t\t}),\n\t\t\t\t\targs: [],\n\t\t\t\t})),\n\t\t\t});\n\t\t\tconst workerPairs = (workerResult?.parallelResults ?? []).map((result, index) => ({\n\t\t\t\tindex,\n\t\t\t\tslot: normalizedWorkers[index]!,\n\t\t\t\tresult,\n\t\t\t}));\n\t\t\tif (workerPairs.length === 0) return;\n\t\t\tconst successfulWorkers = workerPairs.filter((entry) => !entry.result.isError);\n\t\t\tconst failedWorkers = workerPairs.filter((entry) => entry.result.isError);\n\t\t\tif (successfulWorkers.length === 0) {\n\t\t\t\tnotify(ctx, `Compare worker phase failed: all worker slots failed.`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst successfulWorkerText = [\n\t\t\t\trenderComparePhaseResults(\"Worker\", successfulWorkers),\n\t\t\t\textractSuccessfulWorktreeChanges(workerResult.text, successfulWorkers.map((entry) => entry.index)),\n\t\t\t]\n\t\t\t\t.filter((value): value is string => Boolean(value))\n\t\t\t\t.join(\"\\n\\n\");\n\t\t\tconst workerFailureSummary = formatPhaseFailureSummary(\"Worker\", failedWorkers);\n\n\t\t\tconst reviewerPreamble = buildReviewerPreamble(sharedTask, successfulWorkerText, workerFailureSummary);\n\t\t\tconst reviewerResult = await executeSubagentPromptStep({\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcurrentModel: baseModel,\n\t\t\t\tsignal: ctx.signal,\n\t\t\t\ttaskPreamble: reviewerPreamble,\n\t\t\t\tallowPartialFailures: true,\n\t\t\t\tparallel: normalizedReviewers.map((slot, index) => ({\n\t\t\t\t\tprompt: buildComparePrompt(prompt, {\n\t\t\t\t\t\tname: `${prompt.name}-reviewer-${index + 1}`,\n\t\t\t\t\t\tagent: slot.agent,\n\t\t\t\t\t\ttask: buildLineupSlotTask(DEFAULT_COMPARE_REVIEWER_TASK, slot, taskArgs),\n\t\t\t\t\t\tmodel: slot.model,\n\t\t\t\t\t\tcwd: slot.cwd!,\n\t\t\t\t\t\tinheritContext: false,\n\t\t\t\t\t}),\n\t\t\t\t\targs: [],\n\t\t\t\t})),\n\t\t\t});\n\t\t\tconst reviewerPairs = (reviewerResult?.parallelResults ?? []).map((result, index) => ({\n\t\t\t\tindex,\n\t\t\t\tslot: normalizedReviewers[index]!,\n\t\t\t\tresult,\n\t\t\t}));\n\t\t\tif (reviewerPairs.length === 0) return;\n\t\t\tconst successfulReviewers = reviewerPairs.filter((entry) => !entry.result.isError);\n\t\t\tconst failedReviewers = reviewerPairs.filter((entry) => entry.result.isError);\n\t\t\tconst successfulReviewerText = successfulReviewers.length > 0\n\t\t\t\t? renderComparePhaseResults(\"Reviewer\", successfulReviewers)\n\t\t\t\t: undefined;\n\t\t\tconst reviewerFailureSummary = formatPhaseFailureSummary(\"Reviewer\", failedReviewers);\n\n\t\t\tif (!normalizedFinalApplier) {\n\t\t\t\tif (!successfulReviewerText) {\n\t\t\t\t\tnotify(ctx, `Compare reviewer phase failed: all reviewer slots failed.`, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst finalText = reviewerFailureSummary\n\t\t\t\t\t? `${successfulReviewerText}\\n\\n${reviewerFailureSummary}`\n\t\t\t\t\t: successfulReviewerText;\n\t\t\t\tpi.sendUserMessage(`[Compare review complete: ${name}]\\n\\n${finalText}`);\n\t\t\t\tawait waitForTurnStart(ctx);\n\t\t\t\tawait ctx.waitForIdle();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst finalResult = await executeSubagentPromptStep({\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcurrentModel: baseModel,\n\t\t\t\tsignal: ctx.signal,\n\t\t\t\ttaskPreamble: buildFinalApplierPreamble(\n\t\t\t\t\tsharedTask,\n\t\t\t\t\tsuccessfulWorkerText,\n\t\t\t\t\tworkerFailureSummary,\n\t\t\t\t\tsuccessfulReviewerText,\n\t\t\t\t\treviewerFailureSummary,\n\t\t\t\t),\n\t\t\t\tprompt: buildComparePrompt(prompt, {\n\t\t\t\t\tname: `${prompt.name}-final-applier`,\n\t\t\t\t\tagent: normalizedFinalApplier.agent,\n\t\t\t\t\ttask: buildLineupSlotTask(DEFAULT_COMPARE_FINAL_APPLIER_TASK, normalizedFinalApplier, taskArgs),\n\t\t\t\t\tmodel: normalizedFinalApplier.model,\n\t\t\t\t\tcwd: compareCwd,\n\t\t\t\t\tinheritContext: false,\n\t\t\t\t}),\n\t\t\t\targs: [],\n\t\t\t});\n\t\t\tif (!finalResult?.text) return;\n\t\t\tpi.sendUserMessage(`[Compare apply complete: ${name}]\\n\\n${finalResult.text}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t} catch (error) {\n\t\t\tnotify(ctx, error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t}\n\n\tasync function collapseBoomerangPrompt(\n\t\tctx: ExtensionContext,\n\t\tname: string,\n\t\ttargetId: string | null,\n\t\tpreviousSummaries: string[] = [],\n\t) {\n\t\tif (!targetId) {\n\t\t\tnotify(ctx, `Cannot boomerang prompt \\`${name}\\`: no session entry to return to.`, \"warning\");\n\t\t\treturn;\n\t\t}\n\n\t\tboomerangCollapse = { targetId, task: name, previousSummaries };\n\t\ttry {\n\t\t\t(globalThis as typeof globalThis & { __boomerangCollapseInProgress?: boolean }).__boomerangCollapseInProgress = true;\n\t\t\tconst result = await ctx.navigateTree(targetId, { summarize: true });\n\t\t\tif (result.cancelled) notify(ctx, `Boomerang cancelled for prompt \\`${name}\\``, \"warning\");\n\t\t} finally {\n\t\t\t(globalThis as typeof globalThis & { __boomerangCollapseInProgress?: boolean }).__boomerangCollapseInProgress = false;\n\t\t\tboomerangCollapse = null;\n\t\t}\n\t}\n\n\tasync function runPromptLoop(\n\t\tname: string,\n\t\tcleanedArgs: string,\n\t\ttotalIterations: number | null,\n\t\tfreshFlag: boolean,\n\t\tconverge: boolean,\n\t\tctx: ExtensionCommandContext,\n\t\tsubagentOverride?: SubagentOverride,\n\t\tcwdOverride?: string,\n\t\tpromptOverrides?: Partial<Pick<PromptWithModel, \"models\" | \"inheritContext\">>,\n\t) {\n\t\trefreshPrompts(ctx.cwd, ctx);\n\t\tconst initialPrompt = prompts.get(name);\n\t\tif (!initialPrompt) {\n\t\t\tnotify(ctx, `Prompt \"${name}\" no longer exists`, \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst savedModel = getCurrentModel(ctx);\n\t\tconst savedThinking = pi.getThinkingLevel();\n\t\tlet currentModel = savedModel;\n\t\tlet currentThinking = savedThinking;\n\t\tconst shouldRestore = initialPrompt.restore;\n\t\tconst useFresh = freshFlag || initialPrompt.fresh === true;\n\t\tconst shouldBoomerang = initialPrompt.boomerang === true;\n\t\tconst effectiveMax = totalIterations ?? UNLIMITED_LOOP_CAP;\n\t\tconst isUnlimited = totalIterations === null;\n\t\tconst useConverge = converge && initialPrompt.converge !== false;\n\t\tconst anchorId = useFresh || shouldBoomerang ? ctx.sessionManager.getLeafId() : null;\n\n\t\tloopState = { currentIteration: 1, totalIterations };\n\t\taccumulatedSummaries = [];\n\t\tupdateLoopStatus(ctx);\n\t\tlet completedIterations = 0;\n\t\tlet converged = false;\n\t\tlet loopErrorState: ExecutionErrorState = { hasError: false, error: undefined };\n\t\tlet lastDelegatedText: string | undefined;\n\t\tlet loopAborted = false;\n\t\tlet boomerangPreviousSummaries: string[] = [];\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < effectiveMax; i++) {\n\t\t\t\tloopState.currentIteration = i + 1;\n\t\t\t\tconst iterationLabel = totalIterations !== null ? `${i + 1}/${totalIterations}` : `${i + 1}`;\n\n\t\t\t\trefreshPrompts(ctx.cwd, ctx);\n\t\t\t\tconst prompt = prompts.get(name);\n\t\t\t\tif (!prompt) {\n\t\t\t\t\tnotify(ctx, `Prompt \"${name}\" no longer exists`, \"error\");\n\t\t\t\t\tloopAborted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst effectivePrompt = { ...prompt, ...(cwdOverride ? { cwd: cwdOverride } : {}), ...promptOverrides };\n\t\t\t\tlet iterationPrompt = effectivePrompt;\n\t\t\t\tloopState!.rotationLabel = undefined;\n\t\t\t\tif (effectivePrompt.rotate && effectivePrompt.models.length > 1) {\n\t\t\t\t\tconst rotationIndex = i % effectivePrompt.models.length;\n\t\t\t\t\tconst rotatedThinking = effectivePrompt.thinkingLevels\n\t\t\t\t\t\t? effectivePrompt.thinkingLevels[rotationIndex]\n\t\t\t\t\t\t: effectivePrompt.thinking;\n\t\t\t\t\titerationPrompt = {\n\t\t\t\t\t\t...effectivePrompt,\n\t\t\t\t\t\tmodels: [effectivePrompt.models[rotationIndex]],\n\t\t\t\t\t\tthinking: rotatedThinking,\n\t\t\t\t\t};\n\t\t\t\t\tconst shortModel = effectivePrompt.models[rotationIndex].split(\"/\").pop() || effectivePrompt.models[rotationIndex];\n\t\t\t\t\tconst thinkingLabel = rotatedThinking ? ` ${rotatedThinking}` : \"\";\n\t\t\t\t\tloopState!.rotationLabel = `${shortModel}${thinkingLabel}`;\n\t\t\t\t}\n\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\tconst rotationSuffix = loopState!.rotationLabel ? ` [${loopState!.rotationLabel}]` : \"\";\n\t\t\t\tnotify(ctx, `Loop ${iterationLabel}: ${name}${rotationSuffix}`, \"info\");\n\n\t\t\t\tconst loopContext = loopState!.rotationLabel\n\t\t\t\t\t? `Loop ${iterationLabel} · ${loopState!.rotationLabel}`\n\t\t\t\t\t: `Loop ${iterationLabel}`;\n\t\t\t\tconst iterationStartId = ctx.sessionManager.getLeafId();\n\t\t\t\tconst stepResult = await executePromptStep(\n\t\t\t\t\titerationPrompt,\n\t\t\t\t\tparseCommandArgs(cleanedArgs),\n\t\t\t\t\tctx,\n\t\t\t\t\tcurrentModel,\n\t\t\t\t\tsubagentOverride,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tloopContext,\n\t\t\t\t);\n\t\t\t\tif (stepResult === \"aborted\") {\n\t\t\t\t\tloopAborted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst delegatedStep = shouldDelegatePrompt(iterationPrompt, subagentOverride);\n\t\t\t\tif (delegatedStep) {\n\t\t\t\t\tlastDelegatedText = stepResult.text;\n\t\t\t\t}\n\n\t\t\t\tcurrentModel = getCurrentModel(ctx);\n\t\t\t\tcurrentThinking = pi.getThinkingLevel();\n\t\t\t\tcompletedIterations++;\n\n\t\t\t\tconst iterationChanged = delegatedStep\n\t\t\t\t\t? stepResult.changed\n\t\t\t\t\t: didIterationMakeChanges(getIterationEntries(ctx, iterationStartId));\n\t\t\t\tif (useConverge && (isUnlimited || effectiveMax > 1) && !iterationChanged) {\n\t\t\t\t\tconverged = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (useFresh && anchorId && i < effectiveMax - 1) {\n\t\t\t\t\tfreshCollapse = { targetId: anchorId, task: name, iteration: i + 1, totalIterations };\n\t\t\t\t\tconst result = await ctx.navigateTree(anchorId, { summarize: true });\n\t\t\t\t\tfreshCollapse = null;\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\tloopAborted = true;\n\t\t\t\t\t\tnotify(ctx, \"Loop cancelled\", \"warning\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tloopErrorState = { hasError: true, error };\n\t\t} finally {\n\t\t\tloopErrorState = await restoreAfterExecution(\n\t\t\t\tctx,\n\t\t\t\tshouldRestore,\n\t\t\t\tsavedModel,\n\t\t\t\tsavedThinking,\n\t\t\t\tgetCurrentModel(ctx),\n\t\t\t\tpi.getThinkingLevel(),\n\t\t\t\tloopErrorState,\n\t\t\t\t\"loop\",\n\t\t\t);\n\n\t\t\tboomerangPreviousSummaries = accumulatedSummaries;\n\t\t\tloopState = null;\n\t\t\tpendingSkillMessage = undefined;\n\t\t\tfreshCollapse = null;\n\t\t\tboomerangCollapse = null;\n\t\t\taccumulatedSummaries = [];\n\t\t\tupdateLoopStatus(ctx);\n\n\t\t\tif (!loopErrorState.hasError) {\n\t\t\t\tnotifyLoopCompletion(ctx, completedIterations, totalIterations, effectiveMax, converged, false);\n\t\t\t}\n\t\t}\n\n\t\tif (lastDelegatedText && !loopErrorState.hasError && !loopAborted) {\n\t\t\tconst label = converged\n\t\t\t\t? `Delegated loop converged after ${completedIterations} iteration(s): ${name}`\n\t\t\t\t: `Delegated loop completed ${completedIterations} iteration(s): ${name}`;\n\t\t\tpi.sendUserMessage(`[${label}]\\n\\n${lastDelegatedText}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t}\n\n\t\tif (!loopErrorState.hasError && !loopAborted && shouldBoomerang) {\n\t\t\tawait collapseBoomerangPrompt(ctx, name, anchorId, boomerangPreviousSummaries);\n\t\t}\n\n\t\tif (loopErrorState.hasError) {\n\t\t\tthrow loopErrorState.error;\n\t\t}\n\t}\n\n\tasync function runSharedChainExecution(\n\t\tsteps: ChainStepOrParallel[],\n\t\tsharedArgs: string[],\n\t\ttotalIterations: number | null,\n\t\tfresh: boolean,\n\t\tconverge: boolean,\n\t\tshouldRestore: boolean,\n\t\tctx: ExtensionCommandContext,\n\t\tsubagentOverride?: SubagentOverride,\n\t\tcwdOverride?: string,\n\t\tchainContextEnabled = false,\n\t\tchainTemplateWorktree = false,\n\t\tcliWorktree = false,\n\t) {\n\t\tlet worktreeEnabled = chainTemplateWorktree || cliWorktree;\n\t\tif (worktreeEnabled && !steps.some(isParallelChainStep)) {\n\t\t\tnotify(ctx, `--worktree ignored: chain has no parallel() steps`, \"warning\");\n\t\t\tworktreeEnabled = false;\n\t\t}\n\t\tconst flattenChainSteps = (): ChainStep[] => {\n\t\t\tconst flattened: ChainStep[] = [];\n\t\t\tfor (const step of steps) {\n\t\t\t\tif (isParallelChainStep(step)) {\n\t\t\t\t\tflattened.push(...step.parallel);\n\t\t\t\t} else {\n\t\t\t\t\tflattened.push(step);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn flattened;\n\t\t};\n\n\t\tconst validateChainSteps = (): boolean => {\n\t\t\tconst flattened = flattenChainSteps();\n\t\t\tconst missingTemplates = flattened.filter((step) => !chainPrompts.has(step.name));\n\t\t\tif (missingTemplates.length > 0) {\n\t\t\t\tnotify(ctx, `Templates not found: ${missingTemplates.map((step) => step.name).join(\", \")}`, \"error\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor (const step of steps) {\n\t\t\t\tif (isParallelChainStep(step)) {\n\t\t\t\t\tfor (const parallelStep of step.parallel) {\n\t\t\t\t\t\tif (parallelStep.loopCount !== undefined) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" in parallel() does not support per-task --loop.`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (parallelStep.withContext === true) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" in parallel() does not support per-task --with-context.`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst stepPrompt = chainPrompts.get(parallelStep.name);\n\t\t\t\t\t\tif (!stepPrompt) continue;\n\t\t\t\t\t\tif (stepPrompt.chain) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" is a chain template. Chain nesting is not supported.`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!shouldDelegatePrompt(stepPrompt, subagentOverride)) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" in parallel() must use delegated execution (subagent).`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst stepPrompt = chainPrompts.get(step.name);\n\t\t\t\tif (!stepPrompt) continue;\n\t\t\t\tif (stepPrompt.chain) {\n\t\t\t\t\tnotify(ctx, `Step \"${step.name}\" is a chain template. Chain nesting is not supported.`, \"error\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tif (!validateChainSteps()) return;\n\n\t\tconst originalModel = getCurrentModel(ctx);\n\t\tconst chainInheritedModel = originalModel;\n\t\tconst originalThinking = pi.getThinkingLevel();\n\t\tlet currentModel = originalModel;\n\t\tlet currentThinking = originalThinking;\n\t\tchainActive = true;\n\t\tpendingSkillMessage = undefined;\n\t\tconst effectiveMax = totalIterations ?? UNLIMITED_LOOP_CAP;\n\t\tconst isUnlimited = totalIterations === null;\n\t\tconst useConverge = converge;\n\n\t\tconst anchorId = fresh ? ctx.sessionManager.getLeafId() : null;\n\t\tconst chainStepNames = steps\n\t\t\t.map((step) => (isParallelChainStep(step) ? `parallel(${step.parallel.map((item) => item.name).join(\", \")})` : step.name))\n\t\t\t.join(\" -> \");\n\t\tlet completedIterations = 0;\n\t\tlet converged = false;\n\t\tlet chainErrorState: ExecutionErrorState = { hasError: false, error: undefined };\n\t\tlet lastDelegatedText: string | undefined;\n\t\tlet chainAborted = false;\n\t\tif (effectiveMax > 1) {\n\t\t\tloopState = { currentIteration: 1, totalIterations };\n\t\t\taccumulatedSummaries = [];\n\t\t\tupdateLoopStatus(ctx);\n\t\t}\n\n\t\ttry {\n\t\t\tfor (let iteration = 0; iteration < effectiveMax; iteration++) {\n\t\t\t\tif (effectiveMax > 1) {\n\t\t\t\t\tloopState!.currentIteration = iteration + 1;\n\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\trefreshPrompts(ctx.cwd, ctx);\n\t\t\t\t\tif (!validateChainSteps()) {\n\t\t\t\t\t\tchainAborted = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst templates = steps.map((step) =>\n\t\t\t\t\tisParallelChainStep(step)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tkind: \"parallel\" as const,\n\t\t\t\t\t\t\ttasks: step.parallel.map((item) => ({\n\t\t\t\t\t\t\t\tname: item.name,\n\t\t\t\t\t\t\t\targs: item.args,\n\t\t\t\t\t\t\t\tprompt: {\n\t\t\t\t\t\t\t\t\t...chainPrompts.get(item.name)!,\n\t\t\t\t\t\t\t\t\t...(cwdOverride ? { cwd: cwdOverride } : {}),\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\t: {\n\t\t\t\t\t\t\tkind: \"single\" as const,\n\t\t\t\t\t\t\tsingleStep: {\n\t\t\t\t\t\t\t\tprompt: {\n\t\t\t\t\t\t\t\t\t...chainPrompts.get(step.name)!,\n\t\t\t\t\t\t\t\t\t...(cwdOverride ? { cwd: cwdOverride } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstepArgs: step.args,\n\t\t\t\t\t\t\t\tstepLoop: step.loopCount !== undefined ? step.loopCount : 1,\n\t\t\t\t\t\t\t\tstepWithContext: step.withContext === true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst chainStepSummaries: string[] = [];\n\t\t\t\tlet aborted = false;\n\t\t\t\tlet iterationChanged = false;\n\t\t\t\tlet loopPrefix = \"\";\n\t\t\t\tif (effectiveMax > 1) {\n\t\t\t\t\tconst label = totalIterations !== null ? `${iteration + 1}/${totalIterations}` : `${iteration + 1}`;\n\t\t\t\t\tloopPrefix = `Loop ${label}, `;\n\t\t\t\t}\n\n\t\t\t\tfor (const [index, stepTemplate] of templates.entries()) {\n\t\t\t\t\tconst stepNumber = index + 1;\n\t\t\t\t\tif (stepTemplate.kind === \"parallel\") {\n\t\t\t\t\t\tconst stepNames = stepTemplate.tasks.map((task) => task.name).join(\", \");\n\t\t\t\t\t\tconst stepLabel = `parallel(${stepNames})`;\n\t\t\t\t\t\tnotify(ctx, `${loopPrefix}Step ${stepNumber}/${templates.length}: parallel(${stepNames})`, \"info\");\n\t\t\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\t\t\tctx.ui.setStatus(\"prompt-chain\", ctx.ui.theme.fg(\"warning\", `step ${stepNumber}/${templates.length}: parallel(${stepNames})`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst stepStartId = ctx.sessionManager.getLeafId();\n\t\t\t\t\t\tlet taskPreamble: string | undefined;\n\t\t\t\t\t\tconst isForkedParallelContext = stepTemplate.tasks.some((task) => task.prompt.inheritContext === true);\n\t\t\t\t\t\tif (chainContextEnabled && !isForkedParallelContext && chainStepSummaries.length > 0) {\n\t\t\t\t\t\t\ttaskPreamble = `[Previous chain steps]\\n\\n${chainStepSummaries.join(\"\\n\\n\")}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet delegated;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdelegated = await executeSubagentPromptStep({\n\t\t\t\t\t\t\t\tpi,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\t\toverride: subagentOverride,\n\t\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\t\tinheritedModel: chainInheritedModel,\n\t\t\t\t\t\t\t\tparallel: stepTemplate.tasks.map((task) => ({\n\t\t\t\t\t\t\t\t\tprompt: task.prompt,\n\t\t\t\t\t\t\t\t\targs: task.args.length > 0 ? task.args : sharedArgs,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\ttaskPreamble,\n\t\t\t\t\t\t\t\tworktree: worktreeEnabled,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tnotify(ctx, error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!delegated) {\n\t\t\t\t\t\t\tnotify(ctx, \"Parallel chain step was not delegated.\", \"error\");\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastDelegatedText = delegated.text;\n\n\t\t\t\t\t\tcurrentModel = getCurrentModel(ctx);\n\t\t\t\t\t\tcurrentThinking = pi.getThinkingLevel();\n\t\t\t\t\t\tconst stepEntries = getIterationEntries(ctx, stepStartId);\n\t\t\t\t\t\tif (delegated.changed) iterationChanged = true;\n\t\t\t\t\t\tchainStepSummaries.push(generateChainStepSummary(stepEntries, stepLabel, stepNumber));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst singleStep = stepTemplate.singleStep;\n\t\t\t\t\tconst stepLoopTotal = singleStep.stepLoop;\n\t\t\t\t\tconst stepLoopMax = stepLoopTotal ?? UNLIMITED_LOOP_CAP;\n\t\t\t\t\tconst isStepLooping = stepLoopMax > 1;\n\t\t\t\t\tconst effectiveArgs = singleStep.stepArgs.length > 0 ? singleStep.stepArgs : sharedArgs;\n\t\t\t\t\tconst shouldInjectSummary =\n\t\t\t\t\t\tshouldDelegatePrompt(singleStep.prompt, subagentOverride) &&\n\t\t\t\t\t\tsingleStep.prompt.inheritContext !== true &&\n\t\t\t\t\t\t(chainContextEnabled || singleStep.stepWithContext === true);\n\t\t\t\t\tconst outerLoopState = loopState ? { ...loopState } : null;\n\t\t\t\t\tconst stepStartId = ctx.sessionManager.getLeafId();\n\t\t\t\t\tif (isStepLooping) {\n\t\t\t\t\t\tloopState = { currentIteration: 1, totalIterations: stepLoopTotal };\n\t\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (let stepIteration = 0; stepIteration < stepLoopMax; stepIteration++) {\n\t\t\t\t\t\t\tif (isStepLooping) {\n\t\t\t\t\t\t\t\tloopState = { currentIteration: stepIteration + 1, totalIterations: stepLoopTotal };\n\t\t\t\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst iterSuffix = isStepLooping\n\t\t\t\t\t\t\t\t? stepLoopTotal !== null\n\t\t\t\t\t\t\t\t\t? ` (iter ${stepIteration + 1}/${stepLoopTotal})`\n\t\t\t\t\t\t\t\t\t: ` (iter ${stepIteration + 1})`\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tnotify(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t`${loopPrefix}Step ${stepNumber}/${templates.length}: ${singleStep.prompt.name}${iterSuffix} ${buildPromptCommandDescription(singleStep.prompt)}`,\n\t\t\t\t\t\t\t\t\"info\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\t\t\t\tctx.ui.setStatus(\"prompt-chain\", ctx.ui.theme.fg(\"warning\", `step ${stepNumber}/${templates.length}: ${singleStep.prompt.name}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst taskPreamble = shouldInjectSummary && chainStepSummaries.length > 0\n\t\t\t\t\t\t\t\t? `[Previous chain steps]\\n\\n${chainStepSummaries.join(\"\\n\\n\")}`\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\tconst stepLoopContext = isStepLooping\n\t\t\t\t\t\t\t\t? `Step ${stepNumber}/${templates.length}: ${singleStep.prompt.name}${iterSuffix}`\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\tconst stepIterationStartId = ctx.sessionManager.getLeafId();\n\t\t\t\t\t\t\tconst stepResult = await executePromptStep(\n\t\t\t\t\t\t\t\tsingleStep.prompt,\n\t\t\t\t\t\t\t\teffectiveArgs,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\t\tsubagentOverride,\n\t\t\t\t\t\t\t\tchainInheritedModel,\n\t\t\t\t\t\t\t\ttaskPreamble,\n\t\t\t\t\t\t\t\tstepLoopContext,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (stepResult === \"aborted\") {\n\t\t\t\t\t\t\t\tchainAborted = true;\n\t\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (shouldDelegatePrompt(singleStep.prompt, subagentOverride)) {\n\t\t\t\t\t\t\t\tlastDelegatedText = stepResult.text;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcurrentModel = getCurrentModel(ctx);\n\t\t\t\t\t\t\tcurrentThinking = pi.getThinkingLevel();\n\n\t\t\t\t\t\t\tconst stepIterationEntries = getIterationEntries(ctx, stepIterationStartId);\n\t\t\t\t\t\t\tconst stepIterationChanged = didIterationMakeChanges(stepIterationEntries);\n\t\t\t\t\t\t\tif (isStepLooping && singleStep.prompt.converge !== false && !stepIterationChanged) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (isStepLooping) {\n\t\t\t\t\t\t\tloopState = outerLoopState ? { ...outerLoopState } : null;\n\t\t\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (aborted) break;\n\t\t\t\t\tconst stepEntries = getIterationEntries(ctx, stepStartId);\n\t\t\t\t\tif (didIterationMakeChanges(stepEntries)) iterationChanged = true;\n\t\t\t\t\tchainStepSummaries.push(generateChainStepSummary(stepEntries, singleStep.prompt.name, stepNumber));\n\t\t\t\t}\n\n\t\t\t\tif (aborted) {\n\t\t\t\t\tchainAborted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcompletedIterations++;\n\n\t\t\t\tif (useConverge && (isUnlimited || effectiveMax > 1) && !iterationChanged) {\n\t\t\t\t\tconverged = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (anchorId && iteration < effectiveMax - 1) {\n\t\t\t\t\tfreshCollapse = { targetId: anchorId, task: chainStepNames, iteration: iteration + 1, totalIterations };\n\t\t\t\t\tconst result = await ctx.navigateTree(anchorId, { summarize: true });\n\t\t\t\t\tfreshCollapse = null;\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\tchainAborted = true;\n\t\t\t\t\t\tnotify(ctx, \"Loop cancelled\", \"warning\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} catch (error) {\n\t\t\tchainErrorState = { hasError: true, error };\n\t\t} finally {\n\t\t\tchainErrorState = await restoreAfterExecution(\n\t\t\t\tctx,\n\t\t\t\tshouldRestore,\n\t\t\t\toriginalModel,\n\t\t\t\toriginalThinking,\n\t\t\t\tgetCurrentModel(ctx),\n\t\t\t\tpi.getThinkingLevel(),\n\t\t\t\tchainErrorState,\n\t\t\t\t\"chain\",\n\t\t\t);\n\n\t\t\tpendingSkillMessage = undefined;\n\t\t\tchainActive = false;\n\t\t\tloopState = null;\n\t\t\tfreshCollapse = null;\n\t\t\tboomerangCollapse = null;\n\t\t\taccumulatedSummaries = [];\n\t\t\tupdateLoopStatus(ctx);\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tctx.ui.setStatus(\"prompt-chain\", undefined);\n\t\t\t}\n\n\t\t\tif (!chainErrorState.hasError) {\n\t\t\t\tnotifyLoopCompletion(ctx, completedIterations, totalIterations, effectiveMax, converged, true);\n\t\t\t}\n\t\t}\n\n\t\tif (lastDelegatedText && !chainErrorState.hasError && !chainAborted) {\n\t\t\tpi.sendUserMessage(`[Delegated chain complete: ${chainStepNames}]\\n\\n${lastDelegatedText}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t}\n\n\t\tif (chainErrorState.hasError) {\n\t\t\tthrow chainErrorState.error;\n\t\t}\n\t}\n\n\tasync function runPromptCommand(name: string, args: string, ctx: ExtensionCommandContext) {\n\t\tstoredCommandCtx = ctx;\n\t\trefreshPrompts(ctx.cwd, ctx);\n\t\tconst prompt = prompts.get(name);\n\t\tif (!prompt) {\n\t\t\tnotify(ctx, `Prompt \"${name}\" no longer exists`, \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst subagent = extractSubagentOverride(args);\n\t\tconst runtimeCwd = subagent.cwd ? expandCwdPath(subagent.cwd) : undefined;\n\t\tif (subagent.cwd && !runtimeCwd) {\n\t\t\tnotify(ctx, `Invalid --cwd path: must be absolute`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst argsWithoutSubagent = subagent.args;\n\t\tif (prompt.deterministic) {\n\t\t\tif (subagent.override || subagent.fork) {\n\t\t\t\tnotify(ctx, `Deterministic prompts do not support runtime --subagent/--fork in v1`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (extractLoopCount(argsWithoutSubagent)) {\n\t\t\t\tnotify(ctx, `Deterministic prompts do not support runtime --loop in v1`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst hasCompareLineup = prompt.workers !== undefined || prompt.reviewers !== undefined || prompt.finalApplier !== undefined;\n\t\tif (hasCompareLineup) {\n\t\t\tawait runComparePrompt(\n\t\t\t\tname,\n\t\t\t\tprompt,\n\t\t\t\targsWithoutSubagent,\n\t\t\t\tctx,\n\t\t\t\tgetCurrentModel(ctx),\n\t\t\t\t{\n\t\t\t\t\tcwd: runtimeCwd,\n\t\t\t\t\tmodel: subagent.model,\n\t\t\t\t\tsubagentOverride: subagent.override,\n\t\t\t\t\tfork: subagent.fork,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (prompt.chain) {\n\t\t\tif (subagent.model) notify(ctx, `--model is not supported on chain prompts (ignored)`, \"warning\");\n\t\t\tif (subagent.fork) notify(ctx, `--fork is not supported on chain prompts (ignored)`, \"warning\");\n\t\t\tconst worktreeExtraction = extractWorktreeFlag(argsWithoutSubagent);\n\t\t\tconst extracted = extractChainContextFlag(worktreeExtraction.args);\n\t\t\tconst chainContextEnabled = extracted.chainContext || prompt.chainContext === \"summary\";\n\t\t\tconst cliWorktree = worktreeExtraction.worktree;\n\t\t\tconst loop = extractLoopCount(extracted.args);\n\t\t\tlet totalIterations: number | null = prompt.loop !== undefined ? prompt.loop : 1;\n\t\t\tlet fresh = false;\n\t\t\tlet converge = true;\n\t\t\tlet cleanedArgs = extracted.args;\n\n\t\t\tif (loop) {\n\t\t\t\ttotalIterations = loop.loopCount;\n\t\t\t\tfresh = loop.fresh;\n\t\t\t\tconverge = loop.converge;\n\t\t\t\tcleanedArgs = loop.args;\n\t\t\t} else if (prompt.loop !== undefined) {\n\t\t\t\tconst flags = extractLoopFlags(extracted.args);\n\t\t\t\tfresh = flags.fresh;\n\t\t\t\tconverge = flags.converge;\n\t\t\t\tcleanedArgs = flags.args;\n\t\t\t}\n\n\t\t\tconst { steps, invalidSegments } = parseChainDeclaration(prompt.chain);\n\t\t\tif (invalidSegments.length > 0) {\n\t\t\t\tnotify(ctx, `Invalid chain step: ${invalidSegments[0]}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (steps.length === 0) {\n\t\t\t\tnotify(ctx, \"No templates specified\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cwdOverride = runtimeCwd ?? prompt.cwd;\n\t\t\tawait runSharedChainExecution(\n\t\t\t\tsteps,\n\t\t\t\tparseCommandArgs(cleanedArgs),\n\t\t\t\ttotalIterations,\n\t\t\t\tfresh || prompt.fresh === true,\n\t\t\t\tconverge && prompt.converge !== false,\n\t\t\t\tprompt.restore,\n\t\t\t\tctx,\n\t\t\t\tsubagent.override,\n\t\t\t\tcwdOverride,\n\t\t\t\tchainContextEnabled,\n\t\t\t\tprompt.worktree === true,\n\t\t\t\tcliWorktree,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst promptOverrides: Partial<Pick<PromptWithModel, \"models\" | \"inheritContext\">> = {\n\t\t\t...(subagent.model ? { models: [subagent.model] } : {}),\n\t\t\t...(subagent.fork ? { inheritContext: true } : {}),\n\t\t};\n\n\t\tconst loop = extractLoopCount(argsWithoutSubagent);\n\t\tif (loop) {\n\t\t\tawait runPromptLoop(name, loop.args, loop.loopCount, loop.fresh, loop.converge, ctx, subagent.override, runtimeCwd, promptOverrides);\n\t\t\treturn;\n\t\t}\n\n\t\tif (prompt.loop !== undefined) {\n\t\t\tconst flags = extractLoopFlags(argsWithoutSubagent);\n\t\t\tawait runPromptLoop(name, flags.args, prompt.loop, flags.fresh, flags.converge, ctx, subagent.override, runtimeCwd, promptOverrides);\n\t\t\treturn;\n\t\t}\n\n\t\tconst effectivePrompt = {\n\t\t\t...prompt,\n\t\t\t...(runtimeCwd ? {\n\t\t\t\tcwd: runtimeCwd,\n\t\t\t\t...(prompt.deterministic ? { deterministic: { ...prompt.deterministic, cwd: runtimeCwd } } : {}),\n\t\t\t} : {}),\n\t\t\t...promptOverrides,\n\t\t};\n\t\tconst savedModel = getCurrentModel(ctx);\n\t\tconst savedThinking = pi.getThinkingLevel();\n\t\tconst isDelegatedPrompt = shouldDelegatePrompt(effectivePrompt, subagent.override);\n\t\tconst promptTurnRestore = !isDelegatedPrompt && prompt.restore\n\t\t\t? { originalModel: savedModel, originalThinking: savedThinking }\n\t\t\t: undefined;\n\t\tconst boomerangTargetId = effectivePrompt.boomerang ? ctx.sessionManager.getLeafId() : null;\n\t\tconst stepResult = await executePromptStep(\n\t\t\teffectivePrompt,\n\t\t\tparseCommandArgs(argsWithoutSubagent),\n\t\t\tctx,\n\t\t\tsavedModel,\n\t\t\tsubagent.override,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tpromptTurnRestore,\n\t\t);\n\t\tif (stepResult === \"aborted\") return;\n\t\tif (isDelegatedPrompt && stepResult.text) {\n\t\t\tpi.sendUserMessage(`[Delegated result: ${name}]\\n\\n${stepResult.text}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t}\n\n\t\tif (effectivePrompt.boomerang) {\n\t\t\tawait collapseBoomerangPrompt(ctx, name, boomerangTargetId);\n\t\t}\n\t}\n\n\tfunction resetSessionScopedState(ctx: ExtensionContext) {\n\t\tstoredCommandCtx = null;\n\t\tpendingSkillMessage = undefined;\n\t\tpreviousModel = undefined;\n\t\tpreviousThinking = undefined;\n\t\truntimeModel = ctx.model;\n\t\tboomerangCollapse = null;\n\t\ttoolManager.clearQueue();\n\t\trefreshPrompts(ctx.cwd, ctx);\n\t}\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tresetSessionScopedState(ctx);\n\t});\n\n\tpi.on(\"model_select\", async (event) => {\n\t\truntimeModel = event.model;\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tlet systemPrompt = event.systemPrompt;\n\n\t\tif (toolManager.isEnabled() && !loopState && !chainActive) {\n\t\t\tconst toolGuidance = toolManager.getGuidance();\n\t\t\tconst guidance = toolGuidance\n\t\t\t\t? `The run-prompt tool is available for running prompt template commands. ${toolGuidance}`\n\t\t\t\t: \"The run-prompt tool is available for running prompt template commands.\";\n\t\t\tsystemPrompt += `\\n\\n${guidance}`;\n\t\t}\n\n\t\tif (loopState) {\n\t\t\tconst iterText =\n\t\t\t\tloopState.totalIterations !== null\n\t\t\t\t\t? `iteration ${loopState.currentIteration} of ${loopState.totalIterations}`\n\t\t\t\t\t: `iteration ${loopState.currentIteration}`;\n\t\t\tsystemPrompt += `\\n\\nYou are on ${iterText} of the same prompt. Previous iterations and their results are visible in the conversation above. Build on that work — focus on what remains to improve.`;\n\t\t}\n\n\t\tconst skillMessage = consumePendingSkillMessage();\n\t\tconst hasSystemPromptOverride = systemPrompt !== event.systemPrompt;\n\t\tif (!hasSystemPromptOverride && !skillMessage) return;\n\n\t\treturn {\n\t\t\t...(hasSystemPromptOverride ? { systemPrompt } : {}),\n\t\t\t...(skillMessage ? { message: skillMessage } : {}),\n\t\t};\n\t});\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (chainActive) return;\n\t\tif (loopState) return;\n\n\t\tconst restoreModel = previousModel;\n\t\tconst restoreThinking = previousThinking;\n\t\tif (!restoreModel && restoreThinking === undefined && !toolManager.hasQueuedCommand()) return;\n\n\t\truntimeModel = ctx.model;\n\n\t\tpreviousModel = undefined;\n\t\tpreviousThinking = undefined;\n\n\t\tconst restoreFn = async () => {\n\t\t\tif (restoreModel || restoreThinking !== undefined) {\n\t\t\t\tawait restoreSessionState(ctx, restoreModel, restoreThinking, getCurrentModel(ctx), pi.getThinkingLevel());\n\t\t\t}\n\t\t};\n\t\tconst processed = await toolManager.processQueue(ctx, restoreFn);\n\t\tif (processed) return;\n\t\tawait restoreFn();\n\t});\n\n\tpi.on(\"session_before_tree\", async (event) => {\n\t\tif (boomerangCollapse && event.preparation.targetId === boomerangCollapse.targetId) {\n\t\t\tconst summary = generateBoomerangSummary(event.preparation.entriesToSummarize, boomerangCollapse.task);\n\t\t\treturn {\n\t\t\t\tsummary: {\n\t\t\t\t\tsummary: [...boomerangCollapse.previousSummaries, summary].join(\"\\n\\n---\\n\\n\"),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (!freshCollapse) return;\n\t\tif (event.preparation.targetId !== freshCollapse.targetId) return;\n\n\t\tconst summary = generateIterationSummary(\n\t\t\tevent.preparation.entriesToSummarize,\n\t\t\tfreshCollapse.task,\n\t\t\tfreshCollapse.iteration,\n\t\t\tfreshCollapse.totalIterations,\n\t\t);\n\t\taccumulatedSummaries.push(summary);\n\n\t\treturn {\n\t\t\tsummary: {\n\t\t\t\tsummary: accumulatedSummaries.join(\"\\n\\n---\\n\\n\"),\n\t\t\t},\n\t\t};\n\t});\n\n\tasync function runChainCommand(args: string, ctx: ExtensionCommandContext) {\n\t\tstoredCommandCtx = ctx;\n\t\trefreshPrompts(ctx.cwd, ctx);\n\n\t\tconst subagent = extractSubagentOverride(args);\n\t\tconst runtimeCwd = subagent.cwd ? expandCwdPath(subagent.cwd) : undefined;\n\t\tif (subagent.cwd && !runtimeCwd) {\n\t\t\tnotify(ctx, `Invalid --cwd path: must be absolute`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst worktreeExtraction = extractWorktreeFlag(subagent.args);\n\t\tconst extracted = extractChainContextFlag(worktreeExtraction.args);\n\t\tconst loop = extractLoopCount(extracted.args);\n\t\tconst cleanedArgs = loop ? loop.args : extracted.args;\n\n\t\tconst { steps, sharedArgs, invalidSegments } = parseChainSteps(cleanedArgs);\n\t\tif (invalidSegments.length > 0) {\n\t\t\tnotify(ctx, `Invalid chain step: ${invalidSegments[0]}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (steps.length === 0) {\n\t\t\tnotify(ctx, \"No templates specified\", \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait runSharedChainExecution(\n\t\t\tsteps,\n\t\t\tsharedArgs,\n\t\t\tloop ? loop.loopCount : 1,\n\t\t\tloop?.fresh === true,\n\t\t\tloop?.converge ?? true,\n\t\t\ttrue,\n\t\t\tctx,\n\t\t\tsubagent.override,\n\t\t\truntimeCwd,\n\t\t\textracted.chainContext,\n\t\t\tfalse,\n\t\t\tworktreeExtraction.worktree,\n\t\t);\n\t}\n\n\tif (toolManager.isEnabled()) toolManager.ensureRegistered();\n\n\tpi.registerCommand(\"chain-prompts\", {\n\t\tdescription: \"Chain prompt templates sequentially [template -> template -> ...]\",\n\t\thandler: async (args, ctx) => {\n\t\t\tawait runChainCommand(args, ctx);\n\t\t},\n\t});\n\ttoolManager.registerCommand();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAA6C,MAAM,iCAAiC,CAAC;AA4G/G,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAE,EAAE,YAAY,QAwoD5D","sourcesContent":["// @ts-nocheck\nimport { existsSync } from \"node:fs\";\nimport { resolve as resolvePath } from \"node:path\";\nimport type { Model } from \"@ashx-j/lunr-ai\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ThinkingLevel } from \"@ashx-j/lunr-agent\";\nimport {\n\textractChainContextFlag,\n\textractLineupOverrides,\n\textractLoopCount,\n\textractLoopFlags,\n\textractSubagentOverride,\n\textractWorktreeFlag,\n\tparseCommandArgs,\n\tsubstituteArgs,\n\ttype LineupOverrideAction,\n\ttype SubagentOverride,\n} from \"./args.ts\";\nimport { parseChainSteps, parseChainDeclaration, type ChainStep, type ChainStepOrParallel, type ParallelChainStep } from \"./chain-parser.ts\";\nimport { generateBoomerangSummary, generateChainStepSummary, generateIterationSummary, didIterationMakeChanges, getIterationEntries, wasIterationAborted } from \"./loop-utils.ts\";\nimport { selectModelCandidate } from \"./model-selection.ts\";\nimport { notify, summarizePromptDiagnostics, diagnosticsFingerprint } from \"./notifications.ts\";\nimport { preparePromptExecution, renderPromptForResolvedModel } from \"./prompt-execution.ts\";\nimport {\n\tbuildPromptCommandDescription,\n\texpandCwdPath,\n\tloadPromptsWithModel,\n\treadSkillContent,\n\tresolveSkillPath,\n\ttype DelegationLineupSlot,\n\ttype PromptWithModel,\n} from \"./prompt-loader.ts\";\nimport { renderSkillLoaded, type SkillLoadedDetails } from \"./skill-loaded-renderer.ts\";\nimport { createToolManager } from \"./tool-manager.ts\";\nimport { executeSubagentPromptStep, type DelegatedPromptParallelResult } from \"./subagent-step.ts\";\nimport { DEFAULT_SUBAGENT_NAME, PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE } from \"./subagent-runtime.ts\";\nimport { renderDelegatedSubagentResult } from \"./subagent-renderer.ts\";\nimport {\n\tPROMPT_TEMPLATE_DETERMINISTIC_COMPLETION_MESSAGE_TYPE,\n\tPROMPT_TEMPLATE_DETERMINISTIC_MESSAGE_TYPE,\n\tbuildDeterministicPreamble,\n\trunDeterministicStep,\n\tshouldHandoffToLlm,\n} from \"./deterministic-step.ts\";\nimport { renderDeterministicCompletion, renderDeterministicResult } from \"./deterministic-renderer.ts\";\n\ninterface LoopState {\n\tcurrentIteration: number;\n\ttotalIterations: number | null;\n\trotationLabel?: string;\n}\n\ninterface FreshCollapse {\n\ttargetId: string;\n\ttask: string;\n\titeration: number;\n\ttotalIterations: number | null;\n}\n\ninterface BoomerangCollapse {\n\ttargetId: string;\n\ttask: string;\n\tpreviousSummaries: string[];\n}\n\ninterface PendingSkillMessage {\n\tcustomType: \"skill-loaded\";\n\tcontent: string;\n\tdisplay: true;\n\tdetails: SkillLoadedDetails;\n}\n\ntype SkillMessageResolution =\n\t| { kind: \"none\" }\n\t| { kind: \"ready\"; message: PendingSkillMessage }\n\t| { kind: \"error\"; error: string };\n\ninterface ExecutionErrorState {\n\thasError: boolean;\n\terror: unknown;\n}\n\ninterface PromptStepResult {\n\tchanged: boolean;\n\ttext?: string;\n}\n\ninterface PromptTurnRestore {\n\toriginalModel: Model<any> | undefined;\n\toriginalThinking: ThinkingLevel | undefined;\n}\n\nconst DEFAULT_COMPARE_REVIEWER_TASK = [\n\t\"Review the worker variants and produce findings only.\",\n\t\"Required output:\",\n\t\"1. Summarize concrete strengths with patch/diff evidence, including worktree change summaries when present.\",\n\t\"2. Call out concrete correctness risks and regression risks.\",\n\t\"3. Extract cherry-pick ideas from non-winning variants.\",\n\t\"4. Do not rank variants or select a winner.\",\n\t\"5. Do not include manual apply commands.\",\n].join(\"\\n\");\n\nconst DEFAULT_COMPARE_FINAL_APPLIER_TASK = [\n\t\"Apply the final implementation directly in the current repo.\",\n\t\"Required output:\",\n\t\"1. Pick the best single variant or synthesize/cherry-pick across variants.\",\n\t\"2. Apply changes directly on the current branch.\",\n\t\"3. Keep edits minimal and focused on the implementation task.\",\n\t\"4. Run obvious relevant verification when practical.\",\n\t\"5. Report changed files and verification commands run.\",\n].join(\"\\n\");\n\nexport default function promptModelExtension(pi: ExtensionAPI) {\n\tlet prompts = new Map<string, PromptWithModel>();\n\tlet chainPrompts = new Map<string, PromptWithModel>();\n\tlet previousModel: Model<any> | undefined;\n\tlet previousThinking: ThinkingLevel | undefined;\n\tlet pendingSkillMessage: PendingSkillMessage | undefined;\n\tlet runtimeModel: Model<any> | undefined;\n\tlet chainActive = false;\n\tlet loopState: LoopState | null = null;\n\tlet freshCollapse: FreshCollapse | null = null;\n\tlet boomerangCollapse: BoomerangCollapse | null = null;\n\tlet accumulatedSummaries: string[] = [];\n\tlet lastDiagnostics = \"\";\n\tlet storedCommandCtx: ExtensionCommandContext | null = null;\n\tconst UNLIMITED_LOOP_CAP = 999;\n\n\tconst toolManager = createToolManager(pi, {\n\t\tisActive: () => !!(loopState || chainActive),\n\t\tgetStoredCtx: () => storedCommandCtx,\n\t\tsetStoredCtx: (ctx) => {\n\t\t\tstoredCommandCtx = ctx;\n\t\t},\n\t\texecuteCommand: executeToolCommand,\n\t});\n\n\tfunction sameModel(a: Model<any> | undefined, b: Model<any> | undefined): boolean {\n\t\tif (!a || !b) return a === b;\n\t\treturn a.provider === b.provider && a.id === b.id;\n\t}\n\n\tfunction getCurrentModel(ctx: Pick<ExtensionContext, \"model\">): Model<any> | undefined {\n\t\treturn runtimeModel ?? ctx.model;\n\t}\n\n\tpi.registerMessageRenderer<SkillLoadedDetails>(\"skill-loaded\", renderSkillLoaded);\n\tpi.registerMessageRenderer(PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE, renderDelegatedSubagentResult);\n\tpi.registerMessageRenderer(PROMPT_TEMPLATE_DETERMINISTIC_MESSAGE_TYPE, renderDeterministicResult);\n\tpi.registerMessageRenderer(PROMPT_TEMPLATE_DETERMINISTIC_COMPLETION_MESSAGE_TYPE, renderDeterministicCompletion);\n\n\tfunction registerPromptCommand(name: string) {\n\t\tpi.registerCommand(name, {\n\t\t\tdescription: buildPromptCommandDescription(prompts.get(name)!),\n\t\t\thandler: async (args, ctx) => {\n\t\t\t\tawait runPromptCommand(name, args, ctx);\n\t\t\t},\n\t\t});\n\t}\n\n\tfunction refreshPrompts(cwd: string, ctx?: ExtensionContext) {\n\t\tconst result = loadPromptsWithModel(cwd);\n\t\tconst chainResult = loadPromptsWithModel(cwd, true);\n\t\tprompts = result.prompts;\n\t\tchainPrompts = chainResult.prompts;\n\n\t\tfor (const name of prompts.keys()) {\n\t\t\tregisterPromptCommand(name);\n\t\t}\n\n\t\tconst summary = summarizePromptDiagnostics(result.diagnostics);\n\t\tconst fingerprint = diagnosticsFingerprint(result.diagnostics);\n\t\tif (summary && fingerprint !== lastDiagnostics) {\n\t\t\tnotify(ctx, summary, \"warning\");\n\t\t}\n\t\tlastDiagnostics = fingerprint;\n\t}\n\n\tfunction consumePendingSkillMessage() {\n\t\tif (!pendingSkillMessage) return undefined;\n\t\tconst message = pendingSkillMessage;\n\t\tpendingSkillMessage = undefined;\n\t\treturn message;\n\t}\n\n\tfunction normalizeSkillName(skillName: string): string {\n\t\treturn skillName.startsWith(\"skill:\") ? skillName.slice(\"skill:\".length) : skillName;\n\t}\n\n\tfunction isPathResolvableSkillName(skillName: string): boolean {\n\t\tif (skillName === \".\" || skillName === \"..\") return false;\n\t\tif (skillName.includes(\"/\")) return false;\n\t\tif (skillName.includes(\"\\\\\")) return false;\n\t\treturn true;\n\t}\n\n\tfunction resolveRegisteredSkillPath(skillName: string): string | undefined {\n\t\tconst normalizedSkillName = normalizeSkillName(skillName);\n\t\tif (!normalizedSkillName) return undefined;\n\t\tconst candidates = new Set([normalizedSkillName, `skill:${normalizedSkillName}`]);\n\n\t\tfor (const command of pi.getCommands()) {\n\t\t\tif (command.source !== \"skill\") continue;\n\t\t\tconst sourceInfo = \"sourceInfo\" in command\n\t\t\t\t? (command as { sourceInfo?: { path?: string } }).sourceInfo\n\t\t\t\t: undefined;\n\t\t\tif (!sourceInfo?.path) continue;\n\t\t\tif (!candidates.has(command.name)) continue;\n\t\t\treturn sourceInfo.path;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tfunction resolveSkillMessage(skillName: string | undefined, cwd: string): SkillMessageResolution {\n\t\tif (!skillName) {\n\t\t\treturn { kind: \"none\" };\n\t\t}\n\n\t\tconst normalizedSkillName = normalizeSkillName(skillName);\n\t\tif (!normalizedSkillName) {\n\t\t\treturn { kind: \"error\", error: `Skill \"${skillName}\" not found` };\n\t\t}\n\n\t\tconst skillPath =\n\t\t\tresolveRegisteredSkillPath(skillName) ?? (isPathResolvableSkillName(normalizedSkillName) ? resolveSkillPath(normalizedSkillName, cwd) : undefined);\n\t\tif (!skillPath) {\n\t\t\treturn { kind: \"error\", error: `Skill \"${skillName}\" not found` };\n\t\t}\n\n\t\ttry {\n\t\t\tconst skillContent = readSkillContent(skillPath);\n\t\t\treturn {\n\t\t\t\tkind: \"ready\",\n\t\t\t\tmessage: {\n\t\t\t\t\tcustomType: \"skill-loaded\",\n\t\t\t\t\tcontent: `<skill name=\"${normalizedSkillName}\">\\n${skillContent}\\n</skill>`,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { skillName: normalizedSkillName, skillContent, skillPath },\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tkind: \"error\",\n\t\t\t\terror: `Failed to read skill \"${skillName}\": ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function waitForTurnStart(ctx: ExtensionContext) {\n\t\twhile (ctx.isIdle()) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10));\n\t\t}\n\t}\n\n\tfunction shouldDelegatePrompt(prompt: PromptWithModel, override?: SubagentOverride): boolean {\n\t\treturn prompt.subagent !== undefined || override?.enabled === true;\n\t}\n\n\tfunction isParallelChainStep(step: ChainStepOrParallel): step is ParallelChainStep {\n\t\treturn \"parallel\" in step;\n\t}\n\n\tasync function executePromptStep(\n\t\tprompt: PromptWithModel,\n\t\targs: string[],\n\t\tctx: ExtensionCommandContext,\n\t\tcurrentModel: Model<any> | undefined,\n\t\toverride?: SubagentOverride,\n\t\tinheritedModel?: Model<any>,\n\t\ttaskPreamble?: string,\n\t\tloopContext?: string,\n\t\tpromptTurnRestore?: PromptTurnRestore,\n\t): Promise<PromptStepResult | \"aborted\"> {\n\t\tlet deterministicPreamble: string | undefined;\n\t\tif (prompt.deterministic) {\n\t\t\ttry {\n\t\t\t\tconst deterministicResult = await runDeterministicStep(prompt, prompt.deterministic, ctx.cwd);\n\t\t\t\tconst deterministicPreambleText = buildDeterministicPreamble(deterministicResult);\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: PROMPT_TEMPLATE_DETERMINISTIC_MESSAGE_TYPE,\n\t\t\t\t\tcontent: deterministicPreambleText,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: deterministicResult,\n\t\t\t\t});\n\t\t\t\tif (!shouldHandoffToLlm(prompt.deterministic, deterministicResult)) {\n\t\t\t\t\tpi.sendMessage({\n\t\t\t\t\t\tcustomType: PROMPT_TEMPLATE_DETERMINISTIC_COMPLETION_MESSAGE_TYPE,\n\t\t\t\t\t\tcontent: `[Deterministic complete: ${prompt.name}]`,\n\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tpromptName: prompt.name,\n\t\t\t\t\t\t\texitCode: deterministicResult.exitCode,\n\t\t\t\t\t\t\ttimedOut: deterministicResult.timedOut,\n\t\t\t\t\t\t\tstatus: deterministicResult.exitCode === 0 ? \"succeeded\" : \"failed\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\treturn { changed: false };\n\t\t\t\t}\n\t\t\t\tdeterministicPreamble = deterministicPreambleText;\n\t\t\t} catch (error) {\n\t\t\t\tnotify(ctx, `Deterministic step failed: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\t\treturn \"aborted\";\n\t\t\t}\n\t\t}\n\n\t\tconst combinedTaskPreamble = [taskPreamble, deterministicPreamble].filter(Boolean).join(\"\\n\\n\");\n\n\t\tif (shouldDelegatePrompt(prompt, override)) {\n\t\t\ttry {\n\t\t\t\tconst delegated =\n\t\t\t\t\tprompt.parallel && prompt.parallel > 1\n\t\t\t\t\t\t? await executeSubagentPromptStep({\n\t\t\t\t\t\t\tpi,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\toverride,\n\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\tinheritedModel,\n\t\t\t\t\t\t\ttaskPreamble: combinedTaskPreamble || undefined,\n\t\t\t\t\t\t\tparallel: Array.from({ length: prompt.parallel }, (_, index) => ({\n\t\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\t\ttaskPrefix: `[Parallel subagent ${index + 1}/${prompt.parallel}]`,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tworktree: prompt.worktree === true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t: await executeSubagentPromptStep({\n\t\t\t\t\t\t\tpi,\n\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\toverride,\n\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\tinheritedModel,\n\t\t\t\t\t\t\ttaskPreamble: combinedTaskPreamble || undefined,\n\t\t\t\t\t\t});\n\t\t\t\tif (!delegated) {\n\t\t\t\t\tnotify(ctx, `Prompt \\`${prompt.name}\\` is not configured for delegated execution.`, \"error\");\n\t\t\t\t\treturn \"aborted\";\n\t\t\t\t}\n\t\t\t\treturn { changed: delegated.changed, text: delegated.text };\n\t\t\t} catch (error) {\n\t\t\t\tnotify(ctx, error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t\treturn { changed: false };\n\t\t\t}\n\t\t}\n\n\t\tconst prepared =\n\t\t\tinheritedModel === undefined\n\t\t\t\t? await preparePromptExecution(prompt, args, currentModel, ctx.modelRegistry)\n\t\t\t\t: await preparePromptExecution(prompt, args, currentModel, ctx.modelRegistry, { inheritedModel });\n\t\tif (!prepared) {\n\t\t\tnotify(ctx, `No available model from: ${prompt.models.join(\", \")}`, \"error\");\n\t\t\treturn \"aborted\";\n\t\t}\n\t\tif (\"message\" in prepared) {\n\t\t\tif (prepared.warning) notify(ctx, prepared.warning, \"warning\");\n\t\t\tnotify(ctx, prepared.message, \"error\");\n\t\t\treturn \"aborted\";\n\t\t}\n\t\tif (prepared.warning) {\n\t\t\tnotify(ctx, prepared.warning, \"warning\");\n\t\t}\n\n\t\tconst skillResolution = resolveSkillMessage(prompt.skill, ctx.cwd);\n\t\tif (skillResolution.kind === \"error\") {\n\t\t\tnotify(ctx, skillResolution.error, \"error\");\n\t\t\treturn \"aborted\";\n\t\t}\n\n\t\tif (!prepared.selectedModel.alreadyActive) {\n\t\t\tconst switched = await pi.setModel(prepared.selectedModel.model);\n\t\t\tif (!switched) {\n\t\t\t\tnotify(ctx, `Failed to switch to model ${prepared.selectedModel.model.provider}/${prepared.selectedModel.model.id}`, \"error\");\n\t\t\t\treturn \"aborted\";\n\t\t\t}\n\t\t\truntimeModel = prepared.selectedModel.model;\n\t\t}\n\n\t\tif (prompt.thinking) {\n\t\t\tpi.setThinkingLevel(prompt.thinking);\n\t\t}\n\t\tpendingSkillMessage = skillResolution.kind === \"ready\" ? skillResolution.message : undefined;\n\n\t\tif (promptTurnRestore) {\n\t\t\tconst currentModel = getCurrentModel(ctx);\n\t\t\tif (promptTurnRestore.originalModel && currentModel && !sameModel(promptTurnRestore.originalModel, currentModel)) {\n\t\t\t\tpreviousModel = promptTurnRestore.originalModel;\n\t\t\t\tpreviousThinking = promptTurnRestore.originalThinking;\n\t\t\t}\n\t\t\tif (prompt.thinking && previousThinking === undefined && prompt.thinking !== promptTurnRestore.originalThinking) {\n\t\t\t\tpreviousThinking = promptTurnRestore.originalThinking;\n\t\t\t}\n\t\t}\n\n\t\tconst startId = ctx.sessionManager.getLeafId();\n\t\tconst effectiveContent = combinedTaskPreamble\n\t\t\t? `${combinedTaskPreamble}\\n\\n${prepared.content}`\n\t\t\t: prepared.content;\n\t\tconst content = loopContext ? `[${loopContext}]\\n\\n${effectiveContent}` : effectiveContent;\n\t\tpi.sendUserMessage(content);\n\t\tawait waitForTurnStart(ctx);\n\t\tawait ctx.waitForIdle();\n\n\t\tconst entries = getIterationEntries(ctx, startId);\n\t\tif (wasIterationAborted(entries)) return \"aborted\";\n\t\treturn { changed: didIterationMakeChanges(entries) };\n\t}\n\n\tasync function restoreSessionState(\n\t\tctx: ExtensionContext,\n\t\toriginalModel: Model<any> | undefined,\n\t\toriginalThinking: ThinkingLevel | undefined,\n\t\tcurrentModel?: Model<any>,\n\t\tcurrentThinking?: ThinkingLevel,\n\t) {\n\t\tconst restoredParts: string[] = [];\n\t\tconst shouldRestoreThinking =\n\t\t\toriginalThinking !== undefined && (currentThinking === undefined || currentThinking !== originalThinking);\n\n\t\tif (originalModel && !sameModel(originalModel, currentModel)) {\n\t\t\tconst restoredModel = await pi.setModel(originalModel);\n\t\t\tif (restoredModel) {\n\t\t\t\truntimeModel = originalModel;\n\t\t\t\trestoredParts.push(originalModel.id);\n\t\t\t} else {\n\t\t\t\tnotify(ctx, `Failed to restore model ${originalModel.provider}/${originalModel.id}`, \"error\");\n\t\t\t}\n\t\t}\n\t\tif (shouldRestoreThinking) {\n\t\t\trestoredParts.push(`thinking:${originalThinking}`);\n\t\t\tpi.setThinkingLevel(originalThinking);\n\t\t}\n\t\tif (restoredParts.length > 0) {\n\t\t\tnotify(ctx, `Restored to ${restoredParts.join(\", \")}`, \"info\");\n\t\t}\n\t}\n\n\tasync function restoreAfterExecution(\n\t\tctx: ExtensionContext,\n\t\tshouldRestore: boolean,\n\t\toriginalModel: Model<any> | undefined,\n\t\toriginalThinking: ThinkingLevel | undefined,\n\t\tcurrentModel: Model<any> | undefined,\n\t\tcurrentThinking: ThinkingLevel | undefined,\n\t\terrorState: ExecutionErrorState,\n\t\tphase: \"loop\" | \"chain\",\n\t): Promise<ExecutionErrorState> {\n\t\tif (!shouldRestore) return errorState;\n\n\t\ttry {\n\t\t\tawait restoreSessionState(ctx, originalModel, originalThinking, currentModel, currentThinking);\n\t\t} catch (error) {\n\t\t\tif (errorState.hasError) {\n\t\t\t\tnotify(\n\t\t\t\t\tctx,\n\t\t\t\t\t`Failed to restore session state after ${phase} error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn errorState;\n\t\t\t}\n\t\t\treturn { hasError: true, error };\n\t\t}\n\n\t\treturn errorState;\n\t}\n\n\tfunction notifyLoopCompletion(\n\t\tctx: ExtensionContext,\n\t\tcompletedIterations: number,\n\t\ttotalIterations: number | null,\n\t\teffectiveMax: number,\n\t\tconverged: boolean,\n\t\trequireMultipleIterations: boolean,\n\t) {\n\t\tif (converged) {\n\t\t\tconst convergedLabel = totalIterations !== null ? `${completedIterations}/${totalIterations}` : `${completedIterations}`;\n\t\t\tnotify(ctx, `Loop converged at ${convergedLabel} (no changes)`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (completedIterations === 0) return;\n\t\tif (requireMultipleIterations && effectiveMax <= 1) return;\n\n\t\tif (totalIterations !== null) {\n\t\t\tnotify(ctx, `Loop finished: ${completedIterations}/${totalIterations} iterations`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tif (completedIterations === effectiveMax) {\n\t\t\tnotify(ctx, `Loop finished: ${completedIterations} iterations (cap reached)`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tnotify(ctx, `Loop finished: ${completedIterations} iterations`, \"info\");\n\t}\n\n\tfunction updateLoopStatus(ctx: ExtensionContext) {\n\t\tif (!ctx.hasUI) return;\n\t\tif (loopState) {\n\t\t\tconst suffix = loopState.rotationLabel ? ` · ${loopState.rotationLabel}` : \"\";\n\t\t\tconst label =\n\t\t\t\tloopState.totalIterations !== null\n\t\t\t\t\t? `loop ${loopState.currentIteration}/${loopState.totalIterations}${suffix}`\n\t\t\t\t\t: `loop ${loopState.currentIteration}${suffix}`;\n\t\t\tctx.ui.setStatus(\"prompt-loop\", ctx.ui.theme.fg(\"warning\", label));\n\t\t} else {\n\t\t\tctx.ui.setStatus(\"prompt-loop\", undefined);\n\t\t}\n\t}\n\n\tasync function executeToolCommand(command: string, ctx: ExtensionCommandContext) {\n\t\tconst stripped = command.startsWith(\"/\") ? command.slice(1) : command;\n\t\tconst spaceIdx = stripped.indexOf(\" \");\n\t\tconst name = spaceIdx >= 0 ? stripped.slice(0, spaceIdx) : stripped;\n\t\tconst args = spaceIdx >= 0 ? stripped.slice(spaceIdx + 1) : \"\";\n\n\t\tif (name === \"chain-prompts\") {\n\t\t\tawait runChainCommand(args, ctx);\n\t\t} else {\n\t\t\tawait runPromptCommand(name, args, ctx);\n\t\t}\n\t}\n\n\tfunction cloneLineup(slots: DelegationLineupSlot[] | undefined): DelegationLineupSlot[] | undefined {\n\t\treturn slots?.map((slot) => ({ ...slot }));\n\t}\n\n\tfunction expandLineupCounts(slots: DelegationLineupSlot[]): DelegationLineupSlot[] {\n\t\tconst expanded: DelegationLineupSlot[] = [];\n\t\tfor (const slot of slots) {\n\t\t\tconst { count, ...concreteSlot } = slot;\n\t\t\tfor (let index = 0; index < (count ?? 1); index++) {\n\t\t\t\texpanded.push({ ...concreteSlot });\n\t\t\t}\n\t\t}\n\t\treturn expanded;\n\t}\n\n\tfunction applyLineupActions(\n\t\tdefaultSlots: DelegationLineupSlot[] | undefined,\n\t\tactions: LineupOverrideAction[],\n\t\ttarget: \"workers\" | \"reviewers\",\n\t): DelegationLineupSlot[] | undefined {\n\t\tlet lineup = cloneLineup(defaultSlots);\n\t\tfor (const action of actions) {\n\t\t\tif (action.target !== target) continue;\n\t\t\tconst incoming = action.slots.map((slot) => ({ ...slot }));\n\t\t\tlineup = action.mode === \"replace\" ? incoming : [...(lineup ?? []), ...incoming];\n\t\t}\n\t\treturn lineup;\n\t}\n\n\tfunction applyFinalApplierAction(\n\t\tdefaultSlot: DelegationLineupSlot | undefined,\n\t\tactions: LineupOverrideAction[],\n\t): DelegationLineupSlot | undefined {\n\t\tlet slot = defaultSlot ? { ...defaultSlot } : undefined;\n\t\tfor (const action of actions) {\n\t\t\tif (action.target !== \"finalApplier\") continue;\n\t\t\tslot = action.slots[0] ? { ...action.slots[0] } : undefined;\n\t\t}\n\t\treturn slot;\n\t}\n\n\tasync function resolveCompareBaseModel(\n\t\tprompt: PromptWithModel,\n\t\tcurrentModel: Model<any> | undefined,\n\t\tctx: ExtensionCommandContext,\n\t\tmodelOverride?: string,\n\t): Promise<Model<any> | undefined> {\n\t\tconst requestedModels = modelOverride ? [modelOverride] : prompt.models;\n\t\tif (requestedModels.length > 0) {\n\t\t\tconst selected = await selectModelCandidate(requestedModels, currentModel, ctx.modelRegistry);\n\t\t\tif (!selected) {\n\t\t\t\tnotify(ctx, `No available model from: ${requestedModels.join(\", \")}`, \"error\");\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn selected.model;\n\t\t}\n\t\tif (currentModel) return currentModel;\n\t\tnotify(ctx, `Prompt \\`${prompt.name}\\` requires an active model or a runtime --model override.`, \"error\");\n\t\treturn undefined;\n\t}\n\n\tfunction resolveCompareCwd(raw: string, ctx: ExtensionCommandContext): string {\n\t\treturn expandCwdPath(raw) ?? resolvePath(ctx.cwd, raw);\n\t}\n\n\tfunction normalizeLineupCwds(\n\t\tslots: DelegationLineupSlot[],\n\t\tdefaultCwd: string,\n\t\tctx: ExtensionCommandContext,\n\t): DelegationLineupSlot[] | undefined {\n\t\tconst normalized: DelegationLineupSlot[] = [];\n\t\tfor (const slot of slots) {\n\t\t\tconst slotCwd = slot.cwd ? resolveCompareCwd(slot.cwd, ctx) : defaultCwd;\n\t\t\tif (!existsSync(slotCwd)) {\n\t\t\t\tnotify(ctx, `cwd directory does not exist: ${slotCwd}`, \"error\");\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tnormalized.push({\n\t\t\t\t...slot,\n\t\t\t\tcwd: slotCwd,\n\t\t\t});\n\t\t}\n\t\treturn normalized;\n\t}\n\n\tfunction formatCompareSlotLabel(slot: DelegationLineupSlot, fallbackAgent: string): string {\n\t\treturn slot.model ? `${fallbackAgent}, ${slot.model}` : fallbackAgent;\n\t}\n\n\tfunction renderComparePhaseResults(\n\t\tlabel: string,\n\t\tentries: Array<{ index: number; slot: DelegationLineupSlot; result: DelegatedPromptParallelResult }>,\n\t): string {\n\t\treturn entries\n\t\t\t.map(({ index, slot, result }) => {\n\t\t\t\tconst body = result.text || \"(no assistant text)\";\n\t\t\t\treturn `=== ${label} ${index + 1} (${formatCompareSlotLabel(slot, result.agent)}) ===\\n${body}`;\n\t\t\t})\n\t\t\t.join(\"\\n\\n\");\n\t}\n\n\tfunction formatPhaseFailureSummary(\n\t\tlabel: string,\n\t\tentries: Array<{ index: number; slot: DelegationLineupSlot; result: DelegatedPromptParallelResult }>,\n\t): string | undefined {\n\t\tif (entries.length === 0) return undefined;\n\t\treturn [\n\t\t\t`[${label} failures]`,\n\t\t\t...entries.map(({ index, slot, result }) =>\n\t\t\t\t`- ${label} ${index + 1} (${formatCompareSlotLabel(slot, result.agent)}): ${result.errorText || \"unknown delegated error\"}`,\n\t\t\t),\n\t\t].join(\"\\n\");\n\t}\n\n\tfunction extractSuccessfulWorktreeChanges(aggregateText: string | undefined, successfulIndexes: number[]): string | undefined {\n\t\tif (!aggregateText) return undefined;\n\t\tconst marker = \"=== Worktree Changes ===\";\n\t\tconst markerIndex = aggregateText.indexOf(marker);\n\t\tif (markerIndex < 0) return undefined;\n\t\tconst worktreeText = aggregateText.slice(markerIndex + marker.length).trim();\n\t\tif (!worktreeText) return undefined;\n\t\tconst successfulTaskNumbers = new Set(successfulIndexes.map((index) => index + 1));\n\t\tconst sections = worktreeText\n\t\t\t.split(/\\n(?=--- Task \\d+ \\()/)\n\t\t\t.map((section) => section.trim())\n\t\t\t.filter(Boolean)\n\t\t\t.filter((section) => {\n\t\t\t\tconst match = section.match(/^--- Task (\\d+) \\(/);\n\t\t\t\treturn match ? successfulTaskNumbers.has(parseInt(match[1]!, 10)) : false;\n\t\t\t});\n\t\tif (sections.length === 0) return undefined;\n\t\treturn `${marker}\\n\\n${sections.join(\"\\n\\n\")}`;\n\t}\n\n\tfunction buildReviewerPreamble(sharedTask: string, workerAggregation: string, workerFailureSummary?: string): string {\n\t\treturn [\n\t\t\t\"[Original implementation task]\",\n\t\t\tsharedTask,\n\t\t\t\"\",\n\t\t\t\"[Worker outputs and worktree summaries]\",\n\t\t\tworkerAggregation,\n\t\t\t...(workerFailureSummary ? [\"\", workerFailureSummary] : []),\n\t\t].join(\"\\n\");\n\t}\n\n\tfunction buildFinalApplierPreamble(\n\t\tsharedTask: string,\n\t\tworkerAggregation: string,\n\t\tworkerFailureSummary?: string,\n\t\treviewerAggregation?: string,\n\t\treviewerFailureSummary?: string,\n\t): string {\n\t\treturn [\n\t\t\t\"[Original implementation task]\",\n\t\t\tsharedTask,\n\t\t\t\"\",\n\t\t\t\"[Worker outputs and worktree summaries]\",\n\t\t\tworkerAggregation,\n\t\t\t...(workerFailureSummary ? [\"\", workerFailureSummary] : []),\n\t\t\t\"\",\n\t\t\t\"[Reviewer findings]\",\n\t\t\treviewerAggregation ?? \"All reviewer runs failed. Synthesize directly from the worker variants.\",\n\t\t\t...(reviewerFailureSummary ? [\"\", reviewerFailureSummary] : []),\n\t\t\t\"\",\n\t\t\t\"[Final apply instructions]\",\n\t\t\t\"Pick one winner or synthesize/cherry-pick from multiple variants, apply the final patch directly in the current repo, keep edits minimal, run obvious relevant verification when practical, and report changed files plus verification run.\",\n\t\t].join(\"\\n\");\n\t}\n\n\tfunction buildLineupSlotTask(\n\t\tbaseTask: string,\n\t\tslot: DelegationLineupSlot,\n\t\ttaskArgs: string[],\n\t): string {\n\t\tconst effectiveBaseTask = slot.task ? substituteArgs(slot.task, taskArgs) : baseTask;\n\t\tif (!slot.taskSuffix) return effectiveBaseTask;\n\t\treturn `${effectiveBaseTask}\\n\\n${substituteArgs(slot.taskSuffix, taskArgs)}`;\n\t}\n\n\tfunction buildComparePrompt(\n\t\tbase: PromptWithModel,\n\t\toptions: {\n\t\t\tname: string;\n\t\t\tagent: string;\n\t\t\ttask: string;\n\t\t\tmodel?: string;\n\t\t\tcwd: string;\n\t\t\tinheritContext?: boolean;\n\t\t},\n\t): PromptWithModel {\n\t\treturn {\n\t\t\t...base,\n\t\t\tname: options.name,\n\t\t\tcontent: options.task,\n\t\t\tmodels: options.model ? [options.model] : [],\n\t\t\tchain: undefined,\n\t\t\tchainContext: undefined,\n\t\t\tparallel: undefined,\n\t\t\tworktree: undefined,\n\t\t\tsubagent: options.agent,\n\t\t\tinheritContext: options.inheritContext ? true : undefined,\n\t\t\tcwd: options.cwd,\n\t\t\tworkers: undefined,\n\t\t\treviewers: undefined,\n\t\t\tfinalApplier: undefined,\n\t\t};\n\t}\n\n\tasync function runComparePrompt(\n\t\tname: string,\n\t\tprompt: PromptWithModel,\n\t\targs: string,\n\t\tctx: ExtensionCommandContext,\n\t\tcurrentModel: Model<any> | undefined,\n\t\truntime: { cwd?: string; model?: string; subagentOverride?: SubagentOverride; fork?: boolean },\n\t) {\n\t\tif (runtime.subagentOverride) {\n\t\t\tnotify(ctx, `--subagent is not supported for compare prompts (ignored)`, \"warning\");\n\t\t}\n\t\tif (runtime.fork) {\n\t\t\tnotify(ctx, `--fork is not supported for compare prompts (ignored)`, \"warning\");\n\t\t}\n\n\t\tconst lineupExtraction = extractLineupOverrides(args);\n\t\tif (lineupExtraction.errors.length > 0) {\n\t\t\tfor (const error of lineupExtraction.errors) {\n\t\t\t\tnotify(ctx, error, \"error\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tlet taskArgs = parseCommandArgs(lineupExtraction.args);\n\t\tlet compareCwd = runtime.cwd ?? prompt.cwd ?? ctx.cwd;\n\t\tif (name === \"parallel-patch-compare-at-path\") {\n\t\t\tif (taskArgs.length === 0) {\n\t\t\t\tnotify(ctx, \"parallel-patch-compare-at-path requires a repo path as the first argument.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (runtime.cwd) {\n\t\t\t\tnotify(ctx, \"--cwd is ignored for parallel-patch-compare-at-path (using first positional path).\", \"warning\");\n\t\t\t}\n\t\t\tcompareCwd = resolveCompareCwd(taskArgs[0]!, ctx);\n\t\t\ttaskArgs = taskArgs.slice(1);\n\t\t\tif (taskArgs.length === 0) {\n\t\t\t\tnotify(ctx, \"parallel-patch-compare-at-path requires an implementation task after the repo path.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!existsSync(compareCwd)) {\n\t\t\tnotify(ctx, `cwd directory does not exist: ${compareCwd}`, \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst baseModel = await resolveCompareBaseModel(prompt, currentModel, ctx, runtime.model);\n\t\tif (!baseModel) return;\n\n\t\tconst rendered = renderPromptForResolvedModel(prompt, taskArgs, baseModel);\n\t\tif (rendered.warning) notify(ctx, rendered.warning, \"warning\");\n\t\tif (rendered.empty || !rendered.content) {\n\t\t\tnotify(ctx, rendered.empty ?? `Prompt \\`${prompt.name}\\` rendered to an empty message.`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst sharedTask = rendered.content;\n\n\t\tconst requestedWorkers = applyLineupActions(prompt.workers, lineupExtraction.actions, \"workers\") ?? [];\n\t\tconst requestedReviewers = applyLineupActions(prompt.reviewers, lineupExtraction.actions, \"reviewers\") ?? [];\n\t\tconst requestedFinalApplier = applyFinalApplierAction(prompt.finalApplier, lineupExtraction.actions);\n\t\tif (requestedFinalApplier && prompt.worktree !== true) {\n\t\t\tnotify(ctx, \"Compare prompts with finalApplier require worktree: true.\", \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst workerSlots = expandLineupCounts(\n\t\t\trequestedWorkers.length > 0\n\t\t\t\t? requestedWorkers\n\t\t\t\t: [{ agent: DEFAULT_SUBAGENT_NAME }],\n\t\t);\n\t\tconst reviewerSlots = expandLineupCounts(\n\t\t\trequestedReviewers.length > 0\n\t\t\t\t? requestedReviewers\n\t\t\t\t: [{ agent: \"reviewer\" }],\n\t\t);\n\n\t\tconst normalizedWorkers = normalizeLineupCwds(workerSlots, compareCwd, ctx);\n\t\tif (!normalizedWorkers) return;\n\t\tconst normalizedReviewers = normalizeLineupCwds(reviewerSlots, compareCwd, ctx);\n\t\tif (!normalizedReviewers) return;\n\t\tconst normalizedFinalApplier = requestedFinalApplier\n\t\t\t? {\n\t\t\t\t...requestedFinalApplier,\n\t\t\t\tcwd: compareCwd,\n\t\t\t}\n\t\t\t: undefined;\n\n\t\tif (prompt.worktree === true) {\n\t\t\tconst uniqueWorkerCwds = new Set(normalizedWorkers.map((slot) => slot.cwd));\n\t\t\tif (uniqueWorkerCwds.size > 1) {\n\t\t\t\tnotify(ctx, \"worktree compare runs require all worker slots to use the same cwd.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workerResult = await executeSubagentPromptStep({\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcurrentModel: baseModel,\n\t\t\t\tsignal: ctx.signal,\n\t\t\t\tworktree: prompt.worktree === true,\n\t\t\t\tallowPartialFailures: true,\n\t\t\t\tparallel: normalizedWorkers.map((slot, index) => ({\n\t\t\t\t\tprompt: buildComparePrompt(prompt, {\n\t\t\t\t\t\tname: `${prompt.name}-worker-${index + 1}`,\n\t\t\t\t\t\tagent: slot.agent,\n\t\t\t\t\t\ttask: buildLineupSlotTask(sharedTask, slot, taskArgs),\n\t\t\t\t\t\tmodel: slot.model,\n\t\t\t\t\t\tcwd: slot.cwd!,\n\t\t\t\t\t\tinheritContext: true,\n\t\t\t\t\t}),\n\t\t\t\t\targs: [],\n\t\t\t\t})),\n\t\t\t});\n\t\t\tconst workerPairs = (workerResult?.parallelResults ?? []).map((result, index) => ({\n\t\t\t\tindex,\n\t\t\t\tslot: normalizedWorkers[index]!,\n\t\t\t\tresult,\n\t\t\t}));\n\t\t\tif (workerPairs.length === 0) return;\n\t\t\tconst successfulWorkers = workerPairs.filter((entry) => !entry.result.isError);\n\t\t\tconst failedWorkers = workerPairs.filter((entry) => entry.result.isError);\n\t\t\tif (successfulWorkers.length === 0) {\n\t\t\t\tnotify(ctx, `Compare worker phase failed: all worker slots failed.`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst successfulWorkerText = [\n\t\t\t\trenderComparePhaseResults(\"Worker\", successfulWorkers),\n\t\t\t\textractSuccessfulWorktreeChanges(workerResult.text, successfulWorkers.map((entry) => entry.index)),\n\t\t\t]\n\t\t\t\t.filter((value): value is string => Boolean(value))\n\t\t\t\t.join(\"\\n\\n\");\n\t\t\tconst workerFailureSummary = formatPhaseFailureSummary(\"Worker\", failedWorkers);\n\n\t\t\tconst reviewerPreamble = buildReviewerPreamble(sharedTask, successfulWorkerText, workerFailureSummary);\n\t\t\tconst reviewerResult = await executeSubagentPromptStep({\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcurrentModel: baseModel,\n\t\t\t\tsignal: ctx.signal,\n\t\t\t\ttaskPreamble: reviewerPreamble,\n\t\t\t\tallowPartialFailures: true,\n\t\t\t\tparallel: normalizedReviewers.map((slot, index) => ({\n\t\t\t\t\tprompt: buildComparePrompt(prompt, {\n\t\t\t\t\t\tname: `${prompt.name}-reviewer-${index + 1}`,\n\t\t\t\t\t\tagent: slot.agent,\n\t\t\t\t\t\ttask: buildLineupSlotTask(DEFAULT_COMPARE_REVIEWER_TASK, slot, taskArgs),\n\t\t\t\t\t\tmodel: slot.model,\n\t\t\t\t\t\tcwd: slot.cwd!,\n\t\t\t\t\t\tinheritContext: false,\n\t\t\t\t\t}),\n\t\t\t\t\targs: [],\n\t\t\t\t})),\n\t\t\t});\n\t\t\tconst reviewerPairs = (reviewerResult?.parallelResults ?? []).map((result, index) => ({\n\t\t\t\tindex,\n\t\t\t\tslot: normalizedReviewers[index]!,\n\t\t\t\tresult,\n\t\t\t}));\n\t\t\tif (reviewerPairs.length === 0) return;\n\t\t\tconst successfulReviewers = reviewerPairs.filter((entry) => !entry.result.isError);\n\t\t\tconst failedReviewers = reviewerPairs.filter((entry) => entry.result.isError);\n\t\t\tconst successfulReviewerText = successfulReviewers.length > 0\n\t\t\t\t? renderComparePhaseResults(\"Reviewer\", successfulReviewers)\n\t\t\t\t: undefined;\n\t\t\tconst reviewerFailureSummary = formatPhaseFailureSummary(\"Reviewer\", failedReviewers);\n\n\t\t\tif (!normalizedFinalApplier) {\n\t\t\t\tif (!successfulReviewerText) {\n\t\t\t\t\tnotify(ctx, `Compare reviewer phase failed: all reviewer slots failed.`, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst finalText = reviewerFailureSummary\n\t\t\t\t\t? `${successfulReviewerText}\\n\\n${reviewerFailureSummary}`\n\t\t\t\t\t: successfulReviewerText;\n\t\t\t\tpi.sendUserMessage(`[Compare review complete: ${name}]\\n\\n${finalText}`);\n\t\t\t\tawait waitForTurnStart(ctx);\n\t\t\t\tawait ctx.waitForIdle();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst finalResult = await executeSubagentPromptStep({\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcurrentModel: baseModel,\n\t\t\t\tsignal: ctx.signal,\n\t\t\t\ttaskPreamble: buildFinalApplierPreamble(\n\t\t\t\t\tsharedTask,\n\t\t\t\t\tsuccessfulWorkerText,\n\t\t\t\t\tworkerFailureSummary,\n\t\t\t\t\tsuccessfulReviewerText,\n\t\t\t\t\treviewerFailureSummary,\n\t\t\t\t),\n\t\t\t\tprompt: buildComparePrompt(prompt, {\n\t\t\t\t\tname: `${prompt.name}-final-applier`,\n\t\t\t\t\tagent: normalizedFinalApplier.agent,\n\t\t\t\t\ttask: buildLineupSlotTask(DEFAULT_COMPARE_FINAL_APPLIER_TASK, normalizedFinalApplier, taskArgs),\n\t\t\t\t\tmodel: normalizedFinalApplier.model,\n\t\t\t\t\tcwd: compareCwd,\n\t\t\t\t\tinheritContext: false,\n\t\t\t\t}),\n\t\t\t\targs: [],\n\t\t\t});\n\t\t\tif (!finalResult?.text) return;\n\t\t\tpi.sendUserMessage(`[Compare apply complete: ${name}]\\n\\n${finalResult.text}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t} catch (error) {\n\t\t\tnotify(ctx, error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t}\n\n\tasync function collapseBoomerangPrompt(\n\t\tctx: ExtensionContext,\n\t\tname: string,\n\t\ttargetId: string | null,\n\t\tpreviousSummaries: string[] = [],\n\t) {\n\t\tif (!targetId) {\n\t\t\tnotify(ctx, `Cannot boomerang prompt \\`${name}\\`: no session entry to return to.`, \"warning\");\n\t\t\treturn;\n\t\t}\n\n\t\tboomerangCollapse = { targetId, task: name, previousSummaries };\n\t\ttry {\n\t\t\t(globalThis as typeof globalThis & { __boomerangCollapseInProgress?: boolean }).__boomerangCollapseInProgress = true;\n\t\t\tconst result = await ctx.navigateTree(targetId, { summarize: true });\n\t\t\tif (result.cancelled) notify(ctx, `Boomerang cancelled for prompt \\`${name}\\``, \"warning\");\n\t\t} finally {\n\t\t\t(globalThis as typeof globalThis & { __boomerangCollapseInProgress?: boolean }).__boomerangCollapseInProgress = false;\n\t\t\tboomerangCollapse = null;\n\t\t}\n\t}\n\n\tasync function runPromptLoop(\n\t\tname: string,\n\t\tcleanedArgs: string,\n\t\ttotalIterations: number | null,\n\t\tfreshFlag: boolean,\n\t\tconverge: boolean,\n\t\tctx: ExtensionCommandContext,\n\t\tsubagentOverride?: SubagentOverride,\n\t\tcwdOverride?: string,\n\t\tpromptOverrides?: Partial<Pick<PromptWithModel, \"models\" | \"inheritContext\">>,\n\t) {\n\t\trefreshPrompts(ctx.cwd, ctx);\n\t\tconst initialPrompt = prompts.get(name);\n\t\tif (!initialPrompt) {\n\t\t\tnotify(ctx, `Prompt \"${name}\" no longer exists`, \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst savedModel = getCurrentModel(ctx);\n\t\tconst savedThinking = pi.getThinkingLevel();\n\t\tlet currentModel = savedModel;\n\t\tlet currentThinking = savedThinking;\n\t\tconst shouldRestore = initialPrompt.restore;\n\t\tconst useFresh = freshFlag || initialPrompt.fresh === true;\n\t\tconst shouldBoomerang = initialPrompt.boomerang === true;\n\t\tconst effectiveMax = totalIterations ?? UNLIMITED_LOOP_CAP;\n\t\tconst isUnlimited = totalIterations === null;\n\t\tconst useConverge = converge && initialPrompt.converge !== false;\n\t\tconst anchorId = useFresh || shouldBoomerang ? ctx.sessionManager.getLeafId() : null;\n\n\t\tloopState = { currentIteration: 1, totalIterations };\n\t\taccumulatedSummaries = [];\n\t\tupdateLoopStatus(ctx);\n\t\tlet completedIterations = 0;\n\t\tlet converged = false;\n\t\tlet loopErrorState: ExecutionErrorState = { hasError: false, error: undefined };\n\t\tlet lastDelegatedText: string | undefined;\n\t\tlet loopAborted = false;\n\t\tlet boomerangPreviousSummaries: string[] = [];\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < effectiveMax; i++) {\n\t\t\t\tloopState.currentIteration = i + 1;\n\t\t\t\tconst iterationLabel = totalIterations !== null ? `${i + 1}/${totalIterations}` : `${i + 1}`;\n\n\t\t\t\trefreshPrompts(ctx.cwd, ctx);\n\t\t\t\tconst prompt = prompts.get(name);\n\t\t\t\tif (!prompt) {\n\t\t\t\t\tnotify(ctx, `Prompt \"${name}\" no longer exists`, \"error\");\n\t\t\t\t\tloopAborted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst effectivePrompt = { ...prompt, ...(cwdOverride ? { cwd: cwdOverride } : {}), ...promptOverrides };\n\t\t\t\tlet iterationPrompt = effectivePrompt;\n\t\t\t\tloopState!.rotationLabel = undefined;\n\t\t\t\tif (effectivePrompt.rotate && effectivePrompt.models.length > 1) {\n\t\t\t\t\tconst rotationIndex = i % effectivePrompt.models.length;\n\t\t\t\t\tconst rotatedThinking = effectivePrompt.thinkingLevels\n\t\t\t\t\t\t? effectivePrompt.thinkingLevels[rotationIndex]\n\t\t\t\t\t\t: effectivePrompt.thinking;\n\t\t\t\t\titerationPrompt = {\n\t\t\t\t\t\t...effectivePrompt,\n\t\t\t\t\t\tmodels: [effectivePrompt.models[rotationIndex]],\n\t\t\t\t\t\tthinking: rotatedThinking,\n\t\t\t\t\t};\n\t\t\t\t\tconst shortModel = effectivePrompt.models[rotationIndex].split(\"/\").pop() || effectivePrompt.models[rotationIndex];\n\t\t\t\t\tconst thinkingLabel = rotatedThinking ? ` ${rotatedThinking}` : \"\";\n\t\t\t\t\tloopState!.rotationLabel = `${shortModel}${thinkingLabel}`;\n\t\t\t\t}\n\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\tconst rotationSuffix = loopState!.rotationLabel ? ` [${loopState!.rotationLabel}]` : \"\";\n\t\t\t\tnotify(ctx, `Loop ${iterationLabel}: ${name}${rotationSuffix}`, \"info\");\n\n\t\t\t\tconst loopContext = loopState!.rotationLabel\n\t\t\t\t\t? `Loop ${iterationLabel} · ${loopState!.rotationLabel}`\n\t\t\t\t\t: `Loop ${iterationLabel}`;\n\t\t\t\tconst iterationStartId = ctx.sessionManager.getLeafId();\n\t\t\t\tconst stepResult = await executePromptStep(\n\t\t\t\t\titerationPrompt,\n\t\t\t\t\tparseCommandArgs(cleanedArgs),\n\t\t\t\t\tctx,\n\t\t\t\t\tcurrentModel,\n\t\t\t\t\tsubagentOverride,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tloopContext,\n\t\t\t\t);\n\t\t\t\tif (stepResult === \"aborted\") {\n\t\t\t\t\tloopAborted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst delegatedStep = shouldDelegatePrompt(iterationPrompt, subagentOverride);\n\t\t\t\tif (delegatedStep) {\n\t\t\t\t\tlastDelegatedText = stepResult.text;\n\t\t\t\t}\n\n\t\t\t\tcurrentModel = getCurrentModel(ctx);\n\t\t\t\tcurrentThinking = pi.getThinkingLevel();\n\t\t\t\tcompletedIterations++;\n\n\t\t\t\tconst iterationChanged = delegatedStep\n\t\t\t\t\t? stepResult.changed\n\t\t\t\t\t: didIterationMakeChanges(getIterationEntries(ctx, iterationStartId));\n\t\t\t\tif (useConverge && (isUnlimited || effectiveMax > 1) && !iterationChanged) {\n\t\t\t\t\tconverged = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (useFresh && anchorId && i < effectiveMax - 1) {\n\t\t\t\t\tfreshCollapse = { targetId: anchorId, task: name, iteration: i + 1, totalIterations };\n\t\t\t\t\tconst result = await ctx.navigateTree(anchorId, { summarize: true });\n\t\t\t\t\tfreshCollapse = null;\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\tloopAborted = true;\n\t\t\t\t\t\tnotify(ctx, \"Loop cancelled\", \"warning\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tloopErrorState = { hasError: true, error };\n\t\t} finally {\n\t\t\tloopErrorState = await restoreAfterExecution(\n\t\t\t\tctx,\n\t\t\t\tshouldRestore,\n\t\t\t\tsavedModel,\n\t\t\t\tsavedThinking,\n\t\t\t\tgetCurrentModel(ctx),\n\t\t\t\tpi.getThinkingLevel(),\n\t\t\t\tloopErrorState,\n\t\t\t\t\"loop\",\n\t\t\t);\n\n\t\t\tboomerangPreviousSummaries = accumulatedSummaries;\n\t\t\tloopState = null;\n\t\t\tpendingSkillMessage = undefined;\n\t\t\tfreshCollapse = null;\n\t\t\tboomerangCollapse = null;\n\t\t\taccumulatedSummaries = [];\n\t\t\tupdateLoopStatus(ctx);\n\n\t\t\tif (!loopErrorState.hasError) {\n\t\t\t\tnotifyLoopCompletion(ctx, completedIterations, totalIterations, effectiveMax, converged, false);\n\t\t\t}\n\t\t}\n\n\t\tif (lastDelegatedText && !loopErrorState.hasError && !loopAborted) {\n\t\t\tconst label = converged\n\t\t\t\t? `Delegated loop converged after ${completedIterations} iteration(s): ${name}`\n\t\t\t\t: `Delegated loop completed ${completedIterations} iteration(s): ${name}`;\n\t\t\tpi.sendUserMessage(`[${label}]\\n\\n${lastDelegatedText}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t}\n\n\t\tif (!loopErrorState.hasError && !loopAborted && shouldBoomerang) {\n\t\t\tawait collapseBoomerangPrompt(ctx, name, anchorId, boomerangPreviousSummaries);\n\t\t}\n\n\t\tif (loopErrorState.hasError) {\n\t\t\tthrow loopErrorState.error;\n\t\t}\n\t}\n\n\tasync function runSharedChainExecution(\n\t\tsteps: ChainStepOrParallel[],\n\t\tsharedArgs: string[],\n\t\ttotalIterations: number | null,\n\t\tfresh: boolean,\n\t\tconverge: boolean,\n\t\tshouldRestore: boolean,\n\t\tctx: ExtensionCommandContext,\n\t\tsubagentOverride?: SubagentOverride,\n\t\tcwdOverride?: string,\n\t\tchainContextEnabled = false,\n\t\tchainTemplateWorktree = false,\n\t\tcliWorktree = false,\n\t) {\n\t\tlet worktreeEnabled = chainTemplateWorktree || cliWorktree;\n\t\tif (worktreeEnabled && !steps.some(isParallelChainStep)) {\n\t\t\tnotify(ctx, `--worktree ignored: chain has no parallel() steps`, \"warning\");\n\t\t\tworktreeEnabled = false;\n\t\t}\n\t\tconst flattenChainSteps = (): ChainStep[] => {\n\t\t\tconst flattened: ChainStep[] = [];\n\t\t\tfor (const step of steps) {\n\t\t\t\tif (isParallelChainStep(step)) {\n\t\t\t\t\tflattened.push(...step.parallel);\n\t\t\t\t} else {\n\t\t\t\t\tflattened.push(step);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn flattened;\n\t\t};\n\n\t\tconst validateChainSteps = (): boolean => {\n\t\t\tconst flattened = flattenChainSteps();\n\t\t\tconst missingTemplates = flattened.filter((step) => !chainPrompts.has(step.name));\n\t\t\tif (missingTemplates.length > 0) {\n\t\t\t\tnotify(ctx, `Templates not found: ${missingTemplates.map((step) => step.name).join(\", \")}`, \"error\");\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor (const step of steps) {\n\t\t\t\tif (isParallelChainStep(step)) {\n\t\t\t\t\tfor (const parallelStep of step.parallel) {\n\t\t\t\t\t\tif (parallelStep.loopCount !== undefined) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" in parallel() does not support per-task --loop.`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (parallelStep.withContext === true) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" in parallel() does not support per-task --with-context.`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst stepPrompt = chainPrompts.get(parallelStep.name);\n\t\t\t\t\t\tif (!stepPrompt) continue;\n\t\t\t\t\t\tif (stepPrompt.chain) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" is a chain template. Chain nesting is not supported.`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!shouldDelegatePrompt(stepPrompt, subagentOverride)) {\n\t\t\t\t\t\t\tnotify(ctx, `Step \"${parallelStep.name}\" in parallel() must use delegated execution (subagent).`, \"error\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst stepPrompt = chainPrompts.get(step.name);\n\t\t\t\tif (!stepPrompt) continue;\n\t\t\t\tif (stepPrompt.chain) {\n\t\t\t\t\tnotify(ctx, `Step \"${step.name}\" is a chain template. Chain nesting is not supported.`, \"error\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tif (!validateChainSteps()) return;\n\n\t\tconst originalModel = getCurrentModel(ctx);\n\t\tconst chainInheritedModel = originalModel;\n\t\tconst originalThinking = pi.getThinkingLevel();\n\t\tlet currentModel = originalModel;\n\t\tlet currentThinking = originalThinking;\n\t\tchainActive = true;\n\t\tpendingSkillMessage = undefined;\n\t\tconst effectiveMax = totalIterations ?? UNLIMITED_LOOP_CAP;\n\t\tconst isUnlimited = totalIterations === null;\n\t\tconst useConverge = converge;\n\n\t\tconst anchorId = fresh ? ctx.sessionManager.getLeafId() : null;\n\t\tconst chainStepNames = steps\n\t\t\t.map((step) => (isParallelChainStep(step) ? `parallel(${step.parallel.map((item) => item.name).join(\", \")})` : step.name))\n\t\t\t.join(\" -> \");\n\t\tlet completedIterations = 0;\n\t\tlet converged = false;\n\t\tlet chainErrorState: ExecutionErrorState = { hasError: false, error: undefined };\n\t\tlet lastDelegatedText: string | undefined;\n\t\tlet chainAborted = false;\n\t\tif (effectiveMax > 1) {\n\t\t\tloopState = { currentIteration: 1, totalIterations };\n\t\t\taccumulatedSummaries = [];\n\t\t\tupdateLoopStatus(ctx);\n\t\t}\n\n\t\ttry {\n\t\t\tfor (let iteration = 0; iteration < effectiveMax; iteration++) {\n\t\t\t\tif (effectiveMax > 1) {\n\t\t\t\t\tloopState!.currentIteration = iteration + 1;\n\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\trefreshPrompts(ctx.cwd, ctx);\n\t\t\t\t\tif (!validateChainSteps()) {\n\t\t\t\t\t\tchainAborted = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst templates = steps.map((step) =>\n\t\t\t\t\tisParallelChainStep(step)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tkind: \"parallel\" as const,\n\t\t\t\t\t\t\ttasks: step.parallel.map((item) => ({\n\t\t\t\t\t\t\t\tname: item.name,\n\t\t\t\t\t\t\t\targs: item.args,\n\t\t\t\t\t\t\t\tprompt: {\n\t\t\t\t\t\t\t\t\t...chainPrompts.get(item.name)!,\n\t\t\t\t\t\t\t\t\t...(cwdOverride ? { cwd: cwdOverride } : {}),\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\t: {\n\t\t\t\t\t\t\tkind: \"single\" as const,\n\t\t\t\t\t\t\tsingleStep: {\n\t\t\t\t\t\t\t\tprompt: {\n\t\t\t\t\t\t\t\t\t...chainPrompts.get(step.name)!,\n\t\t\t\t\t\t\t\t\t...(cwdOverride ? { cwd: cwdOverride } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstepArgs: step.args,\n\t\t\t\t\t\t\t\tstepLoop: step.loopCount !== undefined ? step.loopCount : 1,\n\t\t\t\t\t\t\t\tstepWithContext: step.withContext === true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst chainStepSummaries: string[] = [];\n\t\t\t\tlet aborted = false;\n\t\t\t\tlet iterationChanged = false;\n\t\t\t\tlet loopPrefix = \"\";\n\t\t\t\tif (effectiveMax > 1) {\n\t\t\t\t\tconst label = totalIterations !== null ? `${iteration + 1}/${totalIterations}` : `${iteration + 1}`;\n\t\t\t\t\tloopPrefix = `Loop ${label}, `;\n\t\t\t\t}\n\n\t\t\t\tfor (const [index, stepTemplate] of templates.entries()) {\n\t\t\t\t\tconst stepNumber = index + 1;\n\t\t\t\t\tif (stepTemplate.kind === \"parallel\") {\n\t\t\t\t\t\tconst stepNames = stepTemplate.tasks.map((task) => task.name).join(\", \");\n\t\t\t\t\t\tconst stepLabel = `parallel(${stepNames})`;\n\t\t\t\t\t\tnotify(ctx, `${loopPrefix}Step ${stepNumber}/${templates.length}: parallel(${stepNames})`, \"info\");\n\t\t\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\t\t\tctx.ui.setStatus(\"prompt-chain\", ctx.ui.theme.fg(\"warning\", `step ${stepNumber}/${templates.length}: parallel(${stepNames})`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst stepStartId = ctx.sessionManager.getLeafId();\n\t\t\t\t\t\tlet taskPreamble: string | undefined;\n\t\t\t\t\t\tconst isForkedParallelContext = stepTemplate.tasks.some((task) => task.prompt.inheritContext === true);\n\t\t\t\t\t\tif (chainContextEnabled && !isForkedParallelContext && chainStepSummaries.length > 0) {\n\t\t\t\t\t\t\ttaskPreamble = `[Previous chain steps]\\n\\n${chainStepSummaries.join(\"\\n\\n\")}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet delegated;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdelegated = await executeSubagentPromptStep({\n\t\t\t\t\t\t\t\tpi,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\t\toverride: subagentOverride,\n\t\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\t\tinheritedModel: chainInheritedModel,\n\t\t\t\t\t\t\t\tparallel: stepTemplate.tasks.map((task) => ({\n\t\t\t\t\t\t\t\t\tprompt: task.prompt,\n\t\t\t\t\t\t\t\t\targs: task.args.length > 0 ? task.args : sharedArgs,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\ttaskPreamble,\n\t\t\t\t\t\t\t\tworktree: worktreeEnabled,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tnotify(ctx, error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!delegated) {\n\t\t\t\t\t\t\tnotify(ctx, \"Parallel chain step was not delegated.\", \"error\");\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastDelegatedText = delegated.text;\n\n\t\t\t\t\t\tcurrentModel = getCurrentModel(ctx);\n\t\t\t\t\t\tcurrentThinking = pi.getThinkingLevel();\n\t\t\t\t\t\tconst stepEntries = getIterationEntries(ctx, stepStartId);\n\t\t\t\t\t\tif (delegated.changed) iterationChanged = true;\n\t\t\t\t\t\tchainStepSummaries.push(generateChainStepSummary(stepEntries, stepLabel, stepNumber));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst singleStep = stepTemplate.singleStep;\n\t\t\t\t\tconst stepLoopTotal = singleStep.stepLoop;\n\t\t\t\t\tconst stepLoopMax = stepLoopTotal ?? UNLIMITED_LOOP_CAP;\n\t\t\t\t\tconst isStepLooping = stepLoopMax > 1;\n\t\t\t\t\tconst effectiveArgs = singleStep.stepArgs.length > 0 ? singleStep.stepArgs : sharedArgs;\n\t\t\t\t\tconst shouldInjectSummary =\n\t\t\t\t\t\tshouldDelegatePrompt(singleStep.prompt, subagentOverride) &&\n\t\t\t\t\t\tsingleStep.prompt.inheritContext !== true &&\n\t\t\t\t\t\t(chainContextEnabled || singleStep.stepWithContext === true);\n\t\t\t\t\tconst outerLoopState = loopState ? { ...loopState } : null;\n\t\t\t\t\tconst stepStartId = ctx.sessionManager.getLeafId();\n\t\t\t\t\tif (isStepLooping) {\n\t\t\t\t\t\tloopState = { currentIteration: 1, totalIterations: stepLoopTotal };\n\t\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (let stepIteration = 0; stepIteration < stepLoopMax; stepIteration++) {\n\t\t\t\t\t\t\tif (isStepLooping) {\n\t\t\t\t\t\t\t\tloopState = { currentIteration: stepIteration + 1, totalIterations: stepLoopTotal };\n\t\t\t\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst iterSuffix = isStepLooping\n\t\t\t\t\t\t\t\t? stepLoopTotal !== null\n\t\t\t\t\t\t\t\t\t? ` (iter ${stepIteration + 1}/${stepLoopTotal})`\n\t\t\t\t\t\t\t\t\t: ` (iter ${stepIteration + 1})`\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tnotify(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t`${loopPrefix}Step ${stepNumber}/${templates.length}: ${singleStep.prompt.name}${iterSuffix} ${buildPromptCommandDescription(singleStep.prompt)}`,\n\t\t\t\t\t\t\t\t\"info\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\t\t\t\tctx.ui.setStatus(\"prompt-chain\", ctx.ui.theme.fg(\"warning\", `step ${stepNumber}/${templates.length}: ${singleStep.prompt.name}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst taskPreamble = shouldInjectSummary && chainStepSummaries.length > 0\n\t\t\t\t\t\t\t\t? `[Previous chain steps]\\n\\n${chainStepSummaries.join(\"\\n\\n\")}`\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\tconst stepLoopContext = isStepLooping\n\t\t\t\t\t\t\t\t? `Step ${stepNumber}/${templates.length}: ${singleStep.prompt.name}${iterSuffix}`\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\tconst stepIterationStartId = ctx.sessionManager.getLeafId();\n\t\t\t\t\t\t\tconst stepResult = await executePromptStep(\n\t\t\t\t\t\t\t\tsingleStep.prompt,\n\t\t\t\t\t\t\t\teffectiveArgs,\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\tcurrentModel,\n\t\t\t\t\t\t\t\tsubagentOverride,\n\t\t\t\t\t\t\t\tchainInheritedModel,\n\t\t\t\t\t\t\t\ttaskPreamble,\n\t\t\t\t\t\t\t\tstepLoopContext,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (stepResult === \"aborted\") {\n\t\t\t\t\t\t\t\tchainAborted = true;\n\t\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (shouldDelegatePrompt(singleStep.prompt, subagentOverride)) {\n\t\t\t\t\t\t\t\tlastDelegatedText = stepResult.text;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcurrentModel = getCurrentModel(ctx);\n\t\t\t\t\t\t\tcurrentThinking = pi.getThinkingLevel();\n\n\t\t\t\t\t\t\tconst stepIterationEntries = getIterationEntries(ctx, stepIterationStartId);\n\t\t\t\t\t\t\tconst stepIterationChanged = didIterationMakeChanges(stepIterationEntries);\n\t\t\t\t\t\t\tif (isStepLooping && singleStep.prompt.converge !== false && !stepIterationChanged) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (isStepLooping) {\n\t\t\t\t\t\t\tloopState = outerLoopState ? { ...outerLoopState } : null;\n\t\t\t\t\t\t\tupdateLoopStatus(ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (aborted) break;\n\t\t\t\t\tconst stepEntries = getIterationEntries(ctx, stepStartId);\n\t\t\t\t\tif (didIterationMakeChanges(stepEntries)) iterationChanged = true;\n\t\t\t\t\tchainStepSummaries.push(generateChainStepSummary(stepEntries, singleStep.prompt.name, stepNumber));\n\t\t\t\t}\n\n\t\t\t\tif (aborted) {\n\t\t\t\t\tchainAborted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcompletedIterations++;\n\n\t\t\t\tif (useConverge && (isUnlimited || effectiveMax > 1) && !iterationChanged) {\n\t\t\t\t\tconverged = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (anchorId && iteration < effectiveMax - 1) {\n\t\t\t\t\tfreshCollapse = { targetId: anchorId, task: chainStepNames, iteration: iteration + 1, totalIterations };\n\t\t\t\t\tconst result = await ctx.navigateTree(anchorId, { summarize: true });\n\t\t\t\t\tfreshCollapse = null;\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\tchainAborted = true;\n\t\t\t\t\t\tnotify(ctx, \"Loop cancelled\", \"warning\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} catch (error) {\n\t\t\tchainErrorState = { hasError: true, error };\n\t\t} finally {\n\t\t\tchainErrorState = await restoreAfterExecution(\n\t\t\t\tctx,\n\t\t\t\tshouldRestore,\n\t\t\t\toriginalModel,\n\t\t\t\toriginalThinking,\n\t\t\t\tgetCurrentModel(ctx),\n\t\t\t\tpi.getThinkingLevel(),\n\t\t\t\tchainErrorState,\n\t\t\t\t\"chain\",\n\t\t\t);\n\n\t\t\tpendingSkillMessage = undefined;\n\t\t\tchainActive = false;\n\t\t\tloopState = null;\n\t\t\tfreshCollapse = null;\n\t\t\tboomerangCollapse = null;\n\t\t\taccumulatedSummaries = [];\n\t\t\tupdateLoopStatus(ctx);\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tctx.ui.setStatus(\"prompt-chain\", undefined);\n\t\t\t}\n\n\t\t\tif (!chainErrorState.hasError) {\n\t\t\t\tnotifyLoopCompletion(ctx, completedIterations, totalIterations, effectiveMax, converged, true);\n\t\t\t}\n\t\t}\n\n\t\tif (lastDelegatedText && !chainErrorState.hasError && !chainAborted) {\n\t\t\tpi.sendUserMessage(`[Delegated chain complete: ${chainStepNames}]\\n\\n${lastDelegatedText}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t}\n\n\t\tif (chainErrorState.hasError) {\n\t\t\tthrow chainErrorState.error;\n\t\t}\n\t}\n\n\tasync function runPromptCommand(name: string, args: string, ctx: ExtensionCommandContext) {\n\t\tstoredCommandCtx = ctx;\n\t\trefreshPrompts(ctx.cwd, ctx);\n\t\tconst prompt = prompts.get(name);\n\t\tif (!prompt) {\n\t\t\tnotify(ctx, `Prompt \"${name}\" no longer exists`, \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst subagent = extractSubagentOverride(args);\n\t\tconst runtimeCwd = subagent.cwd ? expandCwdPath(subagent.cwd) : undefined;\n\t\tif (subagent.cwd && !runtimeCwd) {\n\t\t\tnotify(ctx, `Invalid --cwd path: must be absolute`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst argsWithoutSubagent = subagent.args;\n\t\tif (prompt.deterministic) {\n\t\t\tif (subagent.override || subagent.fork) {\n\t\t\t\tnotify(ctx, `Deterministic prompts do not support runtime --subagent/--fork in v1`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (extractLoopCount(argsWithoutSubagent)) {\n\t\t\t\tnotify(ctx, `Deterministic prompts do not support runtime --loop in v1`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst hasCompareLineup = prompt.workers !== undefined || prompt.reviewers !== undefined || prompt.finalApplier !== undefined;\n\t\tif (hasCompareLineup) {\n\t\t\tawait runComparePrompt(\n\t\t\t\tname,\n\t\t\t\tprompt,\n\t\t\t\targsWithoutSubagent,\n\t\t\t\tctx,\n\t\t\t\tgetCurrentModel(ctx),\n\t\t\t\t{\n\t\t\t\t\tcwd: runtimeCwd,\n\t\t\t\t\tmodel: subagent.model,\n\t\t\t\t\tsubagentOverride: subagent.override,\n\t\t\t\t\tfork: subagent.fork,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (prompt.chain) {\n\t\t\tif (subagent.model) notify(ctx, `--model is not supported on chain prompts (ignored)`, \"warning\");\n\t\t\tif (subagent.fork) notify(ctx, `--fork is not supported on chain prompts (ignored)`, \"warning\");\n\t\t\tconst worktreeExtraction = extractWorktreeFlag(argsWithoutSubagent);\n\t\t\tconst extracted = extractChainContextFlag(worktreeExtraction.args);\n\t\t\tconst chainContextEnabled = extracted.chainContext || prompt.chainContext === \"summary\";\n\t\t\tconst cliWorktree = worktreeExtraction.worktree;\n\t\t\tconst loop = extractLoopCount(extracted.args);\n\t\t\tlet totalIterations: number | null = prompt.loop !== undefined ? prompt.loop : 1;\n\t\t\tlet fresh = false;\n\t\t\tlet converge = true;\n\t\t\tlet cleanedArgs = extracted.args;\n\n\t\t\tif (loop) {\n\t\t\t\ttotalIterations = loop.loopCount;\n\t\t\t\tfresh = loop.fresh;\n\t\t\t\tconverge = loop.converge;\n\t\t\t\tcleanedArgs = loop.args;\n\t\t\t} else if (prompt.loop !== undefined) {\n\t\t\t\tconst flags = extractLoopFlags(extracted.args);\n\t\t\t\tfresh = flags.fresh;\n\t\t\t\tconverge = flags.converge;\n\t\t\t\tcleanedArgs = flags.args;\n\t\t\t}\n\n\t\t\tconst { steps, invalidSegments } = parseChainDeclaration(prompt.chain);\n\t\t\tif (invalidSegments.length > 0) {\n\t\t\t\tnotify(ctx, `Invalid chain step: ${invalidSegments[0]}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (steps.length === 0) {\n\t\t\t\tnotify(ctx, \"No templates specified\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cwdOverride = runtimeCwd ?? prompt.cwd;\n\t\t\tawait runSharedChainExecution(\n\t\t\t\tsteps,\n\t\t\t\tparseCommandArgs(cleanedArgs),\n\t\t\t\ttotalIterations,\n\t\t\t\tfresh || prompt.fresh === true,\n\t\t\t\tconverge && prompt.converge !== false,\n\t\t\t\tprompt.restore,\n\t\t\t\tctx,\n\t\t\t\tsubagent.override,\n\t\t\t\tcwdOverride,\n\t\t\t\tchainContextEnabled,\n\t\t\t\tprompt.worktree === true,\n\t\t\t\tcliWorktree,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst promptOverrides: Partial<Pick<PromptWithModel, \"models\" | \"inheritContext\">> = {\n\t\t\t...(subagent.model ? { models: [subagent.model] } : {}),\n\t\t\t...(subagent.fork ? { inheritContext: true } : {}),\n\t\t};\n\n\t\tconst loop = extractLoopCount(argsWithoutSubagent);\n\t\tif (loop) {\n\t\t\tawait runPromptLoop(name, loop.args, loop.loopCount, loop.fresh, loop.converge, ctx, subagent.override, runtimeCwd, promptOverrides);\n\t\t\treturn;\n\t\t}\n\n\t\tif (prompt.loop !== undefined) {\n\t\t\tconst flags = extractLoopFlags(argsWithoutSubagent);\n\t\t\tawait runPromptLoop(name, flags.args, prompt.loop, flags.fresh, flags.converge, ctx, subagent.override, runtimeCwd, promptOverrides);\n\t\t\treturn;\n\t\t}\n\n\t\tconst effectivePrompt = {\n\t\t\t...prompt,\n\t\t\t...(runtimeCwd ? {\n\t\t\t\tcwd: runtimeCwd,\n\t\t\t\t...(prompt.deterministic ? { deterministic: { ...prompt.deterministic, cwd: runtimeCwd } } : {}),\n\t\t\t} : {}),\n\t\t\t...promptOverrides,\n\t\t};\n\t\tconst savedModel = getCurrentModel(ctx);\n\t\tconst savedThinking = pi.getThinkingLevel();\n\t\tconst isDelegatedPrompt = shouldDelegatePrompt(effectivePrompt, subagent.override);\n\t\tconst promptTurnRestore = !isDelegatedPrompt && prompt.restore\n\t\t\t? { originalModel: savedModel, originalThinking: savedThinking }\n\t\t\t: undefined;\n\t\tconst boomerangTargetId = effectivePrompt.boomerang ? ctx.sessionManager.getLeafId() : null;\n\t\tconst stepResult = await executePromptStep(\n\t\t\teffectivePrompt,\n\t\t\tparseCommandArgs(argsWithoutSubagent),\n\t\t\tctx,\n\t\t\tsavedModel,\n\t\t\tsubagent.override,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tpromptTurnRestore,\n\t\t);\n\t\tif (stepResult === \"aborted\") return;\n\t\tif (isDelegatedPrompt && stepResult.text) {\n\t\t\tpi.sendUserMessage(`[Delegated result: ${name}]\\n\\n${stepResult.text}`);\n\t\t\tawait waitForTurnStart(ctx);\n\t\t\tawait ctx.waitForIdle();\n\t\t}\n\n\t\tif (effectivePrompt.boomerang) {\n\t\t\tawait collapseBoomerangPrompt(ctx, name, boomerangTargetId);\n\t\t}\n\t}\n\n\tfunction resetSessionScopedState(ctx: ExtensionContext) {\n\t\tstoredCommandCtx = null;\n\t\tpendingSkillMessage = undefined;\n\t\tpreviousModel = undefined;\n\t\tpreviousThinking = undefined;\n\t\truntimeModel = ctx.model;\n\t\tboomerangCollapse = null;\n\t\ttoolManager.clearQueue();\n\t\trefreshPrompts(ctx.cwd, ctx);\n\t}\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tresetSessionScopedState(ctx);\n\t});\n\n\tpi.on(\"model_select\", async (event) => {\n\t\truntimeModel = event.model;\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tlet systemPrompt = event.systemPrompt;\n\n\t\tif (toolManager.isEnabled() && !loopState && !chainActive) {\n\t\t\tconst toolGuidance = toolManager.getGuidance();\n\t\t\tconst guidance = toolGuidance\n\t\t\t\t? `The run-prompt tool is available for running prompt template commands. ${toolGuidance}`\n\t\t\t\t: \"The run-prompt tool is available for running prompt template commands.\";\n\t\t\tsystemPrompt += `\\n\\n${guidance}`;\n\t\t}\n\n\t\tif (loopState) {\n\t\t\tconst iterText =\n\t\t\t\tloopState.totalIterations !== null\n\t\t\t\t\t? `iteration ${loopState.currentIteration} of ${loopState.totalIterations}`\n\t\t\t\t\t: `iteration ${loopState.currentIteration}`;\n\t\t\tsystemPrompt += `\\n\\nYou are on ${iterText} of the same prompt. Previous iterations and their results are visible in the conversation above. Build on that work — focus on what remains to improve.`;\n\t\t}\n\n\t\tconst skillMessage = consumePendingSkillMessage();\n\t\tconst hasSystemPromptOverride = systemPrompt !== event.systemPrompt;\n\t\tif (!hasSystemPromptOverride && !skillMessage) return;\n\n\t\treturn {\n\t\t\t...(hasSystemPromptOverride ? { systemPrompt } : {}),\n\t\t\t...(skillMessage ? { message: skillMessage } : {}),\n\t\t};\n\t});\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (chainActive) return;\n\t\tif (loopState) return;\n\n\t\tconst restoreModel = previousModel;\n\t\tconst restoreThinking = previousThinking;\n\t\tif (!restoreModel && restoreThinking === undefined && !toolManager.hasQueuedCommand()) return;\n\n\t\truntimeModel = ctx.model;\n\n\t\tpreviousModel = undefined;\n\t\tpreviousThinking = undefined;\n\n\t\tconst restoreFn = async () => {\n\t\t\tif (restoreModel || restoreThinking !== undefined) {\n\t\t\t\tawait restoreSessionState(ctx, restoreModel, restoreThinking, getCurrentModel(ctx), pi.getThinkingLevel());\n\t\t\t}\n\t\t};\n\t\tconst processed = await toolManager.processQueue(ctx, restoreFn);\n\t\tif (processed) return;\n\t\tawait restoreFn();\n\t});\n\n\tpi.on(\"session_before_tree\", async (event) => {\n\t\tif (boomerangCollapse && event.preparation.targetId === boomerangCollapse.targetId) {\n\t\t\tconst summary = generateBoomerangSummary(event.preparation.entriesToSummarize, boomerangCollapse.task);\n\t\t\treturn {\n\t\t\t\tsummary: {\n\t\t\t\t\tsummary: [...boomerangCollapse.previousSummaries, summary].join(\"\\n\\n---\\n\\n\"),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (!freshCollapse) return;\n\t\tif (event.preparation.targetId !== freshCollapse.targetId) return;\n\n\t\tconst summary = generateIterationSummary(\n\t\t\tevent.preparation.entriesToSummarize,\n\t\t\tfreshCollapse.task,\n\t\t\tfreshCollapse.iteration,\n\t\t\tfreshCollapse.totalIterations,\n\t\t);\n\t\taccumulatedSummaries.push(summary);\n\n\t\treturn {\n\t\t\tsummary: {\n\t\t\t\tsummary: accumulatedSummaries.join(\"\\n\\n---\\n\\n\"),\n\t\t\t},\n\t\t};\n\t});\n\n\tasync function runChainCommand(args: string, ctx: ExtensionCommandContext) {\n\t\tstoredCommandCtx = ctx;\n\t\trefreshPrompts(ctx.cwd, ctx);\n\n\t\tconst subagent = extractSubagentOverride(args);\n\t\tconst runtimeCwd = subagent.cwd ? expandCwdPath(subagent.cwd) : undefined;\n\t\tif (subagent.cwd && !runtimeCwd) {\n\t\t\tnotify(ctx, `Invalid --cwd path: must be absolute`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst worktreeExtraction = extractWorktreeFlag(subagent.args);\n\t\tconst extracted = extractChainContextFlag(worktreeExtraction.args);\n\t\tconst loop = extractLoopCount(extracted.args);\n\t\tconst cleanedArgs = loop ? loop.args : extracted.args;\n\n\t\tconst { steps, sharedArgs, invalidSegments } = parseChainSteps(cleanedArgs);\n\t\tif (invalidSegments.length > 0) {\n\t\t\tnotify(ctx, `Invalid chain step: ${invalidSegments[0]}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (steps.length === 0) {\n\t\t\tnotify(ctx, \"No templates specified\", \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait runSharedChainExecution(\n\t\t\tsteps,\n\t\t\tsharedArgs,\n\t\t\tloop ? loop.loopCount : 1,\n\t\t\tloop?.fresh === true,\n\t\t\tloop?.converge ?? true,\n\t\t\ttrue,\n\t\t\tctx,\n\t\t\tsubagent.override,\n\t\t\truntimeCwd,\n\t\t\textracted.chainContext,\n\t\t\tfalse,\n\t\t\tworktreeExtraction.worktree,\n\t\t);\n\t}\n\n\tif (toolManager.isEnabled()) toolManager.ensureRegistered();\n\n\tpi.registerCommand(\"chain-prompts\", {\n\t\tdescription: \"Chain prompt templates sequentially [template -> template -> ...]\",\n\t\thandler: async (args, ctx) => {\n\t\t\tawait runChainCommand(args, ctx);\n\t\t},\n\t});\n\ttoolManager.registerCommand();\n}\n"]}
|