@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
@@ -61,20 +61,39 @@ test("truncLine respects grapheme display width", () => {
61
61
  assert.equal(visibleWidth(rendered), 5);
62
62
  });
63
63
 
64
+ test("truncLine emits no marker at zero width", () => {
65
+ assert.equal(truncLine("abcdef", 0), "");
66
+ });
67
+
68
+ test("multiline rendering omits two-column graphemes at one-column width", () => {
69
+ const originalColumns = Object.getOwnPropertyDescriptor(process.stdout, "columns");
70
+ Object.defineProperty(process.stdout, "columns", { configurable: true, value: 5 });
71
+ try {
72
+ const rendered = componentText(renderSubagentResult({
73
+ content: [{ type: "text", text: "a🙂b\n🙂" }],
74
+ }, { expanded: true }, theme as any));
75
+ assert.deepEqual(rendered.split("\n"), ["a", "b"]);
76
+ for (const line of rendered.split("\n")) assert.ok(visibleWidth(line) <= 1);
77
+ } finally {
78
+ if (originalColumns) Object.defineProperty(process.stdout, "columns", originalColumns);
79
+ else delete (process.stdout as { columns?: number }).columns;
80
+ }
81
+ });
82
+
64
83
  test("compact chain rendering uses workflow graph spans for dynamic fanout results", () => {
65
84
  const component = renderSubagentResult({
66
85
  content: [{ type: "text", text: "done" }],
67
86
  details: {
68
87
  mode: "chain",
69
- chainAgents: ["explorer", "expand:commentator", "writer"],
88
+ chainAgents: ["scout", "expand:reviewer", "writer"],
70
89
  totalSteps: 3,
71
- results: [result("explorer", "targets"), result("commentator", "a"), result("commentator", "b"), result("writer", "final")],
90
+ results: [result("scout", "targets"), result("reviewer", "a"), result("reviewer", "b"), result("writer", "final")],
72
91
  workflowGraph: {
73
92
  runId: "render-dynamic",
74
93
  mode: "chain",
75
94
  phases: [],
76
95
  nodes: [
77
- { id: "step-0", kind: "step", agent: "explorer", label: "Scout", status: "completed", flatIndex: 0, stepIndex: 0 },
96
+ { id: "step-0", kind: "step", agent: "scout", label: "Scout", status: "completed", flatIndex: 0, stepIndex: 0 },
78
97
  {
79
98
  id: "step-1",
80
99
  kind: "dynamic-parallel-group",
@@ -82,8 +101,8 @@ test("compact chain rendering uses workflow graph spans for dynamic fanout resul
82
101
  status: "completed",
83
102
  stepIndex: 1,
84
103
  children: [
85
- { id: "step-1-item-a", kind: "agent", agent: "commentator", label: "Review A", status: "completed", flatIndex: 1, stepIndex: 1 },
86
- { id: "step-1-item-b", kind: "agent", agent: "commentator", label: "Review B", status: "completed", flatIndex: 2, stepIndex: 1 },
104
+ { id: "step-1-item-a", kind: "agent", agent: "reviewer", label: "Review A", status: "completed", flatIndex: 1, stepIndex: 1 },
105
+ { id: "step-1-item-b", kind: "agent", agent: "reviewer", label: "Review B", status: "completed", flatIndex: 2, stepIndex: 1 },
87
106
  ],
88
107
  dynamic: { sourceOutput: "targets", sourcePath: "/items", itemName: "target", collectAs: "reviews" },
89
108
  },
@@ -94,9 +113,9 @@ test("compact chain rendering uses workflow graph spans for dynamic fanout resul
94
113
  }, { expanded: false }, theme as any);
95
114
 
96
115
  const text = componentText(component);
97
- assert.match(text, /Step 1: explorer/);
98
- assert.match(text, /Agent 1\/2: commentator/);
99
- assert.match(text, /Agent 2\/2: commentator/);
116
+ assert.match(text, /Step 1: scout/);
117
+ assert.match(text, /Agent 1\/2: reviewer/);
118
+ assert.match(text, /Agent 2\/2: reviewer/);
100
119
  assert.match(text, /Step 3: writer/);
101
120
  });
102
121
 
@@ -105,15 +124,15 @@ test("compact chain rendering shows failed zero-child dynamic fanout groups", ()
105
124
  content: [{ type: "text", text: "failed" }],
106
125
  details: {
107
126
  mode: "chain",
108
- chainAgents: ["explorer", "expand:commentator", "writer"],
127
+ chainAgents: ["scout", "expand:reviewer", "writer"],
109
128
  totalSteps: 3,
110
- results: [result("explorer", "targets")],
129
+ results: [result("scout", "targets")],
111
130
  workflowGraph: {
112
131
  runId: "render-empty-dynamic-failed",
113
132
  mode: "chain",
114
133
  phases: [],
115
134
  nodes: [
116
- { id: "step-0", kind: "step", agent: "explorer", label: "Scout", status: "completed", flatIndex: 0, stepIndex: 0 },
135
+ { id: "step-0", kind: "step", agent: "scout", label: "Scout", status: "completed", flatIndex: 0, stepIndex: 0 },
117
136
  {
118
137
  id: "step-1",
119
138
  kind: "dynamic-parallel-group",
@@ -133,7 +152,7 @@ test("compact chain rendering shows failed zero-child dynamic fanout groups", ()
133
152
  const text = componentText(component);
134
153
  assert.match(text, /step 1\/3/);
135
154
  assert.doesNotMatch(text, /step 3\/3/);
136
- assert.match(text, /Step 1: explorer/);
155
+ assert.match(text, /Step 1: scout/);
137
156
  assert.match(text, /Step 2: Review targets .* failed/);
138
157
  assert.match(text, /No review targets materialized/);
139
158
  assert.match(text, /Step 3: writer .* pending/);
@@ -144,15 +163,15 @@ test("expanded chain rendering uses workflow graph spans for dynamic fanout resu
144
163
  content: [{ type: "text", text: "done" }],
145
164
  details: {
146
165
  mode: "chain",
147
- chainAgents: ["explorer", "expand:commentator", "writer"],
166
+ chainAgents: ["scout", "expand:reviewer", "writer"],
148
167
  totalSteps: 3,
149
- results: [result("explorer", "targets"), result("commentator", "a"), result("commentator", "b"), result("writer", "final")],
168
+ results: [result("scout", "targets"), result("reviewer", "a"), result("reviewer", "b"), result("writer", "final")],
150
169
  workflowGraph: {
151
170
  runId: "render-dynamic-expanded",
152
171
  mode: "chain",
153
172
  phases: [],
154
173
  nodes: [
155
- { id: "step-0", kind: "step", agent: "explorer", label: "Scout", status: "completed", flatIndex: 0, stepIndex: 0 },
174
+ { id: "step-0", kind: "step", agent: "scout", label: "Scout", status: "completed", flatIndex: 0, stepIndex: 0 },
156
175
  {
157
176
  id: "step-1",
158
177
  kind: "dynamic-parallel-group",
@@ -160,8 +179,8 @@ test("expanded chain rendering uses workflow graph spans for dynamic fanout resu
160
179
  status: "completed",
161
180
  stepIndex: 1,
162
181
  children: [
163
- { id: "step-1-item-a", kind: "agent", agent: "commentator", label: "Review A", status: "completed", flatIndex: 1, stepIndex: 1 },
164
- { id: "step-1-item-b", kind: "agent", agent: "commentator", label: "Review B", status: "completed", flatIndex: 2, stepIndex: 1 },
182
+ { id: "step-1-item-a", kind: "agent", agent: "reviewer", label: "Review A", status: "completed", flatIndex: 1, stepIndex: 1 },
183
+ { id: "step-1-item-b", kind: "agent", agent: "reviewer", label: "Review B", status: "completed", flatIndex: 2, stepIndex: 1 },
165
184
  ],
166
185
  dynamic: { sourceOutput: "targets", sourcePath: "/items", itemName: "target", collectAs: "reviews" },
167
186
  },
@@ -172,9 +191,9 @@ test("expanded chain rendering uses workflow graph spans for dynamic fanout resu
172
191
  }, { expanded: true }, theme as any);
173
192
 
174
193
  const text = componentText(component);
175
- assert.match(text, /Step 1: explorer/);
176
- assert.match(text, /Agent 1\/2: commentator/);
177
- assert.match(text, /Agent 2\/2: commentator/);
194
+ assert.match(text, /Step 1: scout/);
195
+ assert.match(text, /Agent 1\/2: reviewer/);
196
+ assert.match(text, /Agent 2\/2: reviewer/);
178
197
  assert.match(text, /Step 3: writer/);
179
198
  });
180
199
 
@@ -183,7 +202,7 @@ test("compact multi-result rendering shows total cost in the header", () => {
183
202
  content: [{ type: "text", text: "done" }],
184
203
  details: {
185
204
  mode: "parallel",
186
- results: [result("explorer", "a"), result("commentator", "b")],
205
+ results: [result("scout", "a"), result("reviewer", "b")],
187
206
  totalCost: { inputTokens: 30, outputTokens: 12, costUsd: 0.04 },
188
207
  },
189
208
  }, { expanded: false }, theme as any));
@@ -197,25 +216,25 @@ test("static sequential and static parallel chain rendering keep existing labels
197
216
  content: [{ type: "text", text: "done" }],
198
217
  details: {
199
218
  mode: "chain",
200
- chainAgents: ["explorer", "writer"],
219
+ chainAgents: ["scout", "writer"],
201
220
  totalSteps: 2,
202
- results: [result("explorer", "a"), result("writer", "b")],
221
+ results: [result("scout", "a"), result("writer", "b")],
203
222
  },
204
223
  }, { expanded: false }, theme as any));
205
- assert.match(sequential, /Step 1: explorer/);
224
+ assert.match(sequential, /Step 1: scout/);
206
225
  assert.match(sequential, /Step 2: writer/);
207
226
 
208
227
  const parallel = componentText(renderSubagentResult({
209
228
  content: [{ type: "text", text: "done" }],
210
229
  details: {
211
230
  mode: "chain",
212
- chainAgents: ["explorer", "[commentator+auditor]", "writer"],
231
+ chainAgents: ["scout", "[reviewer+auditor]", "writer"],
213
232
  totalSteps: 3,
214
- results: [result("explorer", "a"), result("commentator", "b"), result("auditor", "c"), result("writer", "d")],
233
+ results: [result("scout", "a"), result("reviewer", "b"), result("auditor", "c"), result("writer", "d")],
215
234
  },
216
235
  }, { expanded: false }, theme as any));
217
- assert.match(parallel, /Step 1: explorer/);
218
- assert.match(parallel, /Agent 1\/2: commentator/);
236
+ assert.match(parallel, /Step 1: scout/);
237
+ assert.match(parallel, /Agent 1\/2: reviewer/);
219
238
  assert.match(parallel, /Agent 2\/2: auditor/);
220
239
  assert.match(parallel, /Step 3: writer/);
221
240
  });
@@ -21,15 +21,15 @@ describe("result intercom formatter", () => {
21
21
  chainSteps: 4,
22
22
  children: [
23
23
  {
24
- agent: "commentator-a",
24
+ agent: "reviewer-a",
25
25
  status: "completed",
26
26
  summary: "Completed checks",
27
27
  artifactPath: "/tmp/a.md",
28
28
  sessionPath: "/tmp/a-session.jsonl",
29
- intercomTarget: "subagent-commentator-a-run-123-1",
29
+ intercomTarget: "subagent-reviewer-a-run-123-1",
30
30
  },
31
31
  {
32
- agent: "commentator-b",
32
+ agent: "reviewer-b",
33
33
  status: "failed",
34
34
  summary: "Failed checks",
35
35
  artifactPath: "/tmp/b.md",
@@ -48,9 +48,9 @@ describe("result intercom formatter", () => {
48
48
  assert.match(payload.message, /Outputs: 2 unknown \(semantic adequacy unassessed\)/);
49
49
  assert.match(payload.message, /Chain steps: 4/);
50
50
  assert.match(payload.message, /Intercom targets below identify child sessions used while they were running/);
51
- assert.match(payload.message, /1\. commentator-a — process completed · output unknown/);
52
- assert.match(payload.message, /Run intercom target: subagent-commentator-a-run-123-1/);
53
- assert.match(payload.message, /2\. commentator-b — process failed · output unknown/);
51
+ assert.match(payload.message, /1\. reviewer-a — process completed · output unknown/);
52
+ assert.match(payload.message, /Run intercom target: subagent-reviewer-a-run-123-1/);
53
+ assert.match(payload.message, /2\. reviewer-b — process failed · output unknown/);
54
54
  assert.match(payload.message, /Output artifact: \/tmp\/a\.md/);
55
55
  assert.match(payload.message, /Session: \/tmp\/a-session\.jsonl/);
56
56
  });
@@ -66,7 +66,7 @@ describe("result intercom formatter", () => {
66
66
  mode: "single",
67
67
  source: "async",
68
68
  asyncId: "run-single",
69
- children: [{ agent: "builder", status: "completed", summary: "done", sessionPath }],
69
+ children: [{ agent: "worker", status: "completed", summary: "done", sessionPath }],
70
70
  });
71
71
 
72
72
  assert.match(payload.message, /Revive: subagent\(\{ action: "resume", id: "run-single", message: "\.\.\." \}\)/);
@@ -109,7 +109,7 @@ describe("result intercom formatter", () => {
109
109
  mode: "single",
110
110
  source: "async",
111
111
  asyncId: "run-missing-session",
112
- children: [{ agent: "builder", status: "failed", summary: "failed", sessionPath: path.join(os.tmpdir(), "missing-pi-session.jsonl") }],
112
+ children: [{ agent: "worker", status: "failed", summary: "failed", sessionPath: path.join(os.tmpdir(), "missing-pi-session.jsonl") }],
113
113
  });
114
114
 
115
115
  assert.match(payload.message, /Resume: unavailable; no child session file was persisted/);
@@ -132,7 +132,7 @@ describe("result intercom formatter", () => {
132
132
  depth: 1,
133
133
  path: [{ runId: "root-run", stepIndex: 1 }],
134
134
  state: "complete",
135
- agent: "commentator",
135
+ agent: "reviewer",
136
136
  model: "provider/gpt-5.6-luna:medium",
137
137
  thinking: "medium",
138
138
  sessionFile: path.join(os.tmpdir(), "nested-a.jsonl"),
@@ -166,7 +166,7 @@ describe("result intercom formatter", () => {
166
166
  assert.equal(Object.hasOwn(grandchild ?? {}, "controlInbox"), false);
167
167
  assert.equal(Object.hasOwn(grandchild ?? {}, "capabilityToken"), false);
168
168
  assert.match(payload.message, /Nested subagents:/);
169
- assert.match(payload.message, /↳ commentator — complete \[nested-a\]/);
169
+ assert.match(payload.message, /↳ reviewer — complete \[nested-a\]/);
170
170
  });
171
171
 
172
172
  it("separates process failure from output presence and gives salvage guidance", () => {
@@ -197,7 +197,7 @@ describe("result intercom formatter", () => {
197
197
  runId: "run-bound",
198
198
  mode: "single",
199
199
  source: "foreground",
200
- children: [{ agent: "builder", status: "completed", summary: longSummary }],
200
+ children: [{ agent: "worker", status: "completed", summary: longSummary }],
201
201
  });
202
202
  assert.equal(payload.children[0]!.summary, longSummary);
203
203
  assert.match(payload.message, new RegExp(`${"x".repeat(2000)}\\n${"y".repeat(2000)}`));
@@ -232,7 +232,7 @@ describe("result intercom formatter", () => {
232
232
  const stripped = stripDetailsOutputsForIntercomReceipt({
233
233
  mode: "single",
234
234
  results: [{
235
- agent: "builder",
235
+ agent: "worker",
236
236
  task: "Task",
237
237
  exitCode: 0,
238
238
  messages: [{ role: "assistant", content: [{ type: "text", text: "full" }] } as never],
@@ -0,0 +1,57 @@
1
+ import assert from "node:assert/strict";
2
+ import * as fs from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import { describe, it } from "node:test";
6
+ import { listRetainedChildren } from "../../src/runs/background/retained-children.ts";
7
+
8
+ function writeRetainedRun(root: string, index: number, sessionId = "parent-a", parentWorkflowRunId: string | null = "workflow-a"): void {
9
+ const runId = `child-${index}`;
10
+ const sessionFile = path.join(root, "sessions", `${runId}.jsonl`);
11
+ fs.mkdirSync(path.dirname(sessionFile), { recursive: true });
12
+ fs.writeFileSync(sessionFile, "", "utf-8");
13
+ const asyncDir = path.join(root, "runs", runId);
14
+ fs.mkdirSync(asyncDir, { recursive: true });
15
+ fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
16
+ runId,
17
+ sessionId,
18
+ mode: "single",
19
+ state: "complete",
20
+ startedAt: index,
21
+ endedAt: 1_000 + index,
22
+ lastUpdate: 1_000 + index,
23
+ ...(parentWorkflowRunId ? { parentWorkflowRunId } : {}),
24
+ steps: [{
25
+ agent: "worker",
26
+ status: "complete",
27
+ description: ` Task ${index} with spacing ${"x".repeat(140)} `,
28
+ endedAt: 1_000 + index,
29
+ sessionFile,
30
+ tokens: { input: index, output: index + 1, total: index * 2 + 1 },
31
+ }],
32
+ }), "utf-8");
33
+ }
34
+
35
+ describe("retained child roster", () => {
36
+ it("returns only the newest 10 completed workflow children owned by the parent session", () => {
37
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-retained-children-"));
38
+ try {
39
+ for (let index = 0; index < 12; index++) writeRetainedRun(root, index);
40
+ writeRetainedRun(root, 50, "parent-b");
41
+ writeRetainedRun(root, 51, "parent-a", null);
42
+
43
+ const children = listRetainedChildren(path.join(root, "runs"), "parent-a");
44
+
45
+ assert.equal(children.length, 10);
46
+ assert.deepEqual(children.map((child) => child.runId), Array.from({ length: 10 }, (_, offset) => `child-${11 - offset}`));
47
+ assert.equal(children[0]?.agent, "worker");
48
+ assert.equal(children[0]?.completedAt, 1_011);
49
+ assert.ok((children[0]?.taskSummary.length ?? 0) <= 120);
50
+ assert.equal(children[0]?.taskSummary.startsWith("Task 11 with spacing"), true);
51
+ assert.deepEqual(children[0]?.tokenTotals, { input: 11, output: 12, total: 23 });
52
+ assert.equal(children.some((child) => child.runId === "child-50" || child.runId === "child-51"), false);
53
+ } finally {
54
+ fs.rmSync(root, { recursive: true, force: true });
55
+ }
56
+ });
57
+ });
@@ -146,7 +146,7 @@ describe("subagent extension RPC bridge", () => {
146
146
  assert.deepEqual(executedParams, { action: "status", id: "abc123" });
147
147
  assert.equal((reply as { data: { text?: string } }).data.text, "Run: abc123");
148
148
  assert.deepEqual((reply as { data: { fleet?: unknown } }).data.fleet, {
149
- version: 1, entries: [], totalActive: 0, omitted: 0,
149
+ version: 1, entries: [], totalActive: 0, topLevelAsyncCapacity: { used: 0, limit: 0 }, omitted: 0,
150
150
  });
151
151
 
152
152
  bridge.dispose();
@@ -160,7 +160,7 @@ describe("subagent extension RPC bridge", () => {
160
160
  asyncJobs: new Map([["async-private-id", {
161
161
  asyncId: "async-private-id", sessionId: "/sessions/parent.jsonl", status: "running", mode: "single",
162
162
  description: ["Review", "\u001b]8;;hostile\u0007", "the diff"].join("\n"),
163
- startedAt: 100, steps: [{ agent: "commentator", label: "opaque label", status: "running", startedAt: 120, model: "anthropic/claude-opus-4-8:high", thinking: "high", tokens: { input: 12, output: 34, total: 46 } }],
163
+ startedAt: 100, steps: [{ agent: "reviewer", label: "opaque label", status: "running", startedAt: 120, model: "anthropic/claude-opus-4-8:high", thinking: "high", tokens: { input: 12, output: 34, total: 46 } }],
164
164
  }]]),
165
165
  } as any;
166
166
  const bridge = registerSubagentRpcBridge({
@@ -173,14 +173,41 @@ describe("subagent extension RPC bridge", () => {
173
173
  assert.equal((fleet as { totalActive?: number }).totalActive, 1);
174
174
  assert.equal((fleet as { omitted?: number }).omitted, 0);
175
175
  assert.deepEqual(fleet.entries[0], {
176
- key: "fleet-1", agent: "commentator", role: "opaque label", model: "anthropic/claude-opus-4-8:high", effort: "high",
177
- startedAt: 120, tokens: { input: 12, output: 34, total: 46 }, goal: "Review the diff",
176
+ key: "fleet-1", agent: "reviewer", role: "opaque label", model: "anthropic/claude-opus-4-8:high", effort: "high",
177
+ startedAt: 120, tokens: { input: 12, output: 34, total: 46 },
178
178
  });
179
+ assert.equal(JSON.stringify(fleet).includes("Review the diff"), false);
179
180
  assert.equal(JSON.stringify(fleet).includes("async-private-id"), false);
180
181
  bridge.dispose();
181
182
  });
182
183
 
183
- it("projects resolved foreground model, effort, split usage, and goal", async () => {
184
+ it("projects fleet text without control characters or malformed UTF-16", async () => {
185
+ const events = new FakeEvents();
186
+ const state = {
187
+ currentSessionId: "session-123",
188
+ foregroundControls: new Map(),
189
+ asyncJobs: new Map([["unicode", {
190
+ asyncId: "unicode", sessionId: "session-123", status: "running", mode: "single", startedAt: 1,
191
+ description: "start\n" + "😀".repeat(257),
192
+ agents: [`worker\ud800broken\udc00${"😀".repeat(45)}`],
193
+ }]]),
194
+ } as any;
195
+ const bridge = registerSubagentRpcBridge({
196
+ events, getContext: () => ctx("session-123", "session-123"), state,
197
+ execute: async () => ({ content: [], details: { mode: "management", results: [] } } as any),
198
+ });
199
+ const reply = await request(events, "fleet-unicode", "status");
200
+ const entry = (reply as any).data.fleet.entries[0];
201
+ const malformedSurrogate = /[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]/u;
202
+
203
+ assert.doesNotMatch(entry.agent, malformedSurrogate);
204
+ assert.equal(entry.goal, undefined);
205
+ assert.ok(entry.agent.length <= 96);
206
+ assert.match(entry.agent, /^worker broken/);
207
+ bridge.dispose();
208
+ });
209
+
210
+ it("projects resolved foreground model, effort, and split usage without prompt goals", async () => {
184
211
  const events = new FakeEvents();
185
212
  const state = {
186
213
  currentSessionId: "session-123",
@@ -191,7 +218,7 @@ describe("subagent extension RPC bridge", () => {
191
218
  startedAt: 90,
192
219
  activeChildren: new Map([[0, {
193
220
  index: 0,
194
- agent: "builder",
221
+ agent: "worker",
195
222
  description: "Implement the fix",
196
223
  startedAt: 100,
197
224
  updatedAt: 110,
@@ -203,13 +230,14 @@ describe("subagent extension RPC bridge", () => {
203
230
  }]]),
204
231
  }]]),
205
232
  asyncJobs: new Map(),
233
+ activeAsyncCapacity: { used: 2, limit: 4 },
206
234
  } as any;
207
235
  state.foregroundControls.set("private-old", {
208
236
  runId: "private-old",
209
237
  sessionId: "old-session",
210
238
  mode: "single",
211
239
  startedAt: 50,
212
- currentAgent: "commentator",
240
+ currentAgent: "reviewer",
213
241
  description: "Old work",
214
242
  });
215
243
  const bridge = registerSubagentRpcBridge({
@@ -222,15 +250,15 @@ describe("subagent extension RPC bridge", () => {
222
250
  assert.deepEqual((reply as any).data.fleet, {
223
251
  version: 1,
224
252
  totalActive: 1,
253
+ topLevelAsyncCapacity: { used: 2, limit: 4 },
225
254
  omitted: 0,
226
255
  entries: [{
227
256
  key: "fleet-1",
228
- agent: "builder",
257
+ agent: "worker",
229
258
  model: "openai/gpt-5.6-terra:high",
230
259
  effort: "high",
231
260
  startedAt: 100,
232
261
  tokens: { input: 321, output: 45, total: 366 },
233
- goal: "Implement the fix",
234
262
  }],
235
263
  });
236
264
  assert.equal(JSON.stringify((reply as any).data.fleet).includes("private-run"), false);
@@ -269,7 +297,7 @@ describe("subagent extension RPC bridge", () => {
269
297
  status: "running",
270
298
  mode: "single",
271
299
  startedAt: index + 1,
272
- agents: [`builder-${index}`],
300
+ agents: [`worker-${index}`],
273
301
  });
274
302
  }
275
303
  jobs.set("unattributed", { asyncId: "unattributed", status: "running", mode: "single", startedAt: 20, agents: ["hidden"] });
@@ -300,19 +328,18 @@ describe("subagent extension RPC bridge", () => {
300
328
  execute: async (_id, params) => {
301
329
  executedParams = params;
302
330
  return {
303
- content: [{ type: "text", text: "Async: builder [run-1]" }],
331
+ content: [{ type: "text", text: "Async: worker [run-1]" }],
304
332
  details: { mode: "single", results: [], asyncId: "run-1", asyncDir: "/tmp/run-1" },
305
333
  } as any;
306
334
  },
307
335
  });
308
336
 
309
- const reply = await request(events, "spawn-1", "spawn", { agent: "builder", task: "Do work" });
337
+ const reply = await request(events, "spawn-1", "spawn", { workflowScript: "return runs.run('main', { agent: 'worker', task: 'Do work' })" });
310
338
 
311
339
  assert.equal(reply.success, true);
312
- assert.equal(executedParams.agent, "builder");
313
- assert.equal(executedParams.task, "Do work");
340
+ assert.equal(executedParams.workflowScript, "return runs.run('main', { agent: 'worker', task: 'Do work' })");
314
341
  assert.equal(executedParams.async, true);
315
- assert.equal(executedParams.clarify, false);
342
+ assert.equal("clarify" in executedParams, false);
316
343
  assert.equal((reply as { data: { details?: { asyncId?: string } } }).data.details?.asyncId, "run-1");
317
344
 
318
345
  bridge.dispose();
@@ -326,11 +353,11 @@ describe("subagent extension RPC bridge", () => {
326
353
  getContext: () => ctx(),
327
354
  execute: async (_id, params) => {
328
355
  executedParams = params;
329
- return { content: [{ type: "text", text: "Async: builder [run-1]" }], details: { mode: "single", results: [] } } as any;
356
+ return { content: [{ type: "text", text: "Async: worker [run-1]" }], details: { mode: "single", results: [] } } as any;
330
357
  },
331
358
  });
332
359
 
333
- const reply = await request(events, "spawn-worktree", "spawn", { agent: "builder", task: "Do work", worktree: true });
360
+ const reply = await request(events, "spawn-worktree", "spawn", { workflowScript: "return runs.run('main', { agent: 'worker', task: 'Do work' })", worktree: true });
334
361
 
335
362
  assert.equal(reply.success, true);
336
363
  assert.equal(executedParams.worktree, true);
@@ -338,24 +365,25 @@ describe("subagent extension RPC bridge", () => {
338
365
  bridge.dispose();
339
366
  });
340
367
 
341
- it("rejects removed top-level chain and parallel spawn inputs", async () => {
368
+ it("accepts chain, parallel, single, and worktree spawn inputs", async () => {
342
369
  const events = new FakeEvents();
343
370
  let executeCalls = 0;
344
371
  const bridge = registerSubagentRpcBridge({
345
372
  events,
346
373
  getContext: () => ctx(),
347
- execute: async () => { executeCalls++; throw new Error("unreachable"); },
374
+ execute: async () => { executeCalls++; return { content: [], details: { mode: "workflow", results: [] } } as any; },
348
375
  });
349
376
 
350
- const chainReply = await request(events, "spawn-chain", "spawn", { chain: [{ agent: "builder" }] });
351
- const parallelReply = await request(events, "spawn-parallel", "spawn", { tasks: [{ agent: "builder", task: "work" }] });
352
- const worktreeReply = await request(events, "spawn-worktree", "spawn", { worktree: true });
377
+ const chainReply = await request(events, "spawn-chain", "spawn", { chain: [{ agent: "worker" }] });
378
+ const parallelReply = await request(events, "spawn-parallel", "spawn", { tasks: [{ agent: "worker", task: "work" }] });
379
+ const singleReply = await request(events, "spawn-single", "spawn", { agent: "worker", task: "work" });
380
+ const worktreeReply = await request(events, "spawn-worktree", "spawn", { worktree: true, workflowScript: "return 1" });
353
381
 
354
- assert.equal(chainReply.success, false);
355
- assert.equal(parallelReply.success, false);
356
- assert.equal(worktreeReply.success, false);
357
- assert.match((chainReply as { error?: { message?: string } }).error?.message ?? "", /workflowScript/);
358
- assert.equal(executeCalls, 0);
382
+ assert.equal(chainReply.success, true);
383
+ assert.equal(parallelReply.success, true);
384
+ assert.equal(singleReply.success, true);
385
+ assert.equal(worktreeReply.success, true);
386
+ assert.equal(executeCalls, 4);
359
387
  bridge.dispose();
360
388
  });
361
389
 
@@ -371,15 +399,19 @@ describe("subagent extension RPC bridge", () => {
371
399
  },
372
400
  });
373
401
 
374
- const foreground = await request(events, "spawn-foreground", "spawn", { agent: "builder", task: "Do work", async: false });
402
+ const direct = await request(events, "spawn-direct", "spawn", { agent: "worker", task: "Do work" });
403
+ const foreground = await request(events, "spawn-foreground", "spawn", { workflowScript: "return runs.run('main', { agent: 'worker' })", async: false });
375
404
  const management = await request(events, "spawn-management", "spawn", { action: "list" });
376
405
 
406
+ assert.equal(direct.success, true);
407
+ assert.equal(executeCalls, 1);
408
+
377
409
  assert.equal(foreground.success, false);
378
410
  assert.equal((foreground as { error: { code: string; message: string } }).error.code, "invalid_params");
379
411
  assert.match((foreground as { error: { message: string } }).error.message, /detached async/);
380
412
  assert.equal(management.success, false);
381
413
  assert.match((management as { error: { message: string } }).error.message, /does not accept management/);
382
- assert.equal(executeCalls, 0);
414
+ assert.equal(executeCalls, 1);
383
415
 
384
416
  bridge.dispose();
385
417
  });
@@ -403,6 +435,7 @@ describe("subagent extension RPC bridge", () => {
403
435
  id: "abc123",
404
436
  index: 0,
405
437
  message: " Focus on the failing test. ",
438
+ mode: "follow_up",
406
439
  });
407
440
 
408
441
  assert.equal(reply.success, true);
@@ -411,6 +444,7 @@ describe("subagent extension RPC bridge", () => {
411
444
  id: "abc123",
412
445
  index: 0,
413
446
  message: "Focus on the failing test.",
447
+ mode: "follow_up",
414
448
  steeringRecovery: false,
415
449
  });
416
450
  assert.equal((reply as { data: { text?: string } }).data.text, "Steering delivered.");
@@ -569,7 +603,7 @@ describe("subagent extension RPC bridge", () => {
569
603
  pid: 4242,
570
604
  startedAt: 100,
571
605
  lastUpdate: 100,
572
- steps: [{ agent: "builder", status: "running", startedAt: 100 }],
606
+ steps: [{ agent: "worker", status: "running", startedAt: 100 }],
573
607
  }, null, 2), "utf-8");
574
608
  const bridge = registerSubagentRpcBridge({
575
609
  events,
@@ -594,6 +628,52 @@ describe("subagent extension RPC bridge", () => {
594
628
  }
595
629
  });
596
630
 
631
+ it("rejects stop requests for reload-recovered workflows", async () => {
632
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-rpc-stop-workflow-"));
633
+ try {
634
+ const events = new FakeEvents();
635
+ const asyncRoot = path.join(root, "runs");
636
+ const resultsDir = path.join(root, "results");
637
+ const asyncDir = path.join(asyncRoot, "workflow-run");
638
+ let killCalls = 0;
639
+ fs.mkdirSync(asyncDir, { recursive: true });
640
+ fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
641
+ runId: "workflow-run",
642
+ sessionId: "/sessions/parent.jsonl",
643
+ mode: "workflow",
644
+ state: "running",
645
+ pid: 4242,
646
+ startedAt: 100,
647
+ lastUpdate: 100,
648
+ steps: [{ agent: "worker", status: "running", startedAt: 100 }],
649
+ }, null, 2), "utf-8");
650
+ const bridge = registerSubagentRpcBridge({
651
+ events,
652
+ getContext: () => ctx(),
653
+ execute: async () => assert.fail("stop should not call executor"),
654
+ asyncDirRoot: asyncRoot,
655
+ resultsDir,
656
+ kill: () => {
657
+ killCalls++;
658
+ return true;
659
+ },
660
+ now: () => 150,
661
+ });
662
+
663
+ const reply = await request(events, "stop-workflow", "stop", { id: "workflow-run" });
664
+
665
+ assert.equal(reply.success, false);
666
+ assert.equal((reply as { error: { code: string; message: string } }).error.code, "invalid_state");
667
+ assert.match((reply as { error: { message: string } }).error.message, /reload recovery cannot stop it safely/);
668
+ assert.equal(fs.existsSync(stopRequestPath(asyncDir)), false);
669
+ assert.equal(killCalls, 0);
670
+
671
+ bridge.dispose();
672
+ } finally {
673
+ fs.rmSync(root, { recursive: true, force: true });
674
+ }
675
+ });
676
+
597
677
  it("rejects stop requests for async runs from a different session", async () => {
598
678
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-rpc-stop-session-"));
599
679
  try {
@@ -611,7 +691,7 @@ describe("subagent extension RPC bridge", () => {
611
691
  pid: 4242,
612
692
  startedAt: 100,
613
693
  lastUpdate: 100,
614
- steps: [{ agent: "builder", status: "running", startedAt: 100 }],
694
+ steps: [{ agent: "worker", status: "running", startedAt: 100 }],
615
695
  }, null, 2), "utf-8");
616
696
  const bridge = registerSubagentRpcBridge({
617
697
  events,