@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,8 +5,10 @@ import * as os from "node:os";
5
5
  import * as path from "node:path";
6
6
  import { after, afterEach, before, beforeEach, describe, it } from "node:test";
7
7
  import { ASYNC_DIR, INTERCOM_DETACH_REQUEST_EVENT, RESULTS_DIR, SUBAGENT_ASYNC_STARTED_EVENT, SUBAGENT_FOREGROUND_COMPLETE_EVENT } from "../../src/shared/types.ts";
8
+ import { ACTIVE_ASYNC_CAPACITY_DIR, acquireActiveAsyncCapacity, activeAsyncCapacitySessionKey, getActiveAsyncCapacitySnapshot } from "../../src/runs/background/active-async-capacity.ts";
8
9
  import { waitForSubagents } from "../../src/runs/background/subagent-wait.ts";
9
- import { sessionLeaseDir } from "../../src/runs/shared/session-lease.ts";
10
+ import { createRunFanoutBudget } from "../../src/runs/shared/run-fanout-budget.ts";
11
+ import { acquireSessionLease, sessionLeaseDir } from "../../src/runs/shared/session-lease.ts";
10
12
  import type { MockPi } from "../support/helpers.ts";
11
13
  import {
12
14
  createMockPi,
@@ -26,6 +28,7 @@ interface ExecutorResult {
26
28
  runId?: string;
27
29
  results?: Array<{ agent?: string; finalOutput?: string; sessionFile?: string; acceptance?: { status?: string }; artifactPaths?: { metadataPath?: string } }>;
28
30
  asyncId?: string;
31
+ workflow?: { value?: unknown };
29
32
  };
30
33
  }
31
34
 
@@ -81,6 +84,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
81
84
  let mockPi: MockPi;
82
85
  let originalHome: string | undefined;
83
86
  let originalUserProfile: string | undefined;
87
+ let budgetDirectories: string[] = [];
84
88
 
85
89
  before(() => {
86
90
  originalHome = process.env.HOME;
@@ -111,6 +115,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
111
115
 
112
116
  afterEach(() => {
113
117
  removeTempDir(tempDir);
118
+ for (const directory of budgetDirectories.splice(0)) fs.rmSync(directory, { recursive: true, force: true });
114
119
  });
115
120
 
116
121
  async function readMockCallArgs(index: number): Promise<string[]> {
@@ -161,7 +166,39 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
161
166
  }
162
167
  }
163
168
 
164
- function makeExecutor(options: { bridgeMode?: "always" | "off"; resultDelivery?: boolean; agents?: ReturnType<typeof makeAgent>[]; acknowledgeResults?: boolean; kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean } = {}) {
169
+ async function waitForStatus(filePath: string, predicate: (status: any) => boolean, timeoutMs = 10_000): Promise<any> {
170
+ const deadline = Date.now() + timeoutMs;
171
+ let lastStatus: any;
172
+ while (Date.now() <= deadline) {
173
+ if (fs.existsSync(filePath)) {
174
+ lastStatus = JSON.parse(fs.readFileSync(filePath, "utf-8"));
175
+ if (predicate(lastStatus)) return lastStatus;
176
+ }
177
+ await new Promise((resolve) => setTimeout(resolve, 50));
178
+ }
179
+ assert.fail(`Timed out waiting for status at ${filePath}; last status: ${JSON.stringify(lastStatus)}`);
180
+ }
181
+
182
+ function writeRecoveryDescriptor(asyncDir: string, runId: string, agent = "worker", overrides: Record<string, unknown> = {}): void {
183
+ const runFanoutBudget = createRunFanoutBudget(runId, 64);
184
+ budgetDirectories.push(runFanoutBudget.directory);
185
+ fs.writeFileSync(path.join(asyncDir, "recovery-descriptor.json"), JSON.stringify({
186
+ version: 1,
187
+ runFanoutBudget,
188
+ sourceRunId: runId,
189
+ agent,
190
+ cwd: tempDir,
191
+ systemPromptMode: "replace",
192
+ inheritProjectContext: false,
193
+ inheritSkills: false,
194
+ outputMode: "inline",
195
+ maxSubagentDepth: 2,
196
+ share: false,
197
+ ...overrides,
198
+ }, null, 2), "utf-8");
199
+ }
200
+
201
+ function makeExecutor(options: { bridgeMode?: "always" | "off"; resultDelivery?: boolean; agents?: ReturnType<typeof makeAgent>[]; acknowledgeResults?: boolean; kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean; maxActiveAsyncRunsPerSession?: number } = {}) {
165
202
  const events = createRecordingEventBus({ acknowledgeResults: options.acknowledgeResults ?? true });
166
203
  const state = {
167
204
  baseCwd: tempDir,
@@ -193,24 +230,25 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
193
230
  mode: options.bridgeMode ?? "always",
194
231
  ...(options.resultDelivery === undefined ? {} : { resultDelivery: options.resultDelivery }),
195
232
  },
233
+ ...(options.maxActiveAsyncRunsPerSession === undefined ? {} : { maxActiveAsyncRunsPerSession: options.maxActiveAsyncRunsPerSession }),
196
234
  },
197
235
  asyncByDefault: false,
198
236
  tempArtifactsDir: tempDir,
199
237
  getSubagentSessionRoot: () => tempDir,
200
238
  expandTilde: (value: string) => value,
201
- discoverAgents: () => ({ agents: options.agents ?? [makeAgent("builder")] }),
239
+ discoverAgents: () => ({ agents: options.agents ?? [makeAgent("worker")] }),
202
240
  kill: options.kill,
203
241
  });
