@selesai/code 0.9.11 → 0.9.13

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 (580) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/config.d.ts +4 -6
  3. package/dist/config.js +10 -14
  4. package/dist/core/agent-session.d.ts +0 -1
  5. package/dist/core/agent-session.js +3 -49
  6. package/dist/core/extensions/types.d.ts +0 -2
  7. package/dist/core/settings-manager.d.ts +0 -2
  8. package/dist/core/settings-manager.js +0 -3
  9. package/dist/core/tools/index.d.ts +0 -1
  10. package/dist/core/tools/index.js +0 -1
  11. package/dist/defaults/settings.json +2 -3
  12. package/dist/extensions/model-prompt-injector/index.test.ts +0 -10
  13. package/dist/extensions/model-prompt-injector/index.ts +0 -3
  14. package/dist/extensions/pi-intercom/CHANGELOG.md +53 -16
  15. package/dist/extensions/pi-intercom/README.md +41 -8
  16. package/dist/extensions/pi-intercom/banner.png +0 -0
  17. package/dist/extensions/pi-intercom/broker/broker.ts +498 -215
  18. package/dist/extensions/pi-intercom/broker/client.ts +39 -12
  19. package/dist/extensions/pi-intercom/broker/extension.test.ts +102 -3
  20. package/dist/extensions/pi-intercom/broker/paths.test.ts +2 -2
  21. package/dist/extensions/pi-intercom/broker/protocol.ts +26 -0
  22. package/dist/extensions/pi-intercom/broker/spawn.test.ts +5 -20
  23. package/dist/extensions/pi-intercom/config.test.ts +41 -0
  24. package/dist/extensions/pi-intercom/config.ts +21 -0
  25. package/dist/extensions/pi-intercom/extension-api.ts +40 -0
  26. package/dist/extensions/pi-intercom/index.ts +362 -26
  27. package/dist/extensions/pi-intercom/intercom.integration.test.ts +819 -13
  28. package/dist/extensions/pi-intercom/package.json +1 -1
  29. package/dist/extensions/pi-intercom/project-agent.ts +2 -2
  30. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +8 -110
  31. package/dist/extensions/pi-intercom/types.ts +32 -5
  32. package/dist/extensions/pi-intercom/ui/inline-message.ts +6 -0
  33. package/dist/extensions/pi-subagents/.github/assets/subagent-fleet-inspector.png +0 -0
  34. package/dist/extensions/pi-subagents/.github/workflows/release.yml +28 -0
  35. package/dist/extensions/pi-subagents/.github/workflows/test.yml +51 -0
  36. package/dist/extensions/pi-subagents/.greptile/config.json +33 -0
  37. package/dist/extensions/pi-subagents/.greptile/files.json +8 -0
  38. package/dist/extensions/pi-subagents/.greptile/rules.md +16 -0
  39. package/dist/extensions/pi-subagents/CHANGELOG.md +309 -87
  40. package/dist/extensions/pi-subagents/README.md +15 -17
  41. package/dist/extensions/pi-subagents/agents/oracle.md +3 -1
  42. package/dist/extensions/pi-subagents/agents/researcher.md +32 -13
  43. package/dist/extensions/pi-subagents/agents/reviewer.md +13 -2
  44. package/dist/extensions/pi-subagents/agents/scout.md +2 -2
  45. package/dist/extensions/pi-subagents/agents/worker.md +2 -1
  46. package/dist/extensions/pi-subagents/async-retention-discovery-worker.mjs +180 -0
  47. package/dist/extensions/pi-subagents/docs/configuration.md +106 -27
  48. package/dist/extensions/pi-subagents/docs/extension-api.md +85 -21
  49. package/dist/extensions/pi-subagents/docs/missions.md +41 -4
  50. package/dist/extensions/pi-subagents/docs/models.md +52 -9
  51. package/dist/extensions/pi-subagents/docs/observability.md +103 -16
  52. package/dist/extensions/pi-subagents/docs/tool-reference.md +60 -45
  53. package/dist/extensions/pi-subagents/docs/watchdog.md +60 -3
  54. package/dist/extensions/pi-subagents/docs/workflows.md +181 -7
  55. package/dist/extensions/pi-subagents/index.ts +10 -1
  56. package/dist/extensions/pi-subagents/install.mjs +4 -4
  57. package/dist/extensions/pi-subagents/package-lock.json +1483 -1470
  58. package/dist/extensions/pi-subagents/package.json +6 -3
  59. package/dist/extensions/pi-subagents/prompts/council.md +60 -0
  60. package/dist/extensions/pi-subagents/prompts/parallel-review.md +5 -1
  61. package/dist/extensions/pi-subagents/prompts/review-loop.md +9 -5
  62. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +254 -0
  63. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +18 -17
  64. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +31 -9
  65. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +107 -140
  66. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +9 -12
  67. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +39 -0
  68. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +44 -92
  69. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +261 -368
  70. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +6 -2
  71. package/dist/extensions/pi-subagents/src/agents/agents.ts +388 -85
  72. package/dist/extensions/pi-subagents/src/agents/builtin-names.ts +14 -0
  73. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +418 -0
  74. package/dist/extensions/pi-subagents/src/agents/skills.ts +1 -1
  75. package/dist/extensions/pi-subagents/src/api/agents.ts +7 -0
  76. package/dist/extensions/pi-subagents/src/api/external-job-provider.ts +195 -0
  77. package/dist/extensions/pi-subagents/src/api/preflight.ts +88 -27
  78. package/dist/extensions/pi-subagents/src/api/project-panes.ts +2 -0
  79. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  80. package/dist/extensions/pi-subagents/src/extension/config.ts +20 -11
  81. package/dist/extensions/pi-subagents/src/extension/doctor.ts +14 -6
  82. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +5 -4
  83. package/dist/extensions/pi-subagents/src/extension/index.ts +270 -187
  84. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +65 -28
  85. package/dist/extensions/pi-subagents/src/extension/rpc.ts +120 -11
  86. package/dist/extensions/pi-subagents/src/extension/schemas.ts +46 -64
  87. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +51 -37
  88. package/dist/extensions/pi-subagents/src/extension/tool-result.ts +19 -0
  89. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +2 -2
  90. package/dist/extensions/pi-subagents/src/inspectors/herdr/client.ts +3 -3
  91. package/dist/extensions/pi-subagents/src/inspectors/herdr/focus.ts +55 -0
  92. package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +2 -1
  93. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +230 -46
  94. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +26 -4
  95. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +32 -10
  96. package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +6 -1
  97. package/dist/extensions/pi-subagents/src/missions/store.ts +4 -9
  98. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +2 -2
  99. package/dist/extensions/pi-subagents/src/policy/authority.ts +2 -0
  100. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +3 -1
  101. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +31 -8
  102. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +210 -52
  103. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +63 -33
  104. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +71 -17
  105. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +886 -0
  106. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +14 -5
  107. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +49 -56
  108. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +1 -0
  109. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +3 -33
  110. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +5 -0
  111. package/dist/extensions/pi-subagents/src/runs/background/completion-dedupe.ts +5 -1
  112. package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +22 -12
  113. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +105 -71
  114. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +68 -19
  115. package/dist/extensions/pi-subagents/src/runs/background/index-segment.ts +59 -0
  116. package/dist/extensions/pi-subagents/src/runs/background/inspect-rpc.ts +443 -0
  117. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +94 -10
  118. package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +158 -90
  119. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +141 -53
  120. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +8 -5
  121. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +14 -4
  122. package/dist/extensions/pi-subagents/src/runs/background/run-id-query.ts +7 -0
  123. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +13 -14
  124. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +46 -25
  125. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +823 -0
  126. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +9 -3
  127. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +11 -1
  128. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +594 -216
  129. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -13
  130. package/dist/extensions/pi-subagents/src/runs/background/terminal-run-index.ts +138 -0
  131. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +23 -4
  132. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +82 -4
  133. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +5 -3
  134. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +21 -14
  135. package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +23 -2
  136. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +153 -58
  137. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +7 -9
  138. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1283 -1657
  139. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +274 -0
  140. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +6 -5
  141. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +59 -10
  142. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
  143. package/dist/extensions/pi-subagents/src/runs/shared/chain-outputs.ts +1 -3
  144. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +36 -0
  145. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +52 -2
  146. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  147. package/dist/extensions/pi-subagents/src/runs/shared/extension-bindings.ts +78 -0
  148. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +2 -0
  149. package/dist/extensions/pi-subagents/src/runs/shared/external-job-bridge.ts +460 -0
  150. package/dist/extensions/pi-subagents/src/runs/shared/external-job-runner.ts +389 -0
  151. package/dist/extensions/pi-subagents/src/runs/shared/fast-mode-extension.ts +10 -0
  152. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +14 -0
  153. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +243 -0
  154. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +201 -85
  155. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +106 -39
  156. package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +145 -0
  157. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +150 -27
  158. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +46 -4
  159. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +19 -15
  160. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +5 -1
  161. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +86 -2
  162. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +9 -9
  163. package/dist/extensions/pi-subagents/src/runs/shared/session-lease.ts +0 -6
  164. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +18 -4
  165. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +51 -7
  166. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +62 -21
  167. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +1 -3
  168. package/dist/extensions/pi-subagents/src/runs/shared/tool-timeout.ts +1 -3
  169. package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +1 -23
  170. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +14 -2
  171. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +2 -2
  172. package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +22 -2
  173. package/dist/extensions/pi-subagents/src/shared/capacity-resilient-json.ts +102 -0
  174. package/dist/extensions/pi-subagents/src/shared/completion-owner.ts +14 -0
  175. package/dist/extensions/pi-subagents/src/shared/file-system-retry.ts +49 -1
  176. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +59 -1
  177. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +12 -5
  178. package/dist/extensions/pi-subagents/src/shared/model-info.ts +20 -0
  179. package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +0 -40
  180. package/dist/extensions/pi-subagents/src/shared/settings.ts +11 -30
  181. package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +52 -0
  182. package/dist/extensions/pi-subagents/src/shared/types.ts +228 -49
  183. package/dist/extensions/pi-subagents/src/shared/utils.ts +11 -3
  184. package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +10 -0
  185. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +0 -162
  186. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +2 -5
  187. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +105 -13
  188. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +6 -36
  189. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +829 -0
  190. package/dist/extensions/pi-subagents/src/tui/fleet.ts +1415 -0
  191. package/dist/extensions/pi-subagents/src/tui/render.ts +78 -7
  192. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +1 -1
  193. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +1 -0
  194. package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +59 -51
  195. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +8 -2
  196. package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +2 -1
  197. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +4 -4
  198. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +471 -86
  199. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +140 -0
  200. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  364. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  365. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  366. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  367. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  368. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  369. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  370. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  371. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  372. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  373. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  374. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  375. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  376. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +1 -1
  377. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +0 -54
  378. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1053 -414
  379. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +194 -4
  380. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +59 -4
  381. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +0 -77
  382. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +107 -6
  383. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +211 -897
  384. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +265 -375
  385. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +77 -7
  386. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +1 -1
  387. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +10 -10
  388. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +547 -30
  389. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +2112 -310
  390. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +274 -34
  391. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +1 -1
  392. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +20 -3
  393. package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +9 -0
  394. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +30 -5
  395. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +2 -0
  396. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +4 -2
  397. package/dist/extensions/pi-subagents/test/support/register-loader.mjs +1 -0
  398. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +197 -0
  399. package/dist/extensions/pi-subagents/test/unit/agent-contract.test.ts +14 -0
  400. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -1
  401. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +204 -27
  402. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +444 -145
  403. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +256 -4
  404. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +9 -7
  405. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +152 -22
  406. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +29 -0
  407. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +205 -23
  408. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +579 -0
  409. package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +24 -0
  410. package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +1 -0
  411. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +3 -3
  412. package/dist/extensions/pi-subagents/test/unit/capacity-resilient-json.test.ts +155 -0
  413. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +2 -2
  414. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +7 -0
  415. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +123 -0
  416. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +81 -3
  417. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +109 -7
  418. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +2 -2
  419. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +5 -2
  420. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +3 -2
  421. package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +79 -0
  422. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +22 -0
  423. package/dist/extensions/pi-subagents/test/unit/external-job-runner.test.ts +961 -0
  424. package/dist/extensions/pi-subagents/test/unit/file-system-retry.test.ts +64 -0
  425. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +1110 -0
  426. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +1664 -0
  427. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +81 -1
  428. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +138 -11
  429. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +41 -2
  430. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +210 -79
  431. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +95 -0
  432. package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +596 -0
  433. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
  434. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +3 -5
  435. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +167 -0
  436. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +319 -18
  437. package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +78 -0
  438. package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +19 -5
  439. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +44 -0
  440. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +129 -0
  441. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +231 -2
  442. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +28 -1
  443. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +106 -2
  444. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +204 -7
  445. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +59 -4
  446. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +2 -6
  447. package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +34 -2
  448. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +116 -6
  449. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +12 -3
  450. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +56 -61
  451. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +416 -1
  452. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +9 -2
  453. package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +42 -0
  454. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +21 -30
  455. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +86 -11
  456. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +49 -1
  457. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +233 -5
  458. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +28 -5
  459. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +323 -20
  460. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +66 -10
  461. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +68 -5
  462. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +174 -0
  463. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +679 -0
  464. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
  465. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +55 -44
  466. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +399 -84
  467. package/dist/extensions/pi-subagents/test/unit/session-lease.test.ts +13 -0
  468. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
  469. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +15 -10
  470. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +11 -7
  471. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -0
  472. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +40 -1
  473. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +10 -2
  474. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +38 -3
  475. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +110 -12
  476. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +204 -19
  477. package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +25 -0
  478. package/dist/extensions/pi-subagents/test/unit/thinking-ceiling.test.ts +73 -0
  479. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +90 -50
  480. package/dist/extensions/pi-subagents/test/unit/tool-timeout.test.ts +1 -2
  481. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +234 -7
  482. package/dist/extensions/pi-subagents/test/unit/watch-strategy.test.ts +24 -0
  483. package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +36 -0
  484. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +37 -9
  485. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +302 -0
  486. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +167 -7
  487. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +113 -0
  488. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +6 -6
  489. package/dist/extensions/ponytail/index.js +31 -25
  490. package/dist/extensions/ponytail/ponytail-config.cjs +34 -7
  491. package/dist/extensions/ponytail/ponytail-instructions.cjs +7 -9
  492. package/dist/extensions/ponytail/test/extension.test.js +7 -8
  493. package/dist/extensions/ponytail/test/helpers.test.js +1 -1
  494. package/dist/skills/brandkit/SKILL.md +799 -0
  495. package/dist/skills/design-taste-frontend/SKILL.md +1207 -0
  496. package/dist/skills/design-taste-frontend-v1/SKILL.md +227 -0
  497. package/dist/skills/full-output-enforcement/SKILL.md +50 -0
  498. package/dist/skills/gpt-taste/SKILL.md +75 -0
  499. package/dist/skills/high-end-visual-design/SKILL.md +99 -0
  500. package/dist/skills/image-to-code/SKILL.md +1229 -0
  501. package/dist/skills/imagegen-frontend-mobile/SKILL.md +1466 -0
  502. package/dist/skills/imagegen-frontend-web/SKILL.md +988 -0
  503. package/dist/skills/industrial-brutalist-ui/SKILL.md +93 -0
  504. package/dist/skills/minimalist-ui/SKILL.md +86 -0
  505. package/dist/skills/pi-subagents/SKILL.md +18 -17
  506. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +31 -9
  507. package/dist/skills/pi-subagents/references/execution-controls.md +95 -143
  508. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +9 -12
  509. package/dist/skills/pi-subagents/references/multi-lane-orchestration.md +39 -0
  510. package/dist/skills/pi-subagents/references/prompting-and-roles.md +45 -94
  511. package/dist/skills/ponytail/SKILL.md +12 -8
  512. package/dist/skills/ponytail-audit/SKILL.md +0 -1
  513. package/dist/skills/ponytail-debt/SKILL.md +0 -1
  514. package/dist/skills/ponytail-gain/SKILL.md +0 -1
  515. package/dist/skills/ponytail-help/SKILL.md +4 -3
  516. package/dist/skills/ponytail-review/SKILL.md +0 -1
  517. package/dist/skills/redesign-existing-projects/SKILL.md +179 -0
  518. package/dist/skills/stitch-design-taste/SKILL.md +185 -0
  519. package/dist/skills/unlazy/CHANGELOG.md +100 -0
  520. package/dist/skills/unlazy/CONTRIBUTING.md +66 -0
  521. package/dist/skills/unlazy/LICENSE +21 -0
  522. package/dist/skills/unlazy/README.md +242 -0
  523. package/dist/skills/unlazy/SECURITY.md +70 -0
  524. package/dist/skills/unlazy/SKILL.md +100 -0
  525. package/dist/skills/unlazy/package.json +13 -0
  526. package/dist/skills/unlazy/references/dispatch.md +82 -0
  527. package/dist/skills/unlazy/references/gates.md +132 -0
  528. package/dist/skills/unlazy/references/method.md +49 -0
  529. package/dist/skills/unlazy/references/orchestration.md +99 -0
  530. package/dist/skills/unlazy/references/parallel.md +123 -0
  531. package/dist/skills/unlazy/references/token-economy.md +39 -0
  532. package/dist/skills/unlazy/research/validation-protocol.md +81 -0
  533. package/dist/skills/unlazy/scripts/dispatch-check.mjs +108 -0
  534. package/dist/skills/unlazy/scripts/gate-check.mjs +894 -0
  535. package/dist/skills/unlazy/scripts/gate-lint.mjs +178 -0
  536. package/dist/skills/unlazy/scripts/install-hooks.mjs +206 -0
  537. package/dist/skills/unlazy/scripts/lib/check-supervisor.mjs +46 -0
  538. package/dist/skills/unlazy/scripts/lib/dispatch.mjs +283 -0
  539. package/dist/skills/unlazy/scripts/lib/gates.mjs +629 -0
  540. package/dist/skills/unlazy/scripts/lib/process-tree.mjs +161 -0
  541. package/dist/skills/unlazy/scripts/lib/regex-worker.mjs +9 -0
  542. package/dist/skills/unlazy/scripts/stop-hook.mjs +174 -0
  543. package/dist/skills/unlazy/templates/PLAN.md +65 -0
  544. package/dist/skills/unlazy/templates/gates-leaf.md +51 -0
  545. package/dist/skills/unlazy/templates/gates-node.md +50 -0
  546. package/dist/skills/unlazy/tests/contract-tests.mjs +127 -0
  547. package/dist/skills/unlazy/tests/dispatch-tests.mjs +481 -0
  548. package/dist/skills/unlazy/tests/hardening-tests.mjs +903 -0
  549. package/dist/skills/unlazy/tests/lint-tests.mjs +242 -0
  550. package/dist/skills/unlazy/tests/run-tests.mjs +554 -0
  551. package/dist/skills/unlazy/tests/self-check.mjs +165 -0
  552. package/dist/skills/unlazy/tests/stress-tests.mjs +356 -0
  553. package/dist/skills/web-design-guidelines/SKILL.md +40 -0
  554. package/docs/settings.md +0 -5
  555. package/package.json +1 -1
  556. package/dist/core/tools/schema-prune.d.ts +0 -16
  557. package/dist/core/tools/schema-prune.js +0 -39
  558. package/dist/core/tools/schema-prune.test.d.ts +0 -1
  559. package/dist/core/tools/schema-prune.test.js +0 -111
  560. package/dist/extensions/pi-subagents/UPSTREAM-V0.50-MAPPING.md +0 -172
  561. package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +0 -55
  562. package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +0 -61
  563. package/dist/extensions/pi-subagents/src/agents/task-aware-routing.ts +0 -132
  564. package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +0 -181
  565. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +0 -1354
  566. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +0 -1581
  567. package/dist/extensions/pi-subagents/src/shared/env.ts +0 -16
  568. package/dist/extensions/pi-subagents/src/shared/session-lineage.ts +0 -71
  569. package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +0 -136
  570. package/dist/extensions/pi-subagents/src/workflows/workflow-auto-relaunch.ts +0 -41
  571. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +0 -466
  572. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +0 -1859
  573. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +0 -733
  574. package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +0 -63
  575. package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +0 -326
  576. package/dist/extensions/pi-subagents/test/unit/handoff-adoption.test.ts +0 -103
  577. package/dist/extensions/pi-subagents/test/unit/inline-subagents.test.ts +0 -127
  578. package/dist/extensions/pi-subagents/test/unit/session-lineage.test.ts +0 -73
  579. package/dist/extensions/pi-subagents/test/unit/task-aware-routing.test.ts +0 -213
  580. package/dist/extensions/pi-subagents/test/unit/workflow-auto-relaunch.test.ts +0 -65
