pi-subagents 0.69.0 → 0.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1443) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +1 -1
  3. package/agents/claude-code-writer.md +1 -0
  4. package/agents/codex-exec-writer.md +1 -0
  5. package/agents/cursor-agent-writer.md +1 -0
  6. package/agents/reviewer.md +3 -2
  7. package/agents/worker.md +1 -0
  8. package/docs/agents.md +12 -9
  9. package/docs/configuration.md +3 -1
  10. package/docs/extension-api.md +3 -1
  11. package/docs/models.md +4 -2
  12. package/docs/observability.md +7 -1
  13. package/docs/standalone-background.md +4 -4
  14. package/docs/tool-reference.md +3 -7
  15. package/docs/watchdog.md +2 -0
  16. package/docs/workflows.md +6 -2
  17. package/index.d.ts +3 -0
  18. package/index.d.ts.map +1 -0
  19. package/index.js +10 -0
  20. package/index.js.map +1 -0
  21. package/inspector-runner.mjs +1 -1
  22. package/package.json +89 -73
  23. package/runner-peer-loader.mjs +4 -7
  24. package/runner-peer-preload.mjs +5 -7
  25. package/skills/pi-subagents/SKILL.md +1 -0
  26. package/skills/pi-subagents/references/management-authoring-rpc.md +1 -1
  27. package/skills/pi-subagents/references/multi-lane-orchestration.md +8 -0
  28. package/skills/pi-subagents/references/prompting-and-roles.md +16 -15
  29. package/src/agents/advertised-agent-prompt.d.ts +8 -0
  30. package/src/agents/advertised-agent-prompt.d.ts.map +1 -0
  31. package/src/agents/advertised-agent-prompt.js +77 -0
  32. package/src/agents/advertised-agent-prompt.js.map +1 -0
  33. package/src/agents/agent-management.d.ts +27 -0
  34. package/src/agents/agent-management.d.ts.map +1 -0
  35. package/src/agents/agent-management.js +1514 -0
  36. package/src/agents/agent-management.js.map +1 -0
  37. package/src/agents/agent-memory.d.ts +49 -0
  38. package/src/agents/agent-memory.d.ts.map +1 -0
  39. package/src/agents/agent-memory.js +349 -0
  40. package/src/agents/agent-memory.js.map +1 -0
  41. package/src/agents/agent-refinements.d.ts +100 -0
  42. package/src/agents/agent-refinements.d.ts.map +1 -0
  43. package/src/agents/agent-refinements.js +569 -0
  44. package/src/agents/agent-refinements.js.map +1 -0
  45. package/src/agents/agent-scope.d.ts +3 -0
  46. package/src/agents/agent-scope.d.ts.map +1 -0
  47. package/src/agents/agent-scope.js +6 -0
  48. package/src/agents/agent-scope.js.map +1 -0
  49. package/src/agents/agent-selection.d.ts +3 -0
  50. package/src/agents/agent-selection.d.ts.map +1 -0
  51. package/src/agents/agent-selection.js +23 -0
  52. package/src/agents/agent-selection.js.map +1 -0
  53. package/src/agents/agent-serializer.d.ts +8 -0
  54. package/src/agents/agent-serializer.d.ts.map +1 -0
  55. package/src/agents/agent-serializer.js +196 -0
  56. package/src/agents/agent-serializer.js.map +1 -0
  57. package/src/agents/agents.d.ts +326 -0
  58. package/src/agents/agents.d.ts.map +1 -0
  59. package/src/agents/agents.js +2639 -0
  60. package/src/agents/agents.js.map +1 -0
  61. package/src/agents/builtin-names.d.ts +2 -0
  62. package/src/agents/builtin-names.d.ts.map +1 -0
  63. package/src/agents/builtin-names.js +17 -0
  64. package/src/agents/builtin-names.js.map +1 -0
  65. package/src/agents/chain-serializer.d.ts +7 -0
  66. package/src/agents/chain-serializer.d.ts.map +1 -0
  67. package/src/agents/chain-serializer.js +319 -0
  68. package/src/agents/chain-serializer.js.map +1 -0
  69. package/src/agents/frontmatter.d.ts +16 -0
  70. package/src/agents/frontmatter.d.ts.map +1 -0
  71. package/src/agents/frontmatter.js +142 -0
  72. package/src/agents/frontmatter.js.map +1 -0
  73. package/src/agents/identity.d.ts +8 -0
  74. package/src/agents/identity.d.ts.map +1 -0
  75. package/src/agents/identity.js +30 -0
  76. package/src/agents/identity.js.map +1 -0
  77. package/src/agents/proactive-skills.d.ts +35 -0
  78. package/src/agents/proactive-skills.d.ts.map +1 -0
  79. package/src/agents/proactive-skills.js +154 -0
  80. package/src/agents/proactive-skills.js.map +1 -0
  81. package/src/agents/runtime-agent-events.d.ts +27 -0
  82. package/src/agents/runtime-agent-events.d.ts.map +1 -0
  83. package/src/agents/runtime-agent-events.js +53 -0
  84. package/src/agents/runtime-agent-events.js.map +1 -0
  85. package/src/agents/runtime-agent-registry.d.ts +64 -0
  86. package/src/agents/runtime-agent-registry.d.ts.map +1 -0
  87. package/src/agents/runtime-agent-registry.js +395 -0
  88. package/src/agents/runtime-agent-registry.js.map +1 -0
  89. package/src/agents/skills.d.ts +33 -0
  90. package/src/agents/skills.d.ts.map +1 -0
  91. package/src/agents/skills.js +685 -0
  92. package/src/agents/skills.js.map +1 -0
  93. package/src/api/agents.d.ts +5 -0
  94. package/src/api/agents.d.ts.map +1 -0
  95. package/src/api/agents.js +3 -0
  96. package/src/api/agents.js.map +1 -0
  97. package/src/api/background-work.d.ts +39 -0
  98. package/src/api/background-work.d.ts.map +1 -0
  99. package/src/api/background-work.js +165 -0
  100. package/src/api/background-work.js.map +1 -0
  101. package/src/api/capability-ceiling.d.ts +2 -0
  102. package/src/api/capability-ceiling.d.ts.map +1 -0
  103. package/src/api/capability-ceiling.js +2 -0
  104. package/src/api/capability-ceiling.js.map +1 -0
  105. package/src/api/child-tool-plan.d.ts +2 -0
  106. package/src/api/child-tool-plan.d.ts.map +1 -0
  107. package/src/api/child-tool-plan.js +2 -0
  108. package/src/api/child-tool-plan.js.map +1 -0
  109. package/src/api/control-channel.d.ts +2 -0
  110. package/src/api/control-channel.d.ts.map +1 -0
  111. package/src/api/control-channel.js +2 -0
  112. package/src/api/control-channel.js.map +1 -0
  113. package/src/api/delegation.d.ts +99 -0
  114. package/src/api/delegation.d.ts.map +1 -0
  115. package/src/api/delegation.js +9 -0
  116. package/src/api/delegation.js.map +1 -0
  117. package/src/api/external-job-provider.d.ts +58 -0
  118. package/src/api/external-job-provider.d.ts.map +1 -0
  119. package/src/api/external-job-provider.js +140 -0
  120. package/src/api/external-job-provider.js.map +1 -0
  121. package/src/api/external-runs.d.ts +48 -0
  122. package/src/api/external-runs.d.ts.map +1 -0
  123. package/src/api/external-runs.js +245 -0
  124. package/src/api/external-runs.js.map +1 -0
  125. package/src/api/intercom-bridge.d.ts +2 -0
  126. package/src/api/intercom-bridge.d.ts.map +1 -0
  127. package/src/api/intercom-bridge.js +2 -0
  128. package/src/api/intercom-bridge.js.map +1 -0
  129. package/src/api/preflight.d.ts +173 -0
  130. package/src/api/preflight.d.ts.map +1 -0
  131. package/src/api/preflight.js +362 -0
  132. package/src/api/preflight.js.map +1 -0
  133. package/src/api/project-panes.d.ts +8 -0
  134. package/src/api/project-panes.d.ts.map +1 -0
  135. package/src/api/project-panes.js +8 -0
  136. package/src/api/project-panes.js.map +1 -0
  137. package/src/api/required-child-extensions.d.ts +2 -0
  138. package/src/api/required-child-extensions.d.ts.map +1 -0
  139. package/src/api/required-child-extensions.js +2 -0
  140. package/src/api/required-child-extensions.js.map +1 -0
  141. package/src/api/shared-types.d.ts +2 -0
  142. package/src/api/shared-types.d.ts.map +1 -0
  143. package/src/api/shared-types.js +2 -0
  144. package/src/api/shared-types.js.map +1 -0
  145. package/src/api/workflow-resources.d.ts +3 -0
  146. package/src/api/workflow-resources.d.ts.map +1 -0
  147. package/src/api/workflow-resources.js +2 -0
  148. package/src/api/workflow-resources.js.map +1 -0
  149. package/src/extension/config.d.ts +8 -0
  150. package/src/extension/config.d.ts.map +1 -0
  151. package/src/extension/config.js +245 -0
  152. package/src/extension/config.js.map +1 -0
  153. package/src/extension/control-notices.d.ts +19 -0
  154. package/src/extension/control-notices.d.ts.map +1 -0
  155. package/src/extension/control-notices.js +34 -0
  156. package/src/extension/control-notices.js.map +1 -0
  157. package/src/extension/doctor.d.ts +33 -0
  158. package/src/extension/doctor.d.ts.map +1 -0
  159. package/src/extension/doctor.js +231 -0
  160. package/src/extension/doctor.js.map +1 -0
  161. package/src/extension/fanout-child.d.ts +7 -0
  162. package/src/extension/fanout-child.d.ts.map +1 -0
  163. package/src/extension/fanout-child.js +261 -0
  164. package/src/extension/fanout-child.js.map +1 -0
  165. package/src/extension/herdr-pi-bridge.d.ts +17 -0
  166. package/src/extension/herdr-pi-bridge.d.ts.map +1 -0
  167. package/src/extension/herdr-pi-bridge.js +243 -0
  168. package/src/extension/herdr-pi-bridge.js.map +1 -0
  169. package/src/extension/index.d.ts +20 -0
  170. package/src/extension/index.d.ts.map +1 -0
  171. package/src/extension/index.js +1108 -0
  172. package/src/extension/index.js.map +1 -0
  173. package/src/extension/public-execution.d.ts +62 -0
  174. package/src/extension/public-execution.d.ts.map +1 -0
  175. package/src/extension/public-execution.js +174 -0
  176. package/src/extension/public-execution.js.map +1 -0
  177. package/src/extension/rpc.d.ts +83 -0
  178. package/src/extension/rpc.d.ts.map +1 -0
  179. package/src/extension/rpc.js +687 -0
  180. package/src/extension/rpc.js.map +1 -0
  181. package/src/extension/schemas.d.ts +252 -0
  182. package/src/extension/schemas.d.ts.map +1 -0
  183. package/src/extension/schemas.js +396 -0
  184. package/src/extension/schemas.js.map +1 -0
  185. package/src/extension/steering-notices.d.ts +15 -0
  186. package/src/extension/steering-notices.d.ts.map +1 -0
  187. package/src/extension/steering-notices.js +23 -0
  188. package/src/extension/steering-notices.js.map +1 -0
  189. package/src/extension/subagent-guide.d.ts +4 -0
  190. package/src/extension/subagent-guide.d.ts.map +1 -0
  191. package/src/extension/subagent-guide.js +35 -0
  192. package/src/extension/subagent-guide.js.map +1 -0
  193. package/src/extension/tool-description.d.ts +20 -0
  194. package/src/extension/tool-description.d.ts.map +1 -0
  195. package/src/extension/tool-description.js +160 -0
  196. package/src/extension/tool-description.js.map +1 -0
  197. package/src/extension/tool-result.d.ts +10 -0
  198. package/src/extension/tool-result.d.ts.map +1 -0
  199. package/src/extension/tool-result.js +17 -0
  200. package/src/extension/tool-result.js.map +1 -0
  201. package/src/inspectors/actions.d.ts +23 -0
  202. package/src/inspectors/actions.d.ts.map +1 -0
  203. package/src/inspectors/actions.js +155 -0
  204. package/src/inspectors/actions.js.map +1 -0
  205. package/src/inspectors/ghostty/actions.d.ts +12 -0
  206. package/src/inspectors/ghostty/actions.d.ts.map +1 -0
  207. package/src/inspectors/ghostty/actions.js +63 -0
  208. package/src/inspectors/ghostty/actions.js.map +1 -0
  209. package/src/inspectors/ghostty/plugin.d.ts +8 -0
  210. package/src/inspectors/ghostty/plugin.d.ts.map +1 -0
  211. package/src/inspectors/ghostty/plugin.js +24 -0
  212. package/src/inspectors/ghostty/plugin.js.map +1 -0
  213. package/src/inspectors/herdr/actions.d.ts +26 -0
  214. package/src/inspectors/herdr/actions.d.ts.map +1 -0
  215. package/src/inspectors/herdr/actions.js +134 -0
  216. package/src/inspectors/herdr/actions.js.map +1 -0
  217. package/src/inspectors/herdr/client.d.ts +42 -0
  218. package/src/inspectors/herdr/client.d.ts.map +1 -0
  219. package/src/inspectors/herdr/client.js +130 -0
  220. package/src/inspectors/herdr/client.js.map +1 -0
  221. package/src/inspectors/herdr/focus.d.ts +25 -0
  222. package/src/inspectors/herdr/focus.d.ts.map +1 -0
  223. package/src/inspectors/herdr/focus.js +50 -0
  224. package/src/inspectors/herdr/focus.js.map +1 -0
  225. package/src/inspectors/herdr/plugin.d.ts +7 -0
  226. package/src/inspectors/herdr/plugin.d.ts.map +1 -0
  227. package/src/inspectors/herdr/plugin.js +15 -0
  228. package/src/inspectors/herdr/plugin.js.map +1 -0
  229. package/src/inspectors/herdr/project-panes.d.ts +137 -0
  230. package/src/inspectors/herdr/project-panes.d.ts.map +1 -0
  231. package/src/inspectors/herdr/project-panes.js +608 -0
  232. package/src/inspectors/herdr/project-panes.js.map +1 -0
  233. package/src/inspectors/inspector-runner.d.ts +24 -0
  234. package/src/inspectors/inspector-runner.d.ts.map +1 -0
  235. package/src/inspectors/inspector-runner.js +162 -0
  236. package/src/inspectors/inspector-runner.js.map +1 -0
  237. package/src/inspectors/plugins.d.ts +4 -0
  238. package/src/inspectors/plugins.d.ts.map +1 -0
  239. package/src/inspectors/plugins.js +7 -0
  240. package/src/inspectors/plugins.js.map +1 -0
  241. package/src/inspectors/session-roots-codec.d.ts +16 -0
  242. package/src/inspectors/session-roots-codec.d.ts.map +1 -0
  243. package/src/inspectors/session-roots-codec.js +33 -0
  244. package/src/inspectors/session-roots-codec.js.map +1 -0
  245. package/src/inspectors/shell-command.d.ts +2 -0
  246. package/src/inspectors/shell-command.d.ts.map +1 -0
  247. package/src/inspectors/shell-command.js +17 -0
  248. package/src/inspectors/shell-command.js.map +1 -0
  249. package/src/inspectors/types.d.ts +49 -0
  250. package/src/inspectors/types.d.ts.map +1 -0
  251. package/src/inspectors/types.js +2 -0
  252. package/src/inspectors/types.js.map +1 -0
  253. package/src/integrations/herdr-status.d.ts +46 -0
  254. package/src/integrations/herdr-status.d.ts.map +1 -0
  255. package/src/integrations/herdr-status.js +371 -0
  256. package/src/integrations/herdr-status.js.map +1 -0
  257. package/src/integrations/pi-web-session-liveness.d.ts +20 -0
  258. package/src/integrations/pi-web-session-liveness.d.ts.map +1 -0
  259. package/src/integrations/pi-web-session-liveness.js +54 -0
  260. package/src/integrations/pi-web-session-liveness.js.map +1 -0
  261. package/src/intercom/intercom-bridge.d.ts +59 -0
  262. package/src/intercom/intercom-bridge.d.ts.map +1 -0
  263. package/src/intercom/intercom-bridge.js +192 -0
  264. package/src/intercom/intercom-bridge.js.map +1 -0
  265. package/src/intercom/native-supervisor-channel.d.ts +64 -0
  266. package/src/intercom/native-supervisor-channel.d.ts.map +1 -0
  267. package/src/intercom/native-supervisor-channel.js +894 -0
  268. package/src/intercom/native-supervisor-channel.js.map +1 -0
  269. package/src/intercom/result-intercom.d.ts +36 -0
  270. package/src/intercom/result-intercom.d.ts.map +1 -0
  271. package/src/intercom/result-intercom.js +372 -0
  272. package/src/intercom/result-intercom.js.map +1 -0
  273. package/src/intercom/supervisor-ui.d.ts +40 -0
  274. package/src/intercom/supervisor-ui.d.ts.map +1 -0
  275. package/src/intercom/supervisor-ui.js +202 -0
  276. package/src/intercom/supervisor-ui.js.map +1 -0
  277. package/src/missions/actions.d.ts +55 -0
  278. package/src/missions/actions.d.ts.map +1 -0
  279. package/src/missions/actions.js +396 -0
  280. package/src/missions/actions.js.map +1 -0
  281. package/src/missions/goal-driver.d.ts +16 -0
  282. package/src/missions/goal-driver.d.ts.map +1 -0
  283. package/src/missions/goal-driver.js +157 -0
  284. package/src/missions/goal-driver.js.map +1 -0
  285. package/src/missions/lifecycle.d.ts +40 -0
  286. package/src/missions/lifecycle.d.ts.map +1 -0
  287. package/src/missions/lifecycle.js +352 -0
  288. package/src/missions/lifecycle.js.map +1 -0
  289. package/src/missions/store.d.ts +22 -0
  290. package/src/missions/store.d.ts.map +1 -0
  291. package/src/missions/store.js +573 -0
  292. package/src/missions/store.js.map +1 -0
  293. package/src/missions/types.d.ts +168 -0
  294. package/src/missions/types.d.ts.map +1 -0
  295. package/src/missions/types.js +10 -0
  296. package/src/missions/types.js.map +1 -0
  297. package/src/missions/workflow-state.d.ts +15 -0
  298. package/src/missions/workflow-state.d.ts.map +1 -0
  299. package/src/missions/workflow-state.js +274 -0
  300. package/src/missions/workflow-state.js.map +1 -0
  301. package/src/policy/authority.d.ts +10 -0
  302. package/src/policy/authority.d.ts.map +1 -0
  303. package/src/policy/authority.js +42 -0
  304. package/src/policy/authority.js.map +1 -0
  305. package/src/profiles/profiles.d.ts +135 -0
  306. package/src/profiles/profiles.d.ts.map +1 -0
  307. package/src/profiles/profiles.js +520 -0
  308. package/src/profiles/profiles.js.map +1 -0
  309. package/src/runs/background/active-async-capacity.d.ts +100 -0
  310. package/src/runs/background/active-async-capacity.d.ts.map +1 -0
  311. package/src/runs/background/active-async-capacity.js +492 -0
  312. package/src/runs/background/active-async-capacity.js.map +1 -0
  313. package/src/runs/background/active-run-index.d.ts +13 -0
  314. package/src/runs/background/active-run-index.d.ts.map +1 -0
  315. package/src/runs/background/active-run-index.js +158 -0
  316. package/src/runs/background/active-run-index.js.map +1 -0
  317. package/src/runs/background/async-execution.d.ts +274 -0
  318. package/src/runs/background/async-execution.d.ts.map +1 -0
  319. package/src/runs/background/async-execution.js +1955 -0
  320. package/src/runs/background/async-execution.js.map +1 -0
  321. package/src/runs/background/async-job-tracker.d.ts +28 -0
  322. package/src/runs/background/async-job-tracker.d.ts.map +1 -0
  323. package/src/runs/background/async-job-tracker.js +876 -0
  324. package/src/runs/background/async-job-tracker.js.map +1 -0
  325. package/src/runs/background/async-resume.d.ts +59 -0
  326. package/src/runs/background/async-resume.d.ts.map +1 -0
  327. package/src/runs/background/async-resume.js +667 -0
  328. package/src/runs/background/async-resume.js.map +1 -0
  329. package/src/runs/background/async-retention.d.ts +45 -0
  330. package/src/runs/background/async-retention.d.ts.map +1 -0
  331. package/src/runs/background/async-retention.js +884 -0
  332. package/src/runs/background/async-retention.js.map +1 -0
  333. package/src/runs/background/async-status-snapshot.d.ts +10 -0
  334. package/src/runs/background/async-status-snapshot.d.ts.map +1 -0
  335. package/src/runs/background/async-status-snapshot.js +25 -0
  336. package/src/runs/background/async-status-snapshot.js.map +1 -0
  337. package/src/runs/background/async-status.d.ts +169 -0
  338. package/src/runs/background/async-status.d.ts.map +1 -0
  339. package/src/runs/background/async-status.js +673 -0
  340. package/src/runs/background/async-status.js.map +1 -0
  341. package/src/runs/background/auto-drain.d.ts +17 -0
  342. package/src/runs/background/auto-drain.d.ts.map +1 -0
  343. package/src/runs/background/auto-drain.js +73 -0
  344. package/src/runs/background/auto-drain.js.map +1 -0
  345. package/src/runs/background/binary-bootstrap.d.ts +9 -0
  346. package/src/runs/background/binary-bootstrap.d.ts.map +1 -0
  347. package/src/runs/background/binary-bootstrap.js +41 -0
  348. package/src/runs/background/binary-bootstrap.js.map +1 -0
  349. package/src/runs/background/chain-append.d.ts +35 -0
  350. package/src/runs/background/chain-append.d.ts.map +1 -0
  351. package/src/runs/background/chain-append.js +300 -0
  352. package/src/runs/background/chain-append.js.map +1 -0
  353. package/src/runs/background/chain-root-attachment.d.ts +49 -0
  354. package/src/runs/background/chain-root-attachment.d.ts.map +1 -0
  355. package/src/runs/background/chain-root-attachment.js +184 -0
  356. package/src/runs/background/chain-root-attachment.js.map +1 -0
  357. package/src/runs/background/completion-batcher.d.ts +52 -0
  358. package/src/runs/background/completion-batcher.d.ts.map +1 -0
  359. package/src/runs/background/completion-batcher.js +120 -0
  360. package/src/runs/background/completion-batcher.js.map +1 -0
  361. package/src/runs/background/completion-dedupe.d.ts +14 -0
  362. package/src/runs/background/completion-dedupe.d.ts.map +1 -0
  363. package/src/runs/background/completion-dedupe.js +49 -0
  364. package/src/runs/background/completion-dedupe.js.map +1 -0
  365. package/src/runs/background/completion-replay.d.ts +48 -0
  366. package/src/runs/background/completion-replay.d.ts.map +1 -0
  367. package/src/runs/background/completion-replay.js +267 -0
  368. package/src/runs/background/completion-replay.js.map +1 -0
  369. package/src/runs/background/control-channel.d.ts +156 -0
  370. package/src/runs/background/control-channel.d.ts.map +1 -0
  371. package/src/runs/background/control-channel.js +521 -0
  372. package/src/runs/background/control-channel.js.map +1 -0
  373. package/src/runs/background/fleet-view.d.ts +64 -0
  374. package/src/runs/background/fleet-view.d.ts.map +1 -0
  375. package/src/runs/background/fleet-view.js +648 -0
  376. package/src/runs/background/fleet-view.js.map +1 -0
  377. package/src/runs/background/index-segment.d.ts +16 -0
  378. package/src/runs/background/index-segment.d.ts.map +1 -0
  379. package/src/runs/background/index-segment.js +59 -0
  380. package/src/runs/background/index-segment.js.map +1 -0
  381. package/src/runs/background/inspect-rpc.d.ts +60 -0
  382. package/src/runs/background/inspect-rpc.d.ts.map +1 -0
  383. package/src/runs/background/inspect-rpc.js +406 -0
  384. package/src/runs/background/inspect-rpc.js.map +1 -0
  385. package/src/runs/background/notify.d.ts +162 -0
  386. package/src/runs/background/notify.d.ts.map +1 -0
  387. package/src/runs/background/notify.js +665 -0
  388. package/src/runs/background/notify.js.map +1 -0
  389. package/src/runs/background/owned-process-tree.d.ts +11 -0
  390. package/src/runs/background/owned-process-tree.d.ts.map +1 -0
  391. package/src/runs/background/owned-process-tree.js +117 -0
  392. package/src/runs/background/owned-process-tree.js.map +1 -0
  393. package/src/runs/background/parallel-groups.d.ts +4 -0
  394. package/src/runs/background/parallel-groups.d.ts.map +1 -0
  395. package/src/runs/background/parallel-groups.js +47 -0
  396. package/src/runs/background/parallel-groups.js.map +1 -0
  397. package/src/runs/background/process-terminal.d.ts +34 -0
  398. package/src/runs/background/process-terminal.d.ts.map +1 -0
  399. package/src/runs/background/process-terminal.js +305 -0
  400. package/src/runs/background/process-terminal.js.map +1 -0
  401. package/src/runs/background/result-delivery-ownership.d.ts +11 -0
  402. package/src/runs/background/result-delivery-ownership.d.ts.map +1 -0
  403. package/src/runs/background/result-delivery-ownership.js +37 -0
  404. package/src/runs/background/result-delivery-ownership.js.map +1 -0
  405. package/src/runs/background/result-files.d.ts +33 -0
  406. package/src/runs/background/result-files.d.ts.map +1 -0
  407. package/src/runs/background/result-files.js +528 -0
  408. package/src/runs/background/result-files.js.map +1 -0
  409. package/src/runs/background/result-watcher.d.ts +87 -0
  410. package/src/runs/background/result-watcher.d.ts.map +1 -0
  411. package/src/runs/background/result-watcher.js +764 -0
  412. package/src/runs/background/result-watcher.js.map +1 -0
  413. package/src/runs/background/resume-guidance.d.ts +5 -0
  414. package/src/runs/background/resume-guidance.d.ts.map +1 -0
  415. package/src/runs/background/resume-guidance.js +57 -0
  416. package/src/runs/background/resume-guidance.js.map +1 -0
  417. package/src/runs/background/retained-children.d.ts +25 -0
  418. package/src/runs/background/retained-children.d.ts.map +1 -0
  419. package/src/runs/background/retained-children.js +128 -0
  420. package/src/runs/background/retained-children.js.map +1 -0
  421. package/src/runs/background/retained-nested-route-tracker.d.ts +13 -0
  422. package/src/runs/background/retained-nested-route-tracker.d.ts.map +1 -0
  423. package/src/runs/background/retained-nested-route-tracker.js +91 -0
  424. package/src/runs/background/retained-nested-route-tracker.js.map +1 -0
  425. package/src/runs/background/run-child-session.d.ts +123 -0
  426. package/src/runs/background/run-child-session.d.ts.map +1 -0
  427. package/src/runs/background/run-child-session.js +602 -0
  428. package/src/runs/background/run-child-session.js.map +1 -0
  429. package/src/runs/background/run-id-query.d.ts +4 -0
  430. package/src/runs/background/run-id-query.d.ts.map +1 -0
  431. package/src/runs/background/run-id-query.js +7 -0
  432. package/src/runs/background/run-id-query.js.map +1 -0
  433. package/src/runs/background/run-id-resolver.d.ts +23 -0
  434. package/src/runs/background/run-id-resolver.d.ts.map +1 -0
  435. package/src/runs/background/run-id-resolver.js +170 -0
  436. package/src/runs/background/run-id-resolver.js.map +1 -0
  437. package/src/runs/background/run-status.d.ts +26 -0
  438. package/src/runs/background/run-status.d.ts.map +1 -0
  439. package/src/runs/background/run-status.js +828 -0
  440. package/src/runs/background/run-status.js.map +1 -0
  441. package/src/runs/background/runner-aliases.d.ts +17 -0
  442. package/src/runs/background/runner-aliases.d.ts.map +1 -0
  443. package/src/runs/background/runner-aliases.js +152 -0
  444. package/src/runs/background/runner-aliases.js.map +1 -0
  445. package/src/runs/background/runner-child-launch.d.ts +24 -0
  446. package/src/runs/background/runner-child-launch.d.ts.map +1 -0
  447. package/src/runs/background/runner-child-launch.js +68 -0
  448. package/src/runs/background/runner-child-launch.js.map +1 -0
  449. package/src/runs/background/runner-child-sessions.d.ts +7 -0
  450. package/src/runs/background/runner-child-sessions.d.ts.map +1 -0
  451. package/src/runs/background/runner-child-sessions.js +35 -0
  452. package/src/runs/background/runner-child-sessions.js.map +1 -0
  453. package/src/runs/background/runner-http-dispatcher.d.ts +43 -0
  454. package/src/runs/background/runner-http-dispatcher.d.ts.map +1 -0
  455. package/src/runs/background/runner-http-dispatcher.js +114 -0
  456. package/src/runs/background/runner-http-dispatcher.js.map +1 -0
  457. package/src/runs/background/scheduled-runs.d.ts +116 -0
  458. package/src/runs/background/scheduled-runs.d.ts.map +1 -0
  459. package/src/runs/background/scheduled-runs.js +1024 -0
  460. package/src/runs/background/scheduled-runs.js.map +1 -0
  461. package/src/runs/background/stale-run-reconciler.d.ts +37 -0
  462. package/src/runs/background/stale-run-reconciler.d.ts.map +1 -0
  463. package/src/runs/background/stale-run-reconciler.js +393 -0
  464. package/src/runs/background/stale-run-reconciler.js.map +1 -0
  465. package/src/runs/background/steering.d.ts +52 -0
  466. package/src/runs/background/steering.d.ts.map +1 -0
  467. package/src/runs/background/steering.js +247 -0
  468. package/src/runs/background/steering.js.map +1 -0
  469. package/src/runs/background/subagent-runner.d.ts +197 -0
  470. package/src/runs/background/subagent-runner.d.ts.map +1 -0
  471. package/src/runs/background/subagent-runner.js +5052 -0
  472. package/src/runs/background/subagent-runner.js.map +1 -0
  473. package/src/runs/background/subagent-wait.d.ts +122 -0
  474. package/src/runs/background/subagent-wait.d.ts.map +1 -0
  475. package/src/runs/background/subagent-wait.js +735 -0
  476. package/src/runs/background/subagent-wait.js.map +1 -0
  477. package/src/runs/background/terminal-run-index.d.ts +8 -0
  478. package/src/runs/background/terminal-run-index.d.ts.map +1 -0
  479. package/src/runs/background/terminal-run-index.js +123 -0
  480. package/src/runs/background/terminal-run-index.js.map +1 -0
  481. package/src/runs/background/top-level-async.d.ts +8 -0
  482. package/src/runs/background/top-level-async.d.ts.map +1 -0
  483. package/src/runs/background/top-level-async.js +6 -0
  484. package/src/runs/background/top-level-async.js.map +1 -0
  485. package/src/runs/background/wait-completions.d.ts +29 -0
  486. package/src/runs/background/wait-completions.d.ts.map +1 -0
  487. package/src/runs/background/wait-completions.js +264 -0
  488. package/src/runs/background/wait-completions.js.map +1 -0
  489. package/src/runs/background/wait-config.d.ts +9 -0
  490. package/src/runs/background/wait-config.d.ts.map +1 -0
  491. package/src/runs/background/wait-config.js +47 -0
  492. package/src/runs/background/wait-config.js.map +1 -0
  493. package/src/runs/background/wait-subscriptions.d.ts +27 -0
  494. package/src/runs/background/wait-subscriptions.d.ts.map +1 -0
  495. package/src/runs/background/wait-subscriptions.js +337 -0
  496. package/src/runs/background/wait-subscriptions.js.map +1 -0
  497. package/src/runs/background/wait-tool.d.ts +7 -0
  498. package/src/runs/background/wait-tool.d.ts.map +1 -0
  499. package/src/runs/background/wait-tool.js +36 -0
  500. package/src/runs/background/wait-tool.js.map +1 -0
  501. package/src/runs/foreground/async-dismiss-action.d.ts +7 -0
  502. package/src/runs/foreground/async-dismiss-action.d.ts.map +1 -0
  503. package/src/runs/foreground/async-dismiss-action.js +82 -0
  504. package/src/runs/foreground/async-dismiss-action.js.map +1 -0
  505. package/src/runs/foreground/async-steering-action.d.ts +32 -0
  506. package/src/runs/foreground/async-steering-action.d.ts.map +1 -0
  507. package/src/runs/foreground/async-steering-action.js +270 -0
  508. package/src/runs/foreground/async-steering-action.js.map +1 -0
  509. package/src/runs/foreground/async-stop-action.d.ts +7 -0
  510. package/src/runs/foreground/async-stop-action.d.ts.map +1 -0
  511. package/src/runs/foreground/async-stop-action.js +171 -0
  512. package/src/runs/foreground/async-stop-action.js.map +1 -0
  513. package/src/runs/foreground/execution.d.ts +11 -0
  514. package/src/runs/foreground/execution.d.ts.map +1 -0
  515. package/src/runs/foreground/execution.js +2089 -0
  516. package/src/runs/foreground/execution.js.map +1 -0
  517. package/src/runs/foreground/foreground-control.d.ts +25 -0
  518. package/src/runs/foreground/foreground-control.d.ts.map +1 -0
  519. package/src/runs/foreground/foreground-control.js +139 -0
  520. package/src/runs/foreground/foreground-control.js.map +1 -0
  521. package/src/runs/foreground/foreground-history.d.ts +12 -0
  522. package/src/runs/foreground/foreground-history.d.ts.map +1 -0
  523. package/src/runs/foreground/foreground-history.js +165 -0
  524. package/src/runs/foreground/foreground-history.js.map +1 -0
  525. package/src/runs/foreground/prompt-audit.d.ts +33 -0
  526. package/src/runs/foreground/prompt-audit.d.ts.map +1 -0
  527. package/src/runs/foreground/prompt-audit.js +143 -0
  528. package/src/runs/foreground/prompt-audit.js.map +1 -0
  529. package/src/runs/foreground/subagent-executor.d.ts +296 -0
  530. package/src/runs/foreground/subagent-executor.d.ts.map +1 -0
  531. package/src/runs/foreground/subagent-executor.js +7045 -0
  532. package/src/runs/foreground/subagent-executor.js.map +1 -0
  533. package/src/runs/foreground/workflow-detach-reconcile.d.ts +16 -0
  534. package/src/runs/foreground/workflow-detach-reconcile.d.ts.map +1 -0
  535. package/src/runs/foreground/workflow-detach-reconcile.js +284 -0
  536. package/src/runs/foreground/workflow-detach-reconcile.js.map +1 -0
  537. package/src/runs/foreground/workflow-foreground-steering.d.ts +44 -0
  538. package/src/runs/foreground/workflow-foreground-steering.d.ts.map +1 -0
  539. package/src/runs/foreground/workflow-foreground-steering.js +149 -0
  540. package/src/runs/foreground/workflow-foreground-steering.js.map +1 -0
  541. package/src/runs/shared/abort-recovery.d.ts +27 -0
  542. package/src/runs/shared/abort-recovery.d.ts.map +1 -0
  543. package/src/runs/shared/abort-recovery.js +109 -0
  544. package/src/runs/shared/abort-recovery.js.map +1 -0
  545. package/src/runs/shared/acceptance.d.ts +145 -0
  546. package/src/runs/shared/acceptance.d.ts.map +1 -0
  547. package/src/runs/shared/acceptance.js +1617 -0
  548. package/src/runs/shared/acceptance.js.map +1 -0
  549. package/src/runs/shared/agent-contract.d.ts +6 -0
  550. package/src/runs/shared/agent-contract.d.ts.map +1 -0
  551. package/src/runs/shared/agent-contract.js +36 -0
  552. package/src/runs/shared/agent-contract.js.map +1 -0
  553. package/src/runs/shared/async-status-projection.d.ts +94 -0
  554. package/src/runs/shared/async-status-projection.d.ts.map +1 -0
  555. package/src/runs/shared/async-status-projection.js +542 -0
  556. package/src/runs/shared/async-status-projection.js.map +1 -0
  557. package/src/runs/shared/background-process-options.d.ts +5 -0
  558. package/src/runs/shared/background-process-options.d.ts.map +1 -0
  559. package/src/runs/shared/background-process-options.js +7 -0
  560. package/src/runs/shared/background-process-options.js.map +1 -0
  561. package/src/runs/shared/capability-ceiling.d.ts +58 -0
  562. package/src/runs/shared/capability-ceiling.d.ts.map +1 -0
  563. package/src/runs/shared/capability-ceiling.js +179 -0
  564. package/src/runs/shared/capability-ceiling.js.map +1 -0
  565. package/src/runs/shared/chain-outputs.d.ts +19 -0
  566. package/src/runs/shared/chain-outputs.d.ts.map +1 -0
  567. package/src/runs/shared/chain-outputs.js +105 -0
  568. package/src/runs/shared/chain-outputs.js.map +1 -0
  569. package/src/runs/shared/child-hooks.d.ts +32 -0
  570. package/src/runs/shared/child-hooks.d.ts.map +1 -0
  571. package/src/runs/shared/child-hooks.js +173 -0
  572. package/src/runs/shared/child-hooks.js.map +1 -0
  573. package/src/runs/shared/child-identity.d.ts +24 -0
  574. package/src/runs/shared/child-identity.d.ts.map +1 -0
  575. package/src/runs/shared/child-identity.js +41 -0
  576. package/src/runs/shared/child-identity.js.map +1 -0
  577. package/src/runs/shared/child-launch-plan.d.ts +71 -0
  578. package/src/runs/shared/child-launch-plan.d.ts.map +1 -0
  579. package/src/runs/shared/child-launch-plan.js +89 -0
  580. package/src/runs/shared/child-launch-plan.js.map +1 -0
  581. package/src/runs/shared/child-launch.d.ts +112 -0
  582. package/src/runs/shared/child-launch.d.ts.map +1 -0
  583. package/src/runs/shared/child-launch.js +230 -0
  584. package/src/runs/shared/child-launch.js.map +1 -0
  585. package/src/runs/shared/child-lifecycle.d.ts +14 -0
  586. package/src/runs/shared/child-lifecycle.d.ts.map +1 -0
  587. package/src/runs/shared/child-lifecycle.js +23 -0
  588. package/src/runs/shared/child-lifecycle.js.map +1 -0
  589. package/src/runs/shared/child-runtime-config.d.ts +102 -0
  590. package/src/runs/shared/child-runtime-config.d.ts.map +1 -0
  591. package/src/runs/shared/child-runtime-config.js +39 -0
  592. package/src/runs/shared/child-runtime-config.js.map +1 -0
  593. package/src/runs/shared/child-session.d.ts +154 -0
  594. package/src/runs/shared/child-session.d.ts.map +1 -0
  595. package/src/runs/shared/child-session.js +412 -0
  596. package/src/runs/shared/child-session.js.map +1 -0
  597. package/src/runs/shared/child-tool-plan.d.ts +73 -0
  598. package/src/runs/shared/child-tool-plan.d.ts.map +1 -0
  599. package/src/runs/shared/child-tool-plan.js +380 -0
  600. package/src/runs/shared/child-tool-plan.js.map +1 -0
  601. package/src/runs/shared/claude-code-adapter.d.ts +25 -0
  602. package/src/runs/shared/claude-code-adapter.d.ts.map +1 -0
  603. package/src/runs/shared/claude-code-adapter.js +120 -0
  604. package/src/runs/shared/claude-code-adapter.js.map +1 -0
  605. package/src/runs/shared/codex-exec-adapter.d.ts +26 -0
  606. package/src/runs/shared/codex-exec-adapter.d.ts.map +1 -0
  607. package/src/runs/shared/codex-exec-adapter.js +128 -0
  608. package/src/runs/shared/codex-exec-adapter.js.map +1 -0
  609. package/src/runs/shared/context-mode.d.ts +13 -0
  610. package/src/runs/shared/context-mode.d.ts.map +1 -0
  611. package/src/runs/shared/context-mode.js +39 -0
  612. package/src/runs/shared/context-mode.js.map +1 -0
  613. package/src/runs/shared/cursor-agent-adapter.d.ts +27 -0
  614. package/src/runs/shared/cursor-agent-adapter.d.ts.map +1 -0
  615. package/src/runs/shared/cursor-agent-adapter.js +100 -0
  616. package/src/runs/shared/cursor-agent-adapter.js.map +1 -0
  617. package/src/runs/shared/dynamic-fanout.d.ts +50 -0
  618. package/src/runs/shared/dynamic-fanout.d.ts.map +1 -0
  619. package/src/runs/shared/dynamic-fanout.js +274 -0
  620. package/src/runs/shared/dynamic-fanout.js.map +1 -0
  621. package/src/runs/shared/effective-system-prompt.d.ts +18 -0
  622. package/src/runs/shared/effective-system-prompt.d.ts.map +1 -0
  623. package/src/runs/shared/effective-system-prompt.js +23 -0
  624. package/src/runs/shared/effective-system-prompt.js.map +1 -0
  625. package/src/runs/shared/extension-bindings.d.ts +17 -0
  626. package/src/runs/shared/extension-bindings.d.ts.map +1 -0
  627. package/src/runs/shared/extension-bindings.js +83 -0
  628. package/src/runs/shared/extension-bindings.js.map +1 -0
  629. package/src/runs/shared/external-cli-contract.d.ts +30 -0
  630. package/src/runs/shared/external-cli-contract.d.ts.map +1 -0
  631. package/src/runs/shared/external-cli-contract.js +146 -0
  632. package/src/runs/shared/external-cli-contract.js.map +1 -0
  633. package/src/runs/shared/external-cli-preflight.d.ts +32 -0
  634. package/src/runs/shared/external-cli-preflight.d.ts.map +1 -0
  635. package/src/runs/shared/external-cli-preflight.js +116 -0
  636. package/src/runs/shared/external-cli-preflight.js.map +1 -0
  637. package/src/runs/shared/external-cli-runner.d.ts +66 -0
  638. package/src/runs/shared/external-cli-runner.d.ts.map +1 -0
  639. package/src/runs/shared/external-cli-runner.js +421 -0
  640. package/src/runs/shared/external-cli-runner.js.map +1 -0
  641. package/src/runs/shared/external-job-bridge.d.ts +18 -0
  642. package/src/runs/shared/external-job-bridge.d.ts.map +1 -0
  643. package/src/runs/shared/external-job-bridge.js +424 -0
  644. package/src/runs/shared/external-job-bridge.js.map +1 -0
  645. package/src/runs/shared/external-job-runner.d.ts +45 -0
  646. package/src/runs/shared/external-job-runner.d.ts.map +1 -0
  647. package/src/runs/shared/external-job-runner.js +353 -0
  648. package/src/runs/shared/external-job-runner.js.map +1 -0
  649. package/src/runs/shared/fast-mode-extension.d.ts +4 -0
  650. package/src/runs/shared/fast-mode-extension.d.ts.map +1 -0
  651. package/src/runs/shared/fast-mode-extension.js +9 -0
  652. package/src/runs/shared/fast-mode-extension.js.map +1 -0
  653. package/src/runs/shared/herdr-connection.d.ts +71 -0
  654. package/src/runs/shared/herdr-connection.d.ts.map +1 -0
  655. package/src/runs/shared/herdr-connection.js +258 -0
  656. package/src/runs/shared/herdr-connection.js.map +1 -0
  657. package/src/runs/shared/herdr-external-adapters.d.ts +148 -0
  658. package/src/runs/shared/herdr-external-adapters.d.ts.map +1 -0
  659. package/src/runs/shared/herdr-external-adapters.js +405 -0
  660. package/src/runs/shared/herdr-external-adapters.js.map +1 -0
  661. package/src/runs/shared/herdr-machine.d.ts +48 -0
  662. package/src/runs/shared/herdr-machine.d.ts.map +1 -0
  663. package/src/runs/shared/herdr-machine.js +247 -0
  664. package/src/runs/shared/herdr-machine.js.map +1 -0
  665. package/src/runs/shared/herdr-pi-protocol.d.ts +22 -0
  666. package/src/runs/shared/herdr-pi-protocol.d.ts.map +1 -0
  667. package/src/runs/shared/herdr-pi-protocol.js +58 -0
  668. package/src/runs/shared/herdr-pi-protocol.js.map +1 -0
  669. package/src/runs/shared/herdr-placed-run.d.ts +267 -0
  670. package/src/runs/shared/herdr-placed-run.d.ts.map +1 -0
  671. package/src/runs/shared/herdr-placed-run.js +716 -0
  672. package/src/runs/shared/herdr-placed-run.js.map +1 -0
  673. package/src/runs/shared/host-step-status.d.ts +34 -0
  674. package/src/runs/shared/host-step-status.d.ts.map +1 -0
  675. package/src/runs/shared/host-step-status.js +245 -0
  676. package/src/runs/shared/host-step-status.js.map +1 -0
  677. package/src/runs/shared/lane-metadata.d.ts +24 -0
  678. package/src/runs/shared/lane-metadata.d.ts.map +1 -0
  679. package/src/runs/shared/lane-metadata.js +127 -0
  680. package/src/runs/shared/lane-metadata.js.map +1 -0
  681. package/src/runs/shared/launch-cwd.d.ts +2 -0
  682. package/src/runs/shared/launch-cwd.d.ts.map +1 -0
  683. package/src/runs/shared/launch-cwd.js +17 -0
  684. package/src/runs/shared/launch-cwd.js.map +1 -0
  685. package/src/runs/shared/long-running-guard.d.ts +33 -0
  686. package/src/runs/shared/long-running-guard.d.ts.map +1 -0
  687. package/src/runs/shared/long-running-guard.js +199 -0
  688. package/src/runs/shared/long-running-guard.js.map +1 -0
  689. package/src/runs/shared/mcp-config-sources.d.ts +30 -0
  690. package/src/runs/shared/mcp-config-sources.d.ts.map +1 -0
  691. package/src/runs/shared/mcp-config-sources.js +419 -0
  692. package/src/runs/shared/mcp-config-sources.js.map +1 -0
  693. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts +59 -0
  694. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts.map +1 -0
  695. package/src/runs/shared/mcp-direct-tool-allowlist.js +400 -0
  696. package/src/runs/shared/mcp-direct-tool-allowlist.js.map +1 -0
  697. package/src/runs/shared/mcp-direct-tool-grant.d.ts +41 -0
  698. package/src/runs/shared/mcp-direct-tool-grant.d.ts.map +1 -0
  699. package/src/runs/shared/mcp-direct-tool-grant.js +146 -0
  700. package/src/runs/shared/mcp-direct-tool-grant.js.map +1 -0
  701. package/src/runs/shared/model-resolution-diagnostic.d.ts +22 -0
  702. package/src/runs/shared/model-resolution-diagnostic.d.ts.map +1 -0
  703. package/src/runs/shared/model-resolution-diagnostic.js +65 -0
  704. package/src/runs/shared/model-resolution-diagnostic.js.map +1 -0
  705. package/src/runs/shared/model-resolution.d.ts +92 -0
  706. package/src/runs/shared/model-resolution.d.ts.map +1 -0
  707. package/src/runs/shared/model-resolution.js +343 -0
  708. package/src/runs/shared/model-resolution.js.map +1 -0
  709. package/src/runs/shared/model-scope.d.ts +68 -0
  710. package/src/runs/shared/model-scope.d.ts.map +1 -0
  711. package/src/runs/shared/model-scope.js +156 -0
  712. package/src/runs/shared/model-scope.js.map +1 -0
  713. package/src/runs/shared/mutation-evidence.d.ts +19 -0
  714. package/src/runs/shared/mutation-evidence.d.ts.map +1 -0
  715. package/src/runs/shared/mutation-evidence.js +199 -0
  716. package/src/runs/shared/mutation-evidence.js.map +1 -0
  717. package/src/runs/shared/nested-events.d.ts +134 -0
  718. package/src/runs/shared/nested-events.d.ts.map +1 -0
  719. package/src/runs/shared/nested-events.js +1056 -0
  720. package/src/runs/shared/nested-events.js.map +1 -0
  721. package/src/runs/shared/nested-path.d.ts +9 -0
  722. package/src/runs/shared/nested-path.d.ts.map +1 -0
  723. package/src/runs/shared/nested-path.js +35 -0
  724. package/src/runs/shared/nested-path.js.map +1 -0
  725. package/src/runs/shared/nested-render.d.ts +21 -0
  726. package/src/runs/shared/nested-render.d.ts.map +1 -0
  727. package/src/runs/shared/nested-render.js +116 -0
  728. package/src/runs/shared/nested-render.js.map +1 -0
  729. package/src/runs/shared/orca-progress-tabs.d.ts +33 -0
  730. package/src/runs/shared/orca-progress-tabs.d.ts.map +1 -0
  731. package/src/runs/shared/orca-progress-tabs.js +527 -0
  732. package/src/runs/shared/orca-progress-tabs.js.map +1 -0
  733. package/src/runs/shared/parallel-handoff.d.ts +73 -0
  734. package/src/runs/shared/parallel-handoff.d.ts.map +1 -0
  735. package/src/runs/shared/parallel-handoff.js +733 -0
  736. package/src/runs/shared/parallel-handoff.js.map +1 -0
  737. package/src/runs/shared/parallel-utils.d.ts +164 -0
  738. package/src/runs/shared/parallel-utils.d.ts.map +1 -0
  739. package/src/runs/shared/parallel-utils.js +126 -0
  740. package/src/runs/shared/parallel-utils.js.map +1 -0
  741. package/src/runs/shared/permissions.d.ts +13 -0
  742. package/src/runs/shared/permissions.d.ts.map +1 -0
  743. package/src/runs/shared/permissions.js +93 -0
  744. package/src/runs/shared/permissions.js.map +1 -0
  745. package/src/runs/shared/pi-spawn.d.ts +28 -0
  746. package/src/runs/shared/pi-spawn.d.ts.map +1 -0
  747. package/src/runs/shared/pi-spawn.js +156 -0
  748. package/src/runs/shared/pi-spawn.js.map +1 -0
  749. package/src/runs/shared/process-signal.d.ts +16 -0
  750. package/src/runs/shared/process-signal.d.ts.map +1 -0
  751. package/src/runs/shared/process-signal.js +22 -0
  752. package/src/runs/shared/process-signal.js.map +1 -0
  753. package/src/runs/shared/readonly-drain-observation.d.ts +26 -0
  754. package/src/runs/shared/readonly-drain-observation.d.ts.map +1 -0
  755. package/src/runs/shared/readonly-drain-observation.js +51 -0
  756. package/src/runs/shared/readonly-drain-observation.js.map +1 -0
  757. package/src/runs/shared/run-fanout-budget.d.ts +15 -0
  758. package/src/runs/shared/run-fanout-budget.d.ts.map +1 -0
  759. package/src/runs/shared/run-fanout-budget.js +259 -0
  760. package/src/runs/shared/run-fanout-budget.js.map +1 -0
  761. package/src/runs/shared/run-history.d.ts +20 -0
  762. package/src/runs/shared/run-history.d.ts.map +1 -0
  763. package/src/runs/shared/run-history.js +200 -0
  764. package/src/runs/shared/run-history.js.map +1 -0
  765. package/src/runs/shared/runtime-acknowledged-extensions.d.ts +8 -0
  766. package/src/runs/shared/runtime-acknowledged-extensions.d.ts.map +1 -0
  767. package/src/runs/shared/runtime-acknowledged-extensions.js +45 -0
  768. package/src/runs/shared/runtime-acknowledged-extensions.js.map +1 -0
  769. package/src/runs/shared/session-lease.d.ts +70 -0
  770. package/src/runs/shared/session-lease.d.ts.map +1 -0
  771. package/src/runs/shared/session-lease.js +251 -0
  772. package/src/runs/shared/session-lease.js.map +1 -0
  773. package/src/runs/shared/single-output.d.ts +61 -0
  774. package/src/runs/shared/single-output.d.ts.map +1 -0
  775. package/src/runs/shared/single-output.js +271 -0
  776. package/src/runs/shared/single-output.js.map +1 -0
  777. package/src/runs/shared/spawn-budget.d.ts +21 -0
  778. package/src/runs/shared/spawn-budget.d.ts.map +1 -0
  779. package/src/runs/shared/spawn-budget.js +94 -0
  780. package/src/runs/shared/spawn-budget.js.map +1 -0
  781. package/src/runs/shared/structured-output.d.ts +57 -0
  782. package/src/runs/shared/structured-output.d.ts.map +1 -0
  783. package/src/runs/shared/structured-output.js +391 -0
  784. package/src/runs/shared/structured-output.js.map +1 -0
  785. package/src/runs/shared/subagent-control.d.ts +50 -0
  786. package/src/runs/shared/subagent-control.d.ts.map +1 -0
  787. package/src/runs/shared/subagent-control.js +234 -0
  788. package/src/runs/shared/subagent-control.js.map +1 -0
  789. package/src/runs/shared/subagent-prompt-runtime.d.ts +28 -0
  790. package/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -0
  791. package/src/runs/shared/subagent-prompt-runtime.js +548 -0
  792. package/src/runs/shared/subagent-prompt-runtime.js.map +1 -0
  793. package/src/runs/shared/tool-availability.d.ts +17 -0
  794. package/src/runs/shared/tool-availability.d.ts.map +1 -0
  795. package/src/runs/shared/tool-availability.js +30 -0
  796. package/src/runs/shared/tool-availability.js.map +1 -0
  797. package/src/runs/shared/tool-budget.d.ts +22 -0
  798. package/src/runs/shared/tool-budget.d.ts.map +1 -0
  799. package/src/runs/shared/tool-budget.js +79 -0
  800. package/src/runs/shared/tool-budget.js.map +1 -0
  801. package/src/runs/shared/tool-timeout.d.ts +32 -0
  802. package/src/runs/shared/tool-timeout.d.ts.map +1 -0
  803. package/src/runs/shared/tool-timeout.js +74 -0
  804. package/src/runs/shared/tool-timeout.js.map +1 -0
  805. package/src/runs/shared/usage-budget.d.ts +8 -0
  806. package/src/runs/shared/usage-budget.d.ts.map +1 -0
  807. package/src/runs/shared/usage-budget.js +75 -0
  808. package/src/runs/shared/usage-budget.js.map +1 -0
  809. package/src/runs/shared/usage-reconciliation.d.ts +9 -0
  810. package/src/runs/shared/usage-reconciliation.d.ts.map +1 -0
  811. package/src/runs/shared/usage-reconciliation.js +72 -0
  812. package/src/runs/shared/usage-reconciliation.js.map +1 -0
  813. package/src/runs/shared/workflow-async-child-guidance.d.ts +4 -0
  814. package/src/runs/shared/workflow-async-child-guidance.d.ts.map +1 -0
  815. package/src/runs/shared/workflow-async-child-guidance.js +18 -0
  816. package/src/runs/shared/workflow-async-child-guidance.js.map +1 -0
  817. package/src/runs/shared/workflow-graph.d.ts +32 -0
  818. package/src/runs/shared/workflow-graph.d.ts.map +1 -0
  819. package/src/runs/shared/workflow-graph.js +222 -0
  820. package/src/runs/shared/workflow-graph.js.map +1 -0
  821. package/src/runs/shared/worktree-cleanup-plan.d.ts +78 -0
  822. package/src/runs/shared/worktree-cleanup-plan.d.ts.map +1 -0
  823. package/src/runs/shared/worktree-cleanup-plan.js +782 -0
  824. package/src/runs/shared/worktree-cleanup-plan.js.map +1 -0
  825. package/src/runs/shared/worktree-setup-command.d.ts +39 -0
  826. package/src/runs/shared/worktree-setup-command.d.ts.map +1 -0
  827. package/src/runs/shared/worktree-setup-command.js +201 -0
  828. package/src/runs/shared/worktree-setup-command.js.map +1 -0
  829. package/src/runs/shared/worktree.d.ts +179 -0
  830. package/src/runs/shared/worktree.d.ts.map +1 -0
  831. package/src/runs/shared/worktree.js +1333 -0
  832. package/src/runs/shared/worktree.js.map +1 -0
  833. package/src/shared/accessible-dir.d.ts +12 -0
  834. package/src/shared/accessible-dir.d.ts.map +1 -0
  835. package/src/shared/accessible-dir.js +37 -0
  836. package/src/shared/accessible-dir.js.map +1 -0
  837. package/src/shared/agent-stream-options.d.ts +6 -0
  838. package/src/shared/agent-stream-options.d.ts.map +1 -0
  839. package/src/shared/agent-stream-options.js +4 -0
  840. package/src/shared/agent-stream-options.js.map +1 -0
  841. package/src/shared/artifacts.d.ts +23 -0
  842. package/src/shared/artifacts.d.ts.map +1 -0
  843. package/src/shared/artifacts.js +273 -0
  844. package/src/shared/artifacts.js.map +1 -0
  845. package/src/shared/atomic-json.d.ts +19 -0
  846. package/src/shared/atomic-json.d.ts.map +1 -0
  847. package/src/shared/atomic-json.js +60 -0
  848. package/src/shared/atomic-json.js.map +1 -0
  849. package/src/shared/capacity-resilient-json.d.ts +27 -0
  850. package/src/shared/capacity-resilient-json.d.ts.map +1 -0
  851. package/src/shared/capacity-resilient-json.js +87 -0
  852. package/src/shared/capacity-resilient-json.js.map +1 -0
  853. package/src/shared/child-cache-retention.d.ts +30 -0
  854. package/src/shared/child-cache-retention.d.ts.map +1 -0
  855. package/src/shared/child-cache-retention.js +41 -0
  856. package/src/shared/child-cache-retention.js.map +1 -0
  857. package/src/shared/child-session-name.d.ts +9 -0
  858. package/src/shared/child-session-name.d.ts.map +1 -0
  859. package/src/shared/child-session-name.js +39 -0
  860. package/src/shared/child-session-name.js.map +1 -0
  861. package/src/shared/child-transcript.d.ts +38 -0
  862. package/src/shared/child-transcript.d.ts.map +1 -0
  863. package/src/shared/child-transcript.js +226 -0
  864. package/src/shared/child-transcript.js.map +1 -0
  865. package/src/shared/completion-owner.d.ts +3 -0
  866. package/src/shared/completion-owner.d.ts.map +1 -0
  867. package/src/shared/completion-owner.js +9 -0
  868. package/src/shared/completion-owner.js.map +1 -0
  869. package/src/shared/display-text.d.ts +6 -0
  870. package/src/shared/display-text.d.ts.map +1 -0
  871. package/src/shared/display-text.js +155 -0
  872. package/src/shared/display-text.js.map +1 -0
  873. package/src/shared/extension-context.d.ts +6 -0
  874. package/src/shared/extension-context.d.ts.map +1 -0
  875. package/src/shared/extension-context.js +22 -0
  876. package/src/shared/extension-context.js.map +1 -0
  877. package/src/shared/file-coalescer.d.ts +12 -0
  878. package/src/shared/file-coalescer.d.ts.map +1 -0
  879. package/src/shared/file-coalescer.js +35 -0
  880. package/src/shared/file-coalescer.js.map +1 -0
  881. package/src/shared/file-system-retry.d.ts +32 -0
  882. package/src/shared/file-system-retry.d.ts.map +1 -0
  883. package/src/shared/file-system-retry.js +85 -0
  884. package/src/shared/file-system-retry.js.map +1 -0
  885. package/src/shared/fork-context.d.ts +59 -0
  886. package/src/shared/fork-context.d.ts.map +1 -0
  887. package/src/shared/fork-context.js +171 -0
  888. package/src/shared/fork-context.js.map +1 -0
  889. package/src/shared/fork-session-cwd.d.ts +3 -0
  890. package/src/shared/fork-session-cwd.d.ts.map +1 -0
  891. package/src/shared/fork-session-cwd.js +24 -0
  892. package/src/shared/fork-session-cwd.js.map +1 -0
  893. package/src/shared/formatters.d.ts +36 -0
  894. package/src/shared/formatters.d.ts.map +1 -0
  895. package/src/shared/formatters.js +143 -0
  896. package/src/shared/formatters.js.map +1 -0
  897. package/src/shared/jsonl-writer.d.ts +21 -0
  898. package/src/shared/jsonl-writer.d.ts.map +1 -0
  899. package/src/shared/jsonl-writer.js +68 -0
  900. package/src/shared/jsonl-writer.js.map +1 -0
  901. package/src/shared/launch-contract.d.ts +64 -0
  902. package/src/shared/launch-contract.d.ts.map +1 -0
  903. package/src/shared/launch-contract.js +140 -0
  904. package/src/shared/launch-contract.js.map +1 -0
  905. package/src/shared/model-info.d.ts +44 -0
  906. package/src/shared/model-info.d.ts.map +1 -0
  907. package/src/shared/model-info.js +73 -0
  908. package/src/shared/model-info.js.map +1 -0
  909. package/src/shared/model-response-aliases.d.ts +2 -0
  910. package/src/shared/model-response-aliases.d.ts.map +1 -0
  911. package/src/shared/model-response-aliases.js +16 -0
  912. package/src/shared/model-response-aliases.js.map +1 -0
  913. package/src/shared/node-executable.d.ts +2 -0
  914. package/src/shared/node-executable.d.ts.map +1 -0
  915. package/src/shared/node-executable.js +21 -0
  916. package/src/shared/node-executable.js.map +1 -0
  917. package/src/shared/opencode-session-headers.d.ts +13 -0
  918. package/src/shared/opencode-session-headers.d.ts.map +1 -0
  919. package/src/shared/opencode-session-headers.js +27 -0
  920. package/src/shared/opencode-session-headers.js.map +1 -0
  921. package/src/shared/prompt-resources.d.ts +6 -0
  922. package/src/shared/prompt-resources.d.ts.map +1 -0
  923. package/src/shared/prompt-resources.js +11 -0
  924. package/src/shared/prompt-resources.js.map +1 -0
  925. package/src/shared/pruned-fork.d.ts +35 -0
  926. package/src/shared/pruned-fork.d.ts.map +1 -0
  927. package/src/shared/pruned-fork.js +417 -0
  928. package/src/shared/pruned-fork.js.map +1 -0
  929. package/src/shared/required-child-extensions.d.ts +20 -0
  930. package/src/shared/required-child-extensions.d.ts.map +1 -0
  931. package/src/shared/required-child-extensions.js +74 -0
  932. package/src/shared/required-child-extensions.js.map +1 -0
  933. package/src/shared/session-file-trust.d.ts +2 -0
  934. package/src/shared/session-file-trust.d.ts.map +1 -0
  935. package/src/shared/session-file-trust.js +21 -0
  936. package/src/shared/session-file-trust.js.map +1 -0
  937. package/src/shared/session-identity.d.ts +7 -0
  938. package/src/shared/session-identity.d.ts.map +1 -0
  939. package/src/shared/session-identity.js +7 -0
  940. package/src/shared/session-identity.js.map +1 -0
  941. package/src/shared/session-tokens.d.ts +3 -0
  942. package/src/shared/session-tokens.d.ts.map +1 -0
  943. package/src/shared/session-tokens.js +59 -0
  944. package/src/shared/session-tokens.js.map +1 -0
  945. package/src/shared/settings.d.ts +147 -0
  946. package/src/shared/settings.d.ts.map +1 -0
  947. package/src/shared/settings.js +248 -0
  948. package/src/shared/settings.js.map +1 -0
  949. package/src/shared/shortcuts.d.ts +2 -0
  950. package/src/shared/shortcuts.d.ts.map +1 -0
  951. package/src/shared/shortcuts.js +18 -0
  952. package/src/shared/shortcuts.js.map +1 -0
  953. package/src/shared/status-format.d.ts +10 -0
  954. package/src/shared/status-format.d.ts.map +1 -0
  955. package/src/shared/status-format.js +61 -0
  956. package/src/shared/status-format.js.map +1 -0
  957. package/src/shared/thinking-ceiling.d.ts +14 -0
  958. package/src/shared/thinking-ceiling.d.ts.map +1 -0
  959. package/src/shared/thinking-ceiling.js +38 -0
  960. package/src/shared/thinking-ceiling.js.map +1 -0
  961. package/src/shared/types.d.ts +2660 -0
  962. package/src/shared/types.d.ts.map +1 -0
  963. package/src/shared/types.js +265 -0
  964. package/src/shared/types.js.map +1 -0
  965. package/src/shared/utf8.d.ts +6 -0
  966. package/src/shared/utf8.d.ts.map +1 -0
  967. package/src/shared/utf8.js +13 -0
  968. package/src/shared/utf8.js.map +1 -0
  969. package/src/shared/utils.d.ts +71 -0
  970. package/src/shared/utils.d.ts.map +1 -0
  971. package/src/shared/utils.js +593 -0
  972. package/src/shared/utils.js.map +1 -0
  973. package/src/shared/watch-strategy.d.ts +3 -0
  974. package/src/shared/watch-strategy.d.ts.map +1 -0
  975. package/src/shared/watch-strategy.js +6 -0
  976. package/src/shared/watch-strategy.js.map +1 -0
  977. package/src/shared/workflow-child-permit.d.ts +59 -0
  978. package/src/shared/workflow-child-permit.d.ts.map +1 -0
  979. package/src/shared/workflow-child-permit.js +160 -0
  980. package/src/shared/workflow-child-permit.js.map +1 -0
  981. package/src/slash/delegation-adapters.d.ts +147 -0
  982. package/src/slash/delegation-adapters.d.ts.map +1 -0
  983. package/src/slash/delegation-adapters.js +293 -0
  984. package/src/slash/delegation-adapters.js.map +1 -0
  985. package/src/slash/delegation-json.d.ts +11 -0
  986. package/src/slash/delegation-json.d.ts.map +1 -0
  987. package/src/slash/delegation-json.js +118 -0
  988. package/src/slash/delegation-json.js.map +1 -0
  989. package/src/slash/delegation-request.d.ts +13 -0
  990. package/src/slash/delegation-request.d.ts.map +1 -0
  991. package/src/slash/delegation-request.js +175 -0
  992. package/src/slash/delegation-request.js.map +1 -0
  993. package/src/slash/prompt-template-bridge.d.ts +27 -0
  994. package/src/slash/prompt-template-bridge.d.ts.map +1 -0
  995. package/src/slash/prompt-template-bridge.js +380 -0
  996. package/src/slash/prompt-template-bridge.js.map +1 -0
  997. package/src/slash/prompt-workflows.d.ts +22 -0
  998. package/src/slash/prompt-workflows.d.ts.map +1 -0
  999. package/src/slash/prompt-workflows.js +261 -0
  1000. package/src/slash/prompt-workflows.js.map +1 -0
  1001. package/src/slash/selector.d.ts +48 -0
  1002. package/src/slash/selector.d.ts.map +1 -0
  1003. package/src/slash/selector.js +118 -0
  1004. package/src/slash/selector.js.map +1 -0
  1005. package/src/slash/slash-bridge.d.ts +31 -0
  1006. package/src/slash/slash-bridge.d.ts.map +1 -0
  1007. package/src/slash/slash-bridge.js +133 -0
  1008. package/src/slash/slash-bridge.js.map +1 -0
  1009. package/src/slash/slash-commands.d.ts +9 -0
  1010. package/src/slash/slash-commands.d.ts.map +1 -0
  1011. package/src/slash/slash-commands.js +1295 -0
  1012. package/src/slash/slash-commands.js.map +1 -0
  1013. package/src/slash/slash-live-state.d.ts +22 -0
  1014. package/src/slash/slash-live-state.d.ts.map +1 -0
  1015. package/src/slash/slash-live-state.js +264 -0
  1016. package/src/slash/slash-live-state.js.map +1 -0
  1017. package/src/slash/subagents-admin.d.ts +3 -0
  1018. package/src/slash/subagents-admin.d.ts.map +1 -0
  1019. package/src/slash/subagents-admin.js +453 -0
  1020. package/src/slash/subagents-admin.js.map +1 -0
  1021. package/src/tui/fleet-status.d.ts +86 -0
  1022. package/src/tui/fleet-status.d.ts.map +1 -0
  1023. package/src/tui/fleet-status.js +1083 -0
  1024. package/src/tui/fleet-status.js.map +1 -0
  1025. package/src/tui/fleet-transcript.d.ts +50 -0
  1026. package/src/tui/fleet-transcript.d.ts.map +1 -0
  1027. package/src/tui/fleet-transcript.js +497 -0
  1028. package/src/tui/fleet-transcript.js.map +1 -0
  1029. package/src/tui/fleet.d.ts +169 -0
  1030. package/src/tui/fleet.d.ts.map +1 -0
  1031. package/src/tui/fleet.js +1412 -0
  1032. package/src/tui/fleet.js.map +1 -0
  1033. package/src/tui/render-helpers.d.ts +24 -0
  1034. package/src/tui/render-helpers.d.ts.map +1 -0
  1035. package/src/tui/render-helpers.js +101 -0
  1036. package/src/tui/render-helpers.js.map +1 -0
  1037. package/src/tui/render.d.ts +61 -0
  1038. package/src/tui/render.d.ts.map +1 -0
  1039. package/src/tui/render.js +3608 -0
  1040. package/src/tui/render.js.map +1 -0
  1041. package/src/watchdog/change-signature.d.ts +8 -0
  1042. package/src/watchdog/change-signature.d.ts.map +1 -0
  1043. package/src/watchdog/change-signature.js +246 -0
  1044. package/src/watchdog/change-signature.js.map +1 -0
  1045. package/src/watchdog/child-status.d.ts +54 -0
  1046. package/src/watchdog/child-status.d.ts.map +1 -0
  1047. package/src/watchdog/child-status.js +188 -0
  1048. package/src/watchdog/child-status.js.map +1 -0
  1049. package/src/watchdog/diff-tool.d.ts +23 -0
  1050. package/src/watchdog/diff-tool.d.ts.map +1 -0
  1051. package/src/watchdog/diff-tool.js +84 -0
  1052. package/src/watchdog/diff-tool.js.map +1 -0
  1053. package/src/watchdog/emission-guard.d.ts +37 -0
  1054. package/src/watchdog/emission-guard.d.ts.map +1 -0
  1055. package/src/watchdog/emission-guard.js +98 -0
  1056. package/src/watchdog/emission-guard.js.map +1 -0
  1057. package/src/watchdog/guidance.d.ts +4 -0
  1058. package/src/watchdog/guidance.d.ts.map +1 -0
  1059. package/src/watchdog/guidance.js +20 -0
  1060. package/src/watchdog/guidance.js.map +1 -0
  1061. package/src/watchdog/lsp-diagnostics.d.ts +18 -0
  1062. package/src/watchdog/lsp-diagnostics.d.ts.map +1 -0
  1063. package/src/watchdog/lsp-diagnostics.js +490 -0
  1064. package/src/watchdog/lsp-diagnostics.js.map +1 -0
  1065. package/src/watchdog/model-selection.d.ts +25 -0
  1066. package/src/watchdog/model-selection.d.ts.map +1 -0
  1067. package/src/watchdog/model-selection.js +168 -0
  1068. package/src/watchdog/model-selection.js.map +1 -0
  1069. package/src/watchdog/permission-arbiter.d.ts +21 -0
  1070. package/src/watchdog/permission-arbiter.d.ts.map +1 -0
  1071. package/src/watchdog/permission-arbiter.js +141 -0
  1072. package/src/watchdog/permission-arbiter.js.map +1 -0
  1073. package/src/watchdog/register-child.d.ts +12 -0
  1074. package/src/watchdog/register-child.d.ts.map +1 -0
  1075. package/src/watchdog/register-child.js +120 -0
  1076. package/src/watchdog/register-child.js.map +1 -0
  1077. package/src/watchdog/register-main.d.ts +10 -0
  1078. package/src/watchdog/register-main.d.ts.map +1 -0
  1079. package/src/watchdog/register-main.js +419 -0
  1080. package/src/watchdog/register-main.js.map +1 -0
  1081. package/src/watchdog/render.d.ts +12 -0
  1082. package/src/watchdog/render.d.ts.map +1 -0
  1083. package/src/watchdog/render.js +52 -0
  1084. package/src/watchdog/render.js.map +1 -0
  1085. package/src/watchdog/review.d.ts +37 -0
  1086. package/src/watchdog/review.d.ts.map +1 -0
  1087. package/src/watchdog/review.js +325 -0
  1088. package/src/watchdog/review.js.map +1 -0
  1089. package/src/watchdog/rules.d.ts +22 -0
  1090. package/src/watchdog/rules.d.ts.map +1 -0
  1091. package/src/watchdog/rules.js +59 -0
  1092. package/src/watchdog/rules.js.map +1 -0
  1093. package/src/watchdog/runtime.d.ts +196 -0
  1094. package/src/watchdog/runtime.d.ts.map +1 -0
  1095. package/src/watchdog/runtime.js +862 -0
  1096. package/src/watchdog/runtime.js.map +1 -0
  1097. package/src/watchdog/scope.d.ts +15 -0
  1098. package/src/watchdog/scope.d.ts.map +1 -0
  1099. package/src/watchdog/scope.js +45 -0
  1100. package/src/watchdog/scope.js.map +1 -0
  1101. package/src/watchdog/settings.d.ts +30 -0
  1102. package/src/watchdog/settings.d.ts.map +1 -0
  1103. package/src/watchdog/settings.js +476 -0
  1104. package/src/watchdog/settings.js.map +1 -0
  1105. package/src/watchdog/tool-actions.d.ts +18 -0
  1106. package/src/watchdog/tool-actions.d.ts.map +1 -0
  1107. package/src/watchdog/tool-actions.js +151 -0
  1108. package/src/watchdog/tool-actions.js.map +1 -0
  1109. package/src/watchdog/turn-delta.d.ts +12 -0
  1110. package/src/watchdog/turn-delta.d.ts.map +1 -0
  1111. package/src/watchdog/turn-delta.js +185 -0
  1112. package/src/watchdog/turn-delta.js.map +1 -0
  1113. package/src/watchdog/types.d.ts +142 -0
  1114. package/src/watchdog/types.d.ts.map +1 -0
  1115. package/src/watchdog/types.js +28 -0
  1116. package/src/watchdog/types.js.map +1 -0
  1117. package/src/watchdog/warning-format.d.ts +8 -0
  1118. package/src/watchdog/warning-format.d.ts.map +1 -0
  1119. package/src/watchdog/warning-format.js +60 -0
  1120. package/src/watchdog/warning-format.js.map +1 -0
  1121. package/src/workflows/chat-progress.d.ts +38 -0
  1122. package/src/workflows/chat-progress.d.ts.map +1 -0
  1123. package/src/workflows/chat-progress.js +130 -0
  1124. package/src/workflows/chat-progress.js.map +1 -0
  1125. package/src/workflows/host-command.d.ts +31 -0
  1126. package/src/workflows/host-command.d.ts.map +1 -0
  1127. package/src/workflows/host-command.js +228 -0
  1128. package/src/workflows/host-command.js.map +1 -0
  1129. package/src/workflows/scripted-workflow.d.ts +195 -0
  1130. package/src/workflows/scripted-workflow.d.ts.map +1 -0
  1131. package/src/workflows/scripted-workflow.js +2634 -0
  1132. package/src/workflows/scripted-workflow.js.map +1 -0
  1133. package/src/workflows/workflow-checklist.d.ts +124 -0
  1134. package/src/workflows/workflow-checklist.d.ts.map +1 -0
  1135. package/src/workflows/workflow-checklist.js +312 -0
  1136. package/src/workflows/workflow-checklist.js.map +1 -0
  1137. package/src/workflows/workflow-child-summary.d.ts +20 -0
  1138. package/src/workflows/workflow-child-summary.d.ts.map +1 -0
  1139. package/src/workflows/workflow-child-summary.js +179 -0
  1140. package/src/workflows/workflow-child-summary.js.map +1 -0
  1141. package/src/workflows/workflow-preflight.d.ts +59 -0
  1142. package/src/workflows/workflow-preflight.d.ts.map +1 -0
  1143. package/src/workflows/workflow-preflight.js +289 -0
  1144. package/src/workflows/workflow-preflight.js.map +1 -0
  1145. package/src/workflows/workflow-receipt.d.ts +35 -0
  1146. package/src/workflows/workflow-receipt.d.ts.map +1 -0
  1147. package/src/workflows/workflow-receipt.js +449 -0
  1148. package/src/workflows/workflow-receipt.js.map +1 -0
  1149. package/src/workflows/workflow-resources.d.ts +43 -0
  1150. package/src/workflows/workflow-resources.d.ts.map +1 -0
  1151. package/src/workflows/workflow-resources.js +230 -0
  1152. package/src/workflows/workflow-resources.js.map +1 -0
  1153. package/src/workflows/workflow-settlement.d.ts +85 -0
  1154. package/src/workflows/workflow-settlement.d.ts.map +1 -0
  1155. package/src/workflows/workflow-settlement.js +204 -0
  1156. package/src/workflows/workflow-settlement.js.map +1 -0
  1157. package/index.ts +0 -13
  1158. package/src/agents/advertised-agent-prompt.ts +0 -94
  1159. package/src/agents/agent-management.ts +0 -1417
  1160. package/src/agents/agent-memory.ts +0 -254
  1161. package/src/agents/agent-refinements.ts +0 -624
  1162. package/src/agents/agent-scope.ts +0 -6
  1163. package/src/agents/agent-selection.ts +0 -25
  1164. package/src/agents/agent-serializer.ts +0 -182
  1165. package/src/agents/agents.ts +0 -2917
  1166. package/src/agents/builtin-names.ts +0 -16
  1167. package/src/agents/chain-serializer.ts +0 -285
  1168. package/src/agents/frontmatter.ts +0 -153
  1169. package/src/agents/identity.ts +0 -30
  1170. package/src/agents/proactive-skills.ts +0 -194
  1171. package/src/agents/runtime-agent-events.ts +0 -70
  1172. package/src/agents/runtime-agent-registry.ts +0 -430
  1173. package/src/agents/skills.ts +0 -754
  1174. package/src/api/agents.ts +0 -12
  1175. package/src/api/background-work.ts +0 -206
  1176. package/src/api/capability-ceiling.ts +0 -16
  1177. package/src/api/child-tool-plan.ts +0 -5
  1178. package/src/api/control-channel.ts +0 -4
  1179. package/src/api/delegation.ts +0 -116
  1180. package/src/api/external-job-provider.ts +0 -195
  1181. package/src/api/external-runs.ts +0 -282
  1182. package/src/api/intercom-bridge.ts +0 -3
  1183. package/src/api/preflight.ts +0 -539
  1184. package/src/api/project-panes.ts +0 -32
  1185. package/src/api/required-child-extensions.ts +0 -6
  1186. package/src/api/shared-types.ts +0 -29
  1187. package/src/api/workflow-resources.ts +0 -6
  1188. package/src/extension/config.ts +0 -230
  1189. package/src/extension/control-notices.ts +0 -58
  1190. package/src/extension/doctor.ts +0 -270
  1191. package/src/extension/fanout-child.ts +0 -265
  1192. package/src/extension/herdr-pi-bridge.ts +0 -160
  1193. package/src/extension/index.ts +0 -1205
  1194. package/src/extension/public-execution.ts +0 -225
  1195. package/src/extension/rpc.ts +0 -848
  1196. package/src/extension/schemas.ts +0 -428
  1197. package/src/extension/steering-notices.ts +0 -35
  1198. package/src/extension/subagent-guide.ts +0 -39
  1199. package/src/extension/tool-description.ts +0 -175
  1200. package/src/extension/tool-result.ts +0 -19
  1201. package/src/inspectors/actions.ts +0 -148
  1202. package/src/inspectors/ghostty/actions.ts +0 -74
  1203. package/src/inspectors/ghostty/plugin.ts +0 -29
  1204. package/src/inspectors/herdr/actions.ts +0 -155
  1205. package/src/inspectors/herdr/client.ts +0 -130
  1206. package/src/inspectors/herdr/focus.ts +0 -55
  1207. package/src/inspectors/herdr/plugin.ts +0 -20
  1208. package/src/inspectors/herdr/project-panes.ts +0 -730
  1209. package/src/inspectors/inspector-runner.ts +0 -153
  1210. package/src/inspectors/plugins.ts +0 -8
  1211. package/src/inspectors/session-roots-codec.ts +0 -31
  1212. package/src/inspectors/shell-command.ts +0 -16
  1213. package/src/inspectors/types.ts +0 -51
  1214. package/src/integrations/herdr-status.ts +0 -400
  1215. package/src/integrations/pi-web-session-liveness.ts +0 -73
  1216. package/src/intercom/intercom-bridge.ts +0 -233
  1217. package/src/intercom/native-supervisor-channel.ts +0 -917
  1218. package/src/intercom/result-intercom.ts +0 -423
  1219. package/src/intercom/supervisor-ui.ts +0 -244
  1220. package/src/missions/actions.ts +0 -433
  1221. package/src/missions/goal-driver.ts +0 -164
  1222. package/src/missions/lifecycle.ts +0 -367
  1223. package/src/missions/store.ts +0 -584
  1224. package/src/missions/types.ts +0 -190
  1225. package/src/missions/workflow-state.ts +0 -281
  1226. package/src/policy/authority.ts +0 -50
  1227. package/src/profiles/profiles.ts +0 -668
  1228. package/src/runs/background/active-async-capacity.ts +0 -520
  1229. package/src/runs/background/active-run-index.ts +0 -155
  1230. package/src/runs/background/async-execution.ts +0 -2278
  1231. package/src/runs/background/async-job-tracker.ts +0 -826
  1232. package/src/runs/background/async-resume.ts +0 -647
  1233. package/src/runs/background/async-retention.ts +0 -912
  1234. package/src/runs/background/async-status-snapshot.ts +0 -46
  1235. package/src/runs/background/async-status.ts +0 -771
  1236. package/src/runs/background/auto-drain.ts +0 -92
  1237. package/src/runs/background/binary-bootstrap.ts +0 -38
  1238. package/src/runs/background/chain-append.ts +0 -321
  1239. package/src/runs/background/chain-root-attachment.ts +0 -259
  1240. package/src/runs/background/completion-batcher.ts +0 -168
  1241. package/src/runs/background/completion-dedupe.ts +0 -58
  1242. package/src/runs/background/completion-replay.ts +0 -287
  1243. package/src/runs/background/control-channel.ts +0 -600
  1244. package/src/runs/background/fleet-view.ts +0 -648
  1245. package/src/runs/background/index-segment.ts +0 -59
  1246. package/src/runs/background/inspect-rpc.ts +0 -443
  1247. package/src/runs/background/notify.ts +0 -819
  1248. package/src/runs/background/owned-process-tree.ts +0 -131
  1249. package/src/runs/background/parallel-groups.ts +0 -45
  1250. package/src/runs/background/process-terminal.ts +0 -310
  1251. package/src/runs/background/result-delivery-ownership.ts +0 -45
  1252. package/src/runs/background/result-files.ts +0 -523
  1253. package/src/runs/background/result-watcher.ts +0 -809
  1254. package/src/runs/background/resume-guidance.ts +0 -56
  1255. package/src/runs/background/retained-children.ts +0 -135
  1256. package/src/runs/background/retained-nested-route-tracker.ts +0 -96
  1257. package/src/runs/background/run-child-session.ts +0 -690
  1258. package/src/runs/background/run-id-query.ts +0 -7
  1259. package/src/runs/background/run-id-resolver.ts +0 -175
  1260. package/src/runs/background/run-status.ts +0 -786
  1261. package/src/runs/background/runner-aliases.ts +0 -142
  1262. package/src/runs/background/runner-child-launch.ts +0 -91
  1263. package/src/runs/background/runner-child-sessions.ts +0 -32
  1264. package/src/runs/background/runner-http-dispatcher.ts +0 -119
  1265. package/src/runs/background/scheduled-runs.ts +0 -1012
  1266. package/src/runs/background/stale-run-reconciler.ts +0 -436
  1267. package/src/runs/background/steering.ts +0 -260
  1268. package/src/runs/background/subagent-runner.ts +0 -5357
  1269. package/src/runs/background/subagent-wait.ts +0 -876
  1270. package/src/runs/background/terminal-run-index.ts +0 -138
  1271. package/src/runs/background/top-level-async.ts +0 -14
  1272. package/src/runs/background/wait-completions.ts +0 -261
  1273. package/src/runs/background/wait-config.ts +0 -50
  1274. package/src/runs/background/wait-subscriptions.ts +0 -354
  1275. package/src/runs/background/wait-tool.ts +0 -45
  1276. package/src/runs/foreground/async-dismiss-action.ts +0 -86
  1277. package/src/runs/foreground/async-steering-action.ts +0 -276
  1278. package/src/runs/foreground/async-stop-action.ts +0 -176
  1279. package/src/runs/foreground/execution.ts +0 -2254
  1280. package/src/runs/foreground/foreground-control.ts +0 -157
  1281. package/src/runs/foreground/foreground-history.ts +0 -163
  1282. package/src/runs/foreground/prompt-audit.ts +0 -178
  1283. package/src/runs/foreground/subagent-executor.ts +0 -7526
  1284. package/src/runs/foreground/workflow-detach-reconcile.ts +0 -304
  1285. package/src/runs/foreground/workflow-foreground-steering.ts +0 -169
  1286. package/src/runs/shared/abort-recovery.ts +0 -119
  1287. package/src/runs/shared/acceptance.ts +0 -1698
  1288. package/src/runs/shared/agent-contract.ts +0 -38
  1289. package/src/runs/shared/async-status-projection.ts +0 -659
  1290. package/src/runs/shared/background-process-options.ts +0 -9
  1291. package/src/runs/shared/capability-ceiling.ts +0 -211
  1292. package/src/runs/shared/chain-outputs.ts +0 -116
  1293. package/src/runs/shared/child-hooks.ts +0 -189
  1294. package/src/runs/shared/child-identity.ts +0 -62
  1295. package/src/runs/shared/child-launch-plan.ts +0 -163
  1296. package/src/runs/shared/child-launch.ts +0 -342
  1297. package/src/runs/shared/child-lifecycle.ts +0 -28
  1298. package/src/runs/shared/child-runtime-config.ts +0 -133
  1299. package/src/runs/shared/child-session.ts +0 -448
  1300. package/src/runs/shared/child-tool-plan.ts +0 -661
  1301. package/src/runs/shared/claude-code-adapter.ts +0 -133
  1302. package/src/runs/shared/codex-exec-adapter.ts +0 -129
  1303. package/src/runs/shared/completion-evidence.ts +0 -89
  1304. package/src/runs/shared/completion-guard.ts +0 -255
  1305. package/src/runs/shared/context-mode.ts +0 -44
  1306. package/src/runs/shared/cursor-agent-adapter.ts +0 -114
  1307. package/src/runs/shared/dynamic-fanout.ts +0 -297
  1308. package/src/runs/shared/effective-system-prompt.ts +0 -33
  1309. package/src/runs/shared/extension-bindings.ts +0 -78
  1310. package/src/runs/shared/external-cli-contract.ts +0 -177
  1311. package/src/runs/shared/external-cli-preflight.ts +0 -142
  1312. package/src/runs/shared/external-cli-runner.ts +0 -431
  1313. package/src/runs/shared/external-job-bridge.ts +0 -460
  1314. package/src/runs/shared/external-job-runner.ts +0 -389
  1315. package/src/runs/shared/fast-mode-extension.ts +0 -10
  1316. package/src/runs/shared/herdr-connection.ts +0 -134
  1317. package/src/runs/shared/herdr-external-adapters.ts +0 -169
  1318. package/src/runs/shared/herdr-machine.ts +0 -279
  1319. package/src/runs/shared/herdr-pi-protocol.ts +0 -59
  1320. package/src/runs/shared/herdr-placed-run.ts +0 -263
  1321. package/src/runs/shared/host-step-status.ts +0 -231
  1322. package/src/runs/shared/lane-metadata.ts +0 -126
  1323. package/src/runs/shared/launch-cwd.ts +0 -16
  1324. package/src/runs/shared/llm-intent-arbiter.ts +0 -321
  1325. package/src/runs/shared/long-running-guard.ts +0 -221
  1326. package/src/runs/shared/mcp-config-sources.ts +0 -422
  1327. package/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -484
  1328. package/src/runs/shared/mcp-direct-tool-grant.ts +0 -194
  1329. package/src/runs/shared/model-resolution-diagnostic.ts +0 -76
  1330. package/src/runs/shared/model-resolution.ts +0 -441
  1331. package/src/runs/shared/model-scope.ts +0 -205
  1332. package/src/runs/shared/mutation-evidence.ts +0 -199
  1333. package/src/runs/shared/nested-events.ts +0 -1079
  1334. package/src/runs/shared/nested-path.ts +0 -38
  1335. package/src/runs/shared/nested-render.ts +0 -127
  1336. package/src/runs/shared/orca-progress-tabs.ts +0 -510
  1337. package/src/runs/shared/parallel-handoff.ts +0 -741
  1338. package/src/runs/shared/parallel-utils.ts +0 -279
  1339. package/src/runs/shared/permissions.ts +0 -86
  1340. package/src/runs/shared/pi-spawn.ts +0 -207
  1341. package/src/runs/shared/process-signal.ts +0 -35
  1342. package/src/runs/shared/readonly-drain-observation.ts +0 -42
  1343. package/src/runs/shared/run-fanout-budget.ts +0 -267
  1344. package/src/runs/shared/run-history.ts +0 -201
  1345. package/src/runs/shared/runtime-acknowledged-extensions.ts +0 -44
  1346. package/src/runs/shared/session-lease.ts +0 -293
  1347. package/src/runs/shared/single-output.ts +0 -304
  1348. package/src/runs/shared/spawn-budget.ts +0 -128
  1349. package/src/runs/shared/structured-output.ts +0 -236
  1350. package/src/runs/shared/subagent-control.ts +0 -294
  1351. package/src/runs/shared/subagent-prompt-runtime.ts +0 -545
  1352. package/src/runs/shared/task-intent.ts +0 -244
  1353. package/src/runs/shared/tool-availability.ts +0 -37
  1354. package/src/runs/shared/tool-budget.ts +0 -66
  1355. package/src/runs/shared/tool-timeout.ts +0 -93
  1356. package/src/runs/shared/usage-budget.ts +0 -65
  1357. package/src/runs/shared/workflow-async-child-guidance.ts +0 -18
  1358. package/src/runs/shared/workflow-graph.ts +0 -225
  1359. package/src/runs/shared/worktree-cleanup-plan.ts +0 -869
  1360. package/src/runs/shared/worktree-setup-command.ts +0 -213
  1361. package/src/runs/shared/worktree.ts +0 -1538
  1362. package/src/shared/accessible-dir.ts +0 -47
  1363. package/src/shared/agent-stream-options.ts +0 -5
  1364. package/src/shared/artifacts.ts +0 -281
  1365. package/src/shared/atomic-json.ts +0 -83
  1366. package/src/shared/capacity-resilient-json.ts +0 -102
  1367. package/src/shared/child-cache-retention.ts +0 -43
  1368. package/src/shared/child-session-name.ts +0 -46
  1369. package/src/shared/child-transcript.ts +0 -264
  1370. package/src/shared/completion-owner.ts +0 -14
  1371. package/src/shared/display-text.ts +0 -150
  1372. package/src/shared/extension-context.ts +0 -24
  1373. package/src/shared/file-coalescer.ts +0 -49
  1374. package/src/shared/file-system-retry.ts +0 -95
  1375. package/src/shared/fork-context.ts +0 -236
  1376. package/src/shared/fork-session-cwd.ts +0 -27
  1377. package/src/shared/formatters.ts +0 -146
  1378. package/src/shared/jsonl-writer.ts +0 -92
  1379. package/src/shared/launch-contract.ts +0 -198
  1380. package/src/shared/model-info.ts +0 -101
  1381. package/src/shared/model-response-aliases.ts +0 -13
  1382. package/src/shared/node-executable.ts +0 -21
  1383. package/src/shared/opencode-session-headers.ts +0 -30
  1384. package/src/shared/prompt-resources.ts +0 -11
  1385. package/src/shared/pruned-fork.ts +0 -450
  1386. package/src/shared/required-child-extensions.ts +0 -81
  1387. package/src/shared/session-file-trust.ts +0 -19
  1388. package/src/shared/session-identity.ts +0 -10
  1389. package/src/shared/session-tokens.ts +0 -55
  1390. package/src/shared/settings.ts +0 -412
  1391. package/src/shared/shortcuts.ts +0 -13
  1392. package/src/shared/status-format.ts +0 -55
  1393. package/src/shared/thinking-ceiling.ts +0 -46
  1394. package/src/shared/types.ts +0 -2983
  1395. package/src/shared/utf8.ts +0 -11
  1396. package/src/shared/utils.ts +0 -608
  1397. package/src/shared/watch-strategy.ts +0 -12
  1398. package/src/shared/workflow-child-permit.ts +0 -212
  1399. package/src/slash/delegation-adapters.ts +0 -428
  1400. package/src/slash/delegation-json.ts +0 -108
  1401. package/src/slash/delegation-request.ts +0 -176
  1402. package/src/slash/prompt-template-bridge.ts +0 -419
  1403. package/src/slash/prompt-workflows.ts +0 -287
  1404. package/src/slash/selector.ts +0 -147
  1405. package/src/slash/slash-bridge.ts +0 -192
  1406. package/src/slash/slash-commands.ts +0 -1325
  1407. package/src/slash/slash-live-state.ts +0 -310
  1408. package/src/slash/subagents-admin.ts +0 -460
  1409. package/src/tui/fleet-status.ts +0 -1109
  1410. package/src/tui/fleet-transcript.ts +0 -536
  1411. package/src/tui/fleet.ts +0 -1448
  1412. package/src/tui/render-helpers.ts +0 -111
  1413. package/src/tui/render.ts +0 -3721
  1414. package/src/types/pi-runtime-compat.d.ts +0 -8
  1415. package/src/watchdog/change-signature.ts +0 -260
  1416. package/src/watchdog/child-status.ts +0 -225
  1417. package/src/watchdog/diff-tool.ts +0 -77
  1418. package/src/watchdog/emission-guard.ts +0 -125
  1419. package/src/watchdog/guidance.ts +0 -20
  1420. package/src/watchdog/lsp-diagnostics.ts +0 -538
  1421. package/src/watchdog/model-selection.ts +0 -187
  1422. package/src/watchdog/permission-arbiter.ts +0 -156
  1423. package/src/watchdog/register-child.ts +0 -128
  1424. package/src/watchdog/register-main.ts +0 -445
  1425. package/src/watchdog/render.ts +0 -53
  1426. package/src/watchdog/review.ts +0 -363
  1427. package/src/watchdog/rules.ts +0 -70
  1428. package/src/watchdog/runtime.ts +0 -924
  1429. package/src/watchdog/scope.ts +0 -51
  1430. package/src/watchdog/settings.ts +0 -515
  1431. package/src/watchdog/tool-actions.ts +0 -156
  1432. package/src/watchdog/turn-delta.ts +0 -184
  1433. package/src/watchdog/types.ts +0 -186
  1434. package/src/watchdog/warning-format.ts +0 -72
  1435. package/src/workflows/chat-progress.ts +0 -152
  1436. package/src/workflows/host-command.ts +0 -235
  1437. package/src/workflows/scripted-workflow.ts +0 -2575
  1438. package/src/workflows/workflow-checklist.ts +0 -436
  1439. package/src/workflows/workflow-child-summary.ts +0 -170
  1440. package/src/workflows/workflow-preflight.ts +0 -297
  1441. package/src/workflows/workflow-receipt.ts +0 -384
  1442. package/src/workflows/workflow-resources.ts +0 -236
  1443. package/src/workflows/workflow-settlement.ts +0 -249