204
242
  return { executor, events, state };
205
243
  }
206
244
 
207
245
  it("single foreground runs emit one grouped event and return a compact receipt", async () => {
208
- mockPi.onCall({ output: "Full child output from builder" });
246
+ mockPi.onCall({ output: "Full child output from worker" });
209
247
  const { executor, events } = makeExecutor({ resultDelivery: true });
210
248
 
211
249
  const result = await executor.execute(
212
250
  "single-intercom",
213
- { agent: "builder", task: "Implement feature" },
251
+ { agent: "worker", task: "Implement feature" },
214
252
  new AbortController().signal,
215
253
  undefined,
216
254
  makeMinimalCtx(tempDir),
@@ -221,14 +259,83 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
221
259
  const payload = intercomEvents[0]!.payload as { children?: Array<{ agent?: string; intercomTarget?: string }>; message?: string; mode?: string };
222
260
  assert.equal(payload.mode, "single");
223
261
  assert.equal(payload.children?.length, 1);
224
- assert.equal(payload.children?.[0]?.agent, "builder");
225
- assert.match(payload.children?.[0]?.intercomTarget ?? "", /^subagent-builder-[a-f0-9]+-1$/);
262
+ assert.equal(payload.children?.[0]?.agent, "worker");
263
+ assert.match(payload.children?.[0]?.intercomTarget ?? "", /^subagent-worker-[a-f0-9]+-1$/);
226
264
  assert.match(String(payload.message ?? ""), /Intercom targets below identify child sessions used while they were running/);
227
- assert.match(String(payload.message ?? ""), /Run intercom target: subagent-builder-[a-f0-9]+-1/);
265
+ assert.match(String(payload.message ?? ""), /Run intercom target: subagent-worker-[a-f0-9]+-1/);
228
266
  assert.match(result.content[0]?.text ?? "", /Delivered single subagent result via intercom\./);
229
- assert.doesNotMatch(result.content[0]?.text ?? "", /Full child output from builder/);
267
+ assert.doesNotMatch(result.content[0]?.text ?? "", /Full child output from worker/);
230
268
  assert.equal(result.details?.results?.[0]?.finalOutput, undefined);
231
- assert.match(String(payload.message ?? ""), /Full child output from builder/);
269
+ assert.match(String(payload.message ?? ""), /Full child output from worker/);
270
+ });
271
+
272
+ it("keeps child output available to workflow runs after grouped delivery", async () => {
273
+ mockPi.onCall({ output: "Workflow child output" });
274
+ const { executor, events } = makeExecutor({ resultDelivery: true });
275
+
276
+ const result = await executor.execute(
277
+ "workflow-intercom-output",
278
+ { workflowScript: "const result = await runs.run('worker', { agent: 'worker', task: 'task' }); return result.output;", async: false },
279
+ new AbortController().signal,
280
+ undefined,
281
+ makeMinimalCtx(tempDir),
282
+ );
283
+
284
+ assert.equal(events.emitted.filter((entry) => entry.channel === "subagent:result-intercom").length, 1);
285
+ assert.match(result.content[0]?.text ?? "", /Workflow child output/);
286
+ assert.doesNotMatch(result.content[0]?.text ?? "", /Delivered single subagent result via intercom\./);
287
+ });
288
+
289
+ it("waits for retained workflow resume loops and returns each completed revived child", async () => {
290
+ mockPi.onCall({ output: "Completed retained follow-up one" });
291
+ mockPi.onCall({ output: "Completed retained follow-up two" });
292
+ const sourceRunId = `workflow-resume-source-${Date.now()}`;
293
+ const sourceAsyncDir = path.join(ASYNC_DIR, sourceRunId);
294
+ const sessionFile = path.join(tempDir, "workflow-resume-session.jsonl");
295
+ let revivedIds: string[] = [];
296
+ try {
297
+ fs.mkdirSync(sourceAsyncDir, { recursive: true });
298
+ fs.writeFileSync(sessionFile, "", "utf-8");
299
+ fs.writeFileSync(path.join(sourceAsyncDir, "status.json"), JSON.stringify({
300
+ runId: sourceRunId,
301
+ sessionId: "session-123",
302
+ mode: "single",
303
+ state: "complete",
304
+ startedAt: 100,
305
+ lastUpdate: 200,
306
+ cwd: tempDir,
307
+ sessionFile,
308
+ steps: [{ agent: "worker", status: "complete", sessionFile }],
309
+ }, null, 2), "utf-8");
310
+ writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
311
+ const { executor } = makeExecutor();
312
+
313
+ const result = await executor.execute(
314
+ "workflow-retained-resume",
315
+ {
316
+ workflowScript: `const first = await runs.run("followup-1", { resume: "${sourceRunId}", task: "Continue once" }); const second = await runs.run("followup-2", { resume: first.runId, task: "Continue twice" }); return { firstRunId: first.runId, firstOutput: first.output, runId: second.runId, output: second.output };`,
317
+ async: false,
318
+ },
319
+ new AbortController().signal,
320
+ undefined,
321
+ makeMinimalCtx(tempDir),
322
+ );
323
+
324
+ assert.equal(result.isError, undefined, result.content[0]?.text);
325
+ assert.match(result.content[0]?.text ?? "", /Completed retained follow-up two/);
326
+ assert.doesNotMatch(result.content[0]?.text ?? "", /detached and running in the background/);
327
+ const value = result.details?.workflow?.value as { firstRunId?: string; firstOutput?: string; runId?: string; output?: string } | undefined;
328
+ revivedIds = [value?.firstRunId, value?.runId].filter((id): id is string => Boolean(id));
329
+ assert.equal(revivedIds.length, 2);
330
+ assert.notEqual(revivedIds[0], sourceRunId);
331
+ assert.notEqual(revivedIds[1], revivedIds[0], "expected the latest revived run id from pass two");
332
+ assert.equal(value?.firstOutput, "Completed retained follow-up one");
333
+ assert.equal(value?.output, "Completed retained follow-up two");
334
+ assert.equal(revivedIds.every((id) => !fs.existsSync(path.join(ASYNC_DIR, id, "workflow-result.json"))), true);
335
+ } finally {
336
+ fs.rmSync(sourceAsyncDir, { recursive: true, force: true });
337
+ for (const id of revivedIds) fs.rmSync(path.join(ASYNC_DIR, id), { recursive: true, force: true });
338
+ }
232
339
  });
233
340
 
234
341
  it("falls back to legacy foreground output when the bridge is inactive", async () => {
@@ -237,7 +344,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
237
344
 
238
345
  const result = await executor.execute(
239
346
  "single-no-intercom",
240
- { agent: "builder", task: "Summarize feature" },
347
+ { agent: "worker", task: "Summarize feature" },
241
348
  new AbortController().signal,
242
349
  undefined,
243
350
  makeMinimalCtx(tempDir),
@@ -253,7 +360,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
253
360
 
254
361
  const result = await executor.execute(
255
362
  "single-native-delivery",
256
- { agent: "builder", task: "Summarize feature" },
363
+ { agent: "worker", task: "Summarize feature" },
257
364
  new AbortController().signal,
258
365
  undefined,
259
366
  makeMinimalCtx(tempDir),
@@ -269,7 +376,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
269
376
 
270
377
  const result = await executor.execute(
271
378
  "single-no-ack",
272
- { agent: "builder", task: "Summarize feature" },
379
+ { agent: "worker", task: "Summarize feature" },
273
380
  new AbortController().signal,
274
381
  undefined,
275
382
  makeMinimalCtx(tempDir),
@@ -317,7 +424,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
317
424
 
318
425
  const result = await executor.execute(
319
426
  "workflow-worktree-live-card",
320
- { workflowScript: "const result = await runs.run('builder', { agent: 'builder', task: 'task', worktree: true }); return result.output;", async: false, chatProgress: "live-card" },
427
+ { workflowScript: "const result = await runs.run('worker', { agent: 'worker', task: 'task', worktree: true }); return result.output;", async: false, chatProgress: "live-card" },
321
428
  new AbortController().signal,
322
429
  undefined,
323
430
  makeMinimalCtx(tempDir),
@@ -349,7 +456,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
349
456
  );
350
457
  assert.equal(rejected, true);
351
458
  assert.equal(result.isError, true);
352
- assert.equal(state.foregroundControls.size, 1, "remaining builder still owns queued scheduling");
459
+ assert.equal(state.foregroundControls.size, 1, "remaining worker still owns queued scheduling");
353
460
  await waitForCallCount(3);
354
461
  const liveControl = [...state.foregroundControls.values()][0];
355
462
  assert.equal(liveControl?.currentAgent, "c", "later queued child must remain discoverable after launch");
@@ -379,7 +486,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
379
486
  );
380
487
  assert.equal(rejected, true);
381
488
  assert.equal(result.isError, true);
382
- assert.equal(state.foregroundControls.size, 1, "remaining chain builder still owns queued scheduling");
489
+ assert.equal(state.foregroundControls.size, 1, "remaining chain worker still owns queued scheduling");
383
490
  await waitForCallCount(3);
384
491
  const liveControl = [...state.foregroundControls.values()][0];
385
492
  assert.equal(liveControl?.currentAgent, "c", "later queued chain child must remain discoverable after launch");
@@ -391,12 +498,12 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
391
498
 
392
499
  it("cleans a rejected sequential chain child and releases foreground ownership", async () => {
393
500
  mockPi.onCall({ output: "sequential child output" });
394
- const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("builder")] });
501
+ const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("worker")] });
395
502
  let rejected = false;
396
503
  let ownedControl: { schedulingOwners?: number; activeChildren?: Map<number, unknown> } | undefined;
397
504
  const result = await executor.execute(
398
505
  "chain-sequential-rejection-cleanup",
399
- { chain: [{ agent: "builder", task: "sequential task" }] },
506
+ { chain: [{ agent: "worker", task: "sequential task" }] },
400
507
  new AbortController().signal,
401
508
  (update: { details?: { progress?: Array<{ status?: string }> } }) => {
402
509
  if (rejected || !update.details?.progress?.some((entry) => entry.status === "completed")) return;
@@ -415,10 +522,10 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
415
522
  });
416
523
 
417
524
  it("cleans a sequential chain child after an early tool-budget validation return", async () => {
418
- const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("builder")] });
525
+ const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("worker")] });
419
526
  const execution = executor.execute(
420
527
  "chain-sequential-budget-cleanup",
421
- { chain: [{ agent: "builder", task: "invalid budget task", toolBudget: { hard: 0 } }] },
528
+ { chain: [{ agent: "worker", task: "invalid budget task", toolBudget: { hard: 0 } }] },
422
529
  new AbortController().signal,
423
530
  undefined,
424
531
  makeMinimalCtx(tempDir),
@@ -443,11 +550,11 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
443
550
  ].map((entry) => JSON.stringify(entry)).join("\n") + "\n",
