@selesai/code 0.8.3 → 0.8.5

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 (518) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +7 -1
  3. package/dist/core/slash-commands.js +1 -0
  4. package/dist/defaults/models.json +41 -55
  5. package/dist/defaults/settings.json +7 -8
  6. package/dist/extensions/handoff-new.ts +1 -1
  7. package/dist/extensions/inline-skills.test.ts +1 -0
  8. package/dist/extensions/inline-skills.ts +1 -1
  9. package/dist/extensions/pi-intercom/CHANGELOG.md +25 -3
  10. package/dist/extensions/pi-intercom/README.md +34 -15
  11. package/dist/extensions/pi-intercom/broker/broker.ts +38 -141
  12. package/dist/extensions/pi-intercom/broker/client-liveness.test.ts +173 -0
  13. package/dist/extensions/pi-intercom/broker/client.ts +78 -150
  14. package/dist/extensions/pi-intercom/broker/extension-state.ts +18 -7
  15. package/dist/extensions/pi-intercom/broker/framing.ts +1 -1
  16. package/dist/extensions/pi-intercom/broker/protocol.ts +182 -0
  17. package/dist/extensions/pi-intercom/broker/spawn.test.ts +106 -7
  18. package/dist/extensions/pi-intercom/broker/spawn.ts +37 -11
  19. package/dist/extensions/pi-intercom/config.test.ts +8 -10
  20. package/dist/extensions/pi-intercom/config.ts +3 -3
  21. package/dist/extensions/pi-intercom/index.ts +218 -147
  22. package/dist/extensions/pi-intercom/intercom.integration.test.ts +891 -103
  23. package/dist/extensions/pi-intercom/package.json +3 -2
  24. package/dist/extensions/pi-intercom/project-agent.test.ts +145 -0
  25. package/dist/extensions/pi-intercom/project-agent.ts +324 -0
  26. package/dist/extensions/pi-intercom/reply-tracker.test.ts +86 -1
  27. package/dist/extensions/pi-intercom/reply-tracker.ts +41 -9
  28. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +49 -9
  29. package/dist/extensions/pi-intercom/test/inline-message.test.ts +9 -9
  30. package/dist/extensions/pi-intercom/types.ts +3 -1
  31. package/dist/extensions/pi-intercom/ui/inline-message.ts +7 -7
  32. package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +2 -2
  33. package/dist/extensions/pi-powerline-footer/CHANGELOG.md +14 -1
  34. package/dist/extensions/pi-powerline-footer/README.md +20 -37
  35. package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +40 -25
  36. package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +149 -18
  37. package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -0
  38. package/dist/extensions/pi-powerline-footer/editor-performance.ts +99 -0
  39. package/dist/extensions/pi-powerline-footer/git-status.ts +15 -0
  40. package/dist/extensions/pi-powerline-footer/index.ts +394 -317
  41. package/dist/extensions/pi-powerline-footer/package.json +1 -1
  42. package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -12
  43. package/dist/extensions/pi-powerline-footer/queue/store.ts +8 -56
  44. package/dist/extensions/pi-powerline-footer/queue/types.ts +1 -2
  45. package/dist/extensions/pi-powerline-footer/segments.ts +0 -3
  46. package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +231 -1
  47. package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +5 -19
  48. package/dist/extensions/pi-powerline-footer/tests/editor-performance.test.ts +43 -0
  49. package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
  50. package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +116 -0
  51. package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +19 -149
  52. package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +6 -0
  53. package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +5 -5
  54. package/dist/extensions/pi-powerline-footer/types.ts +1 -2
  55. package/dist/extensions/pi-subagents/CHANGELOG.md +225 -14
  56. package/dist/extensions/pi-subagents/README.md +66 -1613
  57. package/dist/extensions/pi-subagents/agents/builder.md +0 -1
  58. package/dist/extensions/pi-subagents/agents/delegate.md +14 -0
  59. package/dist/extensions/pi-subagents/agents/oracle.md +74 -0
  60. package/dist/extensions/pi-subagents/agents/reviewer.md +78 -0
  61. package/dist/extensions/pi-subagents/agents/scout.md +50 -0
  62. package/dist/extensions/pi-subagents/agents/worker.md +58 -0
  63. package/dist/extensions/pi-subagents/docs/configuration.md +372 -0
  64. package/dist/extensions/pi-subagents/docs/extension-api.md +308 -0
  65. package/dist/extensions/pi-subagents/docs/missions.md +119 -0
  66. package/dist/extensions/pi-subagents/docs/models.md +192 -0
  67. package/dist/extensions/pi-subagents/docs/observability.md +174 -0
  68. package/dist/extensions/pi-subagents/docs/tool-reference.md +343 -0
  69. package/dist/extensions/pi-subagents/docs/watchdog.md +176 -0
  70. package/dist/extensions/pi-subagents/docs/workflows.md +163 -0
  71. package/dist/extensions/pi-subagents/inspector-runner.mjs +11 -0
  72. package/dist/extensions/pi-subagents/package-lock.json +152 -194
  73. package/dist/extensions/pi-subagents/package.json +9 -10
  74. package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
  75. package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
  76. package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
  77. package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
  78. package/dist/extensions/pi-subagents/prompts/review-loop.md +12 -12
  79. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -17
  80. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +77 -72
  81. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +177 -69
  82. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +28 -8
  83. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +88 -66
  84. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +3 -3
  85. package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +624 -0
  86. package/dist/extensions/pi-subagents/src/agents/agents.ts +38 -19
  87. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +7 -3
  88. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
  89. package/dist/extensions/pi-subagents/src/agents/skills.ts +2 -9
  90. package/dist/extensions/pi-subagents/src/api/delegation.ts +1 -2
  91. package/dist/extensions/pi-subagents/src/api/project-panes.ts +30 -0
  92. package/dist/extensions/pi-subagents/src/extension/config.ts +62 -8
  93. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
  94. package/dist/extensions/pi-subagents/src/extension/doctor.ts +40 -0
  95. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
  96. package/dist/extensions/pi-subagents/src/extension/index.ts +140 -50
  97. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +77 -0
  98. package/dist/extensions/pi-subagents/src/extension/rpc.ts +18 -24
  99. package/dist/extensions/pi-subagents/src/extension/schemas.ts +58 -21
  100. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +39 -0
  101. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +47 -25
  102. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +3 -3
  103. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +460 -64
  104. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +4 -1
  105. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +102 -4
  106. package/dist/extensions/pi-subagents/src/missions/actions.ts +77 -16
  107. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +162 -0
  108. package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +65 -17
  109. package/dist/extensions/pi-subagents/src/missions/store.ts +151 -9
  110. package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
  111. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +260 -0
  112. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
  113. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +374 -0
  114. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +46 -0
  115. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +158 -36
  116. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +294 -134
  117. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +26 -4
  118. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +45 -6
  119. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +33 -15
  120. package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +267 -0
  121. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +145 -60
  122. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +104 -0
  123. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +17 -3
  124. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +114 -6
  125. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +33 -0
  126. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +68 -0
  127. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +71 -0
  128. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +26 -3
  129. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +42 -14
  130. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +12 -24
  131. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +7 -5
  132. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +233 -101
  133. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -4
  134. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +146 -0
  135. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +21 -5
  136. package/dist/extensions/pi-subagents/src/runs/foreground/async-dismiss-action.ts +85 -0
  137. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +43 -18
  138. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +20 -19
  139. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +40 -2
  140. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +188 -46
  141. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +12 -0
  142. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
  143. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +171 -0
  144. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1365 -252
  145. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
  146. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +178 -26
  147. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  148. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +286 -0
  149. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +2 -0
  150. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +32 -5
  151. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +12 -2
  152. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -0
  153. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +509 -117
  154. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
  155. package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +280 -0
  156. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +4 -2
  157. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +189 -32
  158. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +21 -5
  159. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +20 -8
  160. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +128 -3
  161. package/dist/extensions/pi-subagents/src/shared/display-text.ts +100 -0
  162. package/dist/extensions/pi-subagents/src/shared/file-coalescer.ts +9 -0
  163. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +13 -0
  164. package/dist/extensions/pi-subagents/src/shared/formatters.ts +4 -6
  165. package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +51 -0
  166. package/dist/extensions/pi-subagents/src/shared/settings.ts +41 -11
  167. package/dist/extensions/pi-subagents/src/shared/types.ts +192 -3
  168. package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
  169. package/dist/extensions/pi-subagents/src/shared/utils.ts +46 -34
  170. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -14
  171. package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +1 -1
  172. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +14 -12
  173. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +176 -21
  174. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +12 -6
  175. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +52 -18
  176. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +36 -5
  177. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +37 -21
  178. package/dist/extensions/pi-subagents/src/tui/fleet.ts +375 -42
  179. package/dist/extensions/pi-subagents/src/tui/render.ts +201 -68
  180. package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +0 -6
  181. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +5 -4
  182. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +0 -1
  183. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +332 -27
  184. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +15 -15
  185. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  186. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +84 -0
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/package.json +14 -0
  362. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +102 -15
  363. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +507 -306
  364. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +309 -123
  365. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +124 -58
  366. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
  367. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +167 -113
  368. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -1
  369. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +4 -2
  370. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +139 -58
  371. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +324 -59
  372. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +98 -22
  373. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +106 -106
  374. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +416 -106
  375. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +287 -17
  376. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1122 -96
  377. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +107 -20
  378. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
  379. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +26 -6
  380. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
  381. package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
  382. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +1 -1
  383. package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +0 -8
  384. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +194 -59
  385. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +317 -0
  386. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
  387. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
  388. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +334 -248
  389. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +52 -52
  390. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
  391. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +118 -99
  392. package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +160 -0
  393. package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
  394. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +43 -1
  395. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +36 -10
  396. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +387 -30
  397. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +9 -9
  398. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +18 -3
  399. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +99 -40
  400. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +5 -3
  401. package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +7 -7
  402. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +19 -19
  403. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +94 -23
  404. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
  405. package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
  406. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
  407. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +35 -5
  408. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
  409. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +70 -52
  410. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +187 -0
  411. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +125 -71
  412. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +18 -3
  413. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +12 -12
  414. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +17 -23
  415. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +30 -2
  416. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
  417. package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
  418. package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +15 -0
  419. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +91 -47
  420. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +468 -38
  421. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +14 -4
  422. package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +37 -0
  423. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +69 -0
  424. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +79 -2
  425. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +102 -49
  426. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +98 -32
  427. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +7 -6
  428. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +171 -0
  429. package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +116 -0
  430. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +81 -7
  431. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +289 -13
  432. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +42 -1
  433. package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +2 -2
  434. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +11 -2
  435. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +84 -10
  436. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +122 -8
  437. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +8 -8
  438. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +24 -24
  439. package/dist/extensions/pi-subagents/test/unit/owned-process-tree.test.ts +69 -0
  440. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +16 -2
  441. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +7 -7
  442. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
  443. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
  444. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +26 -17
  445. package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +405 -0
  446. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +440 -92
  447. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +24 -8
  448. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +6 -6
  449. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +43 -43
  450. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
  451. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +59 -6
  452. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +19 -19
  453. package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +243 -0
  454. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +68 -168
  455. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +58 -15
  456. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +51 -0
  457. package/dist/extensions/pi-subagents/test/unit/reads-resolution.test.ts +66 -0
  458. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +47 -28
  459. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +12 -12
  460. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +57 -0
  461. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +111 -31
  462. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +121 -0
  463. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
  464. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +65 -50
  465. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +69 -28
  466. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
  467. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +60 -44
  468. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
  469. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +28 -0
  470. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +23 -1
  471. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +32 -5
  472. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
  473. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +130 -92
  474. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
  475. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +85 -0
  476. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
  477. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +24 -0
  478. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +312 -22
  479. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +150 -15
  480. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +65 -26
  481. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +138 -0
  482. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -25
  483. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +5 -5
  484. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +55 -6
  485. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
  486. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
  487. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
  488. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
  489. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +6 -6
  490. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +138 -11
  491. package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
  492. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +113 -0
  493. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +68 -7
  494. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +6 -6
  495. package/dist/extensions/workflow/extension.ts +21 -19
  496. package/dist/extensions/workflow/modes.ts +65 -0
  497. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  498. package/dist/modes/interactive/interactive-mode.js +48 -1
  499. package/dist/skills/pi-subagents/SKILL.md +20 -15
  500. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +77 -83
  501. package/dist/skills/pi-subagents/references/execution-controls.md +215 -106
  502. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +29 -9
  503. package/dist/skills/pi-subagents/references/prompting-and-roles.md +58 -43
  504. package/docs/plans/workflow-autoloop-reference.md +192 -0
  505. package/docs/plans/workflow-subagent-consolidation-planb.md +374 -0
  506. package/docs/plans/workflow-subagent-scripted-merge.md +406 -0
  507. package/docs/quickstart.md +27 -43
  508. package/docs/settings.md +4 -0
  509. package/docs/usage.md +1 -0
  510. package/package.json +2 -1
  511. package/dist/extensions/workflow/adapter.ts +0 -949
  512. package/dist/extensions/workflow/modes/loop.ts +0 -74
  513. package/dist/extensions/workflow/modes/prototype.ts +0 -170
  514. package/dist/extensions/workflow/modes/quicktype.ts +0 -150
  515. package/dist/extensions/workflow/modes/task.ts +0 -105
  516. package/dist/extensions/workflow/run-state.ts +0 -124
  517. package/dist/extensions/workflow/state-machine.ts +0 -484
  518. package/dist/extensions/workflow/validators.ts +0 -42
