@bastani/atomic 0.9.9 → 0.9.10

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 (864) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/README.md +2 -0
  3. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/intercom/CHANGELOG.md +30 -0
  6. package/dist/builtin/intercom/README.md +12 -4
  7. package/dist/builtin/intercom/broker/broker.ts +96 -14
  8. package/dist/builtin/intercom/broker/client-message-validation.ts +39 -0
  9. package/dist/builtin/intercom/broker/client.ts +101 -92
  10. package/dist/builtin/intercom/broker/group-isolation.ts +28 -0
  11. package/dist/builtin/intercom/broker/send-handler.ts +62 -10
  12. package/dist/builtin/intercom/broker/send-signature.ts +3 -0
  13. package/dist/builtin/intercom/broker/supervisor-channel.ts +126 -0
  14. package/dist/builtin/intercom/closed-workflow-stage-message.ts +66 -0
  15. package/dist/builtin/intercom/config.ts +10 -0
  16. package/dist/builtin/intercom/contact-supervisor-tool.ts +14 -10
  17. package/dist/builtin/intercom/foreground-detach-handoff.ts +12 -2
  18. package/dist/builtin/intercom/group.ts +46 -0
  19. package/dist/builtin/intercom/inbound-message-admission.ts +79 -0
  20. package/dist/builtin/intercom/incoming-message-delivery.ts +49 -0
  21. package/dist/builtin/intercom/index-heavy.ts +148 -94
  22. package/dist/builtin/intercom/index.ts +66 -4
  23. package/dist/builtin/intercom/intercom-test-seams.ts +6 -0
  24. package/dist/builtin/intercom/intercom-tool.ts +71 -20
  25. package/dist/builtin/intercom/intercom-utils.ts +15 -2
  26. package/dist/builtin/intercom/late-stage-message-router.ts +148 -0
  27. package/dist/builtin/intercom/lifecycle.ts +10 -4
  28. package/dist/builtin/intercom/package.json +2 -2
  29. package/dist/builtin/intercom/reconnect-backoff.ts +6 -0
  30. package/dist/builtin/intercom/reply-tracker.ts +8 -0
  31. package/dist/builtin/intercom/skills/intercom/SKILL.md +2 -0
  32. package/dist/builtin/intercom/stable-delivery-retry.ts +32 -0
  33. package/dist/builtin/intercom/subagent-relay.ts +67 -14
  34. package/dist/builtin/intercom/supervisor-authorization-registry.ts +22 -0
  35. package/dist/builtin/intercom/terminal-ordering-barrier.ts +144 -25
  36. package/dist/builtin/intercom/types.ts +18 -5
  37. package/dist/builtin/intercom/workflow-reply-tracker.ts +19 -0
  38. package/dist/builtin/intercom/workflow-stage-admission.ts +43 -0
  39. package/dist/builtin/intercom/workflow-stage-delivery-failure.ts +77 -0
  40. package/dist/builtin/mcp/CHANGELOG.md +22 -0
  41. package/dist/builtin/mcp/README.md +6 -2
  42. package/dist/builtin/mcp/config.ts +8 -8
  43. package/dist/builtin/mcp/direct-tool-executor.ts +7 -6
  44. package/dist/builtin/mcp/package.json +3 -3
  45. package/dist/builtin/mcp/proxy-call.ts +5 -4
  46. package/dist/builtin/mcp/sampling-handler.ts +7 -2
  47. package/dist/builtin/mcp/tool-call-timeout.ts +101 -0
  48. package/dist/builtin/mcp/tool-result-renderer.ts +3 -2
  49. package/dist/builtin/mcp/types.ts +5 -0
  50. package/dist/builtin/mcp/ui-server.ts +3 -2
  51. package/dist/builtin/subagents/CHANGELOG.md +42 -0
  52. package/dist/builtin/subagents/README.md +6 -3
  53. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  54. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  55. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  56. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  57. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  58. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  59. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  60. package/dist/builtin/subagents/agents/debugger.md +1 -1
  61. package/dist/builtin/subagents/agents/worker.md +1 -1
  62. package/dist/builtin/subagents/package.json +4 -4
  63. package/dist/builtin/subagents/skills/subagent/SKILL.md +1 -1
  64. package/dist/builtin/subagents/src/extension/index.ts +37 -61
  65. package/dist/builtin/subagents/src/extension/notification-content.ts +80 -0
  66. package/dist/builtin/subagents/src/extension/schemas.ts +9 -0
  67. package/dist/builtin/subagents/src/extension/tool-description.ts +1 -0
  68. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +23 -0
  69. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +4 -0
  70. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
  71. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +4 -0
  72. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +75 -13
  73. package/dist/builtin/subagents/src/runs/background/async-status.ts +19 -0
  74. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +4 -3
  75. package/dist/builtin/subagents/src/runs/background/notify.ts +76 -15
  76. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +1 -1
  77. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +13 -0
  78. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +1 -0
  79. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +1 -0
  80. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +2 -1
  81. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +4 -0
  82. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +13 -0
  83. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +19 -2
  84. package/dist/builtin/subagents/src/runs/foreground/detached-cleanup-barrier.ts +26 -0
  85. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +19 -30
  86. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +47 -0
  87. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +60 -2
  88. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +21 -0
  89. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +21 -2
  90. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +6 -1
  91. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +2 -0
  92. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -0
  93. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +1 -1
  94. package/dist/builtin/subagents/src/runs/shared/intercom-group.ts +50 -0
  95. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +16 -0
  96. package/dist/builtin/subagents/src/runs/shared/worktree-post-create.ts +75 -0
  97. package/dist/builtin/subagents/src/runs/shared/worktree-root.ts +51 -0
  98. package/dist/builtin/subagents/src/runs/shared/worktree.ts +69 -77
  99. package/dist/builtin/subagents/src/shared/types-config.ts +6 -0
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +3 -2
  101. package/dist/builtin/subagents/src/tui/render-result-compact.ts +5 -3
  102. package/dist/builtin/subagents/src/tui/render-result.ts +5 -3
  103. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +7 -4
  104. package/dist/builtin/web-access/CHANGELOG.md +22 -0
  105. package/dist/builtin/web-access/extract-frames.ts +14 -13
  106. package/dist/builtin/web-access/extract.ts +2 -2
  107. package/dist/builtin/web-access/gemini-api.ts +0 -3
  108. package/dist/builtin/web-access/gemini-web-config.ts +1 -3
  109. package/dist/builtin/web-access/gemini-web.ts +1 -0
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/web-access/perplexity.ts +0 -3
  112. package/dist/builtin/web-access/result-renderers.ts +7 -5
  113. package/dist/builtin/web-access/subprocess.ts +100 -0
  114. package/dist/builtin/web-access/summary-review.ts +14 -3
  115. package/dist/builtin/web-access/video-extract.ts +12 -17
  116. package/dist/builtin/web-access/web-search-browser.ts +18 -10
  117. package/dist/builtin/web-access/web-search-summary.ts +9 -2
  118. package/dist/builtin/web-access/youtube-extract.ts +22 -25
  119. package/dist/builtin/workflows/CHANGELOG.md +153 -0
  120. package/dist/builtin/workflows/README.md +76 -38
  121. package/dist/builtin/workflows/ambient.d.ts +30 -0
  122. package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +15 -0
  123. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +93 -0
  124. package/dist/builtin/workflows/builtin/adversarial-verification.d.ts +11 -0
  125. package/dist/builtin/workflows/builtin/adversarial-verification.ts +24 -0
  126. package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +11 -0
  127. package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +110 -0
  128. package/dist/builtin/workflows/builtin/classify-and-act.d.ts +24 -0
  129. package/dist/builtin/workflows/builtin/classify-and-act.ts +35 -0
  130. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +8 -2
  131. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +11 -0
  132. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +96 -0
  133. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.d.ts +23 -0
  134. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +32 -0
  135. package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +15 -0
  136. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +75 -0
  137. package/dist/builtin/workflows/builtin/generate-and-filter.d.ts +11 -0
  138. package/dist/builtin/workflows/builtin/generate-and-filter.ts +26 -0
  139. package/dist/builtin/workflows/builtin/goal-models.ts +72 -0
  140. package/dist/builtin/workflows/builtin/goal-runner.ts +2 -64
  141. package/dist/builtin/workflows/builtin/index.d.ts +44 -0
  142. package/dist/builtin/workflows/builtin/index.ts +6 -0
  143. package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +79 -0
  144. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +189 -0
  145. package/dist/builtin/workflows/builtin/loop-until-done.d.ts +34 -0
  146. package/dist/builtin/workflows/builtin/loop-until-done.ts +31 -0
  147. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +6 -1
  148. package/dist/builtin/workflows/builtin/pattern-artifact-root.ts +28 -0
  149. package/dist/builtin/workflows/builtin/ralph-models.ts +26 -5
  150. package/dist/builtin/workflows/builtin/ralph-runner.ts +1 -0
  151. package/dist/builtin/workflows/builtin/tournament-prompts.ts +79 -0
  152. package/dist/builtin/workflows/builtin/tournament-runner.ts +188 -0
  153. package/dist/builtin/workflows/builtin/tournament.d.ts +33 -0
  154. package/dist/builtin/workflows/builtin/tournament.ts +34 -0
  155. package/dist/builtin/workflows/package.json +2 -2
  156. package/dist/builtin/workflows/src/authoring.d.ts +2 -6
  157. package/dist/builtin/workflows/src/durable/backend.ts +163 -120
  158. package/dist/builtin/workflows/src/durable/completed-catalog.ts +37 -64
  159. package/dist/builtin/workflows/src/durable/completed-inspection.ts +4 -72
  160. package/dist/builtin/workflows/src/durable/dbos-backend.ts +242 -195
  161. package/dist/builtin/workflows/src/durable/dbos-embedded-postgres.ts +207 -0
  162. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +42 -42
  163. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +155 -0
  164. package/dist/builtin/workflows/src/durable/dbos-local-postgres.ts +126 -0
  165. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +105 -58
  166. package/dist/builtin/workflows/src/durable/dbos-prompt-reservations.ts +320 -0
  167. package/dist/builtin/workflows/src/durable/dbos-sdk-handle.ts +161 -0
  168. package/dist/builtin/workflows/src/durable/dbos-status-transition.ts +62 -0
  169. package/dist/builtin/workflows/src/durable/dbos-tombstone.ts +2 -2
  170. package/dist/builtin/workflows/src/durable/durable-hash.ts +20 -0
  171. package/dist/builtin/workflows/src/durable/factory.ts +23 -83
  172. package/dist/builtin/workflows/src/durable/format-version.ts +4 -10
  173. package/dist/builtin/workflows/src/durable/index.ts +16 -20
  174. package/dist/builtin/workflows/src/durable/local-command.ts +63 -0
  175. package/dist/builtin/workflows/src/durable/prompt-reservation-state.ts +177 -0
  176. package/dist/builtin/workflows/src/durable/prompt-reservations.ts +36 -0
  177. package/dist/builtin/workflows/src/durable/resume-catalog.ts +2 -200
  178. package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -2
  179. package/dist/builtin/workflows/src/durable/resume-runtime.ts +121 -118
  180. package/dist/builtin/workflows/src/durable/retention-policy.ts +42 -0
  181. package/dist/builtin/workflows/src/durable/run-timing.ts +98 -0
  182. package/dist/builtin/workflows/src/durable/scoped-backend.ts +62 -14
  183. package/dist/builtin/workflows/src/durable/stage-primitive.ts +15 -2
  184. package/dist/builtin/workflows/src/durable/tool-primitive.ts +11 -7
  185. package/dist/builtin/workflows/src/durable/types.ts +25 -18
  186. package/dist/builtin/workflows/src/durable/ui-primitive.ts +117 -29
  187. package/dist/builtin/workflows/src/durable/workflow-status-transition.ts +30 -0
  188. package/dist/builtin/workflows/src/engine/primitives/parallel.ts +20 -5
  189. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -2
  190. package/dist/builtin/workflows/src/engine/primitives/ui.ts +6 -3
  191. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +14 -22
  192. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +14 -14
  193. package/dist/builtin/workflows/src/engine/run.ts +35 -37
  194. package/dist/builtin/workflows/src/engine/runtime.ts +3 -0
  195. package/dist/builtin/workflows/src/engine/workflow-activity.ts +9 -0
  196. package/dist/builtin/workflows/src/extension/completed-stage-intercom-ask.ts +155 -0
  197. package/dist/builtin/workflows/src/extension/config-file-loader.ts +13 -0
  198. package/dist/builtin/workflows/src/extension/config-loader.ts +20 -0
  199. package/dist/builtin/workflows/src/extension/dispatcher.ts +56 -17
  200. package/dist/builtin/workflows/src/extension/extension-factory.ts +13 -10
  201. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +37 -59
  202. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +16 -18
  203. package/dist/builtin/workflows/src/extension/lifecycle-notification-delivery.ts +83 -0
  204. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +80 -41
  205. package/dist/builtin/workflows/src/extension/postmortem-deps.ts +73 -0
  206. package/dist/builtin/workflows/src/extension/public-types.ts +11 -51
  207. package/dist/builtin/workflows/src/extension/render-call.ts +3 -9
  208. package/dist/builtin/workflows/src/extension/render-result.ts +22 -7
  209. package/dist/builtin/workflows/src/extension/runtime-active-block-claim.ts +78 -0
  210. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +50 -29
  211. package/dist/builtin/workflows/src/extension/runtime.ts +70 -219
  212. package/dist/builtin/workflows/src/extension/ui-surface.ts +107 -3
  213. package/dist/builtin/workflows/src/extension/wiring.ts +76 -7
  214. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +10 -5
  215. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +27 -5
  216. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +49 -19
  217. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +8 -8
  218. package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +81 -0
  219. package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +55 -0
  220. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +193 -145
  221. package/dist/builtin/workflows/src/extension/workflow-schema.ts +9 -133
  222. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +189 -0
  223. package/dist/builtin/workflows/src/extension/workflow-targets.ts +1 -1
  224. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +78 -3
  225. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +185 -89
  226. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +92 -11
  227. package/dist/builtin/workflows/src/extension/workflow-tool.ts +18 -24
  228. package/dist/builtin/workflows/src/runs/background/durable-resume-transition.ts +63 -0
  229. package/dist/builtin/workflows/src/runs/background/quit.ts +139 -29
  230. package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +97 -0
  231. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +111 -0
  232. package/dist/builtin/workflows/src/runs/background/runner.ts +46 -17
  233. package/dist/builtin/workflows/src/runs/background/startup-admission.ts +77 -0
  234. package/dist/builtin/workflows/src/runs/background/status.ts +133 -224
  235. package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +44 -0
  236. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +57 -256
  237. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +7 -4
  238. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +12 -1
  239. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +39 -0
  240. package/dist/builtin/workflows/src/runs/foreground/executor-queued-user-message.ts +75 -0
  241. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +44 -12
  242. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +63 -12
  243. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +30 -4
  244. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +3 -0
  245. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
  246. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +0 -67
  247. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +6 -0
  248. package/dist/builtin/workflows/src/runs/foreground/executor.ts +0 -1
  249. package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +169 -0
  250. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +38 -1
  251. package/dist/builtin/workflows/src/runs/foreground/stage-runner-candidate.ts +21 -0
  252. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +21 -3
  253. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +85 -84
  254. package/dist/builtin/workflows/src/runs/foreground/stage-runner-message-admission.ts +195 -0
  255. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +12 -5
  256. package/dist/builtin/workflows/src/runs/foreground/stage-runner-replacement.ts +42 -0
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +100 -8
  258. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +51 -0
  259. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +19 -0
  260. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +28 -2
  261. package/dist/builtin/workflows/src/runs/shared/prompt-callsite.ts +4 -6
  262. package/dist/builtin/workflows/src/runs/shared/worktree-git-runner.ts +89 -0
  263. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +29 -133
  264. package/dist/builtin/workflows/src/runs/shared/worktree-post-create.ts +130 -0
  265. package/dist/builtin/workflows/src/runs/shared/worktree-root.ts +84 -0
  266. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +77 -63
  267. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +4 -0
  268. package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
  269. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +29 -22
  270. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +26 -24
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +5 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +5 -0
  273. package/dist/builtin/workflows/src/shared/intercom-group.ts +51 -0
  274. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +6 -0
  275. package/dist/builtin/workflows/src/shared/persistence-restore.ts +4 -0
  276. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +3 -0
  277. package/dist/builtin/workflows/src/shared/prompt-callsite-context.ts +13 -0
  278. package/dist/builtin/workflows/src/shared/returned-run-status.ts +2 -1
  279. package/dist/builtin/workflows/src/shared/session-transcript.ts +74 -0
  280. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +1 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +8 -0
  282. package/dist/builtin/workflows/src/shared/timing.ts +4 -1
  283. package/dist/builtin/workflows/src/shared/types.ts +2 -6
  284. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +2 -42
  285. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +2 -2
  286. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +7 -3
  287. package/dist/builtin/workflows/src/tui/graph-view-input.ts +29 -67
  288. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +15 -10
  289. package/dist/builtin/workflows/src/tui/graph-view-state.ts +0 -2
  290. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -9
  291. package/dist/builtin/workflows/src/tui/host-input-form.ts +62 -0
  292. package/dist/builtin/workflows/src/tui/mouse-input.ts +63 -0
  293. package/dist/builtin/workflows/src/tui/node-card.ts +1 -0
  294. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +67 -42
  295. package/dist/builtin/workflows/src/tui/overlay-terminal-modes.ts +49 -0
  296. package/dist/builtin/workflows/src/tui/session-overlays.ts +3 -104
  297. package/dist/builtin/workflows/src/tui/session-picker.ts +3 -12
  298. package/dist/builtin/workflows/src/tui/stage-chat-composer-drafts.ts +19 -0
  299. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +30 -10
  300. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +19 -9
  301. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +25 -38
  302. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +1 -1
  303. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +7 -6
  304. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +7 -1
  305. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -1
  306. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +19 -20
  307. package/dist/builtin/workflows/src/tui/switcher.ts +4 -4
  308. package/dist/builtin/workflows/src/tui/widget.ts +46 -33
  309. package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +26 -0
  310. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +14 -2
  311. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +26 -27
  312. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +208 -69
  313. package/dist/bun/cli.js +3 -0
  314. package/dist/bun/cli.js.map +1 -1
  315. package/dist/cli/session-picker.d.ts.map +1 -1
  316. package/dist/cli/session-picker.js +3 -0
  317. package/dist/cli/session-picker.js.map +1 -1
  318. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  319. package/dist/core/agent-session-auto-compaction.js +19 -2
  320. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  321. package/dist/core/agent-session-compaction.js +2 -2
  322. package/dist/core/agent-session-compaction.js.map +1 -1
  323. package/dist/core/agent-session-events.d.ts.map +1 -1
  324. package/dist/core/agent-session-events.js +5 -3
  325. package/dist/core/agent-session-events.js.map +1 -1
  326. package/dist/core/agent-session-export.js +1 -1
  327. package/dist/core/agent-session-export.js.map +1 -1
  328. package/dist/core/agent-session-extension-bindings.d.ts +2 -4
  329. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  330. package/dist/core/agent-session-extension-bindings.js +9 -2
  331. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  332. package/dist/core/agent-session-message-queue.d.ts +6 -0
  333. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  334. package/dist/core/agent-session-message-queue.js +107 -36
  335. package/dist/core/agent-session-message-queue.js.map +1 -1
  336. package/dist/core/agent-session-methods.d.ts +18 -7
  337. package/dist/core/agent-session-methods.d.ts.map +1 -1
  338. package/dist/core/agent-session-methods.js.map +1 -1
  339. package/dist/core/agent-session-models.d.ts +3 -1
  340. package/dist/core/agent-session-models.d.ts.map +1 -1
  341. package/dist/core/agent-session-models.js +1 -1
  342. package/dist/core/agent-session-models.js.map +1 -1
  343. package/dist/core/agent-session-post-tool-compaction.d.ts +16 -0
  344. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -0
  345. package/dist/core/agent-session-post-tool-compaction.js +113 -0
  346. package/dist/core/agent-session-post-tool-compaction.js.map +1 -0
  347. package/dist/core/agent-session-prompt.d.ts +12 -1
  348. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  349. package/dist/core/agent-session-prompt.js +22 -5
  350. package/dist/core/agent-session-prompt.js.map +1 -1
  351. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  352. package/dist/core/agent-session-runtime.js +3 -0
  353. package/dist/core/agent-session-runtime.js.map +1 -1
  354. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  355. package/dist/core/agent-session-tool-hooks.js +21 -0
  356. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  357. package/dist/core/agent-session-tree.d.ts.map +1 -1
  358. package/dist/core/agent-session-tree.js +2 -1
  359. package/dist/core/agent-session-tree.js.map +1 -1
  360. package/dist/core/agent-session-types.d.ts +7 -0
  361. package/dist/core/agent-session-types.d.ts.map +1 -1
  362. package/dist/core/agent-session-types.js.map +1 -1
  363. package/dist/core/agent-session.d.ts +6 -0
  364. package/dist/core/agent-session.d.ts.map +1 -1
  365. package/dist/core/agent-session.js +18 -1
  366. package/dist/core/agent-session.js.map +1 -1
  367. package/dist/core/async/job-manager.d.ts +1 -0
  368. package/dist/core/async/job-manager.d.ts.map +1 -1
  369. package/dist/core/async/job-manager.js +29 -5
  370. package/dist/core/async/job-manager.js.map +1 -1
  371. package/dist/core/async/session-manager.d.ts +2 -4
  372. package/dist/core/async/session-manager.d.ts.map +1 -1
  373. package/dist/core/async/session-manager.js +5 -32
  374. package/dist/core/async/session-manager.js.map +1 -1
  375. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  376. package/dist/core/atomic-guide-command.js +2 -0
  377. package/dist/core/atomic-guide-command.js.map +1 -1
  378. package/dist/core/auth-storage.d.ts +20 -10
  379. package/dist/core/auth-storage.d.ts.map +1 -1
  380. package/dist/core/auth-storage.js +151 -92
  381. package/dist/core/auth-storage.js.map +1 -1
  382. package/dist/core/callback-activity.d.ts +27 -0
  383. package/dist/core/callback-activity.d.ts.map +1 -0
  384. package/dist/core/callback-activity.js +44 -0
  385. package/dist/core/callback-activity.js.map +1 -0
  386. package/dist/core/compaction/branch-summarization.d.ts +4 -1
  387. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  388. package/dist/core/compaction/branch-summarization.js +4 -3
  389. package/dist/core/compaction/branch-summarization.js.map +1 -1
  390. package/dist/core/compaction/compaction-boundary.d.ts +1 -1
  391. package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
  392. package/dist/core/compaction/compaction-boundary.js +10 -23
  393. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  394. package/dist/core/compaction/compaction-runner.d.ts +4 -1
  395. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  396. package/dist/core/compaction/compaction-runner.js +1 -1
  397. package/dist/core/compaction/compaction-runner.js.map +1 -1
  398. package/dist/core/compaction/compaction-types.d.ts +3 -2
  399. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  400. package/dist/core/compaction/compaction-types.js.map +1 -1
  401. package/dist/core/compaction/compaction.d.ts +6 -6
  402. package/dist/core/compaction/compaction.d.ts.map +1 -1
  403. package/dist/core/compaction/compaction.js +12 -9
  404. package/dist/core/compaction/compaction.js.map +1 -1
  405. package/dist/core/compaction/index.d.ts +1 -0
  406. package/dist/core/compaction/index.d.ts.map +1 -1
  407. package/dist/core/compaction/index.js +1 -0
  408. package/dist/core/compaction/index.js.map +1 -1
  409. package/dist/core/compaction/range-planner-diagnostics.d.ts +101 -0
  410. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -0
  411. package/dist/core/compaction/range-planner-diagnostics.js +116 -0
  412. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -0
  413. package/dist/core/compaction/range-planner.d.ts +13 -3
  414. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  415. package/dist/core/compaction/range-planner.js +117 -68
  416. package/dist/core/compaction/range-planner.js.map +1 -1
  417. package/dist/core/compaction/truncated-range-recovery.d.ts +47 -0
  418. package/dist/core/compaction/truncated-range-recovery.d.ts.map +1 -0
  419. package/dist/core/compaction/truncated-range-recovery.js +112 -0
  420. package/dist/core/compaction/truncated-range-recovery.js.map +1 -0
  421. package/dist/core/extensions/api-types.d.ts +2 -2
  422. package/dist/core/extensions/api-types.d.ts.map +1 -1
  423. package/dist/core/extensions/api-types.js.map +1 -1
  424. package/dist/core/extensions/context-types.d.ts +23 -1
  425. package/dist/core/extensions/context-types.d.ts.map +1 -1
  426. package/dist/core/extensions/context-types.js.map +1 -1
  427. package/dist/core/extensions/index.d.ts +1 -1
  428. package/dist/core/extensions/index.d.ts.map +1 -1
  429. package/dist/core/extensions/index.js.map +1 -1
  430. package/dist/core/extensions/loader-api.js +2 -2
  431. package/dist/core/extensions/loader-api.js.map +1 -1
  432. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  433. package/dist/core/extensions/loader-core.js +8 -1
  434. package/dist/core/extensions/loader-core.js.map +1 -1
  435. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  436. package/dist/core/extensions/loader-virtual-modules.js +9 -6
  437. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  438. package/dist/core/extensions/message-types.d.ts +17 -0
  439. package/dist/core/extensions/message-types.d.ts.map +1 -1
  440. package/dist/core/extensions/message-types.js.map +1 -1
  441. package/dist/core/extensions/provider-types.d.ts +3 -0
  442. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  443. package/dist/core/extensions/provider-types.js.map +1 -1
  444. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  445. package/dist/core/extensions/runner-events.js +11 -10
  446. package/dist/core/extensions/runner-events.js.map +1 -1
  447. package/dist/core/extensions/runtime-types.d.ts +2 -2
  448. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  449. package/dist/core/extensions/runtime-types.js.map +1 -1
  450. package/dist/core/extensions/ui-types.d.ts +78 -0
  451. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  452. package/dist/core/extensions/ui-types.js.map +1 -1
  453. package/dist/core/model-registry-auth.d.ts +2 -1
  454. package/dist/core/model-registry-auth.d.ts.map +1 -1
  455. package/dist/core/model-registry-auth.js +25 -6
  456. package/dist/core/model-registry-auth.js.map +1 -1
  457. package/dist/core/model-registry-builtins.d.ts +3 -2
  458. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  459. package/dist/core/model-registry-builtins.js +12 -6
  460. package/dist/core/model-registry-builtins.js.map +1 -1
  461. package/dist/core/model-registry-dynamic.d.ts +1 -0
  462. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  463. package/dist/core/model-registry-dynamic.js +53 -13
  464. package/dist/core/model-registry-dynamic.js.map +1 -1
  465. package/dist/core/model-registry-loader.d.ts +2 -1
  466. package/dist/core/model-registry-loader.d.ts.map +1 -1
  467. package/dist/core/model-registry-loader.js +2 -2
  468. package/dist/core/model-registry-loader.js.map +1 -1
  469. package/dist/core/model-registry-types.d.ts +10 -3
  470. package/dist/core/model-registry-types.d.ts.map +1 -1
  471. package/dist/core/model-registry-types.js.map +1 -1
  472. package/dist/core/model-registry.d.ts +15 -1
  473. package/dist/core/model-registry.d.ts.map +1 -1
  474. package/dist/core/model-registry.js +214 -30
  475. package/dist/core/model-registry.js.map +1 -1
  476. package/dist/core/models-store.d.ts +25 -0
  477. package/dist/core/models-store.d.ts.map +1 -0
  478. package/dist/core/models-store.js +73 -0
  479. package/dist/core/models-store.js.map +1 -0
  480. package/dist/core/oauth-compat.d.ts +17 -0
  481. package/dist/core/oauth-compat.d.ts.map +1 -0
  482. package/dist/core/oauth-compat.js +2 -0
  483. package/dist/core/oauth-compat.js.map +1 -0
  484. package/dist/core/oauth-provider-bridge.d.ts +40 -0
  485. package/dist/core/oauth-provider-bridge.d.ts.map +1 -0
  486. package/dist/core/oauth-provider-bridge.js +169 -0
  487. package/dist/core/oauth-provider-bridge.js.map +1 -0
  488. package/dist/core/output-guard.d.ts +2 -0
  489. package/dist/core/output-guard.d.ts.map +1 -1
  490. package/dist/core/output-guard.js +14 -0
  491. package/dist/core/output-guard.js.map +1 -1
  492. package/dist/core/remote-catalog-provider.d.ts +5 -0
  493. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  494. package/dist/core/remote-catalog-provider.js +138 -0
  495. package/dist/core/remote-catalog-provider.js.map +1 -0
  496. package/dist/core/sdk.d.ts.map +1 -1
  497. package/dist/core/sdk.js +8 -3
  498. package/dist/core/sdk.js.map +1 -1
  499. package/dist/core/session-manager-core.d.ts +1 -1
  500. package/dist/core/session-manager-core.d.ts.map +1 -1
  501. package/dist/core/session-manager-core.js +1 -1
  502. package/dist/core/session-manager-core.js.map +1 -1
  503. package/dist/core/session-manager-entries.d.ts +1 -1
  504. package/dist/core/session-manager-entries.d.ts.map +1 -1
  505. package/dist/core/session-manager-entries.js.map +1 -1
  506. package/dist/core/session-manager-history.d.ts +2 -2
  507. package/dist/core/session-manager-history.js +2 -2
  508. package/dist/core/session-manager-history.js.map +1 -1
  509. package/dist/core/session-manager-list.d.ts.map +1 -1
  510. package/dist/core/session-manager-list.js +65 -23
  511. package/dist/core/session-manager-list.js.map +1 -1
  512. package/dist/core/session-manager-types.d.ts +3 -2
  513. package/dist/core/session-manager-types.d.ts.map +1 -1
  514. package/dist/core/session-manager-types.js.map +1 -1
  515. package/dist/core/slash-commands.d.ts.map +1 -1
  516. package/dist/core/slash-commands.js +9 -5
  517. package/dist/core/slash-commands.js.map +1 -1
  518. package/dist/core/tools/bash.d.ts.map +1 -1
  519. package/dist/core/tools/bash.js +2 -3
  520. package/dist/core/tools/bash.js.map +1 -1
  521. package/dist/core/tools/find.js +2 -2
  522. package/dist/core/tools/find.js.map +1 -1
  523. package/dist/core/tools/grep.js +2 -2
  524. package/dist/core/tools/grep.js.map +1 -1
  525. package/dist/core/tools/ls.js +2 -2
  526. package/dist/core/tools/ls.js.map +1 -1
  527. package/dist/core/tools/read.d.ts.map +1 -1
  528. package/dist/core/tools/read.js +4 -3
  529. package/dist/core/tools/read.js.map +1 -1
  530. package/dist/core/tools/todos-render.d.ts.map +1 -1
  531. package/dist/core/tools/todos-render.js +3 -2
  532. package/dist/core/tools/todos-render.js.map +1 -1
  533. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  534. package/dist/core/tools/tool-definition-wrapper.js +3 -2
  535. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  536. package/dist/core/tools/write.js +2 -2
  537. package/dist/core/tools/write.js.map +1 -1
  538. package/dist/core/workflow-stage-admission.d.ts +29 -0
  539. package/dist/core/workflow-stage-admission.d.ts.map +1 -0
  540. package/dist/core/workflow-stage-admission.js +81 -0
  541. package/dist/core/workflow-stage-admission.js.map +1 -0
  542. package/dist/index-extensions.d.ts +1 -1
  543. package/dist/index-extensions.d.ts.map +1 -1
  544. package/dist/index-extensions.js.map +1 -1
  545. package/dist/index.d.ts +4 -1
  546. package/dist/index.d.ts.map +1 -1
  547. package/dist/index.js +4 -1
  548. package/dist/index.js.map +1 -1
  549. package/dist/main-types.d.ts +13 -0
  550. package/dist/main-types.d.ts.map +1 -0
  551. package/dist/main-types.js +2 -0
  552. package/dist/main-types.js.map +1 -0
  553. package/dist/main.d.ts +2 -5
  554. package/dist/main.d.ts.map +1 -1
  555. package/dist/main.js +25 -17
  556. package/dist/main.js.map +1 -1
  557. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/assistant-message.js +17 -12
  559. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  560. package/dist/modes/interactive/components/atomic-banner.d.ts +7 -0
  561. package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
  562. package/dist/modes/interactive/components/atomic-banner.js +20 -0
  563. package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
  564. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  565. package/dist/modes/interactive/components/bash-execution.js +5 -3
  566. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  567. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/branch-summary-message.js +3 -4
  569. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  570. package/dist/modes/interactive/components/chat-message-renderer.d.ts +4 -0
  571. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  572. package/dist/modes/interactive/components/chat-message-renderer.js +4 -0
  573. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  574. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  575. package/dist/modes/interactive/components/chat-session-host-events.js +79 -8
  576. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  577. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  578. package/dist/modes/interactive/components/chat-session-host-rendering.js +4 -2
  579. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  580. package/dist/modes/interactive/components/chat-session-host.d.ts +1 -0
  581. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/chat-session-host.js +4 -1
  583. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  584. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  585. package/dist/modes/interactive/components/compaction-boundary-message.js +3 -4
  586. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  587. package/dist/modes/interactive/components/host-input-form-mount.d.ts +14 -0
  588. package/dist/modes/interactive/components/host-input-form-mount.d.ts.map +1 -0
  589. package/dist/modes/interactive/components/host-input-form-mount.js +79 -0
  590. package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -0
  591. package/dist/modes/interactive/components/host-input-form.d.ts +52 -0
  592. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -0
  593. package/dist/modes/interactive/components/host-input-form.js +278 -0
  594. package/dist/modes/interactive/components/host-input-form.js.map +1 -0
  595. package/dist/modes/interactive/components/host-session-picker.d.ts +46 -0
  596. package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -0
  597. package/dist/modes/interactive/components/host-session-picker.js +183 -0
  598. package/dist/modes/interactive/components/host-session-picker.js.map +1 -0
  599. package/dist/modes/interactive/components/index.d.ts +1 -1
  600. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/index.js +1 -1
  602. package/dist/modes/interactive/components/index.js.map +1 -1
  603. package/dist/modes/interactive/components/keybinding-hints.d.ts +2 -0
  604. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/keybinding-hints.js +12 -0
  606. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  607. package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
  608. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/login-dialog.js +8 -2
  610. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  611. package/dist/modes/interactive/components/model-selector.d.ts +7 -1
  612. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/model-selector.js +57 -10
  614. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  615. package/dist/modes/interactive/components/session-selector.d.ts +15 -0
  616. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/session-selector.js +35 -3
  618. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  619. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  620. package/dist/modes/interactive/components/skill-invocation-message.js +3 -2
  621. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  622. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  623. package/dist/modes/interactive/components/tool-execution.js +9 -0
  624. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  625. package/dist/modes/interactive/interactive-agent-events.js +24 -10
  626. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  627. package/dist/modes/interactive/interactive-auth-login.js +7 -1
  628. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-routing.js +3 -3
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +49 -0
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.js +2 -0
  634. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  635. package/dist/modes/interactive/interactive-extension-context.js +14 -0
  636. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  637. package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
  638. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  639. package/dist/modes/interactive/interactive-global-clear.d.ts +13 -0
  640. package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -0
  641. package/dist/modes/interactive/interactive-global-clear.js +11 -0
  642. package/dist/modes/interactive/interactive-global-clear.js.map +1 -0
  643. package/dist/modes/interactive/interactive-input-handling.js +17 -10
  644. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-base.d.ts +6 -1
  646. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-base.js +25 -2
  648. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  649. package/dist/modes/interactive/interactive-mode-deps.d.ts +4 -3
  650. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  651. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  652. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  653. package/dist/modes/interactive/interactive-mode-helpers.d.ts +4 -1
  654. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  655. package/dist/modes/interactive/interactive-mode-helpers.js +14 -1
  656. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  657. package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -2
  658. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  659. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  660. package/dist/modes/interactive/interactive-mode-types.d.ts +3 -0
  661. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  662. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  663. package/dist/modes/interactive/interactive-model-routing.js +7 -4
  664. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  665. package/dist/modes/interactive/interactive-queueing.js +2 -2
  666. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  667. package/dist/modes/interactive/interactive-render-chat.js +25 -4
  668. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  669. package/dist/modes/interactive/interactive-session-routing.js +3 -0
  670. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  671. package/dist/modes/interactive/interactive-slash-commands.js +5 -2
  672. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  673. package/dist/modes/interactive/interactive-startup.d.ts +1 -1
  674. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  675. package/dist/modes/interactive/interactive-startup.js +22 -9
  676. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  677. package/dist/modes/interactive/interactive-terminal-title.d.ts +6 -0
  678. package/dist/modes/interactive/interactive-terminal-title.d.ts.map +1 -0
  679. package/dist/modes/interactive/interactive-terminal-title.js +7 -0
  680. package/dist/modes/interactive/interactive-terminal-title.js.map +1 -0
  681. package/dist/modes/interactive-engine/activity-watchdog.d.ts +45 -0
  682. package/dist/modes/interactive-engine/activity-watchdog.d.ts.map +1 -0
  683. package/dist/modes/interactive-engine/activity-watchdog.js +74 -0
  684. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -0
  685. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts +14 -0
  686. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -0
  687. package/dist/modes/interactive-engine/create-isolated-runtime.js +56 -0
  688. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -0
  689. package/dist/modes/interactive-engine/engine-args.d.ts +10 -0
  690. package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -0
  691. package/dist/modes/interactive-engine/engine-args.js +55 -0
  692. package/dist/modes/interactive-engine/engine-args.js.map +1 -0
  693. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +7 -0
  694. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -0
  695. package/dist/modes/interactive-engine/engine-child-liveness.js +50 -0
  696. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -0
  697. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +47 -0
  698. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -0
  699. package/dist/modes/interactive-engine/engine-custom-ui.js +276 -0
  700. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -0
  701. package/dist/modes/interactive-engine/engine-input-form.d.ts +13 -0
  702. package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -0
  703. package/dist/modes/interactive-engine/engine-input-form.js +49 -0
  704. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -0
  705. package/dist/modes/interactive-engine/engine-monitor.d.ts +18 -0
  706. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -0
  707. package/dist/modes/interactive-engine/engine-monitor.js +63 -0
  708. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -0
  709. package/dist/modes/interactive-engine/engine-render-service.d.ts +17 -0
  710. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -0
  711. package/dist/modes/interactive-engine/engine-render-service.js +150 -0
  712. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -0
  713. package/dist/modes/interactive-engine/engine-session-picker.d.ts +22 -0
  714. package/dist/modes/interactive-engine/engine-session-picker.d.ts.map +1 -0
  715. package/dist/modes/interactive-engine/engine-session-picker.js +106 -0
  716. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -0
  717. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +23 -0
  718. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -0
  719. package/dist/modes/interactive-engine/extension-ui-bridge.js +126 -0
  720. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -0
  721. package/dist/modes/interactive-engine/input-form-host.d.ts +15 -0
  722. package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -0
  723. package/dist/modes/interactive-engine/input-form-host.js +44 -0
  724. package/dist/modes/interactive-engine/input-form-host.js.map +1 -0
  725. package/dist/modes/interactive-engine/isolated-runtime.d.ts +75 -0
  726. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -0
  727. package/dist/modes/interactive-engine/isolated-runtime.js +448 -0
  728. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -0
  729. package/dist/modes/interactive-engine/protocol.d.ts +184 -0
  730. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -0
  731. package/dist/modes/interactive-engine/protocol.js +254 -0
  732. package/dist/modes/interactive-engine/protocol.js.map +1 -0
  733. package/dist/modes/interactive-engine/remote-command-catalog.d.ts +33 -0
  734. package/dist/modes/interactive-engine/remote-command-catalog.d.ts.map +1 -0
  735. package/dist/modes/interactive-engine/remote-command-catalog.js +51 -0
  736. package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -0
  737. package/dist/modes/interactive-engine/remote-component.d.ts +16 -0
  738. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -0
  739. package/dist/modes/interactive-engine/remote-component.js +209 -0
  740. package/dist/modes/interactive-engine/remote-component.js.map +1 -0
  741. package/dist/modes/interactive-engine/remote-frame-clamp.d.ts +25 -0
  742. package/dist/modes/interactive-engine/remote-frame-clamp.d.ts.map +1 -0
  743. package/dist/modes/interactive-engine/remote-frame-clamp.js +43 -0
  744. package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -0
  745. package/dist/modes/interactive-engine/remote-renderer.d.ts +59 -0
  746. package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -0
  747. package/dist/modes/interactive-engine/remote-renderer.js +123 -0
  748. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -0
  749. package/dist/modes/interactive-engine/session-picker-host.d.ts +25 -0
  750. package/dist/modes/interactive-engine/session-picker-host.d.ts.map +1 -0
  751. package/dist/modes/interactive-engine/session-picker-host.js +75 -0
  752. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -0
  753. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts +43 -0
  754. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts.map +1 -0
  755. package/dist/modes/interactive-engine/terminal-mode-controller.js +109 -0
  756. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -0
  757. package/dist/modes/rpc/bounded-writer.d.ts +27 -0
  758. package/dist/modes/rpc/bounded-writer.d.ts.map +1 -0
  759. package/dist/modes/rpc/bounded-writer.js +103 -0
  760. package/dist/modes/rpc/bounded-writer.js.map +1 -0
  761. package/dist/modes/rpc/jsonl.d.ts +15 -12
  762. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  763. package/dist/modes/rpc/jsonl.js +102 -28
  764. package/dist/modes/rpc/jsonl.js.map +1 -1
  765. package/dist/modes/rpc/rpc-client-api.d.ts +83 -0
  766. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -0
  767. package/dist/modes/rpc/rpc-client-api.js +64 -0
  768. package/dist/modes/rpc/rpc-client-api.js.map +1 -0
  769. package/dist/modes/rpc/rpc-client-process.d.ts +19 -0
  770. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -0
  771. package/dist/modes/rpc/rpc-client-process.js +79 -0
  772. package/dist/modes/rpc/rpc-client-process.js.map +1 -0
  773. package/dist/modes/rpc/rpc-client-waits.d.ts +8 -0
  774. package/dist/modes/rpc/rpc-client-waits.d.ts.map +1 -0
  775. package/dist/modes/rpc/rpc-client-waits.js +33 -0
  776. package/dist/modes/rpc/rpc-client-waits.js.map +1 -0
  777. package/dist/modes/rpc/rpc-client.d.ts +48 -124
  778. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  779. package/dist/modes/rpc/rpc-client.js +295 -249
  780. package/dist/modes/rpc/rpc-client.js.map +1 -1
  781. package/dist/modes/rpc/rpc-command-handler.d.ts +5 -1
  782. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  783. package/dist/modes/rpc/rpc-command-handler.js +79 -3
  784. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  785. package/dist/modes/rpc/rpc-event-buffer.d.ts +11 -0
  786. package/dist/modes/rpc/rpc-event-buffer.d.ts.map +1 -0
  787. package/dist/modes/rpc/rpc-event-buffer.js +30 -0
  788. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -0
  789. package/dist/modes/rpc/rpc-extension-ui.d.ts +7 -1
  790. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  791. package/dist/modes/rpc/rpc-extension-ui.js +54 -32
  792. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  793. package/dist/modes/rpc/rpc-input-scheduler.d.ts +16 -0
  794. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -0
  795. package/dist/modes/rpc/rpc-input-scheduler.js +69 -0
  796. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -0
  797. package/dist/modes/rpc/rpc-input.d.ts +2 -1
  798. package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
  799. package/dist/modes/rpc/rpc-input.js +4 -9
  800. package/dist/modes/rpc/rpc-input.js.map +1 -1
  801. package/dist/modes/rpc/rpc-keybindings-reload.d.ts +27 -0
  802. package/dist/modes/rpc/rpc-keybindings-reload.d.ts.map +1 -0
  803. package/dist/modes/rpc/rpc-keybindings-reload.js +69 -0
  804. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -0
  805. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  806. package/dist/modes/rpc/rpc-mode.js +63 -8
  807. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  808. package/dist/modes/rpc/rpc-output-buffer.d.ts +10 -0
  809. package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -0
  810. package/dist/modes/rpc/rpc-output-buffer.js +70 -0
  811. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -0
  812. package/dist/modes/rpc/rpc-session-binding.d.ts +16 -1
  813. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  814. package/dist/modes/rpc/rpc-session-binding.js +16 -3
  815. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  816. package/dist/modes/rpc/rpc-types.d.ts +109 -0
  817. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  818. package/dist/modes/rpc/rpc-types.js.map +1 -1
  819. package/dist/package-manager-cli-parser.d.ts +2 -0
  820. package/dist/package-manager-cli-parser.d.ts.map +1 -1
  821. package/dist/package-manager-cli-parser.js +24 -5
  822. package/dist/package-manager-cli-parser.js.map +1 -1
  823. package/dist/package-manager-cli.d.ts +7 -0
  824. package/dist/package-manager-cli.d.ts.map +1 -1
  825. package/dist/package-manager-cli.js +65 -1
  826. package/dist/package-manager-cli.js.map +1 -1
  827. package/dist/utils/shell.d.ts +1 -0
  828. package/dist/utils/shell.d.ts.map +1 -1
  829. package/dist/utils/shell.js +46 -0
  830. package/dist/utils/shell.js.map +1 -1
  831. package/docs/changelog.mdx +11 -0
  832. package/docs/compaction.md +53 -17
  833. package/docs/custom-provider.md +24 -5
  834. package/docs/development.md +9 -7
  835. package/docs/docs.json +1 -0
  836. package/docs/extensions.md +30 -16
  837. package/docs/intercom.md +489 -0
  838. package/docs/json.md +1 -1
  839. package/docs/keybindings.md +1 -1
  840. package/docs/packages.md +1 -0
  841. package/docs/quickstart.md +11 -5
  842. package/docs/rpc.md +9 -7
  843. package/docs/sdk.md +6 -0
  844. package/docs/session-format.md +7 -6
  845. package/docs/sessions.md +4 -2
  846. package/docs/settings.md +2 -2
  847. package/docs/subagents.md +7 -2
  848. package/docs/tui.md +61 -2
  849. package/docs/usage.md +6 -5
  850. package/docs/workflows.md +2572 -1379
  851. package/examples/extensions/handoff.ts +1 -1
  852. package/examples/extensions/qna.ts +1 -1
  853. package/examples/extensions/summarize.ts +1 -1
  854. package/npm-shrinkwrap.json +225 -76
  855. package/package.json +7 -6
  856. package/dist/builtin/workflows/src/durable/file-backend.ts +0 -439
  857. package/dist/builtin/workflows/src/durable/file-lock.ts +0 -153
  858. package/dist/builtin/workflows/src/durable/file-state.ts +0 -104
  859. package/dist/builtin/workflows/src/extension/runtime-direct.ts +0 -96
  860. package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +0 -66
  861. package/dist/builtin/workflows/src/runs/foreground/executor-direct-output.ts +0 -91
  862. package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +0 -282
  863. package/dist/builtin/workflows/src/shared/resumable-workflow-notices.ts +0 -43
  864. package/dist/builtin/workflows/src/tui/session-confirm.ts +0 -299
@@ -20,6 +20,7 @@ import {
20
20
  import type { ExtensionContext } from "@bastani/atomic";
21
21
  import type { SubagentExecutorRuntimeDeps, TaskParam } from "./subagent-executor-types.ts";
22
22
  import { resolveParallelTaskCwd } from "./subagent-executor-worktree.ts";
23
+ import { inheritedIntercomGroup, resolveChildIntercomGroup } from "../shared/intercom-group.ts";
23
24
 
24
25
  interface ForegroundParallelRunInput {
25
26
  tasks: TaskParam[];
@@ -47,6 +48,8 @@ interface ForegroundParallelRunInput {
47
48
  onControlEvent?: (event: ControlEvent) => void;
48
49
  childIntercomTarget?: (agent: string, index: number) => string | undefined;
49
50
  orchestratorIntercomTarget?: string;
51
+ setIntercomGroup?: string | true;
52
+ sharedAutoIntercomGroup?: string;
50
53
  foregroundControl?: SubagentState["foregroundControls"] extends Map<string, infer T> ? T : never;
51
54
  concurrencyLimit: number;
52
55
  liveResults: (SingleResult | undefined)[];
@@ -58,7 +61,18 @@ interface ForegroundParallelRunInput {
58
61
  }
59
62
 
60
63
  export async function runForegroundParallelTasks(input: ForegroundParallelRunInput): Promise<SingleResult[]> {
64
+ const intercomDetachController = new AbortController();
61
65
  return mapConcurrent(input.tasks, input.concurrencyLimit, async (task, index) => {
66
+ if (intercomDetachController.signal.aborted) {
67
+ return {
68
+ agent: task.agent,
69
+ task: input.taskTexts[index] ?? task.task,
70
+ exitCode: -1,
71
+ messages: [],
72
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },
73
+ error: "Skipped after foreground group detached for intercom coordination",
74
+ };
75
+ }
62
76
  const behavior = input.behaviors[index];
63
77
  const effectiveSkills = behavior?.skills;
64
78
  const taskCwd = resolveParallelTaskCwd(task, input.paramsCwd, input.worktreeSetup, index);
@@ -111,7 +125,14 @@ export async function runForegroundParallelTasks(input: ForegroundParallelRunInp
111
125
  onControlEvent: input.onControlEvent,
112
126
  intercomSessionName: input.childIntercomTarget?.(task.agent, index),
113
127
  orchestratorIntercomTarget: input.orchestratorIntercomTarget,
128
+ intercomGroup: resolveChildIntercomGroup(
129
+ task.group ?? input.setIntercomGroup,
130
+ inheritedIntercomGroup(input.ctx),
131
+ input.sharedAutoIntercomGroup,
132
+ ),
114
133
  onDetachedExit: (result) => input.onDetachedExit?.(index, result),
134
+ intercomDetachSignal: intercomDetachController.signal,
135
+ onIntercomDetachCommit: () => intercomDetachController.abort(),
115
136
  nestedRoute: input.foregroundControl?.nestedRoute,
116
137
  modelOverride: input.modelOverrides[index],
117
138
  availableModels: input.availableModels,
@@ -2,6 +2,7 @@ import { resolveModelCandidate } from "../shared/model-fallback.ts";
2
2
  import { collectKnownModelProviders, toModelInfo, type ModelInfo } from "../../shared/model-info.ts";
3
3
  import { normalizeSkillInput } from "../../agents/skills.ts";
4
4
  import { aggregateParallelOutputs } from "../shared/parallel-utils.ts";
5
+ import { sharedAutoGroupForSet } from "../shared/intercom-group.ts";
5
6
  import { recordRun } from "../shared/run-history.ts";
6
7
  import {
7
8
  resolveStepBehavior,
@@ -43,6 +44,7 @@ import {
43
44
  resolveParallelTaskCwd,
44
45
  } from "./subagent-executor-worktree.ts";
45
46
  import { createForegroundControlNotifier, maybeBuildForegroundIntercomReceipt, rememberForegroundRun, replaceForegroundRunChild } from "./subagent-executor-status.ts";
47
+ import { createDetachedCleanupBarrier } from "./detached-cleanup-barrier.ts";
46
48
 
47
49
  export async function runParallelPath(data: ExecutionContextData, deps: ResolvedExecutorDeps): Promise<SubagentToolResult> {
48
50
  const {
@@ -132,6 +134,12 @@ export async function runParallelPath(data: ExecutionContextData, deps: Resolved
132
134
  deps.config.worktreeSetupHook,
133
135
  deps.config.worktreeSetupHookTimeoutMs,
134
136
  );
137
+ let worktreeCleanupDeferred = false;
138
+ const detachedCleanup = createDetachedCleanupBarrier(() => {
139
+ if (!worktreeSetup) return;
140
+ buildParallelWorktreeSuffix(worktreeSetup, artifactsDir, tasks as TaskParam[]);
141
+ cleanupWorktrees(worktreeSetup);
142
+ });
135
143
  if (errorResult) return errorResult;
136
144
 
137
145
  try {
@@ -160,7 +168,13 @@ export async function runParallelPath(data: ExecutionContextData, deps: Resolved
160
168
  }
161
169
 
162
170
  const results = await runForegroundParallelTasks({
163
- onDetachedExit: (index, result) => replaceForegroundRunChild(deps.state, runId, index, result),
171
+ onDetachedExit: (index, result) => {
172
+ try {
173
+ replaceForegroundRunChild(deps.state, runId, index, result);
174
+ } finally {
175
+ detachedCleanup.recover(index);
176
+ }
177
+ },
164
178
  tasks,
165
179
  taskTexts,
166
180
  agents,
@@ -185,6 +199,8 @@ export async function runParallelPath(data: ExecutionContextData, deps: Resolved
185
199
  onControlEvent,
186
200
  childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(runId, agent, index) : undefined,
187
201
  orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
202
+ setIntercomGroup: params.group,
203
+ sharedAutoIntercomGroup: sharedAutoGroupForSet(params.group, tasks),
188
204
  foregroundControl,
189
205
  concurrencyLimit: parallelConcurrency,
190
206
  maxSubagentDepths,
@@ -221,6 +237,9 @@ export async function runParallelPath(data: ExecutionContextData, deps: Resolved
221
237
  }
222
238
  const detachedIndex = results.findIndex((result) => result.detached);
223
239
  const detached = detachedIndex >= 0 ? results[detachedIndex] : undefined;
240
+ worktreeCleanupDeferred = detachedCleanup.defer(
241
+ results.flatMap((result, index) => result.detached ? [index] : []),
242
+ );
224
243
  if (detached) {
225
244
  return {
226
245
  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.` }],
@@ -266,6 +285,6 @@ export async function runParallelPath(data: ExecutionContextData, deps: Resolved
266
285
  details,
267
286
  };
268
287
  } finally {
269
- if (worktreeSetup) cleanupWorktrees(worktreeSetup);
288
+ if (worktreeSetup && !worktreeCleanupDeferred) cleanupWorktrees(worktreeSetup);
270
289
  }
271
290
  }
@@ -25,6 +25,7 @@ import {
25
25
  resolveIntercomSessionTarget,
26
26
  resolveSubagentIntercomTarget,
27
27
  } from "../../intercom/intercom-bridge.ts";
28
+ import { requestSupervisorAuthorization } from "../../intercom/supervisor-authorization.ts";
28
29
  import { resolveCurrentSessionId } from "../../shared/session-identity.ts";
29
30
  import { resolveExecutionAgentScope } from "../../agents/agent-scope.ts";
30
31
  import {
@@ -415,6 +416,10 @@ export async function resumeAsyncRun(input: {
415
416
  }
416
417
 
417
418
  const runId = randomUUID().slice(0, 8);
419
+ const revivedTarget = intercomBridge.active
420
+ ? resolveSubagentIntercomTarget(runId, target.agent, 0)
421
+ : undefined;
422
+ const supervisorAuthorization = await requestSupervisorAuthorization(input.deps.pi.events, revivedTarget);
418
423
  const artifactConfig: ArtifactConfig = { ...DEFAULT_ARTIFACT_CONFIG, enabled: input.params.artifacts !== false };
419
424
  const availableModels = input.ctx.modelRegistry.getAvailable().map(toModelInfo);
420
425
  const result = input.deps.runtime.executeAsyncSingle(runId, {
@@ -444,12 +449,12 @@ export async function resumeAsyncRun(input: {
444
449
  controlConfig: resolveControlConfig(input.deps.config.control, input.params.control),
445
450
  controlIntercomTarget: intercomBridge.active ? intercomBridge.orchestratorTarget : undefined,
446
451
  childIntercomTarget: intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(runId, agent, index) : undefined,
452
+ supervisorAuthorization,
447
453
  availableModels,
448
454
  });
449
455
  if (result.isError) return result;
450
456
 
451
457
  const revivedId = result.details.asyncId ?? runId;
452
- const revivedTarget = intercomBridge.active ? resolveSubagentIntercomTarget(revivedId, target.agent, 0) : undefined;
453
458
  const sourceLabel = target.source;
454
459
  const lines = [
455
460
  `Revived ${sourceLabel} subagent from ${target.runId}.`,
@@ -7,6 +7,7 @@ import { injectSingleProgressInstruction, resolveSingleProgress, writeInitialPro
7
7
  import { recordRun } from "../shared/run-history.ts";
8
8
  import { getSingleResultOutput, compactForegroundDetails } from "../../shared/utils.ts";
9
9
  import { updateForegroundNestedProjection } from "../shared/nested-events.ts";
10
+ import { inheritedIntercomGroup, resolveChildIntercomGroup } from "../shared/intercom-group.ts";
10
11
  import {
11
12
  INTERCOM_BRIDGE_MARKER,
12
13
  resolveSubagentIntercomTarget,
@@ -186,6 +187,7 @@ export async function runSinglePath(data: ExecutionContextData, deps: ResolvedEx
186
187
  onControlEvent,
187
188
  intercomSessionName: childIntercomTarget,
188
189
  orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : undefined,
190
+ intercomGroup: resolveChildIntercomGroup(params.group, inheritedIntercomGroup(ctx), undefined),
189
191
  nestedRoute: foregroundControl?.nestedRoute,
190
192
  onDetachedExit: (result) => {
191
193
  cleanupTransientProgress(progressDir, artifactConfig.enabled);
@@ -18,6 +18,7 @@ export interface TaskParam {
18
18
  progress?: boolean;
19
19
  model?: string;
20
20
  skill?: string | string[] | boolean;
21
+ group?: string | true;
21
22
  }
22
23
 
23
24
  export interface SubagentParamsLike {
@@ -46,6 +47,7 @@ export interface SubagentParamsLike {
46
47
  includeProgress?: boolean;
47
48
  model?: string;
48
49
  skill?: string | string[] | boolean;
50
+ group?: string | true;
49
51
  output?: string | boolean;
50
52
  outputMode?: "inline" | "file-only";
51
53
  reads?: string[] | false;
@@ -227,7 +227,7 @@ export function createSubagentExecutor(rawDeps: ExecutorDeps): {
227
227
  const prepared = built.prepared!;
228
228
  let nestedForegroundStarted = false;
229
229
  try {
230
- const asyncResult = runAsyncPath(prepared.execData, deps);
230
+ const asyncResult = await runAsyncPath(prepared.execData, deps);
231
231
  if (asyncResult) return withForkContext(asyncResult, prepared.effectiveParams.context);
232
232
  if (prepared.foregroundControl) {
233
233
  prepared.writeNestedForegroundEvent("subagent.nested.started");
@@ -0,0 +1,50 @@
1
+ import { randomUUID } from "node:crypto";
2
+
3
+ interface OrchestrationCarrier {
4
+ orchestrationContext?: { intercomGroup?: string } | undefined;
5
+ }
6
+
7
+ /** Normalize agent-serialized auto-group sentinels without changing real group names. */
8
+ export function normalizeAutoGroupSentinel(group: string | true | undefined): string | true | undefined {
9
+ if (group === undefined || group === true) return group;
10
+ const sentinel = group.trim().toLowerCase();
11
+ return sentinel === "true" || sentinel === "auto" ? true : group;
12
+ }
13
+
14
+ /** Read the inherited stage/session intercom group from the extension context (never from process.env). */
15
+ export function inheritedIntercomGroup(ctx: OrchestrationCarrier | undefined): string | undefined {
16
+ const group = ctx?.orchestrationContext?.intercomGroup;
17
+ return typeof group === "string" && group.trim().length > 0 ? group.trim() : undefined;
18
+ }
19
+
20
+ /**
21
+ * Resolve the intercom group for a spawned subagent child. Precedence:
22
+ * explicit task/parallel/chain group > inherited current-session (stage) group.
23
+ * `true` resolves to `sharedAutoGroup` (a single UUID minted once per parallel
24
+ * set) so every child in the set shares one isolated group. Returns undefined
25
+ * when nothing applies, so the child inherits env/config/default itself.
26
+ */
27
+ export function resolveChildIntercomGroup(
28
+ explicit: string | true | undefined,
29
+ inherited: string | undefined,
30
+ sharedAutoGroup: string | undefined,
31
+ ): string | undefined {
32
+ const normalized = normalizeAutoGroupSentinel(explicit);
33
+ if (normalized === true) return sharedAutoGroup ?? randomUUID();
34
+ if (typeof normalized === "string" && normalized.trim().length > 0) return normalized.trim();
35
+ return inherited;
36
+ }
37
+
38
+ /**
39
+ * Mint one shared auto-group UUID for a set when the set-level group or any item
40
+ * requested `true`; otherwise undefined. Ensures all `true` items in one parallel
41
+ * set land in the SAME group.
42
+ */
43
+ export function sharedAutoGroupForSet(
44
+ setGroup: string | true | undefined,
45
+ items: ReadonlyArray<{ group?: string | true }>,
46
+ ): string | undefined {
47
+ const needsAuto = normalizeAutoGroupSentinel(setGroup) === true
48
+ || items.some((item) => normalizeAutoGroupSentinel(item.group) === true);
49
+ return needsAuto ? randomUUID() : undefined;
50
+ }
@@ -40,6 +40,10 @@ export const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = `${ENV_PREFIX}_SUBAGENT_PARE
40
40
  export const SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV = `${ENV_PREFIX}_SUBAGENT_INHERIT_PROJECT_CONTEXT`;
41
41
  export const SUBAGENT_INHERIT_SKILLS_ENV = `${ENV_PREFIX}_SUBAGENT_INHERIT_SKILLS`;
42
42
  export const SUBAGENT_INTERCOM_SESSION_NAME_ENV = `${ENV_PREFIX}_SUBAGENT_INTERCOM_SESSION_NAME`;
43
+ export const SUBAGENT_SUPERVISOR_CAPABILITY_ENV = `${ENV_PREFIX}_SUBAGENT_SUPERVISOR_CAPABILITY`;
44
+ export const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = `${ENV_PREFIX}_SUBAGENT_SUPERVISOR_SESSION_ID`;
45
+ /** Intercom home-group env key (not a _SUBAGENT_ key); resolves ATOMIC_/PI_ variants. */
46
+ export const INTERCOM_GROUP_ENV = `${ENV_PREFIX}_INTERCOM_GROUP`;
43
47
  const STRUCTURED_OUTPUT_TOOL_NAME = "structured_output";
44
48
 
45
49
  interface BuildPiArgsInput {
@@ -61,6 +65,8 @@ interface BuildPiArgsInput {
61
65
  promptFileStem?: string;
62
66
  intercomSessionName?: string;
63
67
  orchestratorIntercomTarget?: string;
68
+ intercomGroup?: string;
69
+ supervisorAuthorization?: { capability: string; supervisorSessionId: string };
64
70
  runId?: string;
65
71
  childAgentName?: string;
66
72
  childIndex?: number;
@@ -262,6 +268,16 @@ export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
262
268
  if (input.orchestratorIntercomTarget) {
263
269
  env[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;
264
270
  }
271
+ // Always override inherited capability metadata: a child must never pass its
272
+ // own supervisor authority to a descendant that lacks a freshly issued grant.
273
+ env[SUBAGENT_SUPERVISOR_CAPABILITY_ENV] = input.supervisorAuthorization?.capability ?? "";
274
+ env[SUBAGENT_SUPERVISOR_SESSION_ID_ENV] = input.supervisorAuthorization?.supervisorSessionId ?? "";
275
+ // Only assign an intercom group when the child actually has intercom access
276
+ // (peer intercom session name OR contact_supervisor orchestrator target).
277
+ const hasIntercomAccess = Boolean(input.intercomSessionName || input.orchestratorIntercomTarget);
278
+ if (input.intercomGroup && hasIntercomAccess) {
279
+ env[INTERCOM_GROUP_ENV] = input.intercomGroup;
280
+ }
265
281
  if (input.runId) {
266
282
  env[SUBAGENT_RUN_ID_ENV] = input.runId;
267
283
  }
@@ -0,0 +1,75 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+
4
+ export interface WorktreeGitResult { stdout: string; stderr: string; status: number | null }
5
+ export type WorktreeGitRunner = (cwd: string, args: string[]) => WorktreeGitResult;
6
+
7
+ function tracked(runGit: WorktreeGitRunner, repo: string, relativePath: string): boolean {
8
+ return runGit(repo, ["ls-files", "--error-unmatch", "--", relativePath]).status === 0;
9
+ }
10
+ function hasTrackedPathComponent(runGit: WorktreeGitRunner, repo: string, relativePath: string): boolean {
11
+ const components = relativePath.split(/[\\/]+/).filter(Boolean);
12
+ let candidate = "";
13
+ for (const component of components) {
14
+ candidate = candidate ? `${candidate}/${component}` : component;
15
+ const result = runGit(repo, ["ls-files", "--stage", "--", candidate]);
16
+ if (result.stdout.split(/\r?\n/).some((line) => line.slice(line.indexOf("\t") + 1) === candidate)) return true;
17
+ }
18
+ return false;
19
+ }
20
+ function copySettings(runGit: WorktreeGitRunner, mainRoot: string, worktreeRoot: string, relativePath: string): boolean {
21
+ const source = path.join(mainRoot, relativePath);
22
+ const destination = path.join(worktreeRoot, relativePath);
23
+ if (!fs.existsSync(source) || fs.existsSync(destination) || hasTrackedPathComponent(runGit, worktreeRoot, relativePath)) return false;
24
+ fs.mkdirSync(path.dirname(destination), { recursive: true });
25
+ fs.copyFileSync(source, destination);
26
+ return true;
27
+ }
28
+ function configureHooks(runGit: WorktreeGitRunner, mainRoot: string): void {
29
+ const husky = path.join(mainRoot, ".husky");
30
+ const ordinary = path.join(mainRoot, ".git", "hooks");
31
+ let desired: string | undefined;
32
+ try { if (fs.statSync(husky).isDirectory()) desired = husky; } catch { /* continue */ }
33
+ if (!desired) {
34
+ try {
35
+ if (fs.readdirSync(ordinary, { withFileTypes: true }).some((entry) => entry.isFile() && !entry.name.endsWith(".sample"))) desired = ordinary;
36
+ } catch { /* no hooks */ }
37
+ }
38
+ if (!desired) return;
39
+ const current = runGit(mainRoot, ["config", "--get", "core.hooksPath"]);
40
+ if (current.status === 0 && path.resolve(mainRoot, current.stdout.trim()) === desired) return;
41
+ const result = runGit(mainRoot, ["config", "core.hooksPath", desired]);
42
+ if (result.status !== 0) throw new Error(result.stderr.trim() || "failed to configure shared core.hooksPath");
43
+ }
44
+ function copyIncludes(runGit: WorktreeGitRunner, mainRoot: string, worktreeRoot: string): void {
45
+ if (!fs.existsSync(path.join(mainRoot, ".worktreeinclude"))) return;
46
+ const ignored = runGit(mainRoot, ["ls-files", "--others", "--ignored", "--exclude-standard"]);
47
+ const included = runGit(mainRoot, ["ls-files", "--others", "--ignored", "--exclude-from=.worktreeinclude"]);
48
+ if (ignored.status !== 0 || included.status !== 0) return;
49
+ const ignoredPaths = new Set(ignored.stdout.split(/\r?\n/).filter(Boolean));
50
+ for (const relativePath of included.stdout.split(/\r?\n/).filter(Boolean)) {
51
+ if (!ignoredPaths.has(relativePath) || hasTrackedPathComponent(runGit, worktreeRoot, relativePath)) continue;
52
+ const source = path.join(mainRoot, relativePath);
53
+ const destination = path.join(worktreeRoot, relativePath);
54
+ try {
55
+ if (!fs.statSync(source).isFile() || fs.existsSync(destination)) continue;
56
+ fs.mkdirSync(path.dirname(destination), { recursive: true });
57
+ fs.copyFileSync(source, destination);
58
+ } catch { /* concurrent removal */ }
59
+ }
60
+ }
61
+ export function performPostCreationSetup(runGit: WorktreeGitRunner, mainRoot: string, worktreeRoot: string): string[] {
62
+ const synthetic: string[] = [];
63
+ if (copySettings(runGit, mainRoot, worktreeRoot, ".atomic/settings.local.json")) synthetic.push(".atomic/settings.local.json");
64
+ if (!tracked(runGit, mainRoot, ".atomic/settings.json") && copySettings(runGit, mainRoot, worktreeRoot, ".atomic/settings.json")) {
65
+ synthetic.push(".atomic/settings.json");
66
+ }
67
+ configureHooks(runGit, mainRoot);
68
+ const source = path.join(mainRoot, "node_modules");
69
+ const destination = path.join(worktreeRoot, "node_modules");
70
+ if (fs.existsSync(source) && !fs.existsSync(destination) && !tracked(runGit, worktreeRoot, "node_modules")) {
71
+ try { fs.symlinkSync(source, destination, process.platform === "win32" ? "junction" : undefined); synthetic.push("node_modules"); } catch { /* optional */ }
72
+ }
73
+ copyIncludes(runGit, mainRoot, worktreeRoot);
74
+ return synthetic;
75
+ }
@@ -0,0 +1,51 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+
4
+ function readText(file: string): string | undefined {
5
+ try { return fs.readFileSync(file, "utf8"); } catch { return undefined; }
6
+ }
7
+ function samePath(left: string, right: string): boolean {
8
+ try {
9
+ const a = fs.realpathSync.native(left);
10
+ const b = fs.realpathSync.native(right);
11
+ return process.platform === "win32" ? a.toLowerCase() === b.toLowerCase() : a === b;
12
+ } catch { return false; }
13
+ }
14
+ export function findGitRoot(cwd: string): string | undefined {
15
+ let current = path.resolve(cwd);
16
+ try { if (!fs.statSync(current).isDirectory()) current = path.dirname(current); } catch { return undefined; }
17
+ while (true) {
18
+ try {
19
+ const entry = fs.statSync(path.join(current, ".git"));
20
+ if (entry.isDirectory() || entry.isFile()) return current;
21
+ } catch { /* walk */ }
22
+ const parent = path.dirname(current);
23
+ if (parent === current) return undefined;
24
+ current = parent;
25
+ }
26
+ }
27
+ export function resolveMainRepoRoot(repoRoot: string): string | undefined {
28
+ const gitEntry = path.join(repoRoot, ".git");
29
+ let stats: fs.Stats;
30
+ try { stats = fs.statSync(gitEntry); } catch { return undefined; }
31
+ if (stats.isDirectory()) return path.resolve(repoRoot);
32
+ if (!stats.isFile()) return undefined;
33
+ const contents = readText(gitEntry);
34
+ if (contents === undefined || !contents.startsWith("gitdir:")) return undefined;
35
+ const pointer = contents.slice("gitdir:".length).trim();
36
+ if (!pointer) return undefined;
37
+ const gitDir = path.resolve(repoRoot, pointer);
38
+ if (path.basename(path.dirname(gitDir)) !== "worktrees") return undefined;
39
+ const commonGitDir = path.dirname(path.dirname(gitDir));
40
+ if (path.basename(commonGitDir) !== ".git") return undefined;
41
+ const back = readText(path.join(gitDir, "gitdir"))?.trim();
42
+ const common = readText(path.join(gitDir, "commondir"))?.trim();
43
+ if (!back || !common) return undefined;
44
+ if (!samePath(path.resolve(gitDir, back), gitEntry)) return undefined;
45
+ if (!samePath(path.resolve(gitDir, common), commonGitDir)) return undefined;
46
+ return path.dirname(commonGitDir);
47
+ }
48
+ export function findCanonicalGitRoot(cwd: string): string | undefined {
49
+ const repoRoot = findGitRoot(cwd);
50
+ return repoRoot === undefined ? undefined : resolveMainRepoRoot(repoRoot);
51
+ }
@@ -2,7 +2,9 @@ import { spawnSync } from "node:child_process";
2
2
  import * as fs from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
- import { APP_NAME, createGitEnvironment } from "@bastani/atomic";
5
+ import { createGitEnvironment } from "@bastani/atomic";
6
+ import { performPostCreationSetup } from "./worktree-post-create.js";
7
+ import { findCanonicalGitRoot } from "./worktree-root.js";
6
8
  export interface WorktreeSetup {
7
9
  cwd: string;
8
10
  worktrees: WorktreeInfo[];
@@ -63,9 +65,10 @@ interface GitResult {
63
65
  status: number | null;
64
66
  }
65
67
  interface RepoState {
66
- toplevel: string;
68
+ mainRoot: string;
67
69
  cwdRelative: string;
68
70
  baseCommit: string;
71
+ baseRef: string;
69
72
  }
70
73
  const DEFAULT_WORKTREE_SETUP_HOOK_TIMEOUT_MS = 30000;
71
74
  function runGit(cwd: string, args: string[]): GitResult {
@@ -85,15 +88,30 @@ function runGitChecked(cwd: string, args: string[]): string {
85
88
  }
86
89
  return result.stdout;
87
90
  }
91
+ function originDefaultBranch(mainRoot: string): string | undefined {
92
+ const symbolic = runGit(mainRoot, ["symbolic-ref", "--short", "refs/remotes/origin/HEAD"]);
93
+ let branch = symbolic.status === 0 && symbolic.stdout.trim().startsWith("origin/")
94
+ ? symbolic.stdout.trim().slice("origin/".length) : undefined;
95
+ if (!branch) {
96
+ const remote = runGit(mainRoot, ["remote", "show", "origin"]);
97
+ branch = remote.status === 0 ? remote.stdout.match(/^\s*HEAD branch:\s*(\S+)\s*$/m)?.[1] : undefined;
98
+ }
99
+ if (!branch || branch === "(unknown)") return undefined;
100
+ const remoteRef = `refs/remotes/origin/${branch}`;
101
+ if (runGit(mainRoot, ["show-ref", "--verify", "--quiet", remoteRef]).status !== 0
102
+ && runGit(mainRoot, ["fetch", "origin", `${branch}:${remoteRef}`]).status !== 0) return undefined;
103
+ return `origin/${branch}`;
104
+ }
88
105
  function resolveRepoState(cwd: string): RepoState {
89
106
  const cwdRelative = resolveRepoCwdRelative(cwd);
90
- const toplevel = runGitChecked(cwd, ["rev-parse", "--show-toplevel"]).trim();
91
- const status = runGitChecked(toplevel, ["status", "--porcelain"]);
92
- if (status.trim().length > 0) {
93
- throw new Error("worktree isolation requires a clean git working tree. Commit or stash changes first.");
94
- }
95
- const baseCommit = runGitChecked(toplevel, ["rev-parse", "HEAD"]).trim();
96
- return { toplevel, cwdRelative, baseCommit };
107
+ const toplevel = path.resolve(runGitChecked(cwd, ["rev-parse", "--show-toplevel"]).trim());
108
+ const mainRoot = findCanonicalGitRoot(toplevel);
109
+ if (mainRoot === undefined) throw new Error(`unable to resolve canonical main Git repository root from ${toplevel}`);
110
+ const status = runGitChecked(toplevel, ["status", "--porcelain", "--untracked-files=no"]);
111
+ if (status.trim().length > 0) throw new Error("worktree isolation requires a clean git working tree. Commit or stash changes first.");
112
+ const baseRef = originDefaultBranch(mainRoot) || "HEAD";
113
+ const baseCommit = runGitChecked(mainRoot, ["rev-parse", baseRef]).trim();
114
+ return { mainRoot, cwdRelative, baseCommit, baseRef };
97
115
  }
98
116
  function normalizeComparableCwd(cwd: string): string {
99
117
  const resolved = path.resolve(cwd);
@@ -126,11 +144,19 @@ export function formatWorktreeTaskCwdConflict(
126
144
  function safePatchAgentName(agent: string): string {
127
145
  return agent.replace(/[^\w.-]/g, "_");
128
146
  }
147
+ function flattenedWorktreeName(runId: string, index: number): string {
148
+ return `${runId}-${index}`.replaceAll("/", "+");
149
+ }
129
150
  function buildWorktreeBranch(runId: string, index: number): string {
130
- return `${APP_NAME}-parallel-${runId}-${index}`;
151
+ return `worktree-${flattenedWorktreeName(runId, index)}`;
152
+ }
153
+ function buildWorktreePath(mainRoot: string, runId: string, index: number): string {
154
+ return path.join(mainRoot, ".atomic", "worktrees", flattenedWorktreeName(runId, index));
131
155
  }
132
- function buildWorktreePath(runId: string, index: number): string {
133
- return path.join(os.tmpdir(), `${APP_NAME}-worktree-${runId}-${index}`);
156
+ function ensureWorktreeIgnore(mainRoot: string): void {
157
+ const root = path.join(mainRoot, ".atomic", "worktrees");
158
+ fs.mkdirSync(root, { recursive: true });
159
+ fs.writeFileSync(path.join(root, ".gitignore"), "*\n", "utf8");
134
160
  }
135
161
  function resolveRepoCwdRelative(cwd: string): string {
136
162
  const repoCheck = runGit(cwd, ["rev-parse", "--is-inside-work-tree"]);
@@ -145,20 +171,12 @@ function resolveRepoCwdRelative(cwd: string): string {
145
171
  }
146
172
  export function resolveExpectedWorktreeAgentCwd(cwd: string, runId: string, index: number): string {
147
173
  const cwdRelative = resolveRepoCwdRelative(cwd);
148
- const worktreePath = buildWorktreePath(runId, index);
174
+ const toplevel = path.resolve(runGitChecked(cwd, ["rev-parse", "--show-toplevel"]).trim());
175
+ const mainRoot = findCanonicalGitRoot(toplevel);
176
+ if (mainRoot === undefined) throw new Error(`unable to resolve canonical main Git repository root from ${toplevel}`);
177
+ const worktreePath = buildWorktreePath(mainRoot, runId, index);
149
178
  return cwdRelative ? path.join(worktreePath, cwdRelative) : worktreePath;
150
179
  }
151
- function linkNodeModulesIfPresent(toplevel: string, worktreePath: string): boolean {
152
- const nodeModulesPath = path.join(toplevel, "node_modules");
153
- const nodeModulesLinkPath = path.join(worktreePath, "node_modules");
154
- if (!fs.existsSync(nodeModulesPath) || fs.existsSync(nodeModulesLinkPath)) return false;
155
- try {
156
- fs.symlinkSync(nodeModulesPath, nodeModulesLinkPath);
157
- return true;
158
- } catch {
159
- return false;
160
- }
161
- }
162
180
  function parseHookTimeout(timeoutMs: number | undefined): number {
163
181
  if (timeoutMs === undefined) return DEFAULT_WORKTREE_SETUP_HOOK_TIMEOUT_MS;
164
182
  if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {
@@ -270,53 +288,46 @@ function runWorktreeSetupHook(
270
288
  }
271
289
  return [...uniquePaths];
272
290
  }
291
+ function waitForGitLockRelease(): void {
292
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
293
+ }
294
+ function cleanupSingleWorktree(repoCwd: string, worktree: Pick<WorktreeInfo, "path" | "branch">): void {
295
+ try { runGitChecked(repoCwd, ["worktree", "remove", "--force", worktree.path]); } catch { /* idempotent */ }
296
+ waitForGitLockRelease();
297
+ try { runGitChecked(repoCwd, ["branch", "-D", worktree.branch]); } catch { /* idempotent */ }
298
+ }
273
299
  function createSingleWorktree(
274
- toplevel: string,
300
+ mainRoot: string,
275
301
  cwdRelative: string,
276
302
  runId: string,
277
303
  index: number,
304
+ baseRef: string,
278
305
  baseCommit: string,
279
306
  setupHook: ResolvedWorktreeSetupHook | undefined,
280
307
  agent: string | undefined,
281
308
  ): WorktreeInfo {
282
309
  const branch = buildWorktreeBranch(runId, index);
283
- const worktreePath = buildWorktreePath(runId, index);
284
- const add = runGit(toplevel, ["worktree", "add", worktreePath, "-b", branch, "HEAD"]);
310
+ const worktreePath = buildWorktreePath(mainRoot, runId, index);
311
+ const add = runGit(mainRoot, ["worktree", "add", "-B", branch, worktreePath, baseRef]);
285
312
  if (add.status !== 0) {
286
313
  const message = add.stderr.trim() || add.stdout.trim() || `failed to create worktree ${worktreePath}`;
314
+ cleanupSingleWorktree(mainRoot, { path: worktreePath, branch });
287
315
  throw new Error(message);
288
316
  }
289
317
  const agentCwd = cwdRelative ? path.join(worktreePath, cwdRelative) : worktreePath;
290
318
  try {
291
- const nodeModulesLinked = linkNodeModulesIfPresent(toplevel, worktreePath);
292
- const syntheticPaths = nodeModulesLinked ? ["node_modules"] : [];
319
+ const syntheticPaths = performPostCreationSetup(runGit, mainRoot, worktreePath);
293
320
  if (setupHook) {
294
- const hookSyntheticPaths = runWorktreeSetupHook(setupHook, {
295
- version: 1,
296
- repoRoot: toplevel,
297
- worktreePath,
298
- agentCwd,
299
- branch,
300
- index,
301
- runId,
302
- baseCommit,
303
- agent,
304
- });
305
- syntheticPaths.push(...hookSyntheticPaths);
321
+ syntheticPaths.push(...runWorktreeSetupHook(setupHook, {
322
+ version: 1, repoRoot: mainRoot, worktreePath, agentCwd, branch, index, runId, baseCommit, agent,
323
+ }));
306
324
  }
307
325
  return {
308
- path: worktreePath,
309
- agentCwd,
310
- branch,
311
- index,
312
- nodeModulesLinked,
313
- syntheticPaths,
326
+ path: worktreePath, agentCwd, branch, index,
327
+ nodeModulesLinked: syntheticPaths.includes("node_modules"), syntheticPaths,
314
328
  };
315
329
  } catch (error) {
316
- try { runGitChecked(toplevel, ["worktree", "remove", "--force", worktreePath]); } catch {
317
- }
318
- try { runGitChecked(toplevel, ["branch", "-D", branch]); } catch {
319
- }
330
+ cleanupSingleWorktree(mainRoot, { path: worktreePath, branch });
320
331
  throw error;
321
332
  }
322
333
  }
@@ -415,44 +426,27 @@ function writeEmptyPatch(patchPath: string): void {
415
426
  } catch {
416
427
  }
417
428
  }
418
- function cleanupSingleWorktree(repoCwd: string, worktree: WorktreeInfo): void {
419
- try { runGitChecked(repoCwd, ["worktree", "remove", "--force", worktree.path]); } catch {
420
- }
421
- try { runGitChecked(repoCwd, ["branch", "-D", worktree.branch]); } catch {
422
- }
423
- }
429
+
424
430
  function hasWorktreeChanges(diff: WorktreeDiff): boolean {
425
431
  return diff.filesChanged > 0 || diff.insertions > 0 || diff.deletions > 0 || diff.diffStat.trim().length > 0;
426
432
  }
427
433
  export function createWorktrees(cwd: string, runId: string, count: number, options?: CreateWorktreesOptions): WorktreeSetup {
428
434
  const repo = resolveRepoState(cwd);
429
- const setupHook = resolveWorktreeSetupHook(repo.toplevel, options?.setupHook);
435
+ ensureWorktreeIgnore(repo.mainRoot);
436
+ const setupHook = resolveWorktreeSetupHook(repo.mainRoot, options?.setupHook);
430
437
  const worktrees: WorktreeInfo[] = [];
431
438
  try {
432
439
  for (let index = 0; index < count; index++) {
433
440
  worktrees.push(createSingleWorktree(
434
- repo.toplevel,
435
- repo.cwdRelative,
436
- runId,
437
- index,
438
- repo.baseCommit,
439
- setupHook,
440
- options?.agents?.[index],
441
+ repo.mainRoot, repo.cwdRelative, runId, index, repo.baseRef, repo.baseCommit,
442
+ setupHook, options?.agents?.[index],
441
443
  ));
442
444
  }
443
445
  } catch (error) {
444
- cleanupWorktrees({
445
- cwd: repo.toplevel,
446
- worktrees,
447
- baseCommit: repo.baseCommit,
448
- });
446
+ cleanupWorktrees({ cwd: repo.mainRoot, worktrees, baseCommit: repo.baseCommit });
449
447
  throw error;
450
448
  }
451
- return {
452
- cwd: repo.toplevel,
453
- worktrees,
454
- baseCommit: repo.baseCommit,
455
- };
449
+ return { cwd: repo.mainRoot, worktrees, baseCommit: repo.baseCommit };
456
450
  }
457
451
  export function diffWorktrees(setup: WorktreeSetup, agents: string[], diffsDir: string): WorktreeDiff[] {
458
452
  try {
@@ -478,8 +472,6 @@ export function cleanupWorktrees(setup: WorktreeSetup): void {
478
472
  for (let index = setup.worktrees.length - 1; index >= 0; index--) {
479
473
  cleanupSingleWorktree(setup.cwd, setup.worktrees[index]!);
480
474
  }
481
- try { runGitChecked(setup.cwd, ["worktree", "prune"]); } catch {
482
- }
483
475
  }
484
476
  export function formatWorktreeDiffSummary(diffs: WorktreeDiff[]): string {
485
477
  const changed = diffs.filter(hasWorktreeChanges);