444
551
  structuredOutputCapture: { ok: true },
445
552
  });
446
- const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("builder")] });
553
+ const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("worker")] });
447
554
  let structuredDir: string | undefined;
448
555
  const result = await executor.execute(
449
556
  "single-rejection-cleanup",
450
- { agent: "builder", task: "structured task", artifacts: false, outputSchema: { type: "object", properties: { ok: { type: "boolean" } }, required: ["ok"] } },
557
+ { agent: "worker", task: "structured task", artifacts: false, outputSchema: { type: "object", properties: { ok: { type: "boolean" } }, required: ["ok"] } },
451
558
  new AbortController().signal,
452
559
  (update: { details?: { results?: Array<{ structuredOutputPath?: string }>; progress?: Array<{ status?: string }> } }) => {
453
560
  const outputPath = update.details?.results?.[0]?.structuredOutputPath;
@@ -541,7 +648,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
541
648
  pid: process.pid,
542
649
  startedAt: 100,
543
650
  lastUpdate: Date.now(),
544
- steps: [{ agent: "builder", status: "running" }],
651
+ steps: [{ agent: "worker", status: "running" }],
545
652
  }, null, 2), "utf-8");
546
653
  const { executor, events } = makeExecutor({
547
654
  kill: (pid, signal) => {
@@ -583,7 +690,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
583
690
  pid: process.pid,
584
691
  startedAt: 100,
585
692
  lastUpdate: Date.now(),
586
- steps: [{ agent: "builder", status: "running" }],
693
+ steps: [{ agent: "worker", status: "running" }],
587
694
  }, null, 2), "utf-8");
