@bastani/atomic 0.8.31-alpha.5 → 0.9.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1357) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/dist/builtin/cursor/CHANGELOG.md +4 -1
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/cursor/src/proto/protobuf-codec-json.ts +44 -0
  5. package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +271 -0
  6. package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +231 -0
  7. package/dist/builtin/cursor/src/proto/protobuf-codec.ts +5 -523
  8. package/dist/builtin/cursor/src/stream.ts +6 -70
  9. package/dist/builtin/cursor/src/transport-errors.ts +74 -0
  10. package/dist/builtin/cursor/src/transport-frame.ts +56 -0
  11. package/dist/builtin/cursor/src/transport-http2.ts +122 -0
  12. package/dist/builtin/cursor/src/transport-native-client.ts +161 -0
  13. package/dist/builtin/cursor/src/transport-run-stream.ts +188 -0
  14. package/dist/builtin/cursor/src/transport-timeouts.ts +87 -0
  15. package/dist/builtin/cursor/src/transport-types.ts +140 -0
  16. package/dist/builtin/cursor/src/transport.ts +24 -790
  17. package/dist/builtin/intercom/CHANGELOG.md +3 -0
  18. package/dist/builtin/intercom/broker/client.ts +0 -35
  19. package/dist/builtin/intercom/contact-supervisor-tool.ts +289 -0
  20. package/dist/builtin/intercom/index-heavy.ts +77 -1336
  21. package/dist/builtin/intercom/intercom-tool.ts +409 -0
  22. package/dist/builtin/intercom/intercom-utils.ts +401 -0
  23. package/dist/builtin/intercom/lifecycle.ts +133 -0
  24. package/dist/builtin/intercom/overlay.ts +96 -0
  25. package/dist/builtin/intercom/package.json +1 -1
  26. package/dist/builtin/intercom/subagent-relay.ts +137 -0
  27. package/dist/builtin/mcp/CHANGELOG.md +3 -0
  28. package/dist/builtin/mcp/config-write-utils.ts +104 -0
  29. package/dist/builtin/mcp/config.ts +4 -180
  30. package/dist/builtin/mcp/mcp-panel-renderer.ts +243 -0
  31. package/dist/builtin/mcp/mcp-panel-state.ts +227 -0
  32. package/dist/builtin/mcp/mcp-panel-types.ts +86 -0
  33. package/dist/builtin/mcp/mcp-panel.ts +145 -579
  34. package/dist/builtin/mcp/mcp-setup-panel.ts +4 -81
  35. package/dist/builtin/mcp/package.json +1 -1
  36. package/dist/builtin/mcp/proxy-auth.ts +61 -0
  37. package/dist/builtin/mcp/proxy-call.ts +373 -0
  38. package/dist/builtin/mcp/proxy-connect.ts +58 -0
  39. package/dist/builtin/mcp/proxy-info-modes.ts +326 -0
  40. package/dist/builtin/mcp/proxy-modes.ts +3 -805
  41. package/dist/builtin/mcp/proxy-types.ts +3 -0
  42. package/dist/builtin/mcp/ui-server-http.ts +81 -0
  43. package/dist/builtin/mcp/ui-server.ts +2 -127
  44. package/dist/builtin/subagents/CHANGELOG.md +3 -0
  45. package/dist/builtin/subagents/package.json +1 -1
  46. package/dist/builtin/subagents/src/agents/agent-discovery.ts +127 -0
  47. package/dist/builtin/subagents/src/agents/agent-loaders.ts +175 -0
  48. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +310 -0
  49. package/dist/builtin/subagents/src/agents/agent-management.ts +3 -309
  50. package/dist/builtin/subagents/src/agents/agent-overrides.ts +397 -0
  51. package/dist/builtin/subagents/src/agents/agent-paths.ts +88 -0
  52. package/dist/builtin/subagents/src/agents/agent-types.ts +136 -0
  53. package/dist/builtin/subagents/src/agents/agents.ts +22 -895
  54. package/dist/builtin/subagents/src/agents/skills-paths.ts +333 -0
  55. package/dist/builtin/subagents/src/agents/skills.ts +3 -326
  56. package/dist/builtin/subagents/src/extension/index.ts +4 -118
  57. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +13 -0
  58. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +401 -0
  59. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +131 -0
  60. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +213 -0
  61. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +84 -0
  62. package/dist/builtin/subagents/src/runs/background/async-execution.ts +13 -795
  63. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +215 -0
  64. package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +136 -0
  65. package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +105 -0
  66. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +112 -0
  67. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +159 -0
  68. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +127 -0
  69. package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +427 -0
  70. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +273 -0
  71. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +269 -0
  72. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +196 -0
  73. package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +70 -0
  74. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +44 -2233
  75. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +75 -0
  76. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +202 -0
  77. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +97 -0
  78. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +160 -0
  79. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +72 -0
  80. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +161 -0
  81. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +203 -0
  82. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +234 -0
  83. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +103 -0
  84. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +29 -0
  85. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +4 -1328
  86. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +117 -0
  87. package/dist/builtin/subagents/src/runs/foreground/chain-execution-details.ts +35 -0
  88. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +194 -0
  89. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +183 -0
  90. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +185 -0
  91. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +229 -0
  92. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +194 -0
  93. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +94 -1043
  94. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +135 -0
  95. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +107 -0
  96. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-types.ts +17 -0
  97. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +454 -0
  98. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +219 -0
  99. package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +77 -0
  100. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +34 -0
  101. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +56 -0
  102. package/dist/builtin/subagents/src/runs/foreground/execution.ts +6 -1082
  103. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +207 -0
  104. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +140 -0
  105. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +266 -0
  106. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +270 -0
  107. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +157 -0
  108. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +375 -0
  109. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +463 -0
  110. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +17 -0
  111. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +320 -0
  112. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +207 -0
  113. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +121 -0
  114. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +113 -0
  115. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +150 -2522
  116. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +0 -16
  117. package/dist/builtin/subagents/src/runs/shared/nested-events-control.ts +167 -0
  118. package/dist/builtin/subagents/src/runs/shared/nested-events-core.ts +219 -0
  119. package/dist/builtin/subagents/src/runs/shared/nested-events-projection.ts +121 -0
  120. package/dist/builtin/subagents/src/runs/shared/nested-events-registry.ts +289 -0
  121. package/dist/builtin/subagents/src/runs/shared/nested-events-sanitize.ts +201 -0
  122. package/dist/builtin/subagents/src/runs/shared/nested-events.ts +50 -935
  123. package/dist/builtin/subagents/src/runs/shared/worktree.ts +0 -78
  124. package/dist/builtin/subagents/src/shared/types-async.ts +265 -0
  125. package/dist/builtin/subagents/src/shared/types-config.ts +125 -0
  126. package/dist/builtin/subagents/src/shared/types-depth.ts +121 -0
  127. package/dist/builtin/subagents/src/shared/types-output.ts +63 -0
  128. package/dist/builtin/subagents/src/shared/types-results.ts +318 -0
  129. package/dist/builtin/subagents/src/shared/types-runtime.ts +136 -0
  130. package/dist/builtin/subagents/src/shared/types.ts +10 -975
  131. package/dist/builtin/subagents/src/slash/slash-commands.ts +0 -12
  132. package/dist/builtin/subagents/src/tui/render-chain-graph.ts +247 -0
  133. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +259 -0
  134. package/dist/builtin/subagents/src/tui/render-layout.ts +120 -0
  135. package/dist/builtin/subagents/src/tui/render-result-animation.ts +56 -0
  136. package/dist/builtin/subagents/src/tui/render-result-compact.ts +154 -0
  137. package/dist/builtin/subagents/src/tui/render-result.ts +390 -0
  138. package/dist/builtin/subagents/src/tui/render-stable-output.ts +83 -0
  139. package/dist/builtin/subagents/src/tui/render-status-progress.ts +133 -0
  140. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +166 -0
  141. package/dist/builtin/subagents/src/tui/render-widget.ts +273 -0
  142. package/dist/builtin/subagents/src/tui/render.ts +14 -1801
  143. package/dist/builtin/web-access/CHANGELOG.md +3 -0
  144. package/dist/builtin/web-access/content-tools.ts +348 -0
  145. package/dist/builtin/web-access/curator-page-assets/script-1.ts +400 -0
  146. package/dist/builtin/web-access/curator-page-assets/script-2.ts +400 -0
  147. package/dist/builtin/web-access/curator-page-assets/script-3.ts +400 -0
  148. package/dist/builtin/web-access/curator-page-assets/script-4.ts +400 -0
  149. package/dist/builtin/web-access/curator-page-assets/script-5.ts +398 -0
  150. package/dist/builtin/web-access/curator-page-assets/styles-1.ts +394 -0
  151. package/dist/builtin/web-access/curator-page-assets/styles-2.ts +394 -0
  152. package/dist/builtin/web-access/curator-page-assets/styles-3.ts +393 -0
  153. package/dist/builtin/web-access/curator-page.ts +17 -3180
  154. package/dist/builtin/web-access/curator-server-helpers.ts +115 -0
  155. package/dist/builtin/web-access/curator-server.ts +2 -113
  156. package/dist/builtin/web-access/exa-mcp.ts +218 -0
  157. package/dist/builtin/web-access/exa.ts +2 -207
  158. package/dist/builtin/web-access/extract-frames.ts +228 -0
  159. package/dist/builtin/web-access/extract.ts +13 -214
  160. package/dist/builtin/web-access/github-config.ts +156 -0
  161. package/dist/builtin/web-access/github-extract.ts +3 -154
  162. package/dist/builtin/web-access/index-heavy.ts +8 -1904
  163. package/dist/builtin/web-access/package.json +2 -1
  164. package/dist/builtin/web-access/web-search-activity.ts +102 -0
  165. package/dist/builtin/web-access/web-search-browser.ts +116 -0
  166. package/dist/builtin/web-access/web-search-command.ts +242 -0
  167. package/dist/builtin/web-access/web-search-config.ts +163 -0
  168. package/dist/builtin/web-access/web-search-curator.ts +214 -0
  169. package/dist/builtin/web-access/web-search-features.ts +165 -0
  170. package/dist/builtin/web-access/web-search-formatting.ts +117 -0
  171. package/dist/builtin/web-access/web-search-return.ts +136 -0
  172. package/dist/builtin/web-access/web-search-summary.ts +170 -0
  173. package/dist/builtin/web-access/web-search-tool.ts +290 -0
  174. package/dist/builtin/web-access/web-search-types.ts +50 -0
  175. package/dist/builtin/workflows/CHANGELOG.md +4 -1
  176. package/dist/builtin/workflows/builtin/deep-research-codebase-runner.ts +492 -0
  177. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +346 -0
  178. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +6 -822
  179. package/dist/builtin/workflows/builtin/goal-artifacts.ts +43 -0
  180. package/dist/builtin/workflows/builtin/goal-ledger.ts +54 -0
  181. package/dist/builtin/workflows/builtin/goal-prompts.ts +360 -0
  182. package/dist/builtin/workflows/builtin/goal-reducer.ts +141 -0
  183. package/dist/builtin/workflows/builtin/goal-reports.ts +56 -0
  184. package/dist/builtin/workflows/builtin/goal-review.ts +84 -0
  185. package/dist/builtin/workflows/builtin/goal-runner.ts +343 -0
  186. package/dist/builtin/workflows/builtin/goal-schemas.ts +60 -0
  187. package/dist/builtin/workflows/builtin/goal-types.ts +132 -0
  188. package/dist/builtin/workflows/builtin/goal.ts +4 -1160
  189. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +432 -0
  190. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +477 -0
  191. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +312 -0
  192. package/dist/builtin/workflows/builtin/open-claude-design.ts +7 -1083
  193. package/dist/builtin/workflows/builtin/ralph-core.ts +408 -0
  194. package/dist/builtin/workflows/builtin/ralph-models.ts +123 -0
  195. package/dist/builtin/workflows/builtin/ralph-runner.ts +499 -0
  196. package/dist/builtin/workflows/builtin/ralph.ts +7 -979
  197. package/dist/builtin/workflows/package.json +1 -1
  198. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +2 -2
  199. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +2 -2
  200. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +2 -2
  201. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +8 -1
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +13 -15
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +2 -2
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +9 -0
  205. package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +186 -0
  206. package/dist/builtin/workflows/src/extension/config-file-loader.ts +152 -0
  207. package/dist/builtin/workflows/src/extension/config-loader.ts +2 -167
  208. package/dist/builtin/workflows/src/extension/discovery-loaders.ts +115 -0
  209. package/dist/builtin/workflows/src/extension/discovery.ts +3 -117
  210. package/dist/builtin/workflows/src/extension/extension-factory.ts +120 -0
  211. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +109 -0
  212. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +270 -0
  213. package/dist/builtin/workflows/src/extension/index.ts +42 -4166
  214. package/dist/builtin/workflows/src/extension/public-types.ts +295 -0
  215. package/dist/builtin/workflows/src/extension/render-component.ts +14 -0
  216. package/dist/builtin/workflows/src/extension/runtime-direct.ts +96 -0
  217. package/dist/builtin/workflows/src/extension/runtime.ts +1 -92
  218. package/dist/builtin/workflows/src/extension/ui-surface.ts +286 -0
  219. package/dist/builtin/workflows/src/extension/wiring.ts +6 -475
  220. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +111 -0
  221. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +213 -0
  222. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +81 -0
  223. package/dist/builtin/workflows/src/extension/workflow-command-utils.ts +181 -0
  224. package/dist/builtin/workflows/src/extension/workflow-policy.ts +15 -0
  225. package/dist/builtin/workflows/src/extension/workflow-ports.ts +41 -0
  226. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +23 -0
  227. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +286 -0
  228. package/dist/builtin/workflows/src/extension/workflow-schema.ts +1 -1
  229. package/dist/builtin/workflows/src/extension/workflow-stage-results.ts +264 -0
  230. package/dist/builtin/workflows/src/extension/workflow-targets.ts +181 -0
  231. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +175 -0
  232. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +205 -0
  233. package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +66 -0
  234. package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +164 -0
  235. package/dist/builtin/workflows/src/extension/workflow-tool-registration.ts +54 -0
  236. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +164 -0
  237. package/dist/builtin/workflows/src/extension/workflow-tool.ts +102 -0
  238. package/dist/builtin/workflows/src/runs/foreground/executor-abort.ts +431 -0
  239. package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +232 -0
  240. package/dist/builtin/workflows/src/runs/foreground/executor-child-helpers.ts +74 -0
  241. package/dist/builtin/workflows/src/runs/foreground/executor-child-workflow.ts +158 -0
  242. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +167 -0
  243. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +450 -0
  244. package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +233 -0
  245. package/dist/builtin/workflows/src/runs/foreground/executor-exit-manager.ts +195 -0
  246. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +368 -0
  247. package/dist/builtin/workflows/src/runs/foreground/executor-inputs.ts +83 -0
  248. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +441 -0
  249. package/dist/builtin/workflows/src/runs/foreground/executor-outputs.ts +160 -0
  250. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +274 -0
  251. package/dist/builtin/workflows/src/runs/foreground/executor-run-finalizers.ts +122 -0
  252. package/dist/builtin/workflows/src/runs/foreground/executor-run.ts +359 -0
  253. package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +204 -0
  254. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +197 -0
  255. package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +120 -0
  256. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +126 -0
  257. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +351 -0
  258. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +134 -0
  259. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +54 -0
  260. package/dist/builtin/workflows/src/runs/foreground/executor-task-context.ts +132 -0
  261. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +293 -0
  262. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +109 -0
  263. package/dist/builtin/workflows/src/runs/foreground/executor.ts +19 -5354
  264. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +219 -0
  265. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +500 -0
  266. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +129 -0
  267. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +53 -0
  268. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +146 -0
  269. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +55 -0
  270. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +82 -0
  271. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +141 -0
  272. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +13 -1355
  273. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +453 -0
  274. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +442 -0
  275. package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +2 -836
  276. package/dist/builtin/workflows/src/runs/shared/worktree-diff.ts +165 -0
  277. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +220 -0
  278. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +335 -0
  279. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +92 -0
  280. package/dist/builtin/workflows/src/runs/shared/worktree.ts +18 -791
  281. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +365 -0
  282. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +425 -0
  283. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +236 -0
  284. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +354 -0
  285. package/dist/builtin/workflows/src/shared/authoring-contract.d.ts +5 -598
  286. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +428 -0
  287. package/dist/builtin/workflows/src/shared/persistence-restore.ts +9 -431
  288. package/dist/builtin/workflows/src/shared/store-factory.ts +16 -0
  289. package/dist/builtin/workflows/src/shared/store-internal.ts +219 -0
  290. package/dist/builtin/workflows/src/shared/store-prompt-methods.ts +219 -0
  291. package/dist/builtin/workflows/src/shared/store-public-types.ts +215 -0
  292. package/dist/builtin/workflows/src/shared/store-run-methods.ts +223 -0
  293. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +305 -0
  294. package/dist/builtin/workflows/src/shared/store.ts +11 -1138
  295. package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +266 -0
  296. package/dist/builtin/workflows/src/shared/workflow-failures-contract.ts +75 -0
  297. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +477 -0
  298. package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +248 -0
  299. package/dist/builtin/workflows/src/shared/workflow-failures.ts +13 -1001
  300. package/dist/builtin/workflows/src/tui/chat-surface.ts +0 -66
  301. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +45 -0
  302. package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +161 -0
  303. package/dist/builtin/workflows/src/tui/graph-view-input.ts +333 -0
  304. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +336 -0
  305. package/dist/builtin/workflows/src/tui/graph-view-render.ts +194 -0
  306. package/dist/builtin/workflows/src/tui/graph-view-state.ts +306 -0
  307. package/dist/builtin/workflows/src/tui/graph-view-types.ts +70 -0
  308. package/dist/builtin/workflows/src/tui/graph-view.ts +4 -1386
  309. package/dist/builtin/workflows/src/tui/inline-form-editor-text.ts +121 -0
  310. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +11 -223
  311. package/dist/builtin/workflows/src/tui/inputs-picker-editing.ts +151 -0
  312. package/dist/builtin/workflows/src/tui/inputs-picker-input.ts +305 -0
  313. package/dist/builtin/workflows/src/tui/inputs-picker-render.ts +300 -0
  314. package/dist/builtin/workflows/src/tui/inputs-picker-types.ts +190 -0
  315. package/dist/builtin/workflows/src/tui/inputs-picker.ts +19 -997
  316. package/dist/builtin/workflows/src/tui/prompt-card-input.ts +226 -0
  317. package/dist/builtin/workflows/src/tui/prompt-card-render.ts +373 -0
  318. package/dist/builtin/workflows/src/tui/prompt-card-select.ts +116 -0
  319. package/dist/builtin/workflows/src/tui/prompt-card-state.ts +61 -0
  320. package/dist/builtin/workflows/src/tui/prompt-card-text.ts +129 -0
  321. package/dist/builtin/workflows/src/tui/prompt-card.ts +8 -910
  322. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +315 -0
  323. package/dist/builtin/workflows/src/tui/stage-chat-view-custom-ui.ts +127 -0
  324. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +187 -0
  325. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +222 -0
  326. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +152 -0
  327. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +464 -0
  328. package/dist/builtin/workflows/src/tui/stage-chat-view-transcript.ts +242 -0
  329. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +151 -0
  330. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +141 -1777
  331. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +85 -0
  332. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +1 -129
  333. package/dist/config-self-update.d.ts +21 -0
  334. package/dist/config-self-update.d.ts.map +1 -0
  335. package/dist/config-self-update.js +265 -0
  336. package/dist/config-self-update.js.map +1 -0
  337. package/dist/config.d.ts +3 -12
  338. package/dist/config.d.ts.map +1 -1
  339. package/dist/config.js +15 -252
  340. package/dist/config.js.map +1 -1
  341. package/dist/core/agent-session-accessors.d.ts +3 -0
  342. package/dist/core/agent-session-accessors.d.ts.map +1 -0
  343. package/dist/core/agent-session-accessors.js +36 -0
  344. package/dist/core/agent-session-accessors.js.map +1 -0
  345. package/dist/core/agent-session-auto-compaction.d.ts +32 -0
  346. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -0
  347. package/dist/core/agent-session-auto-compaction.js +214 -0
  348. package/dist/core/agent-session-auto-compaction.js.map +1 -0
  349. package/dist/core/agent-session-bash.d.ts +30 -0
  350. package/dist/core/agent-session-bash.d.ts.map +1 -0
  351. package/dist/core/agent-session-bash.js +84 -0
  352. package/dist/core/agent-session-bash.js.map +1 -0
  353. package/dist/core/agent-session-compaction.d.ts +44 -0
  354. package/dist/core/agent-session-compaction.d.ts.map +1 -0
  355. package/dist/core/agent-session-compaction.js +282 -0
  356. package/dist/core/agent-session-compaction.js.map +1 -0
  357. package/dist/core/agent-session-events.d.ts +65 -0
  358. package/dist/core/agent-session-events.d.ts.map +1 -0
  359. package/dist/core/agent-session-events.js +373 -0
  360. package/dist/core/agent-session-events.js.map +1 -0
  361. package/dist/core/agent-session-export.d.ts +42 -0
  362. package/dist/core/agent-session-export.d.ts.map +1 -0
  363. package/dist/core/agent-session-export.js +199 -0
  364. package/dist/core/agent-session-export.js.map +1 -0
  365. package/dist/core/agent-session-extension-bindings.d.ts +37 -0
  366. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -0
  367. package/dist/core/agent-session-extension-bindings.js +231 -0
  368. package/dist/core/agent-session-extension-bindings.js.map +1 -0
  369. package/dist/core/agent-session-message-queue.d.ts +85 -0
  370. package/dist/core/agent-session-message-queue.d.ts.map +1 -0
  371. package/dist/core/agent-session-message-queue.js +264 -0
  372. package/dist/core/agent-session-message-queue.js.map +1 -0
  373. package/dist/core/agent-session-methods.d.ts +302 -0
  374. package/dist/core/agent-session-methods.d.ts.map +1 -0
  375. package/dist/core/agent-session-methods.js +2 -0
  376. package/dist/core/agent-session-methods.js.map +1 -0
  377. package/dist/core/agent-session-models.d.ts +111 -0
  378. package/dist/core/agent-session-models.d.ts.map +1 -0
  379. package/dist/core/agent-session-models.js +368 -0
  380. package/dist/core/agent-session-models.js.map +1 -0
  381. package/dist/core/agent-session-prompt.d.ts +61 -0
  382. package/dist/core/agent-session-prompt.d.ts.map +1 -0
  383. package/dist/core/agent-session-prompt.js +330 -0
  384. package/dist/core/agent-session-prompt.js.map +1 -0
  385. package/dist/core/agent-session-retry.d.ts +62 -0
  386. package/dist/core/agent-session-retry.d.ts.map +1 -0
  387. package/dist/core/agent-session-retry.js +202 -0
  388. package/dist/core/agent-session-retry.js.map +1 -0
  389. package/dist/core/agent-session-skill-block.d.ts +13 -0
  390. package/dist/core/agent-session-skill-block.d.ts.map +1 -0
  391. package/dist/core/agent-session-skill-block.js +37 -0
  392. package/dist/core/agent-session-skill-block.js.map +1 -0
  393. package/dist/core/agent-session-state.d.ts +48 -0
  394. package/dist/core/agent-session-state.d.ts.map +1 -0
  395. package/dist/core/agent-session-state.js +129 -0
  396. package/dist/core/agent-session-state.js.map +1 -0
  397. package/dist/core/agent-session-tool-hooks.d.ts +7 -0
  398. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -0
  399. package/dist/core/agent-session-tool-hooks.js +72 -0
  400. package/dist/core/agent-session-tool-hooks.js.map +1 -0
  401. package/dist/core/agent-session-tool-registry.d.ts +15 -0
  402. package/dist/core/agent-session-tool-registry.d.ts.map +1 -0
  403. package/dist/core/agent-session-tool-registry.js +151 -0
  404. package/dist/core/agent-session-tool-registry.js.map +1 -0
  405. package/dist/core/agent-session-tree.d.ts +46 -0
  406. package/dist/core/agent-session-tree.d.ts.map +1 -0
  407. package/dist/core/agent-session-tree.js +217 -0
  408. package/dist/core/agent-session-tree.js.map +1 -0
  409. package/dist/core/agent-session-types.d.ts +159 -0
  410. package/dist/core/agent-session-types.d.ts.map +1 -0
  411. package/dist/core/agent-session-types.js +41 -0
  412. package/dist/core/agent-session-types.js.map +1 -0
  413. package/dist/core/agent-session.d.ts +68 -688
  414. package/dist/core/agent-session.d.ts.map +1 -1
  415. package/dist/core/agent-session.js +26 -3152
  416. package/dist/core/agent-session.js.map +1 -1
  417. package/dist/core/auth-storage-backends.d.ts +49 -0
  418. package/dist/core/auth-storage-backends.d.ts.map +1 -0
  419. package/dist/core/auth-storage-backends.js +185 -0
  420. package/dist/core/auth-storage-backends.js.map +1 -0
  421. package/dist/core/auth-storage.d.ts +2 -49
  422. package/dist/core/auth-storage.d.ts.map +1 -1
  423. package/dist/core/auth-storage.js +3 -183
  424. package/dist/core/auth-storage.js.map +1 -1
  425. package/dist/core/compaction/context-compaction-metrics.d.ts +16 -0
  426. package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -0
  427. package/dist/core/compaction/context-compaction-metrics.js +58 -0
  428. package/dist/core/compaction/context-compaction-metrics.js.map +1 -0
  429. package/dist/core/compaction/context-compaction-prompt.d.ts +9 -0
  430. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -0
  431. package/dist/core/compaction/context-compaction-prompt.js +161 -0
  432. package/dist/core/compaction/context-compaction-prompt.js.map +1 -0
  433. package/dist/core/compaction/context-compaction-runner.d.ts +5 -0
  434. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -0
  435. package/dist/core/compaction/context-compaction-runner.js +181 -0
  436. package/dist/core/compaction/context-compaction-runner.js.map +1 -0
  437. package/dist/core/compaction/context-compaction-strategy.d.ts +5 -0
  438. package/dist/core/compaction/context-compaction-strategy.d.ts.map +1 -0
  439. package/dist/core/compaction/context-compaction-strategy.js +27 -0
  440. package/dist/core/compaction/context-compaction-strategy.js.map +1 -0
  441. package/dist/core/compaction/context-compaction-types.d.ts +73 -0
  442. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -0
  443. package/dist/core/compaction/context-compaction-types.js +6 -0
  444. package/dist/core/compaction/context-compaction-types.js.map +1 -0
  445. package/dist/core/compaction/context-compaction.d.ts +9 -200
  446. package/dist/core/compaction/context-compaction.d.ts.map +1 -1
  447. package/dist/core/compaction/context-compaction.js +7 -1943
  448. package/dist/core/compaction/context-compaction.js.map +1 -1
  449. package/dist/core/compaction/context-deletion-application.d.ts +13 -0
  450. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -0
  451. package/dist/core/compaction/context-deletion-application.js +259 -0
  452. package/dist/core/compaction/context-deletion-application.js.map +1 -0
  453. package/dist/core/compaction/context-deletion-store.d.ts +78 -0
  454. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -0
  455. package/dist/core/compaction/context-deletion-store.js +162 -0
  456. package/dist/core/compaction/context-deletion-store.js.map +1 -0
  457. package/dist/core/compaction/context-deletion-targets.d.ts +40 -0
  458. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -0
  459. package/dist/core/compaction/context-deletion-targets.js +267 -0
  460. package/dist/core/compaction/context-deletion-targets.js.map +1 -0
  461. package/dist/core/compaction/context-deletion-tool-definitions.d.ts +187 -0
  462. package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -0
  463. package/dist/core/compaction/context-deletion-tool-definitions.js +98 -0
  464. package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -0
  465. package/dist/core/compaction/context-deletion-tool-helpers.d.ts +19 -0
  466. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -0
  467. package/dist/core/compaction/context-deletion-tool-helpers.js +137 -0
  468. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -0
  469. package/dist/core/compaction/context-deletion-tools.d.ts +4 -0
  470. package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -0
  471. package/dist/core/compaction/context-deletion-tools.js +395 -0
  472. package/dist/core/compaction/context-deletion-tools.js.map +1 -0
  473. package/dist/core/compaction/context-transcript-analysis.d.ts +9 -0
  474. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -0
  475. package/dist/core/compaction/context-transcript-analysis.js +234 -0
  476. package/dist/core/compaction/context-transcript-analysis.js.map +1 -0
  477. package/dist/core/export-html/index.d.ts.map +1 -1
  478. package/dist/core/export-html/index.js +2 -1
  479. package/dist/core/export-html/index.js.map +1 -1
  480. package/dist/core/export-html/template-js/data-tree.js +287 -0
  481. package/dist/core/export-html/template-js/entries-navigation.js +424 -0
  482. package/dist/core/export-html/template-js/initialization.js +312 -0
  483. package/dist/core/export-html/template-js/message-tools.js +415 -0
  484. package/dist/core/export-html/template-js/tree-filter-render.js +421 -0
  485. package/dist/core/export-html/template-script.d.ts +3 -0
  486. package/dist/core/export-html/template-script.d.ts.map +1 -0
  487. package/dist/core/export-html/template-script.js +13 -0
  488. package/dist/core/export-html/template-script.js.map +1 -0
  489. package/dist/core/export-html/template.js +3 -1
  490. package/dist/core/extensions/agent-events.d.ts +159 -0
  491. package/dist/core/extensions/agent-events.d.ts.map +1 -0
  492. package/dist/core/extensions/agent-events.js +2 -0
  493. package/dist/core/extensions/agent-events.js.map +1 -0
  494. package/dist/core/extensions/api-types.d.ts +189 -0
  495. package/dist/core/extensions/api-types.d.ts.map +1 -0
  496. package/dist/core/extensions/api-types.js +2 -0
  497. package/dist/core/extensions/api-types.js.map +1 -0
  498. package/dist/core/extensions/command-types.d.ts +14 -0
  499. package/dist/core/extensions/command-types.d.ts.map +1 -0
  500. package/dist/core/extensions/command-types.js +2 -0
  501. package/dist/core/extensions/command-types.js.map +1 -0
  502. package/dist/core/extensions/context-types.d.ts +130 -0
  503. package/dist/core/extensions/context-types.d.ts.map +1 -0
  504. package/dist/core/extensions/context-types.js +2 -0
  505. package/dist/core/extensions/context-types.js.map +1 -0
  506. package/dist/core/extensions/event-results.d.ts +61 -0
  507. package/dist/core/extensions/event-results.d.ts.map +1 -0
  508. package/dist/core/extensions/event-results.js +2 -0
  509. package/dist/core/extensions/event-results.js.map +1 -0
  510. package/dist/core/extensions/event-types.d.ts +6 -0
  511. package/dist/core/extensions/event-types.d.ts.map +1 -0
  512. package/dist/core/extensions/event-types.js +2 -0
  513. package/dist/core/extensions/event-types.js.map +1 -0
  514. package/dist/core/extensions/loader-api.d.ts +10 -0
  515. package/dist/core/extensions/loader-api.d.ts.map +1 -0
  516. package/dist/core/extensions/loader-api.js +143 -0
  517. package/dist/core/extensions/loader-api.js.map +1 -0
  518. package/dist/core/extensions/loader-core.d.ts +12 -0
  519. package/dist/core/extensions/loader-core.d.ts.map +1 -0
  520. package/dist/core/extensions/loader-core.js +91 -0
  521. package/dist/core/extensions/loader-core.js.map +1 -0
  522. package/dist/core/extensions/loader-discovery.d.ts +7 -0
  523. package/dist/core/extensions/loader-discovery.d.ts.map +1 -0
  524. package/dist/core/extensions/loader-discovery.js +139 -0
  525. package/dist/core/extensions/loader-discovery.js.map +1 -0
  526. package/dist/core/extensions/loader-resources.d.ts +11 -0
  527. package/dist/core/extensions/loader-resources.d.ts.map +1 -0
  528. package/dist/core/extensions/loader-resources.js +10 -0
  529. package/dist/core/extensions/loader-resources.js.map +1 -0
  530. package/dist/core/extensions/loader-runtime.d.ts +7 -0
  531. package/dist/core/extensions/loader-runtime.d.ts.map +1 -0
  532. package/dist/core/extensions/loader-runtime.js +51 -0
  533. package/dist/core/extensions/loader-runtime.js.map +1 -0
  534. package/dist/core/extensions/loader-virtual-modules.d.ts +3 -0
  535. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -0
  536. package/dist/core/extensions/loader-virtual-modules.js +92 -0
  537. package/dist/core/extensions/loader-virtual-modules.js.map +1 -0
  538. package/dist/core/extensions/loader.d.ts +4 -28
  539. package/dist/core/extensions/loader.d.ts.map +1 -1
  540. package/dist/core/extensions/loader.js +3 -542
  541. package/dist/core/extensions/loader.js.map +1 -1
  542. package/dist/core/extensions/message-types.d.ts +34 -0
  543. package/dist/core/extensions/message-types.d.ts.map +1 -0
  544. package/dist/core/extensions/message-types.js +2 -0
  545. package/dist/core/extensions/message-types.js.map +1 -0
  546. package/dist/core/extensions/provider-types.d.ts +71 -0
  547. package/dist/core/extensions/provider-types.d.ts.map +1 -0
  548. package/dist/core/extensions/provider-types.js +2 -0
  549. package/dist/core/extensions/provider-types.js.map +1 -0
  550. package/dist/core/extensions/runner-context.d.ts +42 -0
  551. package/dist/core/extensions/runner-context.d.ts.map +1 -0
  552. package/dist/core/extensions/runner-context.js +112 -0
  553. package/dist/core/extensions/runner-context.js.map +1 -0
  554. package/dist/core/extensions/runner-events.d.ts +47 -0
  555. package/dist/core/extensions/runner-events.d.ts.map +1 -0
  556. package/dist/core/extensions/runner-events.js +280 -0
  557. package/dist/core/extensions/runner-events.js.map +1 -0
  558. package/dist/core/extensions/runner-handlers.d.ts +32 -0
  559. package/dist/core/extensions/runner-handlers.d.ts.map +1 -0
  560. package/dist/core/extensions/runner-handlers.js +2 -0
  561. package/dist/core/extensions/runner-handlers.js.map +1 -0
  562. package/dist/core/extensions/runner-project-trust.d.ts +6 -0
  563. package/dist/core/extensions/runner-project-trust.d.ts.map +1 -0
  564. package/dist/core/extensions/runner-project-trust.js +27 -0
  565. package/dist/core/extensions/runner-project-trust.js.map +1 -0
  566. package/dist/core/extensions/runner-registries.d.ts +8 -0
  567. package/dist/core/extensions/runner-registries.d.ts.map +1 -0
  568. package/dist/core/extensions/runner-registries.js +76 -0
  569. package/dist/core/extensions/runner-registries.js.map +1 -0
  570. package/dist/core/extensions/runner-shortcuts.d.ts +10 -0
  571. package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -0
  572. package/dist/core/extensions/runner-shortcuts.js +71 -0
  573. package/dist/core/extensions/runner-shortcuts.js.map +1 -0
  574. package/dist/core/extensions/runner-ui.d.ts +3 -0
  575. package/dist/core/extensions/runner-ui.d.ts.map +1 -0
  576. package/dist/core/extensions/runner-ui.js +50 -0
  577. package/dist/core/extensions/runner-ui.js.map +1 -0
  578. package/dist/core/extensions/runner.d.ts +7 -74
  579. package/dist/core/extensions/runner.d.ts.map +1 -1
  580. package/dist/core/extensions/runner.js +67 -673
  581. package/dist/core/extensions/runner.js.map +1 -1
  582. package/dist/core/extensions/runtime-types.d.ts +179 -0
  583. package/dist/core/extensions/runtime-types.d.ts.map +1 -0
  584. package/dist/core/extensions/runtime-types.js +2 -0
  585. package/dist/core/extensions/runtime-types.js.map +1 -0
  586. package/dist/core/extensions/session-events.d.ts +89 -0
  587. package/dist/core/extensions/session-events.d.ts.map +1 -0
  588. package/dist/core/extensions/session-events.js +2 -0
  589. package/dist/core/extensions/session-events.js.map +1 -0
  590. package/dist/core/extensions/tool-events.d.ts +127 -0
  591. package/dist/core/extensions/tool-events.d.ts.map +1 -0
  592. package/dist/core/extensions/tool-events.js +26 -0
  593. package/dist/core/extensions/tool-events.js.map +1 -0
  594. package/dist/core/extensions/tool-types.d.ts +100 -0
  595. package/dist/core/extensions/tool-types.d.ts.map +1 -0
  596. package/dist/core/extensions/tool-types.js +11 -0
  597. package/dist/core/extensions/tool-types.js.map +1 -0
  598. package/dist/core/extensions/types.d.ts +20 -1288
  599. package/dist/core/extensions/types.d.ts.map +1 -1
  600. package/dist/core/extensions/types.js +4 -34
  601. package/dist/core/extensions/types.js.map +1 -1
  602. package/dist/core/extensions/ui-types.d.ts +200 -0
  603. package/dist/core/extensions/ui-types.d.ts.map +1 -0
  604. package/dist/core/extensions/ui-types.js +2 -0
  605. package/dist/core/extensions/ui-types.js.map +1 -0
  606. package/dist/core/model-registry-auth.d.ts +7 -0
  607. package/dist/core/model-registry-auth.d.ts.map +1 -0
  608. package/dist/core/model-registry-auth.js +64 -0
  609. package/dist/core/model-registry-auth.js.map +1 -0
  610. package/dist/core/model-registry-builtins.d.ts +9 -0
  611. package/dist/core/model-registry-builtins.d.ts.map +1 -0
  612. package/dist/core/model-registry-builtins.js +120 -0
  613. package/dist/core/model-registry-builtins.js.map +1 -0
  614. package/dist/core/model-registry-custom-loader.d.ts +3 -0
  615. package/dist/core/model-registry-custom-loader.d.ts.map +1 -0
  616. package/dist/core/model-registry-custom-loader.js +213 -0
  617. package/dist/core/model-registry-custom-loader.js.map +1 -0
  618. package/dist/core/model-registry-dynamic.d.ts +6 -0
  619. package/dist/core/model-registry-dynamic.d.ts.map +1 -0
  620. package/dist/core/model-registry-dynamic.js +155 -0
  621. package/dist/core/model-registry-dynamic.js.map +1 -0
  622. package/dist/core/model-registry-loader.d.ts +4 -0
  623. package/dist/core/model-registry-loader.d.ts.map +1 -0
  624. package/dist/core/model-registry-loader.js +20 -0
  625. package/dist/core/model-registry-loader.js.map +1 -0
  626. package/dist/core/model-registry-schemas.d.ts +1084 -0
  627. package/dist/core/model-registry-schemas.d.ts.map +1 -0
  628. package/dist/core/model-registry-schemas.js +161 -0
  629. package/dist/core/model-registry-schemas.js.map +1 -0
  630. package/dist/core/model-registry-types.d.ts +74 -0
  631. package/dist/core/model-registry-types.d.ts.map +1 -0
  632. package/dist/core/model-registry-types.js +2 -0
  633. package/dist/core/model-registry-types.js.map +1 -0
  634. package/dist/core/model-registry.d.ts +3 -76
  635. package/dist/core/model-registry.d.ts.map +1 -1
  636. package/dist/core/model-registry.js +24 -733
  637. package/dist/core/model-registry.js.map +1 -1
  638. package/dist/core/model-resolver-cli.d.ts +19 -0
  639. package/dist/core/model-resolver-cli.d.ts.map +1 -0
  640. package/dist/core/model-resolver-cli.js +118 -0
  641. package/dist/core/model-resolver-cli.js.map +1 -0
  642. package/dist/core/model-resolver-defaults.d.ts +5 -0
  643. package/dist/core/model-resolver-defaults.d.ts.map +1 -0
  644. package/dist/core/model-resolver-defaults.js +47 -0
  645. package/dist/core/model-resolver-defaults.js.map +1 -0
  646. package/dist/core/model-resolver-initial.d.ts +31 -0
  647. package/dist/core/model-resolver-initial.d.ts.map +1 -0
  648. package/dist/core/model-resolver-initial.js +116 -0
  649. package/dist/core/model-resolver-initial.js.map +1 -0
  650. package/dist/core/model-resolver-patterns.d.ts +26 -0
  651. package/dist/core/model-resolver-patterns.d.ts.map +1 -0
  652. package/dist/core/model-resolver-patterns.js +139 -0
  653. package/dist/core/model-resolver-patterns.js.map +1 -0
  654. package/dist/core/model-resolver-scope.d.ts +15 -0
  655. package/dist/core/model-resolver-scope.d.ts.map +1 -0
  656. package/dist/core/model-resolver-scope.js +66 -0
  657. package/dist/core/model-resolver-scope.js.map +1 -0
  658. package/dist/core/model-resolver-types.d.ts +29 -0
  659. package/dist/core/model-resolver-types.d.ts.map +1 -0
  660. package/dist/core/model-resolver-types.js +2 -0
  661. package/dist/core/model-resolver-types.js.map +1 -0
  662. package/dist/core/model-resolver.d.ts +6 -107
  663. package/dist/core/model-resolver.d.ts.map +1 -1
  664. package/dist/core/model-resolver.js +5 -549
  665. package/dist/core/model-resolver.js.map +1 -1
  666. package/dist/core/package-manager-auto-resources.d.ts +5 -0
  667. package/dist/core/package-manager-auto-resources.d.ts.map +1 -0
  668. package/dist/core/package-manager-auto-resources.js +109 -0
  669. package/dist/core/package-manager-auto-resources.js.map +1 -0
  670. package/dist/core/package-manager-command.d.ts +11 -0
  671. package/dist/core/package-manager-command.d.ts.map +1 -0
  672. package/dist/core/package-manager-command.js +102 -0
  673. package/dist/core/package-manager-command.js.map +1 -0
  674. package/dist/core/package-manager-constants.d.ts +4 -0
  675. package/dist/core/package-manager-constants.d.ts.map +1 -0
  676. package/dist/core/package-manager-constants.js +4 -0
  677. package/dist/core/package-manager-constants.js.map +1 -0
  678. package/dist/core/package-manager-env.d.ts +4 -0
  679. package/dist/core/package-manager-env.d.ts.map +1 -0
  680. package/dist/core/package-manager-env.js +40 -0
  681. package/dist/core/package-manager-env.js.map +1 -0
  682. package/dist/core/package-manager-git.d.ts +10 -0
  683. package/dist/core/package-manager-git.d.ts.map +1 -0
  684. package/dist/core/package-manager-git.js +271 -0
  685. package/dist/core/package-manager-git.js.map +1 -0
  686. package/dist/core/package-manager-manifest.d.ts +7 -0
  687. package/dist/core/package-manager-manifest.d.ts.map +1 -0
  688. package/dist/core/package-manager-manifest.js +45 -0
  689. package/dist/core/package-manager-manifest.js.map +1 -0
  690. package/dist/core/package-manager-npm.d.ts +25 -0
  691. package/dist/core/package-manager-npm.d.ts.map +1 -0
  692. package/dist/core/package-manager-npm.js +252 -0
  693. package/dist/core/package-manager-npm.js.map +1 -0
  694. package/dist/core/package-manager-operations.d.ts +11 -0
  695. package/dist/core/package-manager-operations.d.ts.map +1 -0
  696. package/dist/core/package-manager-operations.js +196 -0
  697. package/dist/core/package-manager-operations.js.map +1 -0
  698. package/dist/core/package-manager-paths.d.ts +14 -0
  699. package/dist/core/package-manager-paths.d.ts.map +1 -0
  700. package/dist/core/package-manager-paths.js +61 -0
  701. package/dist/core/package-manager-paths.js.map +1 -0
  702. package/dist/core/package-manager-progress.d.ts +4 -0
  703. package/dist/core/package-manager-progress.d.ts.map +1 -0
  704. package/dist/core/package-manager-progress.js +16 -0
  705. package/dist/core/package-manager-progress.js.map +1 -0
  706. package/dist/core/package-manager-resolver.d.ts +5 -0
  707. package/dist/core/package-manager-resolver.d.ts.map +1 -0
  708. package/dist/core/package-manager-resolver.js +149 -0
  709. package/dist/core/package-manager-resolver.js.map +1 -0
  710. package/dist/core/package-manager-resource-accumulator.d.ts +6 -0
  711. package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -0
  712. package/dist/core/package-manager-resource-accumulator.js +67 -0
  713. package/dist/core/package-manager-resource-accumulator.js.map +1 -0
  714. package/dist/core/package-manager-resource-collector.d.ts +5 -0
  715. package/dist/core/package-manager-resource-collector.d.ts.map +1 -0
  716. package/dist/core/package-manager-resource-collector.js +148 -0
  717. package/dist/core/package-manager-resource-collector.js.map +1 -0
  718. package/dist/core/package-manager-resource-files.d.ts +14 -0
  719. package/dist/core/package-manager-resource-files.d.ts.map +1 -0
  720. package/dist/core/package-manager-resource-files.js +265 -0
  721. package/dist/core/package-manager-resource-files.js.map +1 -0
  722. package/dist/core/package-manager-resource-patterns.d.ts +12 -0
  723. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -0
  724. package/dist/core/package-manager-resource-patterns.js +136 -0
  725. package/dist/core/package-manager-resource-patterns.js.map +1 -0
  726. package/dist/core/package-manager-settings.d.ts +10 -0
  727. package/dist/core/package-manager-settings.d.ts.map +1 -0
  728. package/dist/core/package-manager-settings.js +91 -0
  729. package/dist/core/package-manager-settings.js.map +1 -0
  730. package/dist/core/package-manager-source.d.ts +21 -0
  731. package/dist/core/package-manager-source.d.ts.map +1 -0
  732. package/dist/core/package-manager-source.js +146 -0
  733. package/dist/core/package-manager-source.js.map +1 -0
  734. package/dist/core/package-manager-types.d.ts +169 -0
  735. package/dist/core/package-manager-types.d.ts.map +1 -0
  736. package/dist/core/package-manager-types.js +9 -0
  737. package/dist/core/package-manager-types.js.map +1 -0
  738. package/dist/core/package-manager.d.ts +9 -174
  739. package/dist/core/package-manager.d.ts.map +1 -1
  740. package/dist/core/package-manager.js +56 -2100
  741. package/dist/core/package-manager.js.map +1 -1
  742. package/dist/core/resource-loader-assets.d.ts +6 -0
  743. package/dist/core/resource-loader-assets.d.ts.map +1 -0
  744. package/dist/core/resource-loader-assets.js +209 -0
  745. package/dist/core/resource-loader-assets.js.map +1 -0
  746. package/dist/core/resource-loader-context-files.d.ts +10 -0
  747. package/dist/core/resource-loader-context-files.d.ts.map +1 -0
  748. package/dist/core/resource-loader-context-files.js +74 -0
  749. package/dist/core/resource-loader-context-files.js.map +1 -0
  750. package/dist/core/resource-loader-core.d.ts +82 -0
  751. package/dist/core/resource-loader-core.d.ts.map +1 -0
  752. package/dist/core/resource-loader-core.js +168 -0
  753. package/dist/core/resource-loader-core.js.map +1 -0
  754. package/dist/core/resource-loader-discovery.d.ts +4 -0
  755. package/dist/core/resource-loader-discovery.d.ts.map +1 -0
  756. package/dist/core/resource-loader-discovery.js +28 -0
  757. package/dist/core/resource-loader-discovery.js.map +1 -0
  758. package/dist/core/resource-loader-extensions.d.ts +13 -0
  759. package/dist/core/resource-loader-extensions.d.ts.map +1 -0
  760. package/dist/core/resource-loader-extensions.js +110 -0
  761. package/dist/core/resource-loader-extensions.js.map +1 -0
  762. package/dist/core/resource-loader-helpers.d.ts +4 -0
  763. package/dist/core/resource-loader-helpers.d.ts.map +1 -0
  764. package/dist/core/resource-loader-helpers.js +23 -0
  765. package/dist/core/resource-loader-helpers.js.map +1 -0
  766. package/dist/core/resource-loader-internals.d.ts +96 -0
  767. package/dist/core/resource-loader-internals.d.ts.map +1 -0
  768. package/dist/core/resource-loader-internals.js +4 -0
  769. package/dist/core/resource-loader-internals.js.map +1 -0
  770. package/dist/core/resource-loader-package-resources.d.ts +31 -0
  771. package/dist/core/resource-loader-package-resources.d.ts.map +1 -0
  772. package/dist/core/resource-loader-package-resources.js +112 -0
  773. package/dist/core/resource-loader-package-resources.js.map +1 -0
  774. package/dist/core/resource-loader-paths.d.ts +4 -0
  775. package/dist/core/resource-loader-paths.d.ts.map +1 -0
  776. package/dist/core/resource-loader-paths.js +22 -0
  777. package/dist/core/resource-loader-paths.js.map +1 -0
  778. package/dist/core/resource-loader-reload.d.ts +6 -0
  779. package/dist/core/resource-loader-reload.d.ts.map +1 -0
  780. package/dist/core/resource-loader-reload.js +226 -0
  781. package/dist/core/resource-loader-reload.js.map +1 -0
  782. package/dist/core/resource-loader-source-info.d.ts +9 -0
  783. package/dist/core/resource-loader-source-info.d.ts.map +1 -0
  784. package/dist/core/resource-loader-source-info.js +101 -0
  785. package/dist/core/resource-loader-source-info.js.map +1 -0
  786. package/dist/core/resource-loader-types.d.ts +130 -0
  787. package/dist/core/resource-loader-types.d.ts.map +1 -0
  788. package/dist/core/resource-loader-types.js +2 -0
  789. package/dist/core/resource-loader-types.js.map +1 -0
  790. package/dist/core/resource-loader.d.ts +3 -242
  791. package/dist/core/resource-loader.d.ts.map +1 -1
  792. package/dist/core/resource-loader.js +2 -976
  793. package/dist/core/resource-loader.js.map +1 -1
  794. package/dist/core/sdk-exports.d.ts +7 -0
  795. package/dist/core/sdk-exports.d.ts.map +1 -0
  796. package/dist/core/sdk-exports.js +5 -0
  797. package/dist/core/sdk-exports.js.map +1 -0
  798. package/dist/core/sdk-types.d.ts +86 -0
  799. package/dist/core/sdk-types.d.ts.map +1 -0
  800. package/dist/core/sdk-types.js +2 -0
  801. package/dist/core/sdk-types.js.map +1 -0
  802. package/dist/core/sdk.d.ts +3 -91
  803. package/dist/core/sdk.d.ts.map +1 -1
  804. package/dist/core/sdk.js +2 -6
  805. package/dist/core/sdk.js.map +1 -1
  806. package/dist/core/session-manager-archive.d.ts +27 -0
  807. package/dist/core/session-manager-archive.d.ts.map +1 -0
  808. package/dist/core/session-manager-archive.js +114 -0
  809. package/dist/core/session-manager-archive.js.map +1 -0
  810. package/dist/core/session-manager-core.d.ts +104 -0
  811. package/dist/core/session-manager-core.d.ts.map +1 -0
  812. package/dist/core/session-manager-core.js +346 -0
  813. package/dist/core/session-manager-core.js.map +1 -0
  814. package/dist/core/session-manager-entries.d.ts +38 -0
  815. package/dist/core/session-manager-entries.d.ts.map +1 -0
  816. package/dist/core/session-manager-entries.js +124 -0
  817. package/dist/core/session-manager-entries.js.map +1 -0
  818. package/dist/core/session-manager-history.d.ts +38 -0
  819. package/dist/core/session-manager-history.d.ts.map +1 -0
  820. package/dist/core/session-manager-history.js +378 -0
  821. package/dist/core/session-manager-history.js.map +1 -0
  822. package/dist/core/session-manager-list.d.ts +5 -0
  823. package/dist/core/session-manager-list.d.ts.map +1 -0
  824. package/dist/core/session-manager-list.js +196 -0
  825. package/dist/core/session-manager-list.js.map +1 -0
  826. package/dist/core/session-manager-migrations.d.ts +11 -0
  827. package/dist/core/session-manager-migrations.d.ts.map +1 -0
  828. package/dist/core/session-manager-migrations.js +80 -0
  829. package/dist/core/session-manager-migrations.js.map +1 -0
  830. package/dist/core/session-manager-paths.d.ts +7 -0
  831. package/dist/core/session-manager-paths.d.ts.map +1 -0
  832. package/dist/core/session-manager-paths.js +22 -0
  833. package/dist/core/session-manager-paths.js.map +1 -0
  834. package/dist/core/session-manager-storage.d.ts +15 -0
  835. package/dist/core/session-manager-storage.d.ts.map +1 -0
  836. package/dist/core/session-manager-storage.js +127 -0
  837. package/dist/core/session-manager-storage.js.map +1 -0
  838. package/dist/core/session-manager-types.d.ts +172 -0
  839. package/dist/core/session-manager-types.d.ts.map +1 -0
  840. package/dist/core/session-manager-types.js +2 -0
  841. package/dist/core/session-manager-types.js.map +1 -0
  842. package/dist/core/session-manager-validation.d.ts +7 -0
  843. package/dist/core/session-manager-validation.d.ts.map +1 -0
  844. package/dist/core/session-manager-validation.js +34 -0
  845. package/dist/core/session-manager-validation.js.map +1 -0
  846. package/dist/core/session-manager.d.ts +8 -390
  847. package/dist/core/session-manager.d.ts.map +1 -1
  848. package/dist/core/session-manager.js +7 -1418
  849. package/dist/core/session-manager.js.map +1 -1
  850. package/dist/core/settings-manager-basic-accessors.d.ts +65 -0
  851. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -0
  852. package/dist/core/settings-manager-basic-accessors.js +253 -0
  853. package/dist/core/settings-manager-basic-accessors.js.map +1 -0
  854. package/dist/core/settings-manager-core.d.ts +57 -0
  855. package/dist/core/settings-manager-core.d.ts.map +1 -0
  856. package/dist/core/settings-manager-core.js +387 -0
  857. package/dist/core/settings-manager-core.js.map +1 -0
  858. package/dist/core/settings-manager-internals.d.ts +13 -0
  859. package/dist/core/settings-manager-internals.d.ts.map +1 -0
  860. package/dist/core/settings-manager-internals.js +4 -0
  861. package/dist/core/settings-manager-internals.js.map +1 -0
  862. package/dist/core/settings-manager-resource-accessors.d.ts +43 -0
  863. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -0
  864. package/dist/core/settings-manager-resource-accessors.js +172 -0
  865. package/dist/core/settings-manager-resource-accessors.js.map +1 -0
  866. package/dist/core/settings-manager-ui-accessors.d.ts +44 -0
  867. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -0
  868. package/dist/core/settings-manager-ui-accessors.js +208 -0
  869. package/dist/core/settings-manager-ui-accessors.js.map +1 -0
  870. package/dist/core/settings-manager.d.ts +6 -321
  871. package/dist/core/settings-manager.d.ts.map +1 -1
  872. package/dist/core/settings-manager.js +5 -1060
  873. package/dist/core/settings-manager.js.map +1 -1
  874. package/dist/core/settings-merge.d.ts +4 -0
  875. package/dist/core/settings-merge.d.ts.map +1 -0
  876. package/dist/core/settings-merge.js +26 -0
  877. package/dist/core/settings-merge.js.map +1 -0
  878. package/dist/core/settings-storage.d.ts +20 -0
  879. package/dist/core/settings-storage.d.ts.map +1 -0
  880. package/dist/core/settings-storage.js +100 -0
  881. package/dist/core/settings-storage.js.map +1 -0
  882. package/dist/core/settings-types.d.ts +123 -0
  883. package/dist/core/settings-types.d.ts.map +1 -0
  884. package/dist/core/settings-types.js +2 -0
  885. package/dist/core/settings-types.js.map +1 -0
  886. package/dist/core/system-prompt.d.ts.map +1 -1
  887. package/dist/core/system-prompt.js +7 -0
  888. package/dist/core/system-prompt.js.map +1 -1
  889. package/dist/core/tools/bash-policy-compile.d.ts +5 -0
  890. package/dist/core/tools/bash-policy-compile.d.ts.map +1 -0
  891. package/dist/core/tools/bash-policy-compile.js +241 -0
  892. package/dist/core/tools/bash-policy-compile.js.map +1 -0
  893. package/dist/core/tools/bash-policy-evaluate.d.ts +3 -0
  894. package/dist/core/tools/bash-policy-evaluate.d.ts.map +1 -0
  895. package/dist/core/tools/bash-policy-evaluate.js +92 -0
  896. package/dist/core/tools/bash-policy-evaluate.js.map +1 -0
  897. package/dist/core/tools/bash-policy-format.d.ts +5 -0
  898. package/dist/core/tools/bash-policy-format.d.ts.map +1 -0
  899. package/dist/core/tools/bash-policy-format.js +49 -0
  900. package/dist/core/tools/bash-policy-format.js.map +1 -0
  901. package/dist/core/tools/bash-policy-parser.d.ts +4 -0
  902. package/dist/core/tools/bash-policy-parser.d.ts.map +1 -0
  903. package/dist/core/tools/bash-policy-parser.js +155 -0
  904. package/dist/core/tools/bash-policy-parser.js.map +1 -0
  905. package/dist/core/tools/bash-policy-segment.d.ts +3 -0
  906. package/dist/core/tools/bash-policy-segment.d.ts.map +1 -0
  907. package/dist/core/tools/bash-policy-segment.js +275 -0
  908. package/dist/core/tools/bash-policy-segment.js.map +1 -0
  909. package/dist/core/tools/bash-policy-shell.d.ts +11 -0
  910. package/dist/core/tools/bash-policy-shell.d.ts.map +1 -0
  911. package/dist/core/tools/bash-policy-shell.js +267 -0
  912. package/dist/core/tools/bash-policy-shell.js.map +1 -0
  913. package/dist/core/tools/bash-policy-types.d.ts +146 -0
  914. package/dist/core/tools/bash-policy-types.d.ts.map +1 -0
  915. package/dist/core/tools/bash-policy-types.js +2 -0
  916. package/dist/core/tools/bash-policy-types.js.map +1 -0
  917. package/dist/core/tools/bash-policy.d.ts +5 -61
  918. package/dist/core/tools/bash-policy.d.ts.map +1 -1
  919. package/dist/core/tools/bash-policy.js +4 -1068
  920. package/dist/core/tools/bash-policy.js.map +1 -1
  921. package/dist/core/tools/todos-execute.d.ts +5 -0
  922. package/dist/core/tools/todos-execute.d.ts.map +1 -0
  923. package/dist/core/tools/todos-execute.js +200 -0
  924. package/dist/core/tools/todos-execute.js.map +1 -0
  925. package/dist/core/tools/todos-locks.d.ts +4 -0
  926. package/dist/core/tools/todos-locks.d.ts.map +1 -0
  927. package/dist/core/tools/todos-locks.js +80 -0
  928. package/dist/core/tools/todos-locks.js.map +1 -0
  929. package/dist/core/tools/todos-model.d.ts +21 -0
  930. package/dist/core/tools/todos-model.d.ts.map +1 -0
  931. package/dist/core/tools/todos-model.js +71 -0
  932. package/dist/core/tools/todos-model.js.map +1 -0
  933. package/dist/core/tools/todos-mutations.d.ts +6 -0
  934. package/dist/core/tools/todos-mutations.d.ts.map +1 -0
  935. package/dist/core/tools/todos-mutations.js +85 -0
  936. package/dist/core/tools/todos-mutations.js.map +1 -0
  937. package/dist/core/tools/todos-paths.d.ts +5 -0
  938. package/dist/core/tools/todos-paths.d.ts.map +1 -0
  939. package/dist/core/tools/todos-paths.js +25 -0
  940. package/dist/core/tools/todos-paths.js.map +1 -0
  941. package/dist/core/tools/todos-render.d.ts +10 -0
  942. package/dist/core/tools/todos-render.d.ts.map +1 -0
  943. package/dist/core/tools/todos-render.js +159 -0
  944. package/dist/core/tools/todos-render.js.map +1 -0
  945. package/dist/core/tools/todos-storage.d.ts +9 -0
  946. package/dist/core/tools/todos-storage.d.ts.map +1 -0
  947. package/dist/core/tools/todos-storage.js +183 -0
  948. package/dist/core/tools/todos-storage.js.map +1 -0
  949. package/dist/core/tools/todos-types.d.ts +46 -0
  950. package/dist/core/tools/todos-types.d.ts.map +1 -0
  951. package/dist/core/tools/todos-types.js +27 -0
  952. package/dist/core/tools/todos-types.js.map +1 -0
  953. package/dist/core/tools/todos.d.ts +12 -32
  954. package/dist/core/tools/todos.d.ts.map +1 -1
  955. package/dist/core/tools/todos.js +7 -893
  956. package/dist/core/tools/todos.js.map +1 -1
  957. package/dist/index-extensions.d.ts +3 -0
  958. package/dist/index-extensions.d.ts.map +1 -0
  959. package/dist/index-extensions.js +2 -0
  960. package/dist/index-extensions.js.map +1 -0
  961. package/dist/index.d.ts +1 -2
  962. package/dist/index.d.ts.map +1 -1
  963. package/dist/index.js +1 -1
  964. package/dist/index.js.map +1 -1
  965. package/dist/main-app-mode.d.ts +15 -0
  966. package/dist/main-app-mode.d.ts.map +1 -0
  967. package/dist/main-app-mode.js +51 -0
  968. package/dist/main-app-mode.js.map +1 -0
  969. package/dist/main-session-options.d.ts +12 -0
  970. package/dist/main-session-options.d.ts.map +1 -0
  971. package/dist/main-session-options.js +87 -0
  972. package/dist/main-session-options.js.map +1 -0
  973. package/dist/main-session.d.ts +9 -0
  974. package/dist/main-session.d.ts.map +1 -0
  975. package/dist/main-session.js +188 -0
  976. package/dist/main-session.js.map +1 -0
  977. package/dist/main-stdio.d.ts +12 -0
  978. package/dist/main-stdio.d.ts.map +1 -0
  979. package/dist/main-stdio.js +68 -0
  980. package/dist/main-stdio.js.map +1 -0
  981. package/dist/main.d.ts +2 -3
  982. package/dist/main.d.ts.map +1 -1
  983. package/dist/main.js +11 -388
  984. package/dist/main.js.map +1 -1
  985. package/dist/migrations-config-values.d.ts +9 -0
  986. package/dist/migrations-config-values.d.ts.map +1 -0
  987. package/dist/migrations-config-values.js +298 -0
  988. package/dist/migrations-config-values.js.map +1 -0
  989. package/dist/migrations.d.ts.map +1 -1
  990. package/dist/migrations.js +2 -296
  991. package/dist/migrations.js.map +1 -1
  992. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  993. package/dist/modes/interactive/components/chat-message-renderer.js +0 -7
  994. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  995. package/dist/modes/interactive/components/chat-session-host-actions.d.ts +9 -0
  996. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -0
  997. package/dist/modes/interactive/components/chat-session-host-actions.js +244 -0
  998. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -0
  999. package/dist/modes/interactive/components/chat-session-host-editor.d.ts +18 -0
  1000. package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -0
  1001. package/dist/modes/interactive/components/chat-session-host-editor.js +165 -0
  1002. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -0
  1003. package/dist/modes/interactive/components/chat-session-host-events.d.ts +5 -0
  1004. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -0
  1005. package/dist/modes/interactive/components/chat-session-host-events.js +200 -0
  1006. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -0
  1007. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +13 -0
  1008. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -0
  1009. package/dist/modes/interactive/components/chat-session-host-rendering.js +185 -0
  1010. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -0
  1011. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +13 -0
  1012. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -0
  1013. package/dist/modes/interactive/components/chat-session-host-runtime.js +101 -0
  1014. package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -0
  1015. package/dist/modes/interactive/components/chat-session-host-state.d.ts +53 -0
  1016. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -0
  1017. package/dist/modes/interactive/components/chat-session-host-state.js +42 -0
  1018. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -0
  1019. package/dist/modes/interactive/components/chat-session-host-types.d.ts +63 -0
  1020. package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -0
  1021. package/dist/modes/interactive/components/chat-session-host-types.js +2 -0
  1022. package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -0
  1023. package/dist/modes/interactive/components/chat-session-host-utils.d.ts +28 -0
  1024. package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -0
  1025. package/dist/modes/interactive/components/chat-session-host-utils.js +103 -0
  1026. package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -0
  1027. package/dist/modes/interactive/components/chat-session-host.d.ts +6 -129
  1028. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  1029. package/dist/modes/interactive/components/chat-session-host.js +50 -1022
  1030. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  1031. package/dist/modes/interactive/components/config-selector-list.d.ts +65 -0
  1032. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -0
  1033. package/dist/modes/interactive/components/config-selector-list.js +458 -0
  1034. package/dist/modes/interactive/components/config-selector-list.js.map +1 -0
  1035. package/dist/modes/interactive/components/config-selector.d.ts +3 -58
  1036. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1037. package/dist/modes/interactive/components/config-selector.js +2 -457
  1038. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1039. package/dist/modes/interactive/components/session-selector-delete.d.ts +10 -0
  1040. package/dist/modes/interactive/components/session-selector-delete.d.ts.map +1 -0
  1041. package/dist/modes/interactive/components/session-selector-delete.js +40 -0
  1042. package/dist/modes/interactive/components/session-selector-delete.js.map +1 -0
  1043. package/dist/modes/interactive/components/session-selector-header.d.ts +33 -0
  1044. package/dist/modes/interactive/components/session-selector-header.d.ts.map +1 -0
  1045. package/dist/modes/interactive/components/session-selector-header.js +117 -0
  1046. package/dist/modes/interactive/components/session-selector-header.js.map +1 -0
  1047. package/dist/modes/interactive/components/session-selector-list.d.ts +49 -0
  1048. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -0
  1049. package/dist/modes/interactive/components/session-selector-list.js +307 -0
  1050. package/dist/modes/interactive/components/session-selector-list.js.map +1 -0
  1051. package/dist/modes/interactive/components/session-selector-tree.d.ts +25 -0
  1052. package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -0
  1053. package/dist/modes/interactive/components/session-selector-tree.js +53 -0
  1054. package/dist/modes/interactive/components/session-selector-tree.js.map +1 -0
  1055. package/dist/modes/interactive/components/session-selector-types.d.ts +4 -0
  1056. package/dist/modes/interactive/components/session-selector-types.d.ts.map +1 -0
  1057. package/dist/modes/interactive/components/session-selector-types.js +2 -0
  1058. package/dist/modes/interactive/components/session-selector-types.js.map +1 -0
  1059. package/dist/modes/interactive/components/session-selector-utils.d.ts +4 -0
  1060. package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -0
  1061. package/dist/modes/interactive/components/session-selector-utils.js +37 -0
  1062. package/dist/modes/interactive/components/session-selector-utils.js.map +1 -0
  1063. package/dist/modes/interactive/components/session-selector.d.ts +3 -49
  1064. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1065. package/dist/modes/interactive/components/session-selector.js +5 -542
  1066. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1067. package/dist/modes/interactive/components/settings-selector-handlers.d.ts +3 -0
  1068. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -0
  1069. package/dist/modes/interactive/components/settings-selector-handlers.js +84 -0
  1070. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -0
  1071. package/dist/modes/interactive/components/settings-selector-items.d.ts +4 -0
  1072. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -0
  1073. package/dist/modes/interactive/components/settings-selector-items.js +211 -0
  1074. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -0
  1075. package/dist/modes/interactive/components/settings-selector-options.d.ts +6 -0
  1076. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -0
  1077. package/dist/modes/interactive/components/settings-selector-options.js +14 -0
  1078. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -0
  1079. package/dist/modes/interactive/components/settings-selector-submenus.d.ts +44 -0
  1080. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -0
  1081. package/dist/modes/interactive/components/settings-selector-submenus.js +228 -0
  1082. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -0
  1083. package/dist/modes/interactive/components/settings-selector-types.d.ts +67 -0
  1084. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -0
  1085. package/dist/modes/interactive/components/settings-selector-types.js +2 -0
  1086. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -0
  1087. package/dist/modes/interactive/components/settings-selector.d.ts +2 -63
  1088. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1089. package/dist/modes/interactive/components/settings-selector.js +5 -538
  1090. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1091. package/dist/modes/interactive/components/tree-selector-component.d.ts +21 -0
  1092. package/dist/modes/interactive/components/tree-selector-component.d.ts.map +1 -0
  1093. package/dist/modes/interactive/components/tree-selector-component.js +80 -0
  1094. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -0
  1095. package/dist/modes/interactive/components/tree-selector-content.d.ts +8 -0
  1096. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -0
  1097. package/dist/modes/interactive/components/tree-selector-content.js +263 -0
  1098. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -0
  1099. package/dist/modes/interactive/components/tree-selector-help.d.ts +16 -0
  1100. package/dist/modes/interactive/components/tree-selector-help.d.ts.map +1 -0
  1101. package/dist/modes/interactive/components/tree-selector-help.js +103 -0
  1102. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -0
  1103. package/dist/modes/interactive/components/tree-selector-label-input.d.ts +16 -0
  1104. package/dist/modes/interactive/components/tree-selector-label-input.d.ts.map +1 -0
  1105. package/dist/modes/interactive/components/tree-selector-label-input.js +46 -0
  1106. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -0
  1107. package/dist/modes/interactive/components/tree-selector-list.d.ts +33 -0
  1108. package/dist/modes/interactive/components/tree-selector-list.d.ts.map +1 -0
  1109. package/dist/modes/interactive/components/tree-selector-list.js +336 -0
  1110. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -0
  1111. package/dist/modes/interactive/components/tree-selector-model.d.ts +7 -0
  1112. package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -0
  1113. package/dist/modes/interactive/components/tree-selector-model.js +358 -0
  1114. package/dist/modes/interactive/components/tree-selector-model.js.map +1 -0
  1115. package/dist/modes/interactive/components/tree-selector-types.d.ts +57 -0
  1116. package/dist/modes/interactive/components/tree-selector-types.d.ts.map +1 -0
  1117. package/dist/modes/interactive/components/tree-selector-types.js +6 -0
  1118. package/dist/modes/interactive/components/tree-selector-types.js.map +1 -0
  1119. package/dist/modes/interactive/components/tree-selector-viewport.d.ts +10 -0
  1120. package/dist/modes/interactive/components/tree-selector-viewport.d.ts.map +1 -0
  1121. package/dist/modes/interactive/components/tree-selector-viewport.js +32 -0
  1122. package/dist/modes/interactive/components/tree-selector-viewport.js.map +1 -0
  1123. package/dist/modes/interactive/components/tree-selector.d.ts +2 -88
  1124. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  1125. package/dist/modes/interactive/components/tree-selector.js +1 -1200
  1126. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  1127. package/dist/modes/interactive/interactive-agent-events.d.ts +2 -0
  1128. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -0
  1129. package/dist/modes/interactive/interactive-agent-events.js +370 -0
  1130. package/dist/modes/interactive/interactive-agent-events.js.map +1 -0
  1131. package/dist/modes/interactive/interactive-auth-login.d.ts +2 -0
  1132. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -0
  1133. package/dist/modes/interactive/interactive-auth-login.js +214 -0
  1134. package/dist/modes/interactive/interactive-auth-login.js.map +1 -0
  1135. package/dist/modes/interactive/interactive-auth-routing.d.ts +2 -0
  1136. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -0
  1137. package/dist/modes/interactive/interactive-auth-routing.js +128 -0
  1138. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -0
  1139. package/dist/modes/interactive/interactive-autocomplete.d.ts +2 -0
  1140. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -0
  1141. package/dist/modes/interactive/interactive-autocomplete.js +140 -0
  1142. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -0
  1143. package/dist/modes/interactive/interactive-bash-compact.d.ts +2 -0
  1144. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -0
  1145. package/dist/modes/interactive/interactive-bash-compact.js +112 -0
  1146. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -0
  1147. package/dist/modes/interactive/interactive-editor-actions.d.ts +2 -0
  1148. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -0
  1149. package/dist/modes/interactive/interactive-editor-actions.js +131 -0
  1150. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -0
  1151. package/dist/modes/interactive/interactive-extension-context.d.ts +2 -0
  1152. package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -0
  1153. package/dist/modes/interactive/interactive-extension-context.js +159 -0
  1154. package/dist/modes/interactive/interactive-extension-context.js.map +1 -0
  1155. package/dist/modes/interactive/interactive-extension-custom-ui.d.ts +2 -0
  1156. package/dist/modes/interactive/interactive-extension-custom-ui.d.ts.map +1 -0
  1157. package/dist/modes/interactive/interactive-extension-custom-ui.js +208 -0
  1158. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -0
  1159. package/dist/modes/interactive/interactive-extension-dialogs.d.ts +2 -0
  1160. package/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -0
  1161. package/dist/modes/interactive/interactive-extension-dialogs.js +162 -0
  1162. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -0
  1163. package/dist/modes/interactive/interactive-extension-runtime.d.ts +2 -0
  1164. package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -0
  1165. package/dist/modes/interactive/interactive-extension-runtime.js +179 -0
  1166. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -0
  1167. package/dist/modes/interactive/interactive-extension-widgets.d.ts +2 -0
  1168. package/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -0
  1169. package/dist/modes/interactive/interactive-extension-widgets.js +113 -0
  1170. package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -0
  1171. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts +2 -0
  1172. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -0
  1173. package/dist/modes/interactive/interactive-hotkeys-debug.js +186 -0
  1174. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -0
  1175. package/dist/modes/interactive/interactive-input-handling.d.ts +2 -0
  1176. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -0
  1177. package/dist/modes/interactive/interactive-input-handling.js +275 -0
  1178. package/dist/modes/interactive/interactive-input-handling.js.map +1 -0
  1179. package/dist/modes/interactive/interactive-mode-base.d.ts +103 -0
  1180. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -0
  1181. package/dist/modes/interactive/interactive-mode-base.js +130 -0
  1182. package/dist/modes/interactive/interactive-mode-base.js.map +1 -0
  1183. package/dist/modes/interactive/interactive-mode-deps.d.ts +81 -0
  1184. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -0
  1185. package/dist/modes/interactive/interactive-mode-deps.js +74 -0
  1186. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -0
  1187. package/dist/modes/interactive/interactive-mode-helpers.d.ts +21 -0
  1188. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -0
  1189. package/dist/modes/interactive/interactive-mode-helpers.js +77 -0
  1190. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -0
  1191. package/dist/modes/interactive/interactive-mode-surface.d.ts +313 -0
  1192. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -0
  1193. package/dist/modes/interactive/interactive-mode-surface.js +2 -0
  1194. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -0
  1195. package/dist/modes/interactive/interactive-mode-types.d.ts +29 -0
  1196. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -0
  1197. package/dist/modes/interactive/interactive-mode-types.js +2 -0
  1198. package/dist/modes/interactive/interactive-mode-types.js.map +1 -0
  1199. package/dist/modes/interactive/interactive-mode.d.ts +30 -404
  1200. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1201. package/dist/modes/interactive/interactive-mode.js +29 -5260
  1202. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1203. package/dist/modes/interactive/interactive-model-routing.d.ts +2 -0
  1204. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -0
  1205. package/dist/modes/interactive/interactive-model-routing.js +269 -0
  1206. package/dist/modes/interactive/interactive-model-routing.js.map +1 -0
  1207. package/dist/modes/interactive/interactive-process-lifecycle.d.ts +2 -0
  1208. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -0
  1209. package/dist/modes/interactive/interactive-process-lifecycle.js +189 -0
  1210. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -0
  1211. package/dist/modes/interactive/interactive-queueing.d.ts +2 -0
  1212. package/dist/modes/interactive/interactive-queueing.d.ts.map +1 -0
  1213. package/dist/modes/interactive/interactive-queueing.js +163 -0
  1214. package/dist/modes/interactive/interactive-queueing.js.map +1 -0
  1215. package/dist/modes/interactive/interactive-render-chat.d.ts +2 -0
  1216. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -0
  1217. package/dist/modes/interactive/interactive-render-chat.js +170 -0
  1218. package/dist/modes/interactive/interactive-render-chat.js.map +1 -0
  1219. package/dist/modes/interactive/interactive-resource-disclosure.d.ts +2 -0
  1220. package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -0
  1221. package/dist/modes/interactive/interactive-resource-disclosure.js +101 -0
  1222. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -0
  1223. package/dist/modes/interactive/interactive-resource-paths.d.ts +2 -0
  1224. package/dist/modes/interactive/interactive-resource-paths.d.ts.map +1 -0
  1225. package/dist/modes/interactive/interactive-resource-paths.js +228 -0
  1226. package/dist/modes/interactive/interactive-resource-paths.js.map +1 -0
  1227. package/dist/modes/interactive/interactive-resource-rendering.d.ts +2 -0
  1228. package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -0
  1229. package/dist/modes/interactive/interactive-resource-rendering.js +181 -0
  1230. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -0
  1231. package/dist/modes/interactive/interactive-selectors.d.ts +2 -0
  1232. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -0
  1233. package/dist/modes/interactive/interactive-selectors.js +198 -0
  1234. package/dist/modes/interactive/interactive-selectors.js.map +1 -0
  1235. package/dist/modes/interactive/interactive-session-routing.d.ts +2 -0
  1236. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -0
  1237. package/dist/modes/interactive/interactive-session-routing.js +232 -0
  1238. package/dist/modes/interactive/interactive-session-routing.js.map +1 -0
  1239. package/dist/modes/interactive/interactive-session-runtime.d.ts +2 -0
  1240. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -0
  1241. package/dist/modes/interactive/interactive-session-runtime.js +131 -0
  1242. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -0
  1243. package/dist/modes/interactive/interactive-slash-commands.d.ts +2 -0
  1244. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -0
  1245. package/dist/modes/interactive/interactive-slash-commands.js +338 -0
  1246. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -0
  1247. package/dist/modes/interactive/interactive-startup.d.ts +2 -0
  1248. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -0
  1249. package/dist/modes/interactive/interactive-startup.js +348 -0
  1250. package/dist/modes/interactive/interactive-startup.js.map +1 -0
  1251. package/dist/modes/interactive/theme/color-utils.d.ts +20 -0
  1252. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -0
  1253. package/dist/modes/interactive/theme/color-utils.js +204 -0
  1254. package/dist/modes/interactive/theme/color-utils.js.map +1 -0
  1255. package/dist/modes/interactive/theme/export-colors.d.ts +19 -0
  1256. package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -0
  1257. package/dist/modes/interactive/theme/export-colors.js +69 -0
  1258. package/dist/modes/interactive/theme/export-colors.js.map +1 -0
  1259. package/dist/modes/interactive/theme/global-theme.d.ts +12 -0
  1260. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -0
  1261. package/dist/modes/interactive/theme/global-theme.js +150 -0
  1262. package/dist/modes/interactive/theme/global-theme.js.map +1 -0
  1263. package/dist/modes/interactive/theme/terminal-detection.d.ts +30 -0
  1264. package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -0
  1265. package/dist/modes/interactive/theme/terminal-detection.js +89 -0
  1266. package/dist/modes/interactive/theme/terminal-detection.js.map +1 -0
  1267. package/dist/modes/interactive/theme/theme-class.d.ts +30 -0
  1268. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -0
  1269. package/dist/modes/interactive/theme/theme-class.js +83 -0
  1270. package/dist/modes/interactive/theme/theme-class.js.map +1 -0
  1271. package/dist/modes/interactive/theme/theme-loading.d.ts +17 -0
  1272. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -0
  1273. package/dist/modes/interactive/theme/theme-loading.js +155 -0
  1274. package/dist/modes/interactive/theme/theme-loading.js.map +1 -0
  1275. package/dist/modes/interactive/theme/theme-parse.d.ts +5 -0
  1276. package/dist/modes/interactive/theme/theme-parse.d.ts.map +1 -0
  1277. package/dist/modes/interactive/theme/theme-parse.js +52 -0
  1278. package/dist/modes/interactive/theme/theme-parse.js.map +1 -0
  1279. package/dist/modes/interactive/theme/theme-schema.d.ts +255 -0
  1280. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  1281. package/dist/modes/interactive/theme/theme-schema.js +78 -0
  1282. package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  1283. package/dist/modes/interactive/theme/theme.d.ts +6 -108
  1284. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1285. package/dist/modes/interactive/theme/theme.js +6 -1065
  1286. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1287. package/dist/modes/interactive/theme/tui-theme.d.ts +15 -0
  1288. package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -0
  1289. package/dist/modes/interactive/theme/tui-theme.js +199 -0
  1290. package/dist/modes/interactive/theme/tui-theme.js.map +1 -0
  1291. package/dist/modes/rpc/rpc-client.d.ts +1 -61
  1292. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1293. package/dist/modes/rpc/rpc-client.js +1 -72
  1294. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1295. package/dist/modes/rpc/rpc-command-handler.d.ts +14 -0
  1296. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -0
  1297. package/dist/modes/rpc/rpc-command-handler.js +226 -0
  1298. package/dist/modes/rpc/rpc-command-handler.js.map +1 -0
  1299. package/dist/modes/rpc/rpc-extension-ui.d.ts +15 -0
  1300. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -0
  1301. package/dist/modes/rpc/rpc-extension-ui.js +196 -0
  1302. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -0
  1303. package/dist/modes/rpc/rpc-input.d.ts +12 -0
  1304. package/dist/modes/rpc/rpc-input.d.ts.map +1 -0
  1305. package/dist/modes/rpc/rpc-input.js +54 -0
  1306. package/dist/modes/rpc/rpc-input.js.map +1 -0
  1307. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1308. package/dist/modes/rpc/rpc-mode.js +43 -607
  1309. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1310. package/dist/modes/rpc/rpc-responses.d.ts +8 -0
  1311. package/dist/modes/rpc/rpc-responses.d.ts.map +1 -0
  1312. package/dist/modes/rpc/rpc-responses.js +27 -0
  1313. package/dist/modes/rpc/rpc-responses.js.map +1 -0
  1314. package/dist/modes/rpc/rpc-session-binding.d.ts +25 -0
  1315. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -0
  1316. package/dist/modes/rpc/rpc-session-binding.js +70 -0
  1317. package/dist/modes/rpc/rpc-session-binding.js.map +1 -0
  1318. package/dist/package-manager-cli-parser.d.ts +28 -0
  1319. package/dist/package-manager-cli-parser.d.ts.map +1 -0
  1320. package/dist/package-manager-cli-parser.js +269 -0
  1321. package/dist/package-manager-cli-parser.js.map +1 -0
  1322. package/dist/package-manager-cli.d.ts +0 -1
  1323. package/dist/package-manager-cli.d.ts.map +1 -1
  1324. package/dist/package-manager-cli.js +2 -267
  1325. package/dist/package-manager-cli.js.map +1 -1
  1326. package/dist/utils/git.d.ts.map +1 -1
  1327. package/dist/utils/git.js +10 -0
  1328. package/dist/utils/git.js.map +1 -1
  1329. package/dist/utils/version-check.d.ts +1 -0
  1330. package/dist/utils/version-check.d.ts.map +1 -1
  1331. package/dist/utils/version-check.js +17 -0
  1332. package/dist/utils/version-check.js.map +1 -1
  1333. package/docs/development.md +4 -0
  1334. package/docs/workflows.md +8 -6
  1335. package/examples/extensions/custom-provider-anthropic/index.ts +1 -106
  1336. package/examples/extensions/gondolin/index.ts +0 -23
  1337. package/examples/extensions/overlay-qa-animation-components.ts +255 -0
  1338. package/examples/extensions/overlay-qa-focus-components.ts +222 -0
  1339. package/examples/extensions/overlay-qa-position-components.ts +433 -0
  1340. package/examples/extensions/overlay-qa-shared.ts +37 -0
  1341. package/examples/extensions/overlay-qa-streaming-input-components.ts +205 -0
  1342. package/examples/extensions/overlay-qa-tests.ts +17 -1156
  1343. package/examples/extensions/overlay-qa-toggle-passive-components.ts +169 -0
  1344. package/examples/extensions/space-invaders.ts +0 -60
  1345. package/examples/extensions/subagent/display.ts +148 -0
  1346. package/examples/extensions/subagent/index.ts +11 -858
  1347. package/examples/extensions/subagent/render.ts +383 -0
  1348. package/examples/extensions/subagent/runner.ts +252 -0
  1349. package/examples/extensions/subagent/schemas.ts +59 -0
  1350. package/examples/extensions/subagent/types.ts +36 -0
  1351. package/examples/extensions/tic-tac-toe-instructions.ts +65 -0
  1352. package/examples/extensions/tic-tac-toe-rendering.ts +414 -0
  1353. package/examples/extensions/tic-tac-toe-state.ts +158 -0
  1354. package/examples/extensions/tic-tac-toe.ts +92 -754
  1355. package/examples/rpc-extension-ui-components.ts +189 -0
  1356. package/examples/rpc-extension-ui.ts +2 -179
  1357. package/package.json +4 -4
