@emiliosp/pi-maestro 0.7.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/ADR.md +89 -0
  2. package/CHANGELOG.md +6 -0
  3. package/README.md +3 -2
  4. package/ROADMAP.md +115 -21
  5. package/agents/builder.md +2 -4
  6. package/docs/glossary.md +2 -1
  7. package/docs/workflow.md +25 -9
  8. package/node_modules/pi-subagents/CHANGELOG.md +140 -0
  9. package/node_modules/pi-subagents/README.md +1 -1
  10. package/node_modules/pi-subagents/agents/evidence-auditor.md +1 -0
  11. package/node_modules/pi-subagents/agents/oracle.md +9 -19
  12. package/node_modules/pi-subagents/agents/researcher.md +0 -3
  13. package/node_modules/pi-subagents/agents/reviewer.md +18 -61
  14. package/node_modules/pi-subagents/agents/scout.md +1 -4
  15. package/node_modules/pi-subagents/agents/worker.md +8 -25
  16. package/node_modules/pi-subagents/docs/agents.md +71 -4
  17. package/node_modules/pi-subagents/docs/configuration.md +75 -10
  18. package/node_modules/pi-subagents/docs/extension-api.md +40 -11
  19. package/node_modules/pi-subagents/docs/missions.md +24 -17
  20. package/node_modules/pi-subagents/docs/models.md +1 -1
  21. package/node_modules/pi-subagents/docs/observability.md +12 -5
  22. package/node_modules/pi-subagents/docs/tool-reference.md +103 -85
  23. package/node_modules/pi-subagents/docs/watchdog.md +8 -6
  24. package/node_modules/pi-subagents/docs/workflows.md +17 -8
  25. package/node_modules/pi-subagents/index.d.ts.map +1 -1
  26. package/node_modules/pi-subagents/index.js +5 -0
  27. package/node_modules/pi-subagents/index.js.map +1 -1
  28. package/node_modules/pi-subagents/package.json +2 -1
  29. package/node_modules/pi-subagents/prompts/council.md +1 -1
  30. package/node_modules/pi-subagents/skills/pi-subagents/SKILL.md +2 -2
  31. package/node_modules/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
  32. package/node_modules/pi-subagents/skills/pi-subagents/references/execution-controls.md +16 -16
  33. package/node_modules/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +16 -12
  34. package/node_modules/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +1 -1
  35. package/node_modules/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +3 -3
  36. package/node_modules/pi-subagents/src/agents/advertised-agent-prompt.d.ts +5 -1
  37. package/node_modules/pi-subagents/src/agents/advertised-agent-prompt.d.ts.map +1 -1
  38. package/node_modules/pi-subagents/src/agents/advertised-agent-prompt.js +8 -2
  39. package/node_modules/pi-subagents/src/agents/advertised-agent-prompt.js.map +1 -1
  40. package/node_modules/pi-subagents/src/agents/agent-management.d.ts.map +1 -1
  41. package/node_modules/pi-subagents/src/agents/agent-management.js +5 -0
  42. package/node_modules/pi-subagents/src/agents/agent-management.js.map +1 -1
  43. package/node_modules/pi-subagents/src/agents/agent-scope.d.ts +1 -0
  44. package/node_modules/pi-subagents/src/agents/agent-scope.d.ts.map +1 -1
  45. package/node_modules/pi-subagents/src/agents/agent-scope.js +3 -0
  46. package/node_modules/pi-subagents/src/agents/agent-scope.js.map +1 -1
  47. package/node_modules/pi-subagents/src/agents/agent-serializer.d.ts.map +1 -1
  48. package/node_modules/pi-subagents/src/agents/agent-serializer.js +3 -0
  49. package/node_modules/pi-subagents/src/agents/agent-serializer.js.map +1 -1
  50. package/node_modules/pi-subagents/src/agents/agents.d.ts +14 -2
  51. package/node_modules/pi-subagents/src/agents/agents.d.ts.map +1 -1
  52. package/node_modules/pi-subagents/src/agents/agents.js +94 -36
  53. package/node_modules/pi-subagents/src/agents/agents.js.map +1 -1
  54. package/node_modules/pi-subagents/src/api/external-runs.d.ts.map +1 -1
  55. package/node_modules/pi-subagents/src/api/external-runs.js +5 -4
  56. package/node_modules/pi-subagents/src/api/external-runs.js.map +1 -1
  57. package/node_modules/pi-subagents/src/api/preflight.d.ts +2 -0
  58. package/node_modules/pi-subagents/src/api/preflight.d.ts.map +1 -1
  59. package/node_modules/pi-subagents/src/api/preflight.js +7 -3
  60. package/node_modules/pi-subagents/src/api/preflight.js.map +1 -1
  61. package/node_modules/pi-subagents/src/extension/active-runs-prompt.d.ts +8 -0
  62. package/node_modules/pi-subagents/src/extension/active-runs-prompt.d.ts.map +1 -0
  63. package/node_modules/pi-subagents/src/extension/active-runs-prompt.js +30 -0
  64. package/node_modules/pi-subagents/src/extension/active-runs-prompt.js.map +1 -0
  65. package/node_modules/pi-subagents/src/extension/config.d.ts.map +1 -1
  66. package/node_modules/pi-subagents/src/extension/config.js +29 -2
  67. package/node_modules/pi-subagents/src/extension/config.js.map +1 -1
  68. package/node_modules/pi-subagents/src/extension/control-notices.d.ts +0 -2
  69. package/node_modules/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
  70. package/node_modules/pi-subagents/src/extension/control-notices.js +1 -7
  71. package/node_modules/pi-subagents/src/extension/control-notices.js.map +1 -1
  72. package/node_modules/pi-subagents/src/extension/declaration-pinning.d.ts +19 -0
  73. package/node_modules/pi-subagents/src/extension/declaration-pinning.d.ts.map +1 -0
  74. package/node_modules/pi-subagents/src/extension/declaration-pinning.js +154 -0
  75. package/node_modules/pi-subagents/src/extension/declaration-pinning.js.map +1 -0
  76. package/node_modules/pi-subagents/src/extension/doctor.d.ts +3 -1
  77. package/node_modules/pi-subagents/src/extension/doctor.d.ts.map +1 -1
  78. package/node_modules/pi-subagents/src/extension/doctor.js +3 -9
  79. package/node_modules/pi-subagents/src/extension/doctor.js.map +1 -1
  80. package/node_modules/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  81. package/node_modules/pi-subagents/src/extension/fanout-child.js +6 -8
  82. package/node_modules/pi-subagents/src/extension/fanout-child.js.map +1 -1
  83. package/node_modules/pi-subagents/src/extension/index.d.ts +1 -2
  84. package/node_modules/pi-subagents/src/extension/index.d.ts.map +1 -1
  85. package/node_modules/pi-subagents/src/extension/index.js +121 -127
  86. package/node_modules/pi-subagents/src/extension/index.js.map +1 -1
  87. package/node_modules/pi-subagents/src/extension/rpc.d.ts.map +1 -1
  88. package/node_modules/pi-subagents/src/extension/rpc.js +12 -6
  89. package/node_modules/pi-subagents/src/extension/rpc.js.map +1 -1
  90. package/node_modules/pi-subagents/src/extension/schemas.d.ts +137 -1
  91. package/node_modules/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  92. package/node_modules/pi-subagents/src/extension/schemas.js +22 -22
  93. package/node_modules/pi-subagents/src/extension/schemas.js.map +1 -1
  94. package/node_modules/pi-subagents/src/extension/subagent-guide.d.ts +1 -0
  95. package/node_modules/pi-subagents/src/extension/subagent-guide.d.ts.map +1 -1
  96. package/node_modules/pi-subagents/src/extension/subagent-guide.js +80 -6
  97. package/node_modules/pi-subagents/src/extension/subagent-guide.js.map +1 -1
  98. package/node_modules/pi-subagents/src/extension/subagent-options.d.ts +8 -0
  99. package/node_modules/pi-subagents/src/extension/subagent-options.d.ts.map +1 -0
  100. package/node_modules/pi-subagents/src/extension/subagent-options.js +52 -0
  101. package/node_modules/pi-subagents/src/extension/subagent-options.js.map +1 -0
  102. package/node_modules/pi-subagents/src/extension/tool-activation.d.ts.map +1 -1
  103. package/node_modules/pi-subagents/src/extension/tool-activation.js +7 -4
  104. package/node_modules/pi-subagents/src/extension/tool-activation.js.map +1 -1
  105. package/node_modules/pi-subagents/src/extension/tool-description.d.ts +4 -7
  106. package/node_modules/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  107. package/node_modules/pi-subagents/src/extension/tool-description.js +45 -59
  108. package/node_modules/pi-subagents/src/extension/tool-description.js.map +1 -1
  109. package/node_modules/pi-subagents/src/inspectors/actions.d.ts +2 -0
  110. package/node_modules/pi-subagents/src/inspectors/actions.d.ts.map +1 -1
  111. package/node_modules/pi-subagents/src/inspectors/actions.js +41 -13
  112. package/node_modules/pi-subagents/src/inspectors/actions.js.map +1 -1
  113. package/node_modules/pi-subagents/src/inspectors/plugins.d.ts.map +1 -1
  114. package/node_modules/pi-subagents/src/inspectors/plugins.js +3 -2
  115. package/node_modules/pi-subagents/src/inspectors/plugins.js.map +1 -1
  116. package/node_modules/pi-subagents/src/inspectors/tmux/actions.d.ts +26 -0
  117. package/node_modules/pi-subagents/src/inspectors/tmux/actions.d.ts.map +1 -0
  118. package/node_modules/pi-subagents/src/inspectors/tmux/actions.js +182 -0
  119. package/node_modules/pi-subagents/src/inspectors/tmux/actions.js.map +1 -0
  120. package/node_modules/pi-subagents/src/inspectors/tmux/client.d.ts +28 -0
  121. package/node_modules/pi-subagents/src/inspectors/tmux/client.d.ts.map +1 -0
  122. package/node_modules/pi-subagents/src/inspectors/tmux/client.js +65 -0
  123. package/node_modules/pi-subagents/src/inspectors/tmux/client.js.map +1 -0
  124. package/node_modules/pi-subagents/src/inspectors/tmux/plugin.d.ts +8 -0
  125. package/node_modules/pi-subagents/src/inspectors/tmux/plugin.d.ts.map +1 -0
  126. package/node_modules/pi-subagents/src/inspectors/tmux/plugin.js +15 -0
  127. package/node_modules/pi-subagents/src/inspectors/tmux/plugin.js.map +1 -0
  128. package/node_modules/pi-subagents/src/integrations/herdr-status.d.ts +0 -1
  129. package/node_modules/pi-subagents/src/integrations/herdr-status.d.ts.map +1 -1
  130. package/node_modules/pi-subagents/src/integrations/herdr-status.js +18 -52
  131. package/node_modules/pi-subagents/src/integrations/herdr-status.js.map +1 -1
  132. package/node_modules/pi-subagents/src/integrations/program-status.d.ts +31 -0
  133. package/node_modules/pi-subagents/src/integrations/program-status.d.ts.map +1 -0
  134. package/node_modules/pi-subagents/src/integrations/program-status.js +189 -0
  135. package/node_modules/pi-subagents/src/integrations/program-status.js.map +1 -0
  136. package/node_modules/pi-subagents/src/intercom/native-supervisor-channel.d.ts +17 -1
  137. package/node_modules/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  138. package/node_modules/pi-subagents/src/intercom/native-supervisor-channel.js +102 -9
  139. package/node_modules/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  140. package/node_modules/pi-subagents/src/intercom/result-intercom.js +1 -1
  141. package/node_modules/pi-subagents/src/intercom/result-intercom.js.map +1 -1
  142. package/node_modules/pi-subagents/src/intercom/supervisor-ui.d.ts +2 -12
  143. package/node_modules/pi-subagents/src/intercom/supervisor-ui.d.ts.map +1 -1
  144. package/node_modules/pi-subagents/src/intercom/supervisor-ui.js +2 -154
  145. package/node_modules/pi-subagents/src/intercom/supervisor-ui.js.map +1 -1
  146. package/node_modules/pi-subagents/src/missions/store.d.ts.map +1 -1
  147. package/node_modules/pi-subagents/src/missions/store.js +27 -5
  148. package/node_modules/pi-subagents/src/missions/store.js.map +1 -1
  149. package/node_modules/pi-subagents/src/runs/background/active-async-capacity.d.ts +2 -1
  150. package/node_modules/pi-subagents/src/runs/background/active-async-capacity.d.ts.map +1 -1
  151. package/node_modules/pi-subagents/src/runs/background/active-async-capacity.js +10 -6
  152. package/node_modules/pi-subagents/src/runs/background/active-async-capacity.js.map +1 -1
  153. package/node_modules/pi-subagents/src/runs/background/async-execution.d.ts +9 -1
  154. package/node_modules/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  155. package/node_modules/pi-subagents/src/runs/background/async-execution.js +253 -144
  156. package/node_modules/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  157. package/node_modules/pi-subagents/src/runs/background/async-job-tracker.d.ts +4 -1
  158. package/node_modules/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
  159. package/node_modules/pi-subagents/src/runs/background/async-job-tracker.js +3 -2
  160. package/node_modules/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
  161. package/node_modules/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  162. package/node_modules/pi-subagents/src/runs/background/async-resume.js +9 -3
  163. package/node_modules/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  164. package/node_modules/pi-subagents/src/runs/background/await-async-run.d.ts +8 -4
  165. package/node_modules/pi-subagents/src/runs/background/await-async-run.d.ts.map +1 -1
  166. package/node_modules/pi-subagents/src/runs/background/await-async-run.js +14 -8
  167. package/node_modules/pi-subagents/src/runs/background/await-async-run.js.map +1 -1
  168. package/node_modules/pi-subagents/src/runs/background/binary-bootstrap.d.ts.map +1 -1
  169. package/node_modules/pi-subagents/src/runs/background/binary-bootstrap.js +2 -1
  170. package/node_modules/pi-subagents/src/runs/background/binary-bootstrap.js.map +1 -1
  171. package/node_modules/pi-subagents/src/runs/background/chain-root-attachment.d.ts +2 -0
  172. package/node_modules/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  173. package/node_modules/pi-subagents/src/runs/background/chain-root-attachment.js +9 -6
  174. package/node_modules/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  175. package/node_modules/pi-subagents/src/runs/background/control-channel.d.ts +1 -0
  176. package/node_modules/pi-subagents/src/runs/background/control-channel.d.ts.map +1 -1
  177. package/node_modules/pi-subagents/src/runs/background/control-channel.js +27 -3
  178. package/node_modules/pi-subagents/src/runs/background/control-channel.js.map +1 -1
  179. package/node_modules/pi-subagents/src/runs/background/fleet-view.js +5 -5
  180. package/node_modules/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
  181. package/node_modules/pi-subagents/src/runs/background/notify.d.ts +12 -2
  182. package/node_modules/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  183. package/node_modules/pi-subagents/src/runs/background/notify.js +152 -13
  184. package/node_modules/pi-subagents/src/runs/background/notify.js.map +1 -1
  185. package/node_modules/pi-subagents/src/runs/background/result-files.d.ts +29 -0
  186. package/node_modules/pi-subagents/src/runs/background/result-files.d.ts.map +1 -1
  187. package/node_modules/pi-subagents/src/runs/background/result-files.js +104 -6
  188. package/node_modules/pi-subagents/src/runs/background/result-files.js.map +1 -1
  189. package/node_modules/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  190. package/node_modules/pi-subagents/src/runs/background/result-watcher.js +60 -64
  191. package/node_modules/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  192. package/node_modules/pi-subagents/src/runs/background/resume-guidance.js +2 -2
  193. package/node_modules/pi-subagents/src/runs/background/resume-guidance.js.map +1 -1
  194. package/node_modules/pi-subagents/src/runs/background/run-child-session.d.ts.map +1 -1
  195. package/node_modules/pi-subagents/src/runs/background/run-child-session.js +9 -15
  196. package/node_modules/pi-subagents/src/runs/background/run-child-session.js.map +1 -1
  197. package/node_modules/pi-subagents/src/runs/background/run-id-resolver.d.ts.map +1 -1
  198. package/node_modules/pi-subagents/src/runs/background/run-id-resolver.js +9 -6
  199. package/node_modules/pi-subagents/src/runs/background/run-id-resolver.js.map +1 -1
  200. package/node_modules/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  201. package/node_modules/pi-subagents/src/runs/background/run-status.js +19 -15
  202. package/node_modules/pi-subagents/src/runs/background/run-status.js.map +1 -1
  203. package/node_modules/pi-subagents/src/runs/background/runner-aliases.d.ts.map +1 -1
  204. package/node_modules/pi-subagents/src/runs/background/runner-aliases.js +11 -8
  205. package/node_modules/pi-subagents/src/runs/background/runner-aliases.js.map +1 -1
  206. package/node_modules/pi-subagents/src/runs/background/runner-child-launch.d.ts.map +1 -1
  207. package/node_modules/pi-subagents/src/runs/background/runner-child-launch.js +1 -0
  208. package/node_modules/pi-subagents/src/runs/background/runner-child-launch.js.map +1 -1
  209. package/node_modules/pi-subagents/src/runs/background/runner-http-dispatcher.d.ts +3 -0
  210. package/node_modules/pi-subagents/src/runs/background/runner-http-dispatcher.d.ts.map +1 -1
  211. package/node_modules/pi-subagents/src/runs/background/runner-http-dispatcher.js +2 -0
  212. package/node_modules/pi-subagents/src/runs/background/runner-http-dispatcher.js.map +1 -1
  213. package/node_modules/pi-subagents/src/runs/background/scheduled-runs.d.ts +9 -0
  214. package/node_modules/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
  215. package/node_modules/pi-subagents/src/runs/background/scheduled-runs.js +124 -36
  216. package/node_modules/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
  217. package/node_modules/pi-subagents/src/runs/background/subagent-runner-bootstrap.d.ts.map +1 -1
  218. package/node_modules/pi-subagents/src/runs/background/subagent-runner-bootstrap.js +5 -1
  219. package/node_modules/pi-subagents/src/runs/background/subagent-runner-bootstrap.js.map +1 -1
  220. package/node_modules/pi-subagents/src/runs/background/subagent-runner.d.ts +3 -1
  221. package/node_modules/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  222. package/node_modules/pi-subagents/src/runs/background/subagent-runner.js +211 -283
  223. package/node_modules/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  224. package/node_modules/pi-subagents/src/runs/background/subagent-wait.d.ts +2 -0
  225. package/node_modules/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
  226. package/node_modules/pi-subagents/src/runs/background/subagent-wait.js +34 -20
  227. package/node_modules/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
  228. package/node_modules/pi-subagents/src/runs/background/terminal-run-index.d.ts +1 -0
  229. package/node_modules/pi-subagents/src/runs/background/terminal-run-index.d.ts.map +1 -1
  230. package/node_modules/pi-subagents/src/runs/background/terminal-run-index.js +47 -1
  231. package/node_modules/pi-subagents/src/runs/background/terminal-run-index.js.map +1 -1
  232. package/node_modules/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  233. package/node_modules/pi-subagents/src/runs/background/wait-tool.js +36 -23
  234. package/node_modules/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  235. package/node_modules/pi-subagents/src/runs/background/workflow-terminal-proof.d.ts +1 -1
  236. package/node_modules/pi-subagents/src/runs/background/workflow-terminal-proof.d.ts.map +1 -1
  237. package/node_modules/pi-subagents/src/runs/background/workflow-terminal-proof.js +12 -3
  238. package/node_modules/pi-subagents/src/runs/background/workflow-terminal-proof.js.map +1 -1
  239. package/node_modules/pi-subagents/src/runs/foreground/async-stop-action.d.ts +7 -1
  240. package/node_modules/pi-subagents/src/runs/foreground/async-stop-action.d.ts.map +1 -1
  241. package/node_modules/pi-subagents/src/runs/foreground/async-stop-action.js +55 -32
  242. package/node_modules/pi-subagents/src/runs/foreground/async-stop-action.js.map +1 -1
  243. package/node_modules/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  244. package/node_modules/pi-subagents/src/runs/foreground/execution.js +101 -79
  245. package/node_modules/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  246. package/node_modules/pi-subagents/src/runs/foreground/subagent-executor.d.ts +5 -1
  247. package/node_modules/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  248. package/node_modules/pi-subagents/src/runs/foreground/subagent-executor.js +184 -84
  249. package/node_modules/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  250. package/node_modules/pi-subagents/src/runs/shared/child-hooks.js +6 -5
  251. package/node_modules/pi-subagents/src/runs/shared/child-hooks.js.map +1 -1
  252. package/node_modules/pi-subagents/src/runs/shared/child-launch.d.ts +2 -0
  253. package/node_modules/pi-subagents/src/runs/shared/child-launch.d.ts.map +1 -1
  254. package/node_modules/pi-subagents/src/runs/shared/child-launch.js +1 -0
  255. package/node_modules/pi-subagents/src/runs/shared/child-launch.js.map +1 -1
  256. package/node_modules/pi-subagents/src/runs/shared/child-session.d.ts +4 -0
  257. package/node_modules/pi-subagents/src/runs/shared/child-session.d.ts.map +1 -1
  258. package/node_modules/pi-subagents/src/runs/shared/child-session.js +28 -23
  259. package/node_modules/pi-subagents/src/runs/shared/child-session.js.map +1 -1
  260. package/node_modules/pi-subagents/src/runs/shared/child-tool-plan.d.ts.map +1 -1
  261. package/node_modules/pi-subagents/src/runs/shared/child-tool-plan.js +11 -10
  262. package/node_modules/pi-subagents/src/runs/shared/child-tool-plan.js.map +1 -1
  263. package/node_modules/pi-subagents/src/runs/shared/dynamic-fanout.js +1 -1
  264. package/node_modules/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
  265. package/node_modules/pi-subagents/src/runs/shared/effective-system-prompt.d.ts +4 -4
  266. package/node_modules/pi-subagents/src/runs/shared/effective-system-prompt.d.ts.map +1 -1
  267. package/node_modules/pi-subagents/src/runs/shared/effective-system-prompt.js +5 -4
  268. package/node_modules/pi-subagents/src/runs/shared/effective-system-prompt.js.map +1 -1
  269. package/node_modules/pi-subagents/src/runs/shared/external-cli-runner.d.ts.map +1 -1
  270. package/node_modules/pi-subagents/src/runs/shared/external-cli-runner.js +3 -2
  271. package/node_modules/pi-subagents/src/runs/shared/external-cli-runner.js.map +1 -1
  272. package/node_modules/pi-subagents/src/runs/shared/herdr-placed-run.d.ts +1 -0
  273. package/node_modules/pi-subagents/src/runs/shared/herdr-placed-run.d.ts.map +1 -1
  274. package/node_modules/pi-subagents/src/runs/shared/herdr-placed-run.js +10 -6
  275. package/node_modules/pi-subagents/src/runs/shared/herdr-placed-run.js.map +1 -1
  276. package/node_modules/pi-subagents/src/runs/shared/model-resolution-diagnostic.d.ts +17 -5
  277. package/node_modules/pi-subagents/src/runs/shared/model-resolution-diagnostic.d.ts.map +1 -1
  278. package/node_modules/pi-subagents/src/runs/shared/model-resolution-diagnostic.js +37 -10
  279. package/node_modules/pi-subagents/src/runs/shared/model-resolution-diagnostic.js.map +1 -1
  280. package/node_modules/pi-subagents/src/runs/shared/model-resolution.d.ts.map +1 -1
  281. package/node_modules/pi-subagents/src/runs/shared/model-resolution.js +29 -1
  282. package/node_modules/pi-subagents/src/runs/shared/model-resolution.js.map +1 -1
  283. package/node_modules/pi-subagents/src/runs/shared/nested-events.d.ts +2 -0
  284. package/node_modules/pi-subagents/src/runs/shared/nested-events.d.ts.map +1 -1
  285. package/node_modules/pi-subagents/src/runs/shared/nested-events.js +4 -0
  286. package/node_modules/pi-subagents/src/runs/shared/nested-events.js.map +1 -1
  287. package/node_modules/pi-subagents/src/runs/shared/orca-progress-tabs.js +1 -1
  288. package/node_modules/pi-subagents/src/runs/shared/orca-progress-tabs.js.map +1 -1
  289. package/node_modules/pi-subagents/src/runs/shared/parallel-handoff.js +2 -2
  290. package/node_modules/pi-subagents/src/runs/shared/parallel-handoff.js.map +1 -1
  291. package/node_modules/pi-subagents/src/runs/shared/parallel-utils.d.ts +2 -0
  292. package/node_modules/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  293. package/node_modules/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  294. package/node_modules/pi-subagents/src/runs/shared/partial-output.d.ts +7 -0
  295. package/node_modules/pi-subagents/src/runs/shared/partial-output.d.ts.map +1 -1
  296. package/node_modules/pi-subagents/src/runs/shared/partial-output.js +7 -0
  297. package/node_modules/pi-subagents/src/runs/shared/partial-output.js.map +1 -1
  298. package/node_modules/pi-subagents/src/runs/shared/runner-launcher.d.ts +12 -0
  299. package/node_modules/pi-subagents/src/runs/shared/runner-launcher.d.ts.map +1 -0
  300. package/node_modules/pi-subagents/src/runs/shared/runner-launcher.js +25 -0
  301. package/node_modules/pi-subagents/src/runs/shared/runner-launcher.js.map +1 -0
  302. package/node_modules/pi-subagents/src/runs/shared/single-output.d.ts +31 -1
  303. package/node_modules/pi-subagents/src/runs/shared/single-output.d.ts.map +1 -1
  304. package/node_modules/pi-subagents/src/runs/shared/single-output.js +100 -21
  305. package/node_modules/pi-subagents/src/runs/shared/single-output.js.map +1 -1
  306. package/node_modules/pi-subagents/src/runs/shared/structured-output.d.ts +2 -0
  307. package/node_modules/pi-subagents/src/runs/shared/structured-output.d.ts.map +1 -1
  308. package/node_modules/pi-subagents/src/runs/shared/structured-output.js +26 -8
  309. package/node_modules/pi-subagents/src/runs/shared/structured-output.js.map +1 -1
  310. package/node_modules/pi-subagents/src/runs/shared/subagent-control.js +3 -3
  311. package/node_modules/pi-subagents/src/runs/shared/subagent-control.js.map +1 -1
  312. package/node_modules/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts +37 -2
  313. package/node_modules/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  314. package/node_modules/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +130 -22
  315. package/node_modules/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  316. package/node_modules/pi-subagents/src/runs/shared/tool-budget.js +1 -1
  317. package/node_modules/pi-subagents/src/runs/shared/tool-budget.js.map +1 -1
  318. package/node_modules/pi-subagents/src/runs/shared/workflow-async-child-guidance.js +1 -1
  319. package/node_modules/pi-subagents/src/runs/shared/workflow-async-child-guidance.js.map +1 -1
  320. package/node_modules/pi-subagents/src/runs/shared/worktree-cleanup-plan.js +1 -1
  321. package/node_modules/pi-subagents/src/runs/shared/worktree-cleanup-plan.js.map +1 -1
  322. package/node_modules/pi-subagents/src/shared/atomic-json.d.ts +4 -3
  323. package/node_modules/pi-subagents/src/shared/atomic-json.d.ts.map +1 -1
  324. package/node_modules/pi-subagents/src/shared/atomic-json.js +3 -1
  325. package/node_modules/pi-subagents/src/shared/atomic-json.js.map +1 -1
  326. package/node_modules/pi-subagents/src/shared/child-transcript.js +1 -1
  327. package/node_modules/pi-subagents/src/shared/child-transcript.js.map +1 -1
  328. package/node_modules/pi-subagents/src/shared/edit-distance.d.ts +5 -0
  329. package/node_modules/pi-subagents/src/shared/edit-distance.d.ts.map +1 -0
  330. package/node_modules/pi-subagents/src/shared/edit-distance.js +33 -0
  331. package/node_modules/pi-subagents/src/shared/edit-distance.js.map +1 -0
  332. package/node_modules/pi-subagents/src/shared/extension-context.d.ts +5 -0
  333. package/node_modules/pi-subagents/src/shared/extension-context.d.ts.map +1 -1
  334. package/node_modules/pi-subagents/src/shared/extension-context.js +7 -0
  335. package/node_modules/pi-subagents/src/shared/extension-context.js.map +1 -1
  336. package/node_modules/pi-subagents/src/shared/formatters.d.ts.map +1 -1
  337. package/node_modules/pi-subagents/src/shared/formatters.js +1 -6
  338. package/node_modules/pi-subagents/src/shared/formatters.js.map +1 -1
  339. package/node_modules/pi-subagents/src/shared/model-info.d.ts +8 -0
  340. package/node_modules/pi-subagents/src/shared/model-info.d.ts.map +1 -1
  341. package/node_modules/pi-subagents/src/shared/model-info.js +22 -0
  342. package/node_modules/pi-subagents/src/shared/model-info.js.map +1 -1
  343. package/node_modules/pi-subagents/src/shared/package-version.d.ts +3 -0
  344. package/node_modules/pi-subagents/src/shared/package-version.d.ts.map +1 -0
  345. package/node_modules/pi-subagents/src/shared/package-version.js +15 -0
  346. package/node_modules/pi-subagents/src/shared/package-version.js.map +1 -0
  347. package/node_modules/pi-subagents/src/shared/parent-wake.d.ts +24 -0
  348. package/node_modules/pi-subagents/src/shared/parent-wake.d.ts.map +1 -0
  349. package/node_modules/pi-subagents/src/shared/parent-wake.js +71 -0
  350. package/node_modules/pi-subagents/src/shared/parent-wake.js.map +1 -0
  351. package/node_modules/pi-subagents/src/shared/pruned-fork.d.ts +1 -1
  352. package/node_modules/pi-subagents/src/shared/pruned-fork.d.ts.map +1 -1
  353. package/node_modules/pi-subagents/src/shared/pruned-fork.js +6 -0
  354. package/node_modules/pi-subagents/src/shared/pruned-fork.js.map +1 -1
  355. package/node_modules/pi-subagents/src/shared/runtime-module-path.d.ts +11 -0
  356. package/node_modules/pi-subagents/src/shared/runtime-module-path.d.ts.map +1 -0
  357. package/node_modules/pi-subagents/src/shared/runtime-module-path.js +17 -0
  358. package/node_modules/pi-subagents/src/shared/runtime-module-path.js.map +1 -0
  359. package/node_modules/pi-subagents/src/shared/types.d.ts +33 -10
  360. package/node_modules/pi-subagents/src/shared/types.d.ts.map +1 -1
  361. package/node_modules/pi-subagents/src/shared/types.js +7 -4
  362. package/node_modules/pi-subagents/src/shared/types.js.map +1 -1
  363. package/node_modules/pi-subagents/src/shared/utils.d.ts +2 -0
  364. package/node_modules/pi-subagents/src/shared/utils.d.ts.map +1 -1
  365. package/node_modules/pi-subagents/src/shared/utils.js +10 -7
  366. package/node_modules/pi-subagents/src/shared/utils.js.map +1 -1
  367. package/node_modules/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  368. package/node_modules/pi-subagents/src/slash/slash-commands.js +21 -10
  369. package/node_modules/pi-subagents/src/slash/slash-commands.js.map +1 -1
  370. package/node_modules/pi-subagents/src/slash/subagents-admin.d.ts.map +1 -1
  371. package/node_modules/pi-subagents/src/slash/subagents-admin.js +3 -1
  372. package/node_modules/pi-subagents/src/slash/subagents-admin.js.map +1 -1
  373. package/node_modules/pi-subagents/src/tui/fleet-status.d.ts +5 -0
  374. package/node_modules/pi-subagents/src/tui/fleet-status.d.ts.map +1 -1
  375. package/node_modules/pi-subagents/src/tui/fleet-status.js +24 -3
  376. package/node_modules/pi-subagents/src/tui/fleet-status.js.map +1 -1
  377. package/node_modules/pi-subagents/src/tui/fleet-transcript.d.ts +2 -0
  378. package/node_modules/pi-subagents/src/tui/fleet-transcript.d.ts.map +1 -1
  379. package/node_modules/pi-subagents/src/tui/fleet-transcript.js +7 -2
  380. package/node_modules/pi-subagents/src/tui/fleet-transcript.js.map +1 -1
  381. package/node_modules/pi-subagents/src/tui/fleet.d.ts.map +1 -1
  382. package/node_modules/pi-subagents/src/tui/fleet.js +11 -6
  383. package/node_modules/pi-subagents/src/tui/fleet.js.map +1 -1
  384. package/node_modules/pi-subagents/src/tui/render.d.ts +2 -2
  385. package/node_modules/pi-subagents/src/tui/render.d.ts.map +1 -1
  386. package/node_modules/pi-subagents/src/tui/render.js +19 -17
  387. package/node_modules/pi-subagents/src/tui/render.js.map +1 -1
  388. package/node_modules/pi-subagents/src/tui/subagent-messages.d.ts +23 -0
  389. package/node_modules/pi-subagents/src/tui/subagent-messages.d.ts.map +1 -0
  390. package/node_modules/pi-subagents/src/tui/subagent-messages.js +270 -0
  391. package/node_modules/pi-subagents/src/tui/subagent-messages.js.map +1 -0
  392. package/node_modules/pi-subagents/src/watchdog/change-signature.d.ts.map +1 -1
  393. package/node_modules/pi-subagents/src/watchdog/change-signature.js +1 -3
  394. package/node_modules/pi-subagents/src/watchdog/change-signature.js.map +1 -1
  395. package/node_modules/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
  396. package/node_modules/pi-subagents/src/watchdog/register-main.js +1 -19
  397. package/node_modules/pi-subagents/src/watchdog/register-main.js.map +1 -1
  398. package/node_modules/pi-subagents/src/watchdog/render.d.ts +2 -10
  399. package/node_modules/pi-subagents/src/watchdog/render.d.ts.map +1 -1
  400. package/node_modules/pi-subagents/src/watchdog/render.js +1 -19
  401. package/node_modules/pi-subagents/src/watchdog/render.js.map +1 -1
  402. package/node_modules/pi-subagents/src/watchdog/tool-actions.js +2 -2
  403. package/node_modules/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
  404. package/node_modules/pi-subagents/src/workflows/scripted-workflow.d.ts.map +1 -1
  405. package/node_modules/pi-subagents/src/workflows/scripted-workflow.js +33 -10
  406. package/node_modules/pi-subagents/src/workflows/scripted-workflow.js.map +1 -1
  407. package/node_modules/pi-subagents/src/workflows/workflow-resources.d.ts.map +1 -1
  408. package/node_modules/pi-subagents/src/workflows/workflow-resources.js +12 -0
  409. package/node_modules/pi-subagents/src/workflows/workflow-resources.js.map +1 -1
  410. package/package.json +3 -3
  411. package/src/artifacts/builder-handoff/assertBuilderHandoff.ts +0 -14
  412. package/src/artifacts/builder-handoff/schema.ts +0 -26
  413. package/src/maestro/instructions/getMaestroInstructions.ts +4 -2
  414. package/src/maestro/status/formatMaestroStatus.ts +0 -3
  415. package/src/tools/child/record-builder-handoff.ts +2 -10
  416. package/src/tools/main/resolve-escalations.ts +1 -1
  417. package/src/tools/main/resolve-findings.ts +1 -1
  418. package/src/tools/main/run-builder.ts +9 -49
  419. package/src/workflow/builder/completeBuilderPass.ts +4 -13
  420. package/src/workflow/builder/utils/getWorkflowEventByBuilderHandoff.ts +24 -0
  421. package/src/workflow/state/schema.ts +0 -3
  422. package/src/workflow/transitions.ts +0 -4
  423. package/src/workflow/verifier/completeVerifierPass.ts +3 -9
  424. package/src/workflow/{findings → verifier}/resolveFindings.ts +4 -12
  425. package/src/workflow/verifier/utils/getWorkflowEventByVerifierHandoff.ts +40 -0
  426. package/DESIGN_DECISIONS.md +0 -21
  427. package/node_modules/pi-subagents/src/runs/shared/run-history.d.ts +0 -67
  428. package/node_modules/pi-subagents/src/runs/shared/run-history.d.ts.map +0 -1
  429. package/node_modules/pi-subagents/src/runs/shared/run-history.js +0 -270
  430. package/node_modules/pi-subagents/src/runs/shared/run-history.js.map +0 -1
  431. /package/src/workflow/{escalation → builder}/resolveEscalations.ts +0 -0
