@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
@@ -6,8 +6,10 @@ import * as path from "node:path";
6
6
  import { describe, it } from "node:test";
7
7
  import { isSameGitRepository, resolveWorkflowChatProgress } from "../../src/workflows/chat-progress.ts";
8
8
  import { renderSubagentResult } from "../../src/tui/render.ts";
9
- import { createSubagentExecutor, foregroundResultIntercomStatus, shouldSuppressRoutineResultIntercom } from "../../src/runs/foreground/subagent-executor.ts";
10
- import type { Details, SingleResult, SubagentState } from "../../src/shared/types.ts";
9
+ import { bindMissionWorkflowChildAsyncLaunch, createSubagentExecutor, foregroundResultIntercomStatus, missionWorkflowChildStatus, runMissionWorkflowChild, shouldSuppressRoutineResultIntercom } from "../../src/runs/foreground/subagent-executor.ts";
10
+ import { readMissionBinding } from "../../src/missions/lifecycle.ts";
11
+ import { createMission, readMission } from "../../src/missions/store.ts";
12
+ import { DIRS, type Details, type SingleResult, type SubagentState } from "../../src/shared/types.ts";
11
13
 
12
14
  const theme = {
13
15
  fg(_name: string, text: string): string { return text; },
@@ -96,6 +98,7 @@ describe("workflow chat progress policy", () => {
96
98
  assert.equal(resolveWorkflowChatProgress({ requested: "auto", parentCwd: repo, workflowCwd: worktree, background: true }).projection?.mode, "milestones");
97
99
  assert.equal(resolveWorkflowChatProgress({ requested: "auto", parentCwd: repo, workflowCwd: other, background: false }).projection?.mode, "terminal");
98
100
  assert.match(resolveWorkflowChatProgress({ requested: "live-card", parentCwd: repo, workflowCwd: other, background: false }).error ?? "", /same Git repository/i);
101
+ assert.match(resolveWorkflowChatProgress({ requested: "terminal", parentCwd: repo, workflowCwd: repo, background: false }).projection?.mode ?? "", /terminal/);
99
102
  } finally {
100
103
  try { git(repo, ["worktree", "remove", "--force", worktree]); } catch {}
101
104
  fs.rmSync(repo, { recursive: true, force: true });
@@ -112,7 +115,7 @@ describe("workflow chat progress rendering", () => {
112
115
  const updates: Array<{ details?: Details }> = [];
113
116
  const result = await createExecutor().execute(
114
117
  "wf-live",
115
- { workflowScript: `return await runs.run("explorer", { agent: "missing-agent", task: "scan", phase: "Validation", label: "Find renderer seam" });`, async: false },
118
+ { workflowScript: `return await runs.run("scout", { agent: "missing-agent", task: "scan", phase: "Validation", label: "Find renderer seam" });`, async: false },
116
119
  new AbortController().signal,
117
120
  (update) => updates.push(update),
118
121
  ctx(repo),
@@ -120,14 +123,85 @@ describe("workflow chat progress rendering", () => {
120
123
  assert.equal(result.isError, true);
121
124
  const liveUpdate = updates.find((update) => update.details?.chatProgress?.mode === "live-card");
122
125
  assert.ok(liveUpdate, "expected a live-card update");
123
- assert.equal(liveUpdate.details?.workflow?.trace[0]?.key, "explorer");
126
+ assert.equal(liveUpdate.details?.workflow?.trace[0]?.key, "scout");
124
127
  assert.equal(liveUpdate.details?.workflow?.trace[0]?.phase, "Validation");
125
128
  assert.equal(liveUpdate.details?.workflow?.trace[0]?.label, "Find renderer seam");
129
+ const ledgerChild = result.details.mission?.workflowChildren[0];
130
+ assert.equal(ledgerChild?.key, "scout");
131
+ assert.equal(ledgerChild?.workflowRunId, "wf-live");
132
+ assert.equal(ledgerChild?.agent, "missing-agent");
133
+ assert.equal(ledgerChild?.phase, "Validation");
134
+ assert.equal(ledgerChild?.status, "failed");
135
+ assert.equal(ledgerChild?.heartbeat?.status, "failed");
126
136
  } finally {
127
137
  fs.rmSync(repo, { recursive: true, force: true });
128
138
  }
129
139
  });
130
140
 
141
+ it("keeps async workflow launch receipts running in the mission ledger", () => {
142
+ assert.equal(missionWorkflowChildStatus({
143
+ content: [{ type: "text", text: "Async: worker [run-1]" }],
144
+ details: { mode: "single", runId: "run-1", asyncId: "run-1", asyncDir: "/tmp/run-1", results: [] },
145
+ } as any), "running");
146
+ });
147
+
148
+ it("writes mission binding before async workflow child launch", () => {
149
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-workflow-child-binding-"));
150
+ const asyncId = `workflow-child-${process.pid}-${Date.now()}`;
151
+ const asyncDir = path.join(DIRS.async, asyncId);
152
+ try {
153
+ const location = {
154
+ projectRoot: root,
155
+ missionDir: path.join(root, ".pi-subagents", "missions"),
156
+ globalIndexDir: path.join(root, ".pi-subagents", "mission-index"),
157
+ writeGlobalIndex: false,
158
+ };
159
+ const mission = createMission(location, { title: "Workflow", objective: "Track child" });
160
+ const params = bindMissionWorkflowChildAsyncLaunch(
161
+ { agent: "worker", task: "run", async: true },
162
+ { missionId: mission.id, location, autoCreated: false },
163
+ false,
164
+ asyncId,
165
+ );
166
+
167
+ assert.equal(params.workflowChildAsyncId, asyncId);
168
+ assert.equal(readMissionBinding(asyncDir)?.missionId, mission.id);
169
+ } finally {
170
+ fs.rmSync(asyncDir, { recursive: true, force: true });
171
+ fs.rmSync(root, { recursive: true, force: true });
172
+ }
173
+ });
174
+
175
+ it("marks workflow launch preparation failures as failed mission children", async () => {
176
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-workflow-prep-failure-"));
177
+ try {
178
+ const location = {
179
+ projectRoot: root,
180
+ missionDir: path.join(root, ".pi-subagents", "missions"),
181
+ globalIndexDir: path.join(root, ".pi-subagents", "mission-index"),
182
+ writeGlobalIndex: false,
183
+ };
184
+ const mission = createMission(location, { title: "Workflow", objective: "Track child" });
185
+
186
+ await assert.rejects(
187
+ () => runMissionWorkflowChild({ missionId: mission.id, location, autoCreated: false }, "wf-prep-failure", "resume", "Prep", async () => {
188
+ throw new Error("gate is not supported with retained resume");
189
+ }),
190
+ /gate is not supported with retained resume/,
191
+ );
192
+ const ledgerChild = readMission(location, mission.id).workflowChildren[0];
193
+
194
+ assert.equal(ledgerChild?.key, "resume");
195
+ assert.equal(ledgerChild?.status, "failed");
196
+ assert.equal(ledgerChild?.heartbeat?.status, "failed");
197
+ assert.equal(ledgerChild?.heartbeat?.phase, "Prep");
198
+ assert.match(ledgerChild?.heartbeat?.message ?? "", /gate is not supported with retained resume/);
199
+ assert.ok(ledgerChild?.completedAt);
200
+ } finally {
201
+ fs.rmSync(root, { recursive: true, force: true });
202
+ }
203
+ });
204
+
131
205
  it("renders stable rows keyed by workflow trace entries", () => {
132
206
  const text = componentText(renderSubagentResult({
133
207
  content: [{ type: "text", text: "Workflow running." }],
@@ -138,7 +212,7 @@ describe("workflow chat progress rendering", () => {
138
212
  chatProgress: { mode: "live-card", repoRelation: "same", repoLabel: "pi-subagents" },
139
213
  workflow: {
140
214
  trace: [
141
- { operation: "run", key: "explorer", state: "completed", runId: "run-explorer", phase: "Validation", label: "Found renderer seam", durationMs: 12 },
215
+ { operation: "run", key: "scout", state: "completed", runId: "run-scout", phase: "Validation", label: "Found renderer seam", durationMs: 12 },
142
216
  { operation: "run", key: "tests", state: "started", phase: "Validation", label: "focused integration suite" },
143
217
  { operation: "run", key: "review", state: "failed", phase: "Validation", label: "fresh-context UX review", error: "needs fixes" },
144
218
  ],
@@ -151,15 +225,68 @@ describe("workflow chat progress rendering", () => {
151
225
  assert.match(text, /workflow wf_8f3a12345 .* same repo .* failed/);
152
226
  assert.match(text, /Repo pi-subagents/);
153
227
  assert.match(text, /Phase Validation/);
154
- assert.match(text, /complete\s+explorer Found renderer seam/);
228
+ assert.match(text, /complete\s+scout Found renderer seam/);
155
229
  assert.match(text, /running\s+tests focused integration suite/);
156
230
  assert.match(text, /failed\s+review fresh-context UX review .* needs fixes/);
157
231
  });
158
232
 
233
+ it("bounds workflow live-card rows and keeps old failed children visible", () => {
234
+ const trace = Array.from({ length: 10 }, (_, index) => ({
235
+ operation: "run" as const,
236
+ key: `step-${index}`,
237
+ state: index === 0 ? "failed" as const : "started" as const,
238
+ label: `review ${index}`,
239
+ ...(index === 0 ? { error: "Failed\n\nOutput:\nI will read the required plan first.\nI will inspect the exact head.\nI will read agent default application path." } : {}),
240
+ }));
241
+ const text = componentText(renderSubagentResult({
242
+ content: [{ type: "text", text: "Workflow running." }],
243
+ details: {
244
+ mode: "workflow",
245
+ runId: "wf_noisy",
246
+ results: [],
247
+ chatProgress: { mode: "live-card", repoRelation: "same", repoLabel: "pi-subagents" },
248
+ workflow: { trace, emits: [], console: [] },
249
+ },
250
+ }, { expanded: false }, theme as any));
251
+
252
+ assert.match(text, /2 older workflow rows hidden/);
253
+ assert.match(text, /failed\s+step-0 review 0 .* Failed · latest: read agent default application path/);
254
+ assert.match(text, /running\s+step-9 review 9/);
255
+ assert.doesNotMatch(text, /step-1/);
256
+ assert.doesNotMatch(text, /Output:/);
257
+ });
258
+
259
+ it("keeps mixed workflow child error output visible", () => {
260
+ const text = componentText(renderSubagentResult({
261
+ content: [{ type: "text", text: "Workflow running." }],
262
+ details: {
263
+ mode: "workflow",
264
+ runId: "wf_mixed_error",
265
+ results: [],
266
+ chatProgress: { mode: "live-card", repoRelation: "same", repoLabel: "pi-subagents" },
267
+ workflow: {
268
+ trace: [{
269
+ operation: "run",
270
+ key: "gate-monitor",
271
+ state: "failed",
272
+ label: "bot gate",
273
+ error: "Failed\n\nOutput:\nerror: failed to fetch review threads\nI will inspect the retry path.",
274
+ }],
275
+ emits: [],
276
+ console: [],
277
+ },
278
+ },
279
+ }, { expanded: false }, theme as any));
280
+
281
+ assert.match(text, /Failed · error: failed to fetch review threads I will inspect the retry path/);
282
+ assert.doesNotMatch(text, /latest: inspect the retry path/);
283
+ assert.doesNotMatch(text, /Output:/);
284
+ });
285
+
159
286
  it("suppresses only successful routine child result intercom for live-card workflows", () => {
160
- const completed = { agent: "explorer", exitCode: 0, outputState: "present" } as SingleResult;
161
- const failed = { agent: "explorer", exitCode: 1, outputState: "present" } as SingleResult;
162
- const rejected = { agent: "explorer", exitCode: 0, acceptance: { status: "rejected" }, outputState: "present" } as SingleResult;
287
+ const completed = { agent: "delegate", exitCode: 0, outputState: "present" } as SingleResult;
288
+ const failed = { agent: "delegate", exitCode: 1, outputState: "present" } as SingleResult;
289
+ const rejected = { agent: "delegate", exitCode: 0, acceptance: { status: "rejected" }, outputState: "present" } as SingleResult;
163
290
 
164
291
  assert.equal(shouldSuppressRoutineResultIntercom({ suppressRoutineResultIntercom: true, results: [completed] }), true);
165
292
  assert.equal(shouldSuppressRoutineResultIntercom({ suppressRoutineResultIntercom: true, results: [failed] }), false);
@@ -168,7 +295,7 @@ describe("workflow chat progress rendering", () => {
168
295
  });
169
296
 
170
297
  it("marks acceptance-rejected foreground intercom results as failed", () => {
171
- const rejected = { agent: "explorer", exitCode: 0, acceptance: { status: "rejected" }, outputState: "present" } as SingleResult;
298
+ const rejected = { agent: "delegate", exitCode: 0, acceptance: { status: "rejected" }, outputState: "present" } as SingleResult;
172
299
 
173
300
  assert.equal(foregroundResultIntercomStatus(rejected), "failed");
174
301
  });
@@ -183,7 +310,7 @@ describe("workflow chat progress rendering", () => {
183
310
  chatProgress: { mode: "live-card", repoRelation: "same", repoLabel: "pi-subagents" },
184
311
  workflow: {
185
312
  value: "final answer",
186
- trace: [{ operation: "run", key: "explorer", state: "completed", runId: "run-explorer" }],
313
+ trace: [{ operation: "run", key: "scout", state: "completed", runId: "run-scout" }],
187
314
  emits: [],
188
315
  console: [],
189
316
  },
@@ -7,7 +7,7 @@ describe("workflow graph snapshots", () => {
7
7
  const graph = buildWorkflowGraphSnapshot({
8
8
  runId: "run-1",
9
9
  steps: [
10
- { agent: "explorer", task: "Scan", phase: "Research", label: "Find context", as: "context" },
10
+ { agent: "scout", task: "Scan", phase: "Research", label: "Find context", as: "context" },
11
11
  { agent: "writer", task: "Use {outputs.context}", phase: "Synthesis", outputSchema: { type: "object" } },
12
12
  ],
13
13
  results: [{ exitCode: 0 }, { exitCode: 1, error: "bad output" }],
@@ -25,9 +25,9 @@ describe("workflow graph snapshots", () => {
25
25
  ]);
26
26
  });
27
27
 
28
- it("maps a long alternating builder and commentator chain without losing indexes", () => {
28
+ it("maps a long alternating worker and reviewer chain without losing indexes", () => {
29
29
  const steps = Array.from({ length: 40 }, (_, index) => ({
30
- agent: index % 2 === 0 ? "builder" : "commentator",
30
+ agent: index % 2 === 0 ? "worker" : "reviewer",
31
31
  task: index === 0 ? "Start" : "{previous}",
32
32
  }));
33
33
  const results = steps.map(() => ({ exitCode: 0 }));
@@ -43,10 +43,10 @@ describe("workflow graph snapshots", () => {
43
43
  assert.equal(graph.nodes[0]?.id, "step-0");
44
44
  assert.equal(graph.nodes[0]?.flatIndex, 0);
45
45
  assert.equal(graph.nodes[37]?.id, "step-37");
46
- assert.equal(graph.nodes[37]?.agent, "commentator");
46
+ assert.equal(graph.nodes[37]?.agent, "reviewer");
47
47
  assert.equal(graph.nodes[37]?.flatIndex, 37);
48
48
  assert.equal(graph.nodes[39]?.id, "step-39");
49
- assert.equal(graph.nodes[39]?.agent, "commentator");
49
+ assert.equal(graph.nodes[39]?.agent, "reviewer");
50
50
  assert.equal(graph.nodes[39]?.flatIndex, 39);
51
51
  assert.equal(graph.currentNodeId, "step-37");
52
52
  });
@@ -58,7 +58,7 @@ describe("workflow graph snapshots", () => {
58
58
  { agent: "setup", task: "Setup" },
59
59
  {
60
60
  parallel: [
61
- { agent: "commentator", label: "Correctness", phase: "Review", as: "correctness" },
61
+ { agent: "reviewer", label: "Correctness", phase: "Review", as: "correctness" },
62
62
  { agent: "security", label: "Security", phase: "Review", as: "security" },
63
63
  ],
64
64
  },
@@ -107,7 +107,7 @@ describe("workflow graph snapshots", () => {
107
107
  it("uses dynamic group status overrides for empty or aggregate-failure fanout states", () => {
108
108
  const steps = [{
109
109
  expand: { from: { output: "targets", path: "/items" }, maxItems: 4 },
110
- parallel: { agent: "commentator", task: "Review {item}" },
110
+ parallel: { agent: "reviewer", task: "Review {item}" },
111
111
  collect: { as: "reviews" },
112
112
  }];
113
113
 
@@ -123,7 +123,7 @@ describe("workflow graph snapshots", () => {
123
123
  const collectFailure = buildWorkflowGraphSnapshot({
124
124
  runId: "run-dynamic-collect-fail",
125
125
  steps,
126
- dynamicChildren: { 0: [{ agent: "commentator", flatIndex: 0, itemKey: "a" }] },
126
+ dynamicChildren: { 0: [{ agent: "reviewer", flatIndex: 0, itemKey: "a" }] },
127
127
  results: [{ exitCode: 0 }],
128
128
  dynamicGroupStatuses: { 0: { status: "failed", error: "Collected output validation failed" } },
129
129
  });
@@ -0,0 +1,113 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { prepareWorkflowLaunchParams } from "../../src/runs/foreground/subagent-executor.ts";
4
+
5
+ describe("workflow launch params", () => {
6
+ it("keeps omitted workflow child async foreground", () => {
7
+ assert.deepEqual(
8
+ prepareWorkflowLaunchParams(
9
+ {},
10
+ { agent: "worker", task: "Run" },
11
+ "workflow-run",
12
+ "run",
13
+ ),
14
+ {
15
+ agent: "worker",
16
+ task: "Run",
17
+ async: false,
18
+ workflowParentRunId: "workflow-run",
19
+ workflowKey: "run",
20
+ },
21
+ );
22
+ });
23
+
24
+ it("preserves explicit async workflow children", () => {
25
+ assert.deepEqual(
26
+ prepareWorkflowLaunchParams(
27
+ {},
28
+ { agent: "worker", task: "Run", async: true },
29
+ "workflow-run",
30
+ "run",
31
+ ),
32
+ {
33
+ agent: "worker",
34
+ task: "Run",
35
+ async: true,
36
+ workflowParentRunId: "workflow-run",
37
+ workflowKey: "run",
38
+ },
39
+ );
40
+ });
41
+
42
+ it("places workflow child gates inside managed worktree tasks", () => {
43
+ assert.deepEqual(
44
+ prepareWorkflowLaunchParams(
45
+ {},
46
+ { agent: "worker", task: "Implement", worktree: true, gate: "npm test" },
47
+ "workflow-run",
48
+ "gated",
49
+ ),
50
+ {
51
+ worktree: true,
52
+ async: false,
53
+ workflowParentRunId: "workflow-run",
54
+ workflowKey: "gated",
55
+ tasks: [{
56
+ agent: "worker",
57
+ task: "Implement",
58
+ acceptance: { level: "verified", verify: [{ id: "gate", command: "npm test" }] },
59
+ }],
60
+ },
61
+ );
62
+ });
63
+
64
+ it("rejects gate defaults on retained resume items", () => {
65
+ assert.throws(
66
+ () => prepareWorkflowLaunchParams(
67
+ { gate: "npm test" },
68
+ { resume: "retained-run", task: "Continue" },
69
+ "workflow-run",
70
+ "continue",
71
+ ),
72
+ /gate is not supported with retained resume/,
73
+ );
74
+ assert.throws(
75
+ () => prepareWorkflowLaunchParams(
76
+ {},
77
+ { resume: "retained-run", task: "Continue", gate: "npm test" },
78
+ "workflow-run",
79
+ "continue",
80
+ ),
81
+ /gate is not supported with retained resume/,
82
+ );
83
+ });
84
+
85
+ it("preserves execution limits when routing retained resume items", () => {
86
+ assert.deepEqual(
87
+ prepareWorkflowLaunchParams(
88
+ { turnBudget: { maxTurns: 8 }, toolBudget: { hard: 12, block: ["read"] } },
89
+ {
90
+ resume: " retained-run ",
91
+ task: "Continue carefully",
92
+ maxRuntimeMs: 5_000,
93
+ turnBudget: { maxTurns: 3, graceTurns: 1 },
94
+ toolBudget: { soft: 2, hard: 4, block: "*" },
95
+ },
96
+ "workflow-run",
97
+ "continue",
98
+ { missionDetached: true },
99
+ ),
100
+ {
101
+ action: "resume",
102
+ id: "retained-run",
103
+ message: "Continue carefully",
104
+ workflowParentRunId: "workflow-run",
105
+ workflowKey: "continue",
106
+ mission: false,
107
+ timeoutMs: 5_000,
108
+ turnBudget: { maxTurns: 3, graceTurns: 1 },
109
+ toolBudget: { soft: 2, hard: 4, block: "*" },
110
+ },
111
+ );
112
+ });
113
+ });
@@ -125,6 +125,67 @@ describe("worktree", () => {
125
125
  }
126
126
  });
127
127
 
128
+ it("rejects worktree base directories inside Selesai extensions", () => {
129
+ const repoDir = createRepo("selesai-worktree-extension-dir-");
130
+ const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "selesai-worktree-home-"));
131
+ const previousAgentDir = process.env.SELESAI_CODING_AGENT_DIR;
132
+ const previousHome = process.env.HOME;
133
+ const previousUserProfile = process.env.USERPROFILE;
134
+ const extensionsDir = path.join(tempHome, ".selesai", "agent", "extensions");
135
+ try {
136
+ process.env.HOME = tempHome;
137
+ process.env.USERPROFILE = tempHome;
138
+ delete process.env.SELESAI_CODING_AGENT_DIR;
139
+ assert.throws(
140
+ () => createWorktrees(repoDir, "extension-dir", 1, { baseDir: extensionsDir }),
141
+ /worktree base directory cannot be inside Pi extensions directory/i,
142
+ );
143
+ assert.throws(
144
+ () => createWorktrees(repoDir, "extension-subdir", 1, { baseDir: path.join(extensionsDir, "checkout") }),
145
+ /worktree base directory cannot be inside Pi extensions directory/i,
146
+ );
147
+ } finally {
148
+ if (previousAgentDir === undefined) delete process.env.SELESAI_CODING_AGENT_DIR;
149
+ else process.env.SELESAI_CODING_AGENT_DIR = previousAgentDir;
150
+ if (previousHome === undefined) delete process.env.HOME;
151
+ else process.env.HOME = previousHome;
152
+ if (previousUserProfile === undefined) delete process.env.USERPROFILE;
153
+ else process.env.USERPROFILE = previousUserProfile;
154
+ cleanupRepo(repoDir);
155
+ fs.rmSync(tempHome, { recursive: true, force: true });
156
+ }
157
+ });
158
+
159
+ it("rejects symlinked worktree base directories inside Selesai extensions", () => {
160
+ const repoDir = createRepo("selesai-worktree-extension-symlink-");
161
+ const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "selesai-worktree-home-"));
162
+ const previousAgentDir = process.env.SELESAI_CODING_AGENT_DIR;
163
+ const previousHome = process.env.HOME;
164
+ const previousUserProfile = process.env.USERPROFILE;
165
+ const extensionsDir = path.join(tempHome, ".selesai", "agent", "extensions");
166
+ const aliasDir = path.join(tempHome, "extension-alias");
167
+ try {
168
+ process.env.HOME = tempHome;
169
+ process.env.USERPROFILE = tempHome;
170
+ delete process.env.SELESAI_CODING_AGENT_DIR;
171
+ fs.mkdirSync(extensionsDir, { recursive: true });
172
+ fs.symlinkSync(extensionsDir, aliasDir, process.platform === "win32" ? "junction" : "dir");
173
+ assert.throws(
174
+ () => createWorktrees(repoDir, "extension-symlink", 1, { baseDir: path.join(aliasDir, "checkout") }),
175
+ /worktree base directory cannot be inside Pi extensions directory/i,
176
+ );
177
+ } finally {
178
+ if (previousAgentDir === undefined) delete process.env.SELESAI_CODING_AGENT_DIR;
179
+ else process.env.SELESAI_CODING_AGENT_DIR = previousAgentDir;
180
+ if (previousHome === undefined) delete process.env.HOME;
181
+ else process.env.HOME = previousHome;
182
+ if (previousUserProfile === undefined) delete process.env.USERPROFILE;
183
+ else process.env.USERPROFILE = previousUserProfile;
184
+ cleanupRepo(repoDir);
185
+ fs.rmSync(tempHome, { recursive: true, force: true });
186
+ }
187
+ });
188
+
128
189
  it("uses SELESAI_SUBAGENTS_WORKTREE_DIR when no base directory is configured", () => {
129
190
  const repoDir = createRepo("pi-worktree-env-base-dir-");
130
191
  const previous = process.env.SELESAI_SUBAGENTS_WORKTREE_DIR;
@@ -178,8 +239,8 @@ describe("worktree", () => {
178
239
  assert.equal(
179
240
  findWorktreeTaskCwdConflict(
180
241
  [
181
- { agent: "builder-a" },
182
- { agent: "builder-b", cwd: sharedCwd },
242
+ { agent: "worker-a" },
243
+ { agent: "worker-b", cwd: sharedCwd },
183
244
  ],
184
245
  sharedCwd,
185
246
  ),
@@ -191,7 +252,7 @@ describe("worktree", () => {
191
252
  const sharedCwd = path.join("/tmp", "repo");
192
253
  assert.equal(
193
254
  findWorktreeTaskCwdConflict(
194
- [{ agent: "builder-a", cwd: "." }],
255
+ [{ agent: "worker-a", cwd: "." }],
195
256
  sharedCwd,
196
257
  ),
197
258
  undefined,
@@ -202,14 +263,14 @@ describe("worktree", () => {
202
263
  const sharedCwd = path.join("/tmp", "repo");
203
264
  const conflict = findWorktreeTaskCwdConflict(
204
265
  [
205
- { agent: "builder-a", cwd: sharedCwd },
206
- { agent: "builder-b", cwd: path.join(sharedCwd, "packages", "app") },
266
+ { agent: "worker-a", cwd: sharedCwd },
267
+ { agent: "worker-b", cwd: path.join(sharedCwd, "packages", "app") },
207
268
  ],
208
269
  sharedCwd,
209
270
  );
210
271
  assert.deepEqual(conflict, {
211
272
  index: 1,
212
- agent: "builder-b",
273
+ agent: "worker-b",
213
274
  cwd: path.join(sharedCwd, "packages", "app"),
214
275
  });
215
276
  });
@@ -338,7 +399,7 @@ describe("worktree", () => {
338
399
  setup = createWorktrees(repoDir, "captured", 1);
339
400
  const worktreePath = setup.worktrees[0]!.path;
340
401
  fs.writeFileSync(path.join(worktreePath, "tracked.txt"), "captured\n", "utf-8");
341
- const diffs = diffWorktrees(setup, ["builder"], path.join(repoDir, "artifacts", "captured"));
402
+ const diffs = diffWorktrees(setup, ["worker"], path.join(repoDir, "artifacts", "captured"));
342
403
  assert.equal(diffs[0]?.error, undefined);
343
404
  assert.ok(fs.statSync(diffs[0]!.patchPath).size > 0);
344
405
 
@@ -7,11 +7,11 @@ const readProjectFile = (file: string): string => readFileSync(join(process.cwd(
7
7
 
8
8
  describe("writer budget guidance", () => {
9
9
  it("keeps hard turn and tool caps off mutation-capable workers", () => {
10
- const readme = readProjectFile("README.md");
10
+ const toolReference = readProjectFile("docs/tool-reference.md");
11
11
  const skill = readProjectFile("skills/pi-subagents/SKILL.md");
12
12
  const reviewLoop = readProjectFile("prompts/review-loop.md");
13
13
 
14
- for (const text of [readme, skill, reviewLoop]) {
14
+ for (const text of [toolReference, skill, reviewLoop]) {
15
15
  assert.match(text, /As a conservative orchestration policy, do not (?:pass|set) `turnBudget`(?:, a hard `toolBudget`, or a tight `usageBudget`| or a hard `toolBudget`)/);
16
16
  assert.match(text, /default tool budget blocks read\/search tools rather than mutation tools/i);
17
17
  assert.match(text, /checkpoint after the current tool returns/);
@@ -19,12 +19,12 @@ describe("writer budget guidance", () => {
19
19
  assert.match(text, /build\/test state/);
20
20
  assert.match(text, /commit or PR state/);
21
21
  }
22
- assert.match(readme, /elapsed timeout is not a mutation-safe boundary/i);
22
+ assert.match(toolReference, /elapsed timeout is not a mutation-safe boundary/i);
23
23
  });
24
24
 
25
25
  it("documents deferred hard-limit termination at tool-using boundaries", () => {
26
- const readme = readProjectFile("README.md");
27
- assert.match(readme, /termination occurs at the next assistant boundary/);
28
- assert.match(readme, /`termination-deferred`/);
26
+ const toolReference = readProjectFile("docs/tool-reference.md");
27
+ assert.match(toolReference, /termination occurs at the next assistant boundary/);
28
+ assert.match(toolReference, /`termination-deferred`/);
29
29
  });
30
30
  });
@@ -1,24 +1,26 @@
1
- // ponytail: single pi extension that mounts every workflow mode. One load
2
- // resolves a single writer tool + N start/end tool pairs. Avoids the per-mode
3
- // load conflict (multiple extension modules would each try to register the
4
- // shared writer).
1
+ // ponytail: thin shell. Registers the four /workflow-* commands and launches
2
+ // each mode's scripted workflow through pi-subagents' launchSlashSubagent.
5
3
 
6
4
  import type { ExtensionAPI } from "@selesai/code";
7
- import { __resetWorkflowRegistryForTests, createWorkflowExtension } from "./adapter.ts";
8
- import { prototypeMode } from "./modes/prototype.ts";
9
- import { quicktypeMode } from "./modes/quicktype.ts";
10
- import { taskMode } from "./modes/task.ts";
11
- import { loopMode } from "./modes/loop.ts";
12
-
13
- export { __resetWorkflowRegistryForTests };
14
-
15
- const MODES = [prototypeMode, quicktypeMode, taskMode, loopMode] as const;
5
+ import { launchSlashSubagent } from "../pi-subagents/src/slash/slash-commands.ts";
6
+ import { buildLoopScript, buildPrototypeScript, buildQuicktypeScript, buildTaskScript } from "./modes.ts";
16
7
 
17
8
  export default function workflowModesExtension(pi: ExtensionAPI): void {
18
- for (const mode of MODES) {
19
- createWorkflowExtension(mode.config, {
20
- commandName: mode.commandName,
21
- commandDescription: mode.commandDescription,
22
- })(pi);
23
- }
9
+ const register = (name: string, description: string, build: (goal: string) => string) =>
10
+ pi.registerCommand(name, {
11
+ description,
12
+ handler: async (args, ctx) => {
13
+ const goal = args.trim();
14
+ if (!goal) {
15
+ ctx.ui.notify(`${description}\nUsage: /${name} <goal>`, "info");
16
+ return;
17
+ }
18
+ launchSlashSubagent(pi, ctx, { workflowScript: build(goal), async: true, agentScope: "both" });
19
+ },
20
+ });
21
+
22
+ register("workflow-task", "Run the task workflow (plan → reuse → handoff → auto build↔review loop) as a scripted workflow.", buildTaskScript);
23
+ register("workflow-prototype", "Run the full prototype workflow (research → plan → reuse → handoff → auto loop → audit) as a scripted workflow.", buildPrototypeScript);
24
+ register("workflow-quicktype", "Run the quicker prototype workflow without research (plan → reuse → handoff → auto loop → audit) as a scripted workflow.", buildQuicktypeScript);
25
+ register("workflow-loop", "Run a direct auto build↔review loop for an already-agreed plan as a scripted workflow.", buildLoopScript);
24
26
  }
@@ -0,0 +1,65 @@
1
+ // ponytail: four workflow modes as pi-subagents workflowScript builders.
2
+ // One-shot-and-sleep: phases run as runs.run steps and the loop auto-repeats
3
+ // until the reviewer reports clean. A workflowScript has no checkpoints, so
4
+ // there are no human gates.
5
+
6
+ function js(value: string): string {
7
+ return JSON.stringify(value);
8
+ }
9
+
10
+ const AUTO_LOOP = String.raw`
11
+ const autoLoop = async (goal, context) => {
12
+ let round = 1;
13
+ while (true) {
14
+ const build = await runs.run('build-' + round, {
15
+ agent: 'builder',
16
+ task: 'Implement the approved work in the workspace and run relevant checks.\n\nSource of truth (handoff/plan):\n' + context + '\n\nGoal:\n' + goal + (round > 1 ? '\n\nAddress the previous review feedback first.' : ''),
17
+ });
18
+ const review = await runs.run('review-' + round, {
19
+ agent: 'commentator',
20
+ task: 'Independently review the uncommitted diff and report concrete evidence (what you inspected and what you ran). Do not modify the workspace.\n\nAcceptance criteria (source of truth):\n' + context + '\n\nBuilder completion summary:\n' + build.output + '\n\nEnd with exactly one line: WORKFLOW_REVIEW_STATUS: clean OR WORKFLOW_REVIEW_STATUS: blocking.',
21
+ });
22
+ if (/WORKFLOW_REVIEW_STATUS\s*:\s*clean/i.test(review.output)) {
23
+ return { result: 'clean', rounds: round };
24
+ }
25
+ round += 1;
26
+ }
27
+ };`;
28
+
29
+ export function buildLoopScript(goal: string): string {
30
+ return String.raw`const goal = ${js(goal)};
31
+ ${AUTO_LOOP}
32
+ return await autoLoop(goal, goal);`;
33
+ }
34
+
35
+ export function buildTaskScript(goal: string): string {
36
+ return String.raw`const goal = ${js(goal)};
37
+ const plan = await runs.run('plan', { agent: 'architect', task: 'Produce a concrete implementation plan for: ' + goal + '. Cover what to build, how, in what order, which files and components, and the finished result. Return inline.' });
38
+ const reuse = await runs.run('reuse', { agent: 'explorer', task: 'Explore the codebase for reusable patterns relevant to: ' + plan.output + '. Point at relevant areas and dependencies; skip cleanly if wholly new. Return inline.' });
39
+ const handoff = await runs.run('handoff', { agent: 'recapper', task: 'Compile a self-contained handoff from the plan and reuse findings so fresh agents understand the goal, constraints, and acceptance criteria without re-planning.\n\nPlan:\n' + plan.output + '\n\nReuse findings:\n' + reuse.output + '\n\nReturn inline.' });
40
+ ${AUTO_LOOP}
41
+ return await autoLoop(goal, handoff.output);`;
42
+ }
43
+
44
+ export function buildPrototypeScript(goal: string): string {
45
+ return String.raw`const goal = ${js(goal)};
46
+ const research = await runs.run('research', { agent: 'researcher', task: 'Research the external, fast-changing knowledge this task depends on (libraries, SDKs, APIs, unfamiliar alternatives). Task: ' + goal + '. Synthesize actionable findings with sources. Return inline.' });
47
+ const plan = await runs.run('plan', { agent: 'architect', task: 'Produce a concrete build plan from the research findings.\n\nResearch:\n' + research.output + '\n\nRequest:\n' + goal + '\n\nReturn inline.' });
48
+ const reuse = await runs.run('reuse', { agent: 'explorer', task: 'Explore the codebase for reusable patterns relevant to: ' + plan.output + '. Return inline.' });
49
+ const handoff = await runs.run('handoff', { agent: 'recapper', task: 'Compile a self-contained handoff from the plan and reuse findings.\n\nPlan:\n' + plan.output + '\n\nReuse:\n' + reuse.output + '\n\nReturn inline.' });
50
+ ${AUTO_LOOP}
51
+ const loop = await autoLoop(goal, handoff.output);
52
+ const audit = await runs.run('audit', { agent: 'commentator', task: 'Final audit of the uncommitted changes for correctness, plan adherence, and over-engineering (cut bloat, dead flexibility, reinvented stdlib). Plan:\n' + plan.output + '\n\nReport concrete evidence. Do not modify the workspace.' });
53
+ return { ...loop, audited: true };`;
54
+ }
55
+
56
+ export function buildQuicktypeScript(goal: string): string {
57
+ return String.raw`const goal = ${js(goal)};
58
+ const plan = await runs.run('plan', { agent: 'architect', task: 'Produce a concrete build plan for: ' + goal + '. Cover what to build, how, in what order, which components, and the finished result. Return inline.' });
59
+ const reuse = await runs.run('reuse', { agent: 'explorer', task: 'Explore the codebase for reusable patterns relevant to: ' + plan.output + '. Return inline.' });
60
+ const handoff = await runs.run('handoff', { agent: 'recapper', task: 'Compile a self-contained handoff from the plan and reuse findings.\n\nPlan:\n' + plan.output + '\n\nReuse:\n' + reuse.output + '\n\nReturn inline.' });
61
+ ${AUTO_LOOP}
62
+ const loop = await autoLoop(goal, handoff.output);
63
+ const audit = await runs.run('audit', { agent: 'commentator', task: 'Final audit of the uncommitted changes for correctness, plan adherence, and over-engineering (cut bloat, dead flexibility, reinvented stdlib). Plan:\n' + plan.output + '\n\nReport concrete evidence. Do not modify the workspace.' });
64
+ return { ...loop, audited: true };`;
65
+ }
@@ -398,6 +398,7 @@ export declare class InteractiveMode {
398
398
  private notifyAuthDialog;
399
399
  private loginProvider;
400
400
  private showLoginDialog;
401
+ private handleSettingsFactoryReset;
401
402
  private handleReloadCommand;
402
403
  private handleExportCommand;
403
404
  private getPathCommandArgument;