588
695
  const { executor } = makeExecutor();
589
696
 
@@ -607,9 +714,9 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
607
714
  it("resume action rejects explicit reviewed acceptance before launching", async () => {
608
715
  for (const [index, params] of [
609
716
  { message: "Continue", acceptance: "reviewed" },
610
- { chain: [{ agent: "commentator", task: "Review {previous}", acceptance: { level: "reviewed" } }] },
717
+ { chain: [{ agent: "reviewer", task: "Review {previous}", acceptance: { level: "reviewed" } }] },
611
718
  ].entries()) {
612
- const { executor, events } = makeExecutor({ agents: [makeAgent("commentator")] });
719
+ const { executor, events } = makeExecutor({ agents: [makeAgent("reviewer")] });
613
720
  const result = await executor.execute(
614
721
  `resume-invalid-acceptance-${index}`,
615
722
  { action: "resume", id: "missing-source-run", ...params },
@@ -642,26 +749,26 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
642
749
  startedAt: 100,
643
750
  lastUpdate: 100,
644
751
  cwd: tempDir,
645
- steps: [{ agent: "builder", status: "running", sessionFile: sourceSession }],
752
+ steps: [{ agent: "worker", status: "running", sessionFile: sourceSession }],
646
753
  }, null, 2), "utf-8");
647
754
  fs.writeFileSync(sourceResultPath, JSON.stringify({
648
755
  id: sourceRunId,
649
756
  sessionId: "session-123",
650
- agent: "builder",
757
+ agent: "worker",
651
758
  mode: "single",
652
759
  success: true,
653
760
  state: "complete",
654
761
  summary: "root output",
655
- results: [{ agent: "builder", output: "root output", success: true, sessionFile: sourceSession }],
762
+ results: [{ agent: "worker", output: "root output", success: true, sessionFile: sourceSession }],
656
763
  }, null, 2), "utf-8");
657
- const { executor, events } = makeExecutor({ agents: [makeAgent("builder"), makeAgent("commentator")] });
764
+ const { executor, events } = makeExecutor({ agents: [makeAgent("worker"), makeAgent("reviewer")] });
658
765
 
659
766
  const result = await executor.execute(
660
767
  "resume-chain-root",
661
768
  {
662
769
  action: "resume",
663
770
  id: sourceRunId,
664
- chain: [{ agent: "commentator", task: "Review this root result: {previous}" }],
771
+ chain: [{ agent: "reviewer", task: "Review this root result: {previous}" }],
665
772
  },
666
773
  new AbortController().signal,
667
774
  undefined,
@@ -671,11 +778,11 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
671
778
  assert.equal(result.isError, undefined);
672
779
  assert.match(result.content[0]?.text ?? "", /Attached async subagent/);
673
780
  const startedEvent = events.emitted.find((entry) => entry.channel === SUBAGENT_ASYNC_STARTED_EVENT)?.payload as { agent?: string; agents?: string[]; chain?: string[]; chainStepCount?: number; goal?: string } | undefined;
674
- assert.equal(startedEvent?.agent, "builder");
675
- assert.deepEqual(startedEvent?.agents, ["builder", "commentator"]);
676
- assert.deepEqual(startedEvent?.chain, ["builder", "commentator"]);
781
+ assert.equal(startedEvent?.agent, "worker");
782
+ assert.deepEqual(startedEvent?.agents, ["worker", "reviewer"]);
783
+ assert.deepEqual(startedEvent?.chain, ["worker", "reviewer"]);
677
784
  assert.equal(startedEvent?.chainStepCount, 2);
678
- assert.equal(startedEvent?.goal, "Review this root result: {previous}");
785
+ assert.equal(startedEvent?.goal, "[prompt redacted]");
679
786
  const attachedId = result.details?.asyncId;
680
787
  assert.ok(attachedId, "expected attached chain async id");
681
788
  assert.match(result.details?.asyncDir ?? "", new RegExp(`${attachedId}$`));
@@ -684,7 +791,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
684
791
  const attachedStatus = JSON.parse(fs.readFileSync(statusPath, "utf-8")) as { mode?: string; chainStepCount?: number; steps?: Array<{ agent?: string; label?: string; status?: string }> };
685
792
  assert.equal(attachedStatus.mode, "chain");
686
793
  assert.equal(attachedStatus.chainStepCount, 2);
687
- assert.deepEqual(attachedStatus.steps?.map((step) => step.agent), ["builder", "commentator"]);
794
+ assert.deepEqual(attachedStatus.steps?.map((step) => step.agent), ["worker", "reviewer"]);
688
795
  assert.match(attachedStatus.steps?.[0]?.label ?? "", /Attached resume-chain-root-/);
689
796
  await waitForFile(path.join(RESULTS_DIR, `${attachedId}.json`));
690
797
  } finally {
@@ -708,19 +815,19 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
708
815
  startedAt: 100,
709
816
  lastUpdate: 200,
710
817
  cwd: tempDir,
711
- steps: [{ agent: "builder", status: "complete" }],
818
+ steps: [{ agent: "worker", status: "complete" }],
712
819
  }, null, 2), "utf-8");