@@ -21,15 +21,15 @@ import { resolvePermissionRules } from "../shared/permissions.js";
21
21
  import { applyThinkingSuffix, deriveForkPromptCacheKey } from "../shared/child-tool-plan.js";
22
22
  import { deriveChildSessionName } from "../../shared/child-session-name.js";
23
23
  import { assertAgentAllowedByCapabilityCeiling, intersectSubagentCapabilityCeilings, resolveCurrentSubagentCapabilityCeiling } from "../shared/capability-ceiling.js";
24
- import { resolveEffectiveThinking } from "../../shared/model-info.js";
24
+ import { qualifyModelWithProvider, resolveEffectiveThinking } from "../../shared/model-info.js";
25
25
  import { assertThinkingWithinCeiling, intersectThinkingCeilings } from "../../shared/thinking-ceiling.js";
26
26
  import { formatStructuredOutputRejectionError, MISSING_STRUCTURED_ACCEPTANCE_REPORT_ERROR, MISSING_STRUCTURED_OUTPUT_CALL_ERROR } from "../shared/structured-output.js";
27
27
  import { formatMidToolExitError, isOrdinaryToolForMidToolExit } from "../shared/process-signal.js";
28
28
  import { formatChildToolDiagnostic } from "../shared/tool-availability.js";