@@ -9,36 +9,41 @@
9
9
  * Toggle: async parameter (default: true; set asyncByDefault:false in config.json to opt out)
10
10
  *
11
11
  * Config file: ~/.selesai/agent/extensions/subagent/config.json
12
- * { "asyncByDefault": true, "forceTopLevelAsync": true, "maxSubagentDepth": 1, "intercomBridge": { "mode": "always", "instructionFile": "./intercom-bridge.md" }, "worktreeSetupHook": "./scripts/setup-worktree.mjs" }
12
+ * { "asyncByDefault": true, "defaultSubagentContext": "fork", "forceTopLevelAsync": true, "maxSubagentDepth": 1, "intercomBridge": { "mode": "always", "instructionFile": "./intercom-bridge.md" }, "worktreeSetupHook": "./scripts/setup-worktree.mjs" }
13
13
  */
14
14
 
15
15
  import { randomUUID } from "node:crypto";
16
16
  import * as fs from "node:fs";
17
17
  import * as os from "node:os";
18
18
  import * as path from "node:path";
19
- import { fileURLToPath } from "node:url";
20
19
  import type { AgentToolResult } from "@earendil-works/pi-agent-core";
21
20
  import { keyText, type ExtensionAPI, type ExtensionContext, type ToolDefinition } from "@selesai/code";