@@ -1,2232 +1,174 @@
1
- import { randomUUID } from "node:crypto";
2
- import * as fs from "node:fs";
3
- import * as path from "node:path";
4
- import { APP_NAME, getEnvValue, type ExtensionAPI, type ExtensionContext } from "@bastani/atomic";
5
- import { type AgentConfig, type AgentScope } from "../../agents/agents.ts";
6
- import { getArtifactsDir } from "../../shared/artifacts.ts";
7
- import { ChainClarifyComponent, type ChainClarifyResult } from "./chain-clarify.ts";
8
- import { toModelInfo, type ModelInfo } from "../../shared/model-info.ts";
9
- import { executeChain } from "./chain-execution.ts";
10
- import { resolveExecutionAgentScope } from "../../agents/agent-scope.ts";
1
+ import { type ExtensionContext } from "@bastani/atomic";
11
2
  import { handleManagementAction } from "../../agents/agent-management.ts";
12
3
  import { buildDoctorReport } from "../../extension/doctor.ts";
13
4
  import { clearPendingForegroundControlNotices } from "../../extension/control-notices.ts";
14
- import { runSync } from "./execution.ts";
15
- import { currentModelFullId, resolveModelCandidate } from "../shared/model-fallback.ts";
16
- import { SUBAGENT_INTERCOM_SESSION_NAME_ENV } from "../shared/pi-args.ts";
17
- import { aggregateParallelOutputs } from "../shared/parallel-utils.ts";
18
- import { recordRun } from "../shared/run-history.ts";
19
- import {
20
- buildChainInstructions,
21
- writeInitialProgressFile,
22
- getStepAgents,
23
- isParallelStep,
24
- isDynamicParallelStep,
25
- resolveStepBehavior,
26
- suppressProgressForReadOnlyTask,
27
- taskDisallowsFileUpdates,
28
- type ChainStep,
29
- type ResolvedStepBehavior,
30
- type SequentialStep,
31
- type StepOverrides,
32
- } from "../../shared/settings.ts";
33
- import { discoverAvailableSkills, normalizeSkillInput } from "../../agents/skills.ts";
34
- import { executeAsyncChain, executeAsyncSingle, formatAsyncStartedMessage, isAsyncAvailable } from "../background/async-execution.ts";
35
- import { createForkContextResolver } from "../../shared/fork-context.ts";
36
- import { resolveCurrentSessionId } from "../../shared/session-identity.ts";
37
- import { applyIntercomBridgeToAgent, INTERCOM_BRIDGE_MARKER, resolveIntercomBridge, resolveIntercomSessionTarget, resolveSubagentIntercomTarget, type IntercomBridgeState } from "../../intercom/intercom-bridge.ts";
38
- import { formatControlIntercomMessage, formatControlNoticeMessage, resolveControlConfig, shouldNotifyControlEvent } from "../shared/subagent-control.ts";
39
- import { finalizeSingleOutput, injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.ts";
40
- import { compactForegroundDetails, getSingleResultOutput, mapConcurrent, readStatus, resolveChildCwd } from "../../shared/utils.ts";
41
- import {
42
- attachNestedChildrenToResultChildren,
43
- buildSubagentResultIntercomPayload,
44
- deliverSubagentIntercomMessageEvent,
45
- deliverSubagentResultIntercomEvent,
46
- formatSubagentResultReceipt,
47
- resolveSubagentResultStatus,
48
- stripDetailsOutputsForIntercomReceipt,
49
- } from "../../intercom/result-intercom.ts";
50
- import { buildRevivedAsyncTask, resolveAsyncResumeTarget } from "../background/async-resume.ts";
51
- import { createNestedRoute, readNestedControlResults, resolveInheritedNestedRouteFromEnv, resolveNestedAsyncDir, resolveNestedParentAddressFromEnv, updateForegroundNestedProjection, writeNestedControlRequest, writeNestedEvent, type NestedRunResolutionScope } from "../shared/nested-events.ts";
52
- import { resolveSubagentRunId, type ResolvedSubagentRunId } from "../background/run-id-resolver.ts";
53
- import { formatNestedRunStatusLines } from "../shared/nested-render.ts";
5
+ import { resolveIntercomSessionTarget } from "../../intercom/intercom-bridge.ts";
6
+ import { SUBAGENT_ACTIONS, type SubagentToolResult } from "../../shared/types.ts";
54
7
  import { inspectSubagentStatus } from "../background/run-status.ts";
55
- import { applyForceTopLevelAsyncOverride } from "../background/top-level-async.ts";
8
+ import { resolveSubagentRunId, type ResolvedSubagentRunId } from "../background/run-id-resolver.ts";
9
+ import { runAsyncPath } from "./subagent-executor-async.ts";
10
+ import { runChainPath } from "./subagent-executor-chain.ts";
11
+ import { checkDepthForExecution, prepareExecutionContext } from "./subagent-executor-context.ts";
56
12
  import {
57
- cleanupWorktrees,
58
- createWorktrees,
59
- diffWorktrees,
60
- findWorktreeTaskCwdConflict,
61
- formatWorktreeDiffSummary,
62
- formatWorktreeTaskCwdConflict,
63
- type WorktreeSetup,
64
- } from "../shared/worktree.ts";
13
+ toExecutionErrorResult,
14
+ withForkContext,
15
+ } from "./subagent-executor-input.ts";
16
+ import { runParallelPath } from "./subagent-executor-parallel.ts";
65
17
  import {
66
- type AgentProgress,
67
- type ArtifactConfig,
68
- type ArtifactPaths,
69
- type ControlConfig,
70
- type ControlEvent,
71
- type Details,
72
- type ExtensionConfig,
73
- type IntercomEventBus,
74
- type MaxOutputConfig,
75
- type NestedRouteInfo,
76
- type NestedRunSummary,
77
- type ResolvedControlConfig,
78
- type SingleResult,
79
- type SubagentRunMode,
80
- type SubagentState,
81
- type SubagentToolResult,
82
- DEFAULT_ARTIFACT_CONFIG,
83
- SUBAGENT_ACTIONS,
84
- SUBAGENT_CONTROL_EVENT,
85
- SUBAGENT_CONTROL_INTERCOM_EVENT,
86
- checkSubagentDepth,
87
- isWorkflowStageOrchestrationContext,
88
- resolveTopLevelParallelConcurrency,
89
- resolveTopLevelParallelMaxTasks,
90
- resolveChildMaxSubagentDepth,
91
- resolveSubagentDepthPolicy,
92
- resolveWorkflowStageMaxSubagentDepth,
93
- subagentDepthBlockedMessage,
94
- wrapForkTask,
95
- } from "../../shared/types.ts";
18
+ interruptAsyncRun,
19
+ interruptNestedRun,
20
+ nestedResolutionScopeForExecutor,
21
+ resolveRequestedCwd,
22
+ resumeAsyncRun,
23
+ } from "./subagent-executor-resume.ts";
24
+ import { resolveSubagentExecutorRuntimeDeps } from "./subagent-executor-runtime.ts";
25
+ import { runSinglePath } from "./subagent-executor-single.ts";
26
+ import {
27
+ foregroundStatusResult,
28
+ getForegroundControl,
29
+ } from "./subagent-executor-status.ts";
30
+ import type {
31
+ ExecutorDeps,
32
+ ResolvedExecutorDeps,
33
+ SubagentParamsLike,
34
+ } from "./subagent-executor-types.ts";
96
35
 