29
- import { formatChildModelResolutionDiagnostic, isChildModelResolutionFailure } from "../shared/model-resolution-diagnostic.js";
29
+ import { formatChildModelResolutionDiagnostic, formatInheritedProviderDiagnostic, isChildModelResolutionFailure } from "../shared/model-resolution-diagnostic.js";
30
30
  import { planAbortRecovery } from "../shared/abort-recovery.js";
31
31
  import { buildTimeoutRecoverySummary, collectTrackedMutationEvidence, snapshotTrackedMutations } from "../shared/mutation-evidence.js";
32
- import { captureSingleOutputSnapshot, extractChildWrittenOutput, finalizeSingleOutput, formatSavedOutputReference, hasSingleOutputChangedSinceSnapshot, resolveSingleOutput, validateFileOnlyOutputMode } from "../shared/single-output.js";
32
+ import { captureSingleOutputSnapshot, extractChildWrittenOutput, finalizeSingleOutput, formatSavedOutputReference, hasSingleOutputChangedSinceSnapshot, isSettlementFatalOutputError, resolveSingleOutput, validateFileOnlyOutputMode } from "../shared/single-output.js";
33
33
  import { formatSubagentModelVerificationError, isContextOverflow, resolveModelSelection, } from "../shared/model-resolution.js";