22
21
  import { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from "@earendil-works/pi-tui";
23
- import { discoverAgents } from "../agents/agents.ts";
22
+ import { discoverAgents, discoverAgentsAll, type AgentConfig, type AgentScope } from "../agents/agents.ts";
23
+ import { clearRuntimeAgentsForPi, listRuntimeAgentConfigs, mergeRuntimeAgents } from "../agents/runtime-agent-registry.ts";
24
24
  import { ensureAccessibleDir } from "../shared/accessible-dir.ts";
25
25
  import { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from "../shared/artifacts.ts";
26
26
  import { resolveCurrentSessionId } from "../shared/session-identity.ts";
27
- import { resolveSessionLineage } from "../shared/session-lineage.ts";
27
+ import { currentCompletionOwnerId } from "../shared/completion-owner.ts";
28
28
  import { cleanupOldChainDirs } from "../shared/settings.ts";
29
29
  import { clearLegacyResultAnimationTimer, renderSubagentResult, renderSubagentSummary } from "../tui/render.ts";
30
+ import { openSubagentFleet } from "../tui/fleet.ts";
31
+ import { SubagentFleetStatus, resolveFleetViewPlacement } from "../tui/fleet-status.ts";
30
32
  import { createSubagentParamsSchema } from "./schemas.ts";
31
- import { validateChainInput } from "./chain-validation.ts";
32
33
  import { createSubagentExecutor, type SubagentParamsLike } from "../runs/foreground/subagent-executor.ts";
33
34
  import { createAsyncJobTracker } from "../runs/background/async-job-tracker.ts";
34
35
  import { getActiveAsyncCapacitySnapshot, resolveMaxActiveAsyncRunsPerSession } from "../runs/background/active-async-capacity.ts";
35
- import { cleanupResultIndexes } from "../runs/background/result-files.ts";
36
+ import { cleanupResultIndexes, missionObserverResultCandidateFiles } from "../runs/background/result-files.ts";
37
+ import { ASYNC_RETENTION_DELAY_MS, cleanupAsyncRetention } from "../runs/background/async-retention.ts";
36
38
  import { createResultWatcher } from "../runs/background/result-watcher.ts";
39
+ import { createScheduledRunManager } from "../runs/background/scheduled-runs.ts";
37
40
  import { registerSlashCommands } from "../slash/slash-commands.ts";
38
41
  import { registerPromptTemplateDelegationBridge } from "../slash/prompt-template-bridge.ts";
42
+ import { registerMainWatchdog } from "../watchdog/register-main.ts";
39
43
  import { registerSlashSubagentBridge } from "../slash/slash-bridge.ts";
40
44
  import { createNativeSupervisorChannel } from "../intercom/native-supervisor-channel.ts";
41
45
  import { registerHerdrStatusBridge, type HerdrStatusRun } from "../integrations/herdr-status.ts";
46
+ import { listHerdrProjectPaneRoots, restoreHerdrProjectPaneSnapshots } from "../inspectors/herdr/project-panes.ts";
42
47
  import { registerSubagentRpcBridge } from "./rpc.ts";
43
48
  import { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from "../slash/slash-live-state.ts";
44
49
  import { inspectSubagentStatus } from "../runs/background/run-status.ts";
@@ -51,8 +56,9 @@ import { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_M
51
56
  import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../runs/shared/pi-args.ts";
52
57
  import { resolveCurrentSubagentCapabilityCeiling } from "../runs/shared/capability-ceiling.ts";
53
58
  import { formatDuration, shortenPath } from "../shared/formatters.ts";
54
- import { loadConfig, resolveAsyncByDefault } from "./config.ts";
55
- import { buildSubagentToolDescription } from "./tool-description.ts";
59
+ import { loadConfig, resolveAsyncByDefault, resolveScheduledStoreRoot } from "./config.ts";
60
+ import { buildSubagentToolDescription, buildSubagentToolPromptMetadata } from "./tool-description.ts";
61
+ import { finalizeToolResult } from "./tool-result.ts";
56
62
  import { collectGoalContinuationNotices } from "../missions/goal-driver.ts";
57
63
  import { restoreForegroundRunHistory } from "../runs/foreground/foreground-history.ts";
58
64
  import { resolveMissionStoreLocation } from "../missions/store.ts";
@@ -83,6 +89,37 @@ import {
83
89
  export { loadConfig, resolveAsyncByDefault } from "./config.ts";
84
90
 
85
91
  const SLOW_RELOAD_PHASE_MS = 250;
92
+ const RUNTIME_REGISTRY_STORE_KEY = "__piSubagentRuntimeRegistry";
93
+
94
+ interface SubagentRuntimeEntry {
95
+ cleanup(): void;
96
+ sessionManager: object | null;
97
+ visibleControlNotices: Set<string>;
98
+ }
99
+
100
+ interface SubagentRuntimeRegistry {
101
+ bySessionManager: WeakMap<object, SubagentRuntimeEntry>;
102
+ visibleControlNoticesBySessionManager: WeakMap<object, Set<string>>;
103
+ activeEntries: Set<SubagentRuntimeEntry>;
104
+ }
105
+
106
+ function getRuntimeRegistry(): SubagentRuntimeRegistry {
107
+ const globalStore = globalThis as Record<string, unknown>;
108
+ const existing = globalStore[RUNTIME_REGISTRY_STORE_KEY] as Partial<SubagentRuntimeRegistry> | undefined;
109
+ if (existing?.bySessionManager instanceof WeakMap && existing.activeEntries instanceof Set) {
110
+ if (!(existing.visibleControlNoticesBySessionManager instanceof WeakMap)) {
111
+ existing.visibleControlNoticesBySessionManager = new WeakMap();
112
+ }
113
+ return existing as SubagentRuntimeRegistry;
114
+ }
115
+ const registry: SubagentRuntimeRegistry = {
116
+ bySessionManager: new WeakMap(),
117
+ visibleControlNoticesBySessionManager: new WeakMap(),
118
+ activeEntries: new Set(),
119
+ };
120
+ globalStore[RUNTIME_REGISTRY_STORE_KEY] = registry;
121
+ return registry;
122
+ }
86
123
 
87
124
  function logSlowPhase(label: string, startedAt: number): void {
88
125
  const elapsed = Date.now() - startedAt;
@@ -242,18 +279,14 @@ function expandTilde(p: string): string {
242
279
  return p.startsWith("~/") ? path.join(os.homedir(), p.slice(2)) : p;
243
280
  }
244
281
 
245
- function isSlashResultRunning(result: { details?: Details; isError?: boolean }): boolean {
246
- if (result.isError) return false;
282
+ function isSlashResultRunning(result: { details?: Details }): boolean {
247
283
  return result.details?.progress?.some((entry) => entry.status === "running")
248
284
  || result.details?.results.some((entry) => entry.progress?.status === "running")
249
- || (result.details?.mode === "workflow" && result.details?.workflow?.value === undefined)
250
285
  || false;
251
286
  }
252
287
 
253
- function isSlashResultError(result: { details?: Details; isError?: boolean }): boolean {
254
- return result.isError === true
255
- || result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== "running")
256
- || false;
288
+ function isSlashResultError(result: { details?: Details }): boolean {
289
+ return result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== "running") || false;
257
290
  }
258
291
 
259
292
  function isStaleExtensionContextError(error: unknown): boolean {
@@ -361,16 +394,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
361
394
  if (process.env[SUBAGENT_CHILD_ENV] === "1") {
362
395
  return;
363
396
  }
364
- const globalStore = globalThis as Record<string, unknown>;
365
- const runtimeCleanupStoreKey = "__piSubagentRuntimeCleanup";
366
- const previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];
367
- if (typeof previousRuntimeCleanup === "function") {
368
- try {
369
- previousRuntimeCleanup();
370
- } catch {
371
- // Best effort cleanup for stale timers from an older reload.
372
- }
373
- }
397
+ const runtimeRegistry = getRuntimeRegistry();
374
398
 
375
399
  DIRS.results = ensureAccessibleDir(DIRS.results);
376
400
  DIRS.async = ensureAccessibleDir(DIRS.async);
@@ -379,6 +403,8 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
379
403
  const config = loadConfig();
380
404
  const waitToolConfig = resolveWaitToolConfig(config.waitTool);
381
405
  const asyncByDefault = resolveAsyncByDefault(config);
406
+ const fleetViewEnabled = config.fleetView !== false;
407
+ const fleetViewPlacement = resolveFleetViewPlacement(config.fleetViewPlacement);
382
408
  const asyncWidgetEnabled = config.asyncWidget !== false;
383
409
  const summaryInlineToolDisplay = config.inlineToolDisplay === "summary";
384
410
  const tempArtifactsDir = getArtifactsDir(null);
@@ -393,15 +419,10 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
393
419
  }, 30_000);
394
420
  resultIndexCleanupTimer.unref?.();
395
421
 
396
- // Replay guard for lineage result adoption: accept result files written at
397
- // most this long before the adoption window opened (covers completions that
398
- // raced the session switch). Older files were left behind by a dead watcher
399
- // and are ignored until their owning session is resumed.
400
- const ADOPTED_RESULT_SLACK_MS = 60_000;
401
-
402
422
  const state: SubagentState = {
403
423
  baseCwd: "",
404
424
  currentSessionId: null,
425
+ completionOwnerId: currentCompletionOwnerId(),
405
426
  artifactDirPreference: config.artifactDir ?? DEFAULT_ARTIFACT_CONFIG.dir,
406
427
  ...(config.authorityPolicy ? { authorityPolicy: config.authorityPolicy } : {}),
407
428
  ...(config.missions ? { missionStoreConfig: config.missions } : {}),
@@ -416,6 +437,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
416
437
  grantHistory: [],
417
438
  },
418
439
  activeAsyncCapacity: { used: 0, limit: resolveMaxActiveAsyncRunsPerSession(config.maxActiveAsyncRunsPerSession) ?? 0 },
440
+ herdrProjectPanes: new Map(),
419
441
  asyncJobs: new Map(),
420
442
  fleetJobs: new Map(),
421
443
  foregroundRuns: new Map(),
@@ -436,32 +458,96 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
436
458
 
437
459
  const supervisorChannel = createNativeSupervisorChannel(pi, state);
438
460
  const waitSubscriptionManager = createWaitSubscriptionManager(pi, state);
461
+ const mainWatchdog = registerMainWatchdog(pi);
439
462
  const completionNotifier = registerSubagentNotify(pi, state, { batchConfig: config.completionBatch });
463
+ const fleetStatus = fleetViewEnabled
464
+ ? new SubagentFleetStatus(state, async (itemKey) => {
465
+ const ctx = state.lastUiContext;
466
+ if (!ctx?.hasUI) return;
467
+ await openSubagentFleet(ctx, state, { initialKey: itemKey, asyncDirRoot: DIRS.async, resultsDir: DIRS.results, fleetKeybindings: config.fleetKeybindings });
468
+ }, { placement: fleetViewPlacement })
469
+ : undefined;
470
+ let executorScheduled: ((id: string, params: SubagentParamsLike, signal: AbortSignal, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;
440
471
  let goalTurnId = 0;
472
+ let parentSessionEnvValue: string | null = null;
473
+ const scheduledStoreRoot = config.scheduledRuns?.storeRoot === undefined ? undefined : resolveScheduledStoreRoot(config.scheduledRuns.storeRoot);
474
+ const scheduledRunManager = createScheduledRunManager({
475
+ config,
476
+ storeRoot: scheduledStoreRoot,
477
+ launch: (params, ctx, signal) => {
478
+ if (!executorScheduled) {
479
+ return Promise.resolve({
480
+ content: [{ type: "text", text: "Scheduled subagent launch is unavailable (executor not ready)." }],
481
+ isError: true,
482
+ details: { mode: "management" as const, results: [] },
483
+ });
484
+ }
485
+ return executorScheduled(randomUUID(), params, signal, ctx);
486
+ },
487
+ resolveCapabilityCeiling: (sessionId) => resolveCurrentSubagentCapabilityCeiling(sessionId),
488
+ });
489
+ let refreshResultDelivery = () => {};
490
+ const hasResultDeliveryDemand = () => {
491
+ if ([...state.asyncJobs.values()].some((job) => job.status === "queued" || job.status === "running")) return true;
492
+ if (state.foregroundControls.size > 0) return true;
493
+ if (scheduledRunManager.observedCompletionRunIds().size > 0) return true;
494
+ return missionObserverResultCandidateFiles(DIRS.results).length > 0;
495
+ };
496
+ const discoverAgentsForRuntime = (cwd: string, scope: AgentScope) => {
497
+ const discovered = discoverAgents(cwd, scope);
498
+ if (listRuntimeAgentConfigs(pi).length === 0) return discovered;
499
+ const all = discoverAgentsAll(cwd);
500
+ const configuredAgents: AgentConfig[] = [
501
+ ...all.builtin,
502
+ ...all.package,
503
+ ...all.user,
504
+ ...all.project,
505
+ ];
506
+ const merged = mergeRuntimeAgents(pi, discovered, configuredAgents);
507
+ if (discovered.maxThinking === undefined) return merged;
508
+ return {
509
+ ...merged,
510
+ agents: merged.agents.map((agent) => agent.maxThinking === discovered.maxThinking ? agent : { ...agent, maxThinking: discovered.maxThinking }),
511
+ };
512
+ };
441
513
  const { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs, dispose: disposeAsyncJobTracker } = createAsyncJobTracker(pi, state, DIRS.async, {
442
514
  widgetEnabled: asyncWidgetEnabled,
515
+ onJobTerminal: () => refreshResultDelivery(),
443
516
  });
444
- const { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(
517
+ const resultWatcher = createResultWatcher(
445
518
  pi,
446
519
  state,
447
520
  DIRS.results,
448
521
  10 * 60 * 1000,
449
522
  {
450
523
  notifier: completionNotifier,
524
+ observeCompletion: (result) => scheduledRunManager.handleAsyncCompletion(result),
525
+ observedCompletionRunIds: () => scheduledRunManager.observedCompletionRunIds(),
526
+ hasDeliveryDemand: hasResultDeliveryDemand,
451
527
  deliverIntercomResults: config.intercomBridge?.resultDelivery === true,
528
+ resultScanLogging: config.resultScanLogging,
452
529
  },
453
530
  );
454
-
455
- const runtimeCleanup = () => {
456
- clearTimeout(resultIndexCleanupTimer);
457
- stopResultWatcher();
458
- state.currentSessionId = null;
459
- completionNotifier.dispose();
460
- supervisorChannel.dispose();
461
- waitSubscriptionManager.dispose();
462
- disposeAsyncJobTracker();
463
- };
464
- globalStore[runtimeCleanupStoreKey] = runtimeCleanup;
531
+ const { startResultWatcher, primeExistingResults, stopResultWatcher } = resultWatcher;
532
+ refreshResultDelivery = resultWatcher.refreshResultDelivery;
533
+ const asyncRetentionAbort = new AbortController();
534
+ const asyncRetentionTimer = setTimeout(async () => {
535
+ try {
536
+ await cleanupAsyncRetention({
537
+ asyncDirRoot: DIRS.async,
538
+ resultsDir: DIRS.results,
539
+ signal: asyncRetentionAbort.signal,
540
+ protectedRunIds: new Set([
541
+ ...state.asyncJobs.keys(),
542
+ ...(state.workflowControllers?.keys() ?? []),
543
+ ...scheduledRunManager.referencedAsyncRunIds(),
544
+ ]),
545
+ });
546
+ } catch (error) {
547
+ console.error("Failed to clean retained async subagent state:", error);
548
+ }
549
+ }, ASYNC_RETENTION_DELAY_MS);
550
+ asyncRetentionTimer.unref?.();
465
551
 
466
552
  const executor = createSubagentExecutor({
467
553
  pi,
@@ -469,11 +555,16 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
469
555
  config,
470
556
  asyncByDefault,
471
557
  waitToolEnabled: waitToolConfig.enabled,
558
+ handleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),
559
+ watchdog: mainWatchdog,
472
560
  tempArtifactsDir,
473
561
  getSubagentSessionRoot,
474
562
  expandTilde,
475
- discoverAgents,
563
+ discoverAgents: discoverAgentsForRuntime,
564
+ activateSupervisorTransport: () => supervisorChannel.activateTransport(),
565
+ refreshResultDelivery: () => refreshResultDelivery(),
476
566
  });
567
+ executorScheduled = executor.executeScheduled;
477
568
 
478
569
  pi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {
479
570
  const details = resolveSlashMessageDetails(message.details);
@@ -516,6 +607,15 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
516
607
  const expandKey = keyText("app.tools.expand");
517
608
  text += `\n ${theme.fg("dim", `${expandKey} full notification`)}`;
518
609
  }
610
+ if (details.workflowRunId) {
611
+ text += `\n ${theme.fg("muted", `workflow: ${details.workflowRunId}`)}`;
612
+ }
613
+ if (details.childRuns?.length) {
614
+ text += `\n ${theme.fg("muted", `children: ${details.childRuns.map((child) => `${child.workflowKey ?? child.agent ?? "child"}=${child.runId}`).join(", ")}`)}`;
615
+ }
616
+ if (details.reconciledFromDetachedChild) {
617
+ text += `\n ${theme.fg("muted", `reconciled child: ${details.reconciledFromDetachedChild}`)}`;
618
+ }
519
619
  if (details.sessionLabel && details.sessionValue) {
520
620
  text += `\n ${theme.fg("muted", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;
521
621
  }
@@ -542,6 +642,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
542
642
 
543
643
  const slashBridge = registerSlashSubagentBridge({
544
644
  events: pi.events,
645
+ asyncByDefault,
545
646
  getContext: () => state.lastUiContext,
546
647
  execute: (id, params, signal, onUpdate, ctx) =>
547
648
  executeSubagentCollapsed(id, params, signal, onUpdate, ctx),
@@ -566,23 +667,23 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
566
667
  });
567
668
 
568
669
 
569
- const parameters = createSubagentParamsSchema(config);
670
+ const parameters = createSubagentParamsSchema();
570
671
  const tool: ToolDefinition<typeof parameters, Details> = {
571
672
  name: "subagent",
572
673
  label: "Subagent",
573
674
  description: buildSubagentToolDescription(config),
675
+ ...buildSubagentToolPromptMetadata(config),
574
676
  parameters,
575
- keepParameterDescriptions: true,
576
677
 
577
- execute(id, params, signal, onUpdate, ctx) {
578
- return executeSubagentCollapsed(id, params as SubagentParamsLike, signal ?? new AbortController().signal, onUpdate, ctx);
678
+ async execute(id, params, signal, onUpdate, ctx) {
679
+ return finalizeToolResult(await executeSubagentCollapsed(id, params as SubagentParamsLike, signal ?? new AbortController().signal, onUpdate, ctx));
579
680
  },
580
681
 
581
682
  renderCall(args, theme) {
582
683
  const gap = " ".repeat(config.mainWindowRenderer?.horizontalSpacing ?? 1);
583
684
  const title = theme.fg("toolTitle", theme.bold("subagent"));
584
685
  if (args.action) {
585
- const target = args.agent || args.chainName || "";
686
+ const target = args.agent || "";
586
687
  return new Text(
587
688
  `${title}${gap}${args.action}${target ? `${gap}${theme.fg("accent", target)}` : ""}`,
588
689
  0, 0,
@@ -612,39 +713,25 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
612
713
 
613
714
  };
614
715
 
615
- Object.assign(tool, {
616
- prepareArguments(args: unknown) {
617
- validateChainInput(args);
618
- return args;
619
- },
620
- });
621
-
622
716
  pi.registerTool(tool);
623
717
 
624
718
  registerWaitTool(pi, state, waitToolConfig.enabled, waitSubscriptionManager);
625
719
 
626
720
  pi.on("agent_end", async (_event, ctx) => {
627
721
  if (!ctx.hasUI) await drainOutstandingWork({ state, events: pi.events });
628
- const ownerSessionIds = state.sessionLineage?.length
629
- ? state.sessionLineage
630
- : state.currentSessionId ? [state.currentSessionId] : [];
631
- if (ownerSessionIds.length === 0) return;
722
+ const ownerSessionId = state.currentSessionId;
723
+ if (!ownerSessionId) return;
632
724
  goalTurnId += 1;
633
725
  try {
634
726
  const location = resolveMissionStoreLocation({ projectRoot: state.baseCwd, ...(config.missions ? { config: config.missions } : {}) });
635
- const retainedChildren = listRetainedChildren(DIRS.async, ownerSessionIds);
636
- const emittedMissions = new Set<string>();
637
- for (const ownerSessionId of ownerSessionIds) {
638
- for (const notice of collectGoalContinuationNotices({ location, ownerSessionId, retainedChildren, turnId: goalTurnId })) {
639
- if (emittedMissions.has(notice.missionId)) continue;
640
- emittedMissions.add(notice.missionId);
641
- handleSubagentControlNotice({
642
- pi,
643
- state,
644
- visibleControlNotices: new Set(),
645
- details: { source: "goal", event: notice.event, noticeText: notice.message },
646
- });
647
- }
727
+ const retainedChildren = listRetainedChildren(DIRS.async, ownerSessionId);
728
+ for (const notice of collectGoalContinuationNotices({ location, ownerSessionId, retainedChildren, turnId: goalTurnId })) {
729
+ handleSubagentControlNotice({
730
+ pi,
731
+ state,
732
+ visibleControlNotices: new Set(),
733
+ details: { source: "goal", event: notice.event, noticeText: notice.message },
734
+ });
648
735
  }
649
736
  } catch (error) {
650
737
  console.error("Failed to evaluate goal missions:", error);
@@ -655,32 +742,13 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
655
742
  fleetKeybindings: config.fleetKeybindings,
656
743
  foregroundDetachShortcut: config.foregroundDetachShortcut,
657
744
  });
658
- pi.on("resources_discover", () => {
659
- return {
660
- promptPaths: [fileURLToPath(new URL("../../prompts", import.meta.url))],
661
- };
662
- });
663
745
 
664
- const eventUnsubscribeStoreKey = "__piSubagentEventUnsubscribes";
665
- const controlNoticeSeenStoreKey = "__piSubagentVisibleControlNotices";
666
- const previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];
667
- if (Array.isArray(previousEventUnsubscribes)) {
668
- for (const unsubscribe of previousEventUnsubscribes) {
669
- if (typeof unsubscribe !== "function") continue;
670
- try {
671
- unsubscribe();
672
- } catch {
673
- // Best effort cleanup for stale handlers from an older reload.
674
- }
675
- }
676
- }
677
- const existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];
678
- const visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();
679
- globalStore[controlNoticeSeenStoreKey] = visibleControlNotices;
746
+ let visibleControlNotices = new Set<string>();
680
747
  const activeHerdrRuns = () => projectActiveHerdrRuns(state);
681
748
  const herdrStatusBridge = registerHerdrStatusBridge({
682
749
  events: pi.events,
683
750
  getRuns: activeHerdrRuns,
751
+ getProjectPaneCount: () => [...(state.herdrProjectPanes?.values() ?? [])].filter((pane) => pane.state === "open").length,
684
752
  async runHerdr(args) {
685
753
  await pi.exec(process.env.HERDR_BIN || "herdr", [...args], { timeout: 5_000 });
686
754
  },
@@ -698,29 +766,37 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
698
766
  };
699
767
  const asyncStartedHandler = (payload: unknown) => {
700
768
  handleStarted(payload);
769
+ supervisorChannel.activateTransport();
770
+ refreshResultDelivery();
771
+ fleetStatus?.refresh();
701
772
  };
702
773
  const asyncCompleteHandler = (payload: unknown) => {
703
774
  handleComplete(payload);
775
+ refreshResultDelivery();
704
776
  refreshActiveAsyncCapacity();
777
+ scheduledRunManager.handleAsyncCompletion(payload);
778
+ fleetStatus?.refresh();
705
779
  };
706
780
  const eventUnsubscribes = [
707
781
  pi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, asyncStartedHandler),
708
782
  pi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, asyncCompleteHandler),
709
783
  pi.events.on(SUBAGENT_PROCESS_TERMINAL_EVENT, () => {
710
784
  refreshActiveAsyncCapacity();
785
+ fleetStatus?.refresh();
711
786
  }),
712
787
  pi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),
713
788
  pi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),
714
789
  herdrStatusBridge.dispose,
715
790
  rpcBridge.dispose,
716
791
  ];
717
- globalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;
718
792
 
719
793
  pi.on("tool_result", (event, ctx) => {
720
794
  if (event.toolName !== "subagent") return;
721
795
  if (!ctx.hasUI) return;
722
796
  state.lastUiContext = ctx;
723
797
  restoreActiveJobs(ctx);
798
+ fleetStatus?.setContext(ctx);
799
+ fleetStatus?.refresh();
724
800
  if (state.asyncJobs.size > 0) {
725
801
  refreshWidget(ctx);
726
802
  ensurePoller();
@@ -742,12 +818,14 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
742
818
  if (state.widgetsSuspended) return;
743
819
  state.widgetsSuspended = true;
744
820
  if (state.lastUiContext?.hasUI) state.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);
821
+ fleetStatus?.refresh();
745
822
  };
746
823
  const resumeWidgetsAfterCompaction = () => {
747
824
  if (!state.widgetsSuspended) return;
748
825
  state.widgetsSuspended = false;
749
826
  const ctx = state.lastUiContext;
750
827
  if (ctx?.hasUI) refreshWidget(ctx);
828
+ fleetStatus?.refresh();
751
829
  };
752
830
 
753
831
  const refreshActiveAsyncCapacity = () => {
@@ -760,42 +838,9 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
760
838
  resolveMaxActiveAsyncRunsPerSession(config.maxActiveAsyncRunsPerSession),
761
839
  { liveWorkflowRunIds: new Set(state.workflowControllers?.keys() ?? []) },
762
840
  );
763
- const adoptedActive = [...state.asyncJobs.values()].filter((job) => job.adopted && (job.status === "queued" || job.status === "running")).length;
764
- if (adoptedActive > 0) {
765
- state.activeAsyncCapacity = {
766
- ...state.activeAsyncCapacity,
767
- used: state.activeAsyncCapacity.used + adoptedActive,
768
- };
769
- }
770
841
  };
771
842
 
772
- const formatActiveWorkflowSummary = (target: SubagentState, intro: string): string => {
773
- const active = [...target.asyncJobs.values()]
774
- .filter((job) => job.status === "queued" || job.status === "running")
775
- .sort((left, right) => (left.startedAt ?? 0) - (right.startedAt ?? 0));
776
- const lines = active.map((job) => {
777
- const label = job.mode === "workflow"
778
- ? `workflow[${job.workflowKey ?? "script"}]`
779
- : `${job.mode ?? "run"}${job.agents?.length ? ` ${job.agents.join(", ")}` : ""}`;
780
- const step = job.currentStep !== undefined
781
- ? ` · step ${job.currentStep + 1}/${job.chainStepCount ?? job.stepsTotal ?? "?"}`
782
- : "";
783
- const activity = job.currentTool ? ` · last: ${job.currentTool}` : "";
784
- const adopted = job.adopted ? " (carried over from a previous session)" : "";
785
- return `- ${job.asyncId} ${label}${step}${activity}${adopted}`;
786
- });
787
- return [
788
- intro,
789
- ...lines,
790
- "Monitor with subagent status <id>; interrupt/resume/steer by run id; children.list lists completed steps. Results arrive automatically.",
791
- ].join("\n");
792
- };
793
-
794
- const resetSessionState = (ctx: ExtensionContext, recovering: boolean, previousSessionFile?: string | null) => {
795
- state.sessionLineage = resolveSessionLineage({ sessionManager: ctx.sessionManager }, { parentHint: previousSessionFile ?? null });
796
- state.handoffResumePending = false;
797
- if (state.sessionLineage.length > 1) state.adoptedResultWindowStart = Date.now() - ADOPTED_RESULT_SLACK_MS;
798
- else state.adoptedResultWindowStart = undefined;
843
+ const resetSessionState = (ctx: ExtensionContext, recovering: boolean) => {
799
844
  state.widgetsSuspended = false;
800
845
  state.baseCwd = ctx.cwd;
801
846
  goalTurnId = 0;
@@ -812,6 +857,8 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
812
857
  granted: 0,
813
858
  grantHistory: [],
814
859
  };
860
+ const projectPaneOwnerRoot = path.resolve(ctx.cwd);
861
+ restoreHerdrProjectPaneSnapshots(state, [...new Set([...(state.herdrProjectPanes?.keys() ?? []), ...listHerdrProjectPaneRoots(projectPaneOwnerRoot), projectPaneOwnerRoot])]);
815
862
  // Set SELESAI_SUBAGENT_PARENT_SESSION for permission-system forwarding.
816
863
  // Only set in the root session (the interactive UI session), not in
817
864
  // child subagent processes — children inherit the parent's value
@@ -821,6 +868,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
821
868
  const sessionId = ctx.sessionManager.getSessionId();
822
869
  if (sessionId) {
823
870
  process.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;
871
+ parentSessionEnvValue = sessionId;
824
872
  }
825
873
  }
826
874
  state.lastUiContext = ctx;
@@ -839,10 +887,11 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
839
887
  restoreForegroundRunHistory(state, { resultsDir: DIRS.results });
840
888
  logSlowPhase("foreground-history", phaseStartedAt);
841
889
  phaseStartedAt = Date.now();
842
- const adoptedJobs = restoreActiveJobs(ctx);
890
+ restoreActiveJobs(ctx);
843
891
  logSlowPhase("active-job-restore", phaseStartedAt);
844
- state.handoffResumePending = adoptedJobs > 0 && state.lastUiContext?.hasUI === true;
845
892
  phaseStartedAt = Date.now();
893
+ scheduledRunManager.bindSession(ctx);
894
+ logSlowPhase("scheduled-runs", phaseStartedAt);
846
895
  phaseStartedAt = Date.now();
847
896
  restoreSlashFinalSnapshots(ctx.sessionManager.getEntries());
848
897
  logSlowPhase("slash-snapshots", phaseStartedAt);
@@ -855,6 +904,91 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
855
904
  phaseStartedAt = Date.now();
856
905
  primeExistingResults({ triggerTurn: !recovering });
857
906
  logSlowPhase("result-prime", phaseStartedAt);
907
+ fleetStatus?.setContext(ctx);
908
+ };
909
+
910
+ let runtimeCleaned = false;
911
+ const runtimeEntry: SubagentRuntimeEntry = {
912
+ sessionManager: null,
913
+ visibleControlNotices,
914
+ cleanup() {
915
+ if (runtimeCleaned) return;
916
+ runtimeCleaned = true;
917
+ const shuttingDownParentSession = parentSessionEnvValue;
918
+ clearRuntimeAgentsForPi(pi);
919
+ clearTimeout(resultIndexCleanupTimer);
920
+ clearTimeout(asyncRetentionTimer);
921
+ asyncRetentionAbort.abort();
922
+ stopResultWatcher();
923
+ completionNotifier.dispose();
924
+ mainWatchdog.dispose();
925
+ scheduledRunManager.stop();
926
+ supervisorChannel.dispose();
927
+ waitSubscriptionManager.dispose();
928
+ fleetStatus?.dispose();
929
+ disposeAsyncJobTracker();
930
+ for (const timer of state.cleanupTimers.values()) clearTimeout(timer);
931
+ state.cleanupTimers.clear();
932
+ state.asyncJobs.clear();
933
+ for (const unsubscribe of eventUnsubscribes) {
934
+ try {
935
+ unsubscribe();
936
+ } catch {
937
+ // Best effort cleanup during shutdown or reload.
938
+ }
939
+ }
940
+ slashBridge.cancelAll();
941
+ slashBridge.dispose();
942
+ promptTemplateBridge.cancelAll();
943
+ promptTemplateBridge.dispose();
944
+ state.widgetsSuspended = false;
945
+ state.currentSessionId = null;
946
+ state.parentSessionFile = null;
947
+ parentSessionEnvValue = null;
948
+ if (shuttingDownParentSession && process.env[SUBAGENT_PARENT_SESSION_ENV] === shuttingDownParentSession) {
949
+ delete process.env[SUBAGENT_PARENT_SESSION_ENV];
950
+ }
951
+ if (runtimeEntry.sessionManager && runtimeRegistry.bySessionManager.get(runtimeEntry.sessionManager) === runtimeEntry) {
952
+ runtimeRegistry.bySessionManager.delete(runtimeEntry.sessionManager);
953
+ }
954
+ runtimeRegistry.activeEntries.delete(runtimeEntry);
955
+ if (runtimeRegistry.activeEntries.size === 0) clearSlashSnapshots();
956
+ try {
957
+ if (state.lastUiContext?.hasUI) state.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);
958
+ } catch (error) {
959
+ if (!isStaleExtensionContextError(error)) throw error;
960
+ }
961
+ state.lastUiContext = null;
962
+ },
963
+ };
964
+
965
+ const installRuntime = (ctx: ExtensionContext) => {
966
+ if (runtimeCleaned) {
967
+ throw new Error("Cannot restart a cleaned pi-subagents extension runtime; register a new extension instance.");
968
+ }
969
+ const sessionManager = ctx.sessionManager as object;
970
+ const previousRuntime = runtimeRegistry.bySessionManager.get(sessionManager);
971
+ const existingVisibleControlNotices = runtimeRegistry.visibleControlNoticesBySessionManager.get(sessionManager);
972
+ if (existingVisibleControlNotices) {
973
+ visibleControlNotices = existingVisibleControlNotices;
974
+ } else {
975
+ runtimeRegistry.visibleControlNoticesBySessionManager.set(sessionManager, visibleControlNotices);
976
+ }
977
+ runtimeEntry.visibleControlNotices = visibleControlNotices;
978
+ if (runtimeEntry.sessionManager && runtimeEntry.sessionManager !== sessionManager
979
+ && runtimeRegistry.bySessionManager.get(runtimeEntry.sessionManager) === runtimeEntry) {
980
+ runtimeRegistry.bySessionManager.delete(runtimeEntry.sessionManager);
981
+ }
982
+ runtimeEntry.sessionManager = sessionManager;
983
+ runtimeRegistry.bySessionManager.set(sessionManager, runtimeEntry);
984
+ runtimeRegistry.activeEntries.add(runtimeEntry);
985
+ if (previousRuntime && previousRuntime !== runtimeEntry) {
986
+ try {
987
+ previousRuntime.cleanup();
988
+ } catch {
989
+ // Best effort cleanup for stale resources from the replaced runtime.
990
+ }
991
+ }
858
992
  };
859
993
 
860
994
  pi.on("agent_start", () => {
@@ -864,17 +998,6 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
864
998
 
865
999
  pi.on("agent_settled", () => {
866
1000
  resumeWidgetsAfterCompaction();
867
- if (state.handoffResumePending && state.lastUiContext?.hasUI === true) {
868
- state.handoffResumePending = false;
869
- pi.sendMessage(
870
- {
871
- customType: "subagent-handoff-resume",
872
- content: formatActiveWorkflowSummary(state, "Session handoff detected. The previous session's background workflows were carried over:"),
873
- display: false,
874
- },
875
- { triggerTurn: true },
876
- );
877
- }
878
1001
  });
879
1002
 
880
1003
  pi.on("session_before_compact", (event) => {
@@ -887,7 +1010,7 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
887
1010
  pi.sendMessage(
888
1011
  {
889
1012
  customType: "subagent-compaction-resume",
890
- content: formatActiveWorkflowSummary(state, "Compaction is complete. Resume the parent task now; results for the runs below arrive separately when ready:"),
1013
+ content: "Compaction is complete. Resume the parent task now; background subagent results will arrive separately when ready.",
891
1014
  display: false,
892
1015
  },
893
1016
  { triggerTurn: true },
@@ -895,60 +1018,20 @@ export default function registerSubagentExtension(pi: ExtensionAPI): void {
895
1018
  });
896
1019
 
897
1020
  pi.on("session_start", (event, ctx) => {
1021
+ installRuntime(ctx);
898
1022
  const recovering = event.reason === "startup" || event.reason === "reload" || event.reason === "resume";
899
- const previousSessionFile = event.reason === "new" || event.reason === "fork" ? event.previousSessionFile : null;
900
- resetSessionState(ctx, recovering, previousSessionFile);
1023
+ resetSessionState(ctx, recovering);
901
1024
  herdrStatusBridge.sessionStarted({
902
1025
  hasUI: ctx.hasUI === true,
903
1026
  runs: activeHerdrRuns(),
904
1027
  });
905
1028
  rpcBridge.emitReady(ctx);
906
1029
  supervisorChannel.start();
1030
+ supervisorChannel.activateTransport();
907
1031
  });
908
1032
 
909
1033
  pi.on("session_shutdown", async () => {
910
- state.widgetsSuspended = false;
911
- clearTimeout(resultIndexCleanupTimer);
912
- stopResultWatcher();
913
- state.currentSessionId = null;
914
- state.parentSessionFile = null;
915
- state.sessionLineage = undefined;
916
- state.adoptedResultWindowStart = undefined;
917
- state.handoffResumePending = false;
918
- completionNotifier.dispose();
919
- delete process.env[SUBAGENT_PARENT_SESSION_ENV];
920
- for (const unsubscribe of eventUnsubscribes) {
921
- try {
922
- unsubscribe();
923
- } catch {
924
- // Best effort cleanup during shutdown.
925
- }
926
- }
927
- if (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {
928
- delete globalStore[eventUnsubscribeStoreKey];
929
- }
930
- disposeAsyncJobTracker();
931
- for (const timer of state.cleanupTimers.values()) {
932
- clearTimeout(timer);
933
- }
934
- state.cleanupTimers.clear();
935
- state.asyncJobs.clear();
936
- clearSlashSnapshots();
937
- slashBridge.cancelAll();
938
- slashBridge.dispose();
939
- promptTemplateBridge.cancelAll();
940
- promptTemplateBridge.dispose();
941
- supervisorChannel.dispose();
942
- if (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {
943
- delete globalStore[runtimeCleanupStoreKey];
944
- }
945
- try {
946
- if (state.lastUiContext?.hasUI) {
947
- state.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);
948
- }
949
- } catch (error) {
950
- if (!isStaleExtensionContextError(error)) throw error;
951
- }
1034
+ runtimeEntry.cleanup();
952
1035
  await herdrStatusBridge.flush();
953
1036
  });
954
1037
  }