@selesai/code 0.8.3 → 0.8.4

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 (493) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/extensions/handoff-new.ts +1 -1
  3. package/dist/extensions/inline-skills.test.ts +1 -0
  4. package/dist/extensions/inline-skills.ts +1 -1
  5. package/dist/extensions/pi-intercom/CHANGELOG.md +25 -3
  6. package/dist/extensions/pi-intercom/README.md +34 -15
  7. package/dist/extensions/pi-intercom/broker/broker.ts +38 -141
  8. package/dist/extensions/pi-intercom/broker/client-liveness.test.ts +173 -0
  9. package/dist/extensions/pi-intercom/broker/client.ts +78 -150
  10. package/dist/extensions/pi-intercom/broker/extension-state.ts +18 -7
  11. package/dist/extensions/pi-intercom/broker/framing.ts +1 -1
  12. package/dist/extensions/pi-intercom/broker/protocol.ts +182 -0
  13. package/dist/extensions/pi-intercom/broker/spawn.test.ts +106 -7
  14. package/dist/extensions/pi-intercom/broker/spawn.ts +37 -11
  15. package/dist/extensions/pi-intercom/config.test.ts +8 -10
  16. package/dist/extensions/pi-intercom/config.ts +3 -3
  17. package/dist/extensions/pi-intercom/index.ts +218 -147
  18. package/dist/extensions/pi-intercom/intercom.integration.test.ts +891 -103
  19. package/dist/extensions/pi-intercom/package.json +3 -2
  20. package/dist/extensions/pi-intercom/project-agent.test.ts +145 -0
  21. package/dist/extensions/pi-intercom/project-agent.ts +324 -0
  22. package/dist/extensions/pi-intercom/reply-tracker.test.ts +86 -1
  23. package/dist/extensions/pi-intercom/reply-tracker.ts +41 -9
  24. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +49 -9
  25. package/dist/extensions/pi-intercom/test/inline-message.test.ts +9 -9
  26. package/dist/extensions/pi-intercom/types.ts +3 -1
  27. package/dist/extensions/pi-intercom/ui/inline-message.ts +7 -7
  28. package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +2 -2
  29. package/dist/extensions/pi-powerline-footer/CHANGELOG.md +14 -1
  30. package/dist/extensions/pi-powerline-footer/README.md +20 -37
  31. package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +40 -25
  32. package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +149 -18
  33. package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -0
  34. package/dist/extensions/pi-powerline-footer/editor-performance.ts +99 -0
  35. package/dist/extensions/pi-powerline-footer/git-status.ts +15 -0
  36. package/dist/extensions/pi-powerline-footer/index.ts +394 -317
  37. package/dist/extensions/pi-powerline-footer/package.json +1 -1
  38. package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -12
  39. package/dist/extensions/pi-powerline-footer/queue/store.ts +8 -56
  40. package/dist/extensions/pi-powerline-footer/queue/types.ts +1 -2
  41. package/dist/extensions/pi-powerline-footer/segments.ts +0 -3
  42. package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +231 -1
  43. package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +5 -19
  44. package/dist/extensions/pi-powerline-footer/tests/editor-performance.test.ts +43 -0
  45. package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
  46. package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +116 -0
  47. package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +19 -149
  48. package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +6 -0
  49. package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +5 -5
  50. package/dist/extensions/pi-powerline-footer/types.ts +1 -2
  51. package/dist/extensions/pi-subagents/CHANGELOG.md +202 -14
  52. package/dist/extensions/pi-subagents/README.md +65 -1614
  53. package/dist/extensions/pi-subagents/agents/builder.md +0 -1
  54. package/dist/extensions/pi-subagents/agents/delegate.md +14 -0
  55. package/dist/extensions/pi-subagents/agents/oracle.md +74 -0
  56. package/dist/extensions/pi-subagents/agents/reviewer.md +78 -0
  57. package/dist/extensions/pi-subagents/agents/scout.md +50 -0
  58. package/dist/extensions/pi-subagents/agents/worker.md +58 -0
  59. package/dist/extensions/pi-subagents/docs/configuration.md +328 -0
  60. package/dist/extensions/pi-subagents/docs/extension-api.md +308 -0
  61. package/dist/extensions/pi-subagents/docs/missions.md +119 -0
  62. package/dist/extensions/pi-subagents/docs/models.md +192 -0
  63. package/dist/extensions/pi-subagents/docs/observability.md +174 -0
  64. package/dist/extensions/pi-subagents/docs/tool-reference.md +343 -0
  65. package/dist/extensions/pi-subagents/docs/watchdog.md +176 -0
  66. package/dist/extensions/pi-subagents/docs/workflows.md +163 -0
  67. package/dist/extensions/pi-subagents/inspector-runner.mjs +11 -0
  68. package/dist/extensions/pi-subagents/package-lock.json +152 -194
  69. package/dist/extensions/pi-subagents/package.json +9 -10
  70. package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
  71. package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
  72. package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
  73. package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
  74. package/dist/extensions/pi-subagents/prompts/review-loop.md +12 -12
  75. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -17
  76. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +77 -72
  77. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +177 -69
  78. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +28 -8
  79. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +88 -66
  80. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +3 -3
  81. package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +624 -0
  82. package/dist/extensions/pi-subagents/src/agents/agents.ts +29 -16
  83. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +7 -3
  84. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
  85. package/dist/extensions/pi-subagents/src/agents/skills.ts +2 -9
  86. package/dist/extensions/pi-subagents/src/api/delegation.ts +1 -2
  87. package/dist/extensions/pi-subagents/src/api/project-panes.ts +30 -0
  88. package/dist/extensions/pi-subagents/src/extension/config.ts +56 -8
  89. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
  90. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
  91. package/dist/extensions/pi-subagents/src/extension/index.ts +119 -50
  92. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +72 -0
  93. package/dist/extensions/pi-subagents/src/extension/rpc.ts +15 -15
  94. package/dist/extensions/pi-subagents/src/extension/schemas.ts +58 -21
  95. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +39 -0
  96. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +47 -25
  97. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +3 -3
  98. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +460 -64
  99. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +102 -4
  100. package/dist/extensions/pi-subagents/src/missions/actions.ts +77 -16
  101. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +162 -0
  102. package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +65 -14
  103. package/dist/extensions/pi-subagents/src/missions/store.ts +147 -5
  104. package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
  105. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +256 -0
  106. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
  107. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +42 -0
  108. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +41 -7
  109. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +294 -134
  110. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +19 -3
  111. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +39 -6
  112. package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +267 -0
  113. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +145 -60
  114. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +114 -6
  115. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +33 -0
  116. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +68 -0
  117. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +71 -0
  118. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +21 -2
  119. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +42 -14
  120. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +12 -24
  121. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +7 -5
  122. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +152 -68
  123. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -4
  124. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +146 -0
  125. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +21 -5
  126. package/dist/extensions/pi-subagents/src/runs/foreground/async-dismiss-action.ts +85 -0
  127. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +43 -18
  128. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +20 -19
  129. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +3 -0
  130. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +55 -26
  131. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
  132. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +798 -112
  133. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
  134. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +165 -22
  135. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  136. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +2 -0
  137. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +9 -5
  138. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +12 -2
  139. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +1 -0
  140. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +465 -116
  141. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
  142. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +189 -32
  143. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +2 -2
  144. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +3 -3
  145. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +128 -3
  146. package/dist/extensions/pi-subagents/src/shared/display-text.ts +100 -0
  147. package/dist/extensions/pi-subagents/src/shared/file-coalescer.ts +9 -0
  148. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +13 -0
  149. package/dist/extensions/pi-subagents/src/shared/formatters.ts +4 -6
  150. package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +51 -0
  151. package/dist/extensions/pi-subagents/src/shared/settings.ts +41 -11
  152. package/dist/extensions/pi-subagents/src/shared/types.ts +100 -3
  153. package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
  154. package/dist/extensions/pi-subagents/src/shared/utils.ts +43 -33
  155. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -14
  156. package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +1 -1
  157. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +14 -12
  158. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +176 -21
  159. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +12 -6
  160. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +52 -18
  161. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +36 -5
  162. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +30 -16
  163. package/dist/extensions/pi-subagents/src/tui/fleet.ts +151 -31
  164. package/dist/extensions/pi-subagents/src/tui/render.ts +201 -68
  165. package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +0 -6
  166. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +5 -4
  167. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +0 -1
  168. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +313 -25
  169. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +15 -15
  170. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  171. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  172. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  173. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  174. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  175. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  176. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  177. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  178. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  179. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  180. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  181. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  182. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  183. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  184. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  185. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  186. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +84 -0
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/package.json +14 -0
  347. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +15 -15
  348. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +411 -300
  349. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +309 -123
  350. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +99 -56
  351. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
  352. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +159 -108
  353. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -1
  354. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +4 -2
  355. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +56 -56
  356. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +114 -45
  357. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +57 -19
  358. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +106 -106
  359. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +416 -106
  360. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +287 -17
  361. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +809 -87
  362. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +107 -20
  363. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
  364. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +26 -6
  365. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
  366. package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
  367. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +1 -1
  368. package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +0 -8
  369. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +163 -58
  370. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
  371. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
  372. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +334 -248
  373. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +52 -52
  374. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
  375. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +99 -99
  376. package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +160 -0
  377. package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
  378. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +43 -1
  379. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +36 -10
  380. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +387 -30
  381. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +9 -9
  382. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +2 -2
  383. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +94 -40
  384. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +5 -3
  385. package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +7 -7
  386. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +19 -19
  387. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +19 -19
  388. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
  389. package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
  390. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
  391. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +35 -5
  392. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
  393. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +52 -52
  394. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +187 -0
  395. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +125 -71
  396. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +18 -3
  397. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +12 -12
  398. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +17 -23
  399. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
  400. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
  401. package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
  402. package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +15 -0
  403. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +62 -44
  404. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +329 -37
  405. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -4
  406. package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +37 -0
  407. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +69 -0
  408. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +79 -2
  409. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +102 -49
  410. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +98 -32
  411. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +5 -5
  412. package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +116 -0
  413. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +55 -7
  414. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +289 -13
  415. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +28 -1
  416. package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +2 -2
  417. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +11 -2
  418. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +84 -10
  419. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +122 -8
  420. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +8 -8
  421. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +24 -24
  422. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +16 -2
  423. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +7 -7
  424. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
  425. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
  426. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +26 -17
  427. package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +405 -0
  428. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +357 -92
  429. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +22 -6
  430. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +6 -6
  431. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +43 -43
  432. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
  433. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +4 -4
  434. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +19 -19
  435. package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +243 -0
  436. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +68 -168
  437. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +58 -15
  438. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +40 -0
  439. package/dist/extensions/pi-subagents/test/unit/reads-resolution.test.ts +66 -0
  440. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +47 -28
  441. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +12 -12
  442. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +57 -0
  443. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +107 -27
  444. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
  445. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +56 -50
  446. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +69 -28
  447. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
  448. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +59 -44
  449. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
  450. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +23 -1
  451. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +32 -5
  452. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
  453. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +120 -91
  454. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
  455. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +85 -0
  456. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
  457. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +24 -0
  458. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +312 -22
  459. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +150 -15
  460. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +26 -26
  461. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +73 -0
  462. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -25
  463. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +5 -5
  464. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +55 -6
  465. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
  466. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
  467. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
  468. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
  469. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +6 -6
  470. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +138 -11
  471. package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
  472. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +113 -0
  473. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +7 -7
  474. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +6 -6
  475. package/dist/extensions/workflow/extension.ts +21 -19
  476. package/dist/extensions/workflow/modes.ts +65 -0
  477. package/dist/skills/pi-subagents/SKILL.md +20 -15
  478. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +77 -83
  479. package/dist/skills/pi-subagents/references/execution-controls.md +215 -106
  480. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +29 -9
  481. package/dist/skills/pi-subagents/references/prompting-and-roles.md +58 -43
  482. package/docs/plans/workflow-autoloop-reference.md +192 -0
  483. package/docs/plans/workflow-subagent-consolidation-planb.md +374 -0
  484. package/docs/plans/workflow-subagent-scripted-merge.md +406 -0
  485. package/package.json +1 -1
  486. package/dist/extensions/workflow/adapter.ts +0 -949
  487. package/dist/extensions/workflow/modes/loop.ts +0 -74
  488. package/dist/extensions/workflow/modes/prototype.ts +0 -170
  489. package/dist/extensions/workflow/modes/quicktype.ts +0 -150
  490. package/dist/extensions/workflow/modes/task.ts +0 -105
  491. package/dist/extensions/workflow/run-state.ts +0 -124
  492. package/dist/extensions/workflow/state-machine.ts +0 -484
  493. package/dist/extensions/workflow/validators.ts +0 -42