97
- const ASYNC_INTERRUPT_SIGNAL: NodeJS.Signals = process.platform === "win32" ? "SIGBREAK" : "SIGUSR2";
98
36
  const MUTATING_MANAGEMENT_ACTIONS = new Set(["create", "update", "delete"]);
99
37
 
100
- interface TaskParam {
101
- agent: string;
102
- task: string;
103
- cwd?: string;
104
- count?: number;
105
- output?: string | boolean;
106
- outputMode?: "inline" | "file-only";
107
- reads?: string[] | boolean;
108
- progress?: boolean;
109
- model?: string;
110
- skill?: string | string[] | boolean;
111
- }
112
-
113
- export interface SubagentParamsLike {
114
- action?: (typeof SUBAGENT_ACTIONS)[number];
115
- id?: string;
116
- runId?: string;
117
- dir?: string;
118
- index?: number;
119
- agent?: string;
120
- task?: string;
121
- message?: string;
122
- chainName?: string;
123
- config?: unknown;
124
- chain?: ChainStep[];
125
- tasks?: TaskParam[];
126
- concurrency?: number;
127
- worktree?: boolean;
128
- context?: "fresh" | "fork";
129
- async?: boolean;
130
- clarify?: boolean;
131
- share?: boolean;
132
- control?: ControlConfig;
133
- sessionDir?: string;
134
- cwd?: string;
135
- maxOutput?: MaxOutputConfig;
136
- artifacts?: boolean;
137
- includeProgress?: boolean;
138
- model?: string;
139
- skill?: string | string[] | boolean;
140
- output?: string | boolean;
141
- outputMode?: "inline" | "file-only";
142
- agentScope?: string;
143
- chainDir?: string;
144
- }
145
-
146
- export interface SubagentExecutorRuntimeDeps {
147
- runSync: typeof runSync;
148
- executeAsyncChain: typeof executeAsyncChain;
149
- executeAsyncSingle: typeof executeAsyncSingle;
150
- isAsyncAvailable: typeof isAsyncAvailable;
151
- formatAsyncStartedMessage: typeof formatAsyncStartedMessage;
152
- }
153
-
154
- const defaultSubagentExecutorRuntimeDeps: SubagentExecutorRuntimeDeps = {
155
- runSync,
156
- executeAsyncChain,
157
- executeAsyncSingle,
158
- isAsyncAvailable,
159
- formatAsyncStartedMessage,
160
- };
161
-
162
- function resolveSubagentExecutorRuntimeDeps(
163
- overrides?: Partial<SubagentExecutorRuntimeDeps>,
164
- ): SubagentExecutorRuntimeDeps {
165
- return { ...defaultSubagentExecutorRuntimeDeps, ...overrides };
166
- }
167
-
168
- interface ExecutorDeps {
169
- pi: ExtensionAPI;
170
- state: SubagentState;
171
- config: ExtensionConfig;
172
- asyncByDefault: boolean;
173
- tempArtifactsDir: string;
174
- getSubagentSessionRoot: (parentSessionFile: string | null) => string;
175
- expandTilde: (p: string) => string;
176
- discoverAgents: (cwd: string, scope: AgentScope) => { agents: AgentConfig[] };
177
- allowMutatingManagementActions?: boolean;
178
- runtime?: Partial<SubagentExecutorRuntimeDeps>;
179
- }
180
-
181
- interface ResolvedExecutorDeps extends Omit<ExecutorDeps, "runtime"> {
182
- runtime: SubagentExecutorRuntimeDeps;
183
- }
184
-
185
- interface ExecutionContextData {
186
- params: SubagentParamsLike;
187
- effectiveCwd: string;
188
- ctx: ExtensionContext;
189
- signal: AbortSignal;
190
- onUpdate?: (r: SubagentToolResult) => void;
191
- agents: AgentConfig[];
192
- runId: string;
193
- shareEnabled: boolean;
194
- sessionRoot: string;
195
- sessionDirForIndex: (idx?: number) => string;
196
- sessionFileForIndex: (idx?: number) => string | undefined;
197
- artifactConfig: ArtifactConfig;
198
- artifactsDir: string;
199
- backgroundRequestedWhileClarifying: boolean;
200
- effectiveAsync: boolean;
201
- controlConfig: ResolvedControlConfig;
202
- intercomBridge: IntercomBridgeState;
203
- nestedRoute?: NestedRouteInfo;
204
- }
205
-
206
- function resolveRequestedCwd(runtimeCwd: string, requestedCwd: string | undefined): string {
207
- return requestedCwd ? path.resolve(runtimeCwd, requestedCwd) : runtimeCwd;
208
- }
209
-
210
- function getForegroundControl(state: SubagentState, runId: string | undefined) {
211
- if (runId) return state.foregroundControls.get(runId);
212
- if (state.lastForegroundControlId) {
213
- const latest = state.foregroundControls.get(state.lastForegroundControlId);
214
- if (latest) return latest;
215
- }
216
- let newest: (SubagentState["foregroundControls"] extends Map<string, infer T> ? T : never) | undefined;
217
- for (const control of state.foregroundControls.values()) {
218
- if (!newest || control.updatedAt > newest.updatedAt) newest = control;
219
- }
220
- return newest;
221
- }
222
-
223
- function formatForegroundActivity(control: SubagentState["foregroundControls"] extends Map<string, infer T> ? T : never): string | undefined {
224
- const facts: string[] = [];
225
- if (control.currentTool && control.currentToolStartedAt) facts.push(`tool ${control.currentTool} for ${Math.floor(Math.max(0, Date.now() - control.currentToolStartedAt) / 1000)}s`);
226
- else if (control.currentTool) facts.push(`tool ${control.currentTool}`);
227
- if (control.currentPath) facts.push(`path ${control.currentPath}`);
228
- if (control.turnCount !== undefined) facts.push(`${control.turnCount} turns`);
229
- if (control.tokens !== undefined) facts.push(`${control.tokens} tokens`);
230
- if (control.toolCount !== undefined) facts.push(`${control.toolCount} tools`);
231
- if (!control.lastActivityAt) {
232
- if (control.currentActivityState === "needs_attention") return ["needs attention", ...facts].join(" | ");
233
- if (control.currentActivityState === "active_long_running") return ["active but long-running", ...facts].join(" | ");
234
- return facts.length ? facts.join(" | ") : undefined;
235
- }
236
- const seconds = Math.floor(Math.max(0, Date.now() - control.lastActivityAt) / 1000);
237
- if (control.currentActivityState === "needs_attention") return [`no activity for ${seconds}s`, ...facts].join(" | ");
238
- if (control.currentActivityState === "active_long_running") return [`active but long-running; last activity ${seconds}s ago`, ...facts].join(" | ");
239
- return [`active ${seconds}s ago`, ...facts].join(" | ");
240
- }
241
-
242
- function nestedResolutionScopeForExecutor(deps: ResolvedExecutorDeps): NestedRunResolutionScope | undefined {
243
- if (deps.allowMutatingManagementActions !== false) return undefined;
244
- const route = resolveInheritedNestedRouteFromEnv();
245
- const address = route ? resolveNestedParentAddressFromEnv() : undefined;
246
- return {
247
- routes: route ? [route] : [],
248
- ...(address ? { descendantOf: { parentRunId: address.parentRunId, ...(address.parentStepIndex !== undefined ? { parentStepIndex: address.parentStepIndex } : {}) } } : {}),
249
- };
250
- }
251
-
252
- function foregroundStatusResult(control: SubagentState["foregroundControls"] extends Map<string, infer T> ? T : never): SubagentToolResult {
253
- let nestedWarning: string | undefined;
254
- try {
255
- updateForegroundNestedProjection(control);
256
- } catch (error) {
257
- nestedWarning = `Nested status unavailable: ${error instanceof Error ? error.message : String(error)}`;
258
- }
259
- const activity = formatForegroundActivity(control);
260
- const lines = [
261
- `Run: ${control.runId}`,
262
- "State: running",
263
- `Mode: ${control.mode}`,
264
- control.currentAgent ? `Current: ${control.currentAgent}${control.currentIndex !== undefined ? ` step ${control.currentIndex + 1}` : ""}` : undefined,
265
- activity ? `Activity: ${activity}` : undefined,
266
- ].filter((line): line is string => Boolean(line));
267
- lines.push(...formatNestedRunStatusLines(control.nestedChildren, { indent: "", commandHints: true, maxLines: 20 }));
268
- if (nestedWarning) lines.push(`Warning: ${nestedWarning}`);
269
- return { content: [{ type: "text", text: lines.join("\n") }], details: { mode: "management", results: [] } };
270
- }
271
-
272
- function rememberForegroundRun(state: SubagentState, input: { runId: string; mode: "single" | "parallel" | "chain"; cwd: string; results: SingleResult[] }): void {
273
- state.foregroundRuns ??= new Map();
274
- state.foregroundRuns.set(input.runId, {
275
- runId: input.runId,
276
- mode: input.mode,
277
- cwd: input.cwd,
278
- updatedAt: Date.now(),
279
- children: input.results.map((result, index) => ({
280
- agent: result.agent,
281
- index,
282
- status: resolveSubagentResultStatus({ exitCode: result.exitCode, interrupted: result.interrupted, detached: result.detached }),
283
- ...(result.sessionFile ? { sessionFile: result.sessionFile } : {}),
284
- })),
285
- });
286
- while (state.foregroundRuns.size > 50) {
287
- const oldest = [...state.foregroundRuns.values()].sort((left, right) => left.updatedAt - right.updatedAt)[0];
288
- if (!oldest) break;
289
- state.foregroundRuns.delete(oldest.runId);
290
- }
291
- }
292
-
293
- function resolveForegroundResumeTarget(params: SubagentParamsLike, state: SubagentState): { runId: string; mode: "single" | "parallel" | "chain"; state: "complete"; agent: string; index: number; intercomTarget: string; cwd: string; sessionFile: string } | undefined {
294
- const requested = (params.id ?? params.runId)?.trim();
295
- if (!requested || !state.foregroundRuns?.size) return undefined;
296
- const direct = state.foregroundRuns.get(requested);
297
- const matches = direct ? [direct] : [...state.foregroundRuns.values()].filter((run) => run.runId.startsWith(requested));
298
- if (matches.length === 0) return undefined;
299
- if (matches.length > 1) throw new Error(`Ambiguous foreground run id prefix '${requested}' matched: ${matches.map((run) => run.runId).join(", ")}. Provide a longer id.`);
300
- const run = matches[0]!;
301
- if (run.children.length > 1 && params.index === undefined) throw new Error(`Foreground run '${run.runId}' has ${run.children.length} children. Provide index to choose one.`);
302
- const index = params.index ?? 0;
303
- if (!Number.isInteger(index)) throw new Error(`Foreground run '${run.runId}' index must be an integer.`);
304
- if (index < 0 || index >= run.children.length) throw new Error(`Foreground run '${run.runId}' has ${run.children.length} children. Index ${index} is out of range.`);
305
- const child = run.children[index]!;
306
- if (child.status === "detached") throw new Error(`Foreground run '${run.runId}' child ${index} is detached for intercom coordination and cannot be revived safely from the remembered foreground state. Reply to the supervisor request first; after the child exits, start a fresh follow-up if needed.`);
307
- if (!child.sessionFile) throw new Error(`Foreground run '${run.runId}' child ${index} does not have a persisted session file to resume from.`);
308
- if (path.extname(child.sessionFile) !== ".jsonl") throw new Error(`Foreground run '${run.runId}' child ${index} session file must be a .jsonl file: ${child.sessionFile}`);
309
- const sessionFile = path.resolve(child.sessionFile);
310
- if (!fs.existsSync(sessionFile)) throw new Error(`Foreground run '${run.runId}' child ${index} session file does not exist: ${child.sessionFile}`);
311
- return { runId: run.runId, mode: run.mode, state: "complete", agent: child.agent, index, intercomTarget: resolveSubagentIntercomTarget(run.runId, child.agent, index), cwd: run.cwd, sessionFile };
312
- }
313
-
314
- type AsyncResumeSourceTarget = ReturnType<typeof resolveAsyncResumeTarget> & { source: "async" };
315
- type ForegroundResumeSourceTarget = NonNullable<ReturnType<typeof resolveForegroundResumeTarget>> & { kind: "revive"; source: "foreground" };
316
- type NestedResumeSourceTarget = {
317
- kind: "revive";
318
- source: "nested";
319
- runId: string;
320
- state: "complete" | "failed" | "paused";
321
- agent: string;
322
- index: number;
323
- intercomTarget: string;
324
- cwd?: string;
325
- sessionFile: string;
326
- };
327
- type ResumeSourceTarget = AsyncResumeSourceTarget | ForegroundResumeSourceTarget | NestedResumeSourceTarget;
328
-
329
- function isAsyncRunNotFound(error: unknown): boolean {
330
- return error instanceof Error && error.message.startsWith("Async run not found.");
331
- }
332
-
333
- function isResumeAmbiguity(error: unknown): boolean {
334
- return error instanceof Error && /Ambiguous .*run id prefix/.test(error.message);
335
- }
336
-
337
- function resumeTargetExact(target: { runId: string } | undefined, requested: string): boolean {
338
- return target?.runId === requested;
339
- }
340
-
341
- function escapeRegExp(value: string): string {
342
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
343
- }
344
-
345
- function isExactResumeError(error: unknown, source: "async" | "foreground", requested: string): boolean {
346
- if (!(error instanceof Error) || !requested) return false;
347
- return new RegExp(`\\b${source} run '${escapeRegExp(requested)}'`, "i").test(error.message);
348
- }
349
-
350
- function resolveResumeTarget(params: SubagentParamsLike, state: SubagentState): ResumeSourceTarget {
351
- const requested = (params.id ?? params.runId)?.trim() ?? "";
352
- let foregroundTarget: ForegroundResumeSourceTarget | undefined;
353
- let foregroundError: unknown;
354
- let asyncTarget: AsyncResumeSourceTarget | undefined;
355
- let asyncError: unknown;
356
-
357
- try {
358
- const target = resolveForegroundResumeTarget(params, state);
359
- if (target) foregroundTarget = { kind: "revive", source: "foreground", ...target };
360
- } catch (error) {
361
- foregroundError = error;
362
- }
363
- try {
364
- asyncTarget = { source: "async", ...resolveAsyncResumeTarget(params) };
365
- } catch (error) {
366
- asyncError = error;
367
- }
368
-
369
- if (foregroundTarget && asyncTarget) {
370
- const foregroundExact = resumeTargetExact(foregroundTarget, requested);
371
- const asyncExact = resumeTargetExact(asyncTarget, requested);
372
- if (foregroundExact && !asyncExact) return foregroundTarget;
373
- if (asyncExact && !foregroundExact) return asyncTarget;
374
- throw new Error(`Resume id '${requested}' is ambiguous between foreground run '${foregroundTarget.runId}' and async run '${asyncTarget.runId}'. Provide a full run id.`);
375
- }
376
- if (foregroundTarget) {
377
- if (isExactResumeError(asyncError, "async", requested)) throw asyncError;
378
- if (isResumeAmbiguity(asyncError) && !resumeTargetExact(foregroundTarget, requested)) throw asyncError;
379
- return foregroundTarget;
380
- }
381
- if (asyncTarget) {
382
- if (isExactResumeError(foregroundError, "foreground", requested)) throw foregroundError;
383
- if (isResumeAmbiguity(foregroundError) && !resumeTargetExact(asyncTarget, requested)) throw foregroundError;
384
- return asyncTarget;
385
- }
386
- if (foregroundError && !isAsyncRunNotFound(asyncError)) throw foregroundError;
387
- if (foregroundError) throw foregroundError;
388
- if (asyncError) throw asyncError;
389
- throw new Error("Run not found. Provide id or runId.");
390
- }
391
-
392
- function getAsyncInterruptTarget(state: SubagentState, runId: string | undefined): { asyncId: string; asyncDir: string } | undefined {
393
- if (runId) {
394
- const direct = state.asyncJobs.get(runId);
395
- if (direct) return { asyncId: direct.asyncId, asyncDir: direct.asyncDir };
396
- }
397
- let newest: { asyncId: string; asyncDir: string; updatedAt: number } | undefined;
398
- for (const job of state.asyncJobs.values()) {
399
- if (job.status !== "running") continue;
400
- if (!newest || (job.updatedAt ?? 0) > newest.updatedAt) {
401
- newest = { asyncId: job.asyncId, asyncDir: job.asyncDir, updatedAt: job.updatedAt ?? 0 };
402
- }
403
- }
404
- return newest ? { asyncId: newest.asyncId, asyncDir: newest.asyncDir } : undefined;
405
- }
406
-
407
- function emitControlNotification(input: {
408
- pi: ExtensionAPI;
409
- controlConfig: ResolvedControlConfig;
410
- intercomBridge: IntercomBridgeState;
411
- event: ControlEvent;
412
- }): void {
413
- if (!shouldNotifyControlEvent(input.controlConfig, input.event)) return;
414
- const childIntercomTarget = input.intercomBridge.active
415
- ? resolveSubagentIntercomTarget(input.event.runId, input.event.agent, input.event.index)
416
- : undefined;
417
- const payload = {
418
- event: input.event,
419
- source: "foreground" as const,
420
- childIntercomTarget,
421
- noticeText: formatControlNoticeMessage(input.event, childIntercomTarget),
422
- };
423
- if (input.controlConfig.notifyChannels.includes("event")) {
424
- input.pi.events.emit(SUBAGENT_CONTROL_EVENT, payload);
425
- }
426
- if (input.event.type !== "active_long_running" && input.controlConfig.notifyChannels.includes("intercom") && input.intercomBridge.active && input.intercomBridge.orchestratorTarget) {
427
- input.pi.events.emit(SUBAGENT_CONTROL_INTERCOM_EVENT, {
428
- ...payload,
429
- to: input.intercomBridge.orchestratorTarget,
430
- message: formatControlIntercomMessage(input.event, childIntercomTarget),
431
- });
432
- }
433
- }
434
-
435
- function interruptAsyncRun(state: SubagentState, runId: string | undefined): SubagentToolResult | null {
436
- const target = getAsyncInterruptTarget(state, runId);
437
- if (!target) return null;
438
- const status = readStatus(target.asyncDir);
439
- if (!status || status.state !== "running" || typeof status.pid !== "number") {
440
- return {
441
- content: [{ type: "text", text: `No running async run with an interrupt-capable pid was found for '${runId ?? "current"}'.` }],
442
- isError: true,
443
- details: { mode: "management", results: [] },
444
- };
445
- }
446
- try {
447
- process.kill(status.pid, ASYNC_INTERRUPT_SIGNAL);
448
- const tracked = state.asyncJobs.get(target.asyncId);
449
- if (tracked) {
450
- tracked.activityState = undefined;
451
- tracked.updatedAt = Date.now();
452
- }
453
- return {
454
- content: [{ type: "text", text: `Interrupt requested for async run ${target.asyncId}.` }],
455
- details: { mode: "management", results: [] },
456
- };
457
- } catch (error) {
458
- const message = error instanceof Error ? error.message : String(error);
459
- return {
460
- content: [{ type: "text", text: `Failed to interrupt async run ${target.asyncId}: ${message}` }],
461
- isError: true,
462
- details: { mode: "management", results: [] },
463
- };
464
- }
465
- }
466
-
467
- function nestedRunSessionFile(run: NestedRunSummary): string | undefined {
468
- return run.sessionFile ?? (run.steps?.length === 1 ? run.steps[0]?.sessionFile : undefined);
469
- }
470
-
471
- function nestedRunAgent(run: NestedRunSummary): string | undefined {
472
- return run.agent ?? run.agents?.[0] ?? (run.steps?.length === 1 ? run.steps[0]?.agent : undefined);
473
- }
474
-
475
- function pathWithin(base: string, candidate: string): boolean {
476
- const resolvedBase = path.resolve(base);
477
- const resolvedCandidate = path.resolve(candidate);
478
- return resolvedCandidate === resolvedBase || resolvedCandidate.startsWith(`${resolvedBase}${path.sep}`);
479
- }
480
-
481
- function validateNestedSessionFile(run: NestedRunSummary, trustedSessionRoots: string[]): string {
482
- const sessionFile = nestedRunSessionFile(run);
483
- if (!sessionFile) throw new Error(`Nested run '${run.id}' does not have a persisted session file to resume from.`);
484
- if (path.extname(sessionFile) !== ".jsonl") throw new Error(`Nested run '${run.id}' session file must be a .jsonl file: ${sessionFile}`);
485
- const resolved = path.resolve(sessionFile);
486
- if (!path.isAbsolute(sessionFile)) throw new Error(`Nested run '${run.id}' session file must be absolute: ${sessionFile}`);
487
- if (!fs.existsSync(resolved)) throw new Error(`Nested run '${run.id}' session file does not exist: ${sessionFile}`);
488
- const stat = fs.lstatSync(resolved);
489
- if (!stat.isFile() || stat.isSymbolicLink()) throw new Error(`Nested run '${run.id}' session file is not a regular file: ${sessionFile}`);
490
- const realSessionFile = fs.realpathSync(resolved);
491
- const trustedRoots = trustedSessionRoots
492
- .filter((root) => fs.existsSync(root))
493
- .map((root) => fs.realpathSync(root));
494
- if (!trustedRoots.some((root) => pathWithin(root, realSessionFile))) {
495
- throw new Error(`Nested run '${run.id}' session file is outside trusted nested session roots: ${sessionFile}`);
496
- }
497
- if (!realSessionFile.split(path.sep).includes(run.id)) {
498
- throw new Error(`Nested run '${run.id}' session file is not under that nested run's session directory: ${sessionFile}`);
499
- }
500
- return realSessionFile;
501
- }
502
-
503
- function resolveNestedResumeTarget(match: ResolvedSubagentRunId & { kind: "nested" }, trustedSessionRoots: string[]): NestedResumeSourceTarget {
504
- const run = match.match.run;
505
- if (run.state === "running" || run.state === "queued") throw new Error(`Nested run '${run.id}' is live; route the follow-up to the owner process instead.`);
506
- const agent = nestedRunAgent(run);
507
- if (!agent) throw new Error(`Could not determine child agent for nested run '${run.id}'.`);
508
- const state = run.state === "complete" || run.state === "failed" || run.state === "paused" ? run.state : "failed";
509
- const asyncDir = resolveNestedAsyncDir(match.match.rootRunId, run);
510
- return {
511
- kind: "revive",
512
- source: "nested",
513
- runId: run.id,
514
- state,
515
- agent,
516
- index: 0,
517
- intercomTarget: resolveSubagentIntercomTarget(run.id, agent, 0),
518
- cwd: asyncDir ? path.dirname(asyncDir) : undefined,
519
- sessionFile: validateNestedSessionFile(run, trustedSessionRoots),
520
- };
521
- }
522
-
523
- async function waitForNestedControlResult(target: ResolvedSubagentRunId & { kind: "nested" }, requestId: string, timeoutMs = 1_000) {
524
- const deadline = Date.now() + timeoutMs;
525
- while (Date.now() < deadline) {
526
- const result = readNestedControlResults(target.match.route).find((candidate) => candidate.requestId === requestId && candidate.targetRunId === target.match.run.id);
527
- if (result) return result;
528
- await new Promise((resolve) => setTimeout(resolve, 50));
529
- }
530
- return undefined;
531
- }
532
-
533
- async function sendNestedControlRequest(target: ResolvedSubagentRunId & { kind: "nested" }, action: "interrupt" | "resume", message?: string) {
534
- const requestId = randomUUID();
535
- writeNestedControlRequest(target.match.route, {
536
- ts: Date.now(),
537
- requestId,
538
- targetRunId: target.match.run.id,
539
- action,
540
- ...(message ? { message } : {}),
541
- });
542
- return waitForNestedControlResult(target, requestId);
543
- }
544
-
545
- function directNestedAsyncInterrupt(target: ResolvedSubagentRunId & { kind: "nested" }): SubagentToolResult | undefined {
546
- const run = target.match.run;
547
- const asyncDir = resolveNestedAsyncDir(target.match.rootRunId, run);
548
- if (!asyncDir) return undefined;
549
- const status = readStatus(asyncDir);
550
- const pid = typeof status?.pid === "number" && status.pid > 0 ? status.pid : run.pid;
551
- if (!status || status.state !== "running" || typeof pid !== "number" || pid <= 0) return undefined;
552
- try {
553
- process.kill(pid, ASYNC_INTERRUPT_SIGNAL);
554
- return { content: [{ type: "text", text: `Interrupt requested for nested async run ${run.id}.` }], details: { mode: "management", results: [] } };
555
- } catch (error) {
556
- const message = error instanceof Error ? error.message : String(error);
557
- return { content: [{ type: "text", text: `Failed to interrupt nested async run ${run.id}: ${message}` }], isError: true, details: { mode: "management", results: [] } };
558
- }
559
- }
560
-
561
- async function interruptNestedRun(target: ResolvedSubagentRunId & { kind: "nested" }): Promise<SubagentToolResult> {
562
- const run = target.match.run;
563
- if (run.state === "complete") return { content: [{ type: "text", text: `Nested run ${run.id} is already complete and cannot be interrupted.` }], isError: true, details: { mode: "management", results: [] } };
564
- if (run.state === "failed") return { content: [{ type: "text", text: `Nested run ${run.id} has failed and cannot be interrupted.` }], isError: true, details: { mode: "management", results: [] } };
565
- if (run.state === "paused") return { content: [{ type: "text", text: `Nested run ${run.id} is already paused.` }], isError: true, details: { mode: "management", results: [] } };
566
- const result = await sendNestedControlRequest(target, "interrupt");
567
- if (result) return { content: [{ type: "text", text: result.message }], isError: result.ok ? undefined : true, details: { mode: "management", results: [] } };
568
- const direct = directNestedAsyncInterrupt(target);
569
- if (direct) return direct;
570
- return { content: [{ type: "text", text: `Nested run ${run.id} owner is not reachable and no safe direct async interrupt fallback is available.` }], isError: true, details: { mode: "management", results: [] } };
571
- }
572
-
573
- async function resumeLiveNestedRun(input: { target: ResolvedSubagentRunId & { kind: "nested" }; message: string }): Promise<SubagentToolResult> {
574
- const run = input.target.match.run;
575
- const result = await sendNestedControlRequest(input.target, "resume", input.message);
576
- if (result) return { content: [{ type: "text", text: result.message }], isError: result.ok ? undefined : true, details: { mode: "management", results: [] } };
577
- return { content: [{ type: "text", text: `Nested run ${run.id} appears live but its owner route is not reachable. Wait for completion, then retry action='resume'.` }], isError: true, details: { mode: "management", results: [] } };
578
- }
38
+ export type { SubagentParamsLike, SubagentExecutorRuntimeDeps } from "./subagent-executor-types.ts";
579
39
 