34
34
  import { createMutatingFailureState, didMutatingToolFail, isMutatingTool, nextLongRunningTrigger, recordMutatingFailure, resetMutatingFailureState, resolveCurrentPath, shouldEscalateMutatingFailures, summarizeRecentMutatingFailures, } from "../shared/long-running-guard.js";
35
35
  import { acceptanceFailureMessage, buildSkippedAcceptanceLedger, captureStagedIndexBaseline, evaluateAcceptance, formatAcceptancePrompt, resolveEffectiveAcceptance, stripAcceptanceReport, validateAcceptanceInput, typedVerifyOutput } from "../shared/acceptance.js";
@@ -75,6 +75,7 @@ function persistSingleResultMetadata(input) {
75
75
  const target = input.result;
76
76
  writeMetadata(input.metadataPath, {
77
77
  runId: input.runId,
78
+ parentSessionId: input.parentSessionId,
78
79
  agent: input.agent,
79
80
  task: PROMPT_REDACTED,
80
81
  exitCode: target.exitCode,
@@ -102,9 +103,6 @@ function persistSingleResultMetadata(input) {
102
103
  timestamp: Date.now(),
103
104
  });
104
105
  }
105
- function formatTimeoutMessage(timeoutMs) {
106
- return `Subagent timed out after ${timeoutMs}ms.`;
107
- }
108
106
  function resolveAttemptTimeout(options) {
109
107
  if (options.timeoutMs === undefined)
110
108
  return undefined;
@@ -112,7 +110,7 @@ function resolveAttemptTimeout(options) {
112
110
  return {
113
111
  timeoutMs: options.timeoutMs,
114
112
  remainingMs: Math.max(0, deadlineAt - Date.now()),
115
- message: formatTimeoutMessage(options.timeoutMs),
113
+ message: `Subagent timed out after ${options.timeoutMs}ms.`,
116
114
  };
117
115
  }
118
116
  function buildPendingAcceptanceLedger(acceptance) {
@@ -193,8 +191,7 @@ function snapshotResult(result, progress) {
193
191
  * foreground detach receipts and terminal consumers use snapshotResult directly.
194
192
  */
195
193
  function snapshotStreamResult(result, progress) {
196
- const snapshot = snapshotResult(result, progress);
197
- snapshot.messages = undefined;
194
+ const snapshot = snapshotResult({ ...result, messages: undefined }, progress);
198
195
  snapshot.toolCalls = boundStreamedToolCalls(result);
199
196
  return snapshot;
200
197
  }
@@ -300,6 +297,7 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
300
297
  nestedRoute: options.nestedRoute,
301
298
  runFanoutBudget: options.runFanoutBudget,
302
299
  parentSessionId: options.parentSessionId,
300
+ parentSessionFile: options.parentSessionFile,
303
301
  forkCacheKey: options.context === "fork" ? deriveForkPromptCacheKey(options.parentSessionId) : undefined,
304
302
  structuredOutput: options.structuredOutput,
305
303
  fast: options.fast ?? agent.fast,
@@ -419,6 +417,7 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
419
417
  delete progress.cacheWrite;
420
418
  };
421
419
  const attemptTimeout = resolveAttemptTimeout(options);
420
+ let timeoutCause;
422
421
  if (attemptTimeout?.remainingMs === 0) {
423
422
  result.exitCode = 1;
424
423
  result.timedOut = true;
@@ -468,6 +467,7 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
468
467
  let sessionSettled = false;
469
468
  let lifecycleFinished = false;
470
469
  let detached = false;
470
+ let hostStopReason;
471
471
  let intercomStarted = false;
472
472
  let assistantError;
473
473
  let removeAbortListener;
@@ -707,6 +707,9 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
707
707
  return events;
708
708
  };
709
709
  let activeLongRunningNotified = false;
710
+ // Pi's parallel tool execution emits every tool_execution_start before the first result message,
711
+ // so results are matched to their call by toolCallId; the last-started slot covers events without one.
712
+ const pendingToolResultsByCallId = new Map();
710
713
  let pendingToolResult;
711
714
  let activeToolSequence = 0;
712
715
  const activeToolCalls = new Map();
@@ -980,10 +983,12 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
980
983
  }
981
984
  progress.toolCount++;
982
985
  if (options.toolBudget) {
983
- result.toolBudget = toolBudgetState(options.toolBudget, progress.toolCount);
986
+ result.toolBudget = toolBudgetState(options.toolBudget, progress.toolCount, result.toolBudget?.blockedTool);
984
987
  }
985
988
  const mutates = isMutatingTool(evt.toolName, toolArgs, agent.mutationTools);
986
989
  pendingToolResult = { tool: evt.toolName ?? "tool", path: activeTool?.path, mutates, startedAt: now };
990
+ if (typeof evt.toolCallId === "string" && evt.toolCallId)
991
+ pendingToolResultsByCallId.set(evt.toolCallId, pendingToolResult);
987
992
  fireUpdate();
988
993
  }
989
994
  if (evt.type === "tool_execution_end") {
@@ -1032,9 +1037,10 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1032
1037
  }
1033
1038
  projectCompleteUsage();
1034
1039
  if (evt.message.model) {
1035
- progress.model = evt.message.model;
1040
+ const observedModel = qualifyModelWithProvider(evt.message.model, evt.message.provider, options.availableModels);
1041
+ progress.model = observedModel;
1036
1042
  if (!result.model)
1037
- result.model = evt.message.model;
1043
+ result.model = observedModel;
1038
1044
  if (expectedModelForVerification && !hasToolCall) {
1039
1045
  const modelVerificationError = formatSubagentModelVerificationError(expectedModelForVerification, evt.message.model, options.availableModels, options.modelResponseAliases, session?.virtualModelId);
1040
1046
  if (modelVerificationError && !result.error)
@@ -1061,59 +1067,48 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1061
1067
  applyChildLifecycle(projectChildLifecycle(evt, true, childLifecycleState));
1062
1068
  }
1063
1069
  }
1064
- updateActivityState(now);
1065
- fireUpdate();
1066
- }
1067
- if (evt.type === "tool_result_end" && evt.message) {
1068
- const toolResultCompletion = {
1069
- toolCallId: evt.message.toolCallId ?? evt.toolCallId,
1070
- toolName: evt.message.toolName ?? evt.toolName,
1071
- };
1072
- clearActiveToolTimeout(toolResultCompletion);
1073
- const endedTool = removeActiveToolCall(toolResultCompletion);
1074
- if (endedTool) {
1075
- progress.recentTools.push({
1076
- tool: endedTool.tool,
1077
- args: endedTool.args,
1078
- endMs: now,
1079
- });
1080
- refreshCurrentTool();
1081
- }
1082
- result.messages.push(evt.message);
1083
- const resultText = extractTextFromContent(evt.message.content);
1084
- // The result event's own tool name is authoritative; the single pending slot can
1085
- // describe a different, overlapping call and serves only as a fallback.
1086
- const blockedTool = (typeof toolResultCompletion.toolName === "string" && toolResultCompletion.toolName.length > 0
1087
- ? toolResultCompletion.toolName
1088
- : undefined) ?? pendingToolResult?.tool;
1089
- if (options.toolBudget && isToolBudgetBlockedMessage(options.toolBudget, resultText, blockedTool)) {
1090
- result.toolBudgetBlocked = true;
1091
- result.toolBudget = toolBudgetState(options.toolBudget, Math.max(progress.toolCount, options.toolBudget.hard + 1), blockedTool);
1092
- }
1093
- appendRecentOutput(progress, resultText.split("\n").slice(-10));
1094
- const toolSnapshot = pendingToolResult;
1095
- pendingToolResult = undefined;
1096
- if (toolSnapshot?.mutates && didMutatingToolFail(resultText)) {
1097
- recordMutatingFailure(mutatingFailures, {
1098
- tool: toolSnapshot.tool,
1099
- path: toolSnapshot.path,
1100
- error: resultText.split("\n").find((line) => line.trim())?.trim().slice(0, 180) ?? "mutating tool failed",
1101
- ts: now,
1102
- }, mutatingFailureWindowMs);
1103
- if (shouldEscalateMutatingFailures(mutatingFailures, controlConfig.failedToolAttemptsBeforeAttention)) {
1104
- emitNeedsAttention(now, {
1105
- message: `${agent.name} needs attention after repeated mutating tool failures`,
1106
- reason: "tool_failures",
1107
- currentTool: toolSnapshot.tool,
1108
- currentPath: toolSnapshot.path,
1109
- currentToolDurationMs: toolSnapshot.startedAt ? Math.max(0, now - toolSnapshot.startedAt) : undefined,
1110
- recentFailureSummary: summarizeRecentMutatingFailures(mutatingFailures),
1111
- });
1070
+ // Pi delivers every tool result, including a call blocked by a tool_call handler, as a
1071
+ // toolResult message after tool_execution_end; it emits no separate result event.
1072
+ if (evt.message.role === "toolResult") {
1073
+ const resultText = extractTextFromContent(evt.message.content);
1074
+ const resultCallId = evt.message.toolCallId;
1075
+ const keyedSnapshot = typeof resultCallId === "string" ? pendingToolResultsByCallId.get(resultCallId) : undefined;
1076
+ if (keyedSnapshot)
1077
+ pendingToolResultsByCallId.delete(resultCallId);
1078
+ const toolSnapshot = keyedSnapshot ?? pendingToolResult;
1079
+ if (!keyedSnapshot || pendingToolResult === keyedSnapshot)
1080
+ pendingToolResult = undefined;
1081
+ // The result message's own tool name is authoritative; the pending snapshot is only a fallback.
1082
+ const resultToolName = evt.message.toolName;
1083
+ const blockedTool = (typeof resultToolName === "string" && resultToolName.length > 0 ? resultToolName : undefined) ?? toolSnapshot?.tool;
1084
+ if (options.toolBudget && isToolBudgetBlockedMessage(options.toolBudget, resultText, blockedTool)) {
1085
+ result.toolBudgetBlocked = true;
1086
+ result.toolBudget = toolBudgetState(options.toolBudget, Math.max(progress.toolCount, options.toolBudget.hard + 1), blockedTool);
1087
+ }
1088
+ appendRecentOutput(progress, resultText.split("\n").slice(-10));
1089
+ if (toolSnapshot?.mutates && didMutatingToolFail(resultText)) {
1090
+ recordMutatingFailure(mutatingFailures, {
1091
+ tool: toolSnapshot.tool,
1092
+ path: toolSnapshot.path,
1093
+ error: resultText.split("\n").find((line) => line.trim())?.trim().slice(0, 180) ?? "mutating tool failed",
1094
+ ts: now,
1095
+ }, mutatingFailureWindowMs);
1096
+ if (shouldEscalateMutatingFailures(mutatingFailures, controlConfig.failedToolAttemptsBeforeAttention)) {
1097
+ emitNeedsAttention(now, {
1098
+ message: `${agent.name} needs attention after repeated mutating tool failures`,
1099
+ reason: "tool_failures",
1100
+ currentTool: toolSnapshot.tool,
1101
+ currentPath: toolSnapshot.path,
1102
+ currentToolDurationMs: toolSnapshot.startedAt ? Math.max(0, now - toolSnapshot.startedAt) : undefined,
1103
+ recentFailureSummary: summarizeRecentMutatingFailures(mutatingFailures),
1104
+ });
1105
+ }
1106
+ }
1107
+ else if (toolSnapshot?.mutates) {
1108
+ resetMutatingFailureState(mutatingFailures);
1112
1109
  }
1113
1110
  }
1114
- else if (toolSnapshot?.mutates) {
1115
- resetMutatingFailureState(mutatingFailures);
1116
- }
1111
+ updateActivityState(now);
1117
1112
  fireUpdate();
1118
1113
  }
1119
1114
  };
@@ -1131,9 +1126,10 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1131
1126
  }
