iosm-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/LICENSE +21 -0
- package/README.md +650 -0
- package/dist/cli/args.d.ts +54 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +331 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +79 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +92 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +34 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +88 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +262 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-profiles.d.ts +29 -0
- package/dist/core/agent-profiles.d.ts.map +1 -0
- package/dist/core/agent-profiles.js +86 -0
- package/dist/core/agent-profiles.js.map +1 -0
- package/dist/core/agent-session.d.ts +688 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +3112 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/agent-teams.d.ts +41 -0
- package/dist/core/agent-teams.d.ts.map +1 -0
- package/dist/core/agent-teams.js +90 -0
- package/dist/core/agent-teams.js.map +1 -0
- package/dist/core/ask-user-tool.d.ts +22 -0
- package/dist/core/ask-user-tool.d.ts.map +1 -0
- package/dist/core/ask-user-tool.js +115 -0
- package/dist/core/ask-user-tool.js.map +1 -0
- package/dist/core/auth-storage.d.ts +133 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +391 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +49 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +213 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +86 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +242 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +610 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +35 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +138 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +71 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +34 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +222 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +971 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1590 -0
- package/dist/core/export-html/tool-renderer.d.ts +35 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +63 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +25 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +447 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +146 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +652 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1074 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +35 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +27 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +102 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +32 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +134 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/hooks.d.ts +53 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +332 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +55 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +157 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/mcp/cli.d.ts +27 -0
- package/dist/core/mcp/cli.d.ts.map +1 -0
- package/dist/core/mcp/cli.js +275 -0
- package/dist/core/mcp/cli.js.map +1 -0
- package/dist/core/mcp/config.d.ts +11 -0
- package/dist/core/mcp/config.d.ts.map +1 -0
- package/dist/core/mcp/config.js +310 -0
- package/dist/core/mcp/config.js.map +1 -0
- package/dist/core/mcp/index.d.ts +5 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +4 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/runtime.d.ts +42 -0
- package/dist/core/mcp/runtime.d.ts.map +1 -0
- package/dist/core/mcp/runtime.js +387 -0
- package/dist/core/mcp/runtime.js.map +1 -0
- package/dist/core/mcp/types.d.ts +76 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +2 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/memory.d.ts +27 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +203 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/messages.d.ts +84 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +141 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +115 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +549 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +104 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +448 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/package-manager.d.ts +156 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +1465 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/parallel-task-agent.d.ts +19 -0
- package/dist/core/parallel-task-agent.d.ts.map +1 -0
- package/dist/core/parallel-task-agent.js +482 -0
- package/dist/core/parallel-task-agent.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +50 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +251 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/qwen-cli-provider.d.ts +10 -0
- package/dist/core/qwen-cli-provider.d.ts.map +1 -0
- package/dist/core/qwen-cli-provider.js +271 -0
- package/dist/core/qwen-cli-provider.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +17 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +60 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +195 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +820 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/sdk.d.ts +106 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +460 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-manager.d.ts +323 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1094 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +243 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +691 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +58 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +364 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +64 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/subagent-runs.d.ts +16 -0
- package/dist/core/subagent-runs.d.ts.map +1 -0
- package/dist/core/subagent-runs.js +70 -0
- package/dist/core/subagent-runs.js.map +1 -0
- package/dist/core/subagents.d.ts +45 -0
- package/dist/core/subagents.d.ts.map +1 -0
- package/dist/core/subagents.js +467 -0
- package/dist/core/subagents.js.map +1 -0
- package/dist/core/system-prompt.d.ts +28 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +196 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/task-plan.d.ts +32 -0
- package/dist/core/task-plan.d.ts.map +1 -0
- package/dist/core/task-plan.js +155 -0
- package/dist/core/task-plan.js.map +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +26 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +58 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +275 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +63 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +243 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +42 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +158 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/find.d.ts +39 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +219 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +45 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +254 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/ignore-filter.d.ts +5 -0
- package/dist/core/tools/ignore-filter.d.ts.map +1 -0
- package/dist/core/tools/ignore-filter.js +97 -0
- package/dist/core/tools/ignore-filter.js.map +1 -0
- package/dist/core/tools/index.d.ts +97 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +78 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +46 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +136 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +81 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/permissions.d.ts +8 -0
- package/dist/core/tools/permissions.d.ts.map +1 -0
- package/dist/core/tools/permissions.js +2 -0
- package/dist/core/tools/permissions.js.map +1 -0
- package/dist/core/tools/read.d.ts +39 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +166 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/task.d.ts +109 -0
- package/dist/core/tools/task.d.ts.map +1 -0
- package/dist/core/tools/task.js +1065 -0
- package/dist/core/tools/task.js.map +1 -0
- package/dist/core/tools/todo.d.ts +42 -0
- package/dist/core/tools/todo.d.ts.map +1 -0
- package/dist/core/tools/todo.js +159 -0
- package/dist/core/tools/todo.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +32 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +90 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/iosm/agent-verification.d.ts +16 -0
- package/dist/iosm/agent-verification.d.ts.map +1 -0
- package/dist/iosm/agent-verification.js +138 -0
- package/dist/iosm/agent-verification.js.map +1 -0
- package/dist/iosm/automation.d.ts +40 -0
- package/dist/iosm/automation.d.ts.map +1 -0
- package/dist/iosm/automation.js +76 -0
- package/dist/iosm/automation.js.map +1 -0
- package/dist/iosm/config.d.ts +151 -0
- package/dist/iosm/config.d.ts.map +1 -0
- package/dist/iosm/config.js +323 -0
- package/dist/iosm/config.js.map +1 -0
- package/dist/iosm/context-loader.d.ts +12 -0
- package/dist/iosm/context-loader.d.ts.map +1 -0
- package/dist/iosm/context-loader.js +50 -0
- package/dist/iosm/context-loader.js.map +1 -0
- package/dist/iosm/cycle.d.ts +51 -0
- package/dist/iosm/cycle.d.ts.map +1 -0
- package/dist/iosm/cycle.js +861 -0
- package/dist/iosm/cycle.js.map +1 -0
- package/dist/iosm/guide.d.ts +31 -0
- package/dist/iosm/guide.d.ts.map +1 -0
- package/dist/iosm/guide.js +101 -0
- package/dist/iosm/guide.js.map +1 -0
- package/dist/iosm/index.d.ts +12 -0
- package/dist/iosm/index.d.ts.map +1 -0
- package/dist/iosm/index.js +11 -0
- package/dist/iosm/index.js.map +1 -0
- package/dist/iosm/init.d.ts +58 -0
- package/dist/iosm/init.d.ts.map +1 -0
- package/dist/iosm/init.js +1221 -0
- package/dist/iosm/init.js.map +1 -0
- package/dist/iosm/metrics.d.ts +23 -0
- package/dist/iosm/metrics.d.ts.map +1 -0
- package/dist/iosm/metrics.js +336 -0
- package/dist/iosm/metrics.js.map +1 -0
- package/dist/iosm/paths.d.ts +24 -0
- package/dist/iosm/paths.d.ts.map +1 -0
- package/dist/iosm/paths.js +77 -0
- package/dist/iosm/paths.js.map +1 -0
- package/dist/iosm/runtime-context.d.ts +20 -0
- package/dist/iosm/runtime-context.d.ts.map +1 -0
- package/dist/iosm/runtime-context.js +170 -0
- package/dist/iosm/runtime-context.js.map +1 -0
- package/dist/iosm/types.d.ts +151 -0
- package/dist/iosm/types.d.ts.map +1 -0
- package/dist/iosm/types.js +3 -0
- package/dist/iosm/types.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +1478 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +261 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +329 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/ascii-logo.d.ts +11 -0
- package/dist/modes/interactive/components/ascii-logo.d.ts.map +1 -0
- package/dist/modes/interactive/components/ascii-logo.js +25 -0
- package/dist/modes/interactive/components/ascii-logo.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +92 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +170 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +48 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +42 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +43 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +470 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +28 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +63 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +74 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +138 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/decrypt-loader.d.ts +25 -0
- package/dist/modes/interactive/components/decrypt-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/decrypt-loader.js +102 -0
- package/dist/modes/interactive/components/decrypt-loader.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +20 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +105 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +55 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +71 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +39 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +285 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +33 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +34 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +50 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +85 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +139 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/mcp-selector.d.ts +31 -0
- package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/mcp-selector.js +171 -0
- package/dist/modes/interactive/components/mcp-selector.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +51 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +292 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +134 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +271 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +839 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +60 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +311 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +34 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +45 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/subagent-message.d.ts +91 -0
- package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/subagent-message.js +306 -0
- package/dist/modes/interactive/components/subagent-message.js.map +1 -0
- package/dist/modes/interactive/components/task-plan-message.d.ts +12 -0
- package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-plan-message.js +61 -0
- package/dist/modes/interactive/components/task-plan-message.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +44 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +46 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +78 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +880 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +70 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +921 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +110 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +9 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +27 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +453 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +8669 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +78 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +944 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +101 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +217 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +404 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +580 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +409 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +162 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +7 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +67 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +163 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +35 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +181 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +186 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +251 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/docs/README.md +32 -0
- package/docs/cli-reference.md +342 -0
- package/docs/configuration.md +301 -0
- package/docs/development-and-testing.md +295 -0
- package/docs/extensions-packages-themes.md +415 -0
- package/docs/getting-started.md +246 -0
- package/docs/interactive-mode.md +272 -0
- package/docs/iosm-init-and-cycles.md +355 -0
- package/docs/orchestration-and-subagents.md +273 -0
- package/docs/rpc-json-sdk.md +353 -0
- package/docs/sessions-traces-export.md +260 -0
- package/examples/README.md +120 -0
- package/examples/extensions/README.md +306 -0
- package/examples/extensions/antigravity-image-gen.ts +415 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/built-in-tool-renderer.ts +246 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +114 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
- package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +150 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +881 -0
- package/examples/extensions/overlay-test.ts +150 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +398 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +119 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +124 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +964 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +195 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +299 -0
- package/examples/extensions/tool-override.ts +143 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/trigger-compact.ts +40 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/widget-placement.ts +17 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +55 -0
- package/examples/sdk/04-skills.ts +46 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +88 -0
- package/examples/sdk/07-context-files.ts +40 -0
- package/examples/sdk/08-prompt-templates.ts +47 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +51 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +82 -0
- package/examples/sdk/README.md +337 -0
- package/examples/tsconfig.json +3 -0
- package/package.json +107 -0
|
@@ -0,0 +1,1065 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { Type } from "@sinclair/typebox";
|
|
5
|
+
import { getTeamRun, updateTeamTaskStatus } from "../agent-teams.js";
|
|
6
|
+
const taskSchema = Type.Object({
|
|
7
|
+
description: Type.String({
|
|
8
|
+
description: "Short 3-5 word description of what the subagent will do",
|
|
9
|
+
}),
|
|
10
|
+
prompt: Type.String({
|
|
11
|
+
description: "Full task prompt for the subagent",
|
|
12
|
+
}),
|
|
13
|
+
agent: Type.Optional(Type.String({
|
|
14
|
+
description: "Optional custom subagent name loaded from .iosm/agents or global agents directory.",
|
|
15
|
+
})),
|
|
16
|
+
profile: Type.Union([
|
|
17
|
+
Type.Literal("explore"),
|
|
18
|
+
Type.Literal("plan"),
|
|
19
|
+
Type.Literal("iosm"),
|
|
20
|
+
Type.Literal("iosm_analyst"),
|
|
21
|
+
Type.Literal("iosm_verifier"),
|
|
22
|
+
Type.Literal("cycle_planner"),
|
|
23
|
+
Type.Literal("full"),
|
|
24
|
+
], {
|
|
25
|
+
description: "Subagent capability profile: explore (read-only), plan (read + bash, no edits), iosm (full tools + IOSM methodology), iosm_analyst (read + bash for IOSM artifacts), iosm_verifier (artifact-focused checks), cycle_planner (cycle planning), full (all tools)",
|
|
26
|
+
}),
|
|
27
|
+
cwd: Type.Optional(Type.String({
|
|
28
|
+
description: "Optional working directory for this subagent. Relative paths are resolved from the current workspace.",
|
|
29
|
+
})),
|
|
30
|
+
lock_key: Type.Optional(Type.String({
|
|
31
|
+
description: "Optional logical lock key for write serialization (e.g. src/api/**). Agents with the same lock key run write phases sequentially.",
|
|
32
|
+
})),
|
|
33
|
+
run_id: Type.Optional(Type.String({
|
|
34
|
+
description: "Optional orchestration run id (from /orchestrate). Use with task_id so the team board can track status.",
|
|
35
|
+
})),
|
|
36
|
+
task_id: Type.Optional(Type.String({
|
|
37
|
+
description: "Optional orchestration task id (for example task_1). Use with run_id to update the team board.",
|
|
38
|
+
})),
|
|
39
|
+
model: Type.Optional(Type.String({
|
|
40
|
+
description: "Optional model override for this subagent (for example anthropic/claude-sonnet-4 or model id).",
|
|
41
|
+
})),
|
|
42
|
+
background: Type.Optional(Type.Boolean({
|
|
43
|
+
description: "Run subagent in background and return immediately with run id. Use for detached async runs; orchestrated run_id/task_id calls execute foreground for deterministic coordination. Background mode is read-only policy by default.",
|
|
44
|
+
})),
|
|
45
|
+
isolation: Type.Optional(Type.Union([Type.Literal("none"), Type.Literal("worktree")], {
|
|
46
|
+
description: "Optional isolation mode. Set to worktree to run this subagent in a temporary git worktree.",
|
|
47
|
+
})),
|
|
48
|
+
});
|
|
49
|
+
/** Tool names available per profile */
|
|
50
|
+
const toolsByProfile = {
|
|
51
|
+
explore: ["read", "grep", "find", "ls"],
|
|
52
|
+
plan: ["read", "bash", "grep", "find", "ls"],
|
|
53
|
+
iosm: ["read", "bash", "edit", "write", "grep", "find", "ls"],
|
|
54
|
+
iosm_analyst: ["read", "bash", "grep", "find", "ls"],
|
|
55
|
+
iosm_verifier: ["read", "bash", "write"],
|
|
56
|
+
cycle_planner: ["read", "bash", "write"],
|
|
57
|
+
full: ["read", "bash", "edit", "write", "grep", "find", "ls"],
|
|
58
|
+
};
|
|
59
|
+
/** System prompt injected per profile */
|
|
60
|
+
const systemPromptByProfile = {
|
|
61
|
+
explore: "You are a fast read-only codebase explorer. Answer concisely. Never write or edit files.",
|
|
62
|
+
plan: "You are a technical architect. Analyze the codebase and produce a clear implementation plan. Do not write or edit files.",
|
|
63
|
+
iosm: "You are an IOSM execution agent. Use IOSM methodology and keep IOSM artifacts synchronized with implementation.",
|
|
64
|
+
iosm_analyst: "You are an IOSM metrics analyst. Analyze .iosm/ artifacts and codebase metrics. Be precise and evidence-based.",
|
|
65
|
+
iosm_verifier: "You are an IOSM verifier. Validate checks and update only required IOSM artifacts with deterministic reasoning.",
|
|
66
|
+
cycle_planner: "You are an IOSM cycle planner. Propose and align cycle goals with measurable outcomes and concrete risks.",
|
|
67
|
+
full: "You are a software engineering agent. Execute the task end-to-end.",
|
|
68
|
+
};
|
|
69
|
+
const writeCapableProfiles = new Set(["full", "iosm_verifier", "cycle_planner"]);
|
|
70
|
+
const delegationTagName = "delegate_task";
|
|
71
|
+
class Semaphore {
|
|
72
|
+
constructor(limit) {
|
|
73
|
+
this.limit = limit;
|
|
74
|
+
this.active = 0;
|
|
75
|
+
this.queue = [];
|
|
76
|
+
}
|
|
77
|
+
async acquire() {
|
|
78
|
+
if (this.active < this.limit) {
|
|
79
|
+
this.active += 1;
|
|
80
|
+
return () => this.release();
|
|
81
|
+
}
|
|
82
|
+
await new Promise((resolve) => {
|
|
83
|
+
this.queue.push(() => {
|
|
84
|
+
this.active += 1;
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
return () => this.release();
|
|
89
|
+
}
|
|
90
|
+
release() {
|
|
91
|
+
this.active = Math.max(0, this.active - 1);
|
|
92
|
+
const next = this.queue.shift();
|
|
93
|
+
if (next) {
|
|
94
|
+
next();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
class Mutex {
|
|
99
|
+
constructor() {
|
|
100
|
+
this.locked = false;
|
|
101
|
+
this.waiters = [];
|
|
102
|
+
}
|
|
103
|
+
async acquire() {
|
|
104
|
+
if (!this.locked) {
|
|
105
|
+
this.locked = true;
|
|
106
|
+
return () => this.release();
|
|
107
|
+
}
|
|
108
|
+
await new Promise((resolve) => this.waiters.push(resolve));
|
|
109
|
+
this.locked = true;
|
|
110
|
+
return () => this.release();
|
|
111
|
+
}
|
|
112
|
+
release() {
|
|
113
|
+
this.locked = false;
|
|
114
|
+
const next = this.waiters.shift();
|
|
115
|
+
if (next) {
|
|
116
|
+
next();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const maxParallelFromEnv = Number.parseInt(process.env.IOSM_SUBAGENT_MAX_PARALLEL ?? "4", 10);
|
|
121
|
+
const subagentSemaphore = new Semaphore(Number.isInteger(maxParallelFromEnv) && maxParallelFromEnv > 0 ? Math.min(maxParallelFromEnv, 20) : 4);
|
|
122
|
+
const maxDelegationDepthFromEnv = parseBoundedInt(process.env.IOSM_SUBAGENT_MAX_DELEGATION_DEPTH, 1, 0, 3);
|
|
123
|
+
const maxDelegationsPerTaskFromEnv = parseBoundedInt(process.env.IOSM_SUBAGENT_MAX_DELEGATIONS_PER_TASK, 2, 0, 10);
|
|
124
|
+
const maxDelegatedParallelFromEnv = parseBoundedInt(process.env.IOSM_SUBAGENT_MAX_DELEGATE_PARALLEL, 4, 1, 10);
|
|
125
|
+
const maxDelegatedOutputCharsFromEnv = parseBoundedInt(process.env.IOSM_SUBAGENT_DELEGATED_OUTPUT_MAX_CHARS, 6000, 500, 20_000);
|
|
126
|
+
const maxMetaUpdatesPerCheckpoint = parseBoundedInt(process.env.IOSM_SUBAGENT_META_MAX_ITEMS, 5, 1, 20);
|
|
127
|
+
const maxMetaUpdateChars = parseBoundedInt(process.env.IOSM_SUBAGENT_META_MAX_CHARS, 600, 100, 4000);
|
|
128
|
+
const orchestrationSemaphores = new Map();
|
|
129
|
+
const cwdWriteLocks = new Map();
|
|
130
|
+
function parseBoundedInt(raw, fallback, min, max) {
|
|
131
|
+
const parsed = raw ? Number.parseInt(raw, 10) : fallback;
|
|
132
|
+
if (!Number.isInteger(parsed))
|
|
133
|
+
return fallback;
|
|
134
|
+
return Math.max(min, Math.min(max, parsed));
|
|
135
|
+
}
|
|
136
|
+
function normalizeSpacing(text) {
|
|
137
|
+
return text.replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
138
|
+
}
|
|
139
|
+
function cloneDelegateItems(items) {
|
|
140
|
+
return items ? items.map((item) => ({ ...item })) : undefined;
|
|
141
|
+
}
|
|
142
|
+
function formatMetaCheckpoint(metaMessages) {
|
|
143
|
+
if (!metaMessages || metaMessages.length === 0) {
|
|
144
|
+
return { section: undefined, appliedCount: 0 };
|
|
145
|
+
}
|
|
146
|
+
const normalized = metaMessages
|
|
147
|
+
.map((item) => item.replace(/\s+/g, " ").trim())
|
|
148
|
+
.filter((item) => item.length > 0)
|
|
149
|
+
.slice(-maxMetaUpdatesPerCheckpoint)
|
|
150
|
+
.map((item) => (item.length > maxMetaUpdateChars ? `${item.slice(0, maxMetaUpdateChars - 3)}...` : item));
|
|
151
|
+
if (normalized.length === 0) {
|
|
152
|
+
return { section: undefined, appliedCount: 0 };
|
|
153
|
+
}
|
|
154
|
+
const lines = normalized.map((item, index) => `${index + 1}. ${item}`).join("\n");
|
|
155
|
+
return {
|
|
156
|
+
section: [
|
|
157
|
+
"[META_UPDATES]",
|
|
158
|
+
"Live user updates captured during execution. Apply them in this subtask if relevant.",
|
|
159
|
+
"If conflicts exist, prioritize later items.",
|
|
160
|
+
lines,
|
|
161
|
+
"[/META_UPDATES]",
|
|
162
|
+
].join("\n"),
|
|
163
|
+
appliedCount: normalized.length,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function isAbortError(error) {
|
|
167
|
+
if (error instanceof Error) {
|
|
168
|
+
return /aborted/i.test(error.message);
|
|
169
|
+
}
|
|
170
|
+
if (typeof error === "string") {
|
|
171
|
+
return /aborted/i.test(error);
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
function buildDelegationProtocolPrompt(depthRemaining) {
|
|
176
|
+
if (depthRemaining <= 0) {
|
|
177
|
+
return [
|
|
178
|
+
`Delegation protocol: depth limit reached.`,
|
|
179
|
+
`Do not emit <${delegationTagName}> blocks.`,
|
|
180
|
+
].join("\n");
|
|
181
|
+
}
|
|
182
|
+
return [
|
|
183
|
+
`Delegation protocol (optional): if you discover a concrete follow-up that is better done by a separate specialist, emit up to ${maxDelegationsPerTaskFromEnv} XML block(s):`,
|
|
184
|
+
`<${delegationTagName} profile="explore|plan|iosm|iosm_analyst|iosm_verifier|cycle_planner|full" description="short title" cwd="optional relative path" lock_key="optional lock key" model="optional model override" isolation="none|worktree" depends_on="optional indices like 1|3">`,
|
|
185
|
+
"Detailed delegated task prompt",
|
|
186
|
+
`</${delegationTagName}>`,
|
|
187
|
+
`Only emit blocks when necessary. Keep normal analysis/answer text outside those blocks.`,
|
|
188
|
+
].join("\n");
|
|
189
|
+
}
|
|
190
|
+
function withDelegationPrompt(basePrompt, depthRemaining) {
|
|
191
|
+
const protocol = buildDelegationProtocolPrompt(depthRemaining);
|
|
192
|
+
return `${basePrompt}\n\n${protocol}`;
|
|
193
|
+
}
|
|
194
|
+
function parseDelegationRequests(output, maxRequests) {
|
|
195
|
+
const requests = [];
|
|
196
|
+
const warnings = [];
|
|
197
|
+
const pattern = new RegExp(`<${delegationTagName}\\b([^>]*)>([\\s\\S]*?)<\\/${delegationTagName}>`, "gi");
|
|
198
|
+
const cleaned = output.replace(pattern, (_full, attrsRaw, bodyRaw) => {
|
|
199
|
+
if (maxRequests <= 0) {
|
|
200
|
+
warnings.push(`Ignored delegation block: max delegated tasks per run is 0.`);
|
|
201
|
+
return "";
|
|
202
|
+
}
|
|
203
|
+
if (requests.length >= maxRequests) {
|
|
204
|
+
warnings.push(`Ignored extra delegation block: max ${maxRequests} per run.`);
|
|
205
|
+
return "";
|
|
206
|
+
}
|
|
207
|
+
const attrs = {};
|
|
208
|
+
for (const match of attrsRaw.matchAll(/([A-Za-z_][A-Za-z0-9_-]*)="([^"]*)"/g)) {
|
|
209
|
+
attrs[match[1].toLowerCase()] = match[2];
|
|
210
|
+
}
|
|
211
|
+
const prompt = normalizeSpacing(bodyRaw ?? "");
|
|
212
|
+
if (!prompt) {
|
|
213
|
+
warnings.push(`Ignored delegation block with empty prompt.`);
|
|
214
|
+
return "";
|
|
215
|
+
}
|
|
216
|
+
const profile = (attrs.profile ?? "explore").trim();
|
|
217
|
+
if (!(profile in toolsByProfile)) {
|
|
218
|
+
warnings.push(`Ignored delegation block with unknown profile "${profile}".`);
|
|
219
|
+
return "";
|
|
220
|
+
}
|
|
221
|
+
const isolationRaw = (attrs.isolation ?? "").trim().toLowerCase();
|
|
222
|
+
const isolation = isolationRaw === "worktree" ? "worktree" : isolationRaw === "none" ? "none" : undefined;
|
|
223
|
+
if (isolationRaw && !isolation) {
|
|
224
|
+
warnings.push(`Ignored invalid isolation value "${attrs.isolation}".`);
|
|
225
|
+
return "";
|
|
226
|
+
}
|
|
227
|
+
requests.push({
|
|
228
|
+
description: (attrs.description ?? `delegated task ${requests.length + 1}`).trim(),
|
|
229
|
+
profile,
|
|
230
|
+
prompt,
|
|
231
|
+
cwd: attrs.cwd?.trim() || undefined,
|
|
232
|
+
lockKey: attrs.lock_key?.trim() || undefined,
|
|
233
|
+
model: attrs.model?.trim() || undefined,
|
|
234
|
+
isolation,
|
|
235
|
+
dependsOn: attrs.depends_on
|
|
236
|
+
? attrs.depends_on
|
|
237
|
+
.split(/[|,]/)
|
|
238
|
+
.map((token) => Number.parseInt(token.trim(), 10))
|
|
239
|
+
.filter((value) => Number.isInteger(value) && value > 0)
|
|
240
|
+
: undefined,
|
|
241
|
+
});
|
|
242
|
+
return "";
|
|
243
|
+
});
|
|
244
|
+
return {
|
|
245
|
+
requests,
|
|
246
|
+
warnings,
|
|
247
|
+
cleanedOutput: normalizeSpacing(cleaned),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function getCwdLockKey(cwd) {
|
|
251
|
+
// Normalize lock key to keep behavior consistent across path aliases.
|
|
252
|
+
return path.resolve(cwd).toLowerCase();
|
|
253
|
+
}
|
|
254
|
+
function getOrCreateWriteLock(cwd) {
|
|
255
|
+
const key = getCwdLockKey(cwd);
|
|
256
|
+
const existing = cwdWriteLocks.get(key);
|
|
257
|
+
if (existing)
|
|
258
|
+
return existing;
|
|
259
|
+
const created = new Mutex();
|
|
260
|
+
cwdWriteLocks.set(key, created);
|
|
261
|
+
return created;
|
|
262
|
+
}
|
|
263
|
+
function getRunParallelLimit(cwd, runId) {
|
|
264
|
+
const teamRun = getTeamRun(cwd, runId);
|
|
265
|
+
if (!teamRun)
|
|
266
|
+
return undefined;
|
|
267
|
+
if (teamRun.mode === "sequential")
|
|
268
|
+
return 1;
|
|
269
|
+
const maxParallel = teamRun.maxParallel;
|
|
270
|
+
if (!Number.isInteger(maxParallel) || !maxParallel || maxParallel < 1) {
|
|
271
|
+
return Math.max(1, Math.min(teamRun.agents, 20));
|
|
272
|
+
}
|
|
273
|
+
return Math.max(1, Math.min(maxParallel, 20));
|
|
274
|
+
}
|
|
275
|
+
function getOrCreateOrchestrationSemaphore(cwd, runId) {
|
|
276
|
+
const limit = getRunParallelLimit(cwd, runId);
|
|
277
|
+
if (!limit || limit < 1)
|
|
278
|
+
return undefined;
|
|
279
|
+
const key = `${path.resolve(cwd).toLowerCase()}::${runId}::${limit}`;
|
|
280
|
+
const existing = orchestrationSemaphores.get(key);
|
|
281
|
+
if (existing)
|
|
282
|
+
return existing;
|
|
283
|
+
const created = new Semaphore(limit);
|
|
284
|
+
orchestrationSemaphores.set(key, created);
|
|
285
|
+
return created;
|
|
286
|
+
}
|
|
287
|
+
function persistSubagentTranscript(input) {
|
|
288
|
+
try {
|
|
289
|
+
const dir = path.join(input.rootCwd, ".iosm", "subagents", "runs");
|
|
290
|
+
mkdirSync(dir, { recursive: true });
|
|
291
|
+
const filePath = path.join(dir, `${input.runId}.md`);
|
|
292
|
+
const lines = [
|
|
293
|
+
"---",
|
|
294
|
+
`run_id: ${input.runId}`,
|
|
295
|
+
`profile: ${input.profile}`,
|
|
296
|
+
`description: ${JSON.stringify(input.description)}`,
|
|
297
|
+
`cwd: ${JSON.stringify(input.subagentCwd)}`,
|
|
298
|
+
`agent: ${JSON.stringify(input.agent ?? "")}`,
|
|
299
|
+
`lock_key: ${JSON.stringify(input.lockKey ?? "")}`,
|
|
300
|
+
`model: ${JSON.stringify(input.model ?? "")}`,
|
|
301
|
+
`session_id: ${JSON.stringify(input.sessionId ?? "")}`,
|
|
302
|
+
`isolation: ${JSON.stringify(input.isolation ?? "none")}`,
|
|
303
|
+
`worktree_path: ${JSON.stringify(input.worktreePath ?? "")}`,
|
|
304
|
+
`created_at: ${new Date().toISOString()}`,
|
|
305
|
+
"---",
|
|
306
|
+
"",
|
|
307
|
+
"## Prompt",
|
|
308
|
+
"",
|
|
309
|
+
input.prompt,
|
|
310
|
+
"",
|
|
311
|
+
"## Output",
|
|
312
|
+
"",
|
|
313
|
+
input.output,
|
|
314
|
+
"",
|
|
315
|
+
];
|
|
316
|
+
writeFileSync(filePath, lines.join("\n"), "utf8");
|
|
317
|
+
return filePath;
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function writeBackgroundRunStatus(rootCwd, status) {
|
|
324
|
+
try {
|
|
325
|
+
const dir = path.join(rootCwd, ".iosm", "subagents", "background");
|
|
326
|
+
mkdirSync(dir, { recursive: true });
|
|
327
|
+
const filePath = path.join(dir, `${status.runId}.json`);
|
|
328
|
+
writeFileSync(filePath, `${JSON.stringify(status, null, 2)}\n`, "utf8");
|
|
329
|
+
return filePath;
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function gitResult(args, cwd) {
|
|
336
|
+
const result = spawnSync("git", args, {
|
|
337
|
+
cwd,
|
|
338
|
+
encoding: "utf8",
|
|
339
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
340
|
+
});
|
|
341
|
+
return {
|
|
342
|
+
ok: result.status === 0,
|
|
343
|
+
stdout: (result.stdout ?? "").trim(),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function provisionWorktree(rootCwd, targetCwd, runId) {
|
|
347
|
+
const insideRepo = gitResult(["rev-parse", "--is-inside-work-tree"], rootCwd);
|
|
348
|
+
if (!insideRepo.ok || insideRepo.stdout !== "true") {
|
|
349
|
+
return { runCwd: targetCwd, cleanup: () => { } };
|
|
350
|
+
}
|
|
351
|
+
const repoRootResult = gitResult(["rev-parse", "--show-toplevel"], rootCwd);
|
|
352
|
+
if (!repoRootResult.ok || !repoRootResult.stdout) {
|
|
353
|
+
return { runCwd: targetCwd, cleanup: () => { } };
|
|
354
|
+
}
|
|
355
|
+
const repoRoot = repoRootResult.stdout;
|
|
356
|
+
const relative = path.relative(repoRoot, targetCwd);
|
|
357
|
+
if (relative.startsWith("..")) {
|
|
358
|
+
return { runCwd: targetCwd, cleanup: () => { } };
|
|
359
|
+
}
|
|
360
|
+
const worktreePath = path.join(rootCwd, ".iosm", "subagents", "worktrees", runId);
|
|
361
|
+
mkdirSync(path.dirname(worktreePath), { recursive: true });
|
|
362
|
+
const added = gitResult(["worktree", "add", "--detach", worktreePath], repoRoot);
|
|
363
|
+
if (!added.ok) {
|
|
364
|
+
return { runCwd: targetCwd, cleanup: () => { } };
|
|
365
|
+
}
|
|
366
|
+
const runCwd = path.resolve(worktreePath, relative);
|
|
367
|
+
const cleanup = () => {
|
|
368
|
+
try {
|
|
369
|
+
gitResult(["worktree", "remove", "--force", worktreePath], repoRoot);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
// best effort
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
// best effort
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
return { runCwd, worktreePath, cleanup };
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Create the Task tool using the factory pattern.
|
|
385
|
+
*
|
|
386
|
+
* The `runner` callback is supplied by sdk.ts to avoid a circular import:
|
|
387
|
+
* sdk.ts → task.ts (tool) would otherwise import sdk.ts again.
|
|
388
|
+
*
|
|
389
|
+
* @param cwd Working directory forwarded to the subagent.
|
|
390
|
+
* @param runner Callback that creates and runs a sub-session.
|
|
391
|
+
*/
|
|
392
|
+
export function createTaskTool(cwd, runner, options) {
|
|
393
|
+
const customAgentsSnippet = options?.availableCustomSubagentHints && options.availableCustomSubagentHints.length > 0
|
|
394
|
+
? ` Available custom agents: ${options.availableCustomSubagentHints
|
|
395
|
+
.map((item) => `${item.name} (${item.description})`)
|
|
396
|
+
.join(", ")}.`
|
|
397
|
+
: options?.availableCustomSubagents && options.availableCustomSubagents.length > 0
|
|
398
|
+
? ` Available custom agents: ${options.availableCustomSubagents.join(", ")}.`
|
|
399
|
+
: "";
|
|
400
|
+
return {
|
|
401
|
+
name: "task",
|
|
402
|
+
label: "task",
|
|
403
|
+
description: "Launch a specialized subagent to handle a subtask in isolation. " +
|
|
404
|
+
"Use for: codebase exploration (profile=explore), architectural planning (profile=plan), " +
|
|
405
|
+
"IOSM artifact analysis (profile=iosm_analyst/iosm_verifier/cycle_planner), or end-to-end implementation (profile=full). " +
|
|
406
|
+
"Set cwd to isolate subagents into different project areas when orchestrating parallel work. " +
|
|
407
|
+
"The subagent runs to completion and returns its full text output. " +
|
|
408
|
+
"It may request bounded follow-up delegation via <delegate_task> blocks that are executed by the parent task tool." +
|
|
409
|
+
customAgentsSnippet,
|
|
410
|
+
parameters: taskSchema,
|
|
411
|
+
execute: async (_toolCallId, { description, prompt, agent: agentName, profile, cwd: targetCwd, lock_key: lockKey, run_id: orchestrationRunId, task_id: orchestrationTaskId, model: requestedModel, background, isolation, }, _signal, onUpdate) => {
|
|
412
|
+
const throwIfAborted = () => {
|
|
413
|
+
if (_signal?.aborted) {
|
|
414
|
+
throw new Error("Operation aborted");
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
const runId = `subagent_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
418
|
+
const customSubagent = agentName && options?.resolveCustomSubagent ? options.resolveCustomSubagent(agentName) : undefined;
|
|
419
|
+
if (agentName && !customSubagent) {
|
|
420
|
+
const available = options?.availableCustomSubagents && options.availableCustomSubagents.length > 0
|
|
421
|
+
? ` Available custom agents: ${options.availableCustomSubagents.join(", ")}.`
|
|
422
|
+
: "";
|
|
423
|
+
throw new Error(`Unknown subagent: ${agentName}.${available}`);
|
|
424
|
+
}
|
|
425
|
+
const effectiveProfile = customSubagent?.profile ?? profile;
|
|
426
|
+
let tools = customSubagent?.tools
|
|
427
|
+
? [...customSubagent.tools]
|
|
428
|
+
: [...(toolsByProfile[effectiveProfile] ?? toolsByProfile.explore)];
|
|
429
|
+
if (customSubagent?.disallowedTools?.length) {
|
|
430
|
+
const blocked = new Set(customSubagent.disallowedTools);
|
|
431
|
+
tools = tools.filter((tool) => !blocked.has(tool));
|
|
432
|
+
}
|
|
433
|
+
const delegationDepth = maxDelegationDepthFromEnv;
|
|
434
|
+
const baseSystemPrompt = customSubagent?.systemPrompt ??
|
|
435
|
+
systemPromptByProfile[effectiveProfile] ??
|
|
436
|
+
systemPromptByProfile.full;
|
|
437
|
+
const systemPrompt = withDelegationPrompt(baseSystemPrompt, delegationDepth);
|
|
438
|
+
const promptWithInstructions = customSubagent?.instructions && customSubagent.instructions.trim().length > 0
|
|
439
|
+
? `${customSubagent.instructions.trim()}\n\nUser task:\n${prompt}`
|
|
440
|
+
: prompt;
|
|
441
|
+
const effectiveModelOverride = requestedModel?.trim() || customSubagent?.model?.trim() || undefined;
|
|
442
|
+
const requestedBackground = background === true || customSubagent?.background === true;
|
|
443
|
+
const trackedOrchestrationRun = orchestrationRunId && orchestrationTaskId ? getTeamRun(cwd, orchestrationRunId) : undefined;
|
|
444
|
+
// Deterministic orchestration UX: run tracked team tasks in foreground so the parent turn
|
|
445
|
+
// naturally waits for subagents and aggregates their outputs without ad-hoc polling.
|
|
446
|
+
const runInBackground = trackedOrchestrationRun ? false : requestedBackground;
|
|
447
|
+
const requestedSubagentCwd = targetCwd
|
|
448
|
+
? path.resolve(cwd, targetCwd)
|
|
449
|
+
: customSubagent?.cwd ?? cwd;
|
|
450
|
+
if (!existsSync(requestedSubagentCwd) || !statSync(requestedSubagentCwd).isDirectory()) {
|
|
451
|
+
throw new Error(`Subagent cwd does not exist or is not a directory: ${requestedSubagentCwd}`);
|
|
452
|
+
}
|
|
453
|
+
if (runInBackground && writeCapableProfiles.has(effectiveProfile)) {
|
|
454
|
+
throw new Error(`Background policy violation: profile "${effectiveProfile}" is write-capable. Use explore/plan/iosm_analyst for background mode.`);
|
|
455
|
+
}
|
|
456
|
+
const useWorktree = isolation === "worktree";
|
|
457
|
+
const queuedAt = Date.now();
|
|
458
|
+
let latestProgress;
|
|
459
|
+
const emitProgress = (incoming) => {
|
|
460
|
+
const activeTool = "activeTool" in incoming ? incoming.activeTool : latestProgress?.activeTool;
|
|
461
|
+
const delegateIndex = "delegateIndex" in incoming ? incoming.delegateIndex : latestProgress?.delegateIndex;
|
|
462
|
+
const delegateTotal = "delegateTotal" in incoming ? incoming.delegateTotal : latestProgress?.delegateTotal;
|
|
463
|
+
const delegateDescription = "delegateDescription" in incoming ? incoming.delegateDescription : latestProgress?.delegateDescription;
|
|
464
|
+
const delegateProfile = "delegateProfile" in incoming ? incoming.delegateProfile : latestProgress?.delegateProfile;
|
|
465
|
+
const delegateItems = "delegateItems" in incoming
|
|
466
|
+
? cloneDelegateItems(incoming.delegateItems)
|
|
467
|
+
: cloneDelegateItems(latestProgress?.delegateItems);
|
|
468
|
+
const merged = {
|
|
469
|
+
kind: "subagent_progress",
|
|
470
|
+
phase: incoming.phase,
|
|
471
|
+
message: incoming.message,
|
|
472
|
+
cwd: incoming.cwd ?? latestProgress?.cwd ?? requestedSubagentCwd,
|
|
473
|
+
activeTool,
|
|
474
|
+
toolCallsStarted: incoming.toolCallsStarted ?? latestProgress?.toolCallsStarted,
|
|
475
|
+
toolCallsCompleted: incoming.toolCallsCompleted ?? latestProgress?.toolCallsCompleted,
|
|
476
|
+
assistantMessages: incoming.assistantMessages ?? latestProgress?.assistantMessages,
|
|
477
|
+
delegateIndex,
|
|
478
|
+
delegateTotal,
|
|
479
|
+
delegateDescription,
|
|
480
|
+
delegateProfile,
|
|
481
|
+
delegateItems,
|
|
482
|
+
};
|
|
483
|
+
latestProgress = merged;
|
|
484
|
+
if (!onUpdate)
|
|
485
|
+
return;
|
|
486
|
+
onUpdate({
|
|
487
|
+
content: [{ type: "text", text: merged.message }],
|
|
488
|
+
details: { progress: merged },
|
|
489
|
+
});
|
|
490
|
+
};
|
|
491
|
+
throwIfAborted();
|
|
492
|
+
emitProgress({
|
|
493
|
+
kind: "subagent_progress",
|
|
494
|
+
phase: "queued",
|
|
495
|
+
message: "queued",
|
|
496
|
+
cwd: requestedSubagentCwd,
|
|
497
|
+
toolCallsStarted: 0,
|
|
498
|
+
toolCallsCompleted: 0,
|
|
499
|
+
assistantMessages: 0,
|
|
500
|
+
});
|
|
501
|
+
const executeSubagent = async () => {
|
|
502
|
+
let releaseRunSlot;
|
|
503
|
+
let releaseSlot;
|
|
504
|
+
let releaseWriteLock;
|
|
505
|
+
let releaseIsolation;
|
|
506
|
+
let subagentCwd = requestedSubagentCwd;
|
|
507
|
+
let worktreePath;
|
|
508
|
+
let runStats;
|
|
509
|
+
try {
|
|
510
|
+
throwIfAborted();
|
|
511
|
+
const orchestrationSemaphore = orchestrationRunId && orchestrationTaskId
|
|
512
|
+
? getOrCreateOrchestrationSemaphore(cwd, orchestrationRunId)
|
|
513
|
+
: undefined;
|
|
514
|
+
if (orchestrationSemaphore) {
|
|
515
|
+
releaseRunSlot = await orchestrationSemaphore.acquire();
|
|
516
|
+
throwIfAborted();
|
|
517
|
+
}
|
|
518
|
+
releaseSlot = await subagentSemaphore.acquire();
|
|
519
|
+
throwIfAborted();
|
|
520
|
+
if (orchestrationRunId && orchestrationTaskId) {
|
|
521
|
+
updateTeamTaskStatus({
|
|
522
|
+
cwd,
|
|
523
|
+
runId: orchestrationRunId,
|
|
524
|
+
taskId: orchestrationTaskId,
|
|
525
|
+
status: "running",
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
if (writeCapableProfiles.has(effectiveProfile)) {
|
|
529
|
+
const explicitLockKey = lockKey?.trim();
|
|
530
|
+
// Parallel orchestration should remain truly parallel by default.
|
|
531
|
+
// Serialize write-capable agents only when an explicit lock_key is provided.
|
|
532
|
+
if (explicitLockKey) {
|
|
533
|
+
const lock = getOrCreateWriteLock(explicitLockKey);
|
|
534
|
+
releaseWriteLock = await lock.acquire();
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
if (useWorktree) {
|
|
538
|
+
const isolated = provisionWorktree(cwd, requestedSubagentCwd, runId);
|
|
539
|
+
subagentCwd = isolated.runCwd;
|
|
540
|
+
worktreePath = isolated.worktreePath;
|
|
541
|
+
releaseIsolation = isolated.cleanup;
|
|
542
|
+
}
|
|
543
|
+
emitProgress({
|
|
544
|
+
kind: "subagent_progress",
|
|
545
|
+
phase: "starting",
|
|
546
|
+
message: "starting subagent",
|
|
547
|
+
cwd: subagentCwd,
|
|
548
|
+
activeTool: undefined,
|
|
549
|
+
});
|
|
550
|
+
let output;
|
|
551
|
+
let subagentSessionId;
|
|
552
|
+
let delegatedTasks = 0;
|
|
553
|
+
let delegatedSucceeded = 0;
|
|
554
|
+
let delegatedFailed = 0;
|
|
555
|
+
const delegationWarnings = [];
|
|
556
|
+
const delegatedSections = [];
|
|
557
|
+
const delegatedStats = {
|
|
558
|
+
toolCallsStarted: 0,
|
|
559
|
+
toolCallsCompleted: 0,
|
|
560
|
+
assistantMessages: 0,
|
|
561
|
+
};
|
|
562
|
+
try {
|
|
563
|
+
const rootMeta = formatMetaCheckpoint(options?.getMetaMessages?.());
|
|
564
|
+
const rootPrompt = rootMeta.section && rootMeta.appliedCount > 0
|
|
565
|
+
? `${promptWithInstructions}\n\n${rootMeta.section}`
|
|
566
|
+
: promptWithInstructions;
|
|
567
|
+
if (rootMeta.appliedCount > 0) {
|
|
568
|
+
emitProgress({
|
|
569
|
+
kind: "subagent_progress",
|
|
570
|
+
phase: "running",
|
|
571
|
+
message: `applied ${rootMeta.appliedCount} meta update(s) to root task`,
|
|
572
|
+
cwd: subagentCwd,
|
|
573
|
+
activeTool: undefined,
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
const result = await runner({
|
|
577
|
+
systemPrompt,
|
|
578
|
+
tools,
|
|
579
|
+
prompt: rootPrompt,
|
|
580
|
+
cwd: subagentCwd,
|
|
581
|
+
modelOverride: effectiveModelOverride,
|
|
582
|
+
signal: _signal,
|
|
583
|
+
onProgress: (progress) => emitProgress(progress),
|
|
584
|
+
});
|
|
585
|
+
throwIfAborted();
|
|
586
|
+
if (typeof result === "string") {
|
|
587
|
+
output = result;
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
output = result.output;
|
|
591
|
+
subagentSessionId = result.sessionId;
|
|
592
|
+
runStats = result.stats;
|
|
593
|
+
}
|
|
594
|
+
const parsedDelegation = parseDelegationRequests(output, delegationDepth > 0 ? maxDelegationsPerTaskFromEnv : 0);
|
|
595
|
+
output = parsedDelegation.cleanedOutput;
|
|
596
|
+
delegationWarnings.push(...parsedDelegation.warnings);
|
|
597
|
+
const delegateTotal = parsedDelegation.requests.length;
|
|
598
|
+
const delegateItems = parsedDelegation.requests.map((request, index) => ({
|
|
599
|
+
index: index + 1,
|
|
600
|
+
description: request.description,
|
|
601
|
+
profile: request.profile,
|
|
602
|
+
status: "pending",
|
|
603
|
+
}));
|
|
604
|
+
const normalizedDependsOn = parsedDelegation.requests.map((request, index) => {
|
|
605
|
+
const current = index + 1;
|
|
606
|
+
const raw = request.dependsOn ?? [];
|
|
607
|
+
const unique = new Set();
|
|
608
|
+
for (const dep of raw) {
|
|
609
|
+
if (!Number.isInteger(dep) || dep <= 0 || dep > delegateTotal || dep === current) {
|
|
610
|
+
delegationWarnings.push(`Delegated task ${current} has invalid depends_on reference "${dep}" and it was ignored.`);
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
unique.add(dep);
|
|
614
|
+
}
|
|
615
|
+
return Array.from(unique).sort((a, b) => a - b);
|
|
616
|
+
});
|
|
617
|
+
delegatedTasks += delegateTotal;
|
|
618
|
+
if (delegateTotal > 0) {
|
|
619
|
+
emitProgress({
|
|
620
|
+
kind: "subagent_progress",
|
|
621
|
+
phase: "running",
|
|
622
|
+
message: `delegation scheduler: ${delegateTotal} task(s), max parallel ${Math.min(delegateTotal, maxDelegatedParallelFromEnv)}`,
|
|
623
|
+
cwd: subagentCwd,
|
|
624
|
+
activeTool: undefined,
|
|
625
|
+
delegateTotal,
|
|
626
|
+
delegateItems,
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
const pendingIndices = new Set(Array.from({ length: delegateTotal }, (_v, i) => i));
|
|
630
|
+
const runningDelegates = new Map();
|
|
631
|
+
const maxDelegateParallel = Math.max(1, Math.min(delegateTotal || 1, maxDelegatedParallelFromEnv));
|
|
632
|
+
const statusOf = (idx) => delegateItems[idx]?.status ?? "pending";
|
|
633
|
+
const markDelegateFailed = (index, message, details) => {
|
|
634
|
+
const request = parsedDelegation.requests[index];
|
|
635
|
+
if (delegateItems[index]) {
|
|
636
|
+
delegateItems[index].status = "failed";
|
|
637
|
+
}
|
|
638
|
+
delegatedFailed += 1;
|
|
639
|
+
if (details) {
|
|
640
|
+
delegationWarnings.push(details);
|
|
641
|
+
}
|
|
642
|
+
delegatedSections[index] =
|
|
643
|
+
`#### ${index + 1}. ${request.description} (${request.profile})\nERROR: ${message}`;
|
|
644
|
+
emitProgress({
|
|
645
|
+
kind: "subagent_progress",
|
|
646
|
+
phase: "running",
|
|
647
|
+
message,
|
|
648
|
+
cwd: subagentCwd,
|
|
649
|
+
activeTool: undefined,
|
|
650
|
+
delegateIndex: index + 1,
|
|
651
|
+
delegateTotal,
|
|
652
|
+
delegateDescription: request.description,
|
|
653
|
+
delegateProfile: request.profile,
|
|
654
|
+
delegateItems,
|
|
655
|
+
});
|
|
656
|
+
};
|
|
657
|
+
const runDelegate = async (index) => {
|
|
658
|
+
throwIfAborted();
|
|
659
|
+
const request = parsedDelegation.requests[index];
|
|
660
|
+
const childProfile = request.profile;
|
|
661
|
+
if (delegateItems[index]) {
|
|
662
|
+
delegateItems[index].status = "running";
|
|
663
|
+
}
|
|
664
|
+
emitProgress({
|
|
665
|
+
kind: "subagent_progress",
|
|
666
|
+
phase: "running",
|
|
667
|
+
message: `delegating ${index + 1}/${delegateTotal}: ${request.description}`,
|
|
668
|
+
cwd: subagentCwd,
|
|
669
|
+
activeTool: undefined,
|
|
670
|
+
delegateIndex: index + 1,
|
|
671
|
+
delegateTotal,
|
|
672
|
+
delegateDescription: request.description,
|
|
673
|
+
delegateProfile: childProfile,
|
|
674
|
+
delegateItems,
|
|
675
|
+
});
|
|
676
|
+
const childTools = [...(toolsByProfile[childProfile] ?? toolsByProfile.explore)];
|
|
677
|
+
const childBaseSystemPrompt = systemPromptByProfile[childProfile] ?? systemPromptByProfile.full;
|
|
678
|
+
const childSystemPrompt = withDelegationPrompt(childBaseSystemPrompt, Math.max(0, delegationDepth - 1));
|
|
679
|
+
const requestedChildCwd = request.cwd ? path.resolve(subagentCwd, request.cwd) : subagentCwd;
|
|
680
|
+
if (!existsSync(requestedChildCwd) || !statSync(requestedChildCwd).isDirectory()) {
|
|
681
|
+
markDelegateFailed(index, `delegate ${index + 1}/${delegateTotal} skipped: missing cwd`, `Delegated task "${request.description}" skipped: cwd does not exist (${requestedChildCwd}).`);
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
let childReleaseLock;
|
|
685
|
+
let childReleaseIsolation;
|
|
686
|
+
let childCwd = requestedChildCwd;
|
|
687
|
+
try {
|
|
688
|
+
throwIfAborted();
|
|
689
|
+
const explicitChildLock = request.lockKey?.trim();
|
|
690
|
+
if (writeCapableProfiles.has(childProfile) && explicitChildLock) {
|
|
691
|
+
const lock = getOrCreateWriteLock(explicitChildLock);
|
|
692
|
+
childReleaseLock = await lock.acquire();
|
|
693
|
+
throwIfAborted();
|
|
694
|
+
}
|
|
695
|
+
if (request.isolation === "worktree") {
|
|
696
|
+
const isolated = provisionWorktree(cwd, requestedChildCwd, `${runId}_delegate_${index + 1}`);
|
|
697
|
+
childCwd = isolated.runCwd;
|
|
698
|
+
childReleaseIsolation = isolated.cleanup;
|
|
699
|
+
}
|
|
700
|
+
const delegateMeta = formatMetaCheckpoint(options?.getMetaMessages?.());
|
|
701
|
+
const delegatePrompt = delegateMeta.section && delegateMeta.appliedCount > 0
|
|
702
|
+
? `${request.prompt}\n\n${delegateMeta.section}`
|
|
703
|
+
: request.prompt;
|
|
704
|
+
if (delegateMeta.appliedCount > 0) {
|
|
705
|
+
emitProgress({
|
|
706
|
+
kind: "subagent_progress",
|
|
707
|
+
phase: "running",
|
|
708
|
+
message: `delegate ${index + 1}/${delegateTotal}: applied ${delegateMeta.appliedCount} meta update(s)`,
|
|
709
|
+
cwd: childCwd,
|
|
710
|
+
activeTool: undefined,
|
|
711
|
+
delegateIndex: index + 1,
|
|
712
|
+
delegateTotal,
|
|
713
|
+
delegateDescription: request.description,
|
|
714
|
+
delegateProfile: childProfile,
|
|
715
|
+
delegateItems,
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
const childResult = await runner({
|
|
719
|
+
systemPrompt: childSystemPrompt,
|
|
720
|
+
tools: childTools,
|
|
721
|
+
prompt: delegatePrompt,
|
|
722
|
+
cwd: childCwd,
|
|
723
|
+
modelOverride: request.model,
|
|
724
|
+
signal: _signal,
|
|
725
|
+
onProgress: (progress) => {
|
|
726
|
+
emitProgress({
|
|
727
|
+
kind: "subagent_progress",
|
|
728
|
+
phase: "running",
|
|
729
|
+
message: `delegate ${index + 1}/${delegateTotal}: ${progress.message}`,
|
|
730
|
+
cwd: progress.cwd ?? childCwd,
|
|
731
|
+
activeTool: progress.activeTool,
|
|
732
|
+
delegateIndex: index + 1,
|
|
733
|
+
delegateTotal,
|
|
734
|
+
delegateDescription: request.description,
|
|
735
|
+
delegateProfile: childProfile,
|
|
736
|
+
delegateItems,
|
|
737
|
+
});
|
|
738
|
+
},
|
|
739
|
+
});
|
|
740
|
+
throwIfAborted();
|
|
741
|
+
let childOutput;
|
|
742
|
+
let childStats;
|
|
743
|
+
if (typeof childResult === "string") {
|
|
744
|
+
childOutput = childResult;
|
|
745
|
+
}
|
|
746
|
+
else {
|
|
747
|
+
childOutput = childResult.output;
|
|
748
|
+
childStats = childResult.stats;
|
|
749
|
+
}
|
|
750
|
+
const parsedChildDelegation = parseDelegationRequests(childOutput, 0);
|
|
751
|
+
childOutput = parsedChildDelegation.cleanedOutput;
|
|
752
|
+
delegationWarnings.push(...parsedChildDelegation.warnings.map((warning) => `Child ${index + 1}: ${warning}`));
|
|
753
|
+
delegatedSucceeded += 1;
|
|
754
|
+
if (delegateItems[index]) {
|
|
755
|
+
delegateItems[index].status = "done";
|
|
756
|
+
}
|
|
757
|
+
delegatedStats.toolCallsStarted += childStats?.toolCallsStarted ?? 0;
|
|
758
|
+
delegatedStats.toolCallsCompleted += childStats?.toolCallsCompleted ?? 0;
|
|
759
|
+
delegatedStats.assistantMessages += childStats?.assistantMessages ?? 0;
|
|
760
|
+
const normalizedChildOutput = childOutput.trim().length > 0 ? childOutput.trim() : "(no output)";
|
|
761
|
+
const childOutputExcerpt = normalizedChildOutput.length > maxDelegatedOutputCharsFromEnv
|
|
762
|
+
? `${normalizedChildOutput.slice(0, Math.max(1, maxDelegatedOutputCharsFromEnv - 3))}...`
|
|
763
|
+
: normalizedChildOutput;
|
|
764
|
+
delegatedSections[index] =
|
|
765
|
+
`#### ${index + 1}. ${request.description} (${childProfile})\n${childOutputExcerpt}`;
|
|
766
|
+
emitProgress({
|
|
767
|
+
kind: "subagent_progress",
|
|
768
|
+
phase: "running",
|
|
769
|
+
message: `delegate ${index + 1}/${delegateTotal} done`,
|
|
770
|
+
cwd: childCwd,
|
|
771
|
+
activeTool: undefined,
|
|
772
|
+
delegateIndex: index + 1,
|
|
773
|
+
delegateTotal,
|
|
774
|
+
delegateDescription: request.description,
|
|
775
|
+
delegateProfile: childProfile,
|
|
776
|
+
delegateItems,
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
catch (error) {
|
|
780
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
781
|
+
if (_signal?.aborted || isAbortError(error)) {
|
|
782
|
+
throw new Error("Operation aborted");
|
|
783
|
+
}
|
|
784
|
+
markDelegateFailed(index, `delegate ${index + 1}/${delegateTotal} failed`, message);
|
|
785
|
+
}
|
|
786
|
+
finally {
|
|
787
|
+
childReleaseIsolation?.();
|
|
788
|
+
childReleaseLock?.();
|
|
789
|
+
}
|
|
790
|
+
};
|
|
791
|
+
const resolveBlockedByFailedDependencies = () => {
|
|
792
|
+
let changed = false;
|
|
793
|
+
for (const index of Array.from(pendingIndices)) {
|
|
794
|
+
const deps = normalizedDependsOn[index] ?? [];
|
|
795
|
+
if (deps.length === 0)
|
|
796
|
+
continue;
|
|
797
|
+
const failedDep = deps.find((dep) => statusOf(dep - 1) === "failed");
|
|
798
|
+
if (!failedDep)
|
|
799
|
+
continue;
|
|
800
|
+
pendingIndices.delete(index);
|
|
801
|
+
markDelegateFailed(index, `delegate ${index + 1}/${delegateTotal} skipped: dependency ${failedDep} failed`, `Delegated task ${index + 1} skipped because dependency ${failedDep} failed.`);
|
|
802
|
+
changed = true;
|
|
803
|
+
}
|
|
804
|
+
return changed;
|
|
805
|
+
};
|
|
806
|
+
const launchReadyDelegates = () => {
|
|
807
|
+
let launched = false;
|
|
808
|
+
while (runningDelegates.size < maxDelegateParallel) {
|
|
809
|
+
let nextIndex;
|
|
810
|
+
for (const index of pendingIndices) {
|
|
811
|
+
const deps = normalizedDependsOn[index] ?? [];
|
|
812
|
+
const allDone = deps.every((dep) => statusOf(dep - 1) === "done");
|
|
813
|
+
if (allDone) {
|
|
814
|
+
nextIndex = index;
|
|
815
|
+
break;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
if (nextIndex === undefined) {
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
pendingIndices.delete(nextIndex);
|
|
822
|
+
const promise = runDelegate(nextIndex).finally(() => {
|
|
823
|
+
runningDelegates.delete(nextIndex);
|
|
824
|
+
});
|
|
825
|
+
runningDelegates.set(nextIndex, promise);
|
|
826
|
+
launched = true;
|
|
827
|
+
}
|
|
828
|
+
return launched;
|
|
829
|
+
};
|
|
830
|
+
while (pendingIndices.size > 0 || runningDelegates.size > 0) {
|
|
831
|
+
throwIfAborted();
|
|
832
|
+
const changed = resolveBlockedByFailedDependencies();
|
|
833
|
+
const launched = launchReadyDelegates();
|
|
834
|
+
if (runningDelegates.size === 0) {
|
|
835
|
+
if (pendingIndices.size > 0 && !changed && !launched) {
|
|
836
|
+
for (const index of Array.from(pendingIndices)) {
|
|
837
|
+
pendingIndices.delete(index);
|
|
838
|
+
const deps = normalizedDependsOn[index] ?? [];
|
|
839
|
+
markDelegateFailed(index, `delegate ${index + 1}/${delegateTotal} blocked: unresolved depends_on`, `Delegated task ${index + 1} blocked by unresolved dependencies: ${deps.join(", ") || "unknown"}.`);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
break;
|
|
843
|
+
}
|
|
844
|
+
await Promise.race(Array.from(runningDelegates.values()));
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
catch (error) {
|
|
848
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
849
|
+
if (_signal?.aborted || isAbortError(error)) {
|
|
850
|
+
throw new Error("Operation aborted");
|
|
851
|
+
}
|
|
852
|
+
const details = {
|
|
853
|
+
profile: effectiveProfile,
|
|
854
|
+
description,
|
|
855
|
+
outputLength: 0,
|
|
856
|
+
cwd: subagentCwd,
|
|
857
|
+
agent: customSubagent?.name,
|
|
858
|
+
lockKey: lockKey?.trim() || undefined,
|
|
859
|
+
runId,
|
|
860
|
+
taskId: orchestrationTaskId,
|
|
861
|
+
model: effectiveModelOverride,
|
|
862
|
+
isolation: useWorktree ? "worktree" : "none",
|
|
863
|
+
worktreePath,
|
|
864
|
+
waitMs: Date.now() - queuedAt,
|
|
865
|
+
background: runInBackground,
|
|
866
|
+
toolCallsStarted: runStats?.toolCallsStarted ?? latestProgress?.toolCallsStarted,
|
|
867
|
+
toolCallsCompleted: runStats?.toolCallsCompleted ?? latestProgress?.toolCallsCompleted,
|
|
868
|
+
assistantMessages: runStats?.assistantMessages ?? latestProgress?.assistantMessages,
|
|
869
|
+
delegatedTasks: delegatedTasks > 0 ? delegatedTasks : undefined,
|
|
870
|
+
delegatedSucceeded: delegatedTasks > 0 ? delegatedSucceeded : undefined,
|
|
871
|
+
delegatedFailed: delegatedTasks > 0 ? delegatedFailed : undefined,
|
|
872
|
+
};
|
|
873
|
+
if (orchestrationRunId && orchestrationTaskId) {
|
|
874
|
+
updateTeamTaskStatus({
|
|
875
|
+
cwd,
|
|
876
|
+
runId: orchestrationRunId,
|
|
877
|
+
taskId: orchestrationTaskId,
|
|
878
|
+
status: "error",
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
throw Object.assign(new Error(`Subagent failed: ${message}`), { details });
|
|
882
|
+
}
|
|
883
|
+
const normalizedOutput = output.trim().length > 0 ? output.trim() : "(Subagent completed with no output)";
|
|
884
|
+
const finalSections = [normalizedOutput];
|
|
885
|
+
if (delegatedTasks > 0) {
|
|
886
|
+
const header = `### Delegated Subtasks (${delegatedSucceeded}/${delegatedTasks} done)`;
|
|
887
|
+
const delegatedBlocks = delegatedSections.filter((section) => typeof section === "string" && section.trim().length > 0);
|
|
888
|
+
finalSections.push([header, ...delegatedBlocks].join("\n\n"));
|
|
889
|
+
}
|
|
890
|
+
if (delegationWarnings.length > 0) {
|
|
891
|
+
finalSections.push(`### Delegation Notes\n${delegationWarnings.map((w) => `- ${w}`).join("\n")}`);
|
|
892
|
+
}
|
|
893
|
+
const text = finalSections.join("\n\n");
|
|
894
|
+
emitProgress({
|
|
895
|
+
kind: "subagent_progress",
|
|
896
|
+
phase: "responding",
|
|
897
|
+
message: delegatedTasks > 0 ? "aggregating delegated results" : "finalizing response",
|
|
898
|
+
cwd: subagentCwd,
|
|
899
|
+
activeTool: undefined,
|
|
900
|
+
delegateIndex: undefined,
|
|
901
|
+
delegateTotal: undefined,
|
|
902
|
+
delegateDescription: undefined,
|
|
903
|
+
delegateProfile: undefined,
|
|
904
|
+
delegateItems: undefined,
|
|
905
|
+
});
|
|
906
|
+
const transcriptPath = persistSubagentTranscript({
|
|
907
|
+
rootCwd: cwd,
|
|
908
|
+
runId,
|
|
909
|
+
description,
|
|
910
|
+
profile: effectiveProfile,
|
|
911
|
+
agent: customSubagent?.name,
|
|
912
|
+
lockKey: lockKey?.trim() || undefined,
|
|
913
|
+
model: effectiveModelOverride,
|
|
914
|
+
subagentCwd,
|
|
915
|
+
sessionId: subagentSessionId,
|
|
916
|
+
prompt: promptWithInstructions,
|
|
917
|
+
output: text,
|
|
918
|
+
isolation: useWorktree ? "worktree" : "none",
|
|
919
|
+
worktreePath,
|
|
920
|
+
});
|
|
921
|
+
const details = {
|
|
922
|
+
profile: effectiveProfile,
|
|
923
|
+
description,
|
|
924
|
+
outputLength: text.length,
|
|
925
|
+
cwd: subagentCwd,
|
|
926
|
+
agent: customSubagent?.name,
|
|
927
|
+
lockKey: lockKey?.trim() || undefined,
|
|
928
|
+
runId,
|
|
929
|
+
taskId: orchestrationTaskId,
|
|
930
|
+
model: effectiveModelOverride,
|
|
931
|
+
subagentSessionId,
|
|
932
|
+
transcriptPath,
|
|
933
|
+
isolation: useWorktree ? "worktree" : "none",
|
|
934
|
+
worktreePath,
|
|
935
|
+
waitMs: Date.now() - queuedAt,
|
|
936
|
+
background: runInBackground,
|
|
937
|
+
toolCallsStarted: typeof (runStats?.toolCallsStarted ?? latestProgress?.toolCallsStarted) === "number"
|
|
938
|
+
? (runStats?.toolCallsStarted ?? latestProgress?.toolCallsStarted ?? 0) +
|
|
939
|
+
delegatedStats.toolCallsStarted
|
|
940
|
+
: delegatedStats.toolCallsStarted > 0
|
|
941
|
+
? delegatedStats.toolCallsStarted
|
|
942
|
+
: undefined,
|
|
943
|
+
toolCallsCompleted: typeof (runStats?.toolCallsCompleted ?? latestProgress?.toolCallsCompleted) === "number"
|
|
944
|
+
? (runStats?.toolCallsCompleted ?? latestProgress?.toolCallsCompleted ?? 0) +
|
|
945
|
+
delegatedStats.toolCallsCompleted
|
|
946
|
+
: delegatedStats.toolCallsCompleted > 0
|
|
947
|
+
? delegatedStats.toolCallsCompleted
|
|
948
|
+
: undefined,
|
|
949
|
+
assistantMessages: typeof (runStats?.assistantMessages ?? latestProgress?.assistantMessages) === "number"
|
|
950
|
+
? (runStats?.assistantMessages ?? latestProgress?.assistantMessages ?? 0) +
|
|
951
|
+
delegatedStats.assistantMessages
|
|
952
|
+
: delegatedStats.assistantMessages > 0
|
|
953
|
+
? delegatedStats.assistantMessages
|
|
954
|
+
: undefined,
|
|
955
|
+
delegatedTasks: delegatedTasks > 0 ? delegatedTasks : undefined,
|
|
956
|
+
delegatedSucceeded: delegatedTasks > 0 ? delegatedSucceeded : undefined,
|
|
957
|
+
delegatedFailed: delegatedTasks > 0 ? delegatedFailed : undefined,
|
|
958
|
+
};
|
|
959
|
+
if (orchestrationRunId && orchestrationTaskId) {
|
|
960
|
+
updateTeamTaskStatus({
|
|
961
|
+
cwd,
|
|
962
|
+
runId: orchestrationRunId,
|
|
963
|
+
taskId: orchestrationTaskId,
|
|
964
|
+
status: "done",
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
return { text, details };
|
|
968
|
+
}
|
|
969
|
+
finally {
|
|
970
|
+
releaseIsolation?.();
|
|
971
|
+
releaseWriteLock?.();
|
|
972
|
+
releaseSlot?.();
|
|
973
|
+
releaseRunSlot?.();
|
|
974
|
+
}
|
|
975
|
+
};
|
|
976
|
+
if (runInBackground) {
|
|
977
|
+
const now = new Date().toISOString();
|
|
978
|
+
const queuedStatusPath = writeBackgroundRunStatus(cwd, {
|
|
979
|
+
runId,
|
|
980
|
+
status: "queued",
|
|
981
|
+
createdAt: now,
|
|
982
|
+
description,
|
|
983
|
+
profile: effectiveProfile,
|
|
984
|
+
cwd: requestedSubagentCwd,
|
|
985
|
+
agent: customSubagent?.name,
|
|
986
|
+
model: effectiveModelOverride,
|
|
987
|
+
});
|
|
988
|
+
void (async () => {
|
|
989
|
+
writeBackgroundRunStatus(cwd, {
|
|
990
|
+
runId,
|
|
991
|
+
status: "running",
|
|
992
|
+
createdAt: now,
|
|
993
|
+
startedAt: new Date().toISOString(),
|
|
994
|
+
description,
|
|
995
|
+
profile: effectiveProfile,
|
|
996
|
+
cwd: requestedSubagentCwd,
|
|
997
|
+
agent: customSubagent?.name,
|
|
998
|
+
model: effectiveModelOverride,
|
|
999
|
+
});
|
|
1000
|
+
try {
|
|
1001
|
+
const result = await executeSubagent();
|
|
1002
|
+
writeBackgroundRunStatus(cwd, {
|
|
1003
|
+
runId,
|
|
1004
|
+
status: "done",
|
|
1005
|
+
createdAt: now,
|
|
1006
|
+
finishedAt: new Date().toISOString(),
|
|
1007
|
+
description,
|
|
1008
|
+
profile: effectiveProfile,
|
|
1009
|
+
cwd: result.details.cwd,
|
|
1010
|
+
agent: customSubagent?.name,
|
|
1011
|
+
model: effectiveModelOverride,
|
|
1012
|
+
transcriptPath: result.details.transcriptPath,
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
catch (error) {
|
|
1016
|
+
writeBackgroundRunStatus(cwd, {
|
|
1017
|
+
runId,
|
|
1018
|
+
status: "error",
|
|
1019
|
+
createdAt: now,
|
|
1020
|
+
finishedAt: new Date().toISOString(),
|
|
1021
|
+
description,
|
|
1022
|
+
profile: effectiveProfile,
|
|
1023
|
+
cwd: requestedSubagentCwd,
|
|
1024
|
+
agent: customSubagent?.name,
|
|
1025
|
+
model: effectiveModelOverride,
|
|
1026
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
})();
|
|
1030
|
+
return {
|
|
1031
|
+
content: [
|
|
1032
|
+
{
|
|
1033
|
+
type: "text",
|
|
1034
|
+
text: `Started background subagent run ${runId}. Check .iosm/subagents/background and /subagent-runs for results.`,
|
|
1035
|
+
},
|
|
1036
|
+
],
|
|
1037
|
+
details: {
|
|
1038
|
+
profile: effectiveProfile,
|
|
1039
|
+
description,
|
|
1040
|
+
outputLength: 0,
|
|
1041
|
+
cwd: requestedSubagentCwd,
|
|
1042
|
+
agent: customSubagent?.name,
|
|
1043
|
+
lockKey: lockKey?.trim() || undefined,
|
|
1044
|
+
runId,
|
|
1045
|
+
taskId: orchestrationTaskId,
|
|
1046
|
+
model: effectiveModelOverride,
|
|
1047
|
+
background: true,
|
|
1048
|
+
backgroundStatusPath: queuedStatusPath,
|
|
1049
|
+
waitMs: Date.now() - queuedAt,
|
|
1050
|
+
isolation: useWorktree ? "worktree" : "none",
|
|
1051
|
+
toolCallsStarted: latestProgress?.toolCallsStarted,
|
|
1052
|
+
toolCallsCompleted: latestProgress?.toolCallsCompleted,
|
|
1053
|
+
assistantMessages: latestProgress?.assistantMessages,
|
|
1054
|
+
},
|
|
1055
|
+
};
|
|
1056
|
+
}
|
|
1057
|
+
const result = await executeSubagent();
|
|
1058
|
+
return {
|
|
1059
|
+
content: [{ type: "text", text: result.text }],
|
|
1060
|
+
details: result.details,
|
|
1061
|
+
};
|
|
1062
|
+
},
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
//# sourceMappingURL=task.js.map
|