713
820
  fs.writeFileSync(sourceResultPath, JSON.stringify({
714
821
  id: sourceRunId,
715
822
  sessionId: "session-123",
716
- agent: "builder",
823
+ agent: "worker",
717
824
  mode: "single",
718
825
  success: true,
719
826
  state: "complete",
720
827
  summary: "completed root output",
721
- results: [{ agent: "builder", output: "completed root output", success: true }],
828
+ results: [{ agent: "worker", output: "completed root output", success: true }],
722
829
  }, null, 2), "utf-8");
723
- const { executor } = makeExecutor({ agents: [makeAgent("builder"), makeAgent("commentator")] });
830
+ const { executor } = makeExecutor({ agents: [makeAgent("worker"), makeAgent("reviewer")] });
724
831
 
725
832
  const reviveOnly = await executor.execute(
726
833
  "resume-chain-complete-root-revive-only",
@@ -737,7 +844,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
737
844
  {
738
845
  action: "resume",
739
846
  id: sourceRunId,
740
- chain: [{ agent: "commentator", task: "Review this completed root result: {previous}" }],
847
+ chain: [{ agent: "reviewer", task: "Review this completed root result: {previous}" }],
741
848
  },
742
849
  new AbortController().signal,
743
850
  undefined,
@@ -777,6 +884,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
777
884
  { agent: "b", status: "complete", sessionFile: secondSession, model: "anthropic/claude-sonnet-4", thinking: "high" },
778
885
  ],
779
886
  }, null, 2), "utf-8");
887
+ writeRecoveryDescriptor(asyncDir, runId, "b", { model: "anthropic/claude-sonnet-4:high" });
780
888
  const { executor } = makeExecutor({ agents: [makeAgent("a"), makeAgent("b")] });
781
889
 