1132
1127
  if (attemptTimeout) {
1133
1128
  timeoutTimer = setTimeout(() => {
1134
- if (sessionSettled || lifecycleFinished || interruptedByControl)
1129
+ if (sessionSettled || lifecycleFinished || interruptedByControl || result.timedOut)
1135
1130
  return;
1136
1131
  result.timedOut = true;
1132
+ timeoutCause = attemptTimeout.message;
1137
1133
  clearAllToolTimeouts();
1138
1134
  result.error = attemptTimeout.message;
1139
1135
  result.finalOutput = attemptTimeout.message;
@@ -1187,9 +1183,11 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1187
1183
  }
1188
1184
  };
1189
1185
  const terminateForToolTimeout = (message) => {
1190
- if (sessionSettled || lifecycleFinished || interruptedByControl)
1186
+ if (sessionSettled || lifecycleFinished || interruptedByControl || result.timedOut)
1191
1187
  return;
1188
+ clearTimeout(timeoutTimer);
1192
1189
  result.timedOut = true;
1190
+ timeoutCause = message;
1193
1191
  result.error = message;
1194
1192
  result.finalOutput = message;
1195
1193
  progress.status = "failed";
@@ -1243,10 +1241,11 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1243
1241
  if (!closeError && promptErrorMessage !== undefined) {
1244
1242
  closeError = promptErrorMessage;
1245
1243
  }
1246
- // A foreground child never loads the parent's ambient extensions, so a
1247
- // provider one registers resolves as "not found" before the child starts.
1248
- // Annotate only a creation/prompt failure that produced no turn; keep the
1249
- // core error and add the host rule and both remedies after it.
1244
+ // A foreground child never loads the parent's ambient extensions. A model
1245
+ // whose provider the parent registry does not serve resolves as "not found"
1246
+ // before the child starts; a provider it does serve is inherited without its
1247
+ // extension's session hooks and can fail the first request. Keep the
1248
+ // original error first and add the host rule and remedies after it.
1250
1249
  if (promptErrorMessage !== undefined
1251
1250
  && closeError === promptErrorMessage
1252
1251
  && isChildModelResolutionFailure(promptErrorMessage)
@@ -1255,11 +1254,20 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1255
1254
  && !launch.session.ambientExtensions) {
1256
1255
  closeError = `${promptErrorMessage}\n\n${formatChildModelResolutionDiagnostic({ agent: agent.name, model: launch.session.model, host: "parent", capabilityCeiling: launch.toolPlan.capabilityCeiling })}`;
1257
1256
  }
1257
+ else if (session?.inheritedProvider
1258
+ && closeError !== undefined
1259
+ && (closeError === promptErrorMessage || closeError === assistantError)
1260
+ && progress.toolCount === 0
1261
+ && (result.messages ?? []).every((message) => message.role !== "assistant" || message.stopReason === "error")) {
1262
+ closeError = `${closeError}\n\n${formatInheritedProviderDiagnostic({ agent: agent.name, model: launch.session.model, provider: session.inheritedProvider, capabilityCeiling: launch.toolPlan.capabilityCeiling })}`;
1263
+ }
1258
1264
  const forcedDrainAfterFinalSuccess = (forced || forcedTermination) && (cleanTerminalAssistantStopReceived || agentSettledReceived) && !closeError;
1259
1265
  const forcedDrainAfterEmptyTerminal = forcedDrainAfterFinalSuccess && hasEmptyTerminalAssistantResponse(result.messages ?? []);
1260
- if (!closeError && (abortedBySignal || session?.shutDown) && !result.interrupted && !result.timedOut) {
1261
- closeError = session?.shutDown ? "Subagent stopped because the parent session shut down." : STOPPED_BEFORE_COMPLETION_ERROR;
1266
+ if (!closeError && (abortedBySignal || session?.shutDown || hostStopReason) && !result.interrupted && !result.timedOut) {
1267
+ closeError = hostStopReason ?? (session?.shutDown ? "Subagent stopped because the parent session shut down." : STOPPED_BEFORE_COMPLETION_ERROR);
1262
1268
  }
1269
+ if (hostStopReason && !result.interrupted && !result.timedOut)
1270
+ result.stopped = true;
1263
1271
  // A workflow child ended by the workflow's abort signal was stopped, not failed.
1264
1272
  if (options.abortedAsStopped && abortedBySignal && !session?.shutDown && !result.interrupted && !result.timedOut)
1265
1273
  result.stopped = true;
@@ -1363,9 +1371,20 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1363
1371
  if (abortedBySignal || interruptedByControl || result.timedOut) {
1364
1372
  abortChild();
1365
1373
  }
1366
- options.onChildSession?.({ steer: (text) => created.steer(text), followUp: (text) => created.followUp(text) });
1374
+ options.onChildSession?.({
1375
+ steer: (text) => created.steer(text),
1376
+ followUp: (text) => created.followUp(text),
1377
+ stop: (reason) => {
1378
+ if (sessionSettled || lifecycleFinished)
1379
+ return;
1380
+ hostStopReason = reason;
1381
+ abortChild();
1382
+ },
1383
+ });
1367
1384
  messageBaseline = created.messages.length;
1368
- await created.prompt(`Task: ${task}`);
1385
+ // A runtime replacement can stop a child that detached while it was still being created.
1386
+ if (!hostStopReason)
1387
+ await created.prompt(`Task: ${task}`);
1369
1388
  settle(undefined);
1370
1389
  }
1371
1390
  catch (error) {
@@ -1486,8 +1505,7 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1486
1505
  result.outputPartial = true;
1487
1506
  }
1488
1507
  result.outputState = fullOutput.trim() || result.structuredOutput !== undefined ? "present" : "absent";
1489
- if (result.timedOut) {
1490
- const timeoutMessage = formatTimeoutMessage(options.timeoutMs ?? 0);
1508
+ if (timeoutCause) {
1491
1509
  let requiredOutputMissing;
1492
1510
  if (options.outputMode === "file-only" && options.outputPath) {
1493
1511
  const outputChanged = hasSingleOutputChangedSinceSnapshot(options.outputPath, shared.outputSnapshot);
@@ -1508,8 +1526,8 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1508
1526
  artifactPaths: shared.artifactPaths,
1509
1527
  });
1510
1528
  fullOutput = fullOutput.trim()
1511
- ? `${timeoutMessage}\n\n${result.timeoutRecovery.message}\n\nPartial output before timeout:\n${fullOutput}`
1512
- : `${timeoutMessage}\n\n${result.timeoutRecovery.message}`;
1529
+ ? `${timeoutCause}\n\n${result.timeoutRecovery.message}\n\nPartial output before timeout:\n${fullOutput}`
1530
+ : `${timeoutCause}\n\n${result.timeoutRecovery.message}`;
1513
1531
  }
1514
1532
  if (options.outputPath && result.exitCode === 0) {
1515
1533
  // The schema is the caller's contract: a bound output file holds the structured result, not closing prose.
@@ -1517,9 +1535,11 @@ async function runSingleAttempt(runtimeCwd, agent, task, model, options, shared)
1517
1535
  fullOutput = stripAcceptanceReport(resolvedOutput.fullOutput);
1518
1536
  result.savedOutputPath = resolvedOutput.savedPath;
1519
1537
  result.outputSaveError = resolvedOutput.saveError;
1520
- if (resolvedOutput.fatalError) {
1538
+ if (isSettlementFatalOutputError(resolvedOutput, options.outputMode)) {
1521
1539
  result.exitCode = 1;
1522
1540
  result.error = result.error ? `${result.error}\n${resolvedOutput.saveError}` : resolvedOutput.saveError;
1541
+ progress.status = "failed";
1542
+ progress.error = result.error;
1523
1543
  }
1524
1544
  if (resolvedOutput.savedPath) {
1525
1545
  result.outputReference = formatSavedOutputReference(resolvedOutput.savedPath, fullOutput);
@@ -1697,7 +1717,7 @@ async function runSyncCompletionInner(runtimeCwd, agents, agentName, task, optio
1697
1717
  error: "Skills not found: pi-subagents",
1698
1718
  }, options.context));
1699
1719
  }
1700
- const systemPrompt = buildEffectiveSystemPrompt({ agent, resolvedSkills, cwd: skillCwd, ...(options.outputPath ? { outputPath: options.outputPath } : {}) });
1720
+ const systemPrompt = buildEffectiveSystemPrompt({ agent, resolvedSkills, cwd: skillCwd });
1701
1721
  const { model: selectedModel, requestedModel } = resolveModelSelection(options.modelOverride ?? agent.model, options.availableModels, agent.modelProvider ?? options.preferredModelProvider, {
1702
1722
  scope: options.modelScope,
1703
1723
  primaryModelFromParent: options.modelOverrideFromParent,
@@ -1760,6 +1780,7 @@ async function runSyncCompletionInner(runtimeCwd, agents, agentName, task, optio
1760
1780
  metadataPath: artifactPathsResult?.metadataPath,
1761
1781
  enabled: options.artifactConfig?.enabled !== false && options.artifactConfig?.includeMetadata !== false,
1762
1782
  runId: options.runId,
1783
+ parentSessionId: options.parentSessionId,
1763
1784
  agent: agentName,
1764
1785
  task,
1765
1786
  result: target,
@@ -2124,6 +2145,7 @@ export async function runSync(runtimeCwd, agents, agentName, task, options) {
2124
2145
  metadataPath: failedResult.artifactPaths?.metadataPath,
2125
2146
  enabled: options.artifactConfig?.enabled !== false && options.artifactConfig?.includeMetadata !== false,
2126
2147
  runId: options.runId,
2148
+ parentSessionId: options.parentSessionId,
2127
2149
  agent: failedResult.agent,
2128
2150
  task: failedResult.task,
2129
2151
  result: failedResult,