@@ -0,0 +1,1955 @@
1
+ /**
2
+ * Async execution logic for subagent tool
3
+ */
4
+ import { spawn } from "node:child_process";
5
+ import { randomUUID } from "node:crypto";
6
+ import * as fs from "node:fs";
7
+ import * as path from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+ import * as nodeModule from "node:module";
10
+ import { discoverAgents, formatUnknownAgentError, unknownAgentDiagnosticContext } from "../../agents/agents.js";
11
+ import { createAtomicJsonWriter, writePrivateAtomicJson } from "../../shared/atomic-json.js";
12
+ import { childCacheRetentionEnv } from "../../shared/child-cache-retention.js";
13
+ import { buildEffectiveSystemPrompt } from "../shared/effective-system-prompt.js";
14
+ import { currentCompletionOwnerId } from "../../shared/completion-owner.js";
15
+ import { planChildLaunch, projectChainOutputSchemas, resolveStepBehavior, suppressProgressForReadOnlyTask } from "../shared/child-launch-plan.js";
16
+ import { formatHerdrMachineRunnerUnsupported, resolveHerdrMachinePlacement } from "../shared/herdr-machine.js";
17
+ import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/child-tool-plan.js";
18
+ import { injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.js";
19
+ import { applyWatchdogLaunchRules, sendRuleViolationWarning } from "../../watchdog/rules.js";
20
+ import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveExistingReadInstructionPaths, resolveExistingReadPaths, writeInitialProgressFile } from "../../shared/settings.js";
21
+ import { isDynamicRunnerGroup, isParallelGroup } from "../shared/parallel-utils.js";
22
+ import { PI_CODING_AGENT_PACKAGE, resolveBunPiExecutable, resolveInstalledPiPackageRoot, resolvePiPackageRoot } from "../shared/pi-spawn.js";
23
+ import { JITI_ALIAS_ENV, resolveHostPeerAliases } from "./runner-aliases.js";
24
+ import { preflightLaunchCwd } from "../shared/launch-cwd.js";
25
+ import { resolveNodeExecutable } from "../../shared/node-executable.js";
26
+ import { backgroundProcessOptions } from "../shared/background-process-options.js";
27
+ import { normalizeSkillInput, resolveSkillsWithFallback } from "../../agents/skills.js";
28
+ import { PI_CODING_AGENT_PACKAGE_ROOT_ENV, PROMPT_REDACTED, resolveChildCwd } from "../../shared/utils.js";
29
+ import { resolveEffectiveSubagentModel, resolveModelOrigin, resolveModelSelection, resolveSubagentModelOverride } from "../shared/model-resolution.js";
30
+ import { resolveToolTimeoutMs, toolTimeoutFromEnv } from "../shared/tool-timeout.js";
31
+ import { resolveModelScopesForAgent } from "../shared/model-scope.js";
32
+ import { findModelInfo, resolveEffectiveThinking } from "../../shared/model-info.js";
33
+ import { assertThinkingWithinCeiling, intersectThinkingCeilings } from "../../shared/thinking-ceiling.js";
34
+ import { resolveExpectedWorktreeAgentCwd, resolveWorktreeProvider, shouldDeferWorktreeCwd, WORKTREE_AGENT_CWD_PLACEHOLDER } from "../shared/worktree.js";
35
+ import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.js";
36
+ import { ChainOutputValidationError, validateChainOutputBindings } from "../shared/chain-outputs.js";
37
+ import { createStructuredOutputRuntime } from "../shared/structured-output.js";
38
+ import { resolveAcceptanceReportMode, resolveEffectiveAcceptance, validateAcceptanceInput, validateExecutionAcceptance } from "../shared/acceptance.js";
39
+ import { createRunFanoutBudget, writeRunFanoutBudgetDescriptor } from "../shared/run-fanout-budget.js";
40
+ import { DIRS, SUBAGENT_ASYNC_STARTED_EVENT, SUBAGENT_LIFECYCLE_ARTIFACT_VERSION, TEMP_ROOT_DIR, getAsyncConfigPath, resolveChildMaxSubagentDepth, } from "../../shared/types.js";
41
+ import { inheritedNestedParentAddressOf, inheritedNestedRouteOf, nestedResultsPath, nestedSummaryFromAsyncStatus, writeNestedEvent } from "../shared/nested-events.js";
42
+ import { SUBAGENT_PARENT_SESSION_ENV } from "../shared/child-runtime-config.js";
43
+ import { childSessionFactoryModule } from "../shared/child-session.js";
44
+ import { inheritedChildRuntime } from "../shared/child-launch.js";
45
+ import { resultFilePath } from "./result-files.js";
46
+ import { updateActiveRunIndex } from "./active-run-index.js";
47
+ import { validateToolBudgetConfig } from "../shared/tool-budget.js";
48
+ import { usageBudgetState } from "../shared/usage-budget.js";
49
+ import { finalizeProcessTerminal, initializeProcessTerminal, readProcessTerminal } from "./process-terminal.js";
50
+ import { statusStepDescription } from "./chain-append.js";
51
+ import { SUBAGENT_PROCESS_TERMINAL_EVENT } from "../../shared/types.js";
52
+ import { assertAgentAllowedByCapabilityCeiling, intersectSubagentCapabilityCeilings, resolveCurrentSubagentCapabilityCeiling } from "../shared/capability-ceiling.js";
53
+ import { resolveLaunchBinding } from "../../shared/launch-contract.js";
54
+ import { resolvePermissionRules } from "../shared/permissions.js";
55
+ import { normalizeExtensionBindings, omitExtensionBindingsEnv } from "../shared/extension-bindings.js";
56
+ import { assertWorkflowLaneKey, normalizeWorkflowLaneMetadata } from "../shared/lane-metadata.js";
57
+ import { resolveRequiredChildExtensions } from "../../shared/required-child-extensions.js";
58
+ const require = nodeModule.createRequire(import.meta.url);
59
+ const piPackageRoot = resolveAsyncPiPackageRoot();
60
+ /**
61
+ * The detached runner resolves the same host package the foreground
62
+ * `resolvePiCliScript` path resolves, so an explicit
63
+ * `PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT` override must be honored here
64
+ * too. Precedence mirrors the foreground resolver: argv-based discovery wins
65
+ * first (the foreground returns the argv script before any candidate), the
66
+ * environment override is consulted when that discovery cannot identify the
67
+ * host (wrapper installs, non-standard layouts), and the
68
+ * package-manager entry is last. Without the override, such hosts fail
69
+ * closed with "neither is available" while foreground children launch fine.
70
+ */
71
+ function resolveAsyncPiPackageRoot(env = process.env) {
72
+ return resolvePiPackageRoot() || env[PI_CODING_AGENT_PACKAGE_ROOT_ENV]?.trim() || resolveInstalledPiPackageRoot();
73
+ }
74
+ function resolveJitiCliFromPackageJson(packageJsonPath) {
75
+ if (!fs.existsSync(packageJsonPath))
76
+ return undefined;
77
+ const packageRoot = path.dirname(packageJsonPath);
78
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
79
+ const binField = pkg.bin;
80
+ const binPath = typeof binField === "string"
81
+ ? binField
82
+ : binField?.jiti ?? Object.values(binField ?? {})[0];
83
+ const candidates = [binPath, "lib/jiti-cli.mjs"].filter((candidate) => Boolean(candidate));
84
+ for (const candidate of candidates) {
85
+ const cliPath = path.resolve(packageRoot, candidate);
86
+ if (fs.existsSync(cliPath))
87
+ return cliPath;
88
+ }
89
+ return undefined;
90
+ }
91
+ function resolveJitiCliPath() {
92
+ const candidates = [
93
+ () => require.resolve("jiti/package.json"),
94
+ () => piPackageRoot
95
+ ? nodeModule.createRequire(path.join(piPackageRoot, "package.json")).resolve("jiti/package.json")
96
+ : undefined,
97
+ () => {
98
+ if (!process.argv[1])
99
+ return undefined;
100
+ const piEntry = fs.realpathSync(process.argv[1]);
101
+ return nodeModule.createRequire(piEntry).resolve("jiti/package.json");
102
+ },
103
+ () => piPackageRoot ? path.join(piPackageRoot, "node_modules", "jiti", "package.json") : undefined,
104
+ ];
105
+ for (const candidate of candidates) {
106
+ try {
107
+ const packageJsonPath = candidate();
108
+ if (!packageJsonPath)
109
+ continue;
110
+ const cliPath = resolveJitiCliFromPackageJson(packageJsonPath);
111
+ if (cliPath)
112
+ return cliPath;
113
+ }
114
+ catch {
115
+ // Candidate not available in this install, continue probing.
116
+ }
117
+ }
118
+ return undefined;
119
+ }
120
+ const jitiCliPath = resolveJitiCliPath();
121
+ const asyncRunnerSourcePath = path.join(path.dirname(fileURLToPath(import.meta.url)), `subagent-runner${path.extname(fileURLToPath(import.meta.url))}`);
122
+ const sourceUnderNodeModules = asyncRunnerSourcePath.split(path.sep).some((segment) => segment.toLowerCase() === "node_modules");
123
+ function supportsNativeRunner(nodeExecutable) {
124
+ return Boolean(process.features.typescript)
125
+ && typeof nodeModule.registerHooks === "function"
126
+ && nodeExecutable === process.execPath
127
+ && !sourceUnderNodeModules;
128
+ }
129
+ export const DEFAULT_ASYNC_TIMEOUT_MS = 30 * 60 * 1000;
130
+ export function formatAsyncStartedMessage(headline, interactive) {
131
+ const guidance = interactive
132
+ ? [
133
+ "The async run is detached and running in the background.",
134
+ "You are in an interactive session. Return control to the user now; Pi will wake you through the native completion notification when this subagent completes or needs attention. Do not run sleep/polling loops to wait for this async subagent; it does not need a wait call.",
135
+ "Use bg_wait only for provider, detached, or other background work that lacks a native completion notification.",
136
+ "If the current turn must receive results from work without a native notification before it ends, call blocking bg_wait(); ordinary async subagent runs do not need a wait call because their completion is delivered natively.",
137
+ "Otherwise, continue any independent work or return control to the user. Use subagent({ action: \"status\", id: \"...\" }) for a one-shot status/result or to inspect a blocked/stale run, never as a wait loop.",
138
+ ]
139
+ : [
140
+ "The async run is detached. Do not run sleep timers or polling loops just to wait for it.",
141
+ "This is a non-interactive run: Pi auto-drains current-session subagent work at agent_end so detached children are not abandoned. Use bg_wait only when this turn must receive provider, detached, or other background-work results that have no native completion notification.",
142
+ "Use subagent({ action: \"status\", id: \"...\" }) when you need a one-shot status/result or to inspect a blocked/stale run; do not poll in a loop.",
143
+ ];
144
+ return [headline, "", ...guidance].join("\n");
145
+ }
146
+ /** Check whether detached async execution has a supported runtime. */
147
+ export function isAsyncAvailable() {
148
+ return resolveBunPiExecutable() !== undefined || supportsNativeRunner(resolveNodeExecutable()) || jitiCliPath !== undefined;
149
+ }
150
+ export function resolveAsyncRunnerLogPaths(cfg) {
151
+ const asyncDir = typeof cfg.asyncDir === "string"
152
+ ? cfg.asyncDir
153
+ : undefined;
154
+ if (!asyncDir)
155
+ return undefined;
156
+ return {
157
+ stdoutPath: path.join(asyncDir, "runner.stdout.log"),
158
+ stderrPath: path.join(asyncDir, "runner.stderr.log"),
159
+ };
160
+ }
161
+ function closeFd(fd) {
162
+ if (fd === undefined)
163
+ return;
164
+ try {
165
+ fs.closeSync(fd);
166
+ }
167
+ catch {
168
+ // Best-effort cleanup; child process already owns its duplicated stdio fd.
169
+ }
170
+ }
171
+ /**
172
+ * Spawn the async runner process
173
+ */
174
+ const RUNNER_STARTUP_TIMEOUT_MS = 10_000;
175
+ function waitForStartupInterval(delayMs = 20) {
176
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
177
+ }
178
+ function readRunnerStartup(startupPath, expectedState, expectedToken) {
179
+ if (!fs.existsSync(startupPath))
180
+ return undefined;
181
+ try {
182
+ const payload = JSON.parse(fs.readFileSync(startupPath, "utf-8"));
183
+ if (payload.state === "error" && typeof payload.error === "string")
184
+ return { ok: false, error: payload.error, startupDidNotProceed: true };
185
+ if (payload.state !== expectedState)
186
+ return undefined;
187
+ if (typeof payload.token !== "string" || (expectedToken !== undefined && payload.token !== expectedToken)) {
188
+ return { ok: false, error: `Async runner wrote an invalid ${expectedState} startup handshake: ${startupPath}`, startupDidNotProceed: true };
189
+ }
190
+ return { ok: true, token: payload.token };
191
+ }
192
+ catch (error) {
193
+ return { ok: false, error: `Failed to read async runner startup handshake '${startupPath}': ${error instanceof Error ? error.message : String(error)}`, startupDidNotProceed: true };
194
+ }
195
+ }
196
+ async function waitForRunnerStartup(startupPath, expectedState, timeoutMs, expectedToken, processClosed) {
197
+ const confirmOpen = async (result) => {
198
+ if (!processClosed || result.ok === false)
199
+ return result;
200
+ const outcome = await Promise.race([processClosed.then((exit) => ({ exit })), new Promise((resolve) => setImmediate(() => resolve(undefined)))]);
201
+ if (!outcome)
202
+ return result;
203
+ const finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);
204
+ if (finalResult?.ok === false)
205
+ return finalResult;
206
+ const { exitCode, signal } = outcome.exit;
207
+ return { ok: false, error: `Async runner exited before startup state '${expectedState}' (exit code ${exitCode ?? "unknown"}, signal ${signal ?? "none"}).`, startupDidNotProceed: true };
208
+ };
209
+ const deadline = Date.now() + timeoutMs;
210
+ while (Date.now() <= deadline) {
211
+ const result = readRunnerStartup(startupPath, expectedState, expectedToken);
212
+ if (result)
213
+ return await confirmOpen(result);
214
+ const delay = waitForStartupInterval(Math.min(20, Math.max(1, deadline - Date.now())));
215
+ if (processClosed) {
216
+ const outcome = await Promise.race([delay.then(() => undefined), processClosed.then((exit) => ({ exit }))]);
217
+ if (outcome) {
218
+ const finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);
219
+ if (finalResult?.ok === false)
220
+ return finalResult;
221
+ const { exitCode, signal } = outcome.exit;
222
+ return { ok: false, error: `Async runner exited before startup state '${expectedState}' (exit code ${exitCode ?? "unknown"}, signal ${signal ?? "none"}).`, startupDidNotProceed: true };
223
+ }
224
+ }
225
+ else {
226
+ await delay;
227
+ }
228
+ }
229
+ const finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);
230
+ if (finalResult)
231
+ return finalResult;
232
+ return { ok: false, error: `Timed out after ${timeoutMs}ms waiting for the async runner startup state '${expectedState}'.`, startupDidNotProceed: true };
233
+ }
234
+ const writePrivateStartupControlJson = createAtomicJsonWriter({ mode: 0o600, ignoreCleanupErrorAfterSuccess: true });
235
+ function writeRunnerStartupControl(filePath, payload) {
236
+ // Delegate to the shared atomic JSON writer (temp file + rename, retrying
237
+ // transient Windows EPERM/EBUSY/EACCES locks and cleaning up the temp file
238
+ // on failure), so the startup handshake gets the same locking resilience as
239
+ // every other async control/result file. This is exercised by
240
+ // test/unit/atomic-json.test.ts.
241
+ writePrivateStartupControlJson(filePath, payload);
242
+ }
243
+ function runnerIsAlive(pid) {
244
+ try {
245
+ process.kill(pid, 0);
246
+ return true;
247
+ }
248
+ catch (error) {
249
+ return error.code === "EPERM";
250
+ }
251
+ }
252
+ function waitForStartupIntervalSync(delayMs = 20) {
253
+ const waitUntil = Date.now() + delayMs;
254
+ while (Date.now() < waitUntil) {
255
+ // Pre-handshake failures happen before the runner can be observed asynchronously.
256
+ }
257
+ }
258
+ function terminateRunnerBeforeProceed(pid) {
259
+ for (const signal of ["SIGTERM", "SIGKILL"]) {
260
+ if (!runnerIsAlive(pid))
261
+ return true;
262
+ try {
263
+ process.kill(pid, signal);
264
+ }
265
+ catch {
266
+ if (!runnerIsAlive(pid))
267
+ return true;
268
+ }
269
+ const deadline = Date.now() + 1000;
270
+ while (runnerIsAlive(pid) && Date.now() < deadline)
271
+ waitForStartupIntervalSync();
272
+ }
273
+ return !runnerIsAlive(pid);
274
+ }
275
+ async function terminateRunnerBeforeProceedAsync(proc, processClosed) {
276
+ for (const signal of ["SIGTERM", "SIGKILL"]) {
277
+ if (proc.pid === undefined || !runnerIsAlive(proc.pid))
278
+ return true;
279
+ try {
280
+ process.kill(proc.pid, signal);
281
+ }
282
+ catch {
283
+ if (proc.pid === undefined || !runnerIsAlive(proc.pid))
284
+ return true;
285
+ }
286
+ const exited = await Promise.race([processClosed.then(() => true), waitForStartupInterval(1000).then(() => false)]);
287
+ if (exited || proc.pid === undefined || !runnerIsAlive(proc.pid))
288
+ return true;
289
+ }
290
+ return proc.pid === undefined || !runnerIsAlive(proc.pid);
291
+ }
292
+ async function completeRunnerStartupHandshake(startupPath, startupAckPath, startupConfirmPath, startupProceedPath, proc, processClosed, getObservedProcessExit, runnerProcessInstanceId, persistStartupFailure) {
293
+ try {
294
+ const ready = await waitForRunnerStartup(startupPath, "ready", RUNNER_STARTUP_TIMEOUT_MS, undefined, processClosed);
295
+ if (ready.ok === false) {
296
+ persistStartupFailure(ready.error);
297
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
298
+ return { pid: proc.pid, runnerProcessInstanceId, error: ready.error, terminationObserved, startupDidNotProceed: true };
299
+ }
300
+ try {
301
+ writeRunnerStartupControl(startupAckPath, { action: "ack", token: ready.token });
302
+ }
303
+ catch (error) {
304
+ const message = `Failed to acknowledge async runner startup: ${error instanceof Error ? error.message : String(error)}`;
305
+ persistStartupFailure(message);
306
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
307
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
308
+ }
309
+ const acknowledged = await waitForRunnerStartup(startupPath, "acknowledged", RUNNER_STARTUP_TIMEOUT_MS, ready.token, processClosed);
310
+ if (acknowledged.ok === false) {
311
+ persistStartupFailure(acknowledged.error);
312
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
313
+ return { pid: proc.pid, runnerProcessInstanceId, error: acknowledged.error, terminationObserved, startupDidNotProceed: true };
314
+ }
315
+ try {
316
+ writeRunnerStartupControl(startupConfirmPath, { action: "confirm", token: ready.token });
317
+ }
318
+ catch (error) {
319
+ const message = `Failed to confirm async runner startup: ${error instanceof Error ? error.message : String(error)}`;
320
+ persistStartupFailure(message);
321
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
322
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
323
+ }
324
+ const confirmed = await waitForRunnerStartup(startupPath, "confirmed", RUNNER_STARTUP_TIMEOUT_MS, ready.token, processClosed);
325
+ if (confirmed.ok === false) {
326
+ persistStartupFailure(confirmed.error);
327
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
328
+ return { pid: proc.pid, runnerProcessInstanceId, error: confirmed.error, terminationObserved, startupDidNotProceed: true };
329
+ }
330
+ const closedAtCommit = await Promise.race([
331
+ processClosed.then((exit) => exit),
332
+ new Promise((resolve) => setImmediate(() => resolve(undefined))),
333
+ ]);
334
+ const observedExit = closedAtCommit ?? getObservedProcessExit();
335
+ if (observedExit) {
336
+ const message = `Async runner exited after startup state 'acknowledged' before proceed (exit code ${observedExit.exitCode ?? "unknown"}, signal ${observedExit.signal ?? "none"}).`;
337
+ persistStartupFailure(message);
338
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
339
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
340
+ }
341
+ try {
342
+ writeRunnerStartupControl(startupProceedPath, { action: "proceed", token: ready.token });
343
+ }
344
+ catch (error) {
345
+ const message = `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}`;
346
+ persistStartupFailure(message);
347
+ const terminationObserved = await terminateRunnerBeforeProceedAsync(proc, processClosed);
348
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
349
+ }
350
+ try {
351
+ fs.rmSync(startupPath, { force: true });
352
+ }
353
+ catch { }
354
+ return { pid: proc.pid, runnerProcessInstanceId };
355
+ }
356
+ finally {
357
+ await new Promise((resolve) => setImmediate(resolve));
358
+ }
359
+ }
360
+ function persistPreProceedStartupFailure(asyncDir, runId, runnerProcessInstanceId, sessionId, completionOwnerId, message) {
361
+ const now = Date.now();
362
+ try {
363
+ const statusPath = path.join(asyncDir, "status.json");
364
+ let status = {};
365
+ try {
366
+ status = JSON.parse(fs.readFileSync(statusPath, "utf-8"));
367
+ }
368
+ catch { }
369
+ const existingProcessTerminal = status.processTerminal?.state === "observed" || status.processTerminal?.state === "unknown"
370
+ ? status.processTerminal : undefined;
371
+ writePrivateAtomicJson(statusPath, {
372
+ ...status,
373
+ runId,
374
+ ...(sessionId ? { sessionId } : {}),
375
+ ...(completionOwnerId ? { completionOwnerId } : {}),
376
+ state: "failed",
377
+ lastUpdate: now,
378
+ error: message,
379
+ processTerminal: existingProcessTerminal ?? {
380
+ version: 1,
381
+ state: "not-started",
382
+ runId,
383
+ runnerProcessInstanceId,
384
+ },
385
+ });
386
+ writePrivateAtomicJson(path.join(asyncDir, "process-terminal-candidate.json"), {
387
+ version: 1,
388
+ runId,
389
+ runnerProcessInstanceId,
390
+ writers: {},
391
+ expectedWriters: { 0: 0 },
392
+ });
393
+ }
394
+ catch {
395
+ // Startup failures must still return the original launch error.
396
+ }
397
+ }
398
+ function isStaleExtensionContextError(error) {
399
+ return error instanceof Error && /extension ctx is stale|stale after session replacement or reload/i.test(error.message);
400
+ }
401
+ export function emitProcessTerminalEvent(ctx, proof) {
402
+ try {
403
+ ctx.pi.events.emit(SUBAGENT_PROCESS_TERMINAL_EVENT, proof);
404
+ }
405
+ catch (error) {
406
+ if (isStaleExtensionContextError(error))
407
+ return;
408
+ console.error("Failed to emit subagent process-terminal event:", error);
409
+ }
410
+ }
411
+ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, launchParentSessionId, onProcessTerminal, onBeforeProceed, requestedCwd = cwd) {
412
+ const cwdError = preflightLaunchCwd(requestedCwd, cwd);
413
+ if (cwdError)
414
+ return { error: cwdError };
415
+ if (launchParentSessionId !== undefined && (!launchParentSessionId || launchParentSessionId.trim() !== launchParentSessionId)) {
416
+ return { error: "Background runner parent session identity is invalid." };
417
+ }
418
+ const steps = cfg.steps;
419
+ if (!Array.isArray(steps))
420
+ return { error: "Background runner launch is missing its steps." };
421
+ const inconsistentParent = steps.some((step) => isParallelGroup(step)
422
+ ? step.parallel.some((child) => child.parentSessionId !== launchParentSessionId)
423
+ : (isDynamicRunnerGroup(step) ? step.parallel.parentSessionId : step.parentSessionId) !== launchParentSessionId);
424
+ if (inconsistentParent)
425
+ return { error: "Background runner steps have inconsistent parent session identities." };
426
+ // The compiled host exposes its SDK only through Pi's extension loader.
427
+ const binaryHost = resolveBunPiExecutable();
428
+ const nodeExecutable = resolveNodeExecutable();
429
+ const nativeRunnerSupported = supportsNativeRunner(nodeExecutable);
430
+ const runner = asyncRunnerSourcePath;
431
+ const runnerIsJavaScript = path.extname(runner) === ".js";
432
+ const bootstrap = path.join(path.dirname(runner), `binary-bootstrap${path.extname(fileURLToPath(import.meta.url))}`);
433
+ if (binaryHost && !fs.existsSync(bootstrap))
434
+ return { error: `Background runner bootstrap not found: ${bootstrap}` };
435
+ if (!binaryHost && !runnerIsJavaScript && !nativeRunnerSupported && !jitiCliPath) {
436
+ return { error: sourceUnderNodeModules
437
+ ? "Background runner source is installed under node_modules, so upstream jiti is required for TypeScript execution."
438
+ : "Background runner requires enabled native TypeScript with synchronous module hooks, or installed upstream jiti for TypeScript execution." };
439
+ }
440
+ if (!binaryHost && !piPackageRoot) {
441
+ return { error: `Background children require a supported standalone Pi host or the installed npm package (${PI_CODING_AGENT_PACKAGE}); neither is available.` };
442
+ }
443
+ const hostPeerAliases = !binaryHost && piPackageRoot ? resolveHostPeerAliases(piPackageRoot) : { aliases: {}, missing: [] };
444
+ if (hostPeerAliases.missing.length > 0) {
445
+ return { error: `Background children require the host npm package (${PI_CODING_AGENT_PACKAGE}) with its dependencies; ${piPackageRoot} does not provide ${hostPeerAliases.missing.join(", ")}.` };
446
+ }
447
+ fs.mkdirSync(TEMP_ROOT_DIR, { recursive: true });
448
+ const cfgPath = getAsyncConfigPath(suffix);
449
+ const runnerProcessInstanceId = randomUUID();
450
+ const hasRevivalLease = typeof cfg.revivalLease === "object";
451
+ const launchBarrierToken = hasRevivalLease ? undefined : runnerProcessInstanceId;
452
+ const launchConfig = { ...cfg, runnerProcessInstanceId, ...(launchBarrierToken ? { launchBarrierToken } : {}) };
453
+ writePrivateAtomicJson(cfgPath, launchConfig);
454
+ const command = binaryHost ?? nodeExecutable;
455
+ const launchForStartup = launchConfig;
456
+ const launchAsyncDir = typeof launchForStartup.asyncDir === "string" ? launchForStartup.asyncDir : undefined;
457
+ const launchRunId = typeof launchForStartup.id === "string" ? launchForStartup.id : suffix;
458
+ const launchSessionId = typeof launchForStartup.sessionId === "string" ? launchForStartup.sessionId : undefined;
459
+ const launchCompletionOwnerId = typeof launchForStartup.completionOwnerId === "string" ? launchForStartup.completionOwnerId : undefined;
460
+ const startupPath = typeof launchForStartup.revivalLease === "object" && launchAsyncDir
461
+ ? path.join(launchAsyncDir, "runner-startup.json")
462
+ : undefined;
463
+ const startupAckPath = startupPath ? path.join(path.dirname(startupPath), "runner-startup-ack.json") : undefined;
464
+ const startupConfirmPath = startupPath ? path.join(path.dirname(startupPath), "runner-startup-confirm.json") : undefined;
465
+ const startupProceedPath = launchAsyncDir && (startupPath || launchBarrierToken)
466
+ ? path.join(launchAsyncDir, "runner-startup-proceed.json")
467
+ : undefined;
468
+ if (startupPath)
469
+ fs.rmSync(startupPath, { force: true });
470
+ if (startupAckPath)
471
+ fs.rmSync(startupAckPath, { force: true });
472
+ if (startupConfirmPath)
473
+ fs.rmSync(startupConfirmPath, { force: true });
474
+ if (startupProceedPath)
475
+ fs.rmSync(startupProceedPath, { force: true });
476
+ const logPaths = resolveAsyncRunnerLogPaths(launchConfig);
477
+ let stdoutFd;
478
+ let stderrFd;
479
+ try {
480
+ if (logPaths) {
481
+ fs.mkdirSync(path.dirname(logPaths.stdoutPath), { recursive: true });
482
+ stdoutFd = fs.openSync(logPaths.stdoutPath, "a");
483
+ stderrFd = fs.openSync(logPaths.stderrPath, "a");
484
+ }
485
+ // Short-circuit native peer aliases so Pi's loader and generated factories preserve filesystem resolution semantics.
486
+ const preload = Object.keys(hostPeerAliases.aliases).length > 0
487
+ ? ["--import", new URL("../../../runner-peer-preload.mjs", import.meta.url).href]
488
+ : [];
489
+ const args = binaryHost
490
+ ? ["--no-extensions", "--no-skills", "--no-prompt-templates", "--no-session", "--mode", "rpc", "--extension", bootstrap]
491
+ : runnerIsJavaScript
492
+ ? [...preload, runner, cfgPath]
493
+ : nativeRunnerSupported
494
+ ? [...preload, "--experimental-strip-types", runner, cfgPath]
495
+ : [...preload, jitiCliPath, runner, cfgPath];
496
+ const runnerEnv = {
497
+ ...omitExtensionBindingsEnv(process.env),
498
+ ...childCacheRetentionEnv(),
499
+ [PI_CODING_AGENT_PACKAGE_ROOT_ENV]: binaryHost ? undefined : piPackageRoot,
500
+ // npm must override inherited bundled layouts (#2071); binaries retain release assets.
501
+ PI_PACKAGE_DIR: binaryHost ? process.env.PI_PACKAGE_DIR : piPackageRoot,
502
+ [JITI_ALIAS_ENV]: binaryHost ? undefined : JSON.stringify(hostPeerAliases.aliases),
503
+ PI_ASYNC_NATIVE_RUNNER: !binaryHost && (runnerIsJavaScript || nativeRunnerSupported) ? "1" : "0",
504
+ PI_SUBAGENT_RUNNER_CONFIG: binaryHost ? cfgPath : undefined,
505
+ };
506
+ if (launchParentSessionId === undefined)
507
+ delete runnerEnv[SUBAGENT_PARENT_SESSION_ENV];
508
+ else
509
+ runnerEnv[SUBAGENT_PARENT_SESSION_ENV] = launchParentSessionId;
510
+ const proc = spawn(command, args, {
511
+ cwd,
512
+ ...backgroundProcessOptions(),
513
+ stdio: ["ignore", stdoutFd ?? "ignore", stderrFd ?? "ignore"],
514
+ env: runnerEnv,
515
+ });
516
+ let observedProcessExit;
517
+ proc.once("exit", (exitCode, signal) => { observedProcessExit = { exitCode, signal }; });
518
+ const processClosed = new Promise((resolve) => {
519
+ proc.once("close", (exitCode, signal) => {
520
+ observedProcessExit ??= { exitCode, signal };
521
+ resolve({ exitCode, signal });
522
+ });
523
+ });
524
+ closeFd(stdoutFd);
525
+ closeFd(stderrFd);
526
+ proc.on("error", (error) => {
527
+ console.error(`[pi-subagents] async spawn failed: ${error.message}`);
528
+ });
529
+ proc.once("close", (exitCode, signal) => {
530
+ const finalize = () => {
531
+ const launch = launchConfig;
532
+ const asyncDir = launch.asyncDir;
533
+ const runId = launch.id;
534
+ if (typeof asyncDir !== "string" || typeof runId !== "string")
535
+ return;
536
+ finalizeProcessTerminal(asyncDir, runId, {
537
+ processInstanceId: runnerProcessInstanceId,
538
+ closeObservedAt: Date.now(),
539
+ exitCode,
540
+ signal,
541
+ });
542
+ const persisted = readProcessTerminal(asyncDir, { runId, runnerProcessInstanceId });
543
+ if (!persisted)
544
+ return;
545
+ if (launch.nestedRoute && launch.nestedSelf) {
546
+ try {
547
+ let status;
548
+ try {
549
+ status = JSON.parse(fs.readFileSync(path.join(asyncDir, "status.json"), "utf-8"));
550
+ status.processTerminal = persisted;
551
+ }
552
+ catch {
553
+ status = {
554
+ runId,
555
+ mode: "single",
556
+ state: persisted.state === "observed" ? "complete" : "failed",
557
+ startedAt: persisted.observedAt ?? Date.now(),
558
+ lastUpdate: Date.now(),
559
+ processTerminal: persisted,
560
+ };
561
+ }
562
+ writeNestedEvent(launch.nestedRoute, {
563
+ type: "subagent.nested.completed",
564
+ ts: Date.now(),
565
+ parentRunId: launch.nestedSelf.parentRunId,
566
+ parentStepIndex: launch.nestedSelf.parentStepIndex,
567
+ child: nestedSummaryFromAsyncStatus(status, asyncDir, {
568
+ id: runId,
569
+ parentRunId: launch.nestedSelf.parentRunId,
570
+ parentStepIndex: launch.nestedSelf.parentStepIndex,
571
+ depth: launch.nestedSelf.depth,
572
+ path: launch.nestedSelf.path,
573
+ mode: status.mode,
574
+ ts: Date.now(),
575
+ }),
576
+ });
577
+ }
578
+ catch (error) {
579
+ console.error("Failed to emit final nested process-terminal status:", error);
580
+ }
581
+ }
582
+ onProcessTerminal?.(persisted);
583
+ };
584
+ if (startupPath)
585
+ setImmediate(finalize);
586
+ else
587
+ finalize();
588
+ });
589
+ if (typeof proc.pid !== "number") {
590
+ return { error: `async runner did not produce a pid for cwd: ${cwd}` };
591
+ }
592
+ try {
593
+ writePrivateAtomicJson(initialStatusPath, {
594
+ ...initialStatus,
595
+ pid: proc.pid,
596
+ processTerminal: { version: 1, state: "pending", runId: initialStatus.runId, runnerProcessInstanceId },
597
+ });
598
+ // Aggregate waits must see the launch before the runner's first status update.
599
+ updateActiveRunIndex(path.dirname(initialStatusPath), initialStatus.state, initialStatus.toolCallId);
600
+ }
601
+ catch (error) {
602
+ const message = `Failed to persist initial async status: ${error instanceof Error ? error.message : String(error)}`;
603
+ if (launchAsyncDir)
604
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
605
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
606
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
607
+ }
608
+ try {
609
+ if (!launchAsyncDir)
610
+ throw new Error("Async runner is missing its lifecycle directory.");
611
+ initializeProcessTerminal(launchAsyncDir, launchRunId, runnerProcessInstanceId);
612
+ }
613
+ catch (error) {
614
+ const message = `Failed to establish async runner lifecycle sidecar: ${error instanceof Error ? error.message : String(error)}`;
615
+ if (launchAsyncDir)
616
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
617
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
618
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
619
+ }
620
+ try {
621
+ onBeforeProceed?.(runnerProcessInstanceId);
622
+ }
623
+ catch (error) {
624
+ const message = `Failed to establish async runner capacity ownership: ${error instanceof Error ? error.message : String(error)}`;
625
+ if (launchAsyncDir)
626
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
627
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
628
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
629
+ }
630
+ if (launchBarrierToken && startupProceedPath) {
631
+ try {
632
+ writeRunnerStartupControl(startupProceedPath, { action: "proceed", token: launchBarrierToken });
633
+ }
634
+ catch (error) {
635
+ const message = `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}`;
636
+ if (launchAsyncDir)
637
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
638
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
639
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
640
+ }
641
+ }
642
+ proc.unref();
643
+ if (startupPath && startupAckPath && startupConfirmPath && startupProceedPath) {
644
+ const persistStartupFailure = (message) => {
645
+ if (launchAsyncDir)
646
+ persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
647
+ };
648
+ return completeRunnerStartupHandshake(startupPath, startupAckPath, startupConfirmPath, startupProceedPath, proc, processClosed, () => observedProcessExit ?? (proc.exitCode !== null || proc.signalCode !== null ? { exitCode: proc.exitCode, signal: proc.signalCode } : undefined), runnerProcessInstanceId, persistStartupFailure);
649
+ }
650
+ return { pid: proc.pid, runnerProcessInstanceId };
651
+ }
652
+ catch (error) {
653
+ closeFd(stdoutFd);
654
+ closeFd(stderrFd);
655
+ return { error: error instanceof Error ? error.message : String(error) };
656
+ }
657
+ }
658
+ function formatAsyncStartError(mode, message) {
659
+ return {
660
+ content: [{ type: "text", text: message }],
661
+ isError: true,
662
+ details: { mode, results: [] },
663
+ };
664
+ }
665
+ const UNAVAILABLE_SUBAGENT_SKILL_ERROR = "Skills not found: pi-subagents";
666
+ class UnavailableSubagentSkillError extends Error {
667
+ }
668
+ class AsyncStartValidationError extends Error {
669
+ }
670
+ export function buildAsyncRunnerSteps(id, params) {
671
+ const { chain, agents, ctx, cwd, sessionFilesByFlatIndex, thinkingOverridesByFlatIndex, maxSubagentDepth, worktreeBaseDir, worktreeProvider, worktreeBranchPrefix, asyncDir, } = params;
672
+ const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
673
+ const outputBaseDir = params.outputBaseDir;
674
+ const resultMode = params.resultMode ?? "chain";
675
+ const chainSkills = params.chainSkills ?? [];
676
+ const availableModels = params.availableModels;
677
+ const runnerCwd = resolveChildCwd(ctx.cwd, cwd);
678
+ const launchMachine = params.machine;
679
+ let managedWorktreeProvider;
680
+ try {
681
+ if (chain.some((step) => "worktree" in step && step.worktree === true)) {
682
+ const resolved = resolveWorktreeProvider(worktreeProvider, worktreeBaseDir);
683
+ managedWorktreeProvider = shouldDeferWorktreeCwd(worktreeProvider, worktreeBaseDir) ? "worktrunk" : resolved;
684
+ }
685
+ }
686
+ catch (error) {
687
+ return { error: error instanceof Error ? error.message : String(error) };
688
+ }
689
+ const progressDir = params.progressDir ?? runnerCwd;
690
+ const graphChain = params.attachRoot
691
+ ? [{
692
+ agent: params.attachRoot.agent,
693
+ task: `Attach async root ${params.attachRoot.runId}`,
694
+ label: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,
695
+ ...(params.attachRoot.outputName ? { as: params.attachRoot.outputName } : {}),
696
+ }, ...chain]
697
+ : chain;
698
+ const firstStep = chain[0];
699
+ const originalTask = params.task ?? (firstStep
700
+ ? (isParallelStep(firstStep)
701
+ ? firstStep.parallel[0]?.task
702
+ : isDynamicParallelStep(firstStep)
703
+ ? firstStep.parallel.task
704
+ : firstStep.task)
705
+ : undefined);
706
+ try {
707
+ if (params.validateOutputBindings !== false) {
708
+ validateChainOutputBindings(chain, { maxItems: params.dynamicFanoutMaxItems });
709
+ }
710
+ }
711
+ catch (error) {
712
+ if (error instanceof ChainOutputValidationError)
713
+ return { error: error.message };
714
+ throw error;
715
+ }
716
+ const diagnosticContext = params.unknownAgentDiagnosticContext
717
+ ?? unknownAgentDiagnosticContext(discoverAgents(path.resolve(runnerCwd), "both"));
718
+ for (const s of chain) {
719
+ const stepAgents = isParallelStep(s)
720
+ ? s.parallel.map((t) => t.agent)
721
+ : isDynamicParallelStep(s)
722
+ ? [s.parallel.agent]
723
+ : [s.agent];
724
+ for (const agentName of stepAgents) {
725
+ if (!agents.find((x) => x.name === agentName))
726
+ return { error: formatUnknownAgentError(agentName, diagnosticContext) };
727
+ }
728
+ }
729
+ const graphSteps = projectChainOutputSchemas(graphChain, agents);
730
+ const workflowGraph = buildWorkflowGraphSnapshot({ runId: id, mode: resultMode, steps: graphSteps });
731
+ let progressInstructionCreated = false;
732
+ const buildStepOverrides = (s) => {
733
+ const stepSkillInput = normalizeSkillInput(s.skill);
734
+ return {
735
+ ...(s.output !== undefined ? { output: s.output } : {}),
736
+ ...(s.outputMode !== undefined ? { outputMode: s.outputMode } : {}),
737
+ ...(s.reads !== undefined ? { reads: s.reads } : {}),
738
+ ...(s.progress !== undefined ? { progress: s.progress } : {}),
739
+ ...(stepSkillInput !== undefined ? { skills: stepSkillInput } : {}),
740
+ ...(s.model !== undefined ? { model: s.model } : {}),
741
+ ...(s.fast !== undefined ? { fast: s.fast } : {}),
742
+ ...(s.outputSchema !== undefined ? { outputSchema: s.outputSchema } : {}),
743
+ };
744
+ };
745
+ const buildSeqStep = (s, sessionFile, behaviorCwd, progressPrecreated = false, resolvedBehavior, flatIndex, parallelOutputNamespace, runFanoutPath) => {
746
+ const a = agents.find((x) => x.name === s.agent);
747
+ const effectiveBehavior = resolvedBehavior ?? suppressProgressForReadOnlyTask(resolveStepBehavior(a, buildStepOverrides(s), chainSkills), s.task, originalTask);
748
+ const requestedMachine = s.machine ?? launchMachine ?? a.machine;
749
+ const externalRunner = a.runner?.type === "external-cli" || a.runner?.type === "external-job";
750
+ const externalRunnerType = a.runner?.type;
751
+ const machineUnsupported = formatHerdrMachineRunnerUnsupported({ machine: requestedMachine, agentName: a.name, runnerType: a.runner?.type, adapter: a.runner?.type === "external-cli" ? a.runner.adapter : undefined, worktree: s.worktree });
752
+ if (machineUnsupported)
753
+ throw new AsyncStartValidationError(machineUnsupported);
754
+ let machine;
755
+ let machineEnv;
756
+ if (requestedMachine) {
757
+ try {
758
+ const placement = resolveHerdrMachinePlacement({ machine: requestedMachine, cwd: runnerCwd, stepCwd: s.cwd ?? params.machineCwd });
759
+ machine = placement.machine;
760
+ machineEnv = placement.env;
761
+ }
762
+ catch (error) {
763
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
764
+ }
765
+ }
766
+ if (externalRunner) {
767
+ const unsupported = [];
768
+ if (s.model !== undefined)
769
+ unsupported.push("model override");
770
+ if (effectiveBehavior.outputSchema !== undefined)
771
+ unsupported.push("structured output");
772
+ if (s.acceptance !== undefined || params.agentContract !== undefined || s.agentContract !== undefined)
773
+ unsupported.push("acceptance/agent contract");
774
+ if (s.toolBudget !== undefined || params.toolBudget !== undefined || a.toolBudget !== undefined || params.configToolBudget !== undefined)
775
+ unsupported.push("tool budget");
776
+ if ((s.fast ?? params.fast ?? a.fast) === true)
777
+ unsupported.push("fast mode");
778
+ if (params.contextForAgent?.(s.agent) === "fork")
779
+ unsupported.push("fork context");
780
+ if (unsupported.length > 0)
781
+ throw new AsyncStartValidationError(`Agent '${a.name}' uses runner.type='${externalRunnerType}' and does not support: ${unsupported.join(", ")}.`);
782
+ }
783
+ try {
784
+ assertAgentAllowedByCapabilityCeiling(a.name, intersectSubagentCapabilityCeilings(params.capabilityCeiling, ctx.childRuntime?.capabilityCeiling));
785
+ }
786
+ catch (error) {
787
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
788
+ }
789
+ const toolBudgetInput = s.toolBudget ?? params.toolBudget ?? a.toolBudget ?? params.configToolBudget;
790
+ const resolvedToolBudget = validateToolBudgetConfig(toolBudgetInput, s.toolBudget ? "toolBudget" : a.toolBudget ? "agent.toolBudget" : "config.toolBudget");
791
+ if (resolvedToolBudget.error)
792
+ throw new AsyncStartValidationError(resolvedToolBudget.error);
793
+ const resolvedToolTimeout = resolveToolTimeoutMs({
794
+ callValue: params.callToolTimeoutMs,
795
+ agentValue: a.defaultToolTimeoutMs,
796
+ configValue: params.configToolTimeoutMs,
797
+ envValue: params.toolTimeoutMsEnv ?? toolTimeoutFromEnv(),
798
+ });
799
+ if (resolvedToolTimeout.error)
800
+ throw new AsyncStartValidationError(resolvedToolTimeout.error);
801
+ const launchPlan = planChildLaunch({
802
+ agentConfig: a,
803
+ stepOverrides: buildStepOverrides(s),
804
+ task: s.task,
805
+ originalTask,
806
+ runnerCwd,
807
+ runtimeCwd: ctx.cwd,
808
+ stepCwdInput: s.cwd,
809
+ behaviorCwd,
810
+ ...(machine ? { machineCwd: machine.cwd } : {}),
811
+ chainSkills,
812
+ outputBaseDir,
813
+ parallelOutputNamespace,
814
+ resolvedBehavior: effectiveBehavior,
815
+ });
816
+ const { stepCwd, instructionCwd, readExistenceCwd, behavior, namespaceOutputPath, outputPath, skillNames } = launchPlan;
817
+ const { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(skillNames, stepCwd, ctx.cwd, a.skillPath, a.filePath ? path.dirname(a.filePath) : stepCwd);
818
+ if (missingSkills.includes("pi-subagents"))
819
+ throw new UnavailableSubagentSkillError(UNAVAILABLE_SUBAGENT_SKILL_ERROR);
820
+ // A namespaced parallel output is injected by the runner, not the prompt.
821
+ const systemPrompt = buildEffectiveSystemPrompt({ agent: a, resolvedSkills, cwd: stepCwd, ...(!namespaceOutputPath && outputPath ? { outputPath } : {}) });
822
+ const readInstructions = buildChainInstructions({ ...behavior, output: false, progress: false }, instructionCwd, false, undefined, readExistenceCwd);
823
+ const isFirstProgressAgent = behavior.progress && !progressPrecreated && !progressInstructionCreated;
824
+ if (behavior.progress)
825
+ progressInstructionCreated = true;
826
+ const progressInstructions = buildChainInstructions({ ...behavior, output: false, reads: false }, progressDir, isFirstProgressAgent);
827
+ const validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Async step (${s.agent})`);
828
+ if (validationError)
829
+ throw new AsyncStartValidationError(validationError);
830
+ let taskTemplate = s.task ?? "{previous}";
831
+ taskTemplate = taskTemplate.replace(/\{task\}/g, originalTask ?? "");
832
+ taskTemplate = taskTemplate.replace(/\{chain_dir\}/g, behaviorCwd ?? runnerCwd);
833
+ const taskText = `${readInstructions.prefix}${taskTemplate}${progressInstructions.suffix}`;
834
+ const task = namespaceOutputPath ? taskText : injectSingleOutputInstruction(taskText, outputPath, a);
835
+ const modelScopes = resolveModelScopesForAgent(ctx.modelScope, a.name, ctx.currentModel);
836
+ const modelOrigin = resolveModelOrigin({ explicitModel: s.model, agentModel: a.model, parentModel: ctx.currentModel });
837
+ const primaryModelFromParent = modelOrigin === "inherited";
838
+ const primaryModel = externalRunner ? undefined : resolveEffectiveSubagentModel(s.model, a.model, ctx.currentModel, availableModels, a.modelProvider ?? ctx.currentModelProvider, { scope: modelScopes, source: modelOrigin === "explicit" ? "explicit" : "inherited" });
839
+ const thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];
840
+ const effectiveThinking = externalRunner ? undefined : thinkingOverride ?? a.thinking;
841
+ const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);
842
+ const contextLimit = model ? findModelInfo(model, availableModels, a.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
843
+ const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(params.thinkingCeiling, a.maxThinking, ctx.childRuntime?.thinkingCeiling);
844
+ if (!externalRunner) {
845
+ try {
846
+ assertThinkingWithinCeiling({ model, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: a.name, runId: id });
847
+ }
848
+ catch (error) {
849
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
850
+ }
851
+ }
852
+ const agentContract = s.agentContract ?? params.agentContract;
853
+ const permissionRules = resolvePermissionRules(ctx.permissions, a.permissions);
854
+ let selectedModel = model;
855
+ let requestedModel;
856
+ if (!externalRunner) {
857
+ try {
858
+ const modelEvidence = resolveModelSelection(primaryModel, availableModels, a.modelProvider ?? ctx.currentModelProvider, {
859
+ scope: modelScopes,
860
+ primaryModelFromParent,
861
+ origin: modelOrigin,
862
+ });
863
+ requestedModel = modelEvidence.requestedModel;
864
+ selectedModel = applyThinkingSuffix(modelEvidence.model, effectiveThinking, thinkingOverride !== undefined);
865
+ assertThinkingWithinCeiling({ model: selectedModel, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: a.name, runId: id });
866
+ }
867
+ catch (error) {
868
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
869
+ }
870
+ }
871
+ const launchRuleError = applyWatchdogLaunchRules({ cwd: machine ? runnerCwd : stepCwd, agent: a.name, model: selectedModel, warn: (violation) => sendRuleViolationWarning(ctx.pi, violation) });
872
+ if (launchRuleError)
873
+ throw new AsyncStartValidationError(launchRuleError);
874
+ const fast = s.fast ?? params.fast ?? a.fast;
875
+ const requiredExtensions = externalRunner ? [] : ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
876
+ const toolPlan = resolvePiLaunchToolPlan({
877
+ tools: a.tools,
878
+ excludeTools: a.excludeTools,
879
+ allowNestedSubagents: a.allowNestedSubagents,
880
+ extensions: a.extensions,
881
+ subagentOnlyExtensions: a.subagentOnlyExtensions,
882
+ requiredExtensions,
883
+ mcpDirectTools: a.mcpDirectTools,
884
+ cwd: stepCwd,
885
+ requireReadTool: Boolean(resolvedSkills.length),
886
+ structuredOutput: Boolean(behavior.outputSchema),
887
+ fast,
888
+ model: selectedModel,
889
+ capabilityCeiling: params.capabilityCeiling,
890
+ inheritedCapabilityCeiling: ctx.childRuntime?.capabilityCeiling,
891
+ agentName: a.name,
892
+ permissionRules,
893
+ runtimeSnapshotHost: ctx.pi,
894
+ });
895
+ const launchResolvedExtensions = externalRunner ? undefined : projectLaunchResolvedChildExtensions(toolPlan);
896
+ if (externalRunner && permissionRules) {
897
+ throw new AsyncStartValidationError(`Agent '${a.name}' uses runner.type='${externalRunnerType}', which cannot enforce native Pi child permission rules.`);
898
+ }
899
+ return {
900
+ parentSessionId: launchParentSessionId,
901
+ permissionRules,
902
+ ...(params.capabilityCeiling ? { capabilityCeiling: params.capabilityCeiling } : {}),
903
+ ...(runFanoutPath ? { runFanoutPath } : {}),
904
+ agent: s.agent,
905
+ task,
906
+ ...(a.runner ? { runner: a.runner } : {}),
907
+ ...(machine ? { machine } : {}),
908
+ ...(machineEnv ? { machineEnv } : {}),
909
+ ...(params.contextForAgent ? { context: params.contextForAgent(s.agent) } : {}),
910
+ ...(agentContract ? { agentContract } : {}),
911
+ phase: s.phase,
912
+ label: s.label,
913
+ outputName: s.as,
914
+ structured: Boolean(behavior.outputSchema),
915
+ cwd: stepCwd,
916
+ requestedCwd: machine ? machine.cwd : s.cwd ?? stepCwd,
917
+ model: selectedModel,
918
+ ...(contextLimit !== undefined ? { contextLimit } : {}),
919
+ ...(fast !== undefined ? { fast } : {}),
920
+ thinking: resolveEffectiveThinking(selectedModel, effectiveThinking),
921
+ ...(thinkingCeiling ? { thinkingCeiling } : {}),
922
+ launchResolvedExtensions,
923
+ ...(requestedModel ? { requestedModel } : {}),
924
+ ...(primaryModelFromParent ? { skipPrimaryModelVerification: true } : {}),
925
+ ...(availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {}),
926
+ ...(ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {}),
927
+ tools: a.tools,
928
+ excludeTools: a.excludeTools,
929
+ allowNestedSubagents: a.allowNestedSubagents,
930
+ allowedAgents: a.allowedAgents,
931
+ extensions: a.extensions,
932
+ subagentOnlyExtensions: a.subagentOnlyExtensions,
933
+ ...(!externalRunner ? { requiredExtensions } : {}),
934
+ mcpDirectTools: a.mcpDirectTools,
935
+ mutationTools: a.mutationTools,
936
+ systemPrompt,
937
+ systemPromptMode: a.systemPromptMode,
938
+ inheritProjectContext: a.inheritProjectContext,
939
+ inheritGlobalContext: a.inheritGlobalContext,
940
+ inheritSkills: a.inheritSkills,
941
+ skills: resolvedSkills.map((r) => r.name),
942
+ outputPath,
943
+ ...(namespaceOutputPath ? { namespaceOutputPath: true } : {}),
944
+ outputMode: behavior.outputMode,
945
+ sessionFile,
946
+ maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, a.maxSubagentDepth),
947
+ timeoutMs: a.defaultTimeoutMs ?? DEFAULT_ASYNC_TIMEOUT_MS,
948
+ toolTimeoutMs: resolvedToolTimeout.toolTimeoutMs,
949
+ waitToolEnabled: params.waitToolEnabled,
950
+ waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
951
+ effectiveAcceptance: resolveEffectiveAcceptance({
952
+ explicit: s.acceptance,
953
+ agentName: s.agent,
954
+ acceptanceRole: a.acceptanceRole,
955
+ task,
956
+ mode: resultMode,
957
+ async: true,
958
+ dynamic: false,
959
+ agentContract,
960
+ }),
961
+ acceptanceInput: s.acceptance,
962
+ acceptanceRole: a.acceptanceRole,
963
+ ...(s.gateOn ? { gateOn: s.gateOn } : {}),
964
+ ...(behavior.outputSchema ? { structuredOutputSchema: behavior.outputSchema } : {}),
965
+ ...(behavior.outputSchema ? { structuredOutput: createStructuredOutputRuntime(behavior.outputSchema, path.join(asyncDir, "structured-output"), { acceptanceReport: resolveAcceptanceReportMode(s.acceptance) }) } : {}),
966
+ ...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),
967
+ ...(s.worktree ? { worktree: true } : {}),
968
+ };
969
+ };
970
+ let flatStepIndex = 0;
971
+ const nextFlatStep = () => {
972
+ const index = flatStepIndex;
973
+ const sessionFile = sessionFilesByFlatIndex?.[flatStepIndex];
974
+ const thinkingOverride = thinkingOverridesByFlatIndex?.[flatStepIndex];
975
+ flatStepIndex++;
976
+ return {
977
+ index,
978
+ ...(sessionFile ? { sessionFile } : {}),
979
+ ...(thinkingOverride ? { thinkingOverride } : {}),
980
+ };
981
+ };
982
+ try {
983
+ const builtSteps = chain.map((s, stepIndex) => {
984
+ if (isParallelStep(s)) {
985
+ const parallelBehaviors = s.parallel.map((task) => {
986
+ const agent = agents.find((candidate) => candidate.name === task.agent);
987
+ return suppressProgressForReadOnlyTask(resolveStepBehavior(agent, buildStepOverrides(task), chainSkills), task.task, originalTask);
988
+ });
989
+ const progressPrecreated = parallelBehaviors.some((behavior) => behavior.progress);
990
+ if (progressPrecreated) {
991
+ if (!s.worktree || params.progressDir)
992
+ writeInitialProgressFile(progressDir);
993
+ progressInstructionCreated = true;
994
+ }
995
+ return {
996
+ parallel: s.parallel.map((t, taskIndex) => {
997
+ let behaviorCwd;
998
+ if (s.worktree && managedWorktreeProvider === "worktrunk") {
999
+ behaviorCwd = WORKTREE_AGENT_CWD_PLACEHOLDER;
1000
+ }
1001
+ else if (s.worktree && managedWorktreeProvider === "native") {
1002
+ try {
1003
+ behaviorCwd = resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s${stepIndex}`, taskIndex, worktreeBaseDir);
1004
+ }
1005
+ catch {
1006
+ behaviorCwd = undefined;
1007
+ }
1008
+ }
1009
+ const staticStep = nextFlatStep();
1010
+ return buildSeqStep({ ...t, machine: t.machine ?? s.machine, worktree: s.worktree, agentContract: t.agentContract ?? s.agentContract, gateOn: t.gateOn ?? s.gateOn }, staticStep.sessionFile, behaviorCwd, progressPrecreated, parallelBehaviors[taskIndex], staticStep.index, { stepIndex, taskIndex }, resultMode === "parallel" ? `tasks[${taskIndex}]` : `chain[${stepIndex}].parallel[${taskIndex}]`);
1011
+ }),
1012
+ concurrency: s.concurrency,
1013
+ failFast: s.failFast,
1014
+ worktree: s.worktree,
1015
+ };
1016
+ }
1017
+ if (isDynamicParallelStep(s)) {
1018
+ const agent = agents.find((candidate) => candidate.name === s.parallel.agent);
1019
+ const behavior = suppressProgressForReadOnlyTask(resolveStepBehavior(agent, buildStepOverrides(s.parallel), chainSkills), s.parallel.task, originalTask);
1020
+ const progressPrecreated = behavior.progress;
1021
+ if (progressPrecreated) {
1022
+ writeInitialProgressFile(progressDir);
1023
+ progressInstructionCreated = true;
1024
+ }
1025
+ const maxItems = s.expand.maxItems ?? params.dynamicFanoutMaxItems ?? 0;
1026
+ const dynamicFlatSteps = Array.from({ length: maxItems }, () => nextFlatStep());
1027
+ const parallel = buildSeqStep({ ...s.parallel, agentContract: s.parallel.agentContract ?? s.agentContract, gateOn: s.parallel.gateOn ?? s.gateOn }, undefined, undefined, progressPrecreated, behavior, undefined, { stepIndex });
1028
+ return {
1029
+ expand: s.expand,
1030
+ parallel,
1031
+ collect: s.collect,
1032
+ concurrency: s.concurrency,
1033
+ failFast: s.failFast,
1034
+ phase: s.phase,
1035
+ label: s.label,
1036
+ sessionFiles: dynamicFlatSteps.map((step) => step.sessionFile),
1037
+ thinkingOverrides: dynamicFlatSteps.map((step) => step.thinkingOverride),
1038
+ effectiveAcceptance: resolveEffectiveAcceptance({
1039
+ explicit: s.acceptance,
1040
+ agentName: s.parallel.agent,
1041
+ acceptanceRole: agent.acceptanceRole,
1042
+ task: parallel.task,
1043
+ mode: resultMode,
1044
+ async: true,
1045
+ dynamicGroup: true,
1046
+ agentContract: s.agentContract ?? params.agentContract,
1047
+ }),
1048
+ acceptanceInput: s.acceptance,
1049
+ acceptanceRole: agent.acceptanceRole,
1050
+ ...(s.agentContract ?? params.agentContract ? { agentContract: s.agentContract ?? params.agentContract } : {}),
1051
+ ...(s.gateOn ? { gateOn: s.gateOn } : {}),
1052
+ ...(parallel.thinkingCeiling ? { thinkingCeiling: parallel.thinkingCeiling } : {}),
1053
+ };
1054
+ }
1055
+ const sequential = s;
1056
+ let behaviorCwd;
1057
+ if (sequential.worktree && managedWorktreeProvider === "worktrunk") {
1058
+ behaviorCwd = WORKTREE_AGENT_CWD_PLACEHOLDER;
1059
+ }
1060
+ else if (sequential.worktree && managedWorktreeProvider === "native") {
1061
+ try {
1062
+ behaviorCwd = resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s${stepIndex}`, 0, worktreeBaseDir);
1063
+ }
1064
+ catch {
1065
+ behaviorCwd = undefined;
1066
+ }
1067
+ }
1068
+ const staticStep = nextFlatStep();
1069
+ return buildSeqStep(sequential, staticStep.sessionFile, behaviorCwd, false, undefined, staticStep.index, undefined, `chain[${stepIndex}]`);
1070
+ });
1071
+ const steps = params.attachRoot
1072
+ ? [{
1073
+ parentSessionId: launchParentSessionId,
1074
+ agent: params.attachRoot.agent,
1075
+ task: "",
1076
+ label: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,
1077
+ outputName: params.attachRoot.outputName,
1078
+ importAsyncRoot: {
1079
+ runId: params.attachRoot.runId,
1080
+ asyncDir: params.attachRoot.asyncDir,
1081
+ resultPath: params.attachRoot.resultPath,
1082
+ index: params.attachRoot.index,
1083
+ },
1084
+ inheritProjectContext: false,
1085
+ inheritGlobalContext: false,
1086
+ inheritSkills: false,
1087
+ }, ...builtSteps]
1088
+ : builtSteps;
1089
+ for (const step of steps) {
1090
+ if (!("parallel" in step) || !Array.isArray(step.parallel))
1091
+ continue;
1092
+ const seen = new Map();
1093
+ for (let index = 0; index < step.parallel.length; index++) {
1094
+ const task = step.parallel[index];
1095
+ if (!task.outputPath)
1096
+ continue;
1097
+ const previous = seen.get(task.outputPath);
1098
+ if (previous) {
1099
+ throw new AsyncStartValidationError(`Parallel tasks ${previous.index + 1} (${previous.agent}) and ${index + 1} (${task.agent}) resolve output to the same path: ${task.outputPath}. Use distinct output paths.`);
1100
+ }
1101
+ seen.set(task.outputPath, { index, agent: task.agent });
1102
+ }
1103
+ }
1104
+ return { steps: steps, runnerCwd, workflowGraph, eventChain: graphChain, ...(originalTask !== undefined ? { originalTask } : {}) };
1105
+ }
1106
+ catch (error) {
1107
+ if (error instanceof UnavailableSubagentSkillError || error instanceof AsyncStartValidationError)
1108
+ return { error: error.message };
1109
+ throw error;
1110
+ }
1111
+ }
1112
+ /**
1113
+ * Execute a chain asynchronously
1114
+ */
1115
+ export function executeAsyncChain(id, params) {
1116
+ const { chain, agents, ctx, cwd, maxOutput, artifactsDir, artifactConfig, shareEnabled, sessionRoot, sessionFilesByFlatIndex, thinkingOverridesByFlatIndex, maxSubagentDepth, worktreeSetupHook, worktreeSetupHookTimeoutMs, worktreeBaseDir, baseRef, worktreeProvider, worktreeBranchPrefix, controlConfig, controlIntercomTarget, childIntercomTarget, nestedRoute, } = params;
1117
+ const resultMode = params.resultMode ?? "chain";
1118
+ const acceptanceErrors = validateExecutionAcceptance({
1119
+ chain: projectChainOutputSchemas(chain, agents, (step, outputSchema) => ({ acceptance: step.acceptance, outputSchema }), (step, parallel) => Array.isArray(step.parallel) ? { parallel } : { acceptance: "acceptance" in step ? step.acceptance : undefined, parallel }),
1120
+ });
1121
+ if (acceptanceErrors.length > 0)
1122
+ return formatAsyncStartError(resultMode, acceptanceErrors.join(" "));
1123
+ const capabilityCeiling = params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId);
1124
+ const inheritedNestedRoute = inheritedNestedRouteOf(ctx.childRuntime);
1125
+ const nestedAddress = inheritedNestedRoute ? inheritedNestedParentAddressOf(ctx.childRuntime) : undefined;
1126
+ const asyncDir = inheritedNestedRoute
1127
+ ? path.join(TEMP_ROOT_DIR, "nested-subagent-runs", inheritedNestedRoute.rootRunId, id)
1128
+ : path.join(DIRS.async, id);
1129
+ let runFanoutBudget;
1130
+ try {
1131
+ runFanoutBudget = params.runFanoutBudget ?? createRunFanoutBudget(id, 64);
1132
+ fs.mkdirSync(asyncDir, { recursive: true });
1133
+ writeRunFanoutBudgetDescriptor(asyncDir, runFanoutBudget);
1134
+ }
1135
+ catch (error) {
1136
+ const message = error instanceof Error ? error.message : String(error);
1137
+ return {
1138
+ content: [{ type: "text", text: `Failed to create async run directory '${asyncDir}': ${message}` }],
1139
+ isError: true,
1140
+ details: { mode: resultMode, results: [] },
1141
+ };
1142
+ }
1143
+ const built = buildAsyncRunnerSteps(id, {
1144
+ chain,
1145
+ task: params.task,
1146
+ attachRoot: params.attachRoot,
1147
+ resultMode,
1148
+ agents,
1149
+ unknownAgentDiagnosticContext: params.unknownAgentDiagnosticContext,
1150
+ ctx,
1151
+ availableModels: params.availableModels,
1152
+ cwd,
1153
+ chainSkills: params.chainSkills,
1154
+ machine: params.machine,
1155
+ machineCwd: params.machineCwd,
1156
+ sessionFilesByFlatIndex,
1157
+ thinkingOverridesByFlatIndex,
1158
+ contextForAgent: params.contextForAgent,
1159
+ progressDir: params.progressDir ?? (artifactsDir ? path.join(artifactsDir, "progress", id) : resultMode === "parallel" ? path.join(asyncDir, "progress") : undefined),
1160
+ agentContract: params.agentContract,
1161
+ outputBaseDir: artifactsDir ? path.join(artifactsDir, "outputs", id) : undefined,
1162
+ dynamicFanoutMaxItems: params.dynamicFanoutMaxItems,
1163
+ maxSubagentDepth,
1164
+ waitToolEnabled: params.waitToolEnabled,
1165
+ waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
1166
+ worktreeBaseDir,
1167
+ worktreeProvider,
1168
+ worktreeBranchPrefix,
1169
+ asyncDir,
1170
+ fast: params.fast,
1171
+ toolBudget: params.toolBudget,
1172
+ configToolBudget: params.configToolBudget,
1173
+ callToolTimeoutMs: params.callToolTimeoutMs,
1174
+ configToolTimeoutMs: params.configToolTimeoutMs,
1175
+ toolTimeoutMsEnv: params.toolTimeoutMsEnv ?? toolTimeoutFromEnv(),
1176
+ capabilityCeiling,
1177
+ thinkingCeiling: params.thinkingCeiling,
1178
+ });
1179
+ if ("error" in built) {
1180
+ try {
1181
+ fs.rmSync(asyncDir, { recursive: true, force: true });
1182
+ }
1183
+ catch {
1184
+ // Best-effort cleanup for validation failures before the runner is spawned.
1185
+ }
1186
+ return formatAsyncStartError(resultMode, built.error);
1187
+ }
1188
+ const { steps, runnerCwd, workflowGraph, eventChain } = built;
1189
+ const deadlineAt = params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined;
1190
+ const initialUsageBudget = usageBudgetState(params.usageBudget, undefined);
1191
+ let childTargetIndex = 0;
1192
+ const childIntercomTargets = childIntercomTarget ? steps.flatMap((step) => {
1193
+ if (!("parallel" in step) && "importAsyncRoot" in step && step.importAsyncRoot) {
1194
+ childTargetIndex++;
1195
+ return [undefined];
1196
+ }
1197
+ if ("parallel" in step) {
1198
+ if (!Array.isArray(step.parallel)) {
1199
+ childTargetIndex++;
1200
+ return [undefined];
1201
+ }
1202
+ return step.parallel.map((task) => childIntercomTarget(task.agent, childTargetIndex++));
1203
+ }
1204
+ return "agent" in step ? [childIntercomTarget(step.agent, childTargetIndex++)] : [undefined];
1205
+ }) : undefined;
1206
+ const initialStatusSteps = eventChain.flatMap((step) => isParallelStep(step)
1207
+ ? step.parallel.map((task) => ({ agent: task.agent, ...(statusStepDescription(task.task) ? { description: statusStepDescription(task.task) } : {}), ...(task.label ? { label: task.label } : {}), ...(task.as ? { outputName: task.as } : {}), status: "pending" }))
1208
+ : isDynamicParallelStep(step)
1209
+ ? [{ agent: `expand:${step.parallel.agent}`, label: step.label ?? step.parallel.label ?? `Dynamic fanout (${step.collect.as})`, outputName: step.collect.as, status: "pending" }]
1210
+ : [{ agent: step.agent, ...(statusStepDescription(step.task) ? { description: statusStepDescription(step.task) } : {}), ...(step.label ? { label: step.label } : {}), ...(step.as ? { outputName: step.as } : {}), status: "pending" }]);
1211
+ const initialParallelGroups = [];
1212
+ let initialFlatIndex = 0;
1213
+ for (let stepIndex = 0; stepIndex < eventChain.length; stepIndex++) {
1214
+ const step = eventChain[stepIndex];
1215
+ if (isParallelStep(step))
1216
+ initialParallelGroups.push({ start: initialFlatIndex, count: step.parallel.length, stepIndex });
1217
+ else if (isDynamicParallelStep(step))
1218
+ initialParallelGroups.push({ start: initialFlatIndex, count: 1, stepIndex });
1219
+ initialFlatIndex += isParallelStep(step) ? step.parallel.length : 1;
1220
+ }
1221
+ const initialStatusAt = Date.now();
1222
+ const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1223
+ const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
1224
+ let spawnResult = {};
1225
+ try {
1226
+ spawnResult = spawnRunner({
1227
+ id,
1228
+ steps,
1229
+ resultPath: inheritedNestedRoute ? nestedResultsPath(inheritedNestedRoute.rootRunId, id) : resultFilePath(DIRS.results, id),
1230
+ cwd: runnerCwd,
1231
+ placeholder: "{previous}",
1232
+ maxOutput,
1233
+ artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1234
+ artifactConfig,
1235
+ share: shareEnabled,
1236
+ sessionDir: sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined,
1237
+ asyncDir,
1238
+ sessionId: ctx.currentSessionId,
1239
+ completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1240
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1241
+ piPackageRoot,
1242
+ childSessionFactoryModule: childSessionFactoryModule(),
1243
+ inheritedChildRuntime: inheritedChildRuntime(ctx.childRuntime),
1244
+ worktreeSetupHook,
1245
+ worktreeSetupHookTimeoutMs,
1246
+ worktreeBaseDir,
1247
+ baseRef,
1248
+ worktreeProvider,
1249
+ worktreeBranchPrefix,
1250
+ controlConfig,
1251
+ toolBudget: params.toolBudget,
1252
+ usageBudget: params.usageBudget,
1253
+ controlIntercomTarget,
1254
+ childIntercomTargets,
1255
+ resultMode,
1256
+ dynamicFanoutMaxItems: params.dynamicFanoutMaxItems,
1257
+ timeoutMs: params.timeoutMs,
1258
+ deadlineAt,
1259
+ globalConcurrencyLimit: params.globalConcurrencyLimit,
1260
+ runFanoutBudget,
1261
+ workflowGraph,
1262
+ ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
1263
+ ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}),
1264
+ nestedRoute: nestedRoute ?? inheritedNestedRoute,
1265
+ nestedSelf: inheritedNestedRoute && nestedAddress ? {
1266
+ parentRunId: nestedAddress.parentRunId,
1267
+ parentStepIndex: nestedAddress.parentStepIndex,
1268
+ depth: nestedAddress.depth,
1269
+ path: nestedAddress.path,
1270
+ } : undefined,
1271
+ }, id, runnerCwd, {
1272
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1273
+ runId: id,
1274
+ ...(ctx.currentSessionId ? { sessionId: ctx.currentSessionId } : {}),
1275
+ ...(initialCompletionOwnerId ? { completionOwnerId: initialCompletionOwnerId } : {}),
1276
+ mode: resultMode,
1277
+ state: "running",
1278
+ startedAt: initialStatusAt,
1279
+ lastUpdate: initialStatusAt,
1280
+ currentStep: 0,
1281
+ chainStepCount: eventChain.length,
1282
+ ...(initialParallelGroups.length ? { parallelGroups: initialParallelGroups } : {}),
1283
+ steps: initialStatusSteps,
1284
+ }, path.join(asyncDir, "status.json"), launchParentSessionId, (proof) => emitProcessTerminalEvent(ctx, proof), (runnerProcessInstanceId) => params.activeAsyncCapacity?.markStarted(runnerProcessInstanceId));
1285
+ }
1286
+ catch (error) {
1287
+ params.activeAsyncCapacity?.rollback();
1288
+ const message = error instanceof Error ? error.message : String(error);
1289
+ return formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${message}`);
1290
+ }
1291
+ if (spawnResult.error) {
1292
+ if (spawnResult.startupDidNotProceed) {
1293
+ if (!spawnResult.runnerProcessInstanceId || params.activeAsyncCapacity?.rollbackBeforeRunnerProceed(spawnResult.runnerProcessInstanceId) !== true)
1294
+ params.activeAsyncCapacity?.rollback();
1295
+ }
1296
+ else if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId)
1297
+ params.activeAsyncCapacity?.rollback();
1298
+ else
1299
+ params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
1300
+ return formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${spawnResult.error}`);
1301
+ }
1302
+ if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId) {
1303
+ params.activeAsyncCapacity?.rollback();
1304
+ return formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': runner identity unavailable`);
1305
+ }
1306
+ if (spawnResult.pid) {
1307
+ const eventFirstStep = eventChain[0];
1308
+ if (!eventFirstStep) {
1309
+ return formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': event chain has no steps`);
1310
+ }
1311
+ const firstAgents = isParallelStep(eventFirstStep)
1312
+ ? eventFirstStep.parallel.map((t) => t.agent)
1313
+ : isDynamicParallelStep(eventFirstStep)
1314
+ ? [eventFirstStep.parallel.agent]
1315
+ : [eventFirstStep.agent];
1316
+ const firstTask = isParallelStep(eventFirstStep)
1317
+ ? eventFirstStep.parallel[0]?.task
1318
+ : isDynamicParallelStep(eventFirstStep)
1319
+ ? eventFirstStep.parallel.task
1320
+ : eventFirstStep.task;
1321
+ const workflowGoal = params.goal ?? (params.task?.trim() || firstTask);
1322
+ const parallelGroups = [];
1323
+ const flatAgents = [];
1324
+ let flatStepStart = 0;
1325
+ for (let stepIndex = 0; stepIndex < eventChain.length; stepIndex++) {
1326
+ const step = eventChain[stepIndex];
1327
+ if (isParallelStep(step)) {
1328
+ parallelGroups.push({ start: flatStepStart, count: step.parallel.length, stepIndex });
1329
+ flatAgents.push(...step.parallel.map((task) => task.agent));
1330
+ flatStepStart += step.parallel.length;
1331
+ }
1332
+ else if (isDynamicParallelStep(step)) {
1333
+ parallelGroups.push({ start: flatStepStart, count: 1, stepIndex });
1334
+ flatAgents.push(step.parallel.agent);
1335
+ flatStepStart++;
1336
+ }
1337
+ else {
1338
+ flatAgents.push(step.agent);
1339
+ flatStepStart++;
1340
+ }
1341
+ }
1342
+ if (inheritedNestedRoute && nestedAddress) {
1343
+ const now = Date.now();
1344
+ try {
1345
+ writeNestedEvent(inheritedNestedRoute, {
1346
+ type: "subagent.nested.started",
1347
+ ts: now,
1348
+ parentRunId: nestedAddress.parentRunId,
1349
+ parentStepIndex: nestedAddress.parentStepIndex,
1350
+ child: {
1351
+ id,
1352
+ parentRunId: nestedAddress.parentRunId,
1353
+ parentStepIndex: nestedAddress.parentStepIndex,
1354
+ depth: nestedAddress.depth,
1355
+ path: nestedAddress.path,
1356
+ asyncDir,
1357
+ pid: spawnResult.pid,
1358
+ ownerIntercomTarget: ctx.childRuntime?.intercomSessionName,
1359
+ leafIntercomTarget: childIntercomTargets?.[0],
1360
+ intercomTarget: childIntercomTargets?.[0],
1361
+ ownerState: "live",
1362
+ mode: resultMode,
1363
+ state: "running",
1364
+ agent: firstAgents[0],
1365
+ agents: flatAgents,
1366
+ chainStepCount: eventChain.length,
1367
+ parallelGroups,
1368
+ ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),
1369
+ startedAt: now,
1370
+ lastUpdate: now,
1371
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1372
+ },
1373
+ });
1374
+ }
1375
+ catch (error) {
1376
+ console.error("Failed to emit nested async start event:", error);
1377
+ }
1378
+ }
1379
+ ctx.pi.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {
1380
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1381
+ id,
1382
+ pid: spawnResult.pid,
1383
+ sessionId: ctx.currentSessionId,
1384
+ completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1385
+ mode: resultMode,
1386
+ agent: firstAgents[0],
1387
+ agents: flatAgents,
1388
+ task: firstTask?.trim() ? PROMPT_REDACTED : undefined,
1389
+ goal: workflowGoal?.trim() ? PROMPT_REDACTED : undefined,
1390
+ chain: eventChain.map((s) => isParallelStep(s) ? `[${s.parallel.map((t) => t.agent).join("+")}]` : isDynamicParallelStep(s) ? `expand:${s.parallel.agent}` : s.agent),
1391
+ chainStepCount: eventChain.length,
1392
+ parallelGroups,
1393
+ workflowGraph,
1394
+ cwd: runnerCwd,
1395
+ asyncDir,
1396
+ ...(sessionRoot ? { sessionRoot } : {}),
1397
+ ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),
1398
+ ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}),
1399
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1400
+ ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
1401
+ ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}),
1402
+ nestedRoute,
1403
+ });
1404
+ }
1405
+ const chainDesc = chain
1406
+ .map((s) => isParallelStep(s) ? `[${s.parallel.map((t) => t.agent).join("+")}]` : isDynamicParallelStep(s) ? `expand:${s.parallel.agent}` : s.agent)
1407
+ .join(" -> ");
1408
+ return {
1409
+ content: [{ type: "text", text: formatAsyncStartedMessage(`Async ${resultMode}: ${chainDesc} [${id}]`, ctx.interactive === true) }],
1410
+ details: { mode: resultMode, runId: id, results: [], asyncId: id, asyncDir, workflowGraph, ...(capabilityCeiling ? { capabilityCeiling } : {}), ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}), ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}), ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}), ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}) },
1411
+ };
1412
+ }
1413
+ /**
1414
+ * Execute a single agent asynchronously
1415
+ */
1416
+ export function workflowAwaitedAsyncResultPath(asyncDir) {
1417
+ return path.join(asyncDir, "workflow-result.json");
1418
+ }
1419
+ export function executeAsyncSingle(id, params) {
1420
+ const { agent, agentConfig, ctx, cwd, maxOutput, artifactsDir, artifactConfig, shareEnabled, sessionRoot, sessionFile, maxSubagentDepth, worktreeSetupHook, worktreeSetupHookTimeoutMs, worktreeBaseDir, baseRef, worktreeProvider, worktreeBranchPrefix, controlConfig, controlIntercomTarget, childIntercomTarget, nestedRoute, } = params;
1421
+ let lane;
1422
+ try {
1423
+ lane = normalizeWorkflowLaneMetadata(params.lane, "lane");
1424
+ assertWorkflowLaneKey(lane, params.workflowKey, "lane");
1425
+ }
1426
+ catch (error) {
1427
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1428
+ }
1429
+ const task = params.task ?? "";
1430
+ let extensionBindings;
1431
+ try {
1432
+ extensionBindings = normalizeExtensionBindings(params.extensionBindings)?.value;
1433
+ }
1434
+ catch (error) {
1435
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1436
+ }
1437
+ const acceptanceErrors = validateAcceptanceInput(params.acceptance);
1438
+ if (acceptanceErrors.length > 0)
1439
+ return formatAsyncStartError("single", acceptanceErrors.join(" "));
1440
+ const externalRunner = agentConfig.runner?.type === "external-cli" || agentConfig.runner?.type === "external-job";
1441
+ const externalRunnerType = agentConfig.runner?.type;
1442
+ const permissionRules = resolvePermissionRules(ctx.permissions, agentConfig.permissions);
1443
+ if (externalRunner) {
1444
+ const unsupported = [];
1445
+ if (params.modelOverride !== undefined)
1446
+ unsupported.push("model override");
1447
+ if ((params.fast ?? agentConfig.fast) === true)
1448
+ unsupported.push("fast mode");
1449
+ if (params.thinkingOverride !== undefined)
1450
+ unsupported.push("thinking override");
1451
+ if (params.structuredOutputSchema !== undefined)
1452
+ unsupported.push("structured output");
1453
+ if (params.acceptance !== undefined || params.agentContract !== undefined)
1454
+ unsupported.push("acceptance/agent contract");
1455
+ if (params.toolBudget !== undefined || agentConfig.toolBudget !== undefined || params.configToolBudget !== undefined)
1456
+ unsupported.push("tool budget");
1457
+ if (params.context === "fork")
1458
+ unsupported.push("fork context");
1459
+ if ((params.skills?.length ?? 0) > 0)
1460
+ unsupported.push("skills");
1461
+ if (permissionRules)
1462
+ unsupported.push("native Pi child permissions");
1463
+ if (extensionBindings !== undefined)
1464
+ unsupported.push("extension bindings");
1465
+ if (unsupported.length > 0)
1466
+ return formatAsyncStartError("single", `Agent '${agentConfig.name}' uses runner.type='${externalRunnerType}' and does not support: ${unsupported.join(", ")}.`);
1467
+ }
1468
+ const capabilityCeiling = intersectSubagentCapabilityCeilings(params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId), ctx.childRuntime?.capabilityCeiling);
1469
+ try {
1470
+ assertAgentAllowedByCapabilityCeiling(agentConfig.name, capabilityCeiling);
1471
+ }
1472
+ catch (error) {
1473
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1474
+ }
1475
+ const runnerCwd = resolveChildCwd(ctx.cwd, cwd);
1476
+ const requestedMachine = params.machine ?? agentConfig.machine;
1477
+ const machineUnsupported = formatHerdrMachineRunnerUnsupported({ machine: requestedMachine, agentName: agentConfig.name, runnerType: agentConfig.runner?.type, adapter: agentConfig.runner?.type === "external-cli" ? agentConfig.runner.adapter : undefined, worktree: params.worktree });
1478
+ if (machineUnsupported)
1479
+ return formatAsyncStartError("single", machineUnsupported);
1480
+ let machine;
1481
+ let machineEnv;
1482
+ if (requestedMachine) {
1483
+ try {
1484
+ const placement = resolveHerdrMachinePlacement({ machine: requestedMachine, cwd: runnerCwd, stepCwd: params.machineCwd });
1485
+ machine = placement.machine;
1486
+ machineEnv = placement.env;
1487
+ }
1488
+ catch (error) {
1489
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1490
+ }
1491
+ }
1492
+ let managedWorktreeProvider;
1493
+ if (params.worktree === true) {
1494
+ try {
1495
+ const resolved = resolveWorktreeProvider(params.worktreeProvider, worktreeBaseDir);
1496
+ managedWorktreeProvider = shouldDeferWorktreeCwd(params.worktreeProvider, worktreeBaseDir) ? "worktrunk" : resolved;
1497
+ }
1498
+ catch (error) {
1499
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1500
+ }
1501
+ }
1502
+ const instructionCwd = params.worktree === true && managedWorktreeProvider === "worktrunk"
1503
+ ? WORKTREE_AGENT_CWD_PLACEHOLDER
1504
+ : params.worktree === true && managedWorktreeProvider === "native"
1505
+ ? resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s0`, 0, worktreeBaseDir)
1506
+ : machine?.cwd ?? runnerCwd;
1507
+ const readExistenceCwd = params.worktree === true ? runnerCwd : instructionCwd;
1508
+ const skillNames = params.skills ?? agentConfig.skills ?? [];
1509
+ const availableModels = params.availableModels;
1510
+ const { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(skillNames, runnerCwd, ctx.cwd, agentConfig.skillPath, agentConfig.filePath ? path.dirname(agentConfig.filePath) : runnerCwd);
1511
+ if (missingSkills.includes("pi-subagents"))
1512
+ return formatAsyncStartError("single", UNAVAILABLE_SUBAGENT_SKILL_ERROR);
1513
+ const inheritedNestedRoute = inheritedNestedRouteOf(ctx.childRuntime);
1514
+ const nestedAddress = inheritedNestedRoute ? inheritedNestedParentAddressOf(ctx.childRuntime) : undefined;
1515
+ const asyncDir = inheritedNestedRoute
1516
+ ? path.join(TEMP_ROOT_DIR, "nested-subagent-runs", inheritedNestedRoute.rootRunId, id)
1517
+ : path.join(DIRS.async, id);
1518
+ let runFanoutBudget;
1519
+ try {
1520
+ runFanoutBudget = params.runFanoutBudget ?? createRunFanoutBudget(id, 64);
1521
+ fs.mkdirSync(asyncDir, { recursive: true });
1522
+ writeRunFanoutBudgetDescriptor(asyncDir, runFanoutBudget);
1523
+ }
1524
+ catch (error) {
1525
+ const message = error instanceof Error ? error.message : String(error);
1526
+ return {
1527
+ content: [{ type: "text", text: `Failed to create async run directory '${asyncDir}': ${message}` }],
1528
+ isError: true,
1529
+ details: { mode: "single", results: [] },
1530
+ };
1531
+ }
1532
+ const effectiveOutput = normalizeSingleOutputOverride(params.output, agentConfig.output);
1533
+ const outputPath = resolveSingleOutputPath(effectiveOutput, ctx.cwd, instructionCwd, params.outputBaseDir ?? (artifactsDir ? path.join(artifactsDir, "outputs", id) : undefined));
1534
+ const systemPrompt = buildEffectiveSystemPrompt({ agent: agentConfig, resolvedSkills, cwd: runnerCwd, ...(outputPath ? { outputPath } : {}) });
1535
+ const outputMode = params.outputMode ?? agentConfig.outputMode ?? "inline";
1536
+ const validationError = validateFileOnlyOutputMode(outputMode, outputPath, `Async single run (${agent})`);
1537
+ if (validationError)
1538
+ return formatAsyncStartError("single", validationError);
1539
+ const taskWithOutputInstruction = injectSingleOutputInstruction(task, outputPath, agentConfig);
1540
+ // Reads: caller override > agent defaultReads > none. `~`/`~/` expand to home;
1541
+ // absolute paths pass through; relative paths resolve against the child cwd.
1542
+ const reads = params.reads !== undefined ? params.reads : agentConfig.defaultReads ?? false;
1543
+ const readPaths = Array.isArray(reads)
1544
+ ? machine
1545
+ ? externalRunner
1546
+ ? reads.map((read) => read === "~" || read.startsWith("~/") || path.posix.isAbsolute(read) ? read : path.posix.resolve(instructionCwd, read))
1547
+ : []
1548
+ : managedWorktreeProvider === "worktrunk"
1549
+ ? resolveExistingReadInstructionPaths(reads, instructionCwd, readExistenceCwd)
1550
+ : resolveExistingReadPaths(reads, readExistenceCwd)
1551
+ : [];
1552
+ const readsInstruction = readPaths.length > 0
1553
+ ? `[Read from: ${readPaths.join(", ")}]\n\n`
1554
+ : "";
1555
+ const taskText = readsInstruction + taskWithOutputInstruction;
1556
+ const modelScopes = resolveModelScopesForAgent(ctx.modelScope, agentConfig.name, ctx.currentModel);
1557
+ const modelOrigin = resolveModelOrigin({
1558
+ fromParent: params.modelOverrideFromParent,
1559
+ storedOrigin: params.modelOrigin,
1560
+ explicitModel: params.modelOverrideFromParent ? undefined : params.modelOverride,
1561
+ agentModel: agentConfig.model,
1562
+ parentModel: ctx.currentModel,
1563
+ });
1564
+ let primaryModel;
1565
+ try {
1566
+ primaryModel = externalRunner ? undefined : modelOrigin === "inherited"
1567
+ ? params.modelOverride ?? (ctx.currentModel ? `${ctx.currentModel.provider}/${ctx.currentModel.id}` : undefined)
1568
+ : resolveSubagentModelOverride(params.modelOverride ?? agentConfig.model, ctx.currentModel, availableModels, ctx.currentModelProvider, { scope: modelScopes, source: modelOrigin === "explicit" ? "explicit" : "inherited" });
1569
+ }
1570
+ catch (error) {
1571
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1572
+ }
1573
+ const effectiveThinking = externalRunner ? undefined : params.thinkingOverride ?? agentConfig.thinking;
1574
+ const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, params.thinkingOverride !== undefined);
1575
+ const contextLimit = model ? findModelInfo(model, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
1576
+ const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(params.thinkingCeiling, agentConfig.maxThinking, ctx.childRuntime?.thinkingCeiling);
1577
+ if (!externalRunner) {
1578
+ try {
1579
+ assertThinkingWithinCeiling({ model, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: agentConfig.name, runId: id });
1580
+ }
1581
+ catch (error) {
1582
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1583
+ }
1584
+ }
1585
+ const toolBudgetInput = params.toolBudget ?? agentConfig.toolBudget ?? params.configToolBudget;
1586
+ const resolvedToolBudget = validateToolBudgetConfig(toolBudgetInput, params.toolBudget ? "toolBudget" : agentConfig.toolBudget ? "agent.toolBudget" : "config.toolBudget");
1587
+ if (resolvedToolBudget.error)
1588
+ return formatAsyncStartError("single", resolvedToolBudget.error);
1589
+ const deadlineAt = params.absoluteDeadlineAt ?? (params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined);
1590
+ const timeoutMs = params.absoluteDeadlineAt !== undefined && deadlineAt !== undefined
1591
+ ? deadlineAt - Date.now()
1592
+ : params.timeoutMs;
1593
+ if (timeoutMs !== undefined && timeoutMs <= 0)
1594
+ return formatAsyncStartError("single", "The source run's absolute deadline expired before recovery could launch.");
1595
+ const resolvedToolTimeout = resolveToolTimeoutMs({
1596
+ callValue: params.toolTimeoutMs,
1597
+ agentValue: agentConfig.defaultToolTimeoutMs,
1598
+ configValue: params.configToolTimeoutMs,
1599
+ envValue: params.toolTimeoutMsEnv ?? toolTimeoutFromEnv(),
1600
+ });
1601
+ if (resolvedToolTimeout.error)
1602
+ return formatAsyncStartError("single", resolvedToolTimeout.error);
1603
+ const toolTimeoutMs = resolvedToolTimeout.toolTimeoutMs;
1604
+ const initialUsageBudget = usageBudgetState(params.usageBudget, undefined);
1605
+ const resolvedSessionDir = params.sessionDir ?? (sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined);
1606
+ const structuredOutput = params.structuredOutputSchema
1607
+ ? createStructuredOutputRuntime(params.structuredOutputSchema, path.join(asyncDir, "structured-output"), { acceptanceReport: resolveAcceptanceReportMode(params.acceptance) })
1608
+ : undefined;
1609
+ let selectedModel = model;
1610
+ let requestedModel;
1611
+ if (!externalRunner) {
1612
+ try {
1613
+ const modelEvidence = resolveModelSelection(primaryModel, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider, {
1614
+ scope: modelScopes,
1615
+ primaryModelFromParent: modelOrigin === "inherited",
1616
+ origin: modelOrigin,
1617
+ });
1618
+ requestedModel = modelEvidence.requestedModel;
1619
+ selectedModel = applyThinkingSuffix(modelEvidence.model, effectiveThinking, params.thinkingOverride !== undefined);
1620
+ assertThinkingWithinCeiling({ model: selectedModel, configThinking: effectiveThinking, ceiling: thinkingCeiling, agent: agentConfig.name, runId: id });
1621
+ }
1622
+ catch (error) {
1623
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1624
+ }
1625
+ }
1626
+ const requiredExtensions = externalRunner ? [] : params.requiredExtensions ?? ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
1627
+ const toolPlan = resolvePiLaunchToolPlan({
1628
+ tools: agentConfig.tools,
1629
+ excludeTools: agentConfig.excludeTools,
1630
+ allowNestedSubagents: agentConfig.allowNestedSubagents,
1631
+ extensions: agentConfig.extensions,
1632
+ subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
1633
+ requiredExtensions,
1634
+ mcpDirectTools: agentConfig.mcpDirectTools,
1635
+ cwd: runnerCwd,
1636
+ requireReadTool: Boolean(resolvedSkills.length),
1637
+ structuredOutput: Boolean(params.structuredOutputSchema),
1638
+ fast: params.fast ?? agentConfig.fast,
1639
+ model: selectedModel,
1640
+ capabilityCeiling,
1641
+ inheritedCapabilityCeiling: ctx.childRuntime?.capabilityCeiling,
1642
+ agentName: agentConfig.name,
1643
+ permissionRules: resolvePermissionRules(ctx.permissions, agentConfig.permissions),
1644
+ runtimeSnapshotHost: ctx.pi,
1645
+ });
1646
+ const launchResolvedExtensions = externalRunner ? undefined : projectLaunchResolvedChildExtensions(toolPlan);
1647
+ const fast = params.fast ?? agentConfig.fast;
1648
+ const launchThinking = resolveEffectiveThinking(selectedModel, effectiveThinking);
1649
+ const { definitionDigest, launchContractDigest } = resolveLaunchBinding({
1650
+ agent: agentConfig,
1651
+ task,
1652
+ model: selectedModel,
1653
+ ...(fast !== undefined ? { fast } : {}),
1654
+ ...(launchThinking ? { thinking: launchThinking } : {}),
1655
+ systemPrompt,
1656
+ skills: resolvedSkills.map((skill) => skill.name),
1657
+ toolPlan,
1658
+ ...(outputPath ? { outputPath } : {}),
1659
+ outputMode,
1660
+ ...(params.structuredOutputSchema ? { structuredOutputSchema: params.structuredOutputSchema } : {}),
1661
+ ...(extensionBindings ? { extensionBindings } : {}),
1662
+ });
1663
+ const resolvedAcceptance = resolveEffectiveAcceptance({
1664
+ explicit: params.acceptance,
1665
+ agentName: agent,
1666
+ acceptanceRole: agentConfig.acceptanceRole,
1667
+ task,
1668
+ mode: "single",
1669
+ async: true,
1670
+ agentContract: params.agentContract,
1671
+ });
1672
+ const recoveryAgentConfig = params.recoveryAgentConfig ?? agentConfig;
1673
+ const recoveryDescriptor = {
1674
+ ...(ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {}),
1675
+ version: 1,
1676
+ ...(lane ? { lane } : {}),
1677
+ launchContractDigest,
1678
+ ...(extensionBindings ? { extensionBindings } : {}),
1679
+ ...(requiredExtensions.length > 0 ? { requiredExtensions } : {}),
1680
+ runFanoutBudget,
1681
+ sourceRunId: id,
1682
+ ...(params.agentContract ? { agentContract: params.agentContract } : {}),
1683
+ agent,
1684
+ launchResolvedExtensions,
1685
+ ...(sessionFile ? { sessionFile } : {}),
1686
+ cwd: runnerCwd,
1687
+ ...(selectedModel ? { model: selectedModel } : {}),
1688
+ ...(params.fast ?? recoveryAgentConfig.fast ? { fast: params.fast ?? recoveryAgentConfig.fast } : {}),
1689
+ ...(recoveryAgentConfig.modelProvider ? { modelProvider: recoveryAgentConfig.modelProvider } : {}),
1690
+ ...(modelOrigin === "inherited" ? { modelOverrideFromParent: true } : {}),
1691
+ modelOrigin,
1692
+ ...(effectiveThinking ? { thinking: resolveEffectiveThinking(selectedModel, effectiveThinking) } : {}),
1693
+ ...(thinkingCeiling ? { thinkingCeiling } : {}),
1694
+ ...(recoveryAgentConfig.tools ? { tools: [...recoveryAgentConfig.tools] } : {}),
1695
+ ...(recoveryAgentConfig.excludeTools ? { excludeTools: [...recoveryAgentConfig.excludeTools] } : {}),
1696
+ ...(recoveryAgentConfig.allowNestedSubagents !== undefined ? { allowNestedSubagents: recoveryAgentConfig.allowNestedSubagents } : {}),
1697
+ ...(recoveryAgentConfig.allowedAgents !== undefined ? { allowedAgents: [...recoveryAgentConfig.allowedAgents] } : {}),
1698
+ ...(recoveryAgentConfig.extensions ? { extensions: [...recoveryAgentConfig.extensions] } : {}),
1699
+ ...(recoveryAgentConfig.subagentOnlyExtensions ? { subagentOnlyExtensions: [...recoveryAgentConfig.subagentOnlyExtensions] } : {}),
1700
+ ...(recoveryAgentConfig.mcpDirectTools ? { mcpDirectTools: [...recoveryAgentConfig.mcpDirectTools] } : {}),
1701
+ ...(recoveryAgentConfig.mutationTools ? { mutationTools: [...recoveryAgentConfig.mutationTools] } : {}),
1702
+ ...(recoveryAgentConfig.systemPrompt ? { systemPrompt: recoveryAgentConfig.systemPrompt } : {}),
1703
+ systemPromptMode: recoveryAgentConfig.systemPromptMode,
1704
+ inheritProjectContext: recoveryAgentConfig.inheritProjectContext,
1705
+ inheritGlobalContext: recoveryAgentConfig.inheritGlobalContext,
1706
+ inheritSkills: recoveryAgentConfig.inheritSkills,
1707
+ ...(resolvedSkills.length ? { skills: resolvedSkills.map((skill) => skill.name) } : {}),
1708
+ ...(recoveryAgentConfig.skillPath ? { skillPath: [...recoveryAgentConfig.skillPath] } : {}),
1709
+ ...(recoveryAgentConfig.filePath ? { agentFilePath: recoveryAgentConfig.filePath } : {}),
1710
+ ...(recoveryAgentConfig.memory ? { memory: { ...recoveryAgentConfig.memory } } : {}),
1711
+ ...(outputPath ? { outputPath } : {}),
1712
+ outputMode,
1713
+ ...(params.structuredOutputSchema ? { structuredOutputSchema: params.structuredOutputSchema } : {}),
1714
+ ...(params.acceptance !== undefined ? { acceptance: params.acceptance } : {}),
1715
+ ...(controlConfig ? { controlConfig } : {}),
1716
+ ...(params.context ? { context: params.context } : {}),
1717
+ ...(params.intercomBridge !== undefined ? { intercomBridge: params.intercomBridge } : {}),
1718
+ ...(params.baseRef !== undefined ? { baseRef: params.baseRef } : {}),
1719
+ ...(deadlineAt !== undefined ? { absoluteDeadlineAt: deadlineAt } : {}),
1720
+ ...(resolvedToolBudget.budget ? { initialToolBudget: resolvedToolBudget.budget } : {}),
1721
+ maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, recoveryAgentConfig.maxSubagentDepth),
1722
+ ...(maxOutput ? { maxOutput } : {}),
1723
+ share: shareEnabled,
1724
+ ...(resolvedSessionDir ? { sessionDir: resolvedSessionDir } : {}),
1725
+ ...(artifactsDir ? { artifactsDir } : {}),
1726
+ artifactConfig,
1727
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1728
+ };
1729
+ if (!externalRunner) {
1730
+ try {
1731
+ writePrivateAtomicJson(path.join(asyncDir, "recovery-descriptor.json"), recoveryDescriptor);
1732
+ }
1733
+ catch (error) {
1734
+ return formatAsyncStartError("single", `Failed to persist async recovery descriptor for '${id}': ${error instanceof Error ? error.message : String(error)}`);
1735
+ }
1736
+ }
1737
+ let spawnResultOrPromise = {};
1738
+ const initialStatusAt = Date.now();
1739
+ const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1740
+ const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
1741
+ try {
1742
+ spawnResultOrPromise = spawnRunner({
1743
+ id,
1744
+ steps: [
1745
+ {
1746
+ parentSessionId: launchParentSessionId,
1747
+ permissionRules,
1748
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1749
+ agent,
1750
+ task: taskText,
1751
+ ...(agentConfig.runner ? { runner: agentConfig.runner } : {}),
1752
+ ...(machine ? { machine } : {}),
1753
+ ...(!externalRunner && machine && params.reads !== undefined ? { remoteReads: params.reads } : {}),
1754
+ ...(machineEnv ? { machineEnv } : {}),
1755
+ ...(params.externalJobFollowUp ? { externalJobFollowUp: params.externalJobFollowUp } : {}),
1756
+ ...(params.context ? { context: params.context } : {}),
1757
+ cwd: machine?.cwd ?? runnerCwd,
1758
+ requestedCwd: machine?.cwd ?? params.requestedCwd ?? runnerCwd,
1759
+ model: selectedModel,
1760
+ ...(contextLimit !== undefined ? { contextLimit } : {}),
1761
+ ...(params.fast ?? agentConfig.fast ? { fast: params.fast ?? agentConfig.fast } : {}),
1762
+ thinking: resolveEffectiveThinking(selectedModel, effectiveThinking),
1763
+ ...(thinkingCeiling ? { thinkingCeiling } : {}),
1764
+ ...(requestedModel ? { requestedModel } : {}),
1765
+ ...(modelOrigin === "inherited" ? { skipPrimaryModelVerification: true } : {}),
1766
+ ...(availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {}),
1767
+ ...(ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {}),
1768
+ tools: agentConfig.tools,
1769
+ excludeTools: agentConfig.excludeTools,
1770
+ allowNestedSubagents: agentConfig.allowNestedSubagents,
1771
+ allowedAgents: agentConfig.allowedAgents,
1772
+ extensions: agentConfig.extensions,
1773
+ subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
1774
+ ...(!externalRunner ? { requiredExtensions } : {}),
1775
+ mcpDirectTools: agentConfig.mcpDirectTools,
1776
+ mutationTools: agentConfig.mutationTools,
1777
+ systemPrompt,
1778
+ systemPromptMode: agentConfig.systemPromptMode,
1779
+ inheritProjectContext: agentConfig.inheritProjectContext,
1780
+ inheritGlobalContext: agentConfig.inheritGlobalContext,
1781
+ inheritSkills: agentConfig.inheritSkills,
1782
+ skills: resolvedSkills.map((r) => r.name),
1783
+ outputPath,
1784
+ ...(params.outputClaimPath ? { outputClaimPath: params.outputClaimPath } : {}),
1785
+ outputMode,
1786
+ ...(!externalRunner && sessionFile ? { sessionFile } : {}),
1787
+ maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, agentConfig.maxSubagentDepth),
1788
+ waitToolEnabled: params.waitToolEnabled,
1789
+ waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
1790
+ ...(params.agentContract ? { agentContract: params.agentContract } : {}),
1791
+ definitionDigest,
1792
+ launchBindingTask: task,
1793
+ launchContractDigest,
1794
+ ...(extensionBindings ? { extensionBindings } : {}),
1795
+ launchResolvedExtensions,
1796
+ effectiveAcceptance: resolvedAcceptance,
1797
+ acceptanceInput: params.acceptance,
1798
+ ...(structuredOutput ? { structuredOutput } : {}),
1799
+ ...(params.structuredOutputSchema ? { structuredOutputSchema: params.structuredOutputSchema } : {}),
1800
+ ...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),
1801
+ ...(params.worktree === true ? { worktree: true } : {}),
1802
+ ...(lane ? { lane } : {}),
1803
+ },
1804
+ ],
1805
+ resultPath: params.parentWorkflowRunId !== undefined && (params.revivalLease !== undefined || params.workflowAwaitAsync === true)
1806
+ ? workflowAwaitedAsyncResultPath(asyncDir)
1807
+ : inheritedNestedRoute ? nestedResultsPath(inheritedNestedRoute.rootRunId, id) : resultFilePath(DIRS.results, id),
1808
+ cwd: runnerCwd,
1809
+ placeholder: "{previous}",
1810
+ maxOutput,
1811
+ artifactsDir: artifactConfig.enabled ? artifactsDir : undefined,
1812
+ artifactConfig,
1813
+ share: shareEnabled,
1814
+ sessionDir: resolvedSessionDir,
1815
+ asyncDir,
1816
+ sessionId: ctx.currentSessionId,
1817
+ completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1818
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1819
+ piPackageRoot,
1820
+ childSessionFactoryModule: childSessionFactoryModule(),
1821
+ inheritedChildRuntime: inheritedChildRuntime(ctx.childRuntime),
1822
+ worktreeSetupHook,
1823
+ worktreeSetupHookTimeoutMs,
1824
+ worktreeBaseDir,
1825
+ baseRef,
1826
+ worktreeProvider,
1827
+ worktreeBranchPrefix,
1828
+ controlConfig,
1829
+ timeoutMs,
1830
+ deadlineAt,
1831
+ toolTimeoutMs,
1832
+ checkpointBeforeDeadlineMs: params.checkpointBeforeDeadlineMs,
1833
+ toolBudget: params.toolBudget,
1834
+ usageBudget: params.usageBudget,
1835
+ controlIntercomTarget,
1836
+ childIntercomTargets: childIntercomTarget ? [childIntercomTarget(agent, 0)] : undefined,
1837
+ resultMode: "single",
1838
+ launchContractDigest,
1839
+ launchResolvedExtensions,
1840
+ runFanoutBudget,
1841
+ ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
1842
+ ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}),
1843
+ ...(lane ? { lane } : {}),
1844
+ ...(params.revivalLease ? { revivalLease: params.revivalLease } : {}),
1845
+ nestedRoute: nestedRoute ?? inheritedNestedRoute,
1846
+ nestedSelf: inheritedNestedRoute && nestedAddress ? {
1847
+ parentRunId: nestedAddress.parentRunId,
1848
+ parentStepIndex: nestedAddress.parentStepIndex,
1849
+ depth: nestedAddress.depth,
1850
+ path: nestedAddress.path,
1851
+ } : undefined,
1852
+ }, id, runnerCwd, {
1853
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1854
+ runId: id,
1855
+ ...(ctx.currentSessionId ? { sessionId: ctx.currentSessionId } : {}),
1856
+ ...(initialCompletionOwnerId ? { completionOwnerId: initialCompletionOwnerId } : {}),
1857
+ mode: "single",
1858
+ state: "running",
1859
+ startedAt: initialStatusAt,
1860
+ lastUpdate: initialStatusAt,
1861
+ currentStep: 0,
1862
+ chainStepCount: 1,
1863
+ ...(lane ? { lane } : {}),
1864
+ steps: [{ agent, status: "pending", ...(lane ? { lane } : {}), ...(model ? { model } : {}), ...(contextLimit !== undefined ? { contextLimit } : {}) }],
1865
+ }, path.join(asyncDir, "status.json"), launchParentSessionId, (proof) => emitProcessTerminalEvent(ctx, proof), (runnerProcessInstanceId) => params.activeAsyncCapacity?.markStarted(runnerProcessInstanceId), params.requestedCwd ?? runnerCwd);
1866
+ }
1867
+ catch (error) {
1868
+ params.activeAsyncCapacity?.rollback();
1869
+ const message = error instanceof Error ? error.message : String(error);
1870
+ return formatAsyncStartError("single", `Failed to start async run '${id}': ${message}`);
1871
+ }
1872
+ const finishSpawnResult = (spawnResult) => {
1873
+ if (spawnResult.error) {
1874
+ if (spawnResult.startupDidNotProceed) {
1875
+ if (!spawnResult.runnerProcessInstanceId || params.activeAsyncCapacity?.rollbackBeforeRunnerProceed(spawnResult.runnerProcessInstanceId) !== true)
1876
+ params.activeAsyncCapacity?.rollback();
1877
+ }
1878
+ else if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId)
1879
+ params.activeAsyncCapacity?.rollback();
1880
+ else
1881
+ params.activeAsyncCapacity?.markStarted(spawnResult.runnerProcessInstanceId);
1882
+ return formatAsyncStartError("single", `Failed to start async run '${id}': ${spawnResult.error}`);
1883
+ }
1884
+ if (!spawnResult.pid || !spawnResult.runnerProcessInstanceId) {
1885
+ params.activeAsyncCapacity?.rollback();
1886
+ return formatAsyncStartError("single", `Failed to start async run '${id}': runner identity unavailable`);
1887
+ }
1888
+ if (spawnResult.pid) {
1889
+ if (inheritedNestedRoute && nestedAddress) {
1890
+ const now = Date.now();
1891
+ try {
1892
+ writeNestedEvent(inheritedNestedRoute, {
1893
+ type: "subagent.nested.started",
1894
+ ts: now,
1895
+ parentRunId: nestedAddress.parentRunId,
1896
+ parentStepIndex: nestedAddress.parentStepIndex,
1897
+ child: {
1898
+ id,
1899
+ parentRunId: nestedAddress.parentRunId,
1900
+ parentStepIndex: nestedAddress.parentStepIndex,
1901
+ depth: nestedAddress.depth,
1902
+ path: nestedAddress.path,
1903
+ asyncDir,
1904
+ pid: spawnResult.pid,
1905
+ ownerIntercomTarget: ctx.childRuntime?.intercomSessionName,
1906
+ leafIntercomTarget: childIntercomTarget?.(agent, 0),
1907
+ intercomTarget: childIntercomTarget?.(agent, 0),
1908
+ ownerState: "live",
1909
+ mode: "single",
1910
+ state: "running",
1911
+ agent,
1912
+ agents: [agent],
1913
+ chainStepCount: 1,
1914
+ ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),
1915
+ startedAt: now,
1916
+ lastUpdate: now,
1917
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1918
+ },
1919
+ });
1920
+ }
1921
+ catch (error) {
1922
+ console.error("Failed to emit nested async start event:", error);
1923
+ }
1924
+ }
1925
+ ctx.pi.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {
1926
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1927
+ id,
1928
+ pid: spawnResult.pid,
1929
+ sessionId: ctx.currentSessionId,
1930
+ completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
1931
+ mode: "single",
1932
+ agent,
1933
+ task: task?.trim() ? PROMPT_REDACTED : undefined,
1934
+ goal: (params.goal ?? task).trim() ? PROMPT_REDACTED : undefined,
1935
+ cwd: runnerCwd,
1936
+ asyncDir,
1937
+ ...(sessionRoot ? { sessionRoot } : {}),
1938
+ launchContractDigest,
1939
+ launchResolvedExtensions,
1940
+ ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
1941
+ ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}),
1942
+ ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),
1943
+ ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}),
1944
+ ...(capabilityCeiling ? { capabilityCeiling } : {}),
1945
+ nestedRoute,
1946
+ });
1947
+ }
1948
+ return {
1949
+ content: [{ type: "text", text: formatAsyncStartedMessage(`Async: ${agent} [${id}]`, ctx.interactive === true) }],
1950
+ details: { mode: "single", runId: id, results: [], asyncId: id, asyncDir, launchContractDigest, launchResolvedExtensions, ...(capabilityCeiling ? { capabilityCeiling } : {}), ...(params.context ? { context: params.context } : {}), ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}), ...(params.toolBudget ? { toolBudget: resolvedToolBudget.budget ?? params.toolBudget } : {}), ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}) },
1951
+ };
1952
+ };
1953
+ return spawnResultOrPromise instanceof Promise ? spawnResultOrPromise.then(finishSpawnResult) : finishSpawnResult(spawnResultOrPromise);
1954
+ }
1955
+ //# sourceMappingURL=async-execution.js.map