782
890
  const result = await executor.execute(
@@ -816,8 +924,9 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
816
924
  lastUpdate: 200,
817
925
  cwd: tempDir,
818
926
  sessionFile,
819
- steps: [{ agent: "builder", status: "complete", launchContractDigest: "source-launch-contract-digest" }],
927
+ steps: [{ agent: "worker", status: "complete", launchContractDigest: "source-launch-contract-digest" }],
820
928
  }, null, 2), "utf-8");
929
+ writeRecoveryDescriptor(asyncDir, runId, "worker", { launchContractDigest: "source-launch-contract-digest" });
821
930
  const { executor, events } = makeExecutor();
822
931
 
823
932
  const result = await executor.execute(
@@ -838,7 +947,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
838
947
  assert.ok(revivedId, "expected revived async id");
839
948
  assert.equal(result.details?.sourceLaunchContractDigest, "source-launch-contract-digest");
840
949
  const startedEvent = events.emitted.find((entry) => entry.channel === SUBAGENT_ASYNC_STARTED_EVENT && (entry.payload as { id?: string }).id === revivedId)?.payload as { goal?: string } | undefined;
841
- assert.equal(startedEvent?.goal, "What changed?");
950
+ assert.equal(startedEvent?.goal, "[prompt redacted]");
842
951
  const resultPath = path.join(RESULTS_DIR, `${revivedId}.json`);
843
952
  const deadline = Date.now() + 10_000;
844
953
  while (!fs.existsSync(resultPath)) {
@@ -861,23 +970,14 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
861
970
  fs.writeFileSync(sessionFile, "", "utf-8");
862
971
  fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
863
972
  runId, sessionId: "session-123", mode: "single", state: "paused", startedAt: 100, lastUpdate: 200, cwd: tempDir,
864
- steps: [{ agent: "removed-builder", status: "paused", sessionFile }],
973
+ steps: [{ agent: "removed-worker", status: "paused", sessionFile }],
865
974
  }, null, 2), "utf-8");
866
- fs.writeFileSync(path.join(asyncDir, "recovery-descriptor.json"), JSON.stringify({
867
- version: 1,
868
- sourceRunId: runId,
869
- agent: "removed-builder",
870
- cwd: tempDir,
975
+ writeRecoveryDescriptor(asyncDir, runId, "removed-worker", {
871
976
  model: "anthropic/claude-sonnet-4:high",
872
977
  tools: ["read"],
873
978
  systemPrompt: "Original persisted prompt",
874
- systemPromptMode: "replace",
875
- inheritProjectContext: false,
876
- inheritSkills: false,
877
- outputMode: "inline",
878
979
  maxSubagentDepth: 1,
879
- share: false,
880
- }, null, 2), "utf-8");
980
+ });
881
981
  const { executor } = makeExecutor({ agents: [] });
882
982
 
883
983
  const result = await executor.execute(
@@ -921,8 +1021,9 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
921
1021
  lastUpdate: 200,
922
1022
  cwd: tempDir,
923
1023
  sessionFile,
924
- steps: [{ agent: "builder", status: "complete" }],
1024
+ steps: [{ agent: "worker", status: "complete" }],
925
1025
  }, null, 2), "utf-8");
1026
+ writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
926
1027
  try {
927
1028
  const { executor } = makeExecutor();
928
1029
  const first = await executor.execute(
@@ -967,6 +1068,170 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
967
1068
  }
968
1069
  });
969
1070
 