@@ -221,12 +221,12 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
221
221
  it("pauses foreground chains at approval checkpoints without launching the next child", async () => {
222
222
  mockPi.onCall({ output: "analysis done" });
223
223
  mockPi.onCall({ output: "should not run" });
224
- const agents = [makeAgent("analyst"), makeAgent("builder")];
224
+ const agents = [makeAgent("analyst"), makeAgent("worker")];
225
225
 
226
226
  const result = await executeChain!(makeChainParams([
227
227
  { agent: "analyst", task: "Analyze" },
228
228
  { checkpoint: "review", message: "Approve implementation?" },
229
- { agent: "builder", task: "Implement" },
229
+ { agent: "worker", task: "Implement" },
230
230
  ], agents));
231
231
 
232
232
  assert.equal(result.isError, undefined);
@@ -241,10 +241,10 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
241
241
 
242
242
  it("applies global permissions to foreground chain children", async () => {
243
243
  mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
244
- const agents = [makeAgent("builder")];
244
+ const agents = [makeAgent("worker")];
245
245
 
246
246
  const result = await executeChain!(makeChainParams(
247
- [{ agent: "builder", task: "Work" }],
247
+ [{ agent: "worker", task: "Work" }],
248
248
  agents,
249
249
  { permissions: { rules: { write: "ask" } } },
250
250
  ));
@@ -410,11 +410,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
410
410
  "```",
411
411
  ].join("\n"),
412
412
  });
413
- const agents = [makeAgent("builder", { completionGuard: false })];
413
+ const agents = [makeAgent("worker", { completionGuard: false })];
414
414
 
415
415
  const result = await executeChain(
416
416
  makeChainParams(
417
- [{ agent: "builder", task: "Implement fix", output: "accepted.md", outputMode: "file-only", acceptance: { level: "checked", criteria: ["Patch bug"] } }],
417
+ [{ agent: "worker", task: "Implement fix", output: "accepted.md", outputMode: "file-only", acceptance: { level: "checked", criteria: ["Patch bug"] } }],
418
418
  agents,
419
419
  { chainDir: tempDir },
420
420
  ),
@@ -442,7 +442,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
442
442
 
443
443
  const failed = await executeChain(
444
444
  makeChainParams(
445
- [{ agent: "builder", task: "Implement fix", acceptance: { level: "checked" } }],
445
+ [{ agent: "worker", task: "Implement fix", acceptance: { level: "checked" } }],
446
446
  agents,
447
447
  ),
448
448
  );
@@ -467,11 +467,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
467
467
  "```",
468
468
  ].join("\n");
469
469
  mockPi.onCall({ output: acceptanceReport });
470
- const agents = [makeAgent("builder", { completionGuard: false })];
470
+ const agents = [makeAgent("worker", { completionGuard: false })];
471
471
 
472
472
  const result = await executeChain(
473
473
  makeChainParams(
474
- [{ agent: "builder", task: "Implement fix", acceptance: { level: "verified", verify: [{ id: "runtime-pass", command: "node -e \"process.exit(0)\"" }] } }],
474
+ [{ agent: "worker", task: "Implement fix", acceptance: { level: "verified", verify: [{ id: "runtime-pass", command: "node -e \"process.exit(0)\"" }] } }],
475
475
  agents,
476
476
  ),
477
477
  );
@@ -482,7 +482,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
482
482
  mockPi.onCall({ output: acceptanceReport });
483
483
  const failed = await executeChain(
484
484
  makeChainParams(
485
- [{ agent: "builder", task: "Implement fix", acceptance: { level: "verified", verify: [{ id: "runtime-fail", command: "node -e \"process.exit(5)\"" }] } }],
485
+ [{ agent: "worker", task: "Implement fix", acceptance: { level: "verified", verify: [{ id: "runtime-fail", command: "node -e \"process.exit(5)\"" }] } }],
486
486
  agents,
487
487
  ),
488
488
  );
@@ -560,8 +560,8 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
560
560
 
561
561
  const result = await executeChain(
562
562
  makeChainParams(
563
- [{ agent: "builder", task: "Do work" }],
564
- [makeAgent("builder")],
563
+ [{ agent: "worker", task: "Do work" }],
564
+ [makeAgent("worker")],
565
565
  {
566
566
  ctx: {
567
567
  ...makeMinimalCtx(tempDir),
@@ -582,8 +582,8 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
582
582
 
583
583
  const result = await executeChain(
584
584
  makeChainParams(
585
- [{ agent: "builder", task: "Do work", model: "inherit" }],
586
- [makeAgent("builder")],
585
+ [{ agent: "worker", task: "Do work", model: "inherit" }],
586
+ [makeAgent("worker")],
587
587
  {
588
588
  ctx: {
589
589
  ...makeMinimalCtx(tempDir),
@@ -601,11 +601,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
601
601
 
602
602
  it("suppresses progress for {task} chain templates when the top-level task is review-only", async () => {
603
603
  mockPi.onCall({ output: "Review done" });
604
- const agents = [makeAgent("commentator", { defaultProgress: true })];
604
+ const agents = [makeAgent("reviewer", { defaultProgress: true })];
605
605
 
606
606
  await executeChain(
607
607
  makeChainParams(
608
- [{ agent: "commentator" }],
608
+ [{ agent: "reviewer" }],
609
609
  agents,
610
610
  { task: "Review-only. Do not edit files. Return findings." },
611
611
  ),
@@ -616,15 +616,36 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
616
616
  assert.equal(fs.existsSync(path.join(tempDir, "progress.md")), false);
617
617
  });
618
618
 
619
+ it("foreground chains resolve explicit reads inside the chain directory", async () => {
620
+ mockPi.onCall({ output: "Review done" });
621
+ const chainDir = path.join(tempDir, "chain-reads");
622
+ const runId = "chain-reads-run";
623
+ const runDir = path.join(chainDir, runId);
624
+ fs.mkdirSync(runDir, { recursive: true });
625
+ fs.writeFileSync(path.join(runDir, "plan.md"), "chain plan");
626
+ fs.writeFileSync(path.join(runDir, "progress.md"), "chain progress");
627
+
628
+ await executeChain!(makeChainParams(
629
+ [{ agent: "reviewer", task: "Review the chain artifacts.", reads: ["plan.md", "progress.md"] }],
630
+ [makeAgent("reviewer")],
631
+ { chainDir, runId },
632
+ ));
633
+
634
+ const taskArg = readCallArgs(0).at(-1) ?? "";
635
+ assert.ok(taskArg.includes("[Read from: "));
636
+ assert.ok(taskArg.includes(path.join(runDir, "plan.md")));
637
+ assert.ok(taskArg.includes(path.join(runDir, "progress.md")));
638
+ });
639
+
619
640
  it("foreground chains still resolve defaultProgress inside the chain directory", async () => {
620
641
  mockPi.onCall({ output: "Progress done" });
621
- const agents = [makeAgent("commentator", { defaultProgress: true })];
642
+ const agents = [makeAgent("reviewer", { defaultProgress: true })];
622
643
  const chainDir = path.join(tempDir, "chain-progress");
623
644
  const runId = "chain-progress-run";
624
645
 
625
646
  await executeChain(
626
647
  makeChainParams(
627
- [{ agent: "commentator", task: "Track chain work" }],
648
+ [{ agent: "reviewer", task: "Track chain work" }],
628
649
  agents,
629
650
  { chainDir, runId },
630
651
  ),
@@ -681,16 +702,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
681
702
  mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
682
703
  mockPi.onCall({ output: "review-b", structuredOutput: { ok: "b" } });
683
704
  mockPi.onCall({ output: "synthesized" });
684
- const agents = [makeAgent("explorer"), makeAgent("commentator"), makeAgent("writer")];
705
+ const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
685
706
 
686
707
  const result = await executeChain(
687
708
  makeChainParams(
688
709
  [
689
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
710
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
690
711
  {
691
712
  expand: { from: { output: "targets", path: "/items" }, item: "target", key: "/path", maxItems: 4 },
692
713
  parallel: {
693
- agent: "commentator",
714
+ agent: "reviewer",
694
715
  task: "Review {target.path}",
695
716
  label: "Review {target.path}",
696
717
  outputSchema: { type: "object" },
@@ -724,14 +745,14 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
724
745
  });
725
746
  mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV], structuredOutput: { ok: "a" } });
726
747
  mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV], structuredOutput: { ok: "b" } });
727
- const agents = [makeAgent("explorer"), makeAgent("commentator")];
748
+ const agents = [makeAgent("scout"), makeAgent("reviewer")];
728
749
 
729
750
  const result = await executeChain!(makeChainParams(
730
751
  [
731
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
752
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
732
753
  {
733
754
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
734
- parallel: { agent: "commentator", task: "Review {item.path}", outputSchema: { type: "object" } },
755
+ parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
735
756
  collect: { as: "reviews" },
736
757
  concurrency: 1,
737
758
  },
@@ -741,7 +762,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
741
762
  ));
742
763
 
743
764
  assert.equal(result.isError, undefined);
744
- const reviewerResults = result.details.results.filter((entry) => entry.agent === "commentator");
765
+ const reviewerResults = result.details.results.filter((entry) => entry.agent === "reviewer");
745
766
  assert.equal(reviewerResults.length, 2);
746
767
  for (const child of reviewerResults) {
747
768
  const env = JSON.parse(child.finalOutput ?? "{}") as Record<string, string | null>;
@@ -757,15 +778,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
757
778
  });
758
779
  mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/a.ts"] }), structuredOutput: { ok: "a" } });
759
780
  mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/b.ts"] }), structuredOutput: { ok: "b" } });
760
- const agents = [makeAgent("explorer"), makeAgent("commentator", { completionGuard: false })];
781
+ const agents = [makeAgent("scout"), makeAgent("reviewer", { completionGuard: false })];
761
782
 
762
783
  const result = await executeChain(
763
784
  makeChainParams(
764
785
  [
765
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
786
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
766
787
  {
767
788
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
768
- parallel: { agent: "commentator", task: "Review {item.path}", outputSchema: { type: "object" }, acceptance: { level: "checked" } },
789
+ parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" }, acceptance: { level: "checked" } },
769
790
  collect: { as: "reviews" },
770
791
  acceptance: { level: "checked" },
771
792
  concurrency: 1,
@@ -779,7 +800,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
779
800
  const dynamicNode = result.details.workflowGraph?.nodes[1];
780
801
  assert.equal(dynamicNode?.acceptanceStatus, "review-required");
781
802
  assert.deepEqual(dynamicNode?.children?.map((child) => child.acceptanceStatus), ["checked", "checked"]);
782
- assert.deepEqual(result.details.results.filter((child) => child.agent === "commentator").map((child) => child.acceptance?.evidenceStatus), ["checked", "checked"]);
803
+ assert.deepEqual(result.details.results.filter((child) => child.agent === "reviewer").map((child) => child.acceptance?.evidenceStatus), ["checked", "checked"]);
783
804
  });
784
805
 
785
806
  it("applies read-only acceptance roles to dynamic children and their aggregate group", async () => {
@@ -796,15 +817,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
796
817
  });
797
818
  mockPi.onCall({ output: readOnlyReport, structuredOutput: { ok: "a" } });
798
819
  mockPi.onCall({ output: readOnlyReport, structuredOutput: { ok: "b" } });
799
- const agents = [makeAgent("explorer"), makeAgent("recapper", { acceptanceRole: "read-only" })];
820
+ const agents = [makeAgent("scout"), makeAgent("explorer", { acceptanceRole: "read-only" })];
800
821
 
801
822
  const result = await executeChain(
802
823
  makeChainParams(
803
824
  [
804
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
825
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
805
826
  {
806
827
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
807
- parallel: { agent: "recapper", task: "Explore {item.path}", outputSchema: { type: "object" } },
828
+ parallel: { agent: "explorer", task: "Explore {item.path}", outputSchema: { type: "object" } },
808
829
  collect: { as: "reviews" },
809
830
  concurrency: 1,
810
831
  },
@@ -814,7 +835,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
814
835
  );
815
836
 
816
837
  assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
817
- const explorerResults = result.details.results.filter((child) => child.agent === "recapper");
838
+ const explorerResults = result.details.results.filter((child) => child.agent === "explorer");
818
839
  assert.deepEqual(explorerResults.map((child) => child.acceptance?.effectiveAcceptance.level), ["attested", "attested"]);
819
840
  const dynamicNode = result.details.workflowGraph?.nodes[1];
820
841
  assert.equal(dynamicNode?.acceptanceStatus, "attested");
@@ -828,15 +849,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
828
849
  });
829
850
  mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/a.ts"] }), structuredOutput: { ok: "a" } });
830
851
  mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/b.ts"] }), structuredOutput: { ok: "b" } });
831
- const agents = [makeAgent("explorer"), makeAgent("recapper", { acceptanceRole: "read-only" })];
852
+ const agents = [makeAgent("scout"), makeAgent("explorer", { acceptanceRole: "read-only" })];
832
853
 
833
854
  const result = await executeChain(
834
855
  makeChainParams(
835
856
  [
836
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
857
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
837
858
  {
838
859
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
839
- parallel: { agent: "recapper", task: "Patch {item.path}", outputSchema: { type: "object" } },
860
+ parallel: { agent: "explorer", task: "Patch {item.path}", outputSchema: { type: "object" } },
840
861
  collect: { as: "reviews" },
841
862
  concurrency: 1,
842
863
  },
@@ -846,7 +867,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
846
867
  );
847
868
 
848
869
  assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
849
- const explorerResults = result.details.results.filter((child) => child.agent === "recapper");
870
+ const explorerResults = result.details.results.filter((child) => child.agent === "explorer");
850
871
  assert.deepEqual(explorerResults.map((child) => child.acceptance?.effectiveAcceptance.level), ["checked", "checked"]);
851
872
  const dynamicNode = result.details.workflowGraph?.nodes[1];
852
873
  assert.equal(dynamicNode?.acceptanceStatus, "rejected");
@@ -860,15 +881,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
860
881
  });
861
882
  mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
862
883
  mockPi.onCall({ exitCode: 1, stderr: "review-b failed" });
863
- const agents = [makeAgent("explorer"), makeAgent("commentator")];
884
+ const agents = [makeAgent("scout"), makeAgent("reviewer")];
864
885
 
865
886
  const result = await executeChain(
866
887
  makeChainParams(
867
888
  [
868
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
889
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
869
890
  {
870
891
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
871
- parallel: { agent: "commentator", task: "Review {item.path}", outputSchema: { type: "object" } },
892
+ parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
872
893
  collect: { as: "reviews" },
873
894
  concurrency: 1,
874
895
  },
@@ -885,15 +906,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
885
906
 
886
907
  it("fails dynamic fanout before spawning children for invalid source arrays", async () => {
887
908
  mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "a" }, { path: "b" }] } });
888
- const agents = [makeAgent("explorer"), makeAgent("commentator")];
909
+ const agents = [makeAgent("scout"), makeAgent("reviewer")];
889
910
 
890
911
  const result = await executeChain(
891
912
  makeChainParams(
892
913
  [
893
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
914
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
894
915
  {
895
916
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 1 },
896
- parallel: { agent: "commentator", task: "Review {item.path}" },
917
+ parallel: { agent: "reviewer", task: "Review {item.path}" },
897
918
  collect: { as: "reviews" },
898
919
  },
899
920
  ],
@@ -910,15 +931,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
910
931
 
911
932
  it("marks dynamic file-only validation failures as failed graph groups before spawning children", async () => {
912
933
  mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "src/a.ts" }] } });
913
- const agents = [makeAgent("explorer"), makeAgent("commentator")];
934
+ const agents = [makeAgent("scout"), makeAgent("reviewer")];
914
935
 
915
936
  const result = await executeChain(
916
937
  makeChainParams(
917
938
  [
918
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
939
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
919
940
  {
920
941
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
921
- parallel: { agent: "commentator", task: "Review {item.path}", outputMode: "file-only" },
942
+ parallel: { agent: "reviewer", task: "Review {item.path}", outputMode: "file-only" },
922
943
  collect: { as: "reviews" },
923
944
  },
924
945
  ],
@@ -937,15 +958,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
937
958
  it("marks empty dynamic fanout skip as a completed graph group", async () => {
938
959
  mockPi.onCall({ output: "targets", structuredOutput: { items: [] } });
939
960
  mockPi.onCall({ output: "used empty reviews" });
940
- const agents = [makeAgent("explorer"), makeAgent("commentator"), makeAgent("writer")];
961
+ const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
941
962
 
942
963
  const result = await executeChain(
943
964
  makeChainParams(
944
965
  [
945
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
966
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
946
967
  {
947
968
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4, onEmpty: "skip" },
948
- parallel: { agent: "commentator", task: "Review {item.path}" },
969
+ parallel: { agent: "reviewer", task: "Review {item.path}" },
949
970
  collect: { as: "reviews" },
950
971
  },
951
972
  { agent: "writer", task: "Use {outputs.reviews}" },
@@ -964,15 +985,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
964
985
  it("marks dynamic collect schema failures as failed graph groups", async () => {
965
986
  mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "src/a.ts" }] } });
966
987
  mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
967
- const agents = [makeAgent("explorer"), makeAgent("commentator")];
988
+ const agents = [makeAgent("scout"), makeAgent("reviewer")];
968
989
 
969
990
  const result = await executeChain(
970
991
  makeChainParams(
971
992
  [
972
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
993
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
973
994
  {
974
995
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
975
- parallel: { agent: "commentator", task: "Review {item.path}", outputSchema: { type: "object" } },
996
+ parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
976
997
  collect: { as: "reviews", outputSchema: { type: "object" } },
977
998
  },
978
999
  ],
@@ -993,16 +1014,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
993
1014
  mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
994
1015
  mockPi.onCall({ output: "review-b", structuredOutput: { ok: "b" } });
995
1016
  mockPi.onCall({ steps: [{ jsonl: [events.assistantMessage("writer started")] }] });
996
- const agents = [makeAgent("explorer"), makeAgent("commentator"), makeAgent("writer")];
1017
+ const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
997
1018
  let writerUpdateChildren: Array<{ itemKey?: string; status?: string }> | undefined;
998
1019
 
999
1020
  const result = await executeChain(
1000
1021
  makeChainParams(
1001
1022
  [
1002
- { agent: "explorer", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
1023
+ { agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
1003
1024
  {
1004
1025
  expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
1005
- parallel: { agent: "commentator", task: "Review {item.path}", outputSchema: { type: "object" } },
1026
+ parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
1006
1027
  collect: { as: "reviews" },
1007
1028
  concurrency: 1,
1008
1029
  },
@@ -1063,10 +1084,10 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1063
1084
  properties: { ok: { type: "boolean" }, note: { type: "string" } },
1064
1085
  };
1065
1086
  mockPi.onCall({ output: "prose", structuredOutput: { ok: true, note: "captured" } });
1066
- const agents = [makeAgent("builder")];
1087
+ const agents = [makeAgent("worker")];
1067
1088
 
1068
1089
  const result = await executeChain(
1069
- makeChainParams([{ agent: "builder", task: "Return structured", outputSchema: schema }], agents),
1090
+ makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
1070
1091
  );
1071
1092
 
1072
1093
  assert.ok(!result.isError);
@@ -1075,7 +1096,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1075
1096
  mockPi.reset();
1076
1097
  mockPi.onCall({ structuredOutput: { ok: true, note: "tool-only" } });
1077
1098
  const structuredOnly = await executeChain(
1078
- makeChainParams([{ agent: "builder", task: "Return structured", outputSchema: schema }], agents),
1099
+ makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
1079
1100
  );
1080
1101
  assert.ok(!structuredOnly.isError);
1081
1102
  assert.deepEqual(structuredOnly.details.results[0]?.structuredOutput, { ok: true, note: "tool-only" });
@@ -1083,15 +1104,23 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1083
1104
  mockPi.reset();
1084
1105
  mockPi.onCall({ output: "prose only" });
1085
1106
  const missing = await executeChain(
1086
- makeChainParams([{ agent: "builder", task: "Return structured", outputSchema: schema }], agents),
1107
+ makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
1087
1108
  );
1088
1109
  assert.equal(missing.isError, true);
1089
1110
  assert.match(missing.details.results[0]?.error ?? "", /Missing structured_output call/);
1090
1111
 
1112
+ mockPi.reset();
1113
+ mockPi.onCall({ output: "prose only" });
1114
+ const missingImplementation = await executeChain(
1115
+ makeChainParams([{ agent: "worker", task: "Implement the fix and return structured data", outputSchema: schema }], agents),
1116
+ );
1117
+ assert.equal(missingImplementation.isError, true);
1118
+ assert.match(missingImplementation.details.results[0]?.error ?? "", /Missing structured_output call/);
1119
+
1091
1120
  mockPi.reset();
1092
1121
  mockPi.onCall({ output: "invalid", structuredOutput: { ok: "yes" } });
1093
1122
  const invalid = await executeChain(
1094
- makeChainParams([{ agent: "builder", task: "Return structured", outputSchema: schema, phase: "Validate", label: "Structured builder", as: "result" }], agents),
1123
+ makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema, phase: "Validate", label: "Structured worker", as: "result" }], agents),
1095
1124
  );
1096
1125
  assert.equal(invalid.isError, true);
1097
1126
  assert.match(invalid.details.results[0]?.error ?? "", /Structured output validation failed/);
@@ -1100,13 +1129,35 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1100
1129
  assert.match(invalid.details.workflowGraph?.nodes[0]?.error ?? "", /Structured output validation failed/);
1101
1130
  });
1102
1131
 
1132
+ it("accepts recovered tool errors before valid structured output", async () => {
1133
+ mockPi.onCall({
1134
+ jsonl: [{
1135
+ type: "tool_result_end",
1136
+ message: { role: "toolResult", toolName: "read", isError: true, content: [{ type: "text", text: "EISDIR" }] },
1137
+ }],
1138
+ structuredOutput: { ok: true },
1139
+ });
1140
+ const agents = [makeAgent("worker")];
1141
+
1142
+ const result = await executeChain(
1143
+ makeChainParams([{
1144
+ agent: "worker",
1145
+ task: "Recover and return structured data",
1146
+ outputSchema: { type: "object", required: ["ok"], properties: { ok: { type: "boolean" } } },
1147
+ }], agents),
1148
+ );
1149
+
1150
+ assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
1151
+ assert.deepEqual(result.details.results[0]?.structuredOutput, { ok: true });
1152
+ });
1153
+
1103
1154
  it("substitutes {task} in templates", async () => {
1104
1155
  mockPi.onCall({ output: "Done" });
1105
- const agents = [makeAgent("builder")];
1156
+ const agents = [makeAgent("worker")];
1106
1157
 
1107
1158
  const result = await executeChain(
1108
1159
  makeChainParams(
1109
- [{ agent: "builder", task: "Review {task} carefully" }],
1160
+ [{ agent: "worker", task: "Review {task} carefully" }],
1110
1161
  agents,
1111
1162
  { task: "the authentication module" },
1112
1163
  ),
@@ -1122,11 +1173,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1122
1173
 
1123
1174
  it("creates and uses chain_dir", async () => {
1124
1175
  mockPi.onCall({ output: "Done" });
1125
- const agents = [makeAgent("builder")];
1176
+ const agents = [makeAgent("worker")];
1126
1177
 
1127
1178
  const result = await executeChain(
1128
1179
  makeChainParams(
1129
- [{ agent: "builder", task: "Write to {chain_dir}" }],
1180
+ [{ agent: "worker", task: "Write to {chain_dir}" }],
1130
1181
  agents,
1131
1182
  ),
1132
1183
  );
@@ -1199,13 +1250,13 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1199
1250
 
1200
1251
  it("runs a 3-step chain end-to-end", async () => {
1201
1252
  mockPi.onCall({ output: "Step output" });
1202
- const agents = [makeAgent("explorer"), makeAgent("architect"), makeAgent("executor")];
1253
+ const agents = [makeAgent("scout"), makeAgent("planner"), makeAgent("executor")];
1203
1254
 
1204
1255
  const result = await executeChain(
1205
1256
  makeChainParams(
1206
1257
  [
1207
- { agent: "explorer", task: "Survey the codebase" },
1208
- { agent: "architect" },
1258
+ { agent: "scout", task: "Survey the codebase" },
1259
+ { agent: "planner" },
1209
1260
  { agent: "executor" },
1210
1261
  ],
1211
1262
  agents,
@@ -1217,16 +1268,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1217
1268
  assert.ok(result.details.results.every((r) => r.exitCode === 0));
1218
1269
  });
1219
1270
 
1220
- it("runs a 40-step alternating builder and commentator chain", async () => {
1271
+ it("runs a 40-step alternating worker and reviewer chain", async () => {
1221
1272
  const chainLength = 40;
1222
1273
  for (let i = 0; i < chainLength; i++) {
1223
1274
  mockPi.onCall({ output: `step-${i}-output` });
1224
1275
  }
1225
1276
  const chain = Array.from({ length: chainLength }, (_, i): TestSequentialStep => ({
1226
- agent: i % 2 === 0 ? "builder" : "commentator",
1227
- ...(i === 0 ? { task: "Start long builder/commentator chain" } : {}),
1277
+ agent: i % 2 === 0 ? "worker" : "reviewer",
1278
+ ...(i === 0 ? { task: "Start long worker/reviewer chain" } : {}),
1228
1279
  }));
1229
- const agents = [makeAgent("builder"), makeAgent("commentator")];
1280
+ const agents = [makeAgent("worker"), makeAgent("reviewer")];
1230
1281
 
1231
1282
  const result = await executeChain(makeChainParams(chain, agents));
1232
1283
 
@@ -1236,7 +1287,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1236
1287
  assert.equal(result.details.totalSteps, chainLength);
1237
1288
  assert.equal(result.details.chainAgents?.length, chainLength);
1238
1289
  assert.equal(result.details.workflowGraph?.nodes.length, chainLength);
1239
- assert.equal(result.details.workflowGraph?.nodes.at(-1)?.agent, "commentator");
1290
+ assert.equal(result.details.workflowGraph?.nodes.at(-1)?.agent, "reviewer");
1240
1291
  assert.equal(result.details.workflowGraph?.nodes.at(-1)?.flatIndex, chainLength - 1);
1241
1292
  assert.ok(result.details.results.every((r) => r.exitCode === 0));
1242
1293
  assert.deepEqual(
@@ -1251,11 +1302,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1251
1302
  });
1252
1303
 
1253
1304
  it("returns error for unknown agent in chain", async () => {
1254
- const agents = [makeAgent("explorer")];
1305
+ const agents = [makeAgent("scout")];
1255
1306
 
1256
1307
  const result = await executeChain(
1257
1308
  makeChainParams(
1258
- [{ agent: "explorer", task: "Start" }, { agent: "nonexistent" }],
1309
+ [{ agent: "scout", task: "Start" }, { agent: "nonexistent" }],
1259
1310
  agents,
1260
1311
  ),
1261
1312
  );
@@ -1301,12 +1352,12 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1301
1352
 
1302
1353
  it("uses custom chainDir when provided", async () => {
1303
1354
  mockPi.onCall({ output: "Done" });
1304
- const agents = [makeAgent("builder")];
1355
+ const agents = [makeAgent("worker")];
1305
1356
  const customChainDir = path.join(tempDir, "my-chain");
1306
1357
 
1307
1358
  const result = await executeChain(
1308
1359
  makeChainParams(
1309
- [{ agent: "builder", task: "Use {chain_dir}" }],
1360
+ [{ agent: "worker", task: "Use {chain_dir}" }],
1310
1361
  agents,
1311
1362
  { chainDir: customChainDir },
1312
1363
  ),
@@ -1323,11 +1374,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
1323
1374
  delete process.env.SELESAI_SUBAGENT_MAX_DEPTH;
1324
1375
  try {
1325
1376
  mockPi.onCall({ echoEnv: ["SELESAI_SUBAGENT_DEPTH", "SELESAI_SUBAGENT_MAX_DEPTH"] });
1326
- const agents = [makeAgent("builder", { maxSubagentDepth: 1 })];
1377
+ const agents = [makeAgent("worker", { maxSubagentDepth: 1 })];
1327
1378
 
1328
1379
  const result = await executeChain(
1329
1380
  makeChainParams(
1330
- [{ agent: "builder", task: "Inspect env" }],
1381
+ [{ agent: "worker", task: "Inspect env" }],
1331
1382
  agents,
1332
1383
  { maxSubagentDepth: 3 },
1333
1384
  ),
@@ -1416,15 +1467,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1416
1467
 
1417
1468
  it("runs parallel tasks within a chain step", async () => {
1418
1469
  mockPi.onCall({ output: "Parallel task done" });
1419
- const agents = [makeAgent("commentator-a"), makeAgent("commentator-b")];
1470
+ const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
1420
1471
 
1421
1472
  const result = await executeChain(
1422
1473
  makeChainParams(
1423
1474
  [
1424
1475
  {
1425
1476
  parallel: [
1426
- { agent: "commentator-a", task: "Review auth module" },
1427
- { agent: "commentator-b", task: "Review data layer" },
1477
+ { agent: "reviewer-a", task: "Review auth module" },
1478
+ { agent: "reviewer-b", task: "Review data layer" },
1428
1479
  ],
1429
1480
  },
1430
1481
  ],
@@ -1440,13 +1491,13 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1440
1491
  it("applies global permissions to foreground static parallel children", async () => {
1441
1492
  mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
1442
1493
  mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
1443
- const agents = [makeAgent("commentator-a"), makeAgent("commentator-b")];
1494
+ const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
1444
1495
 
1445
1496
  const result = await executeChain!(makeChainParams(
1446
1497
  [{
1447
1498
  parallel: [
1448
- { agent: "commentator-a", task: "Review A" },
1449
- { agent: "commentator-b", task: "Review B" },
1499
+ { agent: "reviewer-a", task: "Review A" },
1500
+ { agent: "reviewer-b", task: "Review B" },
1450
1501
  ],
1451
1502
  }],
1452
1503
  agents,
@@ -1474,8 +1525,8 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1474
1525
  const artifactsDir = path.join(tempDir, "artifacts");
1475
1526
  const result = await executeChain(
1476
1527
  makeChainParams(
1477
- [{ parallel: [{ agent: "commentator-a", task: "Review in isolation" }], worktree: true }],
1478
- [makeAgent("commentator-a")],
1528
+ [{ parallel: [{ agent: "reviewer-a", task: "Review in isolation" }], worktree: true }],
1529
+ [makeAgent("reviewer-a")],
1479
1530
  { runId, artifactsDir },
1480
1531
  ),
1481
1532
  );
@@ -1488,7 +1539,7 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1488
1539
  groups: Array<{ stepIndex: number; children: Array<{ agent: string; patch: { path: string } }>; cleanup: { state: string } }>;
1489
1540
  };
1490
1541
  assert.equal(handoff.groups[0]!.stepIndex, 0);
1491
- assert.equal(handoff.groups[0]!.children[0]!.agent, "commentator-a");
1542
+ assert.equal(handoff.groups[0]!.children[0]!.agent, "reviewer-a");
1492
1543
  assert.equal(handoff.groups[0]!.cleanup.state, "complete");
1493
1544
  assert.equal(fs.existsSync(handoff.groups[0]!.children[0]!.patch.path), true);
1494
1545
  assert.match(handoff.groups[0]!.children[0]!.patch.path, /worktree-diffs\/foreground-chain-handoff\/step-0\//);
@@ -1496,15 +1547,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1496
1547
 
1497
1548
  it("aggregates parallel outputs for next sequential step", async () => {
1498
1549
  mockPi.onCall({ output: "Review findings here" });
1499
- const agents = [makeAgent("commentator-a"), makeAgent("commentator-b"), makeAgent("synthesizer")];
1550
+ const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b"), makeAgent("synthesizer")];
1500
1551
 
1501
1552
  const result = await executeChain(
1502
1553
  makeChainParams(
1503
1554
  [
1504
1555
  {
1505
1556
  parallel: [
1506
- { agent: "commentator-a", task: "Review security" },
1507
- { agent: "commentator-b", task: "Review performance" },
1557
+ { agent: "reviewer-a", task: "Review security" },
1558
+ { agent: "reviewer-b", task: "Review performance" },
1508
1559
  ],
1509
1560
  },
1510
1561
  { agent: "synthesizer" },
@@ -1517,12 +1568,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1517
1568
  assert.equal(result.details.results.length, 3);
1518
1569
  const synthTask = result.details.results[2].task;
1519
1570
  assert.ok(
1520
- synthTask.includes("=== Parallel Task 1 (commentator-a) ==="),
1521
- "synthesizer should include commentator-a output block",
1571
+ synthTask.includes("=== Parallel Task 1 (reviewer-a) ==="),
1572
+ "synthesizer should include reviewer-a output block",
1522
1573
  );
1523
1574
  assert.ok(
1524
- synthTask.includes("=== Parallel Task 2 (commentator-b) ==="),
1525
- "synthesizer should include commentator-b output block",
1575
+ synthTask.includes("=== Parallel Task 2 (reviewer-b) ==="),
1576
+ "synthesizer should include reviewer-b output block",
1526
1577
  );
1527
1578
  });
1528
1579
 
@@ -1559,15 +1610,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1559
1610
  mockPi.onCall({ matchArgIncludes: "Synthesize:", output: "Funnel synthesis" });
1560
1611
  mockPi.onCall({ matchArgIncludes: "Review funnel A:", output: "Reviewer A done" });
1561
1612
  mockPi.onCall({ matchArgIncludes: "Review funnel B:", output: "Reviewer B done" });
1562
- const agents = [makeAgent("explorer-a"), makeAgent("explorer-b"), makeAgent("synthesizer"), makeAgent("review-a"), makeAgent("review-b")];
1613
+ const agents = [makeAgent("scout-a"), makeAgent("scout-b"), makeAgent("synthesizer"), makeAgent("review-a"), makeAgent("review-b")];
1563
1614
 
1564
1615
  const result = await executeChain(
1565
1616
  makeChainParams(
1566
1617
  [
1567
1618
  {
1568
1619
  parallel: [
1569
- { agent: "explorer-a", task: "Scout API" },
1570
- { agent: "explorer-b", task: "Scout UI" },
1620
+ { agent: "scout-a", task: "Scout API" },
1621
+ { agent: "scout-b", task: "Scout UI" },
1571
1622
  ],
1572
1623
  },
1573
1624
  { agent: "synthesizer", task: "Synthesize:\n{previous}" },
@@ -1583,12 +1634,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1583
1634
  );
1584
1635
 
1585
1636
  assert.ok(!result.isError, `should succeed: ${JSON.stringify(result.content)}`);
1586
- assert.deepEqual(result.details.results.map((entry) => entry.agent), ["explorer-a", "explorer-b", "synthesizer", "review-a", "review-b"]);
1637
+ assert.deepEqual(result.details.results.map((entry) => entry.agent), ["scout-a", "scout-b", "synthesizer", "review-a", "review-b"]);
1587
1638
  assert.equal(result.details.totalSteps, 3);
1588
1639
  const funnelTask = readCallArgsMatching("Synthesize:").at(-1) ?? "";
1589
- assert.match(funnelTask, /=== Parallel Task 1 \(explorer-a\) ===/);
1640
+ assert.match(funnelTask, /=== Parallel Task 1 \(scout-a\) ===/);
1590
1641
  assert.match(funnelTask, /Scout A findings/);
1591
- assert.match(funnelTask, /=== Parallel Task 2 \(explorer-b\) ===/);
1642
+ assert.match(funnelTask, /=== Parallel Task 2 \(scout-b\) ===/);
1592
1643
  assert.match(funnelTask, /Scout B findings/);
1593
1644
  const fanoutTaskA = readCallArgsMatching("Review funnel A:").at(-1) ?? "";
1594
1645
  const fanoutTaskB = readCallArgsMatching("Review funnel B:").at(-1) ?? "";
@@ -1601,15 +1652,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1601
1652
 
1602
1653
  it("aggregates file-only parallel outputs as file references for the next step", async () => {
1603
1654
  mockPi.onCall({ output: "full parallel chain output\nwith details" });
1604
- const agents = [makeAgent("commentator-a"), makeAgent("commentator-b"), makeAgent("synthesizer")];
1655
+ const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b"), makeAgent("synthesizer")];
1605
1656
 
1606
1657
  const result = await executeChain(
1607
1658
  makeChainParams(
1608
1659
  [
1609
1660
  {
1610
1661
  parallel: [
1611
- { agent: "commentator-a", task: "Review A", output: "a.md", outputMode: "file-only" },
1612
- { agent: "commentator-b", task: "Review B", output: "b.md", outputMode: "file-only" },
1662
+ { agent: "reviewer-a", task: "Review A", output: "a.md", outputMode: "file-only" },
1663
+ { agent: "reviewer-b", task: "Review B", output: "b.md", outputMode: "file-only" },
1613
1664
  ],
1614
1665
  },
1615
1666
  { agent: "synthesizer" },
@@ -1629,14 +1680,14 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1629
1680
  });
1630
1681
 
1631
1682
  it("rejects chain parallel file-only output without spawning siblings", async () => {
1632
- const agents = [makeAgent("commentator-a"), makeAgent("commentator-b")];
1683
+ const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
1633
1684
 
1634
1685
  const result = await executeChain(
1635
1686
  makeChainParams(
1636
1687
  [{
1637
1688
  parallel: [
1638
- { agent: "commentator-a", task: "Review A", outputMode: "file-only" },
1639
- { agent: "commentator-b", task: "Review B", output: "b.md" },
1689
+ { agent: "reviewer-a", task: "Review A", outputMode: "file-only" },
1690
+ { agent: "reviewer-b", task: "Review B", output: "b.md" },
1640
1691
  ],
1641
1692
  }],
1642
1693
  agents,
@@ -1779,12 +1830,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
1779
1830
 
1780
1831
  it("sequential → parallel → sequential (mixed chain)", async () => {
1781
1832
  mockPi.onCall({ output: "Step complete" });
1782
- const agents = [makeAgent("explorer"), makeAgent("rev-a"), makeAgent("rev-b"), makeAgent("writer")];
1833
+ const agents = [makeAgent("scout"), makeAgent("rev-a"), makeAgent("rev-b"), makeAgent("writer")];
1783
1834
 
1784
1835
  const result = await executeChain(
1785
1836
  makeChainParams(
1786
1837
  [
1787
- { agent: "explorer", task: "Initial scan" },
1838
+ { agent: "scout", task: "Initial scan" },
1788
1839
  {
1789
1840
  parallel: [
1790
1841
  { agent: "rev-a", task: "Deep review A" },