580
- async function resumeAsyncRun(input: {
40
+ async function handleManagementRequest(input: {
581
41
  params: SubagentParamsLike;
42
+ paramsWithResolvedCwd: SubagentParamsLike;
582
43
  requestCwd: string;
583
44
  ctx: ExtensionContext;
584
45
  deps: ResolvedExecutorDeps;
585
46
  }): Promise<SubagentToolResult> {
586
- const followUp = (input.params.message ?? input.params.task ?? "").trim();
587
- if (!followUp) {
588
- return {
589
- content: [{ type: "text", text: "action='resume' requires message." }],
590
- isError: true,
591
- details: { mode: "management", results: [] },
592
- };
593
- }
594
-
595
- let target: ResumeSourceTarget;
596
- const parentSessionFile = input.ctx.sessionManager.getSessionFile() ?? null;
597
- try {
598
- const requestedId = input.params.id ?? input.params.runId;
599
- const resolved = requestedId ? resolveSubagentRunId(requestedId, { state: input.deps.state, nested: nestedResolutionScopeForExecutor(input.deps) }) : undefined;
600
- if (resolved?.kind === "nested") {
601
- if (resolved.match.run.state === "running" || resolved.match.run.state === "queued") {
602
- return resumeLiveNestedRun({ target: resolved, message: followUp });
603
- }
604
- const trustedSessionRoots = [
605
- ...(input.deps.config.defaultSessionDir ? [path.resolve(input.deps.expandTilde(input.deps.config.defaultSessionDir))] : []),
606
- ...(parentSessionFile ? [input.deps.getSubagentSessionRoot(parentSessionFile)] : []),
607
- ];
608
- target = resolveNestedResumeTarget(resolved, trustedSessionRoots);
609
- } else {
610
- target = resolveResumeTarget(input.params, input.deps.state);
611
- }
612
- } catch (error) {
613
- const message = error instanceof Error ? error.message : String(error);
614
- return { content: [{ type: "text", text: message }], isError: true, details: { mode: "management", results: [] } };
615
- }
616
-
617
- if (target.kind === "live") {
618
- const delivered = await deliverSubagentIntercomMessageEvent(
619
- input.deps.pi.events,
620
- target.intercomTarget,
621
- `Follow-up for async run ${target.runId} (${target.agent}):\n\n${followUp}`,
622
- 500,
623
- { source: "async-resume", runId: target.runId, agent: target.agent, index: target.index },
624
- );
625
- if (delivered) {
626
- return {
627
- content: [{ type: "text", text: [`Delivered follow-up to live async child.`, `Run: ${target.runId}`, `Intercom target: ${target.intercomTarget}`].join("\n") }],
628
- details: { mode: "management", results: [] },
629
- };
47
+ const { params, paramsWithResolvedCwd, requestCwd, ctx, deps } = input;
48
+ const action = params.action;
49
+ if (!action) {
50
+ return { content: [{ type: "text", text: "Missing action." }], isError: true, details: { mode: "management", results: [] } };
51
+ }
52
+ if (action === "doctor") {
53
+ let currentSessionFile: string | null = null;
54
+ let currentSessionId = deps.state.currentSessionId;
55
+ let sessionError: string | undefined;
56
+ try {
57
+ currentSessionFile = ctx.sessionManager.getSessionFile() ?? null;
58
+ currentSessionId = ctx.sessionManager.getSessionId();
59
+ } catch (error) {
60
+ sessionError = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
630
61
  }
631
- return {
632
- content: [{ type: "text", text: [`Async child appears live but its intercom target is not registered.`, `Run: ${target.runId}`, `Intercom target: ${target.intercomTarget}`, `Wait for completion, then retry action='resume'.`].join("\n") }],
633
- isError: true,
634
- details: { mode: "management", results: [] },
635
- };
636
- }
637
-
638
- const resumeDepthPolicy = resolveSubagentDepthPolicy(input.ctx, input.deps.config.maxSubagentDepth);
639
- const { blocked, depth, maxDepth, workflowStageGuard } = checkSubagentDepth(resumeDepthPolicy.maxSubagentDepth);
640
- if (blocked) {
62
+ let orchestratorTarget: string | undefined;
63
+ try {
64
+ orchestratorTarget = resolveIntercomSessionTarget(deps.pi.getSessionName(), ctx.sessionManager.getSessionId());
65
+ } catch {}
641
66
  return {
642
67
  content: [{
643
68
  type: "text",
644
- text: subagentDepthBlockedMessage(depth, maxDepth, {
645
- action: "resume",
646
- workflowStageGuard: workflowStageGuard || resumeDepthPolicy.workflowStageSubagentGuard,
69
+ text: buildDoctorReport({
70
+ cwd: requestCwd,
71
+ config: deps.config,
72
+ state: deps.state,
73
+ context: paramsWithResolvedCwd.context,
74
+ requestedSessionDir: paramsWithResolvedCwd.sessionDir,
75
+ currentSessionFile,
76
+ currentSessionId,
77
+ orchestratorTarget,
78
+ sessionError,
79
+ expandTilde: deps.expandTilde,
647
80
  }),
648
81
  }],
649
- isError: true,
650
- details: { mode: "management", results: [] },
651
- };
652
- }
653
-
654
- input.deps.state.currentSessionId = resolveCurrentSessionId(input.ctx.sessionManager);
655
- const effectiveCwd = target.cwd ?? input.requestCwd;
656
- const scope: AgentScope = resolveExecutionAgentScope(input.params.agentScope);
657
- const discoveredAgents = input.deps.discoverAgents(effectiveCwd, scope).agents;
658
- const sessionName = resolveIntercomSessionTarget(input.deps.pi.getSessionName(), input.ctx.sessionManager.getSessionId());
659
- const intercomBridge = resolveIntercomBridge({
660
- config: input.deps.config.intercomBridge,
661
- context: input.params.context,
662
- orchestratorTarget: sessionName,
663
- cwd: effectiveCwd,
664
- });
665
- const agents = intercomBridge.active
666
- ? discoveredAgents.map((agent) => applyIntercomBridgeToAgent(agent, intercomBridge))
667
- : discoveredAgents;
668
- const agentConfig = agents.find((agent) => agent.name === target.agent);
669
- if (!agentConfig) {
670
- return {
671
- content: [{ type: "text", text: `Unknown agent for resume: ${target.agent}` }],
672
- isError: true,
673
82
  details: { mode: "management", results: [] },
674
83
  };
675
84
  }
676
-
677
- const runId = randomUUID().slice(0, 8);
678
- const artifactConfig: ArtifactConfig = { ...DEFAULT_ARTIFACT_CONFIG, enabled: input.params.artifacts !== false };
679
- const availableModels = input.ctx.modelRegistry.getAvailable().map(toModelInfo);
680
- const result = input.deps.runtime.executeAsyncSingle(runId, {
681
- agent: target.agent,
682
- task: buildRevivedAsyncTask(target, followUp),
683
- agentConfig,
684
- ctx: {
685
- pi: input.deps.pi,
686
- cwd: input.requestCwd,
687
- currentSessionId: input.deps.state.currentSessionId,
688
- currentModelProvider: input.ctx.model?.provider,
689
- currentModel: currentModelFullId(input.ctx.model),
690
- },
691
- cwd: effectiveCwd,
692
- maxOutput: input.params.maxOutput,
693
- artifactsDir: input.deps.tempArtifactsDir,
694
- artifactConfig,
695
- shareEnabled: input.params.share === true,
696
- sessionRoot: input.deps.getSubagentSessionRoot(parentSessionFile),
697
- sessionFile: target.sessionFile,
698
- maxSubagentDepth: resolveWorkflowStageMaxSubagentDepth(input.ctx, input.deps.config.maxSubagentDepth),
699
- workflowStageSubagentGuard: isWorkflowStageOrchestrationContext(input.ctx),
700
- worktreeSetupHook: input.deps.config.worktreeSetupHook,
701
- worktreeSetupHookTimeoutMs: input.deps.config.worktreeSetupHookTimeoutMs,
702
- controlConfig: resolveControlConfig(input.deps.config.control, input.params.control),
703
- controlIntercomTarget: intercomBridge.active ? intercomBridge.orchestratorTarget : undefined,
704
- childIntercomTarget: intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(runId, agent, index) : undefined,
705
- availableModels,
706
- });
707
- if (result.isError) return result;
708
-
709
- const revivedId = result.details.asyncId ?? runId;
710
- const revivedTarget = intercomBridge.active ? resolveSubagentIntercomTarget(revivedId, target.agent, 0) : undefined;
711
- const sourceLabel = target.source;
712
- const lines = [
713
- `Revived ${sourceLabel} subagent from ${target.runId}.`,
714
- `Revived run: ${revivedId}`,
715
- `Agent: ${target.agent}`,
716
- `Session: ${target.sessionFile}`,
717
- result.details.asyncDir ? `Async dir: ${result.details.asyncDir}` : undefined,
718
- revivedTarget ? `Intercom target: ${revivedTarget} (if registered)` : undefined,
719
- `Status if needed: subagent({ action: "status", id: "${revivedId}" })`,
720
- ].filter((line): line is string => Boolean(line));
721
- return { content: [{ type: "text", text: input.deps.runtime.formatAsyncStartedMessage(lines.join("\n")) }], details: result.details };
722
- }
723
-
724
- function resultSummaryForIntercom(result: SingleResult): string {
725
- const output = getSingleResultOutput(result);
726
- if (result.exitCode !== 0 && result.error) {
727
- return output ? `${result.error}\n\nOutput:\n${output}` : result.error;
728
- }
729
- return output || result.error || "(no output)";
730
- }
731
-
732
- function createForegroundControlNotifier(data: Pick<ExecutionContextData, "controlConfig" | "intercomBridge">, deps: Pick<ExecutorDeps, "pi">): (event: ControlEvent) => void {
733
- return (event) => emitControlNotification({
734
- pi: deps.pi,
735
- controlConfig: data.controlConfig,
736
- intercomBridge: data.intercomBridge,
737
- event,
738
- });
739
- }
740
-
741
- async function emitForegroundResultIntercom(input: {
742
- pi: ExtensionAPI;
743
- intercomBridge: IntercomBridgeState;
744
- runId: string;
745
- mode: SubagentRunMode;
746
- results: SingleResult[];
747
- chainSteps?: number;
748
- nestedChildren?: NestedRunSummary[];
749
- }): Promise<ReturnType<typeof buildSubagentResultIntercomPayload> | null> {
750
- if (!input.intercomBridge.active || !input.intercomBridge.orchestratorTarget) return null;
751
- const children = input.results.flatMap((result, index) => result.detached ? [] : [{
752
- agent: result.agent,
753
- status: resolveSubagentResultStatus({
754
- exitCode: result.exitCode,
755
- interrupted: result.interrupted,
756
- detached: result.detached,
757
- }),
758
- summary: resultSummaryForIntercom(result),
759
- index,
760
- artifactPath: result.artifactPaths?.outputPath,
761
- sessionPath: result.sessionFile,
762
- intercomTarget: resolveSubagentIntercomTarget(input.runId, result.agent, index),
763
- }]);
764
- if (children.length === 0) return null;
765
- const payload = buildSubagentResultIntercomPayload({
766
- to: input.intercomBridge.orchestratorTarget,
767
- runId: input.runId,
768
- mode: input.mode,
769
- source: "foreground",
770
- children: attachNestedChildrenToResultChildren(input.runId, children, input.nestedChildren),
771
- ...(typeof input.chainSteps === "number" ? { chainSteps: input.chainSteps } : {}),
772
- });
773
- const delivered = await deliverSubagentResultIntercomEvent(input.pi.events, payload);
774
- if (!delivered) return null;
775
- return payload;
776
- }
777
-
778
- async function maybeBuildForegroundIntercomReceipt(input: {
779
- pi: ExtensionAPI;
780
- intercomBridge: IntercomBridgeState;
781
- runId: string;
782
- mode: SubagentRunMode;
783
- details: Details;
784
- nestedChildren?: NestedRunSummary[];
785
- }): Promise<{ text: string; details: Details } | null> {
786
- const payload = await emitForegroundResultIntercom({
787
- pi: input.pi,
788
- intercomBridge: input.intercomBridge,
789
- runId: input.runId,
790
- mode: input.mode,
791
- results: input.details.results,
792
- ...(typeof input.details.totalSteps === "number" ? { chainSteps: input.details.totalSteps } : {}),
793
- ...(input.nestedChildren?.length ? { nestedChildren: input.nestedChildren } : {}),
794
- });
795
- if (!payload) return null;
796
- return {
797
- text: formatSubagentResultReceipt({ mode: input.mode, runId: input.runId, payload }),
798
- details: stripDetailsOutputsForIntercomReceipt(input.details),
799
- };
800
- }
801
-
802
- function validateExecutionInput(
803
- params: SubagentParamsLike,
804
- agents: AgentConfig[],
805
- hasChain: boolean,
806
- hasTasks: boolean,
807
- hasSingle: boolean,
808
- allowClarifyTaskPrompt: boolean,
809
- ): SubagentToolResult | null {
810
- if (Number(hasChain) + Number(hasTasks) + Number(hasSingle) !== 1) {
811
- return {
812
- content: [
813
- {
814
- type: "text",
815
- text: `Provide exactly one mode. Agents: ${agents.map((a) => a.name).join(", ") || "none"}`,
816
- },
817
- ],
818
- isError: true,
819
- details: { mode: "single" as const, results: [] },
820
- };
821
- }
822
-
823
- if (hasSingle && params.agent && !agents.find((agent) => agent.name === params.agent)) {
824
- return {
825
- content: [{ type: "text", text: `Unknown agent: ${params.agent}` }],
826
- isError: true,
827
- details: { mode: "single" as const, results: [] },
828
- };
829
- }
830
-
831
- if (hasTasks && params.tasks) {
832
- for (let i = 0; i < params.tasks.length; i++) {
833
- const task = params.tasks[i]!;
834
- if (!agents.find((agent) => agent.name === task.agent)) {
835
- return {
836
- content: [{ type: "text", text: `Unknown agent: ${task.agent} (task ${i + 1})` }],
837
- isError: true,
838
- details: { mode: "parallel" as const, results: [] },
839
- };
840
- }
841
- }
842
- }
843
-
844
- if (hasChain && params.chain) {
845
- if (params.chain.length === 0) {
846
- return {
847
- content: [{ type: "text", text: "Chain must have at least one step" }],
848
- isError: true,
849
- details: { mode: "chain" as const, results: [] },
850
- };
851
- }
852
- const firstStep = params.chain[0] as ChainStep;
853
- if (isParallelStep(firstStep)) {
854
- const missingTaskIndex = firstStep.parallel.findIndex((t) => !t.task);
855
- if (missingTaskIndex !== -1) {
856
- return {
857
- content: [{ type: "text", text: `First parallel step: task ${missingTaskIndex + 1} must have a task (no previous output to reference)` }],
858
- isError: true,
859
- details: { mode: "chain" as const, results: [] },
860
- };
861
- }
862
- } else if (isDynamicParallelStep(firstStep)) {
863
- return {
864
- content: [{ type: "text", text: "First step in chain cannot be dynamic fanout; expand.from requires a prior structured named output" }],
865
- isError: true,
866
- details: { mode: "chain" as const, results: [] },
867
- };
868
- } else if (!(firstStep as SequentialStep).task && !params.task && !allowClarifyTaskPrompt) {
869
- return {
870
- content: [{ type: "text", text: "First step in chain must have a task" }],
871
- isError: true,
872
- details: { mode: "chain" as const, results: [] },
873
- };
874
- }
875
- for (let i = 0; i < params.chain.length; i++) {
876
- const step = params.chain[i] as ChainStep;
877
- const stepAgents = getStepAgents(step);
878
- for (const agentName of stepAgents) {
879
- if (!agents.find((a) => a.name === agentName)) {
880
- return {
881
- content: [{ type: "text", text: `Unknown agent: ${agentName} (step ${i + 1})` }],
882
- isError: true,
883
- details: { mode: "chain" as const, results: [] },
884
- };
85
+ if (action === "status") {
86
+ const targetRunId = paramsWithResolvedCwd.id ?? paramsWithResolvedCwd.runId;
87
+ if (targetRunId) {
88
+ try {
89
+ const nestedScope = nestedResolutionScopeForExecutor(deps);
90
+ const resolved = resolveSubagentRunId(targetRunId, { state: deps.state, nested: nestedScope });
91
+ if (resolved?.kind === "foreground") {
92
+ const foreground = getForegroundControl(deps.state, resolved.id);
93
+ if (foreground) return foregroundStatusResult(foreground);
885
94
  }
95
+ } catch (error) {
96
+ const message = error instanceof Error ? error.message : String(error);
97
+ return { content: [{ type: "text", text: message }], isError: true, details: { mode: "management", results: [] } };
886
98
  }
887
- if (isParallelStep(step) && step.parallel.length === 0) {
888
- return {
889
- content: [{ type: "text", text: `Parallel step ${i + 1} must have at least one task` }],
890
- isError: true,
891
- details: { mode: "chain" as const, results: [] },
892
- };
893
- }
894
- }
895
- }
896
-
897
- return null;
898
- }
899
-
900
- function getRequestedModeLabel(params: SubagentParamsLike): Details["mode"] {
901
- if ((params.chain?.length ?? 0) > 0) return "chain";
902
- if ((params.tasks?.length ?? 0) > 0) return "parallel";
903
- if (params.agent) return "single";
904
- return "single";
905
- }
906
-
907
- function applyAgentDefaultContext(params: SubagentParamsLike, agents: AgentConfig[]): SubagentParamsLike {
908
- if (params.context !== undefined) return params;
909
- const byName = new Map(agents.map((agent) => [agent.name, agent]));
910
- const names: string[] = [];
911
- if (params.agent) names.push(params.agent);
912
- for (const task of params.tasks ?? []) names.push(task.agent);
913
- for (const step of params.chain ?? []) names.push(...getStepAgents(step));
914
- return names.some((name) => byName.get(name)?.defaultContext === "fork")
915
- ? { ...params, context: "fork" }
916
- : params;
917
- }
918
-
919
- function buildRequestedModeError(params: SubagentParamsLike, message: string): SubagentToolResult {
920
- return withForkContext(
921
- {
922
- content: [{ type: "text", text: message }],
923
- isError: true,
924
- details: { mode: getRequestedModeLabel(params), results: [] },
925
- },
926
- params.context,
927
- );
928
- }
929
-
930
- function expandTopLevelTaskCounts(tasks: TaskParam[]): { tasks?: TaskParam[]; error?: string } {
931
- const expanded: TaskParam[] = [];
932
- for (let taskIndex = 0; taskIndex < tasks.length; taskIndex++) {
933
- const task = tasks[taskIndex]!;
934
- const rawCount = (task as TaskParam & { count?: unknown }).count;
935
- if (rawCount !== undefined && (typeof rawCount !== "number" || !Number.isInteger(rawCount) || rawCount < 1)) {
936
- return { error: `tasks[${taskIndex}].count must be an integer >= 1` };
937
- }
938
- const { count, ...concreteTask } = task;
939
- for (let repeat = 0; repeat < (rawCount ?? 1); repeat++) {
940
- expanded.push({ ...concreteTask });
941
- }
942
- }
943
- return { tasks: expanded };
944
- }
945
-
946
- function expandChainParallelCounts(chain: ChainStep[]): { chain?: ChainStep[]; error?: string } {
947
- const expandedChain: ChainStep[] = [];
948
- for (let stepIndex = 0; stepIndex < chain.length; stepIndex++) {
949
- const step = chain[stepIndex]!;
950
- if (!isParallelStep(step)) {
951
- expandedChain.push(step);
952
- continue;
953
- }
954
- const expandedParallel = [];
955
- for (let taskIndex = 0; taskIndex < step.parallel.length; taskIndex++) {
956
- const task = step.parallel[taskIndex]!;
957
- const rawCount = (task as typeof task & { count?: unknown }).count;
958
- if (rawCount !== undefined && (typeof rawCount !== "number" || !Number.isInteger(rawCount) || rawCount < 1)) {
959
- return { error: `chain[${stepIndex}].parallel[${taskIndex}].count must be an integer >= 1` };
960
- }
961
- const { count, ...concreteTask } = task;
962
- for (let repeat = 0; repeat < (rawCount ?? 1); repeat++) {
963
- expandedParallel.push({ ...concreteTask });
964
- }
965
- }
966
- expandedChain.push({ ...step, parallel: expandedParallel });
967
- }
968
- return { chain: expandedChain };
969
- }
970
-
971
- function normalizeRepeatedParallelCounts(params: SubagentParamsLike): { params?: SubagentParamsLike; error?: SubagentToolResult } {
972
- if (params.tasks) {
973
- const expandedTasks = expandTopLevelTaskCounts(params.tasks);
974
- if (expandedTasks.error) {
975
- return { error: buildRequestedModeError(params, expandedTasks.error) };
976
- }
977
- return { params: { ...params, tasks: expandedTasks.tasks } };
978
- }
979
- if (params.chain) {
980
- const expandedChain = expandChainParallelCounts(params.chain);
981
- if (expandedChain.error) {
982
- return { error: buildRequestedModeError(params, expandedChain.error) };
983
- }
984
- return { params: { ...params, chain: expandedChain.chain } };
985
- }
986
- return { params };
987
- }
988
-
989
- function withForkContext(
990
- result: SubagentToolResult,
991
- context: SubagentParamsLike["context"],
992
- ): SubagentToolResult {
993
- if (context !== "fork" || !result.details) return result;
994
- return {
995
- ...result,
996
- details: {
997
- ...result.details,
998
- context: "fork",
999
- },
1000
- };
1001
- }
1002
-
1003
- function toExecutionErrorResult(params: SubagentParamsLike, error: unknown): SubagentToolResult {
1004
- const message = error instanceof Error ? error.message : String(error);
1005
- return withForkContext(
1006
- {
1007
- content: [{ type: "text", text: message }],
1008
- isError: true,
1009
- details: { mode: getRequestedModeLabel(params), results: [] },
1010
- },
1011
- params.context,
1012
- );
1013
- }
1014
-
1015
- function collectChainSessionFiles(
1016
- chain: ChainStep[],
1017
- sessionFileForIndex: (idx?: number) => string | undefined,
1018
- ): (string | undefined)[] {
1019
- const sessionFiles: (string | undefined)[] = [];
1020
- let flatIndex = 0;
1021
- for (const step of chain) {
1022
- if (isParallelStep(step)) {
1023
- for (let i = 0; i < step.parallel.length; i++) {
1024
- sessionFiles.push(sessionFileForIndex(flatIndex));
1025
- flatIndex++;
1026
- }
1027
- continue;
1028
- }
1029
- if (isDynamicParallelStep(step)) {
1030
- sessionFiles.push(undefined);
1031
- continue;
99
+ } else {
100
+ const foreground = getForegroundControl(deps.state, undefined);
101
+ if (foreground) return foregroundStatusResult(foreground);
1032
102
  }
1033
- sessionFiles.push(sessionFileForIndex(flatIndex));
1034
- flatIndex++;
103
+ return inspectSubagentStatus({
104
+ action: "status",
105
+ id: paramsWithResolvedCwd.id,
106
+ runId: paramsWithResolvedCwd.runId,
107
+ dir: paramsWithResolvedCwd.dir,
108
+ }, { state: deps.state, nested: nestedResolutionScopeForExecutor(deps) });
1035
109
  }
1036
- return sessionFiles;
1037
- }
1038
-
1039
- function wrapChainTasksForFork(chain: ChainStep[], context: SubagentParamsLike["context"]): ChainStep[] {
1040
- if (context !== "fork") return chain;
1041
- return chain.map((step, stepIndex) => {
1042
- if (isParallelStep(step)) {
1043
- return {
1044
- ...step,
1045
- parallel: step.parallel.map((task) => ({
1046
- ...task,
1047
- task: wrapForkTask(task.task ?? "{previous}"),
1048
- })),
1049
- };
1050
- }
1051
- if (isDynamicParallelStep(step)) {
1052
- return {
1053
- ...step,
1054
- parallel: {
1055
- ...step.parallel,
1056
- task: wrapForkTask(step.parallel.task ?? "{previous}"),
1057
- },
1058
- };
1059
- }
1060
- const sequential = step as SequentialStep;
1061
- return {
1062
- ...sequential,
1063
- task: wrapForkTask(sequential.task ?? (stepIndex === 0 ? "{task}" : "{previous}")),
1064
- };
1065
- });
1066
- }
1067
-
1068
- function runAsyncPath(data: ExecutionContextData, deps: ResolvedExecutorDeps): SubagentToolResult | null {
1069
- const {
1070
- params,
1071
- effectiveCwd,
1072
- agents,
1073
- ctx,
1074
- shareEnabled,
1075
- sessionRoot,
1076
- sessionFileForIndex,
1077
- artifactConfig,
1078
- artifactsDir,
1079
- effectiveAsync,
1080
- controlConfig,
1081
- intercomBridge,
1082
- nestedRoute,
1083
- } = data;
1084
- const hasChain = (params.chain?.length ?? 0) > 0;
1085
- const hasTasks = (params.tasks?.length ?? 0) > 0;
1086
- const hasSingle = !hasChain && !hasTasks && Boolean(params.agent);
1087
- if (!effectiveAsync) return null;
1088
-
1089
- if (hasChain && params.chain) {
1090
- const chainWorktreeTaskCwdError = buildChainWorktreeTaskCwdError(params.chain as ChainStep[], effectiveCwd);
1091
- if (chainWorktreeTaskCwdError) {
1092
- return {
1093
- content: [{ type: "text", text: chainWorktreeTaskCwdError }],
1094
- isError: true,
1095
- details: { mode: "chain" as const, results: [] },
1096
- };
1097
- }
110
+ if (action === "resume") {
111
+ return resumeAsyncRun({ params: paramsWithResolvedCwd, requestCwd, ctx, deps });
1098
112
  }
1099
-
1100
- if (hasTasks && params.tasks) {
1101
- const maxParallelTasks = resolveTopLevelParallelMaxTasks(deps.config.parallel?.maxTasks);
1102
- if (params.tasks.length > maxParallelTasks) {
1103
- return buildParallelModeError(`Max ${maxParallelTasks} tasks`);
1104
- }
1105
- if (params.worktree) {
1106
- const worktreeTaskCwdError = buildParallelWorktreeTaskCwdError(params.tasks, effectiveCwd);
1107
- if (worktreeTaskCwdError) return buildParallelModeError(worktreeTaskCwdError);
1108
- }
113
+ if (action === "interrupt") {
114
+ return handleInterruptRequest({ paramsWithResolvedCwd, deps });
1109
115
  }
1110
-
1111
- if (!deps.runtime.isAsyncAvailable()) {
116
+ if (!(SUBAGENT_ACTIONS as readonly string[]).includes(action)) {
1112
117
  return {
1113
- content: [{ type: "text", text: `Async mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the ${APP_NAME}-subagents package dependencies are installed.` }],
118
+ content: [{ type: "text", text: `Unknown action: ${action}. Valid: ${SUBAGENT_ACTIONS.join(", ")}` }],
1114
119
  isError: true,
1115
- details: { mode: "single" as const, results: [] },
1116
- };
1117
- }
1118
- const id = randomUUID();
1119
- const asyncCtx = {
1120
- pi: deps.pi,
1121
- cwd: ctx.cwd,
1122
- currentSessionId: deps.state.currentSessionId!,
1123
- currentModelProvider: ctx.model?.provider,
1124
- currentModel: currentModelFullId(ctx.model),
1125
- };
1126
- const availableModels: ModelInfo[] = ctx.modelRegistry.getAvailable().map(toModelInfo);
1127
- const depthPolicy = resolveSubagentDepthPolicy(ctx, deps.config.maxSubagentDepth);
1128
- const currentMaxSubagentDepth = depthPolicy.maxSubagentDepth;
1129
- const workflowStageSubagentGuard = depthPolicy.workflowStageSubagentGuard;
1130
- const currentProvider = ctx.model?.provider;
1131
- const controlIntercomTarget = intercomBridge.active ? intercomBridge.orchestratorTarget : undefined;
1132
- const childIntercomTarget = intercomBridge.active ? (agent: string, index: number) => resolveSubagentIntercomTarget(id, agent, index) : undefined;
1133
-
1134
- if (hasTasks && params.tasks) {
1135
- const agentConfigs = params.tasks.map((task) => agents.find((agent) => agent.name === task.agent));
1136
- const modelOverrides = params.tasks.map((task, index) =>
1137
- resolveModelCandidate(task.model ?? agentConfigs[index]?.model, availableModels, currentProvider),
1138
- );
1139
- const skillOverrides = params.tasks.map((task) => normalizeSkillInput(task.skill));
1140
- const parallelTasks = params.tasks.map((task, index) => ({
1141
- agent: task.agent,
1142
- task: params.context === "fork" ? wrapForkTask(task.task) : task.task,
1143
- cwd: task.cwd,
1144
- ...(modelOverrides[index] ? { model: modelOverrides[index] } : {}),
1145
- ...(skillOverrides[index] !== undefined ? { skill: skillOverrides[index] } : {}),
1146
- ...(task.output === true ? (agentConfigs[index]?.output ? { output: agentConfigs[index]!.output } : {}) : task.output !== undefined ? { output: task.output } : {}),
1147
- ...(task.outputMode !== undefined ? { outputMode: task.outputMode } : {}),
1148
- ...(task.reads !== undefined && task.reads !== true ? { reads: task.reads } : {}),
1149
- ...(task.progress !== undefined ? { progress: task.progress } : {}),
1150
- }));
1151
- return deps.runtime.executeAsyncChain(id, {
1152
- chain: [{
1153
- parallel: parallelTasks,
1154
- concurrency: resolveTopLevelParallelConcurrency(params.concurrency, deps.config.parallel?.concurrency),
1155
- worktree: params.worktree,
1156
- }],
1157
- resultMode: "parallel",
1158
- agents,
1159
- ctx: asyncCtx,
1160
- availableModels,
1161
- cwd: effectiveCwd,
1162
- maxOutput: params.maxOutput,
1163
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1164
- artifactConfig,
1165
- shareEnabled,
1166
- sessionRoot,
1167
- chainSkills: [],
1168
- sessionFilesByFlatIndex: params.tasks.map((_, index) => sessionFileForIndex(index)),
1169
- maxSubagentDepth: currentMaxSubagentDepth,
1170
- workflowStageSubagentGuard,
1171
- worktreeSetupHook: deps.config.worktreeSetupHook,
1172
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
1173
- controlConfig,
1174
- controlIntercomTarget,
1175
- childIntercomTarget,
1176
- nestedRoute,
1177
- });
1178
- }
1179
-
1180
- if (hasChain && params.chain) {
1181
- const normalized = normalizeSkillInput(params.skill);
1182
- const chainSkills = normalized === false ? [] : (normalized ?? []);
1183
- const chain = wrapChainTasksForFork(params.chain as ChainStep[], params.context);
1184
- return deps.runtime.executeAsyncChain(id, {
1185
- chain,
1186
- task: params.task,
1187
- agents,
1188
- ctx: asyncCtx,
1189
- availableModels,
1190
- cwd: effectiveCwd,
1191
- maxOutput: params.maxOutput,
1192
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1193
- artifactConfig,
1194
- shareEnabled,
1195
- sessionRoot,
1196
- chainSkills,
1197
- sessionFilesByFlatIndex: collectChainSessionFiles(chain, sessionFileForIndex),
1198
- dynamicFanoutMaxItems: deps.config.chain?.dynamicFanout?.maxItems,
1199
- maxSubagentDepth: currentMaxSubagentDepth,
1200
- workflowStageSubagentGuard,
1201
- worktreeSetupHook: deps.config.worktreeSetupHook,
1202
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
1203
- controlConfig,
1204
- controlIntercomTarget,
1205
- childIntercomTarget,
1206
- nestedRoute,
1207
- });
1208
- }
1209
-
1210
- if (hasSingle) {
1211
- const a = agents.find((x) => x.name === params.agent);
1212
- if (!a) {
1213
- return {
1214
- content: [{ type: "text", text: `Unknown agent: ${params.agent}` }],
1215
- isError: true,
1216
- details: { mode: "single" as const, results: [] },
1217
- };
1218
- }
1219
- const rawOutput = params.output !== undefined ? params.output : a.output;
1220
- const effectiveOutput = normalizeSingleOutputOverride(rawOutput, a.output);
1221
- const effectiveOutputMode = params.outputMode ?? "inline";
1222
- const normalizedSkills = normalizeSkillInput(params.skill);
1223
- const skills = normalizedSkills === false ? [] : normalizedSkills;
1224
- const maxSubagentDepth = resolveChildMaxSubagentDepth(currentMaxSubagentDepth, a.maxSubagentDepth);
1225
- const modelOverride = resolveModelCandidate((params.model as string | undefined) ?? a.model, availableModels, currentProvider);
1226
- return deps.runtime.executeAsyncSingle(id, {
1227
- agent: params.agent!,
1228
- task: params.context === "fork" ? wrapForkTask(params.task ?? "") : (params.task ?? ""),
1229
- agentConfig: a,
1230
- ctx: asyncCtx,
1231
- availableModels,
1232
- cwd: effectiveCwd,
1233
- maxOutput: params.maxOutput,
1234
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1235
- artifactConfig,
1236
- shareEnabled,
1237
- sessionRoot,
1238
- sessionFile: sessionFileForIndex(0),
1239
- skills,
1240
- output: effectiveOutput,
1241
- outputMode: effectiveOutputMode,
1242
- modelOverride,
1243
- maxSubagentDepth,
1244
- workflowStageSubagentGuard,
1245
- worktreeSetupHook: deps.config.worktreeSetupHook,
1246
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
1247
- controlConfig,
1248
- controlIntercomTarget,
1249
- childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(agent, index) : undefined,
1250
- nestedRoute,
1251
- });
1252
- }
1253
-
1254
- return null;
1255
- }
1256
-
1257
- async function runChainPath(data: ExecutionContextData, deps: ResolvedExecutorDeps): Promise<SubagentToolResult> {
1258
- const {
1259
- params,
1260
- effectiveCwd,
1261
- agents,
1262
- ctx,
1263
- signal,
1264
- runId,
1265
- shareEnabled,
1266
- sessionDirForIndex,
1267
- sessionFileForIndex,
1268
- artifactsDir,
1269
- artifactConfig,
1270
- onUpdate,
1271
- sessionRoot,
1272
- controlConfig,
1273
- } = data;
1274
- const onControlEvent = createForegroundControlNotifier(data, deps);
1275
- const childIntercomTarget = data.intercomBridge.active ? resolveSubagentIntercomTarget : undefined;
1276
- const foregroundControl = deps.state.foregroundControls.get(runId);
1277
- const normalized = normalizeSkillInput(params.skill);
1278
- const chainSkills = normalized === false ? [] : (normalized ?? []);
1279
- const chain = wrapChainTasksForFork(params.chain as ChainStep[], params.context);
1280
- const depthPolicy = resolveSubagentDepthPolicy(ctx, deps.config.maxSubagentDepth);
1281
- const currentMaxSubagentDepth = depthPolicy.maxSubagentDepth;
1282
- const workflowStageSubagentGuard = depthPolicy.workflowStageSubagentGuard;
1283
- const chainResult = await executeChain({
1284
- chain,
1285
- task: params.task,
1286
- agents,
1287
- ctx,
1288
- intercomEvents: deps.pi.events,
1289
- signal,
1290
- runId,
1291
- cwd: effectiveCwd,
1292
- shareEnabled,
1293
- sessionDirForIndex,
1294
- sessionFileForIndex,
1295
- artifactsDir,
1296
- artifactConfig,
1297
- includeProgress: params.includeProgress,
1298
- clarify: params.clarify,
1299
- onUpdate,
1300
- onControlEvent,
1301
- controlConfig,
1302
- childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(runId, agent, index) : undefined,
1303
- orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
1304
- foregroundControl,
1305
- nestedRoute: foregroundControl?.nestedRoute,
1306
- chainSkills,
1307
- chainDir: params.chainDir,
1308
- dynamicFanoutMaxItems: deps.config.chain?.dynamicFanout?.maxItems,
1309
- maxSubagentDepth: currentMaxSubagentDepth,
1310
- workflowStageSubagentGuard,
1311
- worktreeSetupHook: deps.config.worktreeSetupHook,
1312
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
1313
- runSync: deps.runtime.runSync,
1314
- });
1315
-
1316
- if (chainResult.requestedAsync) {
1317
- if (!deps.runtime.isAsyncAvailable()) {
1318
- return {
1319
- content: [{ type: "text", text: `Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the ${APP_NAME}-subagents package dependencies are installed.` }],
1320
- isError: true,
1321
- details: { mode: "chain" as const, results: [] },
1322
- };
1323
- }
1324
- const id = randomUUID();
1325
- const asyncCtx = {
1326
- pi: deps.pi,
1327
- cwd: ctx.cwd,
1328
- currentSessionId: deps.state.currentSessionId!,
1329
- currentModelProvider: ctx.model?.provider,
1330
- currentModel: currentModelFullId(ctx.model),
1331
- };
1332
- const asyncChain = wrapChainTasksForFork(chainResult.requestedAsync.chain, params.context);
1333
- return deps.runtime.executeAsyncChain(id, {
1334
- chain: asyncChain,
1335
- task: params.task,
1336
- agents,
1337
- ctx: asyncCtx,
1338
- availableModels: ctx.modelRegistry.getAvailable().map(toModelInfo),
1339
- cwd: effectiveCwd,
1340
- maxOutput: params.maxOutput,
1341
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1342
- artifactConfig,
1343
- shareEnabled,
1344
- sessionRoot,
1345
- chainSkills: chainResult.requestedAsync.chainSkills,
1346
- sessionFilesByFlatIndex: collectChainSessionFiles(asyncChain, sessionFileForIndex),
1347
- dynamicFanoutMaxItems: deps.config.chain?.dynamicFanout?.maxItems,
1348
- maxSubagentDepth: currentMaxSubagentDepth,
1349
- workflowStageSubagentGuard,
1350
- worktreeSetupHook: deps.config.worktreeSetupHook,
1351
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
1352
- controlConfig,
1353
- controlIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
1354
- childIntercomTarget: data.intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(id, agent, index) : undefined,
1355
- nestedRoute: data.nestedRoute,
1356
- });
1357
- }
1358
-
1359
- const chainDetails = chainResult.details ? compactForegroundDetails({ ...chainResult.details, runId }) : undefined;
1360
- if (foregroundControl) updateForegroundNestedProjection(foregroundControl);
1361
- if (chainDetails) rememberForegroundRun(deps.state, { runId, mode: "chain", cwd: effectiveCwd, results: chainDetails.results });
1362
- const intercomReceipt = chainDetails && !chainDetails.results.some((result) => result.interrupted || result.detached)
1363
- ? await maybeBuildForegroundIntercomReceipt({
1364
- pi: deps.pi,
1365
- intercomBridge: data.intercomBridge,
1366
- runId,
1367
- mode: "chain",
1368
- details: chainDetails,
1369
- ...(foregroundControl?.nestedChildren?.length ? { nestedChildren: foregroundControl.nestedChildren } : {}),
1370
- })
1371
- : null;
1372
- if (intercomReceipt) {
1373
- return {
1374
- ...chainResult,
1375
- content: [{ type: "text", text: intercomReceipt.text }],
1376
- details: intercomReceipt.details,
1377
- };
1378
- }
1379
-
1380
- return chainDetails ? { ...chainResult, details: chainDetails } : chainResult;
1381
- }
1382
-
1383
- interface ForegroundParallelRunInput {
1384
- tasks: TaskParam[];
1385
- taskTexts: string[];
1386
- agents: AgentConfig[];
1387
- ctx: ExtensionContext;
1388
- intercomEvents: IntercomEventBus;
1389
- signal: AbortSignal;
1390
- runId: string;
1391
- sessionDirForIndex: (idx?: number) => string | undefined;
1392
- sessionFileForIndex: (idx?: number) => string | undefined;
1393
- shareEnabled: boolean;
1394
- artifactConfig: ArtifactConfig;
1395
- artifactsDir: string;
1396
- maxOutput?: MaxOutputConfig;
1397
- paramsCwd: string;
1398
- maxSubagentDepths: number[];
1399
- workflowStageSubagentGuard?: boolean;
1400
- availableModels: ModelInfo[];
1401
- modelOverrides: (string | undefined)[];
1402
- behaviors: Array<ReturnType<typeof resolveStepBehavior>>;
1403
- firstProgressIndex: number;
1404
- controlConfig: ResolvedControlConfig;
1405
- onControlEvent?: (event: ControlEvent) => void;
1406
- childIntercomTarget?: (agent: string, index: number) => string | undefined;
1407
- orchestratorIntercomTarget?: string;
1408
- foregroundControl?: SubagentState["foregroundControls"] extends Map<string, infer T> ? T : never;
1409
- concurrencyLimit: number;
1410
- liveResults: (SingleResult | undefined)[];
1411
- liveProgress: (AgentProgress | undefined)[];
1412
- onUpdate?: (r: SubagentToolResult) => void;
1413
- worktreeSetup?: WorktreeSetup;
1414
- runtime: Pick<SubagentExecutorRuntimeDeps, "runSync">;
1415
- }
1416
-
1417
- function buildParallelModeError(message: string): SubagentToolResult {
1418
- return {
1419
- content: [{ type: "text", text: message }],
1420
- isError: true,
1421
- details: { mode: "parallel" as const, results: [] },
1422
- };
1423
- }
1424
-
1425
- function createParallelWorktreeSetup(
1426
- enabled: boolean | undefined,
1427
- cwd: string,
1428
- runId: string,
1429
- tasks: TaskParam[],
1430
- setupHook: ExtensionConfig["worktreeSetupHook"],
1431
- setupHookTimeoutMs: ExtensionConfig["worktreeSetupHookTimeoutMs"],
1432
- ): { setup?: WorktreeSetup; errorResult?: SubagentToolResult } {
1433
- if (!enabled) return {};
1434
- try {
1435
- return {
1436
- setup: createWorktrees(cwd, runId, tasks.length, {
1437
- agents: tasks.map((task) => task.agent),
1438
- setupHook: setupHook
1439
- ? { hookPath: setupHook, timeoutMs: setupHookTimeoutMs }
1440
- : undefined,
1441
- }),
120
+ details: { mode: "management" as const, results: [] },
1442
121
  };
1443
- } catch (error) {
1444
- const message = error instanceof Error ? error.message : String(error);
1445
- return { errorResult: buildParallelModeError(message) };
1446
- }
1447
- }
1448
-
1449
- function buildParallelWorktreeTaskCwdError(
1450
- tasks: ReadonlyArray<{ agent: string; cwd?: string }>,
1451
- sharedCwd: string,
1452
- ): string | undefined {
1453
- const conflict = findWorktreeTaskCwdConflict(tasks, sharedCwd);
1454
- if (!conflict) return undefined;
1455
- return formatWorktreeTaskCwdConflict(conflict, sharedCwd);
1456
- }
1457
-
1458
- function buildChainWorktreeTaskCwdError(chain: ChainStep[], sharedCwd: string): string | undefined {
1459
- for (let stepIndex = 0; stepIndex < chain.length; stepIndex++) {
1460
- const step = chain[stepIndex]!;
1461
- if (!isParallelStep(step) || !step.worktree) continue;
1462
- const stepCwd = resolveChildCwd(sharedCwd, step.cwd);
1463
- const conflict = findWorktreeTaskCwdConflict(step.parallel, stepCwd);
1464
- if (!conflict) continue;
1465
- const detail = formatWorktreeTaskCwdConflict(conflict, stepCwd);
1466
- return `parallel chain step ${stepIndex + 1}: ${detail}`;
1467
- }
1468
- return undefined;
1469
- }
1470
-
1471
- function resolveParallelTaskCwd(
1472
- task: TaskParam,
1473
- paramsCwd: string,
1474
- worktreeSetup: WorktreeSetup | undefined,
1475
- index: number,
1476
- ): string {
1477
- if (worktreeSetup) return worktreeSetup.worktrees[index]!.agentCwd;
1478
- return resolveChildCwd(paramsCwd, task.cwd);
1479
- }
1480
-
1481
- function buildParallelWorktreeSuffix(
1482
- worktreeSetup: WorktreeSetup | undefined,
1483
- artifactsDir: string,
1484
- tasks: TaskParam[],
1485
- ): string {
1486
- if (!worktreeSetup) return "";
1487
- const diffsDir = path.join(artifactsDir, "worktree-diffs");
1488
- const diffs = diffWorktrees(worktreeSetup, tasks.map((task) => task.agent), diffsDir);
1489
- return formatWorktreeDiffSummary(diffs);
1490
- }
1491
-
1492
- function findDuplicateParallelOutputPath(input: {
1493
- tasks: TaskParam[];
1494
- behaviors: ResolvedStepBehavior[];
1495
- paramsCwd: string;
1496
- ctxCwd: string;
1497
- worktreeSetup?: WorktreeSetup;
1498
- }): string | undefined {
1499
- const seen = new Map<string, { index: number; agent: string }>();
1500
- for (let index = 0; index < input.tasks.length; index++) {
1501
- const behavior = input.behaviors[index];
1502
- if (!behavior?.output) continue;
1503
- const task = input.tasks[index]!;
1504
- const taskCwd = resolveParallelTaskCwd(task, input.paramsCwd, input.worktreeSetup, index);
1505
- const outputPath = resolveSingleOutputPath(behavior.output, input.ctxCwd, taskCwd);
1506
- if (!outputPath) continue;
1507
- const previous = seen.get(outputPath);
1508
- if (previous) {
1509
- return `Parallel tasks ${previous.index + 1} (${previous.agent}) and ${index + 1} (${task.agent}) resolve output to the same path: ${outputPath}. Use distinct output paths.`;
1510
- }
1511
- seen.set(outputPath, { index, agent: task.agent });
1512
122
  }
1513
- return undefined;
1514
- }
1515
-
1516
- async function runForegroundParallelTasks(input: ForegroundParallelRunInput): Promise<SingleResult[]> {
1517
- return mapConcurrent(input.tasks, input.concurrencyLimit, async (task, index) => {
1518
- const behavior = input.behaviors[index];
1519
- const effectiveSkills = behavior?.skills;
1520
- const taskCwd = resolveParallelTaskCwd(task, input.paramsCwd, input.worktreeSetup, index);
1521
- const readInstructions = behavior
1522
- ? buildChainInstructions({ ...behavior, output: false, progress: false }, taskCwd, false)
1523
- : { prefix: "", suffix: "" };
1524
- const progressInstructions = behavior
1525
- ? buildChainInstructions({ ...behavior, output: false, reads: false }, input.paramsCwd, index === input.firstProgressIndex)
1526
- : { prefix: "", suffix: "" };
1527
- const outputPath = resolveSingleOutputPath(behavior?.output, input.ctx.cwd, taskCwd);
1528
- const taskText = injectSingleOutputInstruction(
1529
- `${readInstructions.prefix}${input.taskTexts[index]!}${progressInstructions.suffix}`,
1530
- outputPath,
1531
- );
1532
- const interruptController = new AbortController();
1533
- if (input.foregroundControl) {
1534
- input.foregroundControl.currentAgent = task.agent;
1535
- input.foregroundControl.currentIndex = index;
1536
- input.foregroundControl.currentActivityState = undefined;
1537
- input.foregroundControl.updatedAt = Date.now();
1538
- input.foregroundControl.interrupt = () => {
1539
- if (interruptController.signal.aborted) return false;
1540
- interruptController.abort();
1541
- input.foregroundControl!.currentActivityState = undefined;
1542
- input.foregroundControl!.updatedAt = Date.now();
1543
- return true;
1544
- };
1545
- }
1546
- const agentConfig = input.agents.find((agent) => agent.name === task.agent);
1547
- return input.runtime.runSync(input.ctx.cwd, input.agents, task.agent, taskText, {
1548
- cwd: taskCwd,
1549
- signal: input.signal,
1550
- interruptSignal: interruptController.signal,
1551
- allowIntercomDetach: agentConfig?.systemPrompt?.includes(INTERCOM_BRIDGE_MARKER) === true,
1552
- intercomEvents: input.intercomEvents,
1553
- runId: input.runId,
1554
- index,
1555
- sessionDir: input.sessionDirForIndex(index),
1556
- sessionFile: input.sessionFileForIndex(index),
1557
- share: input.shareEnabled,
1558
- artifactsDir: input.artifactConfig.enabled ? input.artifactsDir : undefined,
1559
- artifactConfig: input.artifactConfig,
1560
- maxOutput: input.maxOutput,
1561
- outputPath,
1562
- outputMode: behavior?.outputMode,
1563
- maxSubagentDepth: input.maxSubagentDepths[index],
1564
- workflowStageSubagentGuard: input.workflowStageSubagentGuard,
1565
- controlConfig: input.controlConfig,
1566
- onControlEvent: input.onControlEvent,
1567
- intercomSessionName: input.childIntercomTarget?.(task.agent, index),
1568
- orchestratorIntercomTarget: input.orchestratorIntercomTarget,
1569
- nestedRoute: input.foregroundControl?.nestedRoute,
1570
- modelOverride: input.modelOverrides[index],
1571
- availableModels: input.availableModels,
1572
- preferredModelProvider: input.ctx.model?.provider,
1573
- currentModel: currentModelFullId(input.ctx.model),
1574
- skills: effectiveSkills === false ? [] : effectiveSkills,
1575
- onUpdate: input.onUpdate
1576
- ? (progressUpdate) => {
1577
- const stepResults = progressUpdate.details?.results || [];
1578
- const stepProgress = progressUpdate.details?.progress || [];
1579
- if (input.foregroundControl && stepProgress.length > 0) {
1580
- const current = stepProgress[0];
1581
- input.foregroundControl.currentAgent = task.agent;
1582
- input.foregroundControl.currentIndex = index;
1583
- input.foregroundControl.currentActivityState = current?.activityState;
1584
- input.foregroundControl.lastActivityAt = current?.lastActivityAt;
1585
- input.foregroundControl.currentTool = current?.currentTool;
1586
- input.foregroundControl.currentToolStartedAt = current?.currentToolStartedAt;
1587
- input.foregroundControl.currentPath = current?.currentPath;
1588
- input.foregroundControl.turnCount = current?.turnCount;
1589
- input.foregroundControl.tokens = current?.tokens;
1590
- input.foregroundControl.toolCount = current?.toolCount;
1591
- input.foregroundControl.updatedAt = Date.now();
1592
- }
1593
- if (stepResults.length > 0) input.liveResults[index] = stepResults[0];
1594
- if (stepProgress.length > 0) input.liveProgress[index] = stepProgress[0];
1595
- const mergedResults = input.liveResults.filter((result): result is SingleResult => result !== undefined);
1596
- const mergedProgress = input.liveProgress.filter((progress): progress is AgentProgress => progress !== undefined);
1597
- input.onUpdate?.({
1598
- content: progressUpdate.content,
1599
- details: {
1600
- mode: "parallel",
1601
- results: mergedResults,
1602
- progress: mergedProgress,
1603
- controlEvents: progressUpdate.details?.controlEvents,
1604
- totalSteps: input.tasks.length,
1605
- },
1606
- });
1607
- }
1608
- : undefined,
1609
- }).finally(() => {
1610
- if (input.foregroundControl?.currentIndex === index) {
1611
- input.foregroundControl.interrupt = undefined;
1612
- input.foregroundControl.updatedAt = Date.now();
1613
- }
1614
- });
1615
- });
1616
- }
1617
-
1618
- async function runParallelPath(data: ExecutionContextData, deps: ResolvedExecutorDeps): Promise<SubagentToolResult> {
1619
- const {
1620
- params,
1621
- effectiveCwd,
1622
- agents,
1623
- ctx,
1624
- signal,
1625
- runId,
1626
- sessionDirForIndex,
1627
- sessionFileForIndex,
1628
- shareEnabled,
1629
- artifactConfig,
1630
- artifactsDir,
1631
- backgroundRequestedWhileClarifying,
1632
- onUpdate,
1633
- sessionRoot,
1634
- controlConfig,
1635
- } = data;
1636
- const onControlEvent = createForegroundControlNotifier(data, deps);
1637
- const childIntercomTarget = data.intercomBridge.active ? resolveSubagentIntercomTarget : undefined;
1638
- const allProgress: AgentProgress[] = [];
1639
- const allArtifactPaths: ArtifactPaths[] = [];
1640
- const tasks = params.tasks!;
1641
- const maxParallelTasks = resolveTopLevelParallelMaxTasks(deps.config.parallel?.maxTasks);
1642
- const parallelConcurrency = resolveTopLevelParallelConcurrency(params.concurrency, deps.config.parallel?.concurrency);
1643
-
1644
- if (tasks.length > maxParallelTasks)
123
+ if (deps.allowMutatingManagementActions === false && MUTATING_MANAGEMENT_ACTIONS.has(action)) {
1645
124
  return {
1646
- content: [{ type: "text", text: `Max ${maxParallelTasks} tasks` }],
125
+ content: [{ type: "text", text: `Action '${action}' is not available from child-safe subagent fanout mode.` }],
1647
126
  isError: true,
1648
- details: { mode: "parallel" as const, results: [] },
127
+ details: { mode: "management" as const, results: [] },
1649
128
  };
1650
-
1651
- const agentConfigs: AgentConfig[] = [];
1652
- for (const t of tasks) {
1653
- const config = agents.find((a) => a.name === t.agent);
1654
- if (!config) {
1655
- return {
1656
- content: [{ type: "text", text: `Unknown agent: ${t.agent}` }],
1657
- isError: true,
1658
- details: { mode: "parallel" as const, results: [] },
1659
- };
1660
- }
1661
- agentConfigs.push(config);
1662
- }
1663
-
1664
- const depthPolicy = resolveSubagentDepthPolicy(ctx, deps.config.maxSubagentDepth);
1665
- const currentMaxSubagentDepth = depthPolicy.maxSubagentDepth;
1666
- const workflowStageSubagentGuard = depthPolicy.workflowStageSubagentGuard;
1667
- const maxSubagentDepths = agentConfigs.map((config) =>
1668
- resolveChildMaxSubagentDepth(currentMaxSubagentDepth, config.maxSubagentDepth),
1669
- );
1670
-
1671
- if (params.worktree) {
1672
- const worktreeTaskCwdError = buildParallelWorktreeTaskCwdError(tasks, effectiveCwd);
1673
- if (worktreeTaskCwdError) return buildParallelModeError(worktreeTaskCwdError);
1674
129
  }
130
+ return handleManagementAction(action, paramsWithResolvedCwd, { ...ctx, cwd: requestCwd });
131
+ }
1675
132
 
1676
- const currentProvider = ctx.model?.provider;
1677
- const availableModels: ModelInfo[] = ctx.modelRegistry.getAvailable().map(toModelInfo);
1678
- let taskTexts = tasks.map((t) => t.task);
1679
- const skillOverrides: (string[] | false | undefined)[] = tasks.map((t) =>
1680
- normalizeSkillInput(t.skill),
1681
- );
1682
- const behaviorOverrides: StepOverrides[] = tasks.map((task, index) => ({
1683
- ...(task.output !== undefined ? { output: task.output === true ? agentConfigs[index]?.output ?? false : task.output } : {}),
1684
- ...(task.outputMode !== undefined ? { outputMode: task.outputMode } : {}),
1685
- ...(task.reads !== undefined && task.reads !== true ? { reads: task.reads } : {}),
1686
- ...(task.progress !== undefined ? { progress: task.progress } : {}),
1687
- ...(skillOverrides[index] !== undefined ? { skills: skillOverrides[index] } : {}),
1688
- ...(task.model ? { model: task.model } : {}),
1689
- }));
1690
- const modelOverrides: (string | undefined)[] = tasks.map((_, i) =>
1691
- resolveModelCandidate(behaviorOverrides[i]?.model ?? agentConfigs[i]?.model, availableModels, currentProvider),
1692
- );
1693
-
1694
- if (params.clarify === true && ctx.hasUI) {
1695
- const behaviors = agentConfigs.map((c, i) =>
1696
- resolveStepBehavior(c, behaviorOverrides[i]!),
1697
- );
1698
- const availableSkills = discoverAvailableSkills(effectiveCwd);
1699
-
1700
- const result = await ctx.ui.custom<ChainClarifyResult>(
1701
- (tui, theme, _kb, done) =>
1702
- new ChainClarifyComponent(
1703
- tui, theme,
1704
- agentConfigs,
1705
- taskTexts,
1706
- "",
1707
- undefined,
1708
- behaviors,
1709
- availableModels,
1710
- currentProvider,
1711
- availableSkills,
1712
- done,
1713
- "parallel",
1714
- ),
1715
- { overlay: true, overlayOptions: { anchor: "center", width: 84, maxHeight: "80%" } },
1716
- );
1717
-
1718
- if (!result || !result.confirmed) {
1719
- return { content: [{ type: "text", text: "Cancelled" }], details: { mode: "parallel", results: [] } };
1720
- }
1721
-
1722
- taskTexts = result.templates;
1723
- for (let i = 0; i < result.behaviorOverrides.length; i++) {
1724
- const override = result.behaviorOverrides[i];
1725
- if (override?.model) {
1726
- modelOverrides[i] = override.model;
1727
- behaviorOverrides[i]!.model = override.model;
1728
- }
1729
- if (override?.output !== undefined) behaviorOverrides[i]!.output = override.output;
1730
- if (override?.reads !== undefined) behaviorOverrides[i]!.reads = override.reads;
1731
- if (override?.progress !== undefined) behaviorOverrides[i]!.progress = override.progress;
1732
- if (override?.skills !== undefined) {
1733
- skillOverrides[i] = override.skills;
1734
- behaviorOverrides[i]!.skills = override.skills;
1735
- }
1736
- }
1737
-
1738
- if (result.runInBackground) {
1739
- if (!deps.runtime.isAsyncAvailable()) {
1740
- return {
1741
- content: [{ type: "text", text: `Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the ${APP_NAME}-subagents package dependencies are installed.` }],
1742
- isError: true,
1743
- details: { mode: "parallel" as const, results: [] },
1744
- };
1745
- }
1746
- const id = randomUUID();
1747
- const asyncCtx = {
1748
- pi: deps.pi,
1749
- cwd: ctx.cwd,
1750
- currentSessionId: deps.state.currentSessionId!,
1751
- currentModelProvider: ctx.model?.provider,
1752
- currentModel: currentModelFullId(ctx.model),
1753
- };
1754
- const parallelTasks = tasks.map((t, i) => {
1755
- const taskText = params.context === "fork" ? wrapForkTask(taskTexts[i]!) : taskTexts[i]!;
1756
- const progress = taskDisallowsFileUpdates(taskText) ? false : behaviorOverrides[i]?.progress;
1757
- return {
1758
- agent: t.agent,
1759
- task: taskText,
1760
- cwd: t.cwd,
1761
- ...(modelOverrides[i] ? { model: modelOverrides[i] } : {}),
1762
- ...(skillOverrides[i] !== undefined ? { skill: skillOverrides[i] } : {}),
1763
- ...(behaviorOverrides[i]?.output !== undefined ? { output: behaviorOverrides[i]!.output } : {}),
1764
- ...(behaviorOverrides[i]?.outputMode !== undefined ? { outputMode: behaviorOverrides[i]!.outputMode } : {}),
1765
- ...(behaviorOverrides[i]?.reads !== undefined ? { reads: behaviorOverrides[i]!.reads } : {}),
1766
- ...(progress !== undefined ? { progress } : {}),
1767
- };
1768
- });
1769
- return deps.runtime.executeAsyncChain(id, {
1770
- chain: [{ parallel: parallelTasks, concurrency: parallelConcurrency, worktree: params.worktree }],
1771
- resultMode: "parallel",
1772
- agents,
1773
- ctx: asyncCtx,
1774
- availableModels,
1775
- cwd: effectiveCwd,
1776
- maxOutput: params.maxOutput,
1777
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1778
- artifactConfig,
1779
- shareEnabled,
1780
- sessionRoot,
1781
- chainSkills: [],
1782
- sessionFilesByFlatIndex: tasks.map((_, index) => sessionFileForIndex(index)),
1783
- maxSubagentDepth: currentMaxSubagentDepth,
1784
- workflowStageSubagentGuard,
1785
- worktreeSetupHook: deps.config.worktreeSetupHook,
1786
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
1787
- controlConfig,
1788
- controlIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
1789
- childIntercomTarget: data.intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(id, agent, index) : undefined,
1790
- });
133
+ async function handleInterruptRequest(input: {
134
+ paramsWithResolvedCwd: SubagentParamsLike;
135
+ deps: ResolvedExecutorDeps;
136
+ }): Promise<SubagentToolResult> {
137
+ const { paramsWithResolvedCwd, deps } = input;
138
+ const targetRunId = paramsWithResolvedCwd.runId ?? paramsWithResolvedCwd.id;
139
+ let resolved: ResolvedSubagentRunId | undefined;
140
+ if (targetRunId) {
141
+ try {
142
+ resolved = resolveSubagentRunId(targetRunId, { state: deps.state, nested: nestedResolutionScopeForExecutor(deps) });
143
+ } catch (error) {
144
+ const message = error instanceof Error ? error.message : String(error);
145
+ return { content: [{ type: "text", text: message }], isError: true, details: { mode: "management", results: [] } };
1791
146
  }
1792
147
  }
1793
-
1794
- const behaviors = agentConfigs.map((config, index) => suppressProgressForReadOnlyTask(resolveStepBehavior(config, behaviorOverrides[index]!), taskTexts[index]));
1795
- const firstProgressIndex = behaviors.findIndex((behavior) => behavior.progress);
1796
- const liveResults: (SingleResult | undefined)[] = new Array(tasks.length).fill(undefined);
1797
- const liveProgress: (AgentProgress | undefined)[] = new Array(tasks.length).fill(undefined);
1798
- const foregroundControl = deps.state.foregroundControls.get(runId);
1799
- const { setup: worktreeSetup, errorResult } = createParallelWorktreeSetup(
1800
- params.worktree,
1801
- effectiveCwd,
1802
- runId,
1803
- tasks,
1804
- deps.config.worktreeSetupHook,
1805
- deps.config.worktreeSetupHookTimeoutMs,
1806
- );
1807
- if (errorResult) return errorResult;
1808
-
1809
- try {
1810
- const duplicateOutputError = findDuplicateParallelOutputPath({
1811
- tasks,
1812
- behaviors,
1813
- paramsCwd: effectiveCwd,
1814
- ctxCwd: ctx.cwd,
1815
- worktreeSetup,
1816
- });
1817
- if (duplicateOutputError) return buildParallelModeError(duplicateOutputError);
1818
- for (let index = 0; index < tasks.length; index++) {
1819
- const taskCwd = resolveParallelTaskCwd(tasks[index]!, effectiveCwd, worktreeSetup, index);
1820
- const outputPath = resolveSingleOutputPath(behaviors[index]?.output, ctx.cwd, taskCwd);
1821
- const validationError = validateFileOnlyOutputMode(behaviors[index]?.outputMode, outputPath, `Parallel task ${index + 1} (${tasks[index]!.agent})`);
1822
- if (validationError) return buildParallelModeError(validationError);
1823
- }
1824
-
1825
- const parallelProgressPrecreated = firstProgressIndex !== -1;
1826
- if (parallelProgressPrecreated) writeInitialProgressFile(effectiveCwd);
1827
-
1828
- if (params.context === "fork") {
1829
- for (let i = 0; i < taskTexts.length; i++) {
1830
- taskTexts[i] = wrapForkTask(taskTexts[i]!);
1831
- }
1832
- }
1833
-
1834
- const results = await runForegroundParallelTasks({
1835
- tasks,
1836
- taskTexts,
1837
- agents,
1838
- ctx,
1839
- intercomEvents: deps.pi.events,
1840
- signal,
1841
- runId,
1842
- sessionDirForIndex,
1843
- sessionFileForIndex,
1844
- shareEnabled,
1845
- artifactConfig,
1846
- artifactsDir,
1847
- maxOutput: params.maxOutput,
1848
- paramsCwd: effectiveCwd,
1849
- workflowStageSubagentGuard,
1850
- availableModels,
1851
- modelOverrides,
1852
- behaviors,
1853
- firstProgressIndex: parallelProgressPrecreated ? -1 : firstProgressIndex,
1854
- controlConfig,
1855
- onControlEvent,
1856
- childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(runId, agent, index) : undefined,
1857
- orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
1858
- foregroundControl,
1859
- concurrencyLimit: parallelConcurrency,
1860
- maxSubagentDepths,
1861
- liveResults,
1862
- liveProgress,
1863
- onUpdate,
1864
- worktreeSetup,
1865
- runtime: deps.runtime,
1866
- });
1867
- for (let i = 0; i < results.length; i++) {
1868
- const run = results[i]!;
1869
- recordRun(run.agent, taskTexts[i]!, run.exitCode, run.progressSummary?.durationMs ?? 0);
1870
- }
1871
-
1872
- for (const result of results) {
1873
- if (result.progress) allProgress.push(result.progress);
1874
- if (result.artifactPaths) allArtifactPaths.push(result.artifactPaths);
1875
- }
1876
-
1877
- const interrupted = results.find((result) => result.interrupted);
1878
- const details = compactForegroundDetails({
1879
- mode: "parallel",
1880
- runId,
1881
- results,
1882
- progress: params.includeProgress ? allProgress : undefined,
1883
- artifacts: allArtifactPaths.length ? { dir: artifactsDir, files: allArtifactPaths } : undefined,
1884
- });
1885
- rememberForegroundRun(deps.state, { runId, mode: "parallel", cwd: effectiveCwd, results: details.results });
148
+ if (resolved?.kind === "nested") return interruptNestedRun(resolved);
149
+ const foreground = getForegroundControl(deps.state, resolved?.kind === "foreground" ? resolved.id : targetRunId);
150
+ if (foreground?.interrupt) {
151
+ const interrupted = foreground.interrupt();
1886
152
  if (interrupted) {
153
+ foreground.updatedAt = Date.now();
154
+ foreground.currentActivityState = undefined;
1887
155
  return {
1888
- content: [{ type: "text", text: `Parallel run paused after interrupt (${interrupted.agent}). Waiting for explicit next action.` }],
1889
- details,
1890
- };
1891
- }
1892
- const detachedIndex = results.findIndex((result) => result.detached);
1893
- const detached = detachedIndex >= 0 ? results[detachedIndex] : undefined;
1894
- if (detached) {
1895
- return {
1896
- content: [{ type: "text", text: `Parallel run detached for intercom coordination (${detached.agent}). Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.` }],
1897
- details,
1898
- };
1899
- }
1900
-
1901
- if (foregroundControl) updateForegroundNestedProjection(foregroundControl);
1902
- const intercomReceipt = await maybeBuildForegroundIntercomReceipt({
1903
- pi: deps.pi,
1904
- intercomBridge: data.intercomBridge,
1905
- runId,
1906
- mode: "parallel",
1907
- details,
1908
- ...(foregroundControl?.nestedChildren?.length ? { nestedChildren: foregroundControl.nestedChildren } : {}),
1909
- });
1910
- if (intercomReceipt) {
1911
- return {
1912
- content: [{ type: "text", text: intercomReceipt.text }],
1913
- details: intercomReceipt.details,
156
+ content: [{ type: "text", text: `Interrupt requested for foreground run ${foreground.runId}.` }],
157
+ details: { mode: "management", results: [] },
1914
158
  };
1915
159
  }
1916
-
1917
- const worktreeSuffix = buildParallelWorktreeSuffix(worktreeSetup, artifactsDir, tasks);
1918
- const ok = results.filter((result) => result.exitCode === 0).length;
1919
- const downgradeNote = backgroundRequestedWhileClarifying ? " (background requested, but clarify kept this run foreground)" : "";
1920
- const aggregatedOutput = aggregateParallelOutputs(
1921
- results.map((result) => ({
1922
- agent: result.agent,
1923
- output: result.truncation?.text || getSingleResultOutput(result),
1924
- exitCode: result.exitCode,
1925
- error: result.error,
1926
- })),
1927
- (i, agent) => `=== Task ${i + 1}: ${agent} ===`,
1928
- );
1929
-
1930
- const summary = `${ok}/${results.length} succeeded${downgradeNote}`;
1931
- const fullContent = worktreeSuffix
1932
- ? `${summary}\n\n${aggregatedOutput}\n\n${worktreeSuffix}`
1933
- : `${summary}\n\n${aggregatedOutput}`;
1934
-
1935
- return {
1936
- content: [{ type: "text", text: fullContent }],
1937
- details,
1938
- };
1939
- } finally {
1940
- if (worktreeSetup) cleanupWorktrees(worktreeSetup);
1941
- }
1942
- }
1943
-
1944
- async function runSinglePath(data: ExecutionContextData, deps: ResolvedExecutorDeps): Promise<SubagentToolResult> {
1945
- const {
1946
- params,
1947
- effectiveCwd,
1948
- agents,
1949
- ctx,
1950
- signal,
1951
- runId,
1952
- sessionDirForIndex,
1953
- sessionFileForIndex,
1954
- shareEnabled,
1955
- artifactConfig,
1956
- artifactsDir,
1957
- onUpdate,
1958
- sessionRoot,
1959
- controlConfig,
1960
- } = data;
1961
- const onControlEvent = createForegroundControlNotifier(data, deps);
1962
- const childIntercomTarget = data.intercomBridge.active ? resolveSubagentIntercomTarget(runId, params.agent!, 0) : undefined;
1963
- const allProgress: AgentProgress[] = [];
1964
- const allArtifactPaths: ArtifactPaths[] = [];
1965
- const agentConfig = agents.find((a) => a.name === params.agent);
1966
- if (!agentConfig) {
1967
160
  return {
1968
- content: [{ type: "text", text: `Unknown agent: ${params.agent}` }],
161
+ content: [{ type: "text", text: `Foreground run ${foreground.runId} has no active child step to interrupt.` }],
1969
162
  isError: true,
1970
- details: { mode: "single", results: [] },
1971
- };
1972
- }
1973
-
1974
- const currentProvider = ctx.model?.provider;
1975
- const availableModels: ModelInfo[] = ctx.modelRegistry.getAvailable().map(toModelInfo);
1976
- let task = params.task ?? "";
1977
- let modelOverride: string | undefined = resolveModelCandidate(
1978
- (params.model as string | undefined) ?? agentConfig.model,
1979
- availableModels,
1980
- currentProvider,
1981
- );
1982
- let skillOverride: string[] | false | undefined = normalizeSkillInput(params.skill);
1983
- const rawOutput = params.output !== undefined ? params.output : agentConfig.output;
1984
- let effectiveOutput = normalizeSingleOutputOverride(rawOutput, agentConfig.output);
1985
- const effectiveOutputMode = params.outputMode ?? "inline";
1986
- const depthPolicy = resolveSubagentDepthPolicy(ctx, deps.config.maxSubagentDepth);
1987
- const currentMaxSubagentDepth = depthPolicy.maxSubagentDepth;
1988
- const workflowStageSubagentGuard = depthPolicy.workflowStageSubagentGuard;
1989
- const maxSubagentDepth = resolveChildMaxSubagentDepth(currentMaxSubagentDepth, agentConfig.maxSubagentDepth);
1990
-
1991
- if (params.clarify === true && ctx.hasUI) {
1992
- const behavior = resolveStepBehavior(agentConfig, { output: effectiveOutput, skills: skillOverride });
1993
- const availableSkills = discoverAvailableSkills(effectiveCwd);
1994
-
1995
- const result = await ctx.ui.custom<ChainClarifyResult>(
1996
- (tui, theme, _kb, done) =>
1997
- new ChainClarifyComponent(
1998
- tui, theme,
1999
- [agentConfig],
2000
- [task],
2001
- task,
2002
- undefined,
2003
- [behavior],
2004
- availableModels,
2005
- currentProvider,
2006
- availableSkills,
2007
- done,
2008
- "single",
2009
- ),
2010
- { overlay: true, overlayOptions: { anchor: "center", width: 84, maxHeight: "80%" } },
2011
- );
2012
-
2013
- if (!result || !result.confirmed) {
2014
- return { content: [{ type: "text", text: "Cancelled" }], details: { mode: "single", results: [] } };
2015
- }
2016
-
2017
- task = result.templates[0]!;
2018
- const override = result.behaviorOverrides[0];
2019
- if (override?.model) modelOverride = override.model;
2020
- if (override?.output !== undefined) effectiveOutput = normalizeSingleOutputOverride(override.output, agentConfig.output);
2021
- if (override?.skills !== undefined) skillOverride = override.skills;
2022
-
2023
- if (result.runInBackground) {
2024
- if (!deps.runtime.isAsyncAvailable()) {
2025
- return {
2026
- content: [{ type: "text", text: `Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the ${APP_NAME}-subagents package dependencies are installed.` }],
2027
- isError: true,
2028
- details: { mode: "single" as const, results: [] },
2029
- };
2030
- }
2031
- const id = randomUUID();
2032
- const asyncCtx = {
2033
- pi: deps.pi,
2034
- cwd: ctx.cwd,
2035
- currentSessionId: deps.state.currentSessionId!,
2036
- currentModelProvider: ctx.model?.provider,
2037
- currentModel: currentModelFullId(ctx.model),
2038
- };
2039
- return deps.runtime.executeAsyncSingle(id, {
2040
- agent: params.agent!,
2041
- task: params.context === "fork" ? wrapForkTask(task) : task,
2042
- agentConfig,
2043
- ctx: asyncCtx,
2044
- availableModels,
2045
- cwd: effectiveCwd,
2046
- maxOutput: params.maxOutput,
2047
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
2048
- artifactConfig,
2049
- shareEnabled,
2050
- sessionRoot,
2051
- sessionFile: sessionFileForIndex(0),
2052
- skills: skillOverride === false ? [] : skillOverride,
2053
- output: effectiveOutput,
2054
- outputMode: effectiveOutputMode,
2055
- modelOverride,
2056
- maxSubagentDepth,
2057
- workflowStageSubagentGuard,
2058
- worktreeSetupHook: deps.config.worktreeSetupHook,
2059
- worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
2060
- controlConfig,
2061
- controlIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
2062
- childIntercomTarget: data.intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(id, agent, index) : undefined,
2063
- });
2064
- }
2065
- }
2066
-
2067
- if (params.context === "fork") {
2068
- task = wrapForkTask(task);
2069
- }
2070
- const cleanTask = task;
2071
- const outputPath = resolveSingleOutputPath(effectiveOutput, ctx.cwd, effectiveCwd);
2072
- const validationError = validateFileOnlyOutputMode(effectiveOutputMode, outputPath, `Single run (${params.agent})`);
2073
- if (validationError) {
2074
- return { content: [{ type: "text", text: validationError }], isError: true, details: { mode: "single", results: [] } };
2075
- }
2076
- task = injectSingleOutputInstruction(task, outputPath);
2077
-
2078
- let effectiveSkills: string[] | undefined;
2079
- if (skillOverride === false) {
2080
- effectiveSkills = [];
2081
- } else {
2082
- effectiveSkills = skillOverride;
2083
- }
2084
- const interruptController = new AbortController();
2085
- const foregroundControl = deps.state.foregroundControls.get(runId);
2086
- if (foregroundControl) {
2087
- foregroundControl.currentAgent = params.agent;
2088
- foregroundControl.currentIndex = 0;
2089
- foregroundControl.currentActivityState = undefined;
2090
- foregroundControl.updatedAt = Date.now();
2091
- foregroundControl.interrupt = () => {
2092
- if (interruptController.signal.aborted) return false;
2093
- interruptController.abort();
2094
- foregroundControl.currentActivityState = undefined;
2095
- foregroundControl.updatedAt = Date.now();
2096
- return true;
2097
- };
2098
- }
2099
-
2100
- const forwardSingleUpdate = onUpdate
2101
- ? (update: SubagentToolResult) => {
2102
- if (foregroundControl) {
2103
- const firstProgress = update.details?.progress?.[0];
2104
- foregroundControl.currentAgent = params.agent;
2105
- foregroundControl.currentIndex = firstProgress?.index ?? 0;
2106
- foregroundControl.currentActivityState = firstProgress?.activityState;
2107
- foregroundControl.lastActivityAt = firstProgress?.lastActivityAt;
2108
- foregroundControl.currentTool = firstProgress?.currentTool;
2109
- foregroundControl.currentToolStartedAt = firstProgress?.currentToolStartedAt;
2110
- foregroundControl.currentPath = firstProgress?.currentPath;
2111
- foregroundControl.turnCount = firstProgress?.turnCount;
2112
- foregroundControl.tokens = firstProgress?.tokens;
2113
- foregroundControl.toolCount = firstProgress?.toolCount;
2114
- foregroundControl.updatedAt = Date.now();
2115
- }
2116
- onUpdate(update);
2117
- }
2118
- : undefined;
2119
-
2120
- const r = await deps.runtime.runSync(ctx.cwd, agents, params.agent!, task, {
2121
- cwd: effectiveCwd,
2122
- signal,
2123
- interruptSignal: interruptController.signal,
2124
- allowIntercomDetach: agentConfig.systemPrompt?.includes(INTERCOM_BRIDGE_MARKER) === true,
2125
- intercomEvents: deps.pi.events,
2126
- runId,
2127
- sessionDir: sessionDirForIndex(0),
2128
- sessionFile: sessionFileForIndex(0),
2129
- share: shareEnabled,
2130
- artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
2131
- artifactConfig,
2132
- maxOutput: params.maxOutput,
2133
- outputPath,
2134
- outputMode: effectiveOutputMode,
2135
- maxSubagentDepth,
2136
- workflowStageSubagentGuard,
2137
- onUpdate: forwardSingleUpdate,
2138
- controlConfig,
2139
- onControlEvent,
2140
- intercomSessionName: childIntercomTarget,
2141
- orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
2142
- nestedRoute: foregroundControl?.nestedRoute,
2143
- index: 0,
2144
- modelOverride,
2145
- availableModels,
2146
- preferredModelProvider: currentProvider,
2147
- currentModel: currentModelFullId(ctx.model),
2148
- skills: effectiveSkills,
2149
- });
2150
- if (foregroundControl?.currentIndex === 0) {
2151
- foregroundControl.interrupt = undefined;
2152
- foregroundControl.currentActivityState = r.progress?.activityState;
2153
- foregroundControl.lastActivityAt = r.progress?.lastActivityAt;
2154
- foregroundControl.currentTool = r.progress?.currentTool;
2155
- foregroundControl.currentToolStartedAt = r.progress?.currentToolStartedAt;
2156
- foregroundControl.currentPath = r.progress?.currentPath;
2157
- foregroundControl.turnCount = r.progress?.turnCount;
2158
- foregroundControl.tokens = r.progress?.tokens;
2159
- foregroundControl.toolCount = r.progress?.toolCount;
2160
- foregroundControl.updatedAt = Date.now();
2161
- }
2162
- recordRun(params.agent!, cleanTask, r.exitCode, r.progressSummary?.durationMs ?? 0);
2163
-
2164
- if (r.progress) allProgress.push(r.progress);
2165
- if (r.artifactPaths) allArtifactPaths.push(r.artifactPaths);
2166
-
2167
- const fullOutput = getSingleResultOutput(r);
2168
- const finalizedOutput = finalizeSingleOutput({
2169
- fullOutput,
2170
- truncatedOutput: r.truncation?.text,
2171
- outputPath,
2172
- outputMode: r.outputMode,
2173
- exitCode: r.exitCode,
2174
- savedPath: r.savedOutputPath,
2175
- outputReference: r.outputReference,
2176
- saveError: r.outputSaveError,
2177
- });
2178
- const details = compactForegroundDetails({
2179
- mode: "single",
2180
- runId,
2181
- results: [r],
2182
- progress: params.includeProgress ? allProgress : undefined,
2183
- artifacts: allArtifactPaths.length ? { dir: artifactsDir, files: allArtifactPaths } : undefined,
2184
- truncation: r.truncation,
2185
- });
2186
- rememberForegroundRun(deps.state, { runId, mode: "single", cwd: effectiveCwd, results: details.results });
2187
-
2188
- if (!r.detached && !r.interrupted) {
2189
- if (foregroundControl) updateForegroundNestedProjection(foregroundControl);
2190
- const intercomReceipt = await maybeBuildForegroundIntercomReceipt({
2191
- pi: deps.pi,
2192
- intercomBridge: data.intercomBridge,
2193
- runId,
2194
- mode: "single",
2195
- details,
2196
- ...(foregroundControl?.nestedChildren?.length ? { nestedChildren: foregroundControl.nestedChildren } : {}),
2197
- });
2198
- if (intercomReceipt) {
2199
- return {
2200
- content: [{ type: "text", text: intercomReceipt.text }],
2201
- details: intercomReceipt.details,
2202
- ...(r.exitCode !== 0 ? { isError: true } : {}),
2203
- };
2204
- }
2205
- }
2206
-
2207
- if (r.detached) {
2208
- return {
2209
- content: [{ type: "text", text: `Detached for intercom coordination: ${params.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.` }],
2210
- details,
2211
- };
2212
- }
2213
-
2214
- if (r.interrupted) {
2215
- return {
2216
- content: [{ type: "text", text: `Run paused after interrupt (${params.agent}). Waiting for explicit next action.` }],
2217
- details,
163
+ details: { mode: "management", results: [] },
2218
164
  };
2219
165
  }
2220
-
2221
- if (r.exitCode !== 0)
2222
- return {
2223
- content: [{ type: "text", text: r.error || "Failed" }],
2224
- details,
2225
- isError: true,
2226
- };
166
+ const asyncInterruptResult = interruptAsyncRun(deps.state, resolved?.kind === "async" ? resolved.id : targetRunId);
167
+ if (asyncInterruptResult) return asyncInterruptResult;
2227
168
  return {
2228
- content: [{ type: "text", text: finalizedOutput.displayOutput || "(no output)" }],
2229
- details,
169
+ content: [{ type: "text", text: "No interrupt-capable run found in this session." }],
170
+ isError: true,
171
+ details: { mode: "management", results: [] },
2230
172
  };
2231
173
  }
2232
174
 
@@ -2254,361 +196,47 @@ export function createSubagentExecutor(rawDeps: ExecutorDeps): {
2254
196
  const requestCwd = resolveRequestedCwd(ctx.cwd, params.cwd);
2255
197
  const paramsWithResolvedCwd = params.cwd === undefined ? params : { ...params, cwd: requestCwd };
2256
198
  if (params.action) {
2257
- if (params.action === "doctor") {
2258
- let currentSessionFile: string | null = null;
2259
- let currentSessionId = deps.state.currentSessionId;
2260
- let sessionError: string | undefined;
2261
- try {
2262
- currentSessionFile = ctx.sessionManager.getSessionFile() ?? null;
2263
- currentSessionId = ctx.sessionManager.getSessionId();
2264
- } catch (error) {
2265
- sessionError = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
2266
- }
2267
- let orchestratorTarget: string | undefined;
2268
- try {
2269
- orchestratorTarget = resolveIntercomSessionTarget(deps.pi.getSessionName(), ctx.sessionManager.getSessionId());
2270
- } catch {}
2271
- return {
2272
- content: [{
2273
- type: "text",
2274
- text: buildDoctorReport({
2275
- cwd: requestCwd,
2276
- config: deps.config,
2277
- state: deps.state,
2278
- context: paramsWithResolvedCwd.context,
2279
- requestedSessionDir: paramsWithResolvedCwd.sessionDir,
2280
- currentSessionFile,
2281
- currentSessionId,
2282
- orchestratorTarget,
2283
- sessionError,
2284
- expandTilde: deps.expandTilde,
2285
- }),
2286
- }],
2287
- details: { mode: "management", results: [] },
2288
- };
2289
- }
2290
- if (params.action === "status") {
2291
- const targetRunId = paramsWithResolvedCwd.id ?? paramsWithResolvedCwd.runId;
2292
- if (targetRunId) {
2293
- try {
2294
- const nestedScope = nestedResolutionScopeForExecutor(deps);
2295
- const resolved = resolveSubagentRunId(targetRunId, { state: deps.state, nested: nestedScope });
2296
- if (resolved?.kind === "foreground") {
2297
- const foreground = getForegroundControl(deps.state, resolved.id);
2298
- if (foreground) return foregroundStatusResult(foreground);
2299
- }
2300
- } catch (error) {
2301
- const message = error instanceof Error ? error.message : String(error);
2302
- return { content: [{ type: "text", text: message }], isError: true, details: { mode: "management", results: [] } };
2303
- }
2304
- } else {
2305
- const foreground = getForegroundControl(deps.state, undefined);
2306
- if (foreground) return foregroundStatusResult(foreground);
2307
- }
2308
- return inspectSubagentStatus({
2309
- action: "status",
2310
- id: paramsWithResolvedCwd.id,
2311
- runId: paramsWithResolvedCwd.runId,
2312
- dir: paramsWithResolvedCwd.dir,
2313
- }, { state: deps.state, nested: nestedResolutionScopeForExecutor(deps) });
2314
- }
2315
- if (params.action === "resume") {
2316
- return resumeAsyncRun({ params: paramsWithResolvedCwd, requestCwd, ctx, deps });
2317
- }
2318
- if (params.action === "interrupt") {
2319
- const targetRunId = paramsWithResolvedCwd.runId ?? paramsWithResolvedCwd.id;
2320
- let resolved: ResolvedSubagentRunId | undefined;
2321
- if (targetRunId) {
2322
- try {
2323
- resolved = resolveSubagentRunId(targetRunId, { state: deps.state, nested: nestedResolutionScopeForExecutor(deps) });
2324
- } catch (error) {
2325
- const message = error instanceof Error ? error.message : String(error);
2326
- return { content: [{ type: "text", text: message }], isError: true, details: { mode: "management", results: [] } };
2327
- }
2328
- }
2329
- if (resolved?.kind === "nested") return interruptNestedRun(resolved);
2330
- const foreground = getForegroundControl(deps.state, resolved?.kind === "foreground" ? resolved.id : targetRunId);
2331
- if (foreground?.interrupt) {
2332
- const interrupted = foreground.interrupt();
2333
- if (interrupted) {
2334
- foreground.updatedAt = Date.now();
2335
- foreground.currentActivityState = undefined;
2336
- return {
2337
- content: [{ type: "text", text: `Interrupt requested for foreground run ${foreground.runId}.` }],
2338
- details: { mode: "management", results: [] },
2339
- };
2340
- }
2341
- return {
2342
- content: [{ type: "text", text: `Foreground run ${foreground.runId} has no active child step to interrupt.` }],
2343
- isError: true,
2344
- details: { mode: "management", results: [] },
2345
- };
2346
- }
2347
- const asyncInterruptResult = interruptAsyncRun(deps.state, resolved?.kind === "async" ? resolved.id : targetRunId);
2348
- if (asyncInterruptResult) return asyncInterruptResult;
2349
- return {
2350
- content: [{ type: "text", text: "No interrupt-capable run found in this session." }],
2351
- isError: true,
2352
- details: { mode: "management", results: [] },
2353
- };
2354
- }
2355
- if (!(SUBAGENT_ACTIONS as readonly string[]).includes(params.action)) {
2356
- return {
2357
- content: [{ type: "text", text: `Unknown action: ${params.action}. Valid: ${SUBAGENT_ACTIONS.join(", ")}` }],
2358
- isError: true,
2359
- details: { mode: "management" as const, results: [] },
2360
- };
2361
- }
2362
- if (deps.allowMutatingManagementActions === false && MUTATING_MANAGEMENT_ACTIONS.has(params.action)) {
2363
- return {
2364
- content: [{ type: "text", text: `Action '${params.action}' is not available from child-safe subagent fanout mode.` }],
2365
- isError: true,
2366
- details: { mode: "management" as const, results: [] },
2367
- };
2368
- }
2369
- return handleManagementAction(params.action, paramsWithResolvedCwd, { ...ctx, cwd: requestCwd });
2370
- }
2371
-
2372
- const depthPolicy = resolveSubagentDepthPolicy(ctx, deps.config.maxSubagentDepth);
2373
- const { blocked, depth, maxDepth, workflowStageGuard } = checkSubagentDepth(depthPolicy.maxSubagentDepth);
2374
- const workflowStageSubagentGuard = workflowStageGuard || depthPolicy.workflowStageSubagentGuard;
2375
- if (blocked) {
2376
- return {
2377
- content: [
2378
- {
2379
- type: "text",
2380
- text: subagentDepthBlockedMessage(depth, maxDepth, { workflowStageGuard: workflowStageSubagentGuard }),
2381
- },
2382
- ],
2383
- isError: true,
2384
- details: { mode: "single" as const, results: [] },
2385
- };
199
+ return handleManagementRequest({ params, paramsWithResolvedCwd, requestCwd, ctx, deps });
2386
200
  }
2387
201
 
2388
- const normalized = normalizeRepeatedParallelCounts(paramsWithResolvedCwd);
2389
- if (normalized.error) return normalized.error;
2390
- const normalizedParams = normalized.params!;
2391
-
2392
- let effectiveParams = applyForceTopLevelAsyncOverride(
2393
- normalizedParams,
2394
- depth,
2395
- deps.config.forceTopLevelAsync === true,
2396
- );
2397
-
2398
- const scope: AgentScope = resolveExecutionAgentScope(effectiveParams.agentScope);
2399
- const effectiveCwd = effectiveParams.cwd ?? ctx.cwd;
2400
- const parentSessionFile = ctx.sessionManager.getSessionFile() ?? null;
2401
- deps.state.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);
2402
- const discoveredAgents = deps.discoverAgents(effectiveCwd, scope).agents;
2403
- effectiveParams = applyAgentDefaultContext(effectiveParams, discoveredAgents);
2404
- const sessionName = resolveIntercomSessionTarget(deps.pi.getSessionName(), ctx.sessionManager.getSessionId());
2405
- const intercomBridge = resolveIntercomBridge({
2406
- config: deps.config.intercomBridge,
2407
- context: effectiveParams.context,
2408
- orchestratorTarget: sessionName,
2409
- cwd: effectiveCwd,
2410
- });
2411
- const agents = intercomBridge.active
2412
- ? discoveredAgents.map((agent) => applyIntercomBridgeToAgent(agent, intercomBridge))
2413
- : discoveredAgents;
2414
- const runId = randomUUID().slice(0, 8);
2415
- const inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();
2416
- const nestedParentAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;
2417
- const nestedRoute = inheritedNestedRoute ?? createNestedRoute(runId);
2418
- const shareEnabled = effectiveParams.share === true;
2419
- const hasChain = (effectiveParams.chain?.length ?? 0) > 0;
2420
- const hasTasks = (effectiveParams.tasks?.length ?? 0) > 0;
2421
- const hasSingle = !hasChain && !hasTasks && Boolean(effectiveParams.agent);
2422
- const allowClarifyTaskPrompt = hasChain
2423
- && effectiveParams.clarify === true
2424
- && ctx.hasUI
2425
- && !(effectiveParams.chain?.some(isParallelStep) ?? false);
2426
-
2427
- const validationError = validateExecutionInput(
2428
- effectiveParams,
2429
- agents,
2430
- hasChain,
2431
- hasTasks,
2432
- hasSingle,
2433
- allowClarifyTaskPrompt,
2434
- );
2435
- if (validationError) return validationError;
2436
-
2437
- let sessionFileForIndex: (idx?: number) => string | undefined = () => undefined;
2438
- try {
2439
- sessionFileForIndex = createForkContextResolver(ctx.sessionManager, effectiveParams.context).sessionFileForIndex;
2440
- } catch (error) {
2441
- return toExecutionErrorResult(effectiveParams, error);
2442
- }
2443
- const requestedAsync = effectiveParams.async ?? deps.asyncByDefault;
2444
- const backgroundRequestedWhileClarifying = (hasChain || hasTasks) && requestedAsync && effectiveParams.clarify === true;
2445
- const effectiveAsync = requestedAsync && effectiveParams.clarify !== true;
2446
- const controlConfig = resolveControlConfig(deps.config.control, effectiveParams.control);
2447
-
2448
- const artifactConfig: ArtifactConfig = {
2449
- ...DEFAULT_ARTIFACT_CONFIG,
2450
- enabled: effectiveParams.artifacts !== false,
2451
- };
2452
- const artifactsDir = effectiveAsync ? deps.tempArtifactsDir : getArtifactsDir(parentSessionFile);
2453
-
2454
- let sessionRoot: string;
2455
- if (effectiveParams.sessionDir) {
2456
- sessionRoot = path.resolve(deps.expandTilde(effectiveParams.sessionDir));
2457
- } else {
2458
- const baseSessionRoot = deps.config.defaultSessionDir
2459
- ? path.resolve(deps.expandTilde(deps.config.defaultSessionDir))
2460
- : deps.getSubagentSessionRoot(parentSessionFile);
2461
- sessionRoot = path.join(baseSessionRoot, runId);
2462
- }
2463
- try {
2464
- fs.mkdirSync(sessionRoot, { recursive: true });
2465
- } catch (error) {
2466
- const message = error instanceof Error ? error.message : String(error);
2467
- return toExecutionErrorResult(
2468
- effectiveParams,
2469
- new Error(`Failed to create session directory '${sessionRoot}': ${message}`),
2470
- );
2471
- }
2472
- const sessionDirForIndex = (idx?: number) =>
2473
- path.join(sessionRoot, `run-${idx ?? 0}`);
2474
- const childSessionFileForIndex = (idx?: number) =>
2475
- sessionFileForIndex(idx) ?? path.join(sessionDirForIndex(idx), "session.jsonl");
2476
-
2477
- const onUpdateWithContext = onUpdate
2478
- ? (r: SubagentToolResult) => onUpdate(withForkContext(r, effectiveParams.context))
2479
- : undefined;
2480
-
2481
- const execData: ExecutionContextData = {
2482
- params: effectiveParams,
2483
- effectiveCwd,
2484
- ctx,
2485
- signal,
2486
- onUpdate: onUpdateWithContext,
2487
- agents,
2488
- runId,
2489
- shareEnabled,
2490
- sessionRoot,
2491
- sessionDirForIndex,
2492
- sessionFileForIndex: childSessionFileForIndex,
2493
- artifactConfig,
2494
- artifactsDir,
2495
- backgroundRequestedWhileClarifying,
2496
- effectiveAsync,
2497
- controlConfig,
2498
- intercomBridge,
2499
- nestedRoute,
2500
- };
2501
-
2502
- const foregroundMode: "single" | "parallel" | "chain" = hasChain ? "chain" : hasTasks ? "parallel" : "single";
2503
- const foregroundControl = effectiveAsync
2504
- ? undefined
2505
- : {
2506
- runId,
2507
- mode: foregroundMode,
2508
- startedAt: Date.now(),
2509
- updatedAt: Date.now(),
2510
- currentAgent: undefined,
2511
- currentIndex: undefined,
2512
- currentActivityState: undefined,
2513
- nestedRoute,
2514
- interrupt: undefined,
2515
- };
2516
- if (foregroundControl) {
2517
- deps.state.foregroundControls.set(runId, foregroundControl);
2518
- deps.state.lastForegroundControlId = runId;
2519
- }
2520
-
2521
- const writeNestedForegroundEvent = (type: "subagent.nested.started" | "subagent.nested.completed", result?: SubagentToolResult): void => {
2522
- if (!inheritedNestedRoute || !nestedParentAddress) return;
2523
- const now = Date.now();
2524
- const details = result?.details;
2525
- const state = type === "subagent.nested.started"
2526
- ? "running"
2527
- : result?.isError || details?.results.some((child) => child.exitCode !== 0)
2528
- ? "failed"
2529
- : details?.results.some((child) => child.interrupted)
2530
- ? "paused"
2531
- : "complete";
2532
- const errorText = result?.isError
2533
- ? result.content.find((item) => item.type === "text")?.text
2534
- : undefined;
2535
- const agentsForSummary = hasTasks && effectiveParams.tasks
2536
- ? effectiveParams.tasks.map((task) => task.agent)
2537
- : hasChain && effectiveParams.chain
2538
- ? effectiveParams.chain.flatMap((step) => isParallelStep(step) ? step.parallel.map((task) => task.agent) : [(step as SequentialStep).agent])
2539
- : effectiveParams.agent ? [effectiveParams.agent] : [];
2540
- const leafIntercomTarget = intercomBridge.active && agentsForSummary[0]
2541
- ? resolveSubagentIntercomTarget(runId, agentsForSummary[0], 0)
2542
- : undefined;
2543
- try {
2544
- writeNestedEvent(inheritedNestedRoute, {
2545
- type,
2546
- ts: now,
2547
- parentRunId: nestedParentAddress.parentRunId,
2548
- parentStepIndex: nestedParentAddress.parentStepIndex,
2549
- child: {
2550
- id: runId,
2551
- parentRunId: nestedParentAddress.parentRunId,
2552
- parentStepIndex: nestedParentAddress.parentStepIndex,
2553
- depth: nestedParentAddress.depth,
2554
- path: nestedParentAddress.path,
2555
- ownerIntercomTarget: getEnvValue(SUBAGENT_INTERCOM_SESSION_NAME_ENV),
2556
- leafIntercomTarget,
2557
- intercomTarget: leafIntercomTarget,
2558
- ownerState: state === "running" ? "live" : "gone",
2559
- mode: foregroundMode,
2560
- state,
2561
- agent: agentsForSummary[0],
2562
- agents: agentsForSummary,
2563
- startedAt: foregroundControl?.startedAt ?? now,
2564
- ...(state !== "running" ? { endedAt: now } : {}),
2565
- lastUpdate: now,
2566
- ...(errorText ? { error: errorText } : {}),
2567
- ...(details?.results.length ? { steps: details.results.map((child) => ({
2568
- agent: child.agent,
2569
- status: child.interrupted ? "paused" : child.exitCode === 0 ? "complete" : "failed",
2570
- ...(child.sessionFile ? { sessionFile: child.sessionFile } : {}),
2571
- ...(child.error ? { error: child.error } : {}),
2572
- })) } : {}),
2573
- },
2574
- });
2575
- } catch (error) {
2576
- console.error("Failed to emit nested foreground status event:", error);
2577
- }
2578
- };
202
+ const depthError = checkDepthForExecution(ctx, deps);
203
+ if (depthError) return depthError;
2579
204
 
205
+ const built = prepareExecutionContext({ params: paramsWithResolvedCwd, ctx, signal, onUpdate, deps });
206
+ if (built.error) return built.error;
207
+ const prepared = built.prepared!;
2580
208
  let nestedForegroundStarted = false;
2581
209
  try {
2582
- const asyncResult = runAsyncPath(execData, deps);
2583
- if (asyncResult) return withForkContext(asyncResult, effectiveParams.context);
2584
- if (foregroundControl) {
2585
- writeNestedForegroundEvent("subagent.nested.started");
210
+ const asyncResult = runAsyncPath(prepared.execData, deps);
211
+ if (asyncResult) return withForkContext(asyncResult, prepared.effectiveParams.context);
212
+ if (prepared.foregroundControl) {
213
+ prepared.writeNestedForegroundEvent("subagent.nested.started");
2586
214
  nestedForegroundStarted = true;
2587
215
  }
2588
- if (hasChain && effectiveParams.chain) {
2589
- const result = await runChainPath(execData, deps);
2590
- writeNestedForegroundEvent("subagent.nested.completed", result);
2591
- return withForkContext(result, effectiveParams.context);
216
+ if (prepared.hasChain && prepared.effectiveParams.chain) {
217
+ const result = await runChainPath(prepared.execData, deps);
218
+ prepared.writeNestedForegroundEvent("subagent.nested.completed", result);
219
+ return withForkContext(result, prepared.effectiveParams.context);
2592
220
  }
2593
- if (hasTasks && effectiveParams.tasks) {
2594
- const result = await runParallelPath(execData, deps);
2595
- writeNestedForegroundEvent("subagent.nested.completed", result);
2596
- return withForkContext(result, effectiveParams.context);
221
+ if (prepared.hasTasks && prepared.effectiveParams.tasks) {
222
+ const result = await runParallelPath(prepared.execData, deps);
223
+ prepared.writeNestedForegroundEvent("subagent.nested.completed", result);
224
+ return withForkContext(result, prepared.effectiveParams.context);
2597
225
  }
2598
- if (hasSingle) {
2599
- const result = await runSinglePath(execData, deps);
2600
- writeNestedForegroundEvent("subagent.nested.completed", result);
2601
- return withForkContext(result, effectiveParams.context);
226
+ if (prepared.hasSingle) {
227
+ const result = await runSinglePath(prepared.execData, deps);
228
+ prepared.writeNestedForegroundEvent("subagent.nested.completed", result);
229
+ return withForkContext(result, prepared.effectiveParams.context);
2602
230
  }
2603
231
  } catch (error) {
2604
- const errorResult = toExecutionErrorResult(effectiveParams, error);
2605
- if (nestedForegroundStarted) writeNestedForegroundEvent("subagent.nested.completed", errorResult);
232
+ const errorResult = toExecutionErrorResult(prepared.effectiveParams, error);
233
+ if (nestedForegroundStarted) prepared.writeNestedForegroundEvent("subagent.nested.completed", errorResult);
2606
234
  return errorResult;
2607
235
  } finally {
2608
- if (foregroundControl) {
2609
- clearPendingForegroundControlNotices(deps.state, runId);
2610
- deps.state.foregroundControls.delete(runId);
2611
- if (deps.state.lastForegroundControlId === runId) {
236
+ if (prepared.foregroundControl) {
237
+ clearPendingForegroundControlNotices(deps.state, prepared.runId);
238
+ deps.state.foregroundControls.delete(prepared.runId);
239
+ if (deps.state.lastForegroundControlId === prepared.runId) {
2612
240
  deps.state.lastForegroundControlId = null;
2613
241
  }
2614
242
  }
@@ -2618,7 +246,7 @@ export function createSubagentExecutor(rawDeps: ExecutorDeps): {
2618
246
  content: [{ type: "text", text: "Invalid params" }],
2619
247
  isError: true,
2620
248
  details: { mode: "single" as const, results: [] },
2621
- }, effectiveParams.context);
249
+ }, prepared.effectiveParams.context);
2622
250
  };
2623
251
 
2624
252
  return { execute };