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