@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
@@ -81,6 +81,11 @@ describe("checkModelScope", () => {
81
81
  assert.equal(violation?.severity, "warn");
82
82
  });
83
83
 
84
+ it("returns an error violation for an inherited model in strict mode", () => {
85
+ const violation = checkModelScope("deepseek/deepseek-v4", { ...scope, strict: true }, "inherited");
86
+ assert.equal(violation?.severity, "error");
87
+ });
88
+
84
89
  it("defaults to inherited (warn) severity when source is omitted-ish via inherited", () => {
85
90
  // Caller passes "inherited" for frontmatter/parent-inherited models.
86
91
  assert.equal(checkModelScope("meta/llama-4", scope, "inherited")?.severity, "warn");
@@ -105,8 +110,8 @@ describe("parseModelScopeConfig", () => {
105
110
 
106
111
  it("parses a well-formed config", () => {
107
112
  assert.deepEqual(
108
- parseModelScopeConfig({ enforce: true, allow: ["anthropic/*", "openai/gpt-5-*"] }, meta),
109
- { enforce: true, allow: ["anthropic/*", "openai/gpt-5-*"] },
113
+ parseModelScopeConfig({ enforce: true, strict: true, allow: ["anthropic/*", "openai/gpt-5-*"] }, meta),
114
+ { enforce: true, strict: true, allow: ["anthropic/*", "openai/gpt-5-*"] },
110
115
  );
111
116
  });
112
117
 
@@ -130,6 +135,10 @@ describe("parseModelScopeConfig", () => {
130
135
  assert.throws(() => parseModelScopeConfig({ enforce: "yes" }, meta), /invalid 'modelScope.enforce'/);
131
136
  });
132
137
 
138
+ it("rejects a non-boolean strict value", () => {
139
+ assert.throws(() => parseModelScopeConfig({ strict: "yes" }, meta), /invalid 'modelScope.strict'/);
140
+ });
141
+
133
142
  it("rejects a non-array allow", () => {
134
143
  assert.throws(() => parseModelScopeConfig({ allow: "anthropic/*" }, meta), /invalid 'modelScope.allow'/);
135
144
  });
@@ -49,7 +49,7 @@ function makeState(sessionId: string | null, ctx: unknown): SubagentState {
49
49
  }
50
50
 
51
51
  function writeRequest(input: { sessionId: string; runId: string; agent?: string; index?: number; message?: string; createdAt?: number; expiresAt?: number }): string {
52
- const agent = input.agent ?? "builder";
52
+ const agent = input.agent ?? "worker";
53
53
  const index = input.index ?? 0;
54
54
  const channelDir = resolveSupervisorChannelDir(input.runId, agent, index);
55
55
  createdChannels.push(channelDir);
@@ -72,16 +72,16 @@ function writeRequest(input: { sessionId: string; runId: string; agent?: string;
72
72
  return requestId;
73
73
  }
74
74
 
75
- function requestFile(runId: string, requestId: string, agent = "builder", index = 0): string {
75
+ function requestFile(runId: string, requestId: string, agent = "worker", index = 0): string {
76
76
  return path.join(resolveSupervisorChannelDir(runId, agent, index), "requests", `${requestId}.json`);
77
77
  }
78
78
 
79
- function replyFile(runId: string, requestId: string, agent = "builder", index = 0): string {
79
+ function replyFile(runId: string, requestId: string, agent = "worker", index = 0): string {
80
80
  return path.join(resolveSupervisorChannelDir(runId, agent, index), "replies", `${requestId}.json`);
81
81
  }
82
82
 
83
83
  function makeEmptyChannel(runId: string): string {
84
- const channelDir = resolveSupervisorChannelDir(runId, "builder", 0);
84
+ const channelDir = resolveSupervisorChannelDir(runId, "worker", 0);
85
85
  createdChannels.push(channelDir);
86
86
  ensureSupervisorChannelDir(channelDir);
87
87
  return channelDir;
@@ -94,6 +94,14 @@ function ageChannel(channelDir: string, ageMs: number): void {
94
94
  }
95
95
  }
96
96
 
97
+ async function waitForCondition(condition: () => boolean, description: string): Promise<void> {
98
+ const deadline = Date.now() + 1000;
99
+ while (!condition()) {
100
+ if (Date.now() > deadline) assert.fail(`Timed out waiting for ${description}`);
101
+ await new Promise((resolve) => setTimeout(resolve, 10));
102
+ }
103
+ }
104
+
97
105
  function restoreEnv(): void {
98
106
  for (const [key, value] of Object.entries(savedEnv)) {
99
107
  if (value === undefined) delete process.env[key];
@@ -149,6 +157,72 @@ describe("native supervisor channel", () => {
149
157
  assert.equal(sent.some(({ message }) => message.details?.id === otherId), false);
150
158
  });
151
159
 
160
+ it("uses polling instead of native watchers on Windows", () => {
161
+ const currentSessionId = `session-${randomUUID()}`;
162
+ const requestId = writeRequest({ sessionId: currentSessionId, runId: `run-${randomUUID()}` });
163
+ const sent: Array<{ details?: { id?: string } }> = [];
164
+ const ctx = {
165
+ cwd: process.cwd(),
166
+ hasUI: false,
167
+ sessionManager: {
168
+ getSessionId: () => currentSessionId,
169
+ getSessionFile: () => null,
170
+ getEntries: () => [],
171
+ },
172
+ };
173
+ const pi = {
174
+ getAllTools: () => [],
175
+ registerTool: () => {},
176
+ sendMessage: (message: { details?: { id?: string } }) => { sent.push(message); },
177
+ getSessionName: () => "shared-name",
178
+ };
179
+ let watchCalls = 0;
180
+ const channel = createNativeSupervisorChannel(pi as never, makeState(currentSessionId, ctx), {
181
+ platform: "win32",
182
+ watch: (() => {
183
+ watchCalls += 1;
184
+ throw new Error("Windows supervisor channel must not call fs.watch.");
185
+ }) as never,
186
+ });
187
+
188
+ channel.start();
189
+ channel.dispose();
190
+
191
+ assert.equal(watchCalls, 0);
192
+ assert.deepEqual(sent.map((message) => message.details?.id), [requestId]);
193
+ });
194
+
195
+ it("delivers requests written under an existing request directory by watch event", async () => {
196
+ const currentSessionId = `session-${randomUUID()}`;
197
+ const runId = `run-${randomUUID()}`;
198
+ makeEmptyChannel(runId);
199
+ const sent: Array<{ details?: { id?: string } }> = [];
200
+ const ctx = {
201
+ cwd: process.cwd(),
202
+ hasUI: false,
203
+ sessionManager: {
204
+ getSessionId: () => currentSessionId,
205
+ getSessionFile: () => null,
206
+ getEntries: () => [],
207
+ },
208
+ };
209
+ const pi = {
210
+ getAllTools: () => [],
211
+ registerTool: () => {},
212
+ sendMessage: (message: { details?: { id?: string } }) => { sent.push(message); },
213
+ getSessionName: () => "shared-name",
214
+ };
215
+ const channel = createNativeSupervisorChannel(pi as never, makeState(currentSessionId, ctx));
216
+
217
+ try {
218
+ channel.start();
219
+ const requestId = writeRequest({ sessionId: currentSessionId, runId });
220
+ await waitForCondition(() => sent.some((message) => message.details?.id === requestId), "supervisor request watch delivery");
221
+ } finally {
222
+ channel.dispose();
223
+ }
224
+ });
225
+
152
226
  it("prunes stale empty supervisor channel directories before polling", () => {
153
227
  const currentSessionId = `session-${randomUUID()}`;
154
228
  const staleEmptyChannel = makeEmptyChannel(`run-${randomUUID()}`);
@@ -211,7 +285,7 @@ describe("native supervisor channel", () => {
211
285
  it("emits foreground detach only after displaying a pending supervisor request", () => {
212
286
  const currentSessionId = `session-${randomUUID()}`;
213
287
  const runId = `run-${randomUUID()}`;
214
- const requestId = writeRequest({ sessionId: currentSessionId, runId, agent: "builder", index: 2 });
288
+ const requestId = writeRequest({ sessionId: currentSessionId, runId, agent: "worker", index: 2 });
215
289
  const log: string[] = [];
216
290
  const emitted: Array<{ channel: string; payload: { requestId?: string; runId?: string; agent?: string; childIndex?: number } }> = [];
217
291
  const ctx = {
@@ -242,7 +316,7 @@ describe("native supervisor channel", () => {
242
316
  assert.deepEqual(log, ["send", "emit"]);
243
317
  assert.deepEqual(emitted, [{
244
318
  channel: INTERCOM_DETACH_REQUEST_EVENT,
245
- payload: { requestId, runId, agent: "builder", childIndex: 2 },
319
+ payload: { requestId, runId, agent: "worker", childIndex: 2 },
246
320
  }]);
247
321
  assert.equal(channel.pending.has(requestId), true);
248
322
  } finally {
@@ -271,7 +345,7 @@ describe("native supervisor channel", () => {
271
345
  cwd: process.cwd(),
272
346
  sessionId: currentSessionId,
273
347
  updatedAt: 1,
274
- children: [{ agent: "builder", index: 0, status: "detached", updatedAt: 1 }],
348
+ children: [{ agent: "worker", index: 0, status: "detached", updatedAt: 1 }],
275
349
  }]]);
276
350
  const pi = {
277
351
  getAllTools: () => [...registeredTools.keys()].map((name) => ({ name })),
@@ -398,7 +472,7 @@ describe("native supervisor channel", () => {
398
472
  mode: "single",
399
473
  cwd: process.cwd(),
400
474
  updatedAt: Date.now(),
401
- children: [{ agent: "builder", index: 0, status: "completed", updatedAt: Date.now() }],
475
+ children: [{ agent: "worker", index: 0, status: "completed", updatedAt: Date.now() }],
402
476
  }]]);
403
477
  const pi = {
404
478
  getAllTools: () => [],
@@ -464,13 +538,13 @@ describe("native supervisor channel", () => {
464
538
 
465
539
  it("removes the request file when a child supervisor ask is cancelled", async () => {
466
540
  const runId = `run-${randomUUID()}`;
467
- const channelDir = resolveSupervisorChannelDir(runId, "builder", 0);
541
+ const channelDir = resolveSupervisorChannelDir(runId, "worker", 0);
468
542
  createdChannels.push(channelDir);
469
543
  process.env[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = "shared-name";
470
544
  process.env[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = "session-parent";
471
545
  process.env[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;
472
546
  process.env[SUBAGENT_RUN_ID_ENV] = runId;
473
- process.env[SUBAGENT_CHILD_AGENT_ENV] = "builder";
547
+ process.env[SUBAGENT_CHILD_AGENT_ENV] = "worker";
474
548
  process.env[SUBAGENT_CHILD_INDEX_ENV] = "0";
475
549
  const registeredTools = new Map<string, { execute: (_id: string, params: { reason: string; message?: string }, signal?: AbortSignal) => Promise<unknown> | unknown }>();
476
550
  const pi = {
@@ -19,6 +19,7 @@ import {
19
19
  import { ASYNC_DIR, type SubagentState } from "../../src/shared/types.ts";
20
20
 
21
21
  const routeRoots: string[] = [];
22
+ const fanoutListenerCleanupKey = "__piSubagentFanoutChildNestedControlInboxCleanups";
22
23
  const savedEnv = {
23
24
  [SUBAGENT_CHILD_ENV]: process.env[SUBAGENT_CHILD_ENV],
24
25
  [SUBAGENT_FANOUT_CHILD_ENV]: process.env[SUBAGENT_FANOUT_CHILD_ENV],
@@ -31,6 +32,15 @@ const savedEnv = {
31
32
  };
32
33
 
33
34
  afterEach(() => {
35
+ const globalStore = globalThis as Record<string, unknown>;
36
+ const listenerCleanups = globalStore[fanoutListenerCleanupKey];
37
+ if (listenerCleanups instanceof Map) {
38
+ for (const entry of listenerCleanups.values()) {
39
+ if (typeof entry === "function") entry();
40
+ else if (entry && typeof entry === "object" && typeof (entry as { cleanup?: unknown }).cleanup === "function") (entry as { cleanup: () => void }).cleanup();
41
+ }
42
+ }
43
+ delete globalStore[fanoutListenerCleanupKey];
34
44
  for (const root of routeRoots.splice(0)) fs.rmSync(root, { recursive: true, force: true });
35
45
  for (const [key, value] of Object.entries(savedEnv)) {
36
46
  if (value === undefined) delete process.env[key];
@@ -88,7 +98,7 @@ function createNestedRun(id = "nested-live", state: "running" | "complete" | "fa
88
98
  ts: 100,
89
99
  parentRunId: "root-control",
90
100
  parentStepIndex: 0,
91
- child: { id, parentRunId: "root-control", parentStepIndex: 0, depth: 1, path: [{ runId: "root-control", stepIndex: 0 }], state, agent: "builder", ownerState: state === "running" ? "live" : "gone", ...extras },
101
+ child: { id, parentRunId: "root-control", parentStepIndex: 0, depth: 1, path: [{ runId: "root-control", stepIndex: 0 }], state, agent: "worker", ownerState: state === "running" ? "live" : "gone", ...extras },
92
102
  });
93
103
  return route;
94
104
  }
@@ -186,11 +196,52 @@ describe("nested control routing", () => {
186
196
  const result = await createExecutor(state).execute("status", { action: "status", id: "root-control" }, new AbortController().signal, undefined, ctx(root));
187
197
 
188
198
  assert.equal(result.isError, undefined);
199
+ assert.match(text(result), /^Status target: run root-control\nSpawn budget:/);
189
200
  assert.match(text(result), /Run: root-control/);
190
- assert.match(text(result), /↳ builder \[nested-foreground\] running/);
201
+ assert.match(text(result), /↳ worker \[nested-foreground\] running/);
191
202
  assert.match(text(result), /Status: subagent\(\{ action: "status", id: "nested-foreground" \}\)/);
203
+
204
+ const transcript = await createExecutor(state).execute("transcript", { action: "status", id: "root-control", index: 0, view: "transcript" }, new AbortController().signal, undefined, ctx(root));
205
+ assert.equal(transcript.isError, undefined);
206
+ assert.match(text(transcript), /^Transcript target: run root-control · child 0\nSpawn budget:/);
207
+ } finally {
208
+ fs.rmSync(root, { recursive: true, force: true });
209
+ }
210
+ });
211
+
212
+ it("labels dir-target status output", async () => {
213
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-status-dir-label-"));
214
+ const runId = `status-dir-${Date.now().toString(36)}`;
215
+ const asyncDir = path.join(ASYNC_DIR, runId);
216
+ try {
217
+ fs.mkdirSync(asyncDir, { recursive: true });
218
+ fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
219
+ runId,
220
+ mode: "single",
221
+ state: "running",
222
+ startedAt: 1,
223
+ lastUpdate: 1,
224
+ cwd: root,
225
+ steps: [{ agent: "worker", status: "running" }],
226
+ }), "utf-8");
227
+
228
+ const state = createState();
229
+ state.foregroundControls.set("foreground-live", { runId: "foreground-live", mode: "single", startedAt: 1, updatedAt: 1, currentAgent: "worker", currentIndex: 0 });
230
+ state.lastForegroundControlId = "foreground-live";
231
+ const executor = createExecutor(state);
232
+ const result = await executor.execute("status-dir", { action: "status", dir: asyncDir }, new AbortController().signal, undefined, ctx(root));
233
+
234
+ assert.equal(result.isError, undefined);
235
+ assert.ok(text(result).startsWith(`Status target: dir ${asyncDir}\nSpawn budget:`), text(result));
236
+ assert.match(text(result), new RegExp(`Run: ${runId}`));
237
+ assert.doesNotMatch(text(result), /foreground-live/);
238
+
239
+ const transcript = await executor.execute("transcript-dir", { action: "status", dir: asyncDir, view: "transcript" }, new AbortController().signal, undefined, ctx(root));
240
+ assert.ok(text(transcript).startsWith(`Transcript target: dir ${asyncDir}\nSpawn budget:`), text(transcript));
241
+ assert.doesNotMatch(text(transcript), /Live foreground transcript/);
192
242
  } finally {
193
243
  fs.rmSync(root, { recursive: true, force: true });
244
+ fs.rmSync(asyncDir, { recursive: true, force: true });
194
245
  }
195
246
  });
196
247
 
@@ -318,7 +369,7 @@ describe("nested control routing", () => {
318
369
  try {
319
370
  const route = createNestedRun("nested-terminal-resume", "complete", { sessionFile: path.join(root, "missing-session.jsonl") });
320
371
 
321
- const result = await createExecutor(stateWithNestedRoute(route), [{ name: "builder", description: "Worker", prompt: "Do work" }])
372
+ const result = await createExecutor(stateWithNestedRoute(route), [{ name: "worker", description: "Worker", prompt: "Do work" }])
322
373
  .execute("resume", { action: "resume", id: "nested-terminal-resume", message: "continue" }, new AbortController().signal, undefined, ctx(root));
323
374
 
324
375
  assert.equal(result.isError, true);
@@ -333,7 +384,7 @@ describe("nested control routing", () => {
333
384
  try {
334
385
  const route = createNestedRun("nested-stopped-resume", "stopped", { sessionFile: path.join(root, "missing-session.jsonl") });
335
386
 
336
- const result = await createExecutor(stateWithNestedRoute(route), [{ name: "builder", description: "Worker", prompt: "Do work" }])
387
+ const result = await createExecutor(stateWithNestedRoute(route), [{ name: "worker", description: "Worker", prompt: "Do work" }])
337
388
  .execute("resume", { action: "resume", id: "nested-stopped-resume", message: "continue" }, new AbortController().signal, undefined, ctx(root));
338
389
 
339
390
  assert.equal(result.isError, true);
@@ -354,7 +405,7 @@ describe("nested control routing", () => {
354
405
  fs.writeFileSync(attackerSessionFile, "");
355
406
  const route = createNestedRun("nested-untrusted-resume", "complete", { sessionFile: attackerSessionFile });
356
407
 
357
- const result = await createExecutor(stateWithNestedRoute(route), [{ name: "builder", description: "Worker", prompt: "Do work" }])
408
+ const result = await createExecutor(stateWithNestedRoute(route), [{ name: "worker", description: "Worker", prompt: "Do work" }])
358
409
  .execute("resume", { action: "resume", id: "nested-untrusted-resume", message: "continue" }, new AbortController().signal, undefined, ctx(root, parentSessionFile));
359
410
 
360
411
  assert.equal(result.isError, true);
@@ -374,7 +425,7 @@ describe("nested control routing", () => {
374
425
  fs.writeFileSync(siblingSessionFile, "");
375
426
  const route = createNestedRun("nested-sibling-resume", "complete", { sessionFile: siblingSessionFile });
376
427
 
377
- const result = await createExecutor(stateWithNestedRoute(route), [{ name: "builder", description: "Worker", prompt: "Do work" }])
428
+ const result = await createExecutor(stateWithNestedRoute(route), [{ name: "worker", description: "Worker", prompt: "Do work" }])
378
429
  .execute("resume", { action: "resume", id: "nested-sibling-resume", message: "continue" }, new AbortController().signal, undefined, ctx(root, parentSessionFile));
379
430
 
380
431
  assert.equal(result.isError, true);
@@ -395,8 +446,8 @@ describe("nested control routing", () => {
395
446
  modelRegistry: { getAvailable() { throw new Error("model registry exploded"); } },
396
447
  };
397
448
 
398
- const result = await createExecutor(createState(), [{ name: "builder", description: "Worker", prompt: "Do work" }])
399
- .execute("run", { agent: "builder", task: "go" }, new AbortController().signal, undefined, throwingCtx);
449
+ const result = await createExecutor(createState(), [{ name: "worker", description: "Worker", prompt: "Do work" }])
450
+ .execute("run", { agent: "worker", task: "go" }, new AbortController().signal, undefined, throwingCtx);
400
451
 
401
452
  assert.equal(result.isError, true);
402
453
  assert.match(text(result), /model registry exploded/);
@@ -485,6 +536,69 @@ describe("nested control routing", () => {
485
536
  }
486
537
  });
487
538
 
539
+ it("cleans the prior listener on reload and processes a resume request once", async () => {
540
+ const route = createNestedRoute("root-reload-listener");
541
+ routeRoots.push(path.dirname(route.eventSink));
542
+ setNestedRouteEnv(route, "root-reload-listener");
543
+ process.env[SUBAGENT_CHILD_ENV] = "1";
544
+ process.env[SUBAGENT_FANOUT_CHILD_ENV] = "1";
545
+ const registrations: string[] = [];
546
+ const activeIntervals = new Set<ReturnType<typeof setInterval>>();
547
+ const originalSetInterval = globalThis.setInterval;
548
+ const originalClearInterval = globalThis.clearInterval;
549
+ globalThis.setInterval = ((...args: Parameters<typeof setInterval>) => {
550
+ const interval = originalSetInterval(...args);
551
+ activeIntervals.add(interval);
552
+ return interval;
553
+ }) as typeof setInterval;
554
+ globalThis.clearInterval = ((interval: ReturnType<typeof setInterval>) => {
555
+ activeIntervals.delete(interval);
556
+ return originalClearInterval(interval);
557
+ }) as typeof clearInterval;
558
+ try {
559
+ const makePi = () => ({
560
+ events: { emit() {}, on() { return () => {}; } },
561
+ registerTool() { registrations.push("subagent"); },
562
+ getSessionName() { return "child"; },
563
+ }) as any;
564
+ const firstPi = makePi();
565
+
566
+ registerFanoutChildSubagentExtension(firstPi);
567
+ registerFanoutChildSubagentExtension(firstPi);
568
+ registerFanoutChildSubagentExtension(makePi());
569
+ assert.equal(activeIntervals.size, 1);
570
+
571
+ const unrelatedRoute = createNestedRoute("root-unrelated-listener");
572
+ routeRoots.push(path.dirname(unrelatedRoute.eventSink));
573
+ setNestedRouteEnv(unrelatedRoute, "root-unrelated-listener");
574
+ registerFanoutChildSubagentExtension(makePi());
575
+ assert.equal(activeIntervals.size, 2);
576
+
577
+ delete process.env[SUBAGENT_PARENT_EVENT_SINK_ENV];
578
+ delete process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV];
579
+ delete process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV];
580
+ delete process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV];
581
+ registerFanoutChildSubagentExtension(makePi());
582
+ assert.equal(activeIntervals.size, 2);
583
+
584
+ setNestedRouteEnv(route, "root-reload-listener");
585
+ writeNestedControlRequest(route, {
586
+ ts: Date.now(),
587
+ requestId: "reload-resume-once",
588
+ targetRunId: "missing-run",
589
+ action: "resume",
590
+ message: "continue",
591
+ });
592
+
593
+ await waitFor(() => readNestedControlResults(route).length === 1);
594
+ assert.equal(registrations.length, 4);
595
+ assert.equal(readNestedControlResults(route)[0]?.requestId, "reload-resume-once");
596
+ } finally {
597
+ globalThis.setInterval = originalSetInterval;
598
+ globalThis.clearInterval = originalClearInterval;
599
+ }
600
+ });
601
+
488
602
  it("negatively acknowledges ownerless fanout child control requests and removes them", async () => {
489
603
  const route = createNestedRoute("root-ownerless");
490
604
  routeRoots.push(path.dirname(route.eventSink));
@@ -64,8 +64,8 @@ function child(id: string, state: "queued" | "running" | "complete" | "failed" |
64
64
  path: [{ runId: parentRunId, stepIndex: 1 }],
65
65
  mode: "single" as const,
66
66
  state,
67
- agent: "commentator",
68
- agents: ["commentator"],
67
+ agent: "reviewer",
68
+ agents: ["reviewer"],
69
69
  startedAt: 10,
70
70
  lastUpdate: ts,
71
71
  steps: [{ agent: "leaf", status: state === "running" ? "running" as const : "complete" as const }],
@@ -355,7 +355,7 @@ describe("nested event parsing and projection", () => {
355
355
  ...child("nested-model-bounds", "running", 100),
356
356
  model: "m".repeat(600),
357
357
  thinking: "turbo",
358
- steps: [{ agent: "leaf", status: "running", model: "builder", thinking: "xhigh" }],
358
+ steps: [{ agent: "leaf", status: "running", model: "worker", thinking: "xhigh" }],
359
359
  },
360
360
  });
361
361
  const summary = projectNestedEvents(route).children[0]!;
@@ -371,13 +371,13 @@ describe("nested event parsing and projection", () => {
371
371
  state: "running",
372
372
  startedAt: 1,
373
373
  steps: [
374
- { agent: "builder", status: "running", model: "provider/builder", thinking: "high" },
374
+ { agent: "worker", status: "running", model: "provider/worker", thinking: "high" },
375
375
  ],
376
376
  }, "/tmp/child-run", { id: "child-run", parentRunId: "parent-run", depth: 1, mode: "single", ts: 2 });
377
377
 
378
- assert.equal(summary.model, "provider/builder");
378
+ assert.equal(summary.model, "provider/worker");
379
379
  assert.equal(summary.thinking, "high");
380
- assert.equal(summary.steps?.[0]?.model, "provider/builder");
380
+ assert.equal(summary.steps?.[0]?.model, "provider/worker");
381
381
  assert.equal(summary.steps?.[0]?.thinking, "high");
382
382
  });
383
383
 
@@ -389,7 +389,7 @@ describe("nested event parsing and projection", () => {
389
389
  startedAt: 1,
390
390
  processTerminal: { version: 1, state: "bogus", runId: "child-run", runnerProcessInstanceId: "runner-1" } as never,
391
391
  steps: [{
392
- agent: "builder",
392
+ agent: "worker",
393
393
  status: "complete",
394
394
  processTerminal: { version: 1, state: "observed", runId: "wrong-run", runnerProcessInstanceId: "runner-1" } as never,
395
395
  }],
@@ -409,7 +409,7 @@ describe("nested event parsing and projection", () => {
409
409
  startedAt: 1,
410
410
  runtimeAcknowledgedExtensions: { version: 1, source: "child-runtime", ids: ["/Users/alice/.secret-extension", "ok-ext", "x".repeat(5000)], omitted: 0 } as never,
411
411
  steps: [{
412
- agent: "builder",
412
+ agent: "worker",
413
413
  status: "complete",
414
414
  runtimeAcknowledgedExtensions: { version: 1, source: "child-runtime", ids: ["C:/Users/alice/secret"], omitted: 0 } as never,
415
415
  }],
@@ -99,7 +99,7 @@ function createFakeClock() {
99
99
  function completionResult(overrides: Record<string, unknown> = {}) {
100
100
  return {
101
101
  id: `notify-${Math.random().toString(36).slice(2)}`,
102
- agent: "builder",
102
+ agent: "worker",
103
103
  success: true,
104
104
  summary: "Done",
105
105
  exitCode: 0,
@@ -115,7 +115,7 @@ describe("registerSubagentNotify", () => {
115
115
 
116
116
  events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {
117
117
  id: "notify-empty-1",
118
- agent: "builder",
118
+ agent: "worker",
119
119
  success: true,
120
120
  summary: "",
121
121
  exitCode: 0,
@@ -127,7 +127,7 @@ describe("registerSubagentNotify", () => {
127
127
  assert.deepEqual(sent[0], {
128
128
  message: {
129
129
  customType: "subagent-notify",
130
- content: "Background task completed: **builder**\n\n(no output)",
130
+ content: "Background task completed: **worker**\n\n(no output)",
131
131
  display: false,
132
132
  },
133
133
  options: { triggerTurn: true },
@@ -169,7 +169,7 @@ describe("registerSubagentNotify", () => {
169
169
  id: "foreground-run:0",
170
170
  runId: "foreground-run",
171
171
  source: "foreground",
172
- agent: "commentator",
172
+ agent: "reviewer",
173
173
  success: true,
174
174
  summary: "Recovered final review",
175
175
  exitCode: 0,
@@ -181,7 +181,7 @@ describe("registerSubagentNotify", () => {
181
181
  assert.deepEqual(sent[0], {
182
182
  message: {
183
183
  customType: "subagent-notify",
184
- content: "Detached foreground task completed: **commentator**\n\nRecovered final review",
184
+ content: "Detached foreground task completed: **reviewer**\n\nRecovered final review",
185
185
  display: true,
186
186
  },
187
187
  options: { triggerTurn: true },
@@ -193,7 +193,7 @@ describe("registerSubagentNotify", () => {
193
193
  events.emit(SUBAGENT_FOREGROUND_COMPLETE_EVENT, {
194
194
  id: "foreground-run:0",
195
195
  source: "foreground",
196
- agent: "commentator",
196
+ agent: "reviewer",
197
197
  success: true,
198
198
  summary: "Recovered final review",
199
199
  timestamp: 123,
@@ -208,7 +208,7 @@ describe("registerSubagentNotify", () => {
208
208
 
209
209
  events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {
210
210
  id: "notify-summary-1",
211
- agent: "builder",
211
+ agent: "worker",
212
212
  success: true,
213
213
  summary,
214
214
  exitCode: 0,
@@ -222,7 +222,7 @@ describe("registerSubagentNotify", () => {
222
222
  assert.deepEqual(sent[0], {
223
223
  message: {
224
224
  customType: "subagent-notify",
225
- content: `Background task completed: **builder** (2/3)\n\n${summary}`,
225
+ content: `Background task completed: **worker** (2/3)\n\n${summary}`,
226
226
  display: false,
227
227
  },
228
228
  options: { triggerTurn: true },
@@ -234,7 +234,7 @@ describe("registerSubagentNotify", () => {
234
234
 
235
235
  events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {
236
236
  id: "notify-path-1",
237
- agent: "builder",
237
+ agent: "worker",
238
238
  success: true,
239
239
  summary: "Done",
240
240
  exitCode: 0,
@@ -246,7 +246,7 @@ describe("registerSubagentNotify", () => {
246
246
  assert.deepEqual(sent, [{
247
247
  message: {
248
248
  customType: "subagent-notify",
249
- content: "Background task completed: **builder**\n\nDone\n\nSession file: /tmp/session.jsonl",
249
+ content: "Background task completed: **worker**\n\nDone\n\nSession file: /tmp/session.jsonl",
250
250
  display: false,
251
251
  },
252
252
  options: { triggerTurn: true },
@@ -258,7 +258,7 @@ describe("registerSubagentNotify", () => {
258
258
 
259
259
  events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {
260
260
  id: "notify-paused-1",
261
- agent: "builder",
261
+ agent: "worker",
262
262
  success: false,
263
263
  state: "paused",
264
264
  summary: "Paused after interrupt. Waiting for explicit next action.",
@@ -270,7 +270,7 @@ describe("registerSubagentNotify", () => {
270
270
  assert.deepEqual(sent[0], {
271
271
  message: {
272
272
  customType: "subagent-notify",
273
- content: "Background task paused: **builder**\n\nPaused after interrupt. Waiting for explicit next action.",
273
+ content: "Background task paused: **worker**\n\nPaused after interrupt. Waiting for explicit next action.",
274
274
  display: true,
275
275
  },
276
276
  options: { triggerTurn: true },
@@ -282,7 +282,7 @@ describe("registerSubagentNotify", () => {
282
282
 
283
283
  events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {
284
284
  id: "notify-other-session",
285
- agent: "builder",
285
+ agent: "worker",
286
286
  success: true,
287
287
  summary: "Other done",
288
288
  timestamp: 100,
@@ -290,7 +290,7 @@ describe("registerSubagentNotify", () => {
290
290
  });
291
291
  events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {
292
292
  id: "notify-sessionless",
293
- agent: "builder",
293
+ agent: "worker",
294
294
  success: true,
295
295
  summary: "Legacy cwd-scoped done",
296
296
  timestamp: 101,
@@ -407,16 +407,16 @@ describe("registerSubagentNotify", () => {
407
407
  describe("completion formatting helpers", () => {
408
408
  it("formats and parses a parallel handoff without folding it into the result preview", () => {
409
409
  const content = formatSingleCompletion({
410
- agent: "builder",
410
+ agent: "worker",
411
411
  status: "completed",
412
412
  resultPreview: "Done",
413
413
  handoffPath: "/tmp/run/handoff.json",
414
414
  sessionLabel: "Session file",
415
415
  sessionValue: "/tmp/session.jsonl",
416
416
  });
417
- assert.equal(content, "Background task completed: **builder**\n\nDone\n\nParallel handoff: /tmp/run/handoff.json\n\nSession file: /tmp/session.jsonl");
417
+ assert.equal(content, "Background task completed: **worker**\n\nDone\n\nParallel handoff: /tmp/run/handoff.json\n\nSession file: /tmp/session.jsonl");
418
418
  assert.deepEqual(parseSubagentNotifyContent(content), {
419
- agent: "builder",
419
+ agent: "worker",
420
420
  status: "completed",
421
421
  resultPreview: "Done",
422
422
  handoffPath: "/tmp/run/handoff.json",
@@ -425,7 +425,7 @@ describe("completion formatting helpers", () => {
425
425
  });
426
426
  assert.equal(buildCompletionDetails({
427
427
  id: "run",
428
- agent: "builder",
428
+ agent: "worker",
429
429
  success: true,
430
430
  summary: "Done",
431
431
  parallelHandoff: { path: "/tmp/run/handoff.json" },
@@ -434,32 +434,32 @@ describe("completion formatting helpers", () => {
434
434
 
435
435
  it("formatSingleCompletion mirrors the in-handler single message shape", () => {
436
436
  const content = formatSingleCompletion({
437
- agent: "builder",
437
+ agent: "worker",
438
438
  status: "completed",
439
439
  taskInfo: " (2/3)",
440
440
  resultPreview: "Done",
441
441
  sessionLabel: "Session file",
442
442
  sessionValue: "/tmp/session.jsonl",
443
443
  });
444
- assert.equal(content, "Background task completed: **builder** (2/3)\n\nDone\n\nSession file: /tmp/session.jsonl");
444
+ assert.equal(content, "Background task completed: **worker** (2/3)\n\nDone\n\nSession file: /tmp/session.jsonl");
445
445
  });
446
446
 
447
447
  it("parses detached foreground notification content for the custom renderer", () => {
448
448
  const content = formatSingleCompletion({
449
- agent: "commentator",
449
+ agent: "reviewer",
450
450
  status: "failed",
451
451
  source: "foreground",
452
452
  resultPreview: "Acceptance rejected",
453
453
  sessionLabel: "Session file",
454
- sessionValue: "/tmp/commentator.jsonl",
454
+ sessionValue: "/tmp/reviewer.jsonl",
455
455
  });
456
456
  assert.deepEqual(parseSubagentNotifyContent(content), {
457
- agent: "commentator",
457
+ agent: "reviewer",
458
458
  status: "failed",
459
459
  source: "foreground",
460
460
  resultPreview: "Acceptance rejected",
461
461
  sessionLabel: "session file",
462
- sessionValue: "/tmp/commentator.jsonl",
462
+ sessionValue: "/tmp/reviewer.jsonl",
463
463
  });
464
464
  });
465
465