1071
+ it("marks a resumed workflow child async when its runner starts and fails before proceed", async () => {
1072
+ const parentSessionId = `session-workflow-resume-start-${Date.now()}`;
1073
+ const sourceRunId = `workflow-resume-start-source-${Date.now()}`;
1074
+ const sourceAsyncDir = path.join(ASYNC_DIR, sourceRunId);
1075
+ const sessionFile = path.join(tempDir, "workflow-resume-start-session.jsonl");
1076
+ let workflowRunId: string | undefined;
1077
+ let revivedRunId: string | undefined;
1078
+ try {
1079
+ fs.mkdirSync(sourceAsyncDir, { recursive: true });
1080
+ fs.writeFileSync(sessionFile, "", "utf-8");
1081
+ fs.writeFileSync(path.join(sourceAsyncDir, "status.json"), JSON.stringify({
1082
+ runId: sourceRunId,
1083
+ sessionId: parentSessionId,
1084
+ mode: "single",
1085
+ state: "complete",
1086
+ startedAt: 100,
1087
+ lastUpdate: 200,
1088
+ cwd: tempDir,
1089
+ sessionFile,
1090
+ steps: [{ agent: "worker", status: "complete", sessionFile }],
1091
+ }, null, 2), "utf-8");
1092
+ writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
1093
+ const competingLease = acquireSessionLease({ sessionFile, runId: "workflow-competing-revival", sourceRunId, parentSessionId });
1094
+ const { executor } = makeExecutor({ maxActiveAsyncRunsPerSession: 1 });
1095
+ const ctx = makeMinimalCtx(tempDir);
1096
+ ctx.sessionManager.getSessionId = () => parentSessionId;
1097
+ try {
1098
+ const failed = await executor.execute(
1099
+ "workflow-resume-start-failure",
1100
+ { workflowScript: `return await runs.run("resume-child", { resume: "${sourceRunId}", task: "Continue" });`, async: true },
1101
+ new AbortController().signal,
1102
+ undefined,
1103
+ ctx,
1104
+ );
1105
+ workflowRunId = failed.details?.asyncId;
1106
+ assert.ok(workflowRunId, "expected async workflow id");
1107
+ await waitForFile(path.join(RESULTS_DIR, `${workflowRunId}.json`));
1108
+ const workflowStatusPath = path.join(ASYNC_DIR, workflowRunId, "status.json");
1109
+ const workflowStatus = await waitForStatus(workflowStatusPath, (value) => value?.state === "failed") as { steps?: Array<{ async?: boolean; runId?: string }>; error?: string };
1110
+ revivedRunId = workflowStatus.steps?.[0]?.runId;
1111
+
1112
+ assert.equal(workflowStatus.steps?.[0]?.async, true);
1113
+ assert.ok(revivedRunId, "expected the workflow step to keep revived run identity");
1114
+ assert.match(workflowStatus.error ?? "", /already owned by run 'workflow-competing-revival'/);
1115
+ assert.deepEqual(getActiveAsyncCapacitySnapshot(parentSessionId, 1), { used: 0, limit: 1 });
1116
+ } finally {
1117
+ competingLease.release();
1118
+ }
1119
+ } finally {
1120
+ fs.rmSync(sourceAsyncDir, { recursive: true, force: true });
1121
+ if (workflowRunId) fs.rmSync(path.join(ASYNC_DIR, workflowRunId), { recursive: true, force: true });
1122
+ if (revivedRunId) fs.rmSync(path.join(ASYNC_DIR, revivedRunId), { recursive: true, force: true });
1123
+ fs.rmSync(path.join(ACTIVE_ASYNC_CAPACITY_DIR, activeAsyncCapacitySessionKey(parentSessionId)), { recursive: true, force: true });
1124
+ }
1125
+ });
1126
+
1127
+ it("releases async workflow capacity after child launch preparation fails", async () => {
1128
+ const parentSessionId = `session-workflow-prep-${Date.now()}`;
1129
+ try {
1130
+ const { executor } = makeExecutor({ maxActiveAsyncRunsPerSession: 1 });
1131
+ const ctx = makeMinimalCtx(tempDir);
1132
+ ctx.sessionManager.getSessionId = () => parentSessionId;
1133
+ const failed = await executor.execute(
1134
+ "workflow-prep-capacity-release",
1135
+ {
1136
+ workflowScript: `return await runs.run("gated", { agent: "worker", task: "run", gate: "npm test" });`,
1137
+ async: true,
1138
+ acceptance: false,
1139
+ },
1140
+ new AbortController().signal,
1141
+ undefined,
1142
+ ctx,
1143
+ );
1144
+ const workflowRunId = failed.details?.asyncId;
1145
+ assert.ok(workflowRunId, "expected async workflow id");
1146
+ await waitForFile(path.join(RESULTS_DIR, `${workflowRunId}.json`));
1147
+ const statusPath = path.join(ASYNC_DIR, workflowRunId, "status.json");
1148
+ const status = await waitForStatus(statusPath, (value) => value?.state === "failed") as { state?: string; steps?: Array<{ async?: boolean }>; error?: string };
1149
+
1150
+ assert.equal(status.state, "failed");
1151
+ assert.equal(status.steps?.[0]?.async, false);
1152
+ assert.match(status.error ?? "", /gate cannot be combined with acceptance/);
1153
+ assert.deepEqual(getActiveAsyncCapacitySnapshot(parentSessionId, 1), { used: 0, limit: 1 });
1154
+
1155
+ const next = await executor.execute(
1156
+ "workflow-prep-capacity-next",
1157
+ { workflowScript: `return "ok";`, async: true },
1158
+ new AbortController().signal,
1159
+ undefined,
1160
+ ctx,
1161
+ );
1162
+ assert.equal(next.isError, undefined);
1163
+ const nextWorkflowRunId = next.details?.asyncId;
1164
+ assert.ok(nextWorkflowRunId, "expected the next async workflow to acquire capacity");
1165
+ await waitForFile(path.join(RESULTS_DIR, `${nextWorkflowRunId}.json`));
1166
+ } finally {
1167
+ fs.rmSync(path.join(ACTIVE_ASYNC_CAPACITY_DIR, activeAsyncCapacitySessionKey(parentSessionId)), { recursive: true, force: true });
1168
+ }
1169
+ });
1170
+
1171
+ it("restores active capacity when revival fails before startup proceed", async () => {
1172
+ const parentSessionId = `session-resume-handshake-${Date.now()}`;
1173
+ const sourceRunId = `resume-handshake-source-${Date.now()}`;
1174
+ const sourceAsyncDir = path.join(ASYNC_DIR, sourceRunId);
1175
+ const sessionFile = path.join(tempDir, "resume-handshake-child.jsonl");
1176
+ fs.mkdirSync(sourceAsyncDir, { recursive: true });
1177
+ fs.writeFileSync(sessionFile, "", "utf-8");
1178
+ fs.writeFileSync(path.join(sourceAsyncDir, "status.json"), JSON.stringify({
1179
+ runId: sourceRunId,
1180
+ sessionId: parentSessionId,
1181
+ mode: "single",
1182
+ state: "complete",
1183
+ startedAt: 100,
1184
+ lastUpdate: 200,
1185
+ cwd: tempDir,
1186
+ sessionFile,
1187
+ steps: [{ agent: "worker", status: "complete", sessionFile }],
1188
+ }, null, 2), "utf-8");
1189
+ writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
1190
+ const sourceCapacity = acquireActiveAsyncCapacity({ sessionId: parentSessionId, limit: 1, runId: sourceRunId, kind: "runner", asyncDir: sourceAsyncDir });
1191
+ assert.ok(sourceCapacity);
1192
+ sourceCapacity.markStarted("source-runner");
1193
+ fs.writeFileSync(path.join(sourceAsyncDir, "process-terminal.json"), JSON.stringify({
1194
+ version: 1,
1195
+ state: "observed",
1196
+ runId: sourceRunId,
1197
+ runnerProcessInstanceId: "source-runner",
1198
+ observedAt: Date.now(),
1199
+ instances: [{ kind: "runner", processInstanceId: "source-runner", closeObservedAt: Date.now(), exitCode: 0, signal: null }],
1200
+ }), "utf-8");
1201
+ const competingLease = acquireSessionLease({ sessionFile, runId: "competing-revival", sourceRunId, parentSessionId });
1202
+ try {
1203
+ const { executor } = makeExecutor({ maxActiveAsyncRunsPerSession: 1 });
1204
+ const ctx = makeMinimalCtx(tempDir);
1205
+ ctx.sessionManager.getSessionId = () => parentSessionId;
1206
+ const failed = await executor.execute(
1207
+ "resume-handshake-failure",
1208
+ { action: "resume", id: sourceRunId, message: "Retry safely" },
1209
+ new AbortController().signal,
1210
+ undefined,
1211
+ ctx,
1212
+ );
1213
+ assert.equal(failed.isError, true);
1214
+ assert.match(failed.content[0]?.text ?? "", /already owned by run 'competing-revival'/);
1215
+ const revivedStatusDirs = fs.readdirSync(ASYNC_DIR)
1216
+ .map((name) => path.join(ASYNC_DIR, name))
1217
+ .filter((dir) => {
1218
+ try {
1219
+ const status = JSON.parse(fs.readFileSync(path.join(dir, "status.json"), "utf-8"));
1220
+ return status.sessionId === parentSessionId && status.runId !== sourceRunId && status.processTerminal?.runnerProcessInstanceId;
1221
+ } catch {
1222
+ return false;
1223
+ }
1224
+ });
1225
+ assert.equal(revivedStatusDirs.length, 1, "expected one failed revived run with runner identity");
1226
+ fs.rmSync(path.join(revivedStatusDirs[0]!, "process-terminal.json"), { force: true });
1227
+ assert.deepEqual(getActiveAsyncCapacitySnapshot(parentSessionId, 1), { used: 0, limit: 1 });
1228
+ } finally {
1229
+ competingLease.release();
1230
+ getActiveAsyncCapacitySnapshot(parentSessionId, 1);
1231
+ fs.rmSync(sourceAsyncDir, { recursive: true, force: true });
1232
+ }
1233
+ });
1234
+
970
1235
  it("resume action revives a completed foreground child by index", async () => {
971
1236
  mockPi.onCall({ output: "first child done" });
972
1237
  mockPi.onCall({ output: "second child done" });
@@ -1031,7 +1296,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
1031
1296
  try {
1032
1297
  const original = await executor.execute(
1033
1298
  "foreground-lease-original",
1034
- { agent: "builder", task: "Original task" },
1299
+ { agent: "worker", task: "Original task" },
1035
1300
  new AbortController().signal,
1036
1301
  undefined,
1037
1302
  makeMinimalCtx(tempDir),
@@ -1746,11 +2011,11 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
1746
2011
 
1747
2012
  it("does not treat a synthetic foreground startup error as child output", async () => {
1748
2013
  mockPi.onCall({ output: "", stderr: "mock startup failure", exitCode: 1 });
1749
- const { executor, events } = makeExecutor({ resultDelivery: true, agents: [makeAgent("builder")] });
2014
+ const { executor, events } = makeExecutor({ resultDelivery: true, agents: [makeAgent("worker")] });
1750
2015
 
1751
2016
  await executor.execute(
1752
2017
  "foreground-synthetic-error",
1753
- { agent: "builder", task: "synthetic-error-task" },
2018
+ { agent: "worker", task: "synthetic-error-task" },
1754
2019
  new AbortController().signal,
1755
2020
  undefined,
1756
2021
  makeMinimalCtx(tempDir),