@@ -5,6 +5,8 @@ import * as path from "node:path";
5
5
  import { pathToFileURL } from "node:url";
6
6
  import type { Message } from "@earendil-works/pi-ai";
7
7
  import { writeAtomicJson } from "../../shared/atomic-json.ts";
8
+ import { createFileCoalescer } from "../../shared/file-coalescer.ts";
9
+ import { isActiveAsyncState, updateActiveRunIndex } from "./active-run-index.ts";
8
10
  import { createChildTranscriptWriter, type ChildTranscriptWriter } from "../../shared/child-transcript.ts";
9
11
  import { closeSteerInbox, consumeInterruptRequest, consumeSteerRequests, deliverInterruptRequest, deliverStopRequest, deliverTimeoutRequest, enqueueStepSteer, steerAcksDir, steerCapabilityPath, stepSteerInboxDir, watchAsyncControlInbox, type SteerAck, type SteerCapability, type SteerRequest } from "./control-channel.ts";
10
12
  import { appendJsonl as appendRawJsonl, formatOutputArtifactContent, getArtifactPaths, writeArtifact, writeMetadata } from "../../shared/artifacts.ts";
@@ -23,11 +25,14 @@ import {
23
25
  type LaunchResolvedChildExtensionsV1,
24
26
  type RuntimeAcknowledgedChildExtensionsV1,
25
27
  type ModelAttempt,
28
+ type PiWriterProcessInstanceExitV1,
29
+ type ProcessTreeTerminalV1,
26
30
  type NestedRouteInfo,
27
31
  type NestedRunSummary,
28
32
  type ResolvedControlConfig,
29
33
  type ResolvedTurnBudget,
30
34
  type ResolvedToolBudget,
35
+ type RunFanoutBudgetDescriptor,
31
36
  type SubagentRunMode,
32
37
  type SubagentOutputState,
33
38
  type UsageBudgetConfig,
@@ -66,15 +71,16 @@ import {
66
71
  DEFAULT_GLOBAL_CONCURRENCY_LIMIT,
67
72
  Semaphore,
68
73
  } from "../shared/parallel-utils.ts";
69
- import { applyThinkingSuffix, buildPiArgs, cleanupTempDir, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/pi-args.ts";
74
+ import { applyThinkingSuffix, buildPiArgs, cleanupTempDir, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan, type SubagentTaskDelivery } from "../shared/pi-args.ts";
70
75
  import { readRuntimeAcknowledgedExtensions } from "../shared/runtime-acknowledged-extensions.ts";
71
76
  import { outputEntryFromAsyncResult, resolveOutputReferences } from "../shared/chain-outputs.ts";
72
- import { createStructuredOutputRuntime, readStructuredOutput } from "../shared/structured-output.ts";
77
+ import { createStructuredOutputRuntime, MISSING_STRUCTURED_OUTPUT_CALL_ERROR, readStructuredOutput } from "../shared/structured-output.ts";
73
78
  import { formatProcessSignalError, isUnexplainedProcessSignal } from "../shared/process-signal.ts";
74
79
  import { readChildToolDiagnosticError } from "../shared/tool-availability.ts";
75
80
  import { collectDynamicResults, DynamicFanoutError, materializeDynamicParallelStep, validateDynamicCollection } from "../shared/dynamic-fanout.ts";
81
+ import { claimRunFanoutBatch, getRunFanoutBudgetSnapshot } from "../shared/run-fanout-budget.ts";
76
82
  import { nestedSummaryFromAsyncStatus, projectNestedEvents, resolveNestedAsyncDir, writeNestedEvent } from "../shared/nested-events.ts";
77
- import { formatModelAttemptNote, isRetryableModelFailure } from "../shared/model-fallback.ts";
83
+ import { formatModelAttemptNote, formatModelRetryNote, isRetryableModelFailure, MODEL_RETRY_DELAYS_MS } from "../shared/model-fallback.ts";
78
84
  import {
79
85
  SUBAGENT_STARTUP_RETRY_DELAYS_MS,
80
86
  formatSubagentStartupRetryExhaustedError,
@@ -83,9 +89,10 @@ import {
83
89
  waitForSubagentStartupRetry,
84
90
  } from "../shared/subagent-startup-retry.ts";
85
91
  import { markProcessTerminalCandidateLeaseRelease, writeProcessTerminalCandidate, type ProcessTerminalCandidate } from "./process-terminal.ts";
92
+ import { createOwnedProcessTreeController, type OwnedProcessTreeController } from "./owned-process-tree.ts";
86
93
  import { createSteeringStatus, recordSteeringRequest, steeringStatus, terminalSteeringNoticeState, updateSteeringTarget } from "./steering.ts";
87
94
  import { attachPostExitStdioGuard, trySignalChild } from "../../shared/post-exit-stdio-guard.ts";
88
- import { detectSubagentError, extractTextFromContent, extractToolArgsPreview, getFinalOutput, hasEmptyTerminalAssistantResponse, readStatus } from "../../shared/utils.ts";
95
+ import { PROMPT_REDACTED, detectSubagentError, extractTextFromContent, extractToolArgsPreview, getFinalOutput, hasEmptyTerminalAssistantResponse, readStatus } from "../../shared/utils.ts";
89
96
  import { evaluateCompletionMutationGuard } from "../shared/completion-guard.ts";
90
97
  import {
91
98
  createMutatingFailureState,
@@ -175,6 +182,7 @@ interface SubagentRunConfig {
175
182
  /** Global cap on simultaneously-running subagent tasks within this run. */
176
183
  globalConcurrencyLimit?: number;
177
184
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
185
+ runFanoutBudget?: RunFanoutBudgetDescriptor;
178
186
  launchContractDigest?: string;
179
187
  launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
180
188
  runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
@@ -230,7 +238,7 @@ interface StepResult {
230
238
  structuredOutputSchemaPath?: string;
231
239
  acceptance?: import("../../shared/types.ts").AcceptanceLedger;
232
240
  watchdog?: import("../../shared/types.ts").ChildWatchdogProgress;
233
- writerProcesses?: Array<{ processInstanceId: string; kind: "pi-writer"; attempt: number; closeObservedAt: number; exitCode: number | null; signal: string | null }>;
241
+ writerProcesses?: PiWriterProcessInstanceExitV1[];
234
242
  writerAttemptCount?: number;
235
243
  runner?: ExternalCliRunnerStatus;
236
244
  externalProcess?: ExternalProcessStatus;
@@ -503,11 +511,14 @@ interface RunPiStreamingResult {
503
511
  toolBudget?: ToolBudgetState;
504
512
  toolBudgetBlocked?: boolean;
505
513
  observedMutationAttempt?: boolean;
514
+ structuredOutputToolInvoked?: boolean;
515
+ structuredOutputMessageStartIndex?: number;
506
516
  watchdog?: ChildWatchdogStateSnapshot;
507
517
  runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
508
518
  processInstanceId: string;
509
519
  processCloseObservedAt?: number;
510
520
  processSignal?: string | null;
521
+ processTree: ProcessTreeTerminalV1;
511
522
  }
512
523
 
513
524
  function runPiStreaming(
@@ -544,7 +555,9 @@ function runPiStreaming(
544
555
  stdio: ["ignore", "pipe", "pipe"],
545
556
  env: spawnEnv,
546
557
  windowsHide: true,
558
+ detached: process.platform !== "win32",
547
559
  });
560
+ let processTreeController: OwnedProcessTreeController | undefined;
548
561
  const stderrTail = createBoundedByteTail();
549
562
  const rawStdoutTail = createBoundedByteTail();
550
563
  const messages: Message[] = [];
@@ -552,6 +565,7 @@ function runPiStreaming(
552
565
  let model: string | undefined;
553
566
  let writerRegistrationError: string | undefined;
554
567
  if (typeof child.pid === "number") {
568
+ processTreeController = createOwnedProcessTreeController(child.pid);
555
569
  try {
556
570
  onWriterProcess?.({ state: "running", pid: child.pid });
557
571
  } catch (writerError) {
@@ -568,6 +582,8 @@ function runPiStreaming(
568
582
  let turnBudgetMessage: string | undefined;
569
583
  let turnBudget: TurnBudgetState | undefined;
570
584
  let observedMutationAttempt = false;
585
+ let structuredOutputToolInvoked = false;
586
+ let structuredOutputMessageStartIndex: number | undefined;
571
587
  let toolCount = 0;
572
588
  const childWatchdogConfig = decodeChildWatchdogConfig(env?.[CHILD_WATCHDOG_CONFIG_ENV]);
573
589
  let childWatchdogState: ChildWatchdogStateSnapshot | undefined;
@@ -658,6 +674,10 @@ function runPiStreaming(
658
674
 
659
675
  if (event.type === "tool_execution_start" && event.toolName) {
660
676
  toolCount += 1;
677
+ if (event.toolName === "structured_output") {
678
+ structuredOutputToolInvoked = true;
679
+ structuredOutputMessageStartIndex = messages.length;
680
+ }
661
681
  observedMutationAttempt = observedMutationAttempt || isMutatingTool(event.toolName, event.args);
662
682
  const toolArgs = extractToolArgsPreview(event.args ?? {});
663
683
  writeOutputLine(toolArgs ? `${event.toolName}: ${toolArgs}` : event.toolName);
@@ -693,7 +713,6 @@ function runPiStreaming(
693
713
  // a lingering stdio holder after `exit`, or a child that never exits.
694
714
  const FINAL_STOP_GRACE_MS = 1000;
695
715
  const HARD_KILL_MS = 3000;
696
- const TIMEOUT_HARD_KILL_MS = 3000;
697
716
  let childExited = false;
698
717
  let forcedTerminationSignal = false;
699
718
  let cleanTerminalAssistantStopReceived = false;
@@ -701,7 +720,6 @@ function runPiStreaming(
701
720
  let finalDrainTimer: NodeJS.Timeout | undefined;
702
721
  let finalHardKillTimer: NodeJS.Timeout | undefined;
703
722
  let watchdogTailTimer: NodeJS.Timeout | undefined;
704
- let timeoutHardKillTimer: NodeJS.Timeout | undefined;
705
723
  let turnBudgetTerminationTimer: NodeJS.Timeout | undefined;
706
724
  let turnBudgetHardKillTimer: NodeJS.Timeout | undefined;
707
725
  let protocolHardKillTimer: NodeJS.Timeout | undefined;
@@ -766,22 +784,16 @@ function runPiStreaming(
766
784
  timedOut = true;
767
785
  interrupted = false;
768
786
  error = timeoutMessage ?? "Subagent timed out.";
769
- trySignalChild(child, "SIGTERM");
770
- timeoutHardKillTimer = setTimeout(() => {
771
- if (!settled) trySignalChild(child, "SIGKILL");
772
- }, TIMEOUT_HARD_KILL_MS);
773
- timeoutHardKillTimer.unref?.();
787
+ if (processTreeController) void processTreeController.terminate();
788
+ else trySignalChild(child, "SIGTERM");
774
789
  });
775
790
  registerStop?.(() => {
776
791
  if (settled || timedOut || stopped) return;
777
792
  stopped = true;
778
793
  interrupted = false;
779
794
  error = stopMessage ?? "Subagent stopped by user.";
780
- trySignalChild(child, "SIGTERM");
781
- timeoutHardKillTimer = setTimeout(() => {
782
- if (!settled) trySignalChild(child, "SIGKILL");
783
- }, TIMEOUT_HARD_KILL_MS);
784
- timeoutHardKillTimer.unref?.();
795
+ if (processTreeController) void processTreeController.terminate();
796
+ else trySignalChild(child, "SIGTERM");
785
797
  });
786
798
  registerTurnBudgetAbort?.((message, state) => {
787
799
  if (settled || timedOut || stopped || turnBudgetExceeded) return;
@@ -810,10 +822,6 @@ function runPiStreaming(
810
822
  finalHardKillTimer = undefined;
811
823
  }
812
824
  clearWatchdogTailTimer();
813
- if (timeoutHardKillTimer) {
814
- clearTimeout(timeoutHardKillTimer);
815
- timeoutHardKillTimer = undefined;
816
- }
817
825
  if (turnBudgetTerminationTimer) {
818
826
  clearTimeout(turnBudgetTerminationTimer);
819
827
  turnBudgetTerminationTimer = undefined;
@@ -875,9 +883,12 @@ function runPiStreaming(
875
883
  childExited = true;
876
884
  clearDrainTimers();
877
885
  });
878
- child.on("close", (exitCode, signal) => {
886
+ child.on("close", async (exitCode, signal) => {
879
887
  settled = true;
880
888
  const processCloseObservedAt = Date.now();
889
+ const processTree = processTreeController
890
+ ? await processTreeController.finishAfterWriterClose()
891
+ : { state: "unknown" as const, reason: "verification-failed" as const, diagnostic: "Writer PID was unavailable." };
881
892
  try {
882
893
  onWriterProcess?.({ state: "none" });
883
894
  } catch {
@@ -923,10 +934,13 @@ function runPiStreaming(
923
934
  turnBudgetExceeded,
924
935
  wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined,
925
936
  observedMutationAttempt,
937
+ structuredOutputToolInvoked,
938
+ structuredOutputMessageStartIndex,
926
939
  watchdog: childWatchdogState,
927
940
  processInstanceId,
928
941
  processCloseObservedAt,
929
942
  processSignal: signal,
943
+ processTree,
930
944
  }));
931
945
  });
932
946
 
@@ -949,7 +963,7 @@ function runPiStreaming(
949
963
  const stderr = stderrTail.text();
950
964
  const finalOutput = getFinalOutput(messages) || rawStdoutTail.text().trim();
951
965
  const spawnErrorMessage = spawnError instanceof Error ? spawnError.message : String(spawnError);
952
- resolve(omitUndefinedProperties({ stderr, exitCode: 1, messages, usage, toolCount, durationMs: Date.now() - startedAt, model, error: stopped ? (stopMessage ?? "Subagent stopped by user.") : timedOut ? (timeoutMessage ?? "Subagent timed out.") : turnBudgetExceeded ? turnBudgetMessage : error ?? assistantError ?? spawnErrorMessage, protocolError, finalOutput: (timedOut || stopped) && !finalOutput.trim() ? (stopped ? stopMessage ?? "Subagent stopped by user." : timeoutMessage ?? "Subagent timed out.") : finalOutput, outputState: finalOutput.trim() ? "present" : "absent", timedOut, stopped, turnBudget, turnBudgetExceeded, wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined, observedMutationAttempt, watchdog: childWatchdogState, processInstanceId }));
966
+ resolve(omitUndefinedProperties({ stderr, exitCode: 1, messages, usage, toolCount, durationMs: Date.now() - startedAt, model, error: stopped ? (stopMessage ?? "Subagent stopped by user.") : timedOut ? (timeoutMessage ?? "Subagent timed out.") : turnBudgetExceeded ? turnBudgetMessage : error ?? assistantError ?? spawnErrorMessage, protocolError, finalOutput: (timedOut || stopped) && !finalOutput.trim() ? (stopped ? stopMessage ?? "Subagent stopped by user." : timeoutMessage ?? "Subagent timed out.") : finalOutput, outputState: finalOutput.trim() ? "present" : "absent", timedOut, stopped, turnBudget, turnBudgetExceeded, wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined, observedMutationAttempt, structuredOutputToolInvoked, structuredOutputMessageStartIndex, watchdog: childWatchdogState, processInstanceId, processTree: { state: "unknown", reason: "verification-failed", diagnostic: spawnErrorMessage } }));
953
967
  });
954
968
  });
955
969
  }
@@ -976,7 +990,7 @@ async function exportSessionHtml(sessionFile: string, outputDir: string, piPacka
976
990
 
977
991
  function createShareLink(htmlPath: string): { shareUrl: string; gistUrl: string } | { error: string } {
978
992
  try {
979
- const auth = spawnSync("gh", ["auth", "status"], { encoding: "utf-8", windowsHide: true });
993
+ const auth = spawnSync("gh", ["auth", "status"], { encoding: "utf-8" });
980
994
  if (auth.status !== 0) {
981
995
  return { error: "GitHub CLI is not logged in. Run 'gh auth login' first." };
982
996
  }
@@ -985,7 +999,7 @@ function createShareLink(htmlPath: string): { shareUrl: string; gistUrl: string
985
999
  }
986
1000
 
987
1001
  try {
988
- const result = spawnSync("gh", ["gist", "create", htmlPath], { encoding: "utf-8", windowsHide: true });
1002
+ const result = spawnSync("gh", ["gist", "create", htmlPath], { encoding: "utf-8" });
989
1003
  if (result.status !== 0) {
990
1004
  const err = (result.stderr || "").trim() || "Failed to create gist.";
991
1005
  return { error: err };
@@ -1093,6 +1107,7 @@ interface SingleStepContext {
1093
1107
  orchestratorIntercomTarget?: string;
1094
1108
  nestedRoute?: NestedRouteInfo;
1095
1109
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
1110
+ runFanoutBudget?: RunFanoutBudgetDescriptor;
1096
1111
  onAttemptStart?: (attempt: { model?: string; thinking?: string }) => void;
1097
1112
  onChildEvent?: (event: ChildEvent) => void;
1098
1113
  onWriterProcess?: (writer: { state: "none" | "spawning" } | { state: "running"; pid: number }) => void;
@@ -1194,7 +1209,7 @@ async function runSingleStep(
1194
1209
  artifactPaths = getArtifactPaths(ctx.artifactsDir, ctx.id, step.agent, index);
1195
1210
  fs.mkdirSync(ctx.artifactsDir, { recursive: true });
1196
1211
  if (ctx.artifactConfig?.includeInput !== false) {
1197
- fs.writeFileSync(artifactPaths.inputPath, `# Task for ${step.agent}\n\n${task}`, "utf-8");
1212
+ fs.writeFileSync(artifactPaths.inputPath, `# Task for ${step.agent}\n\n${PROMPT_REDACTED}; live Prompt Audit only.\n`, "utf-8");
1198
1213
  }
1199
1214
  if (ctx.artifactConfig?.includeTranscript !== false) {
1200
1215
  transcriptWriter = createChildTranscriptWriter({
@@ -1207,7 +1222,7 @@ async function runSingleStep(
1207
1222
  });
1208
1223
  }
1209
1224
  }
1210
- transcriptWriter?.writeInitialUserMessage(task);
1225
+ transcriptWriter?.writeInitialUserMessage(`${PROMPT_REDACTED}; live Prompt Audit only.`);
1211
1226
 
1212
1227
  if (step.runner?.type === "external-cli") {
1213
1228
  const runner: ExternalCliRunnerStatus = {
@@ -1250,7 +1265,7 @@ async function runSingleStep(
1250
1265
  artifactPaths,
1251
1266
  artifactConfig: ctx.artifactConfig,
1252
1267
  output: formatOutputArtifactContent(omitUndefinedProperties({ output: resolvedOutput.fullOutput, error: external.error, metadataPath: ctx.artifactConfig?.includeMetadata === false ? undefined : artifactPaths.metadataPath })),
1253
- metadata: { runId: ctx.id, agent: step.agent, task, runner, externalProcess: external.externalProcess, exitCode: external.exitCode, error: external.error, timestamp: Date.now() },
1268
+ metadata: { runId: ctx.id, agent: step.agent, task: PROMPT_REDACTED, runner, externalProcess: external.externalProcess, exitCode: external.exitCode, error: external.error, timestamp: Date.now() },
1254
1269
  })
1255
1270
  : {};
1256
1271
  return omitUndefinedProperties({
@@ -1280,7 +1295,7 @@ async function runSingleStep(
1280
1295
  let capabilityAudit: import("../shared/capability-ceiling.ts").SubagentCapabilityAudit | undefined;
1281
1296
  let launchResolvedExtensions = step.launchResolvedExtensions;
1282
1297
  const modelAttempts: ModelAttempt[] = [];
1283
- const writerProcesses: Array<{ processInstanceId: string; kind: "pi-writer"; attempt: number; closeObservedAt: number; exitCode: number | null; signal: string | null }> = [];
1298
+ const writerProcesses: PiWriterProcessInstanceExitV1[] = [];
1284
1299
  let writerAttemptCount = 0;
1285
1300
  const attemptNotes: string[] = [];
1286
1301
  const eventsPath = path.join(path.dirname(ctx.outputFile), "events.jsonl");
@@ -1294,6 +1309,10 @@ async function runSingleStep(
1294
1309
 
1295
1310
  let modelIndex = 0;
1296
1311
  let startupAttemptIndex = 0;
1312
+ let modelRetryIndex = 0;
1313
+ // Escalated to "file" after an unexplained zero-activity startup failure so
1314
+ // retries keep the task text out of argv (endpoint pre-exec scans may deny it).
1315
+ let taskDeliveryOverride: SubagentTaskDelivery | undefined;
1297
1316
  modelAttemptsLoop: while (modelIndex < candidates.length) {
1298
1317
  if (ctx.timeoutSignal?.aborted || ctx.stopSignal?.aborted || ctx.skipAcceptance?.()) break;
1299
1318
  const candidate = candidates[modelIndex];
@@ -1319,6 +1338,7 @@ async function runSingleStep(
1319
1338
  parentSessionId: step.parentSessionId,
1320
1339
  baseArgs: ["--mode", "json", "-p"],
1321
1340
  task,
1341
+ taskDelivery: taskDeliveryOverride,
1322
1342
  sessionEnabled,
1323
1343
  sessionDir,
1324
1344
  sessionFile: step.sessionFile,
@@ -1344,6 +1364,10 @@ async function runSingleStep(
1344
1364
  parentControlInbox: ctx.nestedRoute?.controlInbox,
1345
1365
  parentRootRunId: ctx.nestedRoute?.rootRunId,
1346
1366
  parentCapabilityToken: ctx.nestedRoute?.capabilityToken,
1367
+ runFanoutBudget: ctx.runFanoutBudget ? {
1368
+ ...ctx.runFanoutBudget,
1369
+ ...(step.runFanoutPath ? { parentPath: `${ctx.runFanoutBudget.parentPath ? `${ctx.runFanoutBudget.parentPath}/` : ""}${step.runFanoutPath}` } : {}),
1370
+ } : undefined,
1347
1371
  steerInboxDir: ctx.steerInboxDir,
1348
1372
  steerCapabilityPath: ctx.steerCapabilityPath,
1349
1373
  steerAckDir: ctx.steerAckDir,
@@ -1417,6 +1441,7 @@ async function runSingleStep(
1417
1441
  closeObservedAt: run.processCloseObservedAt,
1418
1442
  exitCode: run.exitCode,
1419
1443
  signal: run.processSignal ?? null,
1444
+ processTree: run.processTree,
1420
1445
  });
1421
1446
  }
1422
1447
  if (run.turnBudget) turnBudget = run.turnBudget;
@@ -1444,31 +1469,42 @@ async function runSingleStep(
1444
1469
  const runtimeAcknowledgedExtensions = readRuntimeAcknowledgedExtensions(runtimeAcknowledgedExtensionsPath);
1445
1470
  cleanupTempDir(tempDir);
1446
1471
 
1447
- const hiddenError = run.exitCode === 0 && !run.error && !toolAvailabilityError ? detectSubagentError(run.messages) : null;
1448
- const missingStructuredOutput = effectiveStructuredOutput
1449
- ? !fs.existsSync(effectiveStructuredOutput.outputPath)
1450
- : false;
1472
+ let structuredOutput: unknown;
1473
+ let structuredError: string | undefined;
1474
+ let validatedStructuredOutput = false;
1475
+ if (effectiveStructuredOutput && run.exitCode === 0 && !run.error && !toolAvailabilityError) {
1476
+ if (!run.structuredOutputToolInvoked) {
1477
+ structuredError = MISSING_STRUCTURED_OUTPUT_CALL_ERROR;
1478
+ } else {
1479
+ const structured = await readStructuredOutput({
1480
+ schema: effectiveStructuredOutput.schema,
1481
+ schemaPath: effectiveStructuredOutput.schemaPath,
1482
+ outputPath: effectiveStructuredOutput.outputPath,
1483
+ });
1484
+ if (structured.error) structuredError = structured.error;
1485
+ else {
1486
+ structuredOutput = structured.value;
1487
+ validatedStructuredOutput = true;
1488
+ }
1489
+ }
1490
+ }
1491
+ const errorMessages = validatedStructuredOutput
1492
+ ? run.messages.slice(run.structuredOutputMessageStartIndex ?? run.messages.length)
1493
+ : run.messages;
1494
+ const hiddenError = run.exitCode === 0 && !run.error && !toolAvailabilityError && !structuredError
1495
+ ? detectSubagentError(errorMessages)
1496
+ : null;
1451
1497
  const emptyOutputError = run.exitCode === 0
1452
1498
  && !run.error
1453
1499
  && !toolAvailabilityError
1500
+ && !structuredError
1454
1501
  && !run.finalOutput.trim()
1455
- && (!effectiveStructuredOutput || missingStructuredOutput)
1502
+ && !validatedStructuredOutput
1456
1503
  && (!hiddenError?.hasError || hasEmptyTerminalAssistantResponse(run.messages))
1457
1504
  ? "Subagent produced no output (possible model cold-start or empty response)."
1458
1505
  : undefined;
1459
- let structuredOutput: unknown;
1460
- let structuredError: string | undefined;
1461
- if (effectiveStructuredOutput && run.exitCode === 0 && !run.error && !toolAvailabilityError && !hiddenError?.hasError && !emptyOutputError) {
1462
- const structured = await readStructuredOutput({
1463
- schema: effectiveStructuredOutput.schema,
1464
- schemaPath: effectiveStructuredOutput.schemaPath,
1465
- outputPath: effectiveStructuredOutput.outputPath,
1466
- });
1467
- if (structured.error) structuredError = structured.error;
1468
- else structuredOutput = structured.value;
1469
- }
1470
1506
  const completionGuardEnabled = isAgentContractV1(step.agentContract) ? step.completionGuard === true : step.completionGuard !== false;
1471
- const completionGuard = run.exitCode === 0 && !run.error && !toolAvailabilityError && !hiddenError?.hasError && !emptyOutputError && completionGuardEnabled
1507
+ const completionGuard = run.exitCode === 0 && !run.error && !toolAvailabilityError && !structuredError && !hiddenError?.hasError && !emptyOutputError && completionGuardEnabled
1472
1508
  ? evaluateCompletionMutationGuard(omitUndefinedProperties({
1473
1509
  agent: step.agent,
1474
1510
  task: taskForCompletionGuard,
@@ -1560,6 +1596,10 @@ async function runSingleStep(
1560
1596
  });
1561
1597
  const shouldRetry = await waitForSubagentStartupRetry(retryDelayMs, [ctx.timeoutSignal, ctx.stopSignal]);
1562
1598
  if (!shouldRetry || ctx.skipAcceptance?.()) break modelAttemptsLoop;
1599
+ if (!taskDeliveryOverride && run.processSignal === "SIGKILL") {
1600
+ taskDeliveryOverride = "file";
1601
+ attemptNotes.push("[startup-retry] retrying with file task delivery to keep the task text out of the child process argv.");
1602
+ }
1563
1603
  attempt.error = retryNote;
1564
1604
  attemptNotes.push(retryNote);
1565
1605
  startupAttemptIndex += 1;
@@ -1575,10 +1615,32 @@ async function runSingleStep(
1575
1615
  finalResult.finalOutput = startupError;
1576
1616
  break modelAttemptsLoop;
1577
1617
  }
1578
- if (!isRetryableModelFailure(error) || modelIndex === candidates.length - 1) break modelAttemptsLoop;
1579
- attemptNotes.push(formatModelAttemptNote(attempt, candidates[modelIndex + 1]));
1580
- modelIndex += 1;
1581
- startupAttemptIndex = 0;
1618
+ if (isRetryableModelFailure(error)) {
1619
+ if (modelIndex < candidates.length - 1) {
1620
+ attemptNotes.push(formatModelAttemptNote(attempt, candidates[modelIndex + 1]));
1621
+ modelIndex += 1;
1622
+ modelRetryIndex = 0;
1623
+ startupAttemptIndex = 0;
1624
+ continue;
1625
+ }
1626
+ const modelRetryDelayMs = MODEL_RETRY_DELAYS_MS[modelRetryIndex];
1627
+ if (modelRetryDelayMs !== undefined) {
1628
+ const retryNote = formatModelRetryNote({
1629
+ model: attempt.model,
1630
+ attempt: modelRetryIndex + 1,
1631
+ maxAttempts: MODEL_RETRY_DELAYS_MS.length + 1,
1632
+ delayMs: modelRetryDelayMs,
1633
+ });
1634
+ const shouldRetry = await waitForSubagentStartupRetry(modelRetryDelayMs, [ctx.timeoutSignal, ctx.stopSignal]);
1635
+ if (!shouldRetry || ctx.skipAcceptance?.()) break modelAttemptsLoop;
1636
+ attempt.error = retryNote;
1637
+ attemptNotes.push(retryNote);
1638
+ modelRetryIndex += 1;
1639
+ startupAttemptIndex = 0;
1640
+ continue;
1641
+ }
1642
+ }
1643
+ break modelAttemptsLoop;
1582
1644
  }
1583
1645
 
1584
1646
  const rawOutput = finalResult?.finalOutput ?? "";
@@ -1635,6 +1697,8 @@ async function runSingleStep(
1635
1697
  signal: combinedAbortSignal([ctx.timeoutSignal, ctx.stopSignal]),
1636
1698
  abortMessage: ctx.stopSignal?.aborted ? ctx.stopMessage ?? "Subagent stopped by user." : ctx.timeoutMessage ?? "Subagent timed out.",
1637
1699
  reportOptional: isAgentContractV1(step.agentContract),
1700
+ artifactsDir: ctx.artifactsDir,
1701
+ runId: ctx.id,
1638
1702
  }))
1639
1703
  : undefined;
1640
1704
  const stoppedAfterAcceptance = finalResult?.stopped === true || ctx.stopSignal?.aborted === true;
@@ -1675,7 +1739,7 @@ async function runSingleStep(
1675
1739
  metadata: {
1676
1740
  runId: ctx.id,
1677
1741
  agent: step.agent,
1678
- task,
1742
+ task: PROMPT_REDACTED,
1679
1743
  exitCode: effectiveFinalExitCode,
1680
1744
  model: finalResult?.model,
1681
1745
  attemptedModels: attemptedModels.length > 0 ? attemptedModels : undefined,
@@ -1932,6 +1996,47 @@ function combinedAbortSignal(signals: Array<AbortSignal | undefined>): AbortSign
1932
1996
  return controller.signal;
1933
1997
  }
1934
1998
 
1999
+ async function runSingleStepWithTimeout(
2000
+ step: SubagentStep,
2001
+ ctx: SingleStepContext,
2002
+ parentDeadlineAt?: number,
2003
+ ): Promise<SingleStepResult> {
2004
+ if (step.timeoutMs === undefined) return runSingleStep(step, ctx);
2005
+
2006
+ const parentRemainingMs = parentDeadlineAt === undefined ? undefined : Math.max(0, parentDeadlineAt - Date.now());
2007
+ const timeoutMs = parentRemainingMs === undefined ? step.timeoutMs : Math.min(step.timeoutMs, parentRemainingMs);
2008
+ const timeoutMessage = parentRemainingMs !== undefined && parentRemainingMs <= step.timeoutMs
2009
+ ? ctx.timeoutMessage
2010
+ : `Subagent timed out after ${step.timeoutMs}ms.`;
2011
+ const timeoutController = new AbortController();
2012
+ let timeoutAction: (() => void) | undefined;
2013
+ let timeoutTriggered = false;
2014
+ const triggerTimeout = (): void => {
2015
+ if (timeoutTriggered) return;
2016
+ timeoutTriggered = true;
2017
+ timeoutController.abort();
2018
+ timeoutAction?.();
2019
+ };
2020
+ const registerTimeout = (action: (() => void) | undefined): void => {
2021
+ timeoutAction = action;
2022
+ ctx.registerTimeout?.(action ? triggerTimeout : undefined);
2023
+ if (action && timeoutTriggered) action();
2024
+ };
2025
+ const timer = setTimeout(triggerTimeout, timeoutMs);
2026
+ timer.unref?.();
2027
+ try {
2028
+ return await runSingleStep(step, {
2029
+ ...ctx,
2030
+ registerTimeout,
2031
+ timeoutSignal: combinedAbortSignal([ctx.timeoutSignal, timeoutController.signal]),
2032
+ timeoutMessage,
2033
+ });
2034
+ } finally {
2035
+ clearTimeout(timer);
2036
+ ctx.registerTimeout?.(undefined);
2037
+ }
2038
+ }
2039
+
1935
2040
  async function runSubagent(
1936
2041
  config: SubagentRunConfig,
1937
2042
  onWriterProcess?: (writer: { state: "none" | "spawning" } | { state: "running"; pid: number }) => void,
@@ -2105,6 +2210,7 @@ async function runSubagent(
2105
2210
  ...(config.launchContractDigest ? { launchContractDigest: config.launchContractDigest } : {}),
2106
2211
  ...(config.launchResolvedExtensions ? { launchResolvedExtensions: config.launchResolvedExtensions } : {}),
2107
2212
  ...(config.capabilityCeiling ? { capabilityCeiling: config.capabilityCeiling } : {}),
2213
+ ...(config.runFanoutBudget ? { runFanoutBudget: getRunFanoutBudgetSnapshot(config.runFanoutBudget) } : {}),
2108
2214
  ...(config.parentWorkflowRunId ? { parentWorkflowRunId: config.parentWorkflowRunId } : {}),
2109
2215
  ...(config.workflowKey ? { workflowKey: config.workflowKey } : {}),
2110
2216
  ...(config.runnerProcessInstanceId ? { processTerminal: { version: 1 as const, state: "pending" as const, runId: id, runnerProcessInstanceId: config.runnerProcessInstanceId } } : {}),
@@ -2116,6 +2222,7 @@ async function runSubagent(
2116
2222
 
2117
2223
  fs.mkdirSync(asyncDir, { recursive: true });
2118
2224
  writeAtomicJson(statusPath, statusPayload);
2225
+ updateActiveRunIndex(asyncDir, statusPayload.state);
2119
2226
  let pendingParallelUsageCost: CostSummary = { inputTokens: 0, outputTokens: 0, costUsd: 0 };
2120
2227
  const currentUsageTotals = (): CostSummary => {
2121
2228
  const cost = results.reduce<CostSummary>((sum, result) => ({
@@ -2188,11 +2295,25 @@ async function runSubagent(
2188
2295
  for (const node of graph.nodes) updateNode(node);
2189
2296
  statusPayload.workflowGraph = graph;
2190
2297
  };
2191
- const writeStatusPayload = (): void => {
2298
+ let lastIndexedActiveState = isActiveAsyncState(statusPayload.state);
2299
+ const writeStatusPayloadNow = (): void => {
2192
2300
  refreshWorkflowGraph();
2193
2301
  writeAtomicJson(statusPath, statusPayload);
2302
+ const activeState = isActiveAsyncState(statusPayload.state);
2303
+ if (activeState && activeState !== lastIndexedActiveState) {
2304
+ updateActiveRunIndex(asyncDir, statusPayload.state);
2305
+ }
2306
+ lastIndexedActiveState = activeState;
2194
2307
  emitNestedSelfEvent(statusPayload.state === "running" || statusPayload.state === "queued" ? "subagent.nested.updated" : "subagent.nested.completed");
2195
2308
  };
2309
+ const statusWriteCoalescer = createFileCoalescer(writeStatusPayloadNow, 100);
2310
+ const writeStatusPayload = (immediate = true): void => {
2311
+ if (immediate || statusPayload.state !== "running" || statusPayload.activityState !== undefined) {
2312
+ if (!statusWriteCoalescer.flush(statusPath)) writeStatusPayloadNow();
2313
+ return;
2314
+ }
2315
+ statusWriteCoalescer.schedule(statusPath);
2316
+ };
2196
2317
  const updateExternalProcess = (index: number, process: ExternalProcessStatus): void => {
2197
2318
  requiredStatusStep(statusPayload, index).externalProcess = process;
2198
2319
  statusPayload.lastUpdate = Date.now();
@@ -2264,7 +2385,7 @@ async function runSubagent(
2264
2385
  const nestedAsyncDir = run.asyncDir ?? resolveNestedAsyncDir(config.nestedRoute.rootRunId, run);
2265
2386
  if (!nestedAsyncDir) continue;
2266
2387
  try {
2267
- deliverInterruptRequest(omitUndefinedProperties({ asyncDir: nestedAsyncDir, pid: run.pid, source: "ancestor-interrupt" }));
2388
+ deliverInterruptRequest({ asyncDir: nestedAsyncDir, source: "ancestor-interrupt" });
2268
2389
  } catch (error) {
2269
2390
  appendJsonl(eventsPath, JSON.stringify({
2270
2391
  type: "subagent.nested.interrupt_failed",
@@ -2611,7 +2732,10 @@ async function runSubagent(
2611
2732
  const now = Date.now();
2612
2733
  if (ack.state === "delivered") {
2613
2734
  updateSteeringLifecycleTarget(ack.requestId, ack.index, late ? "late" : "delivered", now, omitUndefinedProperties({ reason: late ? "acknowledged after recovery commit" : undefined }));
2614
- emitSteeringEvent("subagent.steer.delivered", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { late, message: ack.message });
2735
+ emitSteeringEvent("subagent.steer.delivered", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { late, deliveryStatus: "delivered", message: ack.message });
2736
+ } else if (ack.state === "queued") {
2737
+ updateSteeringLifecycleTarget(ack.requestId, ack.index, "queued", now);
2738
+ emitSteeringEvent("subagent.steer.queued", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { deliveryStatus: "queued", message: ack.message });
2615
2739
  } else {
2616
2740
  markSteeringAttention(ack.index);
2617
2741
  updateSteeringLifecycleTarget(ack.requestId, ack.index, "failed", now, { reason: ack.message });
@@ -2716,7 +2840,7 @@ async function runSubagent(
2716
2840
  step.lastActivityAt = now;
2717
2841
  statusPayload.lastActivityAt = now;
2718
2842
  statusPayload.lastUpdate = now;
2719
- writeStatusPayload();
2843
+ writeStatusPayload(false);
2720
2844
  return;
2721
2845
  }
2722
2846
  if (event.type === "tool_execution_start" && event.toolName) {
@@ -2852,7 +2976,7 @@ async function runSubagent(
2852
2976
  statusPayload.lastActivityAt = now;
2853
2977
  statusPayload.lastUpdate = now;
2854
2978
  maybeEmitActiveLongRunning(flatIndex, now);
2855
- writeStatusPayload();
2979
+ writeStatusPayload(false);
2856
2980
  };
2857
2981
  const updateRunnerActivityState = (now: number): boolean => {
2858
2982
  if (!controlConfig.enabled) return false;
@@ -2951,7 +3075,6 @@ async function runSubagent(
2951
3075
  if (stopped || timedOut || interrupted || statusPayload.state !== "running") return;
2952
3076
  stopped = true;
2953
3077
  const now = Date.now();
2954
- statusPayload.state = "stopped";
2955
3078
  statusPayload.stopped = true;
2956
3079
  statusPayload.error = stopMessage;
2957
3080
  currentActivityState = undefined;
@@ -2984,7 +3107,6 @@ async function runSubagent(
2984
3107
  timedOut = true;
2985
3108
  const now = Date.now();
2986
3109
  const message = timeoutMessage ?? "Subagent timed out.";
2987
- statusPayload.state = "failed";
2988
3110
  statusPayload.timedOut = true;
2989
3111
  statusPayload.error = message;
2990
3112
  currentActivityState = undefined;
@@ -3174,6 +3296,9 @@ async function runSubagent(
3174
3296
  throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} materialized ${materialized.parallel.length} items that resolve output to the same path: ${step.parallel.outputPath}. Remove the explicit output path or use an inherited relative agent output so each item can be isolated.`);
3175
3297
  }
3176
3298
  if (materialized.collectedOnEmpty) await validateDynamicCollection(step.collect.outputSchema, materialized.collectedOnEmpty);
3299
+ if (!config.runFanoutBudget) throw new Error("Async runner is missing its run fan-out budget identity.");
3300
+ const runFanoutBudget = claimRunFanoutBatch(config.runFanoutBudget, materialized.parallel.map((_, itemIndex) => `chain[${stepIndex}].expand[${itemIndex}]`));
3301
+ statusPayload.runFanoutBudget = runFanoutBudget;
3177
3302
  } catch (error) {
3178
3303
  const now = Date.now();
3179
3304
  const message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);
@@ -3280,6 +3405,7 @@ async function runSubagent(
3280
3405
  const materializedTask = step.parallel.namespaceOutputPath ? injectSingleOutputInstruction(taskText, outputPath, step.parallel) : taskText;
3281
3406
  return omitUndefinedProperties({
3282
3407
  ...step.parallel,
3408
+ runFanoutPath: `chain[${stepIndex}].expand[${itemIndex}]`,
3283
3409
  task: materializedTask,
3284
3410
  effectiveAcceptance: resolveEffectiveAcceptance(omitUndefinedProperties({
3285
3411
  explicit: step.parallel.acceptanceInput,
@@ -3423,7 +3549,7 @@ async function runSubagent(
3423
3549
  writeStatusPayload();
3424
3550
  appendJsonl(eventsPath, JSON.stringify({ type: "subagent.step.started", ts: taskStartTime, runId: id, stepIndex: fi, agent: task.agent }));
3425
3551
  flushPendingStepSteers(fi);
3426
- const singleResult = await runSingleStep(task, compactOptional<SingleStepContext>({
3552
+ const singleResult = await runSingleStepWithTimeout(task, compactOptional<SingleStepContext>({
3427
3553
  previousOutput, placeholder, cwd, sessionEnabled,
3428
3554
  outputs,
3429
3555
  sessionDir: config.sessionDir ? path.join(config.sessionDir, `dynamic-${stepIndex}-${taskIdx}`) : undefined,
@@ -3439,6 +3565,7 @@ async function runSubagent(
3439
3565
  orchestratorIntercomTarget: config.controlIntercomTarget,
3440
3566
  nestedRoute: config.nestedRoute,
3441
3567
  capabilityCeiling: config.capabilityCeiling,
3568
+ runFanoutBudget: config.runFanoutBudget,
3442
3569
  registerInterrupt: (interrupt) => registerStepInterrupt(fi, interrupt),
3443
3570
  registerTimeout: (interrupt) => registerStepTimeout(fi, interrupt),
3444
3571
  registerStop: (stop) => registerStepStop(fi, stop),
@@ -3453,7 +3580,7 @@ async function runSubagent(
3453
3580
  onWriterProcess,
3454
3581
  onExternalProcess: (process) => updateExternalProcess(fi, process),
3455
3582
  skipAcceptance: () => timedOut || stopped,
3456
- }));
3583
+ }), config.deadlineAt);
3457
3584
  const taskEndTime = Date.now();
3458
3585
  const childInterrupted = singleResult.interrupted === true;
3459
3586
  const childStopped = singleResult.stopped === true;
@@ -3805,7 +3932,7 @@ async function runSubagent(
3805
3932
  const { taskForRun, taskCwd } = prepareParallelTaskRun(task, cwd, worktreeSetup, taskIdx);
3806
3933
  flushPendingStepSteers(fi);
3807
3934
 
3808
- const singleResult = await runSingleStep(taskForRun, compactOptional<SingleStepContext>({
3935
+ const singleResult = await runSingleStepWithTimeout(taskForRun, compactOptional<SingleStepContext>({
3809
3936
  previousOutput, placeholder, cwd: taskCwd, sessionEnabled,
3810
3937
  outputs,
3811
3938
  sessionDir: taskSessionDir,
@@ -3821,6 +3948,7 @@ async function runSubagent(
3821
3948
  orchestratorIntercomTarget: config.controlIntercomTarget,
3822
3949
  nestedRoute: config.nestedRoute,
3823
3950
  capabilityCeiling: config.capabilityCeiling,
3951
+ runFanoutBudget: config.runFanoutBudget,
3824
3952
  registerInterrupt: (interrupt) => registerStepInterrupt(fi, interrupt),
3825
3953
  registerTimeout: (interrupt) => registerStepTimeout(fi, interrupt),
3826
3954
  registerStop: (stop) => registerStepStop(fi, stop),
@@ -3835,7 +3963,7 @@ async function runSubagent(
3835
3963
  onWriterProcess,
3836
3964
  onExternalProcess: (process) => updateExternalProcess(fi, process),
3837
3965
  skipAcceptance: () => timedOut || stopped,
3838
- }));
3966
+ }), config.deadlineAt);
3839
3967
  if (task.sessionFile) {
3840
3968
  latestSessionFile = task.sessionFile;
3841
3969
  }
@@ -4094,7 +4222,7 @@ async function runSubagent(
4094
4222
  }));
4095
4223
 
4096
4224
  flushPendingStepSteers(flatIndex);
4097
- const singleResult = await runSingleStep(seqStep, compactOptional<SingleStepContext>({
4225
+ const singleResult = await runSingleStepWithTimeout(seqStep, compactOptional<SingleStepContext>({
4098
4226
  previousOutput, placeholder, cwd, sessionEnabled,
4099
4227
  outputs: statusPayload.mode === "single" ? undefined : outputs,
4100
4228
  sessionDir: config.sessionDir,
@@ -4110,6 +4238,7 @@ async function runSubagent(
4110
4238
  orchestratorIntercomTarget: config.controlIntercomTarget,
4111
4239
  nestedRoute: config.nestedRoute,
4112
4240
  capabilityCeiling: config.capabilityCeiling,
4241
+ runFanoutBudget: config.runFanoutBudget,
4113
4242
  registerInterrupt: (interrupt) => registerStepInterrupt(flatIndex, interrupt),
4114
4243
  registerTimeout: (interrupt) => registerStepTimeout(flatIndex, interrupt),
4115
4244
  registerStop: (stop) => registerStepStop(flatIndex, stop),
@@ -4124,7 +4253,7 @@ async function runSubagent(
4124
4253
  onWriterProcess,
4125
4254
  onExternalProcess: (process) => updateExternalProcess(flatIndex, process),
4126
4255
  skipAcceptance: () => timedOut || stopped,
4127
- }));
4256
+ }), config.deadlineAt);
4128
4257
  if (seqStep.sessionFile) {
4129
4258
  latestSessionFile = seqStep.sessionFile;
4130
4259
  }
@@ -4354,6 +4483,9 @@ async function runSubagent(
4354
4483
  clearTimeout(timeoutTimer);
4355
4484
  timeoutTimer = undefined;
4356
4485
  }
4486
+ if (!timedOut && !stopped && !interrupted && config.timeoutMs !== undefined && results.some((result) => result.timedOut === true && result.error === timeoutMessage)) {
4487
+ timedOut = true;
4488
+ }
4357
4489
  const signalTerminated = !stopped && !timedOut && !turnBudgetExceeded && !interrupted && results.some((result) => result.exitCode !== 0 && isUnexplainedProcessSignal(omitUndefinedProperties({
4358
4490
  processSignal: result.processSignal,
4359
4491
  interrupted: result.interrupted,
@@ -4370,11 +4502,12 @@ async function runSubagent(
4370
4502
  for (const request of steeringLifecycle.recent) {
4371
4503
  let changed = false;
4372
4504
  for (const target of request.targets) {
4373
- if (target.state !== "scheduled" && target.state !== "routed") continue;
4505
+ if (target.state !== "scheduled" && target.state !== "routed" && target.state !== "queued") continue;
4374
4506
  changed = true;
4375
- updateSteeringLifecycleTarget(request.id, target.index, "failed", Date.now(), { reason: "child terminated before steering delivery" });
4507
+ const reason = target.state === "queued" ? "run ended before queued follow-up delivery" : "child terminated before steering delivery";
4508
+ updateSteeringLifecycleTarget(request.id, target.index, "failed", Date.now(), { reason });
4376
4509
  markSteeringAttention(target.index);
4377
- emitSteeringEvent("subagent.steer.failed", { type: "steer", id: request.id, ts: request.requestedAt, message: "child terminated before steering delivery" }, target.index, { reason: "child terminated before steering delivery" });
4510
+ emitSteeringEvent("subagent.steer.failed", { type: "steer", id: request.id, ts: request.requestedAt, message: reason }, target.index, { reason });
4378
4511
  }
4379
4512
  if (changed) emitTerminalSteeringNotice(request.id, `Steering failed for run ${id}: child terminated before delivery.`);
4380
4513
  }
@@ -4413,39 +4546,6 @@ async function runSubagent(
4413
4546
  }
4414
4547
  }
4415
4548
  writeStatusPayload();
4416
- appendJsonl(
4417
- eventsPath,
4418
- JSON.stringify({
4419
- type: "subagent.run.completed",
4420
- lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
4421
- ts: runEndedAt,
4422
- runId: id,
4423
- status: statusPayload.state,
4424
- durationMs: runEndedAt - overallStartTime,
4425
- totalTokens: statusPayload.totalTokens,
4426
- totalCost: finalTotalCost,
4427
- usageBudget: statusPayload.usageBudget,
4428
- }),
4429
- );
4430
- writeRunLog(logPath, omitUndefinedProperties({
4431
- id,
4432
- mode: statusPayload.mode,
4433
- cwd,
4434
- startedAt: overallStartTime,
4435
- endedAt: runEndedAt,
4436
- steps: statusPayload.steps.map((step) => omitUndefinedProperties({
4437
- agent: step.agent,
4438
- status: step.status,
4439
- durationMs: step.durationMs,
4440
- })),
4441
- summary,
4442
- truncated,
4443
- artifactsDir,
4444
- sessionFile: effectiveSessionFile,
4445
- shareUrl,
4446
- shareError,
4447
- }));
4448
-
4449
4549
  try {
4450
4550
  writeAtomicJson(resultPath, {
4451
4551
  lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
@@ -4545,8 +4645,40 @@ async function runSubagent(
4545
4645
  } catch (err) {
4546
4646
  console.error(`Failed to write result file ${resultPath}:`, err);
4547
4647
  }
4648
+ appendJsonl(
4649
+ eventsPath,
4650
+ JSON.stringify({
4651
+ type: "subagent.run.completed",
4652
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
4653
+ ts: runEndedAt,
4654
+ runId: id,
4655
+ status: statusPayload.state,
4656
+ durationMs: runEndedAt - overallStartTime,
4657
+ totalTokens: statusPayload.totalTokens,
4658
+ totalCost: finalTotalCost,
4659
+ usageBudget: statusPayload.usageBudget,
4660
+ }),
4661
+ );
4662
+ writeRunLog(logPath, omitUndefinedProperties({
4663
+ id,
4664
+ mode: statusPayload.mode,
4665
+ cwd,
4666
+ startedAt: overallStartTime,
4667
+ endedAt: runEndedAt,
4668
+ steps: statusPayload.steps.map((step) => omitUndefinedProperties({
4669
+ agent: step.agent,
4670
+ status: step.status,
4671
+ durationMs: step.durationMs,
4672
+ })),
4673
+ summary,
4674
+ truncated,
4675
+ artifactsDir,
4676
+ sessionFile: effectiveSessionFile,
4677
+ shareUrl,
4678
+ shareError,
4679
+ }));
4548
4680
  if (config.runnerProcessInstanceId) {
4549
- const writers: Record<string, Array<{ processInstanceId: string; kind: "pi-writer"; attempt: number; closeObservedAt: number; exitCode: number | null; signal: string | null }>> = {};
4681
+ const writers: Record<string, PiWriterProcessInstanceExitV1[]> = {};
4550
4682
  const expectedWriters: Record<string, number> = {};
4551
4683
  for (const [index, result] of results.entries()) {
4552
4684
  writers[String(index)] = result.writerProcesses ?? [];