pi-subagents 0.69.0 → 0.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1448) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/agents/reviewer.md +3 -2
  3. package/docs/agents.md +6 -2
  4. package/docs/configuration.md +1 -1
  5. package/docs/extension-api.md +1 -1
  6. package/docs/models.md +3 -1
  7. package/docs/observability.md +6 -0
  8. package/docs/watchdog.md +2 -0
  9. package/docs/workflows.md +6 -2
  10. package/index.d.ts +3 -0
  11. package/index.d.ts.map +1 -0
  12. package/index.js +10 -0
  13. package/index.js.map +1 -0
  14. package/package.json +89 -73
  15. package/runner-peer-loader.mjs +4 -7
  16. package/runner-peer-preload.mjs +5 -7
  17. package/skills/pi-subagents/references/prompting-and-roles.md +2 -2
  18. package/src/agents/advertised-agent-prompt.d.ts +8 -0
  19. package/src/agents/advertised-agent-prompt.d.ts.map +1 -0
  20. package/src/agents/advertised-agent-prompt.js +77 -0
  21. package/src/agents/advertised-agent-prompt.js.map +1 -0
  22. package/src/agents/agent-management.d.ts +27 -0
  23. package/src/agents/agent-management.d.ts.map +1 -0
  24. package/src/agents/agent-management.js +1528 -0
  25. package/src/agents/agent-management.js.map +1 -0
  26. package/src/agents/agent-memory.d.ts +49 -0
  27. package/src/agents/agent-memory.d.ts.map +1 -0
  28. package/src/agents/agent-memory.js +349 -0
  29. package/src/agents/agent-memory.js.map +1 -0
  30. package/src/agents/agent-refinements.d.ts +100 -0
  31. package/src/agents/agent-refinements.d.ts.map +1 -0
  32. package/src/agents/agent-refinements.js +569 -0
  33. package/src/agents/agent-refinements.js.map +1 -0
  34. package/src/agents/agent-scope.d.ts +3 -0
  35. package/src/agents/agent-scope.d.ts.map +1 -0
  36. package/src/agents/agent-scope.js +6 -0
  37. package/src/agents/agent-scope.js.map +1 -0
  38. package/src/agents/agent-selection.d.ts +3 -0
  39. package/src/agents/agent-selection.d.ts.map +1 -0
  40. package/src/agents/agent-selection.js +23 -0
  41. package/src/agents/agent-selection.js.map +1 -0
  42. package/src/agents/agent-serializer.d.ts +8 -0
  43. package/src/agents/agent-serializer.d.ts.map +1 -0
  44. package/src/agents/agent-serializer.js +200 -0
  45. package/src/agents/agent-serializer.js.map +1 -0
  46. package/src/agents/agents.d.ts +313 -0
  47. package/src/agents/agents.d.ts.map +1 -0
  48. package/src/agents/agents.js +2622 -0
  49. package/src/agents/agents.js.map +1 -0
  50. package/src/agents/builtin-names.d.ts +2 -0
  51. package/src/agents/builtin-names.d.ts.map +1 -0
  52. package/src/agents/builtin-names.js +17 -0
  53. package/src/agents/builtin-names.js.map +1 -0
  54. package/src/agents/chain-serializer.d.ts +7 -0
  55. package/src/agents/chain-serializer.d.ts.map +1 -0
  56. package/src/agents/chain-serializer.js +319 -0
  57. package/src/agents/chain-serializer.js.map +1 -0
  58. package/src/agents/frontmatter.d.ts +16 -0
  59. package/src/agents/frontmatter.d.ts.map +1 -0
  60. package/src/agents/frontmatter.js +142 -0
  61. package/src/agents/frontmatter.js.map +1 -0
  62. package/src/agents/identity.d.ts +8 -0
  63. package/src/agents/identity.d.ts.map +1 -0
  64. package/src/agents/identity.js +30 -0
  65. package/src/agents/identity.js.map +1 -0
  66. package/src/agents/proactive-skills.d.ts +35 -0
  67. package/src/agents/proactive-skills.d.ts.map +1 -0
  68. package/src/agents/proactive-skills.js +154 -0
  69. package/src/agents/proactive-skills.js.map +1 -0
  70. package/src/agents/runtime-agent-events.d.ts +27 -0
  71. package/src/agents/runtime-agent-events.d.ts.map +1 -0
  72. package/src/agents/runtime-agent-events.js +53 -0
  73. package/src/agents/runtime-agent-events.js.map +1 -0
  74. package/src/agents/runtime-agent-registry.d.ts +59 -0
  75. package/src/agents/runtime-agent-registry.d.ts.map +1 -0
  76. package/src/agents/runtime-agent-registry.js +390 -0
  77. package/src/agents/runtime-agent-registry.js.map +1 -0
  78. package/src/agents/skills.d.ts +33 -0
  79. package/src/agents/skills.d.ts.map +1 -0
  80. package/src/agents/skills.js +685 -0
  81. package/src/agents/skills.js.map +1 -0
  82. package/src/api/agents.d.ts +5 -0
  83. package/src/api/agents.d.ts.map +1 -0
  84. package/src/api/agents.js +3 -0
  85. package/src/api/agents.js.map +1 -0
  86. package/src/api/background-work.d.ts +39 -0
  87. package/src/api/background-work.d.ts.map +1 -0
  88. package/src/api/background-work.js +165 -0
  89. package/src/api/background-work.js.map +1 -0
  90. package/src/api/capability-ceiling.d.ts +2 -0
  91. package/src/api/capability-ceiling.d.ts.map +1 -0
  92. package/src/api/capability-ceiling.js +2 -0
  93. package/src/api/capability-ceiling.js.map +1 -0
  94. package/src/api/child-tool-plan.d.ts +2 -0
  95. package/src/api/child-tool-plan.d.ts.map +1 -0
  96. package/src/api/child-tool-plan.js +2 -0
  97. package/src/api/child-tool-plan.js.map +1 -0
  98. package/src/api/control-channel.d.ts +2 -0
  99. package/src/api/control-channel.d.ts.map +1 -0
  100. package/src/api/control-channel.js +2 -0
  101. package/src/api/control-channel.js.map +1 -0
  102. package/src/api/delegation.d.ts +99 -0
  103. package/src/api/delegation.d.ts.map +1 -0
  104. package/src/api/delegation.js +9 -0
  105. package/src/api/delegation.js.map +1 -0
  106. package/src/api/external-job-provider.d.ts +58 -0
  107. package/src/api/external-job-provider.d.ts.map +1 -0
  108. package/src/api/external-job-provider.js +140 -0
  109. package/src/api/external-job-provider.js.map +1 -0
  110. package/src/api/external-runs.d.ts +48 -0
  111. package/src/api/external-runs.d.ts.map +1 -0
  112. package/src/api/external-runs.js +245 -0
  113. package/src/api/external-runs.js.map +1 -0
  114. package/src/api/intercom-bridge.d.ts +2 -0
  115. package/src/api/intercom-bridge.d.ts.map +1 -0
  116. package/src/api/intercom-bridge.js +2 -0
  117. package/src/api/intercom-bridge.js.map +1 -0
  118. package/src/api/preflight.d.ts +173 -0
  119. package/src/api/preflight.d.ts.map +1 -0
  120. package/src/api/preflight.js +362 -0
  121. package/src/api/preflight.js.map +1 -0
  122. package/src/api/project-panes.d.ts +8 -0
  123. package/src/api/project-panes.d.ts.map +1 -0
  124. package/src/api/project-panes.js +8 -0
  125. package/src/api/project-panes.js.map +1 -0
  126. package/src/api/required-child-extensions.d.ts +2 -0
  127. package/src/api/required-child-extensions.d.ts.map +1 -0
  128. package/src/api/required-child-extensions.js +2 -0
  129. package/src/api/required-child-extensions.js.map +1 -0
  130. package/src/api/shared-types.d.ts +2 -0
  131. package/src/api/shared-types.d.ts.map +1 -0
  132. package/src/api/shared-types.js +2 -0
  133. package/src/api/shared-types.js.map +1 -0
  134. package/src/api/workflow-resources.d.ts +3 -0
  135. package/src/api/workflow-resources.d.ts.map +1 -0
  136. package/src/api/workflow-resources.js +2 -0
  137. package/src/api/workflow-resources.js.map +1 -0
  138. package/src/extension/config.d.ts +8 -0
  139. package/src/extension/config.d.ts.map +1 -0
  140. package/src/extension/config.js +245 -0
  141. package/src/extension/config.js.map +1 -0
  142. package/src/extension/control-notices.d.ts +19 -0
  143. package/src/extension/control-notices.d.ts.map +1 -0
  144. package/src/extension/control-notices.js +34 -0
  145. package/src/extension/control-notices.js.map +1 -0
  146. package/src/extension/doctor.d.ts +33 -0
  147. package/src/extension/doctor.d.ts.map +1 -0
  148. package/src/extension/doctor.js +231 -0
  149. package/src/extension/doctor.js.map +1 -0
  150. package/src/extension/fanout-child.d.ts +7 -0
  151. package/src/extension/fanout-child.d.ts.map +1 -0
  152. package/src/extension/fanout-child.js +261 -0
  153. package/src/extension/fanout-child.js.map +1 -0
  154. package/src/extension/herdr-pi-bridge.d.ts +17 -0
  155. package/src/extension/herdr-pi-bridge.d.ts.map +1 -0
  156. package/src/extension/herdr-pi-bridge.js +243 -0
  157. package/src/extension/herdr-pi-bridge.js.map +1 -0
  158. package/src/extension/index.d.ts +20 -0
  159. package/src/extension/index.d.ts.map +1 -0
  160. package/src/extension/index.js +1108 -0
  161. package/src/extension/index.js.map +1 -0
  162. package/src/extension/public-execution.d.ts +62 -0
  163. package/src/extension/public-execution.d.ts.map +1 -0
  164. package/src/extension/public-execution.js +174 -0
  165. package/src/extension/public-execution.js.map +1 -0
  166. package/src/extension/rpc.d.ts +83 -0
  167. package/src/extension/rpc.d.ts.map +1 -0
  168. package/src/extension/rpc.js +687 -0
  169. package/src/extension/rpc.js.map +1 -0
  170. package/src/extension/schemas.d.ts +252 -0
  171. package/src/extension/schemas.d.ts.map +1 -0
  172. package/src/extension/schemas.js +396 -0
  173. package/src/extension/schemas.js.map +1 -0
  174. package/src/extension/steering-notices.d.ts +15 -0
  175. package/src/extension/steering-notices.d.ts.map +1 -0
  176. package/src/extension/steering-notices.js +23 -0
  177. package/src/extension/steering-notices.js.map +1 -0
  178. package/src/extension/subagent-guide.d.ts +4 -0
  179. package/src/extension/subagent-guide.d.ts.map +1 -0
  180. package/src/extension/subagent-guide.js +35 -0
  181. package/src/extension/subagent-guide.js.map +1 -0
  182. package/src/extension/tool-description.d.ts +20 -0
  183. package/src/extension/tool-description.d.ts.map +1 -0
  184. package/src/extension/tool-description.js +160 -0
  185. package/src/extension/tool-description.js.map +1 -0
  186. package/src/extension/tool-result.d.ts +10 -0
  187. package/src/extension/tool-result.d.ts.map +1 -0
  188. package/src/extension/tool-result.js +17 -0
  189. package/src/extension/tool-result.js.map +1 -0
  190. package/src/inspectors/actions.d.ts +23 -0
  191. package/src/inspectors/actions.d.ts.map +1 -0
  192. package/src/inspectors/actions.js +155 -0
  193. package/src/inspectors/actions.js.map +1 -0
  194. package/src/inspectors/ghostty/actions.d.ts +12 -0
  195. package/src/inspectors/ghostty/actions.d.ts.map +1 -0
  196. package/src/inspectors/ghostty/actions.js +63 -0
  197. package/src/inspectors/ghostty/actions.js.map +1 -0
  198. package/src/inspectors/ghostty/plugin.d.ts +8 -0
  199. package/src/inspectors/ghostty/plugin.d.ts.map +1 -0
  200. package/src/inspectors/ghostty/plugin.js +24 -0
  201. package/src/inspectors/ghostty/plugin.js.map +1 -0
  202. package/src/inspectors/herdr/actions.d.ts +26 -0
  203. package/src/inspectors/herdr/actions.d.ts.map +1 -0
  204. package/src/inspectors/herdr/actions.js +134 -0
  205. package/src/inspectors/herdr/actions.js.map +1 -0
  206. package/src/inspectors/herdr/client.d.ts +42 -0
  207. package/src/inspectors/herdr/client.d.ts.map +1 -0
  208. package/src/inspectors/herdr/client.js +130 -0
  209. package/src/inspectors/herdr/client.js.map +1 -0
  210. package/src/inspectors/herdr/focus.d.ts +25 -0
  211. package/src/inspectors/herdr/focus.d.ts.map +1 -0
  212. package/src/inspectors/herdr/focus.js +50 -0
  213. package/src/inspectors/herdr/focus.js.map +1 -0
  214. package/src/inspectors/herdr/plugin.d.ts +7 -0
  215. package/src/inspectors/herdr/plugin.d.ts.map +1 -0
  216. package/src/inspectors/herdr/plugin.js +15 -0
  217. package/src/inspectors/herdr/plugin.js.map +1 -0
  218. package/src/inspectors/herdr/project-panes.d.ts +137 -0
  219. package/src/inspectors/herdr/project-panes.d.ts.map +1 -0
  220. package/src/inspectors/herdr/project-panes.js +608 -0
  221. package/src/inspectors/herdr/project-panes.js.map +1 -0
  222. package/src/inspectors/inspector-runner.d.ts +24 -0
  223. package/src/inspectors/inspector-runner.d.ts.map +1 -0
  224. package/src/inspectors/inspector-runner.js +162 -0
  225. package/src/inspectors/inspector-runner.js.map +1 -0
  226. package/src/inspectors/plugins.d.ts +4 -0
  227. package/src/inspectors/plugins.d.ts.map +1 -0
  228. package/src/inspectors/plugins.js +7 -0
  229. package/src/inspectors/plugins.js.map +1 -0
  230. package/src/inspectors/session-roots-codec.d.ts +16 -0
  231. package/src/inspectors/session-roots-codec.d.ts.map +1 -0
  232. package/src/inspectors/session-roots-codec.js +33 -0
  233. package/src/inspectors/session-roots-codec.js.map +1 -0
  234. package/src/inspectors/shell-command.d.ts +2 -0
  235. package/src/inspectors/shell-command.d.ts.map +1 -0
  236. package/src/inspectors/shell-command.js +17 -0
  237. package/src/inspectors/shell-command.js.map +1 -0
  238. package/src/inspectors/types.d.ts +49 -0
  239. package/src/inspectors/types.d.ts.map +1 -0
  240. package/src/inspectors/types.js +2 -0
  241. package/src/inspectors/types.js.map +1 -0
  242. package/src/integrations/herdr-status.d.ts +46 -0
  243. package/src/integrations/herdr-status.d.ts.map +1 -0
  244. package/src/integrations/herdr-status.js +371 -0
  245. package/src/integrations/herdr-status.js.map +1 -0
  246. package/src/integrations/pi-web-session-liveness.d.ts +20 -0
  247. package/src/integrations/pi-web-session-liveness.d.ts.map +1 -0
  248. package/src/integrations/pi-web-session-liveness.js +54 -0
  249. package/src/integrations/pi-web-session-liveness.js.map +1 -0
  250. package/src/intercom/intercom-bridge.d.ts +59 -0
  251. package/src/intercom/intercom-bridge.d.ts.map +1 -0
  252. package/src/intercom/intercom-bridge.js +192 -0
  253. package/src/intercom/intercom-bridge.js.map +1 -0
  254. package/src/intercom/native-supervisor-channel.d.ts +64 -0
  255. package/src/intercom/native-supervisor-channel.d.ts.map +1 -0
  256. package/src/intercom/native-supervisor-channel.js +894 -0
  257. package/src/intercom/native-supervisor-channel.js.map +1 -0
  258. package/src/intercom/result-intercom.d.ts +36 -0
  259. package/src/intercom/result-intercom.d.ts.map +1 -0
  260. package/src/intercom/result-intercom.js +372 -0
  261. package/src/intercom/result-intercom.js.map +1 -0
  262. package/src/intercom/supervisor-ui.d.ts +40 -0
  263. package/src/intercom/supervisor-ui.d.ts.map +1 -0
  264. package/src/intercom/supervisor-ui.js +202 -0
  265. package/src/intercom/supervisor-ui.js.map +1 -0
  266. package/src/missions/actions.d.ts +55 -0
  267. package/src/missions/actions.d.ts.map +1 -0
  268. package/src/missions/actions.js +396 -0
  269. package/src/missions/actions.js.map +1 -0
  270. package/src/missions/goal-driver.d.ts +16 -0
  271. package/src/missions/goal-driver.d.ts.map +1 -0
  272. package/src/missions/goal-driver.js +157 -0
  273. package/src/missions/goal-driver.js.map +1 -0
  274. package/src/missions/lifecycle.d.ts +40 -0
  275. package/src/missions/lifecycle.d.ts.map +1 -0
  276. package/src/missions/lifecycle.js +352 -0
  277. package/src/missions/lifecycle.js.map +1 -0
  278. package/src/missions/store.d.ts +22 -0
  279. package/src/missions/store.d.ts.map +1 -0
  280. package/src/missions/store.js +573 -0
  281. package/src/missions/store.js.map +1 -0
  282. package/src/missions/types.d.ts +168 -0
  283. package/src/missions/types.d.ts.map +1 -0
  284. package/src/missions/types.js +10 -0
  285. package/src/missions/types.js.map +1 -0
  286. package/src/missions/workflow-state.d.ts +15 -0
  287. package/src/missions/workflow-state.d.ts.map +1 -0
  288. package/src/missions/workflow-state.js +274 -0
  289. package/src/missions/workflow-state.js.map +1 -0
  290. package/src/policy/authority.d.ts +10 -0
  291. package/src/policy/authority.d.ts.map +1 -0
  292. package/src/policy/authority.js +42 -0
  293. package/src/policy/authority.js.map +1 -0
  294. package/src/profiles/profiles.d.ts +135 -0
  295. package/src/profiles/profiles.d.ts.map +1 -0
  296. package/src/profiles/profiles.js +520 -0
  297. package/src/profiles/profiles.js.map +1 -0
  298. package/src/runs/background/active-async-capacity.d.ts +100 -0
  299. package/src/runs/background/active-async-capacity.d.ts.map +1 -0
  300. package/src/runs/background/active-async-capacity.js +492 -0
  301. package/src/runs/background/active-async-capacity.js.map +1 -0
  302. package/src/runs/background/active-run-index.d.ts +13 -0
  303. package/src/runs/background/active-run-index.d.ts.map +1 -0
  304. package/src/runs/background/active-run-index.js +158 -0
  305. package/src/runs/background/active-run-index.js.map +1 -0
  306. package/src/runs/background/async-execution.d.ts +274 -0
  307. package/src/runs/background/async-execution.d.ts.map +1 -0
  308. package/src/runs/background/async-execution.js +1989 -0
  309. package/src/runs/background/async-execution.js.map +1 -0
  310. package/src/runs/background/async-job-tracker.d.ts +28 -0
  311. package/src/runs/background/async-job-tracker.d.ts.map +1 -0
  312. package/src/runs/background/async-job-tracker.js +876 -0
  313. package/src/runs/background/async-job-tracker.js.map +1 -0
  314. package/src/runs/background/async-resume.d.ts +59 -0
  315. package/src/runs/background/async-resume.d.ts.map +1 -0
  316. package/src/runs/background/async-resume.js +670 -0
  317. package/src/runs/background/async-resume.js.map +1 -0
  318. package/src/runs/background/async-retention.d.ts +45 -0
  319. package/src/runs/background/async-retention.d.ts.map +1 -0
  320. package/src/runs/background/async-retention.js +884 -0
  321. package/src/runs/background/async-retention.js.map +1 -0
  322. package/src/runs/background/async-status-snapshot.d.ts +10 -0
  323. package/src/runs/background/async-status-snapshot.d.ts.map +1 -0
  324. package/src/runs/background/async-status-snapshot.js +25 -0
  325. package/src/runs/background/async-status-snapshot.js.map +1 -0
  326. package/src/runs/background/async-status.d.ts +169 -0
  327. package/src/runs/background/async-status.d.ts.map +1 -0
  328. package/src/runs/background/async-status.js +673 -0
  329. package/src/runs/background/async-status.js.map +1 -0
  330. package/src/runs/background/auto-drain.d.ts +17 -0
  331. package/src/runs/background/auto-drain.d.ts.map +1 -0
  332. package/src/runs/background/auto-drain.js +73 -0
  333. package/src/runs/background/auto-drain.js.map +1 -0
  334. package/src/runs/background/binary-bootstrap.d.ts +9 -0
  335. package/src/runs/background/binary-bootstrap.d.ts.map +1 -0
  336. package/src/runs/background/binary-bootstrap.js +41 -0
  337. package/src/runs/background/binary-bootstrap.js.map +1 -0
  338. package/src/runs/background/chain-append.d.ts +35 -0
  339. package/src/runs/background/chain-append.d.ts.map +1 -0
  340. package/src/runs/background/chain-append.js +300 -0
  341. package/src/runs/background/chain-append.js.map +1 -0
  342. package/src/runs/background/chain-root-attachment.d.ts +49 -0
  343. package/src/runs/background/chain-root-attachment.d.ts.map +1 -0
  344. package/src/runs/background/chain-root-attachment.js +184 -0
  345. package/src/runs/background/chain-root-attachment.js.map +1 -0
  346. package/src/runs/background/completion-batcher.d.ts +52 -0
  347. package/src/runs/background/completion-batcher.d.ts.map +1 -0
  348. package/src/runs/background/completion-batcher.js +120 -0
  349. package/src/runs/background/completion-batcher.js.map +1 -0
  350. package/src/runs/background/completion-dedupe.d.ts +14 -0
  351. package/src/runs/background/completion-dedupe.d.ts.map +1 -0
  352. package/src/runs/background/completion-dedupe.js +49 -0
  353. package/src/runs/background/completion-dedupe.js.map +1 -0
  354. package/src/runs/background/completion-replay.d.ts +48 -0
  355. package/src/runs/background/completion-replay.d.ts.map +1 -0
  356. package/src/runs/background/completion-replay.js +267 -0
  357. package/src/runs/background/completion-replay.js.map +1 -0
  358. package/src/runs/background/control-channel.d.ts +156 -0
  359. package/src/runs/background/control-channel.d.ts.map +1 -0
  360. package/src/runs/background/control-channel.js +521 -0
  361. package/src/runs/background/control-channel.js.map +1 -0
  362. package/src/runs/background/fleet-view.d.ts +64 -0
  363. package/src/runs/background/fleet-view.d.ts.map +1 -0
  364. package/src/runs/background/fleet-view.js +648 -0
  365. package/src/runs/background/fleet-view.js.map +1 -0
  366. package/src/runs/background/index-segment.d.ts +16 -0
  367. package/src/runs/background/index-segment.d.ts.map +1 -0
  368. package/src/runs/background/index-segment.js +59 -0
  369. package/src/runs/background/index-segment.js.map +1 -0
  370. package/src/runs/background/inspect-rpc.d.ts +60 -0
  371. package/src/runs/background/inspect-rpc.d.ts.map +1 -0
  372. package/src/runs/background/inspect-rpc.js +406 -0
  373. package/src/runs/background/inspect-rpc.js.map +1 -0
  374. package/src/runs/background/notify.d.ts +162 -0
  375. package/src/runs/background/notify.d.ts.map +1 -0
  376. package/src/runs/background/notify.js +665 -0
  377. package/src/runs/background/notify.js.map +1 -0
  378. package/src/runs/background/owned-process-tree.d.ts +11 -0
  379. package/src/runs/background/owned-process-tree.d.ts.map +1 -0
  380. package/src/runs/background/owned-process-tree.js +117 -0
  381. package/src/runs/background/owned-process-tree.js.map +1 -0
  382. package/src/runs/background/parallel-groups.d.ts +4 -0
  383. package/src/runs/background/parallel-groups.d.ts.map +1 -0
  384. package/src/runs/background/parallel-groups.js +47 -0
  385. package/src/runs/background/parallel-groups.js.map +1 -0
  386. package/src/runs/background/process-terminal.d.ts +34 -0
  387. package/src/runs/background/process-terminal.d.ts.map +1 -0
  388. package/src/runs/background/process-terminal.js +305 -0
  389. package/src/runs/background/process-terminal.js.map +1 -0
  390. package/src/runs/background/result-delivery-ownership.d.ts +11 -0
  391. package/src/runs/background/result-delivery-ownership.d.ts.map +1 -0
  392. package/src/runs/background/result-delivery-ownership.js +37 -0
  393. package/src/runs/background/result-delivery-ownership.js.map +1 -0
  394. package/src/runs/background/result-files.d.ts +33 -0
  395. package/src/runs/background/result-files.d.ts.map +1 -0
  396. package/src/runs/background/result-files.js +528 -0
  397. package/src/runs/background/result-files.js.map +1 -0
  398. package/src/runs/background/result-watcher.d.ts +87 -0
  399. package/src/runs/background/result-watcher.d.ts.map +1 -0
  400. package/src/runs/background/result-watcher.js +764 -0
  401. package/src/runs/background/result-watcher.js.map +1 -0
  402. package/src/runs/background/resume-guidance.d.ts +5 -0
  403. package/src/runs/background/resume-guidance.d.ts.map +1 -0
  404. package/src/runs/background/resume-guidance.js +57 -0
  405. package/src/runs/background/resume-guidance.js.map +1 -0
  406. package/src/runs/background/retained-children.d.ts +25 -0
  407. package/src/runs/background/retained-children.d.ts.map +1 -0
  408. package/src/runs/background/retained-children.js +128 -0
  409. package/src/runs/background/retained-children.js.map +1 -0
  410. package/src/runs/background/retained-nested-route-tracker.d.ts +13 -0
  411. package/src/runs/background/retained-nested-route-tracker.d.ts.map +1 -0
  412. package/src/runs/background/retained-nested-route-tracker.js +91 -0
  413. package/src/runs/background/retained-nested-route-tracker.js.map +1 -0
  414. package/src/runs/background/run-child-session.d.ts +123 -0
  415. package/src/runs/background/run-child-session.d.ts.map +1 -0
  416. package/src/runs/background/run-child-session.js +602 -0
  417. package/src/runs/background/run-child-session.js.map +1 -0
  418. package/src/runs/background/run-id-query.d.ts +4 -0
  419. package/src/runs/background/run-id-query.d.ts.map +1 -0
  420. package/src/runs/background/run-id-query.js +7 -0
  421. package/src/runs/background/run-id-query.js.map +1 -0
  422. package/src/runs/background/run-id-resolver.d.ts +23 -0
  423. package/src/runs/background/run-id-resolver.d.ts.map +1 -0
  424. package/src/runs/background/run-id-resolver.js +170 -0
  425. package/src/runs/background/run-id-resolver.js.map +1 -0
  426. package/src/runs/background/run-status.d.ts +26 -0
  427. package/src/runs/background/run-status.d.ts.map +1 -0
  428. package/src/runs/background/run-status.js +826 -0
  429. package/src/runs/background/run-status.js.map +1 -0
  430. package/src/runs/background/runner-aliases.d.ts +17 -0
  431. package/src/runs/background/runner-aliases.d.ts.map +1 -0
  432. package/src/runs/background/runner-aliases.js +141 -0
  433. package/src/runs/background/runner-aliases.js.map +1 -0
  434. package/src/runs/background/runner-child-launch.d.ts +24 -0
  435. package/src/runs/background/runner-child-launch.d.ts.map +1 -0
  436. package/src/runs/background/runner-child-launch.js +68 -0
  437. package/src/runs/background/runner-child-launch.js.map +1 -0
  438. package/src/runs/background/runner-child-sessions.d.ts +7 -0
  439. package/src/runs/background/runner-child-sessions.d.ts.map +1 -0
  440. package/src/runs/background/runner-child-sessions.js +35 -0
  441. package/src/runs/background/runner-child-sessions.js.map +1 -0
  442. package/src/runs/background/runner-http-dispatcher.d.ts +43 -0
  443. package/src/runs/background/runner-http-dispatcher.d.ts.map +1 -0
  444. package/src/runs/background/runner-http-dispatcher.js +114 -0
  445. package/src/runs/background/runner-http-dispatcher.js.map +1 -0
  446. package/src/runs/background/scheduled-runs.d.ts +116 -0
  447. package/src/runs/background/scheduled-runs.d.ts.map +1 -0
  448. package/src/runs/background/scheduled-runs.js +1024 -0
  449. package/src/runs/background/scheduled-runs.js.map +1 -0
  450. package/src/runs/background/stale-run-reconciler.d.ts +37 -0
  451. package/src/runs/background/stale-run-reconciler.d.ts.map +1 -0
  452. package/src/runs/background/stale-run-reconciler.js +393 -0
  453. package/src/runs/background/stale-run-reconciler.js.map +1 -0
  454. package/src/runs/background/steering.d.ts +52 -0
  455. package/src/runs/background/steering.d.ts.map +1 -0
  456. package/src/runs/background/steering.js +247 -0
  457. package/src/runs/background/steering.js.map +1 -0
  458. package/src/runs/background/subagent-runner.d.ts +201 -0
  459. package/src/runs/background/subagent-runner.d.ts.map +1 -0
  460. package/src/runs/background/subagent-runner.js +5134 -0
  461. package/src/runs/background/subagent-runner.js.map +1 -0
  462. package/src/runs/background/subagent-wait.d.ts +122 -0
  463. package/src/runs/background/subagent-wait.d.ts.map +1 -0
  464. package/src/runs/background/subagent-wait.js +735 -0
  465. package/src/runs/background/subagent-wait.js.map +1 -0
  466. package/src/runs/background/terminal-run-index.d.ts +8 -0
  467. package/src/runs/background/terminal-run-index.d.ts.map +1 -0
  468. package/src/runs/background/terminal-run-index.js +123 -0
  469. package/src/runs/background/terminal-run-index.js.map +1 -0
  470. package/src/runs/background/top-level-async.d.ts +8 -0
  471. package/src/runs/background/top-level-async.d.ts.map +1 -0
  472. package/src/runs/background/top-level-async.js +6 -0
  473. package/src/runs/background/top-level-async.js.map +1 -0
  474. package/src/runs/background/wait-completions.d.ts +29 -0
  475. package/src/runs/background/wait-completions.d.ts.map +1 -0
  476. package/src/runs/background/wait-completions.js +264 -0
  477. package/src/runs/background/wait-completions.js.map +1 -0
  478. package/src/runs/background/wait-config.d.ts +9 -0
  479. package/src/runs/background/wait-config.d.ts.map +1 -0
  480. package/src/runs/background/wait-config.js +47 -0
  481. package/src/runs/background/wait-config.js.map +1 -0
  482. package/src/runs/background/wait-subscriptions.d.ts +27 -0
  483. package/src/runs/background/wait-subscriptions.d.ts.map +1 -0
  484. package/src/runs/background/wait-subscriptions.js +337 -0
  485. package/src/runs/background/wait-subscriptions.js.map +1 -0
  486. package/src/runs/background/wait-tool.d.ts +7 -0
  487. package/src/runs/background/wait-tool.d.ts.map +1 -0
  488. package/src/runs/background/wait-tool.js +36 -0
  489. package/src/runs/background/wait-tool.js.map +1 -0
  490. package/src/runs/foreground/async-dismiss-action.d.ts +7 -0
  491. package/src/runs/foreground/async-dismiss-action.d.ts.map +1 -0
  492. package/src/runs/foreground/async-dismiss-action.js +82 -0
  493. package/src/runs/foreground/async-dismiss-action.js.map +1 -0
  494. package/src/runs/foreground/async-steering-action.d.ts +32 -0
  495. package/src/runs/foreground/async-steering-action.d.ts.map +1 -0
  496. package/src/runs/foreground/async-steering-action.js +270 -0
  497. package/src/runs/foreground/async-steering-action.js.map +1 -0
  498. package/src/runs/foreground/async-stop-action.d.ts +7 -0
  499. package/src/runs/foreground/async-stop-action.d.ts.map +1 -0
  500. package/src/runs/foreground/async-stop-action.js +171 -0
  501. package/src/runs/foreground/async-stop-action.js.map +1 -0
  502. package/src/runs/foreground/execution.d.ts +11 -0
  503. package/src/runs/foreground/execution.d.ts.map +1 -0
  504. package/src/runs/foreground/execution.js +2186 -0
  505. package/src/runs/foreground/execution.js.map +1 -0
  506. package/src/runs/foreground/foreground-control.d.ts +25 -0
  507. package/src/runs/foreground/foreground-control.d.ts.map +1 -0
  508. package/src/runs/foreground/foreground-control.js +139 -0
  509. package/src/runs/foreground/foreground-control.js.map +1 -0
  510. package/src/runs/foreground/foreground-history.d.ts +12 -0
  511. package/src/runs/foreground/foreground-history.d.ts.map +1 -0
  512. package/src/runs/foreground/foreground-history.js +165 -0
  513. package/src/runs/foreground/foreground-history.js.map +1 -0
  514. package/src/runs/foreground/prompt-audit.d.ts +33 -0
  515. package/src/runs/foreground/prompt-audit.d.ts.map +1 -0
  516. package/src/runs/foreground/prompt-audit.js +143 -0
  517. package/src/runs/foreground/prompt-audit.js.map +1 -0
  518. package/src/runs/foreground/subagent-executor.d.ts +296 -0
  519. package/src/runs/foreground/subagent-executor.d.ts.map +1 -0
  520. package/src/runs/foreground/subagent-executor.js +7047 -0
  521. package/src/runs/foreground/subagent-executor.js.map +1 -0
  522. package/src/runs/foreground/workflow-detach-reconcile.d.ts +16 -0
  523. package/src/runs/foreground/workflow-detach-reconcile.d.ts.map +1 -0
  524. package/src/runs/foreground/workflow-detach-reconcile.js +284 -0
  525. package/src/runs/foreground/workflow-detach-reconcile.js.map +1 -0
  526. package/src/runs/foreground/workflow-foreground-steering.d.ts +44 -0
  527. package/src/runs/foreground/workflow-foreground-steering.d.ts.map +1 -0
  528. package/src/runs/foreground/workflow-foreground-steering.js +149 -0
  529. package/src/runs/foreground/workflow-foreground-steering.js.map +1 -0
  530. package/src/runs/shared/abort-recovery.d.ts +27 -0
  531. package/src/runs/shared/abort-recovery.d.ts.map +1 -0
  532. package/src/runs/shared/abort-recovery.js +109 -0
  533. package/src/runs/shared/abort-recovery.js.map +1 -0
  534. package/src/runs/shared/acceptance.d.ts +145 -0
  535. package/src/runs/shared/acceptance.d.ts.map +1 -0
  536. package/src/runs/shared/acceptance.js +1650 -0
  537. package/src/runs/shared/acceptance.js.map +1 -0
  538. package/src/runs/shared/agent-contract.d.ts +6 -0
  539. package/src/runs/shared/agent-contract.d.ts.map +1 -0
  540. package/src/runs/shared/agent-contract.js +36 -0
  541. package/src/runs/shared/agent-contract.js.map +1 -0
  542. package/src/runs/shared/async-status-projection.d.ts +94 -0
  543. package/src/runs/shared/async-status-projection.d.ts.map +1 -0
  544. package/src/runs/shared/async-status-projection.js +542 -0
  545. package/src/runs/shared/async-status-projection.js.map +1 -0
  546. package/src/runs/shared/background-process-options.d.ts +5 -0
  547. package/src/runs/shared/background-process-options.d.ts.map +1 -0
  548. package/src/runs/shared/background-process-options.js +7 -0
  549. package/src/runs/shared/background-process-options.js.map +1 -0
  550. package/src/runs/shared/capability-ceiling.d.ts +58 -0
  551. package/src/runs/shared/capability-ceiling.d.ts.map +1 -0
  552. package/src/runs/shared/capability-ceiling.js +179 -0
  553. package/src/runs/shared/capability-ceiling.js.map +1 -0
  554. package/src/runs/shared/chain-outputs.d.ts +19 -0
  555. package/src/runs/shared/chain-outputs.d.ts.map +1 -0
  556. package/src/runs/shared/chain-outputs.js +105 -0
  557. package/src/runs/shared/chain-outputs.js.map +1 -0
  558. package/src/runs/shared/child-hooks.d.ts +34 -0
  559. package/src/runs/shared/child-hooks.d.ts.map +1 -0
  560. package/src/runs/shared/child-hooks.js +188 -0
  561. package/src/runs/shared/child-hooks.js.map +1 -0
  562. package/src/runs/shared/child-identity.d.ts +24 -0
  563. package/src/runs/shared/child-identity.d.ts.map +1 -0
  564. package/src/runs/shared/child-identity.js +41 -0
  565. package/src/runs/shared/child-identity.js.map +1 -0
  566. package/src/runs/shared/child-launch-plan.d.ts +71 -0
  567. package/src/runs/shared/child-launch-plan.d.ts.map +1 -0
  568. package/src/runs/shared/child-launch-plan.js +89 -0
  569. package/src/runs/shared/child-launch-plan.js.map +1 -0
  570. package/src/runs/shared/child-launch.d.ts +114 -0
  571. package/src/runs/shared/child-launch.d.ts.map +1 -0
  572. package/src/runs/shared/child-launch.js +231 -0
  573. package/src/runs/shared/child-launch.js.map +1 -0
  574. package/src/runs/shared/child-lifecycle.d.ts +14 -0
  575. package/src/runs/shared/child-lifecycle.d.ts.map +1 -0
  576. package/src/runs/shared/child-lifecycle.js +23 -0
  577. package/src/runs/shared/child-lifecycle.js.map +1 -0
  578. package/src/runs/shared/child-runtime-config.d.ts +102 -0
  579. package/src/runs/shared/child-runtime-config.d.ts.map +1 -0
  580. package/src/runs/shared/child-runtime-config.js +39 -0
  581. package/src/runs/shared/child-runtime-config.js.map +1 -0
  582. package/src/runs/shared/child-session.d.ts +155 -0
  583. package/src/runs/shared/child-session.d.ts.map +1 -0
  584. package/src/runs/shared/child-session.js +347 -0
  585. package/src/runs/shared/child-session.js.map +1 -0
  586. package/src/runs/shared/child-tool-plan.d.ts +73 -0
  587. package/src/runs/shared/child-tool-plan.d.ts.map +1 -0
  588. package/src/runs/shared/child-tool-plan.js +380 -0
  589. package/src/runs/shared/child-tool-plan.js.map +1 -0
  590. package/src/runs/shared/claude-code-adapter.d.ts +25 -0
  591. package/src/runs/shared/claude-code-adapter.d.ts.map +1 -0
  592. package/src/runs/shared/claude-code-adapter.js +120 -0
  593. package/src/runs/shared/claude-code-adapter.js.map +1 -0
  594. package/src/runs/shared/codex-exec-adapter.d.ts +26 -0
  595. package/src/runs/shared/codex-exec-adapter.d.ts.map +1 -0
  596. package/src/runs/shared/codex-exec-adapter.js +128 -0
  597. package/src/runs/shared/codex-exec-adapter.js.map +1 -0
  598. package/src/runs/shared/completion-evidence.d.ts +31 -0
  599. package/src/runs/shared/completion-evidence.d.ts.map +1 -0
  600. package/src/runs/shared/completion-evidence.js +54 -0
  601. package/src/runs/shared/completion-evidence.js.map +1 -0
  602. package/src/runs/shared/completion-guard.d.ts +35 -0
  603. package/src/runs/shared/completion-guard.d.ts.map +1 -0
  604. package/src/runs/shared/completion-guard.js +214 -0
  605. package/src/runs/shared/completion-guard.js.map +1 -0
  606. package/src/runs/shared/context-mode.d.ts +13 -0
  607. package/src/runs/shared/context-mode.d.ts.map +1 -0
  608. package/src/runs/shared/context-mode.js +39 -0
  609. package/src/runs/shared/context-mode.js.map +1 -0
  610. package/src/runs/shared/cursor-agent-adapter.d.ts +27 -0
  611. package/src/runs/shared/cursor-agent-adapter.d.ts.map +1 -0
  612. package/src/runs/shared/cursor-agent-adapter.js +100 -0
  613. package/src/runs/shared/cursor-agent-adapter.js.map +1 -0
  614. package/src/runs/shared/dynamic-fanout.d.ts +50 -0
  615. package/src/runs/shared/dynamic-fanout.d.ts.map +1 -0
  616. package/src/runs/shared/dynamic-fanout.js +274 -0
  617. package/src/runs/shared/dynamic-fanout.js.map +1 -0
  618. package/src/runs/shared/effective-system-prompt.d.ts +18 -0
  619. package/src/runs/shared/effective-system-prompt.d.ts.map +1 -0
  620. package/src/runs/shared/effective-system-prompt.js +23 -0
  621. package/src/runs/shared/effective-system-prompt.js.map +1 -0
  622. package/src/runs/shared/extension-bindings.d.ts +17 -0
  623. package/src/runs/shared/extension-bindings.d.ts.map +1 -0
  624. package/src/runs/shared/extension-bindings.js +83 -0
  625. package/src/runs/shared/extension-bindings.js.map +1 -0
  626. package/src/runs/shared/external-cli-contract.d.ts +30 -0
  627. package/src/runs/shared/external-cli-contract.d.ts.map +1 -0
  628. package/src/runs/shared/external-cli-contract.js +146 -0
  629. package/src/runs/shared/external-cli-contract.js.map +1 -0
  630. package/src/runs/shared/external-cli-preflight.d.ts +32 -0
  631. package/src/runs/shared/external-cli-preflight.d.ts.map +1 -0
  632. package/src/runs/shared/external-cli-preflight.js +116 -0
  633. package/src/runs/shared/external-cli-preflight.js.map +1 -0
  634. package/src/runs/shared/external-cli-runner.d.ts +66 -0
  635. package/src/runs/shared/external-cli-runner.d.ts.map +1 -0
  636. package/src/runs/shared/external-cli-runner.js +421 -0
  637. package/src/runs/shared/external-cli-runner.js.map +1 -0
  638. package/src/runs/shared/external-job-bridge.d.ts +18 -0
  639. package/src/runs/shared/external-job-bridge.d.ts.map +1 -0
  640. package/src/runs/shared/external-job-bridge.js +424 -0
  641. package/src/runs/shared/external-job-bridge.js.map +1 -0
  642. package/src/runs/shared/external-job-runner.d.ts +45 -0
  643. package/src/runs/shared/external-job-runner.d.ts.map +1 -0
  644. package/src/runs/shared/external-job-runner.js +353 -0
  645. package/src/runs/shared/external-job-runner.js.map +1 -0
  646. package/src/runs/shared/fast-mode-extension.d.ts +4 -0
  647. package/src/runs/shared/fast-mode-extension.d.ts.map +1 -0
  648. package/src/runs/shared/fast-mode-extension.js +9 -0
  649. package/src/runs/shared/fast-mode-extension.js.map +1 -0
  650. package/src/runs/shared/herdr-connection.d.ts +71 -0
  651. package/src/runs/shared/herdr-connection.d.ts.map +1 -0
  652. package/src/runs/shared/herdr-connection.js +258 -0
  653. package/src/runs/shared/herdr-connection.js.map +1 -0
  654. package/src/runs/shared/herdr-external-adapters.d.ts +148 -0
  655. package/src/runs/shared/herdr-external-adapters.d.ts.map +1 -0
  656. package/src/runs/shared/herdr-external-adapters.js +405 -0
  657. package/src/runs/shared/herdr-external-adapters.js.map +1 -0
  658. package/src/runs/shared/herdr-machine.d.ts +48 -0
  659. package/src/runs/shared/herdr-machine.d.ts.map +1 -0
  660. package/src/runs/shared/herdr-machine.js +247 -0
  661. package/src/runs/shared/herdr-machine.js.map +1 -0
  662. package/src/runs/shared/herdr-pi-protocol.d.ts +22 -0
  663. package/src/runs/shared/herdr-pi-protocol.d.ts.map +1 -0
  664. package/src/runs/shared/herdr-pi-protocol.js +58 -0
  665. package/src/runs/shared/herdr-pi-protocol.js.map +1 -0
  666. package/src/runs/shared/herdr-placed-run.d.ts +267 -0
  667. package/src/runs/shared/herdr-placed-run.d.ts.map +1 -0
  668. package/src/runs/shared/herdr-placed-run.js +716 -0
  669. package/src/runs/shared/herdr-placed-run.js.map +1 -0
  670. package/src/runs/shared/host-step-status.d.ts +34 -0
  671. package/src/runs/shared/host-step-status.d.ts.map +1 -0
  672. package/src/runs/shared/host-step-status.js +245 -0
  673. package/src/runs/shared/host-step-status.js.map +1 -0
  674. package/src/runs/shared/lane-metadata.d.ts +24 -0
  675. package/src/runs/shared/lane-metadata.d.ts.map +1 -0
  676. package/src/runs/shared/lane-metadata.js +127 -0
  677. package/src/runs/shared/lane-metadata.js.map +1 -0
  678. package/src/runs/shared/launch-cwd.d.ts +2 -0
  679. package/src/runs/shared/launch-cwd.d.ts.map +1 -0
  680. package/src/runs/shared/launch-cwd.js +17 -0
  681. package/src/runs/shared/launch-cwd.js.map +1 -0
  682. package/src/runs/shared/llm-intent-arbiter.d.ts +48 -0
  683. package/src/runs/shared/llm-intent-arbiter.d.ts.map +1 -0
  684. package/src/runs/shared/llm-intent-arbiter.js +235 -0
  685. package/src/runs/shared/llm-intent-arbiter.js.map +1 -0
  686. package/src/runs/shared/long-running-guard.d.ts +33 -0
  687. package/src/runs/shared/long-running-guard.d.ts.map +1 -0
  688. package/src/runs/shared/long-running-guard.js +199 -0
  689. package/src/runs/shared/long-running-guard.js.map +1 -0
  690. package/src/runs/shared/mcp-config-sources.d.ts +30 -0
  691. package/src/runs/shared/mcp-config-sources.d.ts.map +1 -0
  692. package/src/runs/shared/mcp-config-sources.js +419 -0
  693. package/src/runs/shared/mcp-config-sources.js.map +1 -0
  694. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts +59 -0
  695. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts.map +1 -0
  696. package/src/runs/shared/mcp-direct-tool-allowlist.js +400 -0
  697. package/src/runs/shared/mcp-direct-tool-allowlist.js.map +1 -0
  698. package/src/runs/shared/mcp-direct-tool-grant.d.ts +41 -0
  699. package/src/runs/shared/mcp-direct-tool-grant.d.ts.map +1 -0
  700. package/src/runs/shared/mcp-direct-tool-grant.js +146 -0
  701. package/src/runs/shared/mcp-direct-tool-grant.js.map +1 -0
  702. package/src/runs/shared/model-resolution-diagnostic.d.ts +22 -0
  703. package/src/runs/shared/model-resolution-diagnostic.d.ts.map +1 -0
  704. package/src/runs/shared/model-resolution-diagnostic.js +65 -0
  705. package/src/runs/shared/model-resolution-diagnostic.js.map +1 -0
  706. package/src/runs/shared/model-resolution.d.ts +92 -0
  707. package/src/runs/shared/model-resolution.d.ts.map +1 -0
  708. package/src/runs/shared/model-resolution.js +343 -0
  709. package/src/runs/shared/model-resolution.js.map +1 -0
  710. package/src/runs/shared/model-scope.d.ts +68 -0
  711. package/src/runs/shared/model-scope.d.ts.map +1 -0
  712. package/src/runs/shared/model-scope.js +156 -0
  713. package/src/runs/shared/model-scope.js.map +1 -0
  714. package/src/runs/shared/mutation-evidence.d.ts +19 -0
  715. package/src/runs/shared/mutation-evidence.d.ts.map +1 -0
  716. package/src/runs/shared/mutation-evidence.js +199 -0
  717. package/src/runs/shared/mutation-evidence.js.map +1 -0
  718. package/src/runs/shared/nested-events.d.ts +134 -0
  719. package/src/runs/shared/nested-events.d.ts.map +1 -0
  720. package/src/runs/shared/nested-events.js +1056 -0
  721. package/src/runs/shared/nested-events.js.map +1 -0
  722. package/src/runs/shared/nested-path.d.ts +9 -0
  723. package/src/runs/shared/nested-path.d.ts.map +1 -0
  724. package/src/runs/shared/nested-path.js +35 -0
  725. package/src/runs/shared/nested-path.js.map +1 -0
  726. package/src/runs/shared/nested-render.d.ts +21 -0
  727. package/src/runs/shared/nested-render.d.ts.map +1 -0
  728. package/src/runs/shared/nested-render.js +116 -0
  729. package/src/runs/shared/nested-render.js.map +1 -0
  730. package/src/runs/shared/orca-progress-tabs.d.ts +33 -0
  731. package/src/runs/shared/orca-progress-tabs.d.ts.map +1 -0
  732. package/src/runs/shared/orca-progress-tabs.js +527 -0
  733. package/src/runs/shared/orca-progress-tabs.js.map +1 -0
  734. package/src/runs/shared/parallel-handoff.d.ts +73 -0
  735. package/src/runs/shared/parallel-handoff.d.ts.map +1 -0
  736. package/src/runs/shared/parallel-handoff.js +733 -0
  737. package/src/runs/shared/parallel-handoff.js.map +1 -0
  738. package/src/runs/shared/parallel-utils.d.ts +165 -0
  739. package/src/runs/shared/parallel-utils.d.ts.map +1 -0
  740. package/src/runs/shared/parallel-utils.js +126 -0
  741. package/src/runs/shared/parallel-utils.js.map +1 -0
  742. package/src/runs/shared/permissions.d.ts +13 -0
  743. package/src/runs/shared/permissions.d.ts.map +1 -0
  744. package/src/runs/shared/permissions.js +93 -0
  745. package/src/runs/shared/permissions.js.map +1 -0
  746. package/src/runs/shared/pi-spawn.d.ts +28 -0
  747. package/src/runs/shared/pi-spawn.d.ts.map +1 -0
  748. package/src/runs/shared/pi-spawn.js +156 -0
  749. package/src/runs/shared/pi-spawn.js.map +1 -0
  750. package/src/runs/shared/process-signal.d.ts +16 -0
  751. package/src/runs/shared/process-signal.d.ts.map +1 -0
  752. package/src/runs/shared/process-signal.js +22 -0
  753. package/src/runs/shared/process-signal.js.map +1 -0
  754. package/src/runs/shared/readonly-drain-observation.d.ts +26 -0
  755. package/src/runs/shared/readonly-drain-observation.d.ts.map +1 -0
  756. package/src/runs/shared/readonly-drain-observation.js +51 -0
  757. package/src/runs/shared/readonly-drain-observation.js.map +1 -0
  758. package/src/runs/shared/run-fanout-budget.d.ts +15 -0
  759. package/src/runs/shared/run-fanout-budget.d.ts.map +1 -0
  760. package/src/runs/shared/run-fanout-budget.js +259 -0
  761. package/src/runs/shared/run-fanout-budget.js.map +1 -0
  762. package/src/runs/shared/run-history.d.ts +20 -0
  763. package/src/runs/shared/run-history.d.ts.map +1 -0
  764. package/src/runs/shared/run-history.js +200 -0
  765. package/src/runs/shared/run-history.js.map +1 -0
  766. package/src/runs/shared/runtime-acknowledged-extensions.d.ts +8 -0
  767. package/src/runs/shared/runtime-acknowledged-extensions.d.ts.map +1 -0
  768. package/src/runs/shared/runtime-acknowledged-extensions.js +45 -0
  769. package/src/runs/shared/runtime-acknowledged-extensions.js.map +1 -0
  770. package/src/runs/shared/session-lease.d.ts +70 -0
  771. package/src/runs/shared/session-lease.d.ts.map +1 -0
  772. package/src/runs/shared/session-lease.js +251 -0
  773. package/src/runs/shared/session-lease.js.map +1 -0
  774. package/src/runs/shared/single-output.d.ts +61 -0
  775. package/src/runs/shared/single-output.d.ts.map +1 -0
  776. package/src/runs/shared/single-output.js +263 -0
  777. package/src/runs/shared/single-output.js.map +1 -0
  778. package/src/runs/shared/spawn-budget.d.ts +21 -0
  779. package/src/runs/shared/spawn-budget.d.ts.map +1 -0
  780. package/src/runs/shared/spawn-budget.js +94 -0
  781. package/src/runs/shared/spawn-budget.js.map +1 -0
  782. package/src/runs/shared/structured-output.d.ts +57 -0
  783. package/src/runs/shared/structured-output.d.ts.map +1 -0
  784. package/src/runs/shared/structured-output.js +391 -0
  785. package/src/runs/shared/structured-output.js.map +1 -0
  786. package/src/runs/shared/subagent-control.d.ts +50 -0
  787. package/src/runs/shared/subagent-control.d.ts.map +1 -0
  788. package/src/runs/shared/subagent-control.js +247 -0
  789. package/src/runs/shared/subagent-control.js.map +1 -0
  790. package/src/runs/shared/subagent-prompt-runtime.d.ts +28 -0
  791. package/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -0
  792. package/src/runs/shared/subagent-prompt-runtime.js +548 -0
  793. package/src/runs/shared/subagent-prompt-runtime.js.map +1 -0
  794. package/src/runs/shared/task-intent.d.ts +38 -0
  795. package/src/runs/shared/task-intent.d.ts.map +1 -0
  796. package/src/runs/shared/task-intent.js +213 -0
  797. package/src/runs/shared/task-intent.js.map +1 -0
  798. package/src/runs/shared/tool-availability.d.ts +17 -0
  799. package/src/runs/shared/tool-availability.d.ts.map +1 -0
  800. package/src/runs/shared/tool-availability.js +30 -0
  801. package/src/runs/shared/tool-availability.js.map +1 -0
  802. package/src/runs/shared/tool-budget.d.ts +22 -0
  803. package/src/runs/shared/tool-budget.d.ts.map +1 -0
  804. package/src/runs/shared/tool-budget.js +79 -0
  805. package/src/runs/shared/tool-budget.js.map +1 -0
  806. package/src/runs/shared/tool-timeout.d.ts +32 -0
  807. package/src/runs/shared/tool-timeout.d.ts.map +1 -0
  808. package/src/runs/shared/tool-timeout.js +74 -0
  809. package/src/runs/shared/tool-timeout.js.map +1 -0
  810. package/src/runs/shared/usage-budget.d.ts +8 -0
  811. package/src/runs/shared/usage-budget.d.ts.map +1 -0
  812. package/src/runs/shared/usage-budget.js +75 -0
  813. package/src/runs/shared/usage-budget.js.map +1 -0
  814. package/src/runs/shared/usage-reconciliation.d.ts +9 -0
  815. package/src/runs/shared/usage-reconciliation.d.ts.map +1 -0
  816. package/src/runs/shared/usage-reconciliation.js +72 -0
  817. package/src/runs/shared/usage-reconciliation.js.map +1 -0
  818. package/src/runs/shared/workflow-async-child-guidance.d.ts +4 -0
  819. package/src/runs/shared/workflow-async-child-guidance.d.ts.map +1 -0
  820. package/src/runs/shared/workflow-async-child-guidance.js +18 -0
  821. package/src/runs/shared/workflow-async-child-guidance.js.map +1 -0
  822. package/src/runs/shared/workflow-graph.d.ts +32 -0
  823. package/src/runs/shared/workflow-graph.d.ts.map +1 -0
  824. package/src/runs/shared/workflow-graph.js +222 -0
  825. package/src/runs/shared/workflow-graph.js.map +1 -0
  826. package/src/runs/shared/worktree-cleanup-plan.d.ts +78 -0
  827. package/src/runs/shared/worktree-cleanup-plan.d.ts.map +1 -0
  828. package/src/runs/shared/worktree-cleanup-plan.js +782 -0
  829. package/src/runs/shared/worktree-cleanup-plan.js.map +1 -0
  830. package/src/runs/shared/worktree-setup-command.d.ts +39 -0
  831. package/src/runs/shared/worktree-setup-command.d.ts.map +1 -0
  832. package/src/runs/shared/worktree-setup-command.js +201 -0
  833. package/src/runs/shared/worktree-setup-command.js.map +1 -0
  834. package/src/runs/shared/worktree.d.ts +179 -0
  835. package/src/runs/shared/worktree.d.ts.map +1 -0
  836. package/src/runs/shared/worktree.js +1333 -0
  837. package/src/runs/shared/worktree.js.map +1 -0
  838. package/src/shared/accessible-dir.d.ts +12 -0
  839. package/src/shared/accessible-dir.d.ts.map +1 -0
  840. package/src/shared/accessible-dir.js +37 -0
  841. package/src/shared/accessible-dir.js.map +1 -0
  842. package/src/shared/agent-stream-options.d.ts +6 -0
  843. package/src/shared/agent-stream-options.d.ts.map +1 -0
  844. package/src/shared/agent-stream-options.js +4 -0
  845. package/src/shared/agent-stream-options.js.map +1 -0
  846. package/src/shared/artifacts.d.ts +23 -0
  847. package/src/shared/artifacts.d.ts.map +1 -0
  848. package/src/shared/artifacts.js +273 -0
  849. package/src/shared/artifacts.js.map +1 -0
  850. package/src/shared/atomic-json.d.ts +19 -0
  851. package/src/shared/atomic-json.d.ts.map +1 -0
  852. package/src/shared/atomic-json.js +60 -0
  853. package/src/shared/atomic-json.js.map +1 -0
  854. package/src/shared/capacity-resilient-json.d.ts +27 -0
  855. package/src/shared/capacity-resilient-json.d.ts.map +1 -0
  856. package/src/shared/capacity-resilient-json.js +87 -0
  857. package/src/shared/capacity-resilient-json.js.map +1 -0
  858. package/src/shared/child-cache-retention.d.ts +30 -0
  859. package/src/shared/child-cache-retention.d.ts.map +1 -0
  860. package/src/shared/child-cache-retention.js +41 -0
  861. package/src/shared/child-cache-retention.js.map +1 -0
  862. package/src/shared/child-session-name.d.ts +9 -0
  863. package/src/shared/child-session-name.d.ts.map +1 -0
  864. package/src/shared/child-session-name.js +39 -0
  865. package/src/shared/child-session-name.js.map +1 -0
  866. package/src/shared/child-transcript.d.ts +38 -0
  867. package/src/shared/child-transcript.d.ts.map +1 -0
  868. package/src/shared/child-transcript.js +226 -0
  869. package/src/shared/child-transcript.js.map +1 -0
  870. package/src/shared/completion-owner.d.ts +3 -0
  871. package/src/shared/completion-owner.d.ts.map +1 -0
  872. package/src/shared/completion-owner.js +9 -0
  873. package/src/shared/completion-owner.js.map +1 -0
  874. package/src/shared/display-text.d.ts +6 -0
  875. package/src/shared/display-text.d.ts.map +1 -0
  876. package/src/shared/display-text.js +155 -0
  877. package/src/shared/display-text.js.map +1 -0
  878. package/src/shared/extension-context.d.ts +6 -0
  879. package/src/shared/extension-context.d.ts.map +1 -0
  880. package/src/shared/extension-context.js +22 -0
  881. package/src/shared/extension-context.js.map +1 -0
  882. package/src/shared/file-coalescer.d.ts +12 -0
  883. package/src/shared/file-coalescer.d.ts.map +1 -0
  884. package/src/shared/file-coalescer.js +35 -0
  885. package/src/shared/file-coalescer.js.map +1 -0
  886. package/src/shared/file-system-retry.d.ts +32 -0
  887. package/src/shared/file-system-retry.d.ts.map +1 -0
  888. package/src/shared/file-system-retry.js +85 -0
  889. package/src/shared/file-system-retry.js.map +1 -0
  890. package/src/shared/fork-context.d.ts +59 -0
  891. package/src/shared/fork-context.d.ts.map +1 -0
  892. package/src/shared/fork-context.js +171 -0
  893. package/src/shared/fork-context.js.map +1 -0
  894. package/src/shared/fork-session-cwd.d.ts +3 -0
  895. package/src/shared/fork-session-cwd.d.ts.map +1 -0
  896. package/src/shared/fork-session-cwd.js +24 -0
  897. package/src/shared/fork-session-cwd.js.map +1 -0
  898. package/src/shared/formatters.d.ts +36 -0
  899. package/src/shared/formatters.d.ts.map +1 -0
  900. package/src/shared/formatters.js +143 -0
  901. package/src/shared/formatters.js.map +1 -0
  902. package/src/shared/jsonl-writer.d.ts +21 -0
  903. package/src/shared/jsonl-writer.d.ts.map +1 -0
  904. package/src/shared/jsonl-writer.js +68 -0
  905. package/src/shared/jsonl-writer.js.map +1 -0
  906. package/src/shared/launch-contract.d.ts +64 -0
  907. package/src/shared/launch-contract.d.ts.map +1 -0
  908. package/src/shared/launch-contract.js +141 -0
  909. package/src/shared/launch-contract.js.map +1 -0
  910. package/src/shared/model-info.d.ts +44 -0
  911. package/src/shared/model-info.d.ts.map +1 -0
  912. package/src/shared/model-info.js +73 -0
  913. package/src/shared/model-info.js.map +1 -0
  914. package/src/shared/model-response-aliases.d.ts +2 -0
  915. package/src/shared/model-response-aliases.d.ts.map +1 -0
  916. package/src/shared/model-response-aliases.js +16 -0
  917. package/src/shared/model-response-aliases.js.map +1 -0
  918. package/src/shared/node-executable.d.ts +2 -0
  919. package/src/shared/node-executable.d.ts.map +1 -0
  920. package/src/shared/node-executable.js +21 -0
  921. package/src/shared/node-executable.js.map +1 -0
  922. package/src/shared/opencode-session-headers.d.ts +13 -0
  923. package/src/shared/opencode-session-headers.d.ts.map +1 -0
  924. package/src/shared/opencode-session-headers.js +27 -0
  925. package/src/shared/opencode-session-headers.js.map +1 -0
  926. package/src/shared/prompt-resources.d.ts +6 -0
  927. package/src/shared/prompt-resources.d.ts.map +1 -0
  928. package/src/shared/prompt-resources.js +11 -0
  929. package/src/shared/prompt-resources.js.map +1 -0
  930. package/src/shared/pruned-fork.d.ts +35 -0
  931. package/src/shared/pruned-fork.d.ts.map +1 -0
  932. package/src/shared/pruned-fork.js +424 -0
  933. package/src/shared/pruned-fork.js.map +1 -0
  934. package/src/shared/required-child-extensions.d.ts +20 -0
  935. package/src/shared/required-child-extensions.d.ts.map +1 -0
  936. package/src/shared/required-child-extensions.js +74 -0
  937. package/src/shared/required-child-extensions.js.map +1 -0
  938. package/src/shared/session-file-trust.d.ts +2 -0
  939. package/src/shared/session-file-trust.d.ts.map +1 -0
  940. package/src/shared/session-file-trust.js +21 -0
  941. package/src/shared/session-file-trust.js.map +1 -0
  942. package/src/shared/session-identity.d.ts +7 -0
  943. package/src/shared/session-identity.d.ts.map +1 -0
  944. package/src/shared/session-identity.js +7 -0
  945. package/src/shared/session-identity.js.map +1 -0
  946. package/src/shared/session-tokens.d.ts +3 -0
  947. package/src/shared/session-tokens.d.ts.map +1 -0
  948. package/src/shared/session-tokens.js +59 -0
  949. package/src/shared/session-tokens.js.map +1 -0
  950. package/src/shared/settings.d.ts +147 -0
  951. package/src/shared/settings.d.ts.map +1 -0
  952. package/src/shared/settings.js +248 -0
  953. package/src/shared/settings.js.map +1 -0
  954. package/src/shared/shortcuts.d.ts +2 -0
  955. package/src/shared/shortcuts.d.ts.map +1 -0
  956. package/src/shared/shortcuts.js +18 -0
  957. package/src/shared/shortcuts.js.map +1 -0
  958. package/src/shared/status-format.d.ts +10 -0
  959. package/src/shared/status-format.d.ts.map +1 -0
  960. package/src/shared/status-format.js +61 -0
  961. package/src/shared/status-format.js.map +1 -0
  962. package/src/shared/thinking-ceiling.d.ts +14 -0
  963. package/src/shared/thinking-ceiling.d.ts.map +1 -0
  964. package/src/shared/thinking-ceiling.js +38 -0
  965. package/src/shared/thinking-ceiling.js.map +1 -0
  966. package/src/shared/types.d.ts +2667 -0
  967. package/src/shared/types.d.ts.map +1 -0
  968. package/src/shared/types.js +265 -0
  969. package/src/shared/types.js.map +1 -0
  970. package/src/shared/utf8.d.ts +6 -0
  971. package/src/shared/utf8.d.ts.map +1 -0
  972. package/src/shared/utf8.js +13 -0
  973. package/src/shared/utf8.js.map +1 -0
  974. package/src/shared/utils.d.ts +71 -0
  975. package/src/shared/utils.d.ts.map +1 -0
  976. package/src/shared/utils.js +593 -0
  977. package/src/shared/utils.js.map +1 -0
  978. package/src/shared/watch-strategy.d.ts +3 -0
  979. package/src/shared/watch-strategy.d.ts.map +1 -0
  980. package/src/shared/watch-strategy.js +6 -0
  981. package/src/shared/watch-strategy.js.map +1 -0
  982. package/src/shared/workflow-child-permit.d.ts +59 -0
  983. package/src/shared/workflow-child-permit.d.ts.map +1 -0
  984. package/src/shared/workflow-child-permit.js +160 -0
  985. package/src/shared/workflow-child-permit.js.map +1 -0
  986. package/src/slash/delegation-adapters.d.ts +147 -0
  987. package/src/slash/delegation-adapters.d.ts.map +1 -0
  988. package/src/slash/delegation-adapters.js +293 -0
  989. package/src/slash/delegation-adapters.js.map +1 -0
  990. package/src/slash/delegation-json.d.ts +11 -0
  991. package/src/slash/delegation-json.d.ts.map +1 -0
  992. package/src/slash/delegation-json.js +118 -0
  993. package/src/slash/delegation-json.js.map +1 -0
  994. package/src/slash/delegation-request.d.ts +13 -0
  995. package/src/slash/delegation-request.d.ts.map +1 -0
  996. package/src/slash/delegation-request.js +175 -0
  997. package/src/slash/delegation-request.js.map +1 -0
  998. package/src/slash/prompt-template-bridge.d.ts +27 -0
  999. package/src/slash/prompt-template-bridge.d.ts.map +1 -0
  1000. package/src/slash/prompt-template-bridge.js +380 -0
  1001. package/src/slash/prompt-template-bridge.js.map +1 -0
  1002. package/src/slash/prompt-workflows.d.ts +22 -0
  1003. package/src/slash/prompt-workflows.d.ts.map +1 -0
  1004. package/src/slash/prompt-workflows.js +261 -0
  1005. package/src/slash/prompt-workflows.js.map +1 -0
  1006. package/src/slash/selector.d.ts +48 -0
  1007. package/src/slash/selector.d.ts.map +1 -0
  1008. package/src/slash/selector.js +118 -0
  1009. package/src/slash/selector.js.map +1 -0
  1010. package/src/slash/slash-bridge.d.ts +31 -0
  1011. package/src/slash/slash-bridge.d.ts.map +1 -0
  1012. package/src/slash/slash-bridge.js +133 -0
  1013. package/src/slash/slash-bridge.js.map +1 -0
  1014. package/src/slash/slash-commands.d.ts +9 -0
  1015. package/src/slash/slash-commands.d.ts.map +1 -0
  1016. package/src/slash/slash-commands.js +1295 -0
  1017. package/src/slash/slash-commands.js.map +1 -0
  1018. package/src/slash/slash-live-state.d.ts +22 -0
  1019. package/src/slash/slash-live-state.d.ts.map +1 -0
  1020. package/src/slash/slash-live-state.js +264 -0
  1021. package/src/slash/slash-live-state.js.map +1 -0
  1022. package/src/slash/subagents-admin.d.ts +3 -0
  1023. package/src/slash/subagents-admin.d.ts.map +1 -0
  1024. package/src/slash/subagents-admin.js +454 -0
  1025. package/src/slash/subagents-admin.js.map +1 -0
  1026. package/src/tui/fleet-status.d.ts +86 -0
  1027. package/src/tui/fleet-status.d.ts.map +1 -0
  1028. package/src/tui/fleet-status.js +1083 -0
  1029. package/src/tui/fleet-status.js.map +1 -0
  1030. package/src/tui/fleet-transcript.d.ts +50 -0
  1031. package/src/tui/fleet-transcript.d.ts.map +1 -0
  1032. package/src/tui/fleet-transcript.js +497 -0
  1033. package/src/tui/fleet-transcript.js.map +1 -0
  1034. package/src/tui/fleet.d.ts +169 -0
  1035. package/src/tui/fleet.d.ts.map +1 -0
  1036. package/src/tui/fleet.js +1412 -0
  1037. package/src/tui/fleet.js.map +1 -0
  1038. package/src/tui/render-helpers.d.ts +24 -0
  1039. package/src/tui/render-helpers.d.ts.map +1 -0
  1040. package/src/tui/render-helpers.js +101 -0
  1041. package/src/tui/render-helpers.js.map +1 -0
  1042. package/src/tui/render.d.ts +61 -0
  1043. package/src/tui/render.d.ts.map +1 -0
  1044. package/src/tui/render.js +3607 -0
  1045. package/src/tui/render.js.map +1 -0
  1046. package/src/watchdog/change-signature.d.ts +8 -0
  1047. package/src/watchdog/change-signature.d.ts.map +1 -0
  1048. package/src/watchdog/change-signature.js +246 -0
  1049. package/src/watchdog/change-signature.js.map +1 -0
  1050. package/src/watchdog/child-status.d.ts +54 -0
  1051. package/src/watchdog/child-status.d.ts.map +1 -0
  1052. package/src/watchdog/child-status.js +188 -0
  1053. package/src/watchdog/child-status.js.map +1 -0
  1054. package/src/watchdog/diff-tool.d.ts +23 -0
  1055. package/src/watchdog/diff-tool.d.ts.map +1 -0
  1056. package/src/watchdog/diff-tool.js +84 -0
  1057. package/src/watchdog/diff-tool.js.map +1 -0
  1058. package/src/watchdog/emission-guard.d.ts +37 -0
  1059. package/src/watchdog/emission-guard.d.ts.map +1 -0
  1060. package/src/watchdog/emission-guard.js +98 -0
  1061. package/src/watchdog/emission-guard.js.map +1 -0
  1062. package/src/watchdog/guidance.d.ts +4 -0
  1063. package/src/watchdog/guidance.d.ts.map +1 -0
  1064. package/src/watchdog/guidance.js +20 -0
  1065. package/src/watchdog/guidance.js.map +1 -0
  1066. package/src/watchdog/lsp-diagnostics.d.ts +18 -0
  1067. package/src/watchdog/lsp-diagnostics.d.ts.map +1 -0
  1068. package/src/watchdog/lsp-diagnostics.js +490 -0
  1069. package/src/watchdog/lsp-diagnostics.js.map +1 -0
  1070. package/src/watchdog/model-selection.d.ts +25 -0
  1071. package/src/watchdog/model-selection.d.ts.map +1 -0
  1072. package/src/watchdog/model-selection.js +168 -0
  1073. package/src/watchdog/model-selection.js.map +1 -0
  1074. package/src/watchdog/permission-arbiter.d.ts +21 -0
  1075. package/src/watchdog/permission-arbiter.d.ts.map +1 -0
  1076. package/src/watchdog/permission-arbiter.js +136 -0
  1077. package/src/watchdog/permission-arbiter.js.map +1 -0
  1078. package/src/watchdog/register-child.d.ts +12 -0
  1079. package/src/watchdog/register-child.d.ts.map +1 -0
  1080. package/src/watchdog/register-child.js +120 -0
  1081. package/src/watchdog/register-child.js.map +1 -0
  1082. package/src/watchdog/register-main.d.ts +10 -0
  1083. package/src/watchdog/register-main.d.ts.map +1 -0
  1084. package/src/watchdog/register-main.js +419 -0
  1085. package/src/watchdog/register-main.js.map +1 -0
  1086. package/src/watchdog/render.d.ts +12 -0
  1087. package/src/watchdog/render.d.ts.map +1 -0
  1088. package/src/watchdog/render.js +52 -0
  1089. package/src/watchdog/render.js.map +1 -0
  1090. package/src/watchdog/review.d.ts +36 -0
  1091. package/src/watchdog/review.d.ts.map +1 -0
  1092. package/src/watchdog/review.js +318 -0
  1093. package/src/watchdog/review.js.map +1 -0
  1094. package/src/watchdog/rules.d.ts +22 -0
  1095. package/src/watchdog/rules.d.ts.map +1 -0
  1096. package/src/watchdog/rules.js +59 -0
  1097. package/src/watchdog/rules.js.map +1 -0
  1098. package/src/watchdog/runtime.d.ts +196 -0
  1099. package/src/watchdog/runtime.d.ts.map +1 -0
  1100. package/src/watchdog/runtime.js +862 -0
  1101. package/src/watchdog/runtime.js.map +1 -0
  1102. package/src/watchdog/scope.d.ts +15 -0
  1103. package/src/watchdog/scope.d.ts.map +1 -0
  1104. package/src/watchdog/scope.js +45 -0
  1105. package/src/watchdog/scope.js.map +1 -0
  1106. package/src/watchdog/settings.d.ts +30 -0
  1107. package/src/watchdog/settings.d.ts.map +1 -0
  1108. package/src/watchdog/settings.js +476 -0
  1109. package/src/watchdog/settings.js.map +1 -0
  1110. package/src/watchdog/tool-actions.d.ts +18 -0
  1111. package/src/watchdog/tool-actions.d.ts.map +1 -0
  1112. package/src/watchdog/tool-actions.js +151 -0
  1113. package/src/watchdog/tool-actions.js.map +1 -0
  1114. package/src/watchdog/turn-delta.d.ts +12 -0
  1115. package/src/watchdog/turn-delta.d.ts.map +1 -0
  1116. package/src/watchdog/turn-delta.js +185 -0
  1117. package/src/watchdog/turn-delta.js.map +1 -0
  1118. package/src/watchdog/types.d.ts +142 -0
  1119. package/src/watchdog/types.d.ts.map +1 -0
  1120. package/src/watchdog/types.js +28 -0
  1121. package/src/watchdog/types.js.map +1 -0
  1122. package/src/watchdog/warning-format.d.ts +8 -0
  1123. package/src/watchdog/warning-format.d.ts.map +1 -0
  1124. package/src/watchdog/warning-format.js +60 -0
  1125. package/src/watchdog/warning-format.js.map +1 -0
  1126. package/src/workflows/chat-progress.d.ts +38 -0
  1127. package/src/workflows/chat-progress.d.ts.map +1 -0
  1128. package/src/workflows/chat-progress.js +130 -0
  1129. package/src/workflows/chat-progress.js.map +1 -0
  1130. package/src/workflows/host-command.d.ts +31 -0
  1131. package/src/workflows/host-command.d.ts.map +1 -0
  1132. package/src/workflows/host-command.js +228 -0
  1133. package/src/workflows/host-command.js.map +1 -0
  1134. package/src/workflows/scripted-workflow.d.ts +195 -0
  1135. package/src/workflows/scripted-workflow.d.ts.map +1 -0
  1136. package/src/workflows/scripted-workflow.js +2636 -0
  1137. package/src/workflows/scripted-workflow.js.map +1 -0
  1138. package/src/workflows/workflow-checklist.d.ts +124 -0
  1139. package/src/workflows/workflow-checklist.d.ts.map +1 -0
  1140. package/src/workflows/workflow-checklist.js +312 -0
  1141. package/src/workflows/workflow-checklist.js.map +1 -0
  1142. package/src/workflows/workflow-child-summary.d.ts +20 -0
  1143. package/src/workflows/workflow-child-summary.d.ts.map +1 -0
  1144. package/src/workflows/workflow-child-summary.js +179 -0
  1145. package/src/workflows/workflow-child-summary.js.map +1 -0
  1146. package/src/workflows/workflow-preflight.d.ts +59 -0
  1147. package/src/workflows/workflow-preflight.d.ts.map +1 -0
  1148. package/src/workflows/workflow-preflight.js +289 -0
  1149. package/src/workflows/workflow-preflight.js.map +1 -0
  1150. package/src/workflows/workflow-receipt.d.ts +35 -0
  1151. package/src/workflows/workflow-receipt.d.ts.map +1 -0
  1152. package/src/workflows/workflow-receipt.js +449 -0
  1153. package/src/workflows/workflow-receipt.js.map +1 -0
  1154. package/src/workflows/workflow-resources.d.ts +43 -0
  1155. package/src/workflows/workflow-resources.d.ts.map +1 -0
  1156. package/src/workflows/workflow-resources.js +230 -0
  1157. package/src/workflows/workflow-resources.js.map +1 -0
  1158. package/src/workflows/workflow-settlement.d.ts +85 -0
  1159. package/src/workflows/workflow-settlement.d.ts.map +1 -0
  1160. package/src/workflows/workflow-settlement.js +204 -0
  1161. package/src/workflows/workflow-settlement.js.map +1 -0
  1162. package/index.ts +0 -13
  1163. package/src/agents/advertised-agent-prompt.ts +0 -94
  1164. package/src/agents/agent-management.ts +0 -1417
  1165. package/src/agents/agent-memory.ts +0 -254
  1166. package/src/agents/agent-refinements.ts +0 -624
  1167. package/src/agents/agent-scope.ts +0 -6
  1168. package/src/agents/agent-selection.ts +0 -25
  1169. package/src/agents/agent-serializer.ts +0 -182
  1170. package/src/agents/agents.ts +0 -2917
  1171. package/src/agents/builtin-names.ts +0 -16
  1172. package/src/agents/chain-serializer.ts +0 -285
  1173. package/src/agents/frontmatter.ts +0 -153
  1174. package/src/agents/identity.ts +0 -30
  1175. package/src/agents/proactive-skills.ts +0 -194
  1176. package/src/agents/runtime-agent-events.ts +0 -70
  1177. package/src/agents/runtime-agent-registry.ts +0 -430
  1178. package/src/agents/skills.ts +0 -754
  1179. package/src/api/agents.ts +0 -12
  1180. package/src/api/background-work.ts +0 -206
  1181. package/src/api/capability-ceiling.ts +0 -16
  1182. package/src/api/child-tool-plan.ts +0 -5
  1183. package/src/api/control-channel.ts +0 -4
  1184. package/src/api/delegation.ts +0 -116
  1185. package/src/api/external-job-provider.ts +0 -195
  1186. package/src/api/external-runs.ts +0 -282
  1187. package/src/api/intercom-bridge.ts +0 -3
  1188. package/src/api/preflight.ts +0 -539
  1189. package/src/api/project-panes.ts +0 -32
  1190. package/src/api/required-child-extensions.ts +0 -6
  1191. package/src/api/shared-types.ts +0 -29
  1192. package/src/api/workflow-resources.ts +0 -6
  1193. package/src/extension/config.ts +0 -230
  1194. package/src/extension/control-notices.ts +0 -58
  1195. package/src/extension/doctor.ts +0 -270
  1196. package/src/extension/fanout-child.ts +0 -265
  1197. package/src/extension/herdr-pi-bridge.ts +0 -160
  1198. package/src/extension/index.ts +0 -1205
  1199. package/src/extension/public-execution.ts +0 -225
  1200. package/src/extension/rpc.ts +0 -848
  1201. package/src/extension/schemas.ts +0 -428
  1202. package/src/extension/steering-notices.ts +0 -35
  1203. package/src/extension/subagent-guide.ts +0 -39
  1204. package/src/extension/tool-description.ts +0 -175
  1205. package/src/extension/tool-result.ts +0 -19
  1206. package/src/inspectors/actions.ts +0 -148
  1207. package/src/inspectors/ghostty/actions.ts +0 -74
  1208. package/src/inspectors/ghostty/plugin.ts +0 -29
  1209. package/src/inspectors/herdr/actions.ts +0 -155
  1210. package/src/inspectors/herdr/client.ts +0 -130
  1211. package/src/inspectors/herdr/focus.ts +0 -55
  1212. package/src/inspectors/herdr/plugin.ts +0 -20
  1213. package/src/inspectors/herdr/project-panes.ts +0 -730
  1214. package/src/inspectors/inspector-runner.ts +0 -153
  1215. package/src/inspectors/plugins.ts +0 -8
  1216. package/src/inspectors/session-roots-codec.ts +0 -31
  1217. package/src/inspectors/shell-command.ts +0 -16
  1218. package/src/inspectors/types.ts +0 -51
  1219. package/src/integrations/herdr-status.ts +0 -400
  1220. package/src/integrations/pi-web-session-liveness.ts +0 -73
  1221. package/src/intercom/intercom-bridge.ts +0 -233
  1222. package/src/intercom/native-supervisor-channel.ts +0 -917
  1223. package/src/intercom/result-intercom.ts +0 -423
  1224. package/src/intercom/supervisor-ui.ts +0 -244
  1225. package/src/missions/actions.ts +0 -433
  1226. package/src/missions/goal-driver.ts +0 -164
  1227. package/src/missions/lifecycle.ts +0 -367
  1228. package/src/missions/store.ts +0 -584
  1229. package/src/missions/types.ts +0 -190
  1230. package/src/missions/workflow-state.ts +0 -281
  1231. package/src/policy/authority.ts +0 -50
  1232. package/src/profiles/profiles.ts +0 -668
  1233. package/src/runs/background/active-async-capacity.ts +0 -520
  1234. package/src/runs/background/active-run-index.ts +0 -155
  1235. package/src/runs/background/async-execution.ts +0 -2278
  1236. package/src/runs/background/async-job-tracker.ts +0 -826
  1237. package/src/runs/background/async-resume.ts +0 -647
  1238. package/src/runs/background/async-retention.ts +0 -912
  1239. package/src/runs/background/async-status-snapshot.ts +0 -46
  1240. package/src/runs/background/async-status.ts +0 -771
  1241. package/src/runs/background/auto-drain.ts +0 -92
  1242. package/src/runs/background/binary-bootstrap.ts +0 -38
  1243. package/src/runs/background/chain-append.ts +0 -321
  1244. package/src/runs/background/chain-root-attachment.ts +0 -259
  1245. package/src/runs/background/completion-batcher.ts +0 -168
  1246. package/src/runs/background/completion-dedupe.ts +0 -58
  1247. package/src/runs/background/completion-replay.ts +0 -287
  1248. package/src/runs/background/control-channel.ts +0 -600
  1249. package/src/runs/background/fleet-view.ts +0 -648
  1250. package/src/runs/background/index-segment.ts +0 -59
  1251. package/src/runs/background/inspect-rpc.ts +0 -443
  1252. package/src/runs/background/notify.ts +0 -819
  1253. package/src/runs/background/owned-process-tree.ts +0 -131
  1254. package/src/runs/background/parallel-groups.ts +0 -45
  1255. package/src/runs/background/process-terminal.ts +0 -310
  1256. package/src/runs/background/result-delivery-ownership.ts +0 -45
  1257. package/src/runs/background/result-files.ts +0 -523
  1258. package/src/runs/background/result-watcher.ts +0 -809
  1259. package/src/runs/background/resume-guidance.ts +0 -56
  1260. package/src/runs/background/retained-children.ts +0 -135
  1261. package/src/runs/background/retained-nested-route-tracker.ts +0 -96
  1262. package/src/runs/background/run-child-session.ts +0 -690
  1263. package/src/runs/background/run-id-query.ts +0 -7
  1264. package/src/runs/background/run-id-resolver.ts +0 -175
  1265. package/src/runs/background/run-status.ts +0 -786
  1266. package/src/runs/background/runner-aliases.ts +0 -142
  1267. package/src/runs/background/runner-child-launch.ts +0 -91
  1268. package/src/runs/background/runner-child-sessions.ts +0 -32
  1269. package/src/runs/background/runner-http-dispatcher.ts +0 -119
  1270. package/src/runs/background/scheduled-runs.ts +0 -1012
  1271. package/src/runs/background/stale-run-reconciler.ts +0 -436
  1272. package/src/runs/background/steering.ts +0 -260
  1273. package/src/runs/background/subagent-runner.ts +0 -5357
  1274. package/src/runs/background/subagent-wait.ts +0 -876
  1275. package/src/runs/background/terminal-run-index.ts +0 -138
  1276. package/src/runs/background/top-level-async.ts +0 -14
  1277. package/src/runs/background/wait-completions.ts +0 -261
  1278. package/src/runs/background/wait-config.ts +0 -50
  1279. package/src/runs/background/wait-subscriptions.ts +0 -354
  1280. package/src/runs/background/wait-tool.ts +0 -45
  1281. package/src/runs/foreground/async-dismiss-action.ts +0 -86
  1282. package/src/runs/foreground/async-steering-action.ts +0 -276
  1283. package/src/runs/foreground/async-stop-action.ts +0 -176
  1284. package/src/runs/foreground/execution.ts +0 -2254
  1285. package/src/runs/foreground/foreground-control.ts +0 -157
  1286. package/src/runs/foreground/foreground-history.ts +0 -163
  1287. package/src/runs/foreground/prompt-audit.ts +0 -178
  1288. package/src/runs/foreground/subagent-executor.ts +0 -7526
  1289. package/src/runs/foreground/workflow-detach-reconcile.ts +0 -304
  1290. package/src/runs/foreground/workflow-foreground-steering.ts +0 -169
  1291. package/src/runs/shared/abort-recovery.ts +0 -119
  1292. package/src/runs/shared/acceptance.ts +0 -1698
  1293. package/src/runs/shared/agent-contract.ts +0 -38
  1294. package/src/runs/shared/async-status-projection.ts +0 -659
  1295. package/src/runs/shared/background-process-options.ts +0 -9
  1296. package/src/runs/shared/capability-ceiling.ts +0 -211
  1297. package/src/runs/shared/chain-outputs.ts +0 -116
  1298. package/src/runs/shared/child-hooks.ts +0 -189
  1299. package/src/runs/shared/child-identity.ts +0 -62
  1300. package/src/runs/shared/child-launch-plan.ts +0 -163
  1301. package/src/runs/shared/child-launch.ts +0 -342
  1302. package/src/runs/shared/child-lifecycle.ts +0 -28
  1303. package/src/runs/shared/child-runtime-config.ts +0 -133
  1304. package/src/runs/shared/child-session.ts +0 -448
  1305. package/src/runs/shared/child-tool-plan.ts +0 -661
  1306. package/src/runs/shared/claude-code-adapter.ts +0 -133
  1307. package/src/runs/shared/codex-exec-adapter.ts +0 -129
  1308. package/src/runs/shared/completion-evidence.ts +0 -89
  1309. package/src/runs/shared/completion-guard.ts +0 -255
  1310. package/src/runs/shared/context-mode.ts +0 -44
  1311. package/src/runs/shared/cursor-agent-adapter.ts +0 -114
  1312. package/src/runs/shared/dynamic-fanout.ts +0 -297
  1313. package/src/runs/shared/effective-system-prompt.ts +0 -33
  1314. package/src/runs/shared/extension-bindings.ts +0 -78
  1315. package/src/runs/shared/external-cli-contract.ts +0 -177
  1316. package/src/runs/shared/external-cli-preflight.ts +0 -142
  1317. package/src/runs/shared/external-cli-runner.ts +0 -431
  1318. package/src/runs/shared/external-job-bridge.ts +0 -460
  1319. package/src/runs/shared/external-job-runner.ts +0 -389
  1320. package/src/runs/shared/fast-mode-extension.ts +0 -10
  1321. package/src/runs/shared/herdr-connection.ts +0 -134
  1322. package/src/runs/shared/herdr-external-adapters.ts +0 -169
  1323. package/src/runs/shared/herdr-machine.ts +0 -279
  1324. package/src/runs/shared/herdr-pi-protocol.ts +0 -59
  1325. package/src/runs/shared/herdr-placed-run.ts +0 -263
  1326. package/src/runs/shared/host-step-status.ts +0 -231
  1327. package/src/runs/shared/lane-metadata.ts +0 -126
  1328. package/src/runs/shared/launch-cwd.ts +0 -16
  1329. package/src/runs/shared/llm-intent-arbiter.ts +0 -321
  1330. package/src/runs/shared/long-running-guard.ts +0 -221
  1331. package/src/runs/shared/mcp-config-sources.ts +0 -422
  1332. package/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -484
  1333. package/src/runs/shared/mcp-direct-tool-grant.ts +0 -194
  1334. package/src/runs/shared/model-resolution-diagnostic.ts +0 -76
  1335. package/src/runs/shared/model-resolution.ts +0 -441
  1336. package/src/runs/shared/model-scope.ts +0 -205
  1337. package/src/runs/shared/mutation-evidence.ts +0 -199
  1338. package/src/runs/shared/nested-events.ts +0 -1079
  1339. package/src/runs/shared/nested-path.ts +0 -38
  1340. package/src/runs/shared/nested-render.ts +0 -127
  1341. package/src/runs/shared/orca-progress-tabs.ts +0 -510
  1342. package/src/runs/shared/parallel-handoff.ts +0 -741
  1343. package/src/runs/shared/parallel-utils.ts +0 -279
  1344. package/src/runs/shared/permissions.ts +0 -86
  1345. package/src/runs/shared/pi-spawn.ts +0 -207
  1346. package/src/runs/shared/process-signal.ts +0 -35
  1347. package/src/runs/shared/readonly-drain-observation.ts +0 -42
  1348. package/src/runs/shared/run-fanout-budget.ts +0 -267
  1349. package/src/runs/shared/run-history.ts +0 -201
  1350. package/src/runs/shared/runtime-acknowledged-extensions.ts +0 -44
  1351. package/src/runs/shared/session-lease.ts +0 -293
  1352. package/src/runs/shared/single-output.ts +0 -304
  1353. package/src/runs/shared/spawn-budget.ts +0 -128
  1354. package/src/runs/shared/structured-output.ts +0 -236
  1355. package/src/runs/shared/subagent-control.ts +0 -294
  1356. package/src/runs/shared/subagent-prompt-runtime.ts +0 -545
  1357. package/src/runs/shared/task-intent.ts +0 -244
  1358. package/src/runs/shared/tool-availability.ts +0 -37
  1359. package/src/runs/shared/tool-budget.ts +0 -66
  1360. package/src/runs/shared/tool-timeout.ts +0 -93
  1361. package/src/runs/shared/usage-budget.ts +0 -65
  1362. package/src/runs/shared/workflow-async-child-guidance.ts +0 -18
  1363. package/src/runs/shared/workflow-graph.ts +0 -225
  1364. package/src/runs/shared/worktree-cleanup-plan.ts +0 -869
  1365. package/src/runs/shared/worktree-setup-command.ts +0 -213
  1366. package/src/runs/shared/worktree.ts +0 -1538
  1367. package/src/shared/accessible-dir.ts +0 -47
  1368. package/src/shared/agent-stream-options.ts +0 -5
  1369. package/src/shared/artifacts.ts +0 -281
  1370. package/src/shared/atomic-json.ts +0 -83
  1371. package/src/shared/capacity-resilient-json.ts +0 -102
  1372. package/src/shared/child-cache-retention.ts +0 -43
  1373. package/src/shared/child-session-name.ts +0 -46
  1374. package/src/shared/child-transcript.ts +0 -264
  1375. package/src/shared/completion-owner.ts +0 -14
  1376. package/src/shared/display-text.ts +0 -150
  1377. package/src/shared/extension-context.ts +0 -24
  1378. package/src/shared/file-coalescer.ts +0 -49
  1379. package/src/shared/file-system-retry.ts +0 -95
  1380. package/src/shared/fork-context.ts +0 -236
  1381. package/src/shared/fork-session-cwd.ts +0 -27
  1382. package/src/shared/formatters.ts +0 -146
  1383. package/src/shared/jsonl-writer.ts +0 -92
  1384. package/src/shared/launch-contract.ts +0 -198
  1385. package/src/shared/model-info.ts +0 -101
  1386. package/src/shared/model-response-aliases.ts +0 -13
  1387. package/src/shared/node-executable.ts +0 -21
  1388. package/src/shared/opencode-session-headers.ts +0 -30
  1389. package/src/shared/prompt-resources.ts +0 -11
  1390. package/src/shared/pruned-fork.ts +0 -450
  1391. package/src/shared/required-child-extensions.ts +0 -81
  1392. package/src/shared/session-file-trust.ts +0 -19
  1393. package/src/shared/session-identity.ts +0 -10
  1394. package/src/shared/session-tokens.ts +0 -55
  1395. package/src/shared/settings.ts +0 -412
  1396. package/src/shared/shortcuts.ts +0 -13
  1397. package/src/shared/status-format.ts +0 -55
  1398. package/src/shared/thinking-ceiling.ts +0 -46
  1399. package/src/shared/types.ts +0 -2983
  1400. package/src/shared/utf8.ts +0 -11
  1401. package/src/shared/utils.ts +0 -608
  1402. package/src/shared/watch-strategy.ts +0 -12
  1403. package/src/shared/workflow-child-permit.ts +0 -212
  1404. package/src/slash/delegation-adapters.ts +0 -428
  1405. package/src/slash/delegation-json.ts +0 -108
  1406. package/src/slash/delegation-request.ts +0 -176
  1407. package/src/slash/prompt-template-bridge.ts +0 -419
  1408. package/src/slash/prompt-workflows.ts +0 -287
  1409. package/src/slash/selector.ts +0 -147
  1410. package/src/slash/slash-bridge.ts +0 -192
  1411. package/src/slash/slash-commands.ts +0 -1325
  1412. package/src/slash/slash-live-state.ts +0 -310
  1413. package/src/slash/subagents-admin.ts +0 -460
  1414. package/src/tui/fleet-status.ts +0 -1109
  1415. package/src/tui/fleet-transcript.ts +0 -536
  1416. package/src/tui/fleet.ts +0 -1448
  1417. package/src/tui/render-helpers.ts +0 -111
  1418. package/src/tui/render.ts +0 -3721
  1419. package/src/types/pi-runtime-compat.d.ts +0 -8
  1420. package/src/watchdog/change-signature.ts +0 -260
  1421. package/src/watchdog/child-status.ts +0 -225
  1422. package/src/watchdog/diff-tool.ts +0 -77
  1423. package/src/watchdog/emission-guard.ts +0 -125
  1424. package/src/watchdog/guidance.ts +0 -20
  1425. package/src/watchdog/lsp-diagnostics.ts +0 -538
  1426. package/src/watchdog/model-selection.ts +0 -187
  1427. package/src/watchdog/permission-arbiter.ts +0 -156
  1428. package/src/watchdog/register-child.ts +0 -128
  1429. package/src/watchdog/register-main.ts +0 -445
  1430. package/src/watchdog/render.ts +0 -53
  1431. package/src/watchdog/review.ts +0 -363
  1432. package/src/watchdog/rules.ts +0 -70
  1433. package/src/watchdog/runtime.ts +0 -924
  1434. package/src/watchdog/scope.ts +0 -51
  1435. package/src/watchdog/settings.ts +0 -515
  1436. package/src/watchdog/tool-actions.ts +0 -156
  1437. package/src/watchdog/turn-delta.ts +0 -184
  1438. package/src/watchdog/types.ts +0 -186
  1439. package/src/watchdog/warning-format.ts +0 -72
  1440. package/src/workflows/chat-progress.ts +0 -152
  1441. package/src/workflows/host-command.ts +0 -235
  1442. package/src/workflows/scripted-workflow.ts +0 -2575
  1443. package/src/workflows/workflow-checklist.ts +0 -436
  1444. package/src/workflows/workflow-child-summary.ts +0 -170
  1445. package/src/workflows/workflow-preflight.ts +0 -297
  1446. package/src/workflows/workflow-receipt.ts +0 -384
  1447. package/src/workflows/workflow-resources.ts +0 -236
  1448. package/src/workflows/workflow-settlement.ts +0 -249
@@ -1,1538 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import { spawnSync } from "node:child_process";
3
- import { runSetupCommand, type SetupCommandOptions, type SetupCommandResult } from "./worktree-setup-command.ts";
4
- import * as fs from "node:fs";
5
- import * as os from "node:os";
6
- import * as path from "node:path";
7
- import { resolveAuthorityDecision, type AuthorityPolicyConfig } from "../../policy/authority.ts";
8
- import { PROJECT_SUBAGENTS_RELATIVE_DIR } from "../../shared/artifacts.ts";
9
- import { getAgentDir } from "../../shared/utils.ts";
10
- import type { ManagedWorktreeProvider, WorktreeNaming, WorktreeProvider } from "../../shared/types.ts";
11
-
12
- export const DEFAULT_WORKTREE_PROVIDER: WorktreeProvider = "auto";
13
- export const DEFAULT_WORKTREE_BASE_REF = "HEAD";
14
- export const DEFAULT_WORKTREE_BRANCH_PREFIX = "pi-subagents/";
15
- /** Internal marker used to defer Worktrunk-dependent instruction paths to launch time. */
16
- export const WORKTREE_AGENT_CWD_PLACEHOLDER = path.join(path.parse(process.cwd()).root, "__pi_subagents_worktree_cwd__");
17
- const WORKTREE_NAMING_COMPONENT_MAX_BYTES = 96;
18
- const WORKTREE_NAMING_LABEL_MAX_BYTES = 256;
19
- const WORKTREE_NAMING_BRANCH_MAX_BYTES = 256;
20
- const WORKTREE_COMMAND_OUTPUT_MAX_BYTES = 128 * 1024;
21
- const WORKTRUNK_COMMAND = process.platform === "win32" ? "git" : "wt";
22
- const WORKTRUNK_ARG_PREFIX = process.platform === "win32" ? ["wt"] : [];
23
- export const MACHINE_DIFF_OPTIONS = ["--no-color", "--no-ext-diff", "--no-textconv", "--default-prefix", "--line-prefix=", "--no-relative"] as const;
24
- const MACHINE_PATCH_OPTIONS = [...MACHINE_DIFF_OPTIONS, "--binary"] as const;
25
- const PATCH_VALIDATION_OPTIONS = ["apply", "--check", "--cached", "--reverse", "--binary", "--whitespace=nowarn"] as const;
26
-
27
- export interface WorktreeNamingInput {
28
- runId: string;
29
- index: number;
30
- /** Explicit step index; otherwise a trailing `-sN` in runId is used. */
31
- stepIndex?: number;
32
- /** Explicit task index; defaults to index. */
33
- taskIndex?: number;
34
- /** Label precedence is lane/workflow key, output/stable key, then this label. */
35
- agent?: string;
36
- label?: string;
37
- laneKey?: string;
38
- workflowKey?: string;
39
- outputName?: string;
40
- taskKey?: string;
41
- task?: string;
42
- branchPrefix?: string;
43
- }
44
-
45
- export interface WorktreeCommandResult {
46
- stdout: string;
47
- stderr: string;
48
- status: number | null;
49
- error?: Error;
50
- }
51
-
52
- export interface WorktreeSetup {
53
- cwd: string;
54
- worktrees: WorktreeInfo[];
55
- baseCommit: string;
56
- capturedDiffs?: WorktreeDiff[];
57
- }
58
-
59
- export interface WorktreeInfo {
60
- path: string;
61
- agentCwd: string;
62
- branch: string;
63
- index: number;
64
- nodeModulesLinked: boolean;
65
- syntheticPaths: string[];
66
- provider?: ManagedWorktreeProvider;
67
- naming?: WorktreeNaming;
68
- }
69
-
70
- export interface WorktreeDiff {
71
- index: number;
72
- agent: string;
73
- branch: string;
74
- diffStat: string;
75
- filesChanged: number;
76
- insertions: number;
77
- deletions: number;
78
- patchPath: string;
79
- error?: string;
80
- }
81
-
82
- export interface WorktreeCleanupTask {
83
- index: number;
84
- path: string;
85
- branch: string;
86
- provider?: ManagedWorktreeProvider;
87
- naming?: WorktreeNaming;
88
- worktreeRemoved: boolean;
89
- branchRemoved: boolean;
90
- preserved?: boolean;
91
- reason?: string;
92
- errors?: string[];
93
- }
94
-
95
- export type WorktreeCleanupIntent =
96
- | { kind: "preserve"; capturedDiffs?: WorktreeDiff[]; handoffManifestPath?: string; cleanupBlocker?: string }
97
- | {
98
- kind: "discard";
99
- authorization:
100
- | { kind: "policy"; policy?: AuthorityPolicyConfig }
101
- | { kind: "confirmed"; policy?: AuthorityPolicyConfig };
102
- }
103
- | { kind: "setup-rollback" };
104
-
105
- export interface WorktreeCleanupReport {
106
- state: "complete" | "partial";
107
- tasks: WorktreeCleanupTask[];
108
- pruned: boolean;
109
- errors?: string[];
110
- }
111
-
112
- interface WorktreeTaskCwdConflict {
113
- index: number;
114
- agent: string;
115
- cwd: string;
116
- }
117
-
118
- interface WorktreeSetupHookConfig {
119
- hookPath: string;
120
- timeoutMs?: number;
121
- }
122
-
123
- export interface CreateWorktreesOptions {
124
- signal?: AbortSignal;
125
- /** Existing absolute run deadline only; setup does not start a child budget. */
126
- deadlineAt?: number;
127
- onProgress?: (snapshot: WorktreeSetupProgress) => void;
128
- agents?: string[];
129
- /** Optional stable labels used to make branch identity readable. */
130
- labels?: Array<string | undefined>;
131
- /** Original task text used for the agent-plus-slug naming fallback. */
132
- tasks?: Array<string | undefined>;
133
- /** Worktree allocator selection; auto prefers Worktrunk when available. */
134
- provider?: WorktreeProvider;
135
- /** Git ref used as the worktree base; defaults to `HEAD`. */
136
- baseRef?: string;
137
- /** Branch namespace; defaults to `pi-subagents/`. */
138
- branchPrefix?: string;
139
- setupHook?: WorktreeSetupHookConfig;
140
- baseDir?: string;
141
- }
142
-
143
- interface ResolvedWorktreeSetupHook {
144
- hookPath: string;
145
- timeoutMs: number;
146
- }
147
-
148
- interface WorktreeSetupHookInput {
149
- version: 1;
150
- repoRoot: string;
151
- worktreePath: string;
152
- agentCwd: string;
153
- branch: string;
154
- index: number;
155
- runId: string;
156
- baseCommit: string;
157
- agent?: string;
158
- }
159
-
160
- interface WorktreeSetupHookOutput {
161
- syntheticPaths?: string[];
162
- }
163
-
164
- interface GitResult {
165
- stdout: string;
166
- stderr: string;
167
- status: number | null;
168
- }
169
-
170
- interface RepoState {
171
- toplevel: string;
172
- cwdRelative: string;
173
- baseCommit: string;
174
- }
175
-
176
- const DEFAULT_WORKTREE_SETUP_HOOK_TIMEOUT_MS = 30000;
177
-
178
- /** In-memory evidence only. Callers project this into existing handoff diagnostics. */
179
- export interface WorktreeSetupProgress {
180
- setup: WorktreeSetup;
181
- attempts: Array<{ index: number; branch: string; path?: string; validated: boolean; command?: WorktreeSetupProgress["command"]; hookCommand?: WorktreeSetupProgress["command"] }>;
182
- phase: string;
183
- command?: { command: string; args: string[]; pid?: number; processGroupId?: number; result?: Omit<SetupCommandResult, "stdout" | "stdoutBuffer" | "stderr"> };
184
- unknown?: string;
185
- cleanup?: WorktreeCleanupReport;
186
- }
187
-
188
- export class WorktreeSetupError extends Error {
189
- readonly snapshot: WorktreeSetupProgress;
190
- constructor(error: unknown, snapshot: WorktreeSetupProgress) {
191
- super(`${error instanceof Error ? error.message : String(error)}${snapshot.unknown ? `; setup settlement unknown: ${snapshot.unknown}; manual reconciliation required` : ""}`, { cause: error });
192
- this.name = "WorktreeSetupError";
193
- this.snapshot = snapshot;
194
- }
195
- }
196
-
197
- let worktreeTurn: Promise<void> = Promise.resolve();
198
- let setupActive = false;
199
- let setupPoison: string | undefined;
200
-
201
- function assertWorktreeMutationAllowed(): void {
202
- if (setupPoison) throw new Error(`Worktree mutation blocked: ${setupPoison}`);
203
- if (setupActive) throw new Error("Worktree setup is active; finalization must await withWorktreeTransaction");
204
- }
205
-
206
- /** Later async finalization owners wrap their synchronous diff/cleanup as ONE turn. */
207
- export async function withWorktreeTransaction<T>(action: () => T | Promise<T>): Promise<T> {
208
- const previous = worktreeTurn;
209
- let release!: () => void;
210
- worktreeTurn = new Promise<void>((resolve) => { release = resolve; });
211
- await previous;
212
- try {
213
- if (setupPoison) throw new Error(`Worktree mutation blocked: ${setupPoison}`);
214
- return await action();
215
- } finally { release(); }
216
- }
217
-
218
- class SetupTransaction {
219
- readonly progress: WorktreeSetupProgress;
220
- readonly options: CreateWorktreesOptions;
221
- constructor(cwd: string, options: CreateWorktreesOptions) {
222
- this.options = options;
223
- this.progress = { setup: { cwd, baseCommit: "", worktrees: [] }, attempts: [], phase: "preflight" };
224
- }
225
- snapshot(): WorktreeSetupProgress {
226
- return structuredClone(this.progress);
227
- }
228
- publish(): void { this.options.onProgress?.(this.snapshot()); }
229
- check(): void {
230
- if (setupPoison) throw new Error(setupPoison);
231
- if (this.options.signal?.aborted) throw new Error("Worktree setup aborted");
232
- if (this.options.deadlineAt !== undefined && Date.now() >= this.options.deadlineAt) throw new Error("Worktree setup deadline exceeded");
233
- }
234
- unknown(error: unknown): void {
235
- const reason = error instanceof Error ? error.message : String(error);
236
- this.progress.unknown ??= reason;
237
- setupPoison ??= reason;
238
- }
239
- async command(command: string, args: string[], options: SetupCommandOptions = {}): Promise<SetupCommandResult> {
240
- this.check();
241
- this.progress.command = { command, args };
242
- if (this.progress.phase === "allocation") this.progress.attempts.at(-1)!.command = this.progress.command;
243
- if (this.progress.phase === "hook") this.progress.attempts.find((attempt) => attempt.path === options.cwd)!.hookCommand = this.progress.command;
244
- const result = await runSetupCommand(command, args, {
245
- ...options, signal: this.options.signal, deadlineAt: this.options.deadlineAt,
246
- onSpawn: (process) => { Object.assign(this.progress.command!, process); this.publish(); },
247
- });
248
- const { stdout: _stdout, stdoutBuffer: _stdoutBuffer, stderr: _stderr, ...metadata } = result;
249
- this.progress.command.result = metadata;
250
- if (result.processTree?.state === "unknown") this.unknown(result.error ?? "Command tree settlement unverified");
251
- this.publish();
252
- if (result.error) throw result.error;
253
- return result;
254
- }
255
- async git(cwd: string, args: string[], acceptedExitCodes?: readonly number[]): Promise<SetupCommandResult> {
256
- return this.command("git", ["-C", cwd, ...args], { acceptedExitCodes });
257
- }
258
- async gitChecked(cwd: string, args: string[]): Promise<string> {
259
- const result = await this.git(cwd, args);
260
- return result.stdout;
261
- }
262
- attempt(index: number, branch: string, worktreePath?: string): void {
263
- this.check();
264
- this.progress.phase = "allocation";
265
- this.progress.command = undefined;
266
- this.progress.attempts.push({ index, branch, path: worktreePath, validated: false });
267
- this.publish();
268
- }
269
- validated(worktree: WorktreeInfo): void {
270
- this.progress.phase = "validated";
271
- Object.assign(this.progress.attempts.at(-1)!, { path: worktree.path, validated: true });
272
- this.progress.setup.worktrees.push(worktree);
273
- this.publish();
274
- }
275
- }
276
-
277
- function runGit(cwd: string, args: string[], env?: NodeJS.ProcessEnv): GitResult {
278
- const result = spawnSync("git", ["-C", cwd, ...args], { encoding: "utf-8", windowsHide: true, shell: false, ...(env ? { env: { ...process.env, ...env } } : {}) });
279
- return {
280
- stdout: result.stdout ?? "",
281
- stderr: result.stderr ?? "",
282
- status: result.status,
283
- };
284
- }
285
-
286
- function runGitChecked(cwd: string, args: string[]): string {
287
- const result = runGit(cwd, args);
288
- if (result.status !== 0) {
289
- const command = `git -C ${cwd} ${args.join(" ")}`;
290
- const message = result.stderr.trim() || result.stdout.trim() || `${command} failed`;
291
- throw new Error(message);
292
- }
293
- return result.stdout;
294
- }
295
-
296
- /** Validate a captured patch against the worktree index without changing either. */
297
- export function validateWorktreePatch(worktreePath: string, patchPath: string): string | undefined {
298
- const result = runGit(worktreePath, [...PATCH_VALIDATION_OPTIONS, patchPath]);
299
- if (result.status === 0) return undefined;
300
- return result.stderr.trim() || result.stdout.trim() || `git -C ${worktreePath} apply --check failed`;
301
- }
302
-
303
- function currentWorktreePatch(worktreePath: string, baseCommit: string): { patch: string } | { error: string } {
304
- assertWorktreeMutationAllowed();
305
- let tempDir: string;
306
- try {
307
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-worktree-index-"));
308
- } catch (error) {
309
- return { error: error instanceof Error ? error.message : String(error) };
310
- }
311
- const env = { GIT_INDEX_FILE: path.join(tempDir, "index") };
312
- try {
313
- const readTree = runGit(worktreePath, ["read-tree", "HEAD"], env);
314
- if (readTree.status !== 0) return { error: readTree.stderr.trim() || readTree.stdout.trim() || "git read-tree failed" };
315
- const add = runGit(worktreePath, ["add", "-A"], env);
316
- if (add.status !== 0) return { error: add.stderr.trim() || add.stdout.trim() || "git add failed" };
317
- const diff = runGit(worktreePath, ["diff", "--cached", ...MACHINE_PATCH_OPTIONS, baseCommit], env);
318
- if (diff.status !== 0) return { error: diff.stderr.trim() || diff.stdout.trim() || "git diff failed" };
319
- return { patch: diff.stdout };
320
- } finally {
321
- try {
322
- fs.rmSync(tempDir, { recursive: true, force: true });
323
- } catch {
324
- // Cleanup safety depends on preserving the worktree, not on best-effort temp-index deletion.
325
- }
326
- }
327
- }
328
-
329
- export function validateWorktreePatchRepresentsCurrentWorktree(worktreePath: string, baseCommit: string, patchPath: string): string | undefined {
330
- const validationError = validateWorktreePatch(worktreePath, patchPath);
331
- if (validationError) return validationError;
332
- let capturedPatch: string;
333
- try {
334
- capturedPatch = fs.readFileSync(patchPath, "utf-8");
335
- } catch (error) {
336
- return error instanceof Error ? error.message : String(error);
337
- }
338
- const current = currentWorktreePatch(worktreePath, baseCommit);
339
- if ("error" in current) return current.error || "failed to capture current worktree patch";
340
- if (capturedPatch !== current.patch) return "captured handoff patch does not match current worktree changes";
341
- return undefined;
342
- }
343
-
344
- async function probeWorktreeSource(tx: Pick<SetupTransaction, "git" | "gitChecked">, cwd: string): Promise<string> {
345
- const repoCheck = await tx.git(cwd, ["rev-parse", "--is-inside-work-tree"], [0, 128]);
346
- if (repoCheck.status !== 0 || repoCheck.stdout.trim() !== "true") throw new Error("worktree isolation requires a git repository");
347
- const toplevel = (await tx.gitChecked(cwd, ["rev-parse", "--show-toplevel"])).trim();
348
-
349
- // pi-subagents writes durable runtime state under .pi/subagents/ by default;
350
- // that state must not make managed isolation unusable for later runs.
351
- const status = await tx.gitChecked(toplevel, ["status", "--porcelain", "--", `:!${PROJECT_SUBAGENTS_RELATIVE_DIR}`]);
352
- if (status.trim().length > 0) {
353
- throw new Error("worktree isolation requires a clean git working tree. Commit or stash changes first.");
354
- }
355
- return toplevel;
356
- }
357
-
358
- /** Read-only admission check; allocation repeats it because source state can change. */
359
- export async function preflightWorktreeSource(cwd: string, options: Pick<SetupCommandOptions, "signal" | "deadlineAt"> = {}): Promise<void> {
360
- const git = async (cwd: string, args: string[], acceptedExitCodes: readonly number[] = [0]): Promise<SetupCommandResult> => {
361
- const result = await runSetupCommand("git", ["-C", cwd, ...args], { ...options, acceptedExitCodes });
362
- if (result.error) throw result.error;
363
- if (result.outputIncomplete || result.status === null || !acceptedExitCodes.includes(result.status)) {
364
- throw new Error(result.stderr.trim().slice(0, 2000) || "Worktree source probe failed");
365
- }
366
- return result;
367
- };
368
- await probeWorktreeSource({ git, gitChecked: async (cwd, args) => (await git(cwd, args)).stdout }, cwd);
369
- }
370
-
371
- async function resolveRepoState(tx: SetupTransaction, cwd: string, requestedBaseRef: string | undefined): Promise<RepoState> {
372
- const toplevel = await probeWorktreeSource(tx, cwd);
373
- const rawPrefix = (await tx.gitChecked(cwd, ["rev-parse", "--show-prefix"])).trim();
374
- const cwdRelative = rawPrefix ? path.normalize(rawPrefix.replace(/[\\/]+$/, "")) : "";
375
-
376
- const baseRef = normalizeWorktreeBaseRef(requestedBaseRef) ?? DEFAULT_WORKTREE_BASE_REF;
377
- let baseCommit: string;
378
- try {
379
- const base = await tx.git(toplevel, ["rev-parse", "--verify", "--end-of-options", `${baseRef}^{commit}`], [0, 128]);
380
- if (base.status !== 0) throw new Error(base.stderr.trim() || "ref not found");
381
- baseCommit = base.stdout.trim();
382
- } catch (error) {
383
- throw new Error(`baseRef '${baseRef}' could not be resolved to a commit: ${error instanceof Error ? error.message : String(error)}`, { cause: error instanceof Error ? error : undefined });
384
- }
385
- if (!baseCommit) throw new Error(`baseRef '${baseRef}' could not be resolved to a commit`);
386
- return { toplevel, cwdRelative, baseCommit };
387
- }
388
-
389
- function normalizeComparableCwd(cwd: string): string {
390
- const resolved = path.resolve(cwd);
391
- let existing = resolved;
392
- const missingSegments: string[] = [];
393
- while (true) {
394
- try {
395
- let realpath: string;
396
- try {
397
- realpath = fs.realpathSync.native(existing);
398
- } catch {
399
- realpath = fs.realpathSync(existing);
400
- }
401
- return path.join(realpath, ...missingSegments.reverse());
402
- } catch {
403
- const parent = path.dirname(existing);
404
- if (parent === existing) return resolved;
405
- missingSegments.push(path.basename(existing));
406
- existing = parent;
407
- }
408
- }
409
- }
410
-
411
- export function findWorktreeTaskCwdConflict(
412
- tasks: ReadonlyArray<{ agent: string; cwd?: string }>,
413
- sharedCwd: string,
414
- ): WorktreeTaskCwdConflict | undefined {
415
- const normalizedSharedCwd = normalizeComparableCwd(sharedCwd);
416
- for (let index = 0; index < tasks.length; index++) {
417
- const task = tasks[index]!;
418
- if (!task.cwd) continue;
419
- const taskCwd = path.isAbsolute(task.cwd) ? task.cwd : path.resolve(sharedCwd, task.cwd);
420
- if (normalizeComparableCwd(taskCwd) === normalizedSharedCwd) continue;
421
- return { index, agent: task.agent, cwd: task.cwd };
422
- }
423
- return undefined;
424
- }
425
-
426
- export function formatWorktreeTaskCwdConflict(
427
- conflict: WorktreeTaskCwdConflict,
428
- sharedCwd: string,
429
- ): string {
430
- return `worktree isolation uses the shared cwd (${sharedCwd}); task ${conflict.index + 1} (${conflict.agent}) sets cwd to ${conflict.cwd}. Remove task-level cwd overrides or disable worktree.`;
431
- }
432
-
433
- function safePatchAgentName(agent: string): string {
434
- return agent.replace(/[^\w.-]/g, "_");
435
- }
436
-
437
- function shortWorktreeHash(value: string): string {
438
- return createHash("sha256").update(value, "utf-8").digest("hex").slice(0, 8);
439
- }
440
-
441
- function truncateUtf8(value: string, maxBytes: number): string {
442
- if (Buffer.byteLength(value, "utf-8") <= maxBytes) return value;
443
- const truncated = Buffer.from(value, "utf-8").subarray(0, maxBytes).toString("utf-8");
444
- return /[\uD800-\uDFFF]$/u.test(truncated) ? truncated.slice(0, -1) : truncated;
445
- }
446
-
447
- /** Convert an arbitrary label to a single safe filesystem/branch component. */
448
- export function sanitizeWorktreePathComponent(value: string, maxBytes = WORKTREE_NAMING_COMPONENT_MAX_BYTES): string {
449
- const raw = value.trim();
450
- let normalized = raw
451
- .replace(/[\\/\s]+/g, "-")
452
- .replace(/[^A-Za-z0-9._-]+/g, "-")
453
- .replace(/-+/g, "-")
454
- .replace(/^[._-]+|[._-]+$/g, "");
455
- if (!normalized) return "task";
456
- const changed = normalized !== raw;
457
- if (changed || Buffer.byteLength(normalized, "utf-8") > maxBytes) {
458
- const suffix = `-${shortWorktreeHash(raw || "task")}`;
459
- const prefix = truncateUtf8(normalized, Math.max(1, maxBytes - Buffer.byteLength(suffix, "utf-8"))).replace(/[._-]+$/g, "");
460
- normalized = `${prefix || "task"}${suffix}`;
461
- }
462
- return truncateUtf8(normalized, maxBytes).replace(/^[._-]+|[._-]+$/g, "") || "task";
463
- }
464
-
465
- function validGitRef(ref: string): boolean {
466
- if (!ref || ref === "@" || Buffer.byteLength(ref, "utf-8") > 1024 || ref.startsWith("/") || ref.endsWith("/") || ref.includes("//") || ref.includes("..") || ref.includes("@{")) return false;
467
- if (/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/iu.test(ref)) return false;
468
- if (/[[\]\\~^:?*\u0000-\u0020\u007f]/u.test(ref) || ref.endsWith(".") || ref.endsWith(".lock")) return false;
469
- return ref.split("/").every((component) => component.length > 0 && component !== "." && component !== ".." && !component.startsWith(".") && !component.endsWith(".") && !component.endsWith(".lock"));
470
- }
471
-
472
- /** Normalize and validate a configured worktree base ref without resolving it. */
473
- export function normalizeWorktreeBaseRef(value: unknown): string | undefined {
474
- if (value === undefined) return undefined;
475
- if (typeof value !== "string" || !validGitRef(value)) throw new Error("baseRef must be a valid Git ref: use HEAD or a supported named ref (for example, refs/heads/main). Full 40/64-character commit IDs and revision expressions are unsupported.");
476
- return value;
477
- }
478
-
479
- /** Normalize and validate the configured Git branch namespace. */
480
- export function normalizeWorktreeBranchPrefix(value: string | undefined): string {
481
- const raw = value === undefined ? DEFAULT_WORKTREE_BRANCH_PREFIX : value.trim();
482
- if (!raw) throw new Error("worktree branch prefix cannot be empty");
483
- if (raw.includes("\\") || /[\u0000-\u001f\u007f\s]/u.test(raw) || raw.startsWith("/") || raw.includes("//") || raw.includes("..") || raw.includes("@{")) {
484
- throw new Error("worktree branch prefix contains invalid Git ref characters");
485
- }
486
- const withoutTrailingSlash = raw.replace(/\/+$/u, "");
487
- if (!withoutTrailingSlash || withoutTrailingSlash.startsWith("-") || withoutTrailingSlash.split("/").some((component) => component === "." || component === ".." || component.startsWith("."))) {
488
- throw new Error("worktree branch prefix contains an invalid Git ref component");
489
- }
490
- const prefix = `${withoutTrailingSlash}/`;
491
- if (!validGitRef(`${prefix}task`)) throw new Error("worktree branch prefix is not a valid Git ref namespace");
492
- return prefix;
493
- }
494
-
495
- function runShortId(runId: string): string {
496
- const base = runId.replace(/-s\d+$/u, "");
497
- const normalized = sanitizeWorktreePathComponent(base || runId, 16);
498
- return normalized.length > 12 ? normalized.slice(0, 12) : normalized;
499
- }
500
-
501
- function nonNegativeNamingIndex(value: number | undefined, label: string, fallback: number): number {
502
- const resolved = value ?? fallback;
503
- if (!Number.isSafeInteger(resolved) || resolved < 0) throw new Error(`${label} must be a non-negative integer`);
504
- return resolved;
505
- }
506
-
507
- /** Build the shared branch identity used by native and Worktrunk allocation. */
508
- export function buildWorktreeNaming(input: WorktreeNamingInput): WorktreeNaming {
509
- if (!input.runId.trim()) throw new Error("worktree run id cannot be empty");
510
- const index = nonNegativeNamingIndex(input.index, "worktree index", 0);
511
- const stepIndex = nonNegativeNamingIndex(input.stepIndex, "worktree step index", Number(input.runId.match(/-s(\d+)$/u)?.[1] ?? 0));
512
- const taskIndex = nonNegativeNamingIndex(input.taskIndex, "worktree task index", index);
513
- const label = input.laneKey?.trim()
514
- || input.workflowKey?.trim()
515
- || input.outputName?.trim()
516
- || input.taskKey?.trim()
517
- || input.label?.trim()
518
- || (input.agent?.trim() && input.task?.trim() ? `${input.agent.trim()}-${input.task.trim()}` : undefined)
519
- || input.agent?.trim()
520
- || "task";
521
- const branchPrefix = normalizeWorktreeBranchPrefix(input.branchPrefix);
522
- const labelComponent = sanitizeWorktreePathComponent(label);
523
- const pathComponentBase = `${labelComponent}-${runShortId(input.runId)}-s${stepIndex}-t${taskIndex}`;
524
- const sanitizedPathComponent = validGitRef(`${branchPrefix}${pathComponentBase}`)
525
- ? pathComponentBase
526
- : sanitizeWorktreePathComponent(pathComponentBase, WORKTREE_NAMING_COMPONENT_MAX_BYTES);
527
- let requestedBranch = `${branchPrefix}${sanitizedPathComponent}`;
528
- if (!validGitRef(requestedBranch) || Buffer.byteLength(requestedBranch, "utf-8") > WORKTREE_NAMING_BRANCH_MAX_BYTES) {
529
- const suffix = `-${shortWorktreeHash(pathComponentBase)}`;
530
- const available = Math.max(1, WORKTREE_NAMING_BRANCH_MAX_BYTES - Buffer.byteLength(branchPrefix, "utf-8") - Buffer.byteLength(suffix, "utf-8"));
531
- requestedBranch = `${branchPrefix}${truncateUtf8(pathComponentBase, available).replace(/[._-]+$/g, "")}${suffix}`;
532
- }
533
- if (!validGitRef(requestedBranch) || Buffer.byteLength(requestedBranch, "utf-8") > WORKTREE_NAMING_BRANCH_MAX_BYTES) throw new Error(`generated worktree branch is not a valid Git ref: ${requestedBranch}`);
534
- const metadataLabel = truncateUtf8(label.replace(/[\u0000-\u001f\u007f]+/gu, " ").replace(/\s+/gu, " ").trim() || "task", WORKTREE_NAMING_LABEL_MAX_BYTES);
535
- return {
536
- requestedBranch,
537
- branchPrefix,
538
- label: metadataLabel,
539
- sanitizedPathComponent: requestedBranch.slice(branchPrefix.length),
540
- };
541
- }
542
-
543
- function hasConfiguredWorktreeBaseDir(baseDir: string | undefined): boolean {
544
- return baseDir !== undefined
545
- ? true
546
- : (process.env.PI_SUBAGENTS_WORKTREE_DIR?.trim().length ?? 0) > 0;
547
- }
548
-
549
- function isInsidePiExtensionsDirectory(targetPath: string): boolean {
550
- const extensionsDir = normalizeComparableCwd(path.join(getAgentDir(), "extensions"));
551
- return isPathInside(extensionsDir, normalizeComparableCwd(targetPath));
552
- }
553
-
554
- interface WorktrunkCapability {
555
- available: boolean;
556
- reason?: string;
557
- }
558
-
559
- function runWorktrunk(args: string[], cwd?: string): WorktreeCommandResult {
560
- try {
561
- const result = spawnSync(WORKTRUNK_COMMAND, [...WORKTRUNK_ARG_PREFIX, ...args], {
562
- cwd,
563
- encoding: "utf-8",
564
- windowsHide: true,
565
- shell: false,
566
- maxBuffer: WORKTREE_COMMAND_OUTPUT_MAX_BYTES,
567
- });
568
- const stdout = result.stdout ?? "";
569
- const stderr = result.stderr ?? "";
570
- if (Buffer.byteLength(stdout, "utf-8") > WORKTREE_COMMAND_OUTPUT_MAX_BYTES) throw new Error("Worktrunk stdout exceeds the output limit");
571
- return { stdout, stderr, status: result.status, ...(result.error ? { error: result.error } : {}) };
572
- } catch (error) {
573
- return { stdout: "", stderr: "", status: null, error: error instanceof Error ? error : new Error(String(error)) };
574
- }
575
- }
576
-
577
- function probeWorktrunk(): WorktrunkCapability {
578
- const result = runWorktrunk(["--version"]);
579
- if (result.status !== 0) return { available: false, reason: result.error?.message || result.stderr.trim() || "Worktrunk is unavailable" };
580
- const version = result.stdout.trim().match(/\b(?:wt\s+)?v?(\d+\.\d+(?:\.\d+)?)\b/i)?.[1];
581
- if (!version) return { available: false, reason: "Worktrunk returned an invalid version" };
582
- const help = runWorktrunk(["switch", "--help"]);
583
- if (help.status !== 0) return { available: false, reason: help.error?.message || help.stderr.trim() || "Worktrunk switch capability is unavailable" };
584
- const helpText = `${help.stdout}\n${help.stderr}`;
585
- const requiredCapabilities = ["--create", "--base", "--no-cd", "--no-hooks", "--format"];
586
- const missing = requiredCapabilities.filter((flag) => !helpText.includes(flag));
587
- if (missing.length > 0) return { available: false, reason: `Worktrunk switch is missing required capabilities: ${missing.join(", ")}` };
588
- return { available: true };
589
- }
590
-
591
- /** Resolve a requested provider without silently switching after allocation starts. */
592
- export function resolveWorktreeProvider(requested: WorktreeProvider | undefined, baseDir?: string): ManagedWorktreeProvider {
593
- const selection = requested ?? DEFAULT_WORKTREE_PROVIDER;
594
- if (selection !== "auto" && selection !== "native" && selection !== "worktrunk") throw new Error(`worktree provider must be "auto", "native", or "worktrunk"`);
595
- if (selection === "native") return "native";
596
- if (hasConfiguredWorktreeBaseDir(baseDir)) {
597
- if (selection === "worktrunk") throw new Error("worktreeProvider='worktrunk' cannot be combined with worktreeBaseDir or PI_SUBAGENTS_WORKTREE_DIR");
598
- return "native";
599
- }
600
- const capability = probeWorktrunk();
601
- if (capability.available) return "worktrunk";
602
- if (selection === "worktrunk") throw new Error(`Worktrunk provider is unavailable: ${capability.reason ?? "unknown capability failure"}`);
603
- return "native";
604
- }
605
-
606
- async function resolveSetupProvider(tx: SetupTransaction, requested: WorktreeProvider | undefined, baseDir: string | undefined, repoRoot: string): Promise<ManagedWorktreeProvider> {
607
- const selection = requested ?? DEFAULT_WORKTREE_PROVIDER;
608
- if (selection !== "auto" && selection !== "native" && selection !== "worktrunk") throw new Error('worktree provider must be "auto", "native", or "worktrunk"');
609
- if (selection === "native") return "native";
610
- if (hasConfiguredWorktreeBaseDir(baseDir)) {
611
- if (selection === "worktrunk") throw new Error("worktreeProvider='worktrunk' cannot be combined with worktreeBaseDir or PI_SUBAGENTS_WORKTREE_DIR");
612
- return "native";
613
- }
614
- if (selection === "auto" && isInsidePiExtensionsDirectory(repoRoot)) return "native";
615
- let reason: string | undefined;
616
- try {
617
- const probeExitCodes = Array.from({ length: 256 }, (_, code) => code);
618
- const version = await tx.command(WORKTRUNK_COMMAND, [...WORKTRUNK_ARG_PREFIX, "--version"], { maxBuffer: WORKTREE_COMMAND_OUTPUT_MAX_BYTES, acceptedExitCodes: probeExitCodes });
619
- if (version.status !== 0 || !/\b(?:wt\s+)?v?(\d+\.\d+(?:\.\d+)?)\b/i.test(version.stdout.trim())) reason = "Worktrunk is unavailable or returned an invalid version";
620
- else {
621
- const help = await tx.command(WORKTRUNK_COMMAND, [...WORKTRUNK_ARG_PREFIX, "switch", "--help"], { maxBuffer: WORKTREE_COMMAND_OUTPUT_MAX_BYTES, acceptedExitCodes: probeExitCodes });
622
- const missing = ["--create", "--base", "--no-cd", "--no-hooks", "--format"].filter((flag) => !`${help.stdout}\n${help.stderr}`.includes(flag));
623
- if (help.status !== 0 || missing.length) reason = `Worktrunk switch capability unavailable: ${missing.join(", ")}`;
624
- }
625
- } catch (error) {
626
- if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT") throw error;
627
- reason = error.message;
628
- }
629
- if (!reason) return "worktrunk";
630
- if (selection === "worktrunk") throw new Error(`Worktrunk provider is unavailable: ${reason}`);
631
- return "native";
632
- }
633
-
634
- /** Whether a launch must bind its worktree-dependent paths after allocation. */
635
- export function shouldDeferWorktreeCwd(requested: WorktreeProvider | undefined, baseDir?: string): boolean {
636
- return (requested ?? DEFAULT_WORKTREE_PROVIDER) !== "native" && !hasConfiguredWorktreeBaseDir(baseDir);
637
- }
638
-
639
- /**
640
- * Resolves the dedicated worktree root: the configured base directory or
641
- * PI_SUBAGENTS_WORKTREE_DIR when set, otherwise a `worktrees` folder sibling
642
- * to the repository. Managed leaves always nest one level deeper under the
643
- * project folder (`basename(repoRoot)`).
644
- */
645
- function resolveWorktreeDedicatedRoot(configuredBaseDir: string | undefined, repoRoot: string, relocateExtensionRepo = true): string {
646
- const rawBaseDir = configuredBaseDir ?? process.env.PI_SUBAGENTS_WORKTREE_DIR;
647
- let expanded: string;
648
- if (rawBaseDir === undefined || (configuredBaseDir === undefined && !rawBaseDir.trim())) {
649
- expanded = relocateExtensionRepo && isInsidePiExtensionsDirectory(repoRoot)
650
- ? path.join(getAgentDir(), "worktrees")
651
- : path.join(path.dirname(repoRoot), "worktrees");
652
- } else {
653
- const trimmed = rawBaseDir.trim();
654
- if (!trimmed) throw new Error("worktree base directory cannot be empty");
655
-
656
- const candidate = trimmed.startsWith("~/") ? path.join(os.homedir(), trimmed.slice(2)) : trimmed;
657
- expanded = path.isAbsolute(candidate) ? candidate : path.resolve(repoRoot, candidate);
658
- }
659
- const extensionsDir = normalizeComparableCwd(path.join(getAgentDir(), "extensions"));
660
- if (isPathInside(extensionsDir, normalizeComparableCwd(expanded))) {
661
- throw new Error(`worktree base directory cannot be inside Pi extensions directory: ${extensionsDir}. Choose a directory outside it.`);
662
- }
663
- return expanded;
664
- }
665
-
666
- function buildNativeProjectPath(dedicatedRoot: string, repoRoot: string): string {
667
- return path.join(dedicatedRoot, path.basename(repoRoot));
668
- }
669
-
670
- /**
671
- * Creates the project folder (parents included) so `git worktree add` can create
672
- * the leaf inside it. Must only run after `assertSafeWorktreeLocation` accepted
673
- * the planned leaf — an unsafe base must never be materialized on disk.
674
- */
675
- function ensureProjectWorktreeDir(dedicatedRoot: string, repoRoot: string): void {
676
- try {
677
- fs.mkdirSync(buildNativeProjectPath(dedicatedRoot, repoRoot), { recursive: true });
678
- } catch (error) {
679
- const message = error instanceof Error ? error.message : String(error);
680
- throw new Error(`failed to create worktree base directory ${dedicatedRoot}: ${message}`);
681
- }
682
- }
683
-
684
- function buildNativeWorktreePath(dedicatedRoot: string, repoRoot: string, runId: string, index: number): string {
685
- return path.join(buildNativeProjectPath(dedicatedRoot, repoRoot), `pi-worktree-${sanitizeWorktreePathComponent(runId, 120)}-${index}`);
686
- }
687
-
688
- function isPathInside(parent: string, child: string): boolean {
689
- const relative = path.relative(parent, child);
690
- if (!relative || relative === ".") return true;
691
- return relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
692
- }
693
-
694
- function isStrictChildPath(parent: string, child: string): boolean {
695
- const relative = path.relative(parent, child);
696
- return Boolean(relative) && relative !== "." && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
697
- }
698
-
699
- /** Fail closed before `git worktree add`: reject unsafe planned/realpath locations. */
700
- function assertSafeWorktreeLocation(worktreePath: string, repoRoot: string, dedicatedRoot: string): void {
701
- const resolvedLeaf = normalizeComparableCwd(worktreePath);
702
- const resolvedRepoRoot = normalizeComparableCwd(repoRoot);
703
- const projectDir = normalizeComparableCwd(buildNativeProjectPath(dedicatedRoot, repoRoot));
704
- const repoParent = normalizeComparableCwd(path.dirname(resolvedRepoRoot));
705
- const leafParent = normalizeComparableCwd(path.dirname(resolvedLeaf));
706
- const extensionsDir = normalizeComparableCwd(path.join(getAgentDir(), "extensions"));
707
-
708
- if (isPathInside(extensionsDir, projectDir) || isPathInside(extensionsDir, resolvedLeaf)) {
709
- throw new Error(`worktree path cannot be inside Pi extensions directory: ${extensionsDir}. Choose a directory outside it.`);
710
- }
711
- if (isPathInside(resolvedRepoRoot, resolvedLeaf)) {
712
- throw new Error(`worktree path would land inside the repository checkout: ${resolvedLeaf}`);
713
- }
714
- if (leafParent === repoParent) {
715
- throw new Error(`worktree path would be a direct child of the repository parent: ${resolvedLeaf}`);
716
- }
717
- if (!isStrictChildPath(projectDir, resolvedLeaf)) {
718
- throw new Error(`worktree path must be a strict child of the project worktree directory ${projectDir}: ${resolvedLeaf}`);
719
- }
720
- }
721
-
722
- function resolveRepoCwdRelative(cwd: string): string {
723
- const repoCheck = runGit(cwd, ["rev-parse", "--is-inside-work-tree"]);
724
- if (repoCheck.status !== 0 || repoCheck.stdout.trim() !== "true") {
725
- throw new Error("worktree isolation requires a git repository");
726
- }
727
- const rawPrefix = runGitChecked(cwd, ["rev-parse", "--show-prefix"]).trim();
728
- const normalizedPrefix = rawPrefix
729
- ? path.normalize(rawPrefix.replace(/[\\/]+$/, ""))
730
- : "";
731
- return normalizedPrefix === "." ? "" : normalizedPrefix;
732
- }
733
-
734
- export function resolveExpectedWorktreeAgentCwd(cwd: string, runId: string, index: number, baseDir?: string): string {
735
- const cwdRelative = resolveRepoCwdRelative(cwd);
736
- const repoRoot = runGitChecked(cwd, ["rev-parse", "--show-toplevel"]).trim();
737
- const dedicatedRoot = resolveWorktreeDedicatedRoot(baseDir, repoRoot);
738
- const worktreePath = buildNativeWorktreePath(dedicatedRoot, repoRoot, runId, index);
739
- assertSafeWorktreeLocation(worktreePath, repoRoot, dedicatedRoot);
740
- return cwdRelative ? path.join(worktreePath, cwdRelative) : worktreePath;
741
- }
742
-
743
- function linkNodeModulesIfPresent(toplevel: string, worktreePath: string): boolean {
744
- const nodeModulesPath = path.join(toplevel, "node_modules");
745
- const nodeModulesLinkPath = path.join(worktreePath, "node_modules");
746
- const hasDirectoryEntry = (candidate: string): boolean => {
747
- try { fs.lstatSync(candidate); return true; }
748
- catch (error) {
749
- if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
750
- throw error;
751
- }
752
- };
753
- try {
754
- if (hasDirectoryEntry(nodeModulesLinkPath)) return false;
755
- let sourceRealPath: string;
756
- try {
757
- if (!fs.statSync(nodeModulesPath).isDirectory()) throw new Error("source node_modules is not a directory");
758
- sourceRealPath = fs.realpathSync.native(nodeModulesPath);
759
- } catch (error) {
760
- if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
761
- throw error;
762
- }
763
- fs.symlinkSync(nodeModulesPath, nodeModulesLinkPath, process.platform === "win32" ? "junction" : "dir");
764
- if (!fs.lstatSync(nodeModulesLinkPath).isSymbolicLink()
765
- || fs.realpathSync.native(nodeModulesLinkPath) !== sourceRealPath) {
766
- throw new Error("created link does not resolve to the source node_modules");
767
- }
768
- return true;
769
- } catch (error) {
770
- const code = error instanceof Error && "code" in error && typeof error.code === "string" ? `${error.code}: ` : "";
771
- throw new Error(
772
- `failed to link node_modules from ${nodeModulesPath} to ${nodeModulesLinkPath}: ${code}${error instanceof Error ? error.message : String(error)}`,
773
- { cause: error },
774
- );
775
- }
776
- }
777
-
778
- function parseHookTimeout(timeoutMs: number | undefined): number {
779
- if (timeoutMs === undefined) return DEFAULT_WORKTREE_SETUP_HOOK_TIMEOUT_MS;
780
- if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {
781
- throw new Error("worktree setup hook timeout must be an integer greater than 0");
782
- }
783
- return timeoutMs;
784
- }
785
-
786
- function resolveWorktreeSetupHook(
787
- repoRoot: string,
788
- config: WorktreeSetupHookConfig | undefined,
789
- ): ResolvedWorktreeSetupHook | undefined {
790
- if (!config) return undefined;
791
- const hookPath = config.hookPath.trim();
792
- if (!hookPath) {
793
- throw new Error("worktree setup hook path cannot be empty");
794
- }
795
-
796
- const expandedHookPath = hookPath.startsWith("~/") ? path.join(os.homedir(), hookPath.slice(2)) : hookPath;
797
- let resolvedPath: string;
798
- if (path.isAbsolute(expandedHookPath)) {
799
- resolvedPath = expandedHookPath;
800
- } else if (expandedHookPath.includes("/") || expandedHookPath.includes("\\")) {
801
- resolvedPath = path.resolve(repoRoot, expandedHookPath);
802
- } else {
803
- throw new Error("worktree setup hook must be an absolute path or a repo-relative path");
804
- }
805
-
806
- if (!fs.existsSync(resolvedPath)) {
807
- throw new Error(`worktree setup hook not found: ${resolvedPath}`);
808
- }
809
- if (fs.statSync(resolvedPath).isDirectory()) {
810
- throw new Error(`worktree setup hook must be a file, got directory: ${resolvedPath}`);
811
- }
812
-
813
- return {
814
- hookPath: resolvedPath,
815
- timeoutMs: parseHookTimeout(config.timeoutMs),
816
- };
817
- }
818
-
819
- function normalizeSyntheticPath(worktreePath: string, rawPath: string): string {
820
- const trimmed = rawPath.trim();
821
- if (!trimmed) throw new Error("synthetic path cannot be empty");
822
- if (path.isAbsolute(trimmed)) throw new Error(`synthetic path must be relative: ${rawPath}`);
823
-
824
- const resolved = path.resolve(worktreePath, trimmed);
825
- const relative = path.relative(worktreePath, resolved);
826
- if (!relative || relative === ".") {
827
- throw new Error(`synthetic path cannot target the worktree root: ${rawPath}`);
828
- }
829
- if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
830
- throw new Error(`synthetic path escapes the worktree root: ${rawPath}`);
831
- }
832
- return path.normalize(relative);
833
- }
834
-
835
- function parseWorktreeSetupHookOutput(rawStdout: string): WorktreeSetupHookOutput {
836
- const trimmed = rawStdout.trim();
837
- if (!trimmed) {
838
- throw new Error("worktree setup hook returned empty stdout; expected JSON object");
839
- }
840
- let parsed: unknown;
841
- try {
842
- parsed = JSON.parse(trimmed);
843
- } catch (error) {
844
- const message = error instanceof Error ? error.message : String(error);
845
- throw new Error(`worktree setup hook returned invalid JSON: ${message}`);
846
- }
847
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
848
- throw new Error("worktree setup hook stdout must be a JSON object");
849
- }
850
- return parsed as WorktreeSetupHookOutput;
851
- }
852
-
853
- async function runWorktreeSetupHook(
854
- tx: SetupTransaction,
855
- hook: ResolvedWorktreeSetupHook,
856
- input: WorktreeSetupHookInput,
857
- ): Promise<string[]> {
858
- tx.progress.phase = "hook";
859
- let result: SetupCommandResult;
860
- try {
861
- result = await tx.command(hook.hookPath, [], {
862
- cwd: input.worktreePath,
863
- input: JSON.stringify(input),
864
- hookTimeoutMs: hook.timeoutMs,
865
- });
866
- } catch (error) {
867
- throw new Error(`worktree setup hook failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
868
- }
869
- tx.progress.phase = "hook-validation";
870
-
871
- try {
872
- const output = parseWorktreeSetupHookOutput(result.stdout);
873
- if (output.syntheticPaths === undefined) return [];
874
- if (!Array.isArray(output.syntheticPaths)) {
875
- throw new Error("worktree setup hook output field 'syntheticPaths' must be an array of relative paths");
876
- }
877
- const uniquePaths = new Set<string>();
878
- for (const candidate of output.syntheticPaths) {
879
- if (typeof candidate !== "string") throw new Error("worktree setup hook output field 'syntheticPaths' must contain only strings");
880
- const normalizedPath = normalizeSyntheticPath(input.worktreePath, candidate);
881
- if ((await tx.gitChecked(input.worktreePath, ["ls-files", "--", normalizedPath])).trim()) {
882
- throw new Error(`worktree setup hook cannot mark tracked paths as synthetic: ${normalizedPath}`);
883
- }
884
- uniquePaths.add(normalizedPath);
885
- }
886
- return [...uniquePaths];
887
- } catch (error) {
888
- // Semantic rejection occurs after exit: retain uncertainty, never signal an old PID.
889
- tx.unknown(error);
890
- throw error;
891
- }
892
- }
893
-
894
- async function finalizeCreatedWorktree(
895
- tx: SetupTransaction,
896
- toplevel: string,
897
- cwdRelative: string,
898
- runId: string,
899
- baseCommit: string,
900
- setupHook: ResolvedWorktreeSetupHook | undefined,
901
- agent: string | undefined,
902
- worktree: WorktreeInfo,
903
- ): Promise<WorktreeInfo> {
904
- const agentCwd = cwdRelative ? path.join(worktree.path, cwdRelative) : worktree.path;
905
- tx.check();
906
- const nodeModulesLinked = linkNodeModulesIfPresent(toplevel, worktree.path);
907
- const syntheticPaths = nodeModulesLinked ? ["node_modules"] : [];
908
- if (setupHook) {
909
- const hookSyntheticPaths = await runWorktreeSetupHook(tx, setupHook, {
910
- version: 1, repoRoot: toplevel, worktreePath: worktree.path, agentCwd,
911
- branch: worktree.branch, index: worktree.index, runId, baseCommit, agent,
912
- });
913
- syntheticPaths.push(...hookSyntheticPaths);
914
- }
915
- return { ...worktree, agentCwd, nodeModulesLinked, syntheticPaths };
916
- }
917
-
918
- async function createNativeWorktree(
919
- tx: SetupTransaction,
920
- toplevel: string,
921
- cwdRelative: string,
922
- runId: string,
923
- index: number,
924
- baseCommit: string,
925
- setupHook: ResolvedWorktreeSetupHook | undefined,
926
- agent: string | undefined,
927
- dedicatedRoot: string,
928
- labels: Array<string | undefined> | undefined,
929
- tasks: Array<string | undefined> | undefined,
930
- branchPrefix: string | undefined,
931
- ): Promise<WorktreeInfo> {
932
- const naming = buildWorktreeNaming({ runId, index, agent, label: labels?.[index], task: tasks?.[index], branchPrefix });
933
- const worktreePath = buildNativeWorktreePath(dedicatedRoot, toplevel, runId, index);
934
- assertSafeWorktreeLocation(worktreePath, toplevel, dedicatedRoot);
935
- // Absence is required before claiming any partial artifacts from this attempt.
936
- const branch = await tx.git(toplevel, ["show-ref", "--verify", "--quiet", `refs/heads/${naming.requestedBranch}`], [0, 1]);
937
- let pathExists = false;
938
- try { fs.lstatSync(worktreePath); pathExists = true; }
939
- catch (error) { if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT") throw error; }
940
- if (branch.status !== 1 || pathExists) throw new Error(`worktree path or branch already exists: ${worktreePath}, ${naming.requestedBranch}`);
941
- tx.attempt(index, naming.requestedBranch, worktreePath);
942
- ensureProjectWorktreeDir(dedicatedRoot, toplevel);
943
- await tx.git(toplevel, ["worktree", "add", worktreePath, "-b", naming.requestedBranch, baseCommit]);
944
- const worktree: WorktreeInfo = {
945
- path: worktreePath,
946
- agentCwd: worktreePath,
947
- branch: naming.requestedBranch,
948
- index,
949
- nodeModulesLinked: false,
950
- syntheticPaths: [],
951
- provider: "native",
952
- naming,
953
- };
954
- tx.validated(worktree);
955
- return finalizeCreatedWorktree(tx, toplevel, cwdRelative, runId, baseCommit, setupHook, agent, worktree);
956
- }
957
-
958
- interface WorktrunkSwitchOutput {
959
- action?: unknown;
960
- branch?: unknown;
961
- path?: unknown;
962
- created_branch?: unknown;
963
- base_branch?: unknown;
964
- }
965
-
966
- function parseWorktrunkSwitchOutput(rawStdout: string): WorktrunkSwitchOutput {
967
- if (Buffer.byteLength(rawStdout, "utf-8") > WORKTREE_COMMAND_OUTPUT_MAX_BYTES) throw new Error("Worktrunk provisioning output exceeds the output limit");
968
- const trimmed = rawStdout.trim();
969
- if (!trimmed) throw new Error("Worktrunk provisioning returned empty stdout; expected JSON object");
970
- let parsed: unknown;
971
- try {
972
- parsed = JSON.parse(trimmed);
973
- } catch (error) {
974
- throw new Error(`Worktrunk provisioning returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
975
- }
976
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("Worktrunk provisioning stdout must be a JSON object");
977
- return parsed as WorktrunkSwitchOutput;
978
- }
979
-
980
- async function createWorktrunkWorktree(
981
- tx: SetupTransaction,
982
- toplevel: string,
983
- cwdRelative: string,
984
- runId: string,
985
- index: number,
986
- baseCommit: string,
987
- agents: string[] | undefined,
988
- labels: Array<string | undefined> | undefined,
989
- tasks: Array<string | undefined> | undefined,
990
- branchPrefix: string | undefined,
991
- ): Promise<WorktreeInfo> {
992
- const naming = buildWorktreeNaming({ runId, index, agent: agents?.[index], label: labels?.[index], task: tasks?.[index], branchPrefix });
993
- const args = ["-C", toplevel, "switch", "--create", naming.requestedBranch, "--base", baseCommit, "--no-cd", "--no-hooks", "--format", "json"];
994
- tx.attempt(index, naming.requestedBranch);
995
- const result = await tx.command(WORKTRUNK_COMMAND, [...WORKTRUNK_ARG_PREFIX, ...args], { cwd: toplevel, maxBuffer: WORKTREE_COMMAND_OUTPUT_MAX_BYTES });
996
- tx.progress.phase = "validation";
997
- try {
998
- const output = parseWorktrunkSwitchOutput(result.stdout);
999
- if (output.action !== "created" || output.created_branch !== true || output.branch !== naming.requestedBranch || output.base_branch !== baseCommit) {
1000
- throw new Error("Worktrunk provisioning returned inconsistent creation metadata");
1001
- }
1002
- if (typeof output.path !== "string" || !path.isAbsolute(output.path)) throw new Error("Worktrunk provisioning returned a non-absolute worktree path");
1003
- const worktreePathCandidate = path.resolve(output.path);
1004
- let stat: fs.Stats;
1005
- try {
1006
- stat = fs.lstatSync(worktreePathCandidate);
1007
- } catch (error) {
1008
- throw new Error(`Worktrunk provisioning returned a missing worktree path: ${worktreePathCandidate}`, { cause: error instanceof Error ? error : undefined });
1009
- }
1010
- if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error("Worktrunk provisioning returned a path that is not a real directory");
1011
- const worktreePath = normalizeComparableCwd(worktreePathCandidate);
1012
- if (worktreePath === normalizeComparableCwd(toplevel)) throw new Error("Worktrunk provisioning returned the source checkout path");
1013
- const sourceCommonDirRaw = (await tx.gitChecked(toplevel, ["rev-parse", "--git-common-dir"])).trim();
1014
- const returnedCommonDirRaw = (await tx.gitChecked(worktreePath, ["rev-parse", "--git-common-dir"])).trim();
1015
- const sourceCommonDir = normalizeComparableCwd(path.isAbsolute(sourceCommonDirRaw) ? sourceCommonDirRaw : path.resolve(toplevel, sourceCommonDirRaw));
1016
- const returnedCommonDir = normalizeComparableCwd(path.isAbsolute(returnedCommonDirRaw) ? returnedCommonDirRaw : path.resolve(worktreePath, returnedCommonDirRaw));
1017
- if (returnedCommonDir !== sourceCommonDir) throw new Error("Worktrunk provisioning returned a worktree for a different repository");
1018
- const returnedBranch = (await tx.gitChecked(worktreePath, ["symbolic-ref", "--quiet", "--short", "HEAD"])).trim();
1019
- if (returnedBranch !== naming.requestedBranch) throw new Error("Worktrunk provisioning returned a worktree on a different branch");
1020
- const returnedHead = (await tx.gitChecked(worktreePath, ["rev-parse", "HEAD"])).trim();
1021
- if (returnedHead !== baseCommit) throw new Error("Worktrunk provisioning returned a worktree at a different base commit");
1022
- const worktree: WorktreeInfo = {
1023
- path: worktreePath,
1024
- agentCwd: cwdRelative ? path.join(worktreePath, cwdRelative) : worktreePath,
1025
- branch: naming.requestedBranch,
1026
- index,
1027
- nodeModulesLinked: false,
1028
- syntheticPaths: [],
1029
- provider: "worktrunk",
1030
- naming,
1031
- };
1032
- tx.validated(worktree);
1033
- return worktree;
1034
- } catch (error) {
1035
- tx.unknown(error);
1036
- throw error;
1037
- }
1038
- }
1039
-
1040
- function removeSyntheticPath(worktree: WorktreeInfo, syntheticPath: string): void {
1041
- assertWorktreeMutationAllowed();
1042
- const resolved = path.resolve(worktree.path, syntheticPath);
1043
- const relative = path.relative(worktree.path, resolved);
1044
- if (!relative || relative === "." || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
1045
- return;
1046
- }
1047
-
1048
- let stat: fs.Stats;
1049
- try {
1050
- stat = fs.lstatSync(resolved);
1051
- } catch (error) {
1052
- const code = error && typeof error === "object" && "code" in error ? (error as { code?: unknown }).code : undefined;
1053
- if (code === "ENOENT") return;
1054
- throw error;
1055
- }
1056
-
1057
- if (stat.isSymbolicLink()) {
1058
- fs.unlinkSync(resolved);
1059
- return;
1060
- }
1061
- if (stat.isDirectory()) {
1062
- fs.rmSync(resolved, { recursive: true, force: true });
1063
- return;
1064
- }
1065
- fs.rmSync(resolved, { force: true });
1066
- }
1067
-
1068
- function removeSyntheticPathsBeforeDiff(worktree: WorktreeInfo): void {
1069
- if (worktree.syntheticPaths.length === 0) return;
1070
- const seen = new Set<string>();
1071
- for (const syntheticPath of worktree.syntheticPaths) {
1072
- if (seen.has(syntheticPath)) continue;
1073
- seen.add(syntheticPath);
1074
- removeSyntheticPath(worktree, syntheticPath);
1075
- }
1076
- }
1077
-
1078
- function emptyDiff(index: number, agent: string, branch: string, patchPath: string, error?: string): WorktreeDiff {
1079
- return {
1080
- index,
1081
- agent,
1082
- branch,
1083
- diffStat: "",
1084
- filesChanged: 0,
1085
- insertions: 0,
1086
- deletions: 0,
1087
- patchPath,
1088
- ...(error ? { error } : {}),
1089
- };
1090
- }
1091
-
1092
- function parseNumstat(numstat: string): { filesChanged: number; insertions: number; deletions: number } {
1093
- const lines = numstat
1094
- .split("\n")
1095
- .map((line) => line.trim())
1096
- .filter(Boolean);
1097
- let filesChanged = 0;
1098
- let insertions = 0;
1099
- let deletions = 0;
1100
-
1101
- for (const line of lines) {
1102
- const [rawInsertions, rawDeletions] = line.split("\t");
1103
- if (rawInsertions === undefined || rawDeletions === undefined) continue;
1104
- filesChanged++;
1105
- if (/^\d+$/.test(rawInsertions)) insertions += parseInt(rawInsertions, 10);
1106
- if (/^\d+$/.test(rawDeletions)) deletions += parseInt(rawDeletions, 10);
1107
- }
1108
-
1109
- return { filesChanged, insertions, deletions };
1110
- }
1111
-
1112
- function captureWorktreeDiff(
1113
- setup: WorktreeSetup,
1114
- worktree: WorktreeInfo,
1115
- agent: string,
1116
- patchPath: string,
1117
- ): WorktreeDiff {
1118
- removeSyntheticPathsBeforeDiff(worktree);
1119
- runGitChecked(worktree.path, ["add", "-A"]);
1120
- const diffStat = runGitChecked(worktree.path, ["diff", "--cached", ...MACHINE_DIFF_OPTIONS, "--stat", setup.baseCommit]).trim();
1121
- const patch = runGitChecked(worktree.path, ["diff", "--cached", ...MACHINE_PATCH_OPTIONS, setup.baseCommit]);
1122
- const numstat = runGitChecked(worktree.path, ["diff", "--cached", ...MACHINE_DIFF_OPTIONS, "--numstat", setup.baseCommit]);
1123
- fs.writeFileSync(patchPath, patch, "utf-8");
1124
-
1125
- if (!patch.trim()) {
1126
- return emptyDiff(worktree.index, agent, worktree.branch, patchPath);
1127
- }
1128
-
1129
- const validationError = validateWorktreePatch(worktree.path, patchPath);
1130
- if (validationError) throw new Error(`captured worktree patch is not machine-applyable: ${validationError}`);
1131
-
1132
- const parsed = parseNumstat(numstat);
1133
- return {
1134
- index: worktree.index,
1135
- agent,
1136
- branch: worktree.branch,
1137
- diffStat,
1138
- filesChanged: parsed.filesChanged,
1139
- insertions: parsed.insertions,
1140
- deletions: parsed.deletions,
1141
- patchPath,
1142
- };
1143
- }
1144
-
1145
- function writeEmptyPatch(patchPath: string): void {
1146
- try {
1147
- fs.writeFileSync(patchPath, "", "utf-8");
1148
- } catch {
1149
- // Diff artifact writing is best-effort in error paths.
1150
- }
1151
- }
1152
-
1153
- function handoffRecordsPatch(manifestPath: string | undefined, patchPath: string): boolean {
1154
- if (!manifestPath || !fs.existsSync(manifestPath)) return false;
1155
- try {
1156
- const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8")) as {
1157
- version?: unknown;
1158
- groups?: Array<{ children?: Array<{ patch?: { path?: unknown; error?: unknown } }> }>;
1159
- };
1160
- if (manifest.version !== 1 || !Array.isArray(manifest.groups)) return false;
1161
- const resolvedPatchPath = path.resolve(patchPath);
1162
- return manifest.groups.some((group) => Array.isArray(group.children) && group.children.some((child) =>
1163
- child.patch?.error === undefined
1164
- && typeof child.patch?.path === "string"
1165
- && path.resolve(child.patch.path) === resolvedPatchPath,
1166
- ));
1167
- } catch {
1168
- return false;
1169
- }
1170
- }
1171
-
1172
- function cleanupSingleWorktree(
1173
- setup: WorktreeSetup,
1174
- worktree: WorktreeInfo,
1175
- intent: WorktreeCleanupIntent,
1176
- ): WorktreeCleanupTask {
1177
- const errors: string[] = [];
1178
- let worktreeRemoved = false;
1179
- let branchRemoved = false;
1180
- if (intent.kind === "preserve" && intent.cleanupBlocker) {
1181
- return {
1182
- index: worktree.index,
1183
- path: worktree.path,
1184
- branch: worktree.branch,
1185
- ...(worktree.provider ? { provider: worktree.provider } : {}),
1186
- ...(worktree.naming ? { naming: worktree.naming } : {}),
1187
- worktreeRemoved: false,
1188
- branchRemoved: false,
1189
- preserved: true,
1190
- reason: intent.cleanupBlocker,
1191
- };
1192
- }
1193
- if (intent.kind !== "setup-rollback") {
1194
- try {
1195
- removeSyntheticPathsBeforeDiff(worktree);
1196
- } catch (error) {
1197
- errors.push(`synthetic path cleanup failed: ${error instanceof Error ? error.message : String(error)}`);
1198
- }
1199
- const status = runGit(worktree.path, ["status", "--porcelain"]);
1200
- const baseDiff = runGit(worktree.path, ["diff", "--quiet", ...MACHINE_DIFF_OPTIONS, setup.baseCommit, "--"]);
1201
- if (status.status !== 0 || (baseDiff.status !== 0 && baseDiff.status !== 1)) {
1202
- const reason = status.status !== 0
1203
- ? status.stderr.trim() || status.stdout.trim() || "git status failed"
1204
- : baseDiff.stderr.trim() || baseDiff.stdout.trim() || "git diff check failed";
1205
- return {
1206
- index: worktree.index,
1207
- path: worktree.path,
1208
- branch: worktree.branch,
1209
- ...(worktree.provider ? { provider: worktree.provider } : {}),
1210
- ...(worktree.naming ? { naming: worktree.naming } : {}),
1211
- worktreeRemoved: false,
1212
- branchRemoved: false,
1213
- preserved: true,
1214
- reason: "cleanup safety check failed",
1215
- errors: [...errors, `cleanup refused: ${reason}`],
1216
- };
1217
- }
1218
- const hasWork = status.stdout.trim().length > 0 || baseDiff.status === 1;
1219
- if (hasWork && intent.kind === "preserve") {
1220
- const captured = (intent.capturedDiffs ?? setup.capturedDiffs)?.find((diff) => diff.index === worktree.index);
1221
- let patchValidationError: string | undefined;
1222
- let patchCaptured = false;
1223
- if (captured !== undefined
1224
- && captured.error === undefined
1225
- && fs.existsSync(captured.patchPath)
1226
- && handoffRecordsPatch(intent.handoffManifestPath, captured.patchPath)) {
1227
- try {
1228
- if (fs.statSync(captured.patchPath).size > 0) {
1229
- patchValidationError = validateWorktreePatchRepresentsCurrentWorktree(worktree.path, setup.baseCommit, captured.patchPath);
1230
- patchCaptured = patchValidationError === undefined;
1231
- }
1232
- } catch (error) {
1233
- patchValidationError = error instanceof Error ? error.message : String(error);
1234
- }
1235
- }
1236
- if (!patchCaptured) {
1237
- const reason = patchValidationError
1238
- ? `captured handoff patch failed validation: ${patchValidationError}`
1239
- : "worktree contains changes that are not represented by a captured handoff patch";
1240
- return {
1241
- index: worktree.index,
1242
- path: worktree.path,
1243
- branch: worktree.branch,
1244
- ...(worktree.provider ? { provider: worktree.provider } : {}),
1245
- ...(worktree.naming ? { naming: worktree.naming } : {}),
1246
- worktreeRemoved: false,
1247
- branchRemoved: false,
1248
- preserved: true,
1249
- reason,
1250
- errors: [...errors, `cleanup refused: ${reason}; preserved ${worktree.path}`],
1251
- };
1252
- }
1253
- }
1254
- if (hasWork && intent.kind === "discard") {
1255
- const decision = resolveAuthorityDecision({ action: "discardWorktree", policy: intent.authorization.policy });
1256
- const authorized = decision === "auto" || (decision === "confirm" && intent.authorization.kind === "confirmed");
1257
- if (!authorized) {
1258
- const reason = decision === "forbid"
1259
- ? "authority policy forbids worktree discard"
1260
- : "worktree discard requires explicit user confirmation";
1261
- return {
1262
- index: worktree.index,
1263
- path: worktree.path,
1264
- branch: worktree.branch,
1265
- ...(worktree.provider ? { provider: worktree.provider } : {}),
1266
- ...(worktree.naming ? { naming: worktree.naming } : {}),
1267
- worktreeRemoved: false,
1268
- branchRemoved: false,
1269
- preserved: true,
1270
- reason,
1271
- errors: [...errors, `cleanup refused: ${reason}; preserved ${worktree.path}`],
1272
- };
1273
- }
1274
- }
1275
- }
1276
- try {
1277
- runGitChecked(setup.cwd, ["worktree", "remove", "--force", worktree.path]);
1278
- worktreeRemoved = true;
1279
- } catch (error) {
1280
- errors.push(`worktree removal failed: ${error instanceof Error ? error.message : String(error)}`);
1281
- }
1282
- if (worktreeRemoved) {
1283
- try {
1284
- runGitChecked(setup.cwd, ["branch", "-D", worktree.branch]);
1285
- branchRemoved = true;
1286
- } catch (error) {
1287
- errors.push(`branch removal failed: ${error instanceof Error ? error.message : String(error)}`);
1288
- }
1289
- }
1290
- return {
1291
- index: worktree.index,
1292
- path: worktree.path,
1293
- branch: worktree.branch,
1294
- ...(worktree.provider ? { provider: worktree.provider } : {}),
1295
- ...(worktree.naming ? { naming: worktree.naming } : {}),
1296
- worktreeRemoved,
1297
- branchRemoved,
1298
- ...(errors.length ? { errors } : {}),
1299
- };
1300
- }
1301
-
1302
- function hasWorktreeChanges(diff: WorktreeDiff): boolean {
1303
- return diff.filesChanged > 0 || diff.insertions > 0 || diff.deletions > 0 || diff.diffStat.trim().length > 0;
1304
- }
1305
-
1306
- async function compensateSetup(tx: SetupTransaction): Promise<WorktreeCleanupReport> {
1307
- const { setup, attempts } = tx.progress;
1308
- const report: WorktreeCleanupReport = { state: "partial", tasks: [], pruned: false, errors: [] };
1309
- tx.progress.cleanup = report;
1310
- tx.progress.phase = "rollback";
1311
- // Cancellation stops allocation, not accounting. Compensation has ONLY the
1312
- // remaining original absolute deadline; it does not reuse the launch signal.
1313
- const git = async (args: string[], acceptedExitCodes: readonly number[] = [0]) => {
1314
- if (setupPoison) throw new Error(setupPoison);
1315
- tx.progress.command = { command: "git", args: ["-C", setup.cwd, ...args] };
1316
- const result = await runSetupCommand("git", tx.progress.command.args, {
1317
- deadlineAt: tx.options.deadlineAt, acceptedExitCodes,
1318
- onSpawn: (process) => { Object.assign(tx.progress.command!, process); tx.publish(); },
1319
- });
1320
- const { stdout: _stdout, stdoutBuffer: _stdoutBuffer, stderr: _stderr, ...metadata } = result;
1321
- tx.progress.command.result = metadata;
1322
- if (result.processTree?.state === "unknown") tx.unknown(result.error ?? "Rollback command settlement unverified");
1323
- tx.publish();
1324
- if (result.error || result.status === null || !acceptedExitCodes.includes(result.status)) throw result.error ?? new Error(result.stderr.trim() || "Rollback command failed");
1325
- return result;
1326
- };
1327
- for (const attempt of [...attempts].reverse()) {
1328
- if (!attempt.path) {
1329
- tx.unknown(`Allocation path unconfirmed for branch ${attempt.branch}`);
1330
- report.errors!.push(tx.progress.unknown!);
1331
- continue;
1332
- }
1333
- const known = setup.worktrees.find((worktree) => worktree.index === attempt.index);
1334
- const task: WorktreeCleanupTask = { index: attempt.index, path: attempt.path, branch: attempt.branch,
1335
- provider: known?.provider ?? "native", naming: known?.naming, worktreeRemoved: false, branchRemoved: false };
1336
- report.tasks.push(task);
1337
- try {
1338
- if (normalizeComparableCwd(attempt.path) === normalizeComparableCwd(setup.cwd)) throw new Error("Refusing source-checkout removal");
1339
- if (attempt.validated) {
1340
- await git(["worktree", "remove", "--force", attempt.path]);
1341
- task.worktreeRemoved = true;
1342
- } else {
1343
- // Native attempts were absent before mutation. Reconcile only exact
1344
- // registered path/branch identity; never recursively delete a guessed leaf.
1345
- const listed = (await git(["worktree", "list", "--porcelain"])).stdout;
1346
- const entry = listed.split("\n\n").find((block) => block.split("\n").includes(`worktree ${attempt.path}`));
1347
- if (entry) {
1348
- if (!entry.split("\n").includes(`branch refs/heads/${attempt.branch}`)) {
1349
- tx.unknown("Partial allocation ownership mismatch");
1350
- throw new Error(tx.progress.unknown);
1351
- }
1352
- await git(["worktree", "remove", "--force", attempt.path]);
1353
- } else if (fs.existsSync(attempt.path)) {
1354
- tx.unknown("Unregistered partial allocation retained");
1355
- throw new Error(tx.progress.unknown);
1356
- }
1357
- task.worktreeRemoved = true;
1358
- }
1359
- const branch = await git(["show-ref", "--verify", "--quiet", `refs/heads/${attempt.branch}`], [0, 1]);
1360
- if (branch.status === 0) await git(["branch", "-D", attempt.branch]);
1361
- task.branchRemoved = true;
1362
- } catch (error) {
1363
- task.preserved = true;
1364
- task.errors = [error instanceof Error ? error.message : String(error)];
1365
- }
1366
- }
1367
- try {
1368
- if (attempts.length > 0) { await git(["worktree", "prune"]); report.pruned = true; }
1369
- } catch (error) { report.errors!.push(error instanceof Error ? error.message : String(error)); }
1370
- if (tx.progress.unknown) report.errors!.push(tx.progress.unknown);
1371
- report.tasks.sort((a, b) => a.index - b.index);
1372
- if (!setupPoison && (report.pruned || attempts.length === 0) && report.tasks.every((task) => task.worktreeRemoved && task.branchRemoved) && !report.errors!.length) report.state = "complete";
1373
- return report;
1374
- }
1375
-
1376
- async function allocateWorktrees(tx: SetupTransaction, cwd: string, runId: string, count: number): Promise<WorktreeSetup> {
1377
- const options = tx.options;
1378
- tx.check();
1379
- if (!Number.isSafeInteger(count) || count < 0) throw new Error("worktree count must be a non-negative integer");
1380
- const repo = await resolveRepoState(tx, cwd, options?.baseRef);
1381
- tx.progress.setup.cwd = repo.toplevel;
1382
- tx.progress.setup.baseCommit = repo.baseCommit;
1383
- const setupHook = resolveWorktreeSetupHook(repo.toplevel, options?.setupHook);
1384
- const provider = await resolveSetupProvider(tx, options?.provider, options?.baseDir, repo.toplevel);
1385
- const branchPrefix = normalizeWorktreeBranchPrefix(options?.branchPrefix);
1386
- const dedicatedRoot = provider === "native"
1387
- ? resolveWorktreeDedicatedRoot(options?.baseDir, repo.toplevel, (options?.provider ?? DEFAULT_WORKTREE_PROVIDER) === "auto")
1388
- : undefined;
1389
- const worktrees = tx.progress.setup.worktrees;
1390
-
1391
- try {
1392
- if (provider === "native") {
1393
- for (let index = 0; index < count; index++) {
1394
- worktrees[index] = await createNativeWorktree(
1395
- tx,
1396
- repo.toplevel,
1397
- repo.cwdRelative,
1398
- runId,
1399
- index,
1400
- repo.baseCommit,
1401
- setupHook,
1402
- options?.agents?.[index],
1403
- dedicatedRoot!,
1404
- options?.labels,
1405
- options?.tasks,
1406
- branchPrefix,
1407
- );
1408
- }
1409
- } else {
1410
- for (let index = 0; index < count; index++) {
1411
- await createWorktrunkWorktree(
1412
- tx,
1413
- repo.toplevel,
1414
- repo.cwdRelative,
1415
- runId,
1416
- index,
1417
- repo.baseCommit,
1418
- options?.agents,
1419
- options?.labels,
1420
- options?.tasks,
1421
- branchPrefix,
1422
- );
1423
- }
1424
- for (let index = 0; index < worktrees.length; index++) {
1425
- worktrees[index] = await finalizeCreatedWorktree(
1426
- tx,
1427
- repo.toplevel,
1428
- repo.cwdRelative,
1429
- runId,
1430
- repo.baseCommit,
1431
- setupHook,
1432
- options?.agents?.[index],
1433
- worktrees[index]!,
1434
- );
1435
- }
1436
- }
1437
- tx.check();
1438
- tx.progress.phase = "ready";
1439
- tx.publish();
1440
- tx.check();
1441
- return tx.progress.setup;
1442
- } catch (error) {
1443
- await compensateSetup(tx);
1444
- throw error;
1445
- }
1446
- }
1447
-
1448
- export async function createWorktrees(cwd: string, runId: string, count: number, options: CreateWorktreesOptions = {}): Promise<WorktreeSetup> {
1449
- const tx = new SetupTransaction(cwd, options);
1450
- try {
1451
- return await withWorktreeTransaction(async () => {
1452
- setupActive = true;
1453
- try { return await allocateWorktrees(tx, cwd, runId, count); }
1454
- finally { setupActive = false; }
1455
- });
1456
- } catch (error) {
1457
- if (setupPoison) tx.progress.unknown ??= setupPoison;
1458
- tx.progress.cleanup ??= { state: tx.progress.unknown ? "partial" : "complete", tasks: [], pruned: false, errors: tx.progress.unknown ? [tx.progress.unknown] : [] };
1459
- try { tx.publish(); } catch (publicationError) {
1460
- tx.progress.cleanup?.errors?.push(`Recovery publication failed: ${String(publicationError)}`);
1461
- }
1462
- throw new WorktreeSetupError(error, tx.snapshot());
1463
- }
1464
- }
1465
-
1466
- export function diffWorktrees(setup: WorktreeSetup, agents: string[], diffsDir: string): WorktreeDiff[] {
1467
- assertWorktreeMutationAllowed();
1468
- try {
1469
- fs.mkdirSync(diffsDir, { recursive: true });
1470
- } catch {
1471
- // Returning no diffs is safer than failing the whole command on artifact-dir issues.
1472
- return [];
1473
- }
1474
-
1475
- const diffs: WorktreeDiff[] = [];
1476
- for (let index = 0; index < setup.worktrees.length; index++) {
1477
- const worktree = setup.worktrees[index]!;
1478
- const agent = agents[index] ?? `task-${index + 1}`;
1479
- const patchPath = path.join(diffsDir, `task-${index}-${safePatchAgentName(agent)}.patch`);
1480
- try {
1481
- diffs.push(captureWorktreeDiff(setup, worktree, agent, patchPath));
1482
- } catch (error) {
1483
- // Preserve execution flow while retaining the failed capture as handoff evidence.
1484
- writeEmptyPatch(patchPath);
1485
- diffs.push(emptyDiff(index, agent, worktree.branch, patchPath, error instanceof Error ? error.message : String(error)));
1486
- }
1487
- }
1488
-
1489
- setup.capturedDiffs = diffs;
1490
- return diffs;
1491
- }
1492
-
1493
- export function cleanupWorktrees(
1494
- setup: WorktreeSetup,
1495
- intent: WorktreeCleanupIntent = { kind: "preserve", ...(setup.capturedDiffs ? { capturedDiffs: setup.capturedDiffs } : {}) },
1496
- ): WorktreeCleanupReport {
1497
- assertWorktreeMutationAllowed();
1498
- const tasks: WorktreeCleanupTask[] = [];
1499
- for (let index = setup.worktrees.length - 1; index >= 0; index--) {
1500
- tasks.push(cleanupSingleWorktree(setup, setup.worktrees[index]!, intent));
1501
- }
1502
- tasks.sort((left, right) => left.index - right.index);
1503
- const errors: string[] = [];
1504
- let pruned = false;
1505
- try {
1506
- runGitChecked(setup.cwd, ["worktree", "prune"]);
1507
- pruned = true;
1508
- } catch (error) {
1509
- errors.push(`worktree prune failed: ${error instanceof Error ? error.message : String(error)}`);
1510
- }
1511
- const state = tasks.every((task) => task.worktreeRemoved && task.branchRemoved) && pruned ? "complete" : "partial";
1512
- return {
1513
- state,
1514
- tasks,
1515
- pruned,
1516
- ...(errors.length ? { errors } : {}),
1517
- };
1518
- }
1519
-
1520
- export function formatWorktreeDiffSummary(diffs: WorktreeDiff[]): string {
1521
- const changed = diffs.filter(hasWorktreeChanges);
1522
- if (changed.length === 0) return "";
1523
-
1524
- const lines: string[] = ["=== Worktree Changes ===", ""];
1525
- for (const diff of changed) {
1526
- lines.push(
1527
- `--- Task ${diff.index + 1} (${diff.agent}): ${diff.filesChanged} files changed, +${diff.insertions} -${diff.deletions} ---`,
1528
- );
1529
- if (diff.diffStat.trim().length > 0) {
1530
- lines.push(diff.diffStat);
1531
- }
1532
- lines.push("");
1533
- }
1534
-
1535
- const patchesDir = path.dirname(changed[0]!.patchPath);
1536
- lines.push(`Full patches: ${patchesDir}`);
1537
- return lines.join("\n").trimEnd();
1538
- }