@selesai/code 0.8.2 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +4 -2
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.js +18 -0
  5. package/dist/cli/config-selector.js +2 -2
  6. package/dist/cli/startup-ui.d.ts +1 -1
  7. package/dist/cli/startup-ui.js +2 -2
  8. package/dist/core/keybindings.d.ts +44 -4
  9. package/dist/core/llama/provider.js +22 -7
  10. package/dist/core/model-resolver.js +2 -0
  11. package/dist/core/model-runtime.d.ts +4 -2
  12. package/dist/core/model-runtime.js +23 -2
  13. package/dist/core/remote-catalog-provider.js +72 -67
  14. package/dist/core/settings-manager.d.ts +8 -0
  15. package/dist/core/settings-manager.js +18 -0
  16. package/dist/extensions/handoff-new.ts +1 -1
  17. package/dist/extensions/inline-skills.test.ts +1 -0
  18. package/dist/extensions/inline-skills.ts +1 -1
  19. package/dist/extensions/pi-intercom/CHANGELOG.md +25 -3
  20. package/dist/extensions/pi-intercom/README.md +34 -15
  21. package/dist/extensions/pi-intercom/broker/broker.ts +38 -141
  22. package/dist/extensions/pi-intercom/broker/client-liveness.test.ts +173 -0
  23. package/dist/extensions/pi-intercom/broker/client.ts +78 -150
  24. package/dist/extensions/pi-intercom/broker/extension-state.ts +18 -7
  25. package/dist/extensions/pi-intercom/broker/framing.ts +1 -1
  26. package/dist/extensions/pi-intercom/broker/protocol.ts +182 -0
  27. package/dist/extensions/pi-intercom/broker/spawn.test.ts +106 -7
  28. package/dist/extensions/pi-intercom/broker/spawn.ts +37 -11
  29. package/dist/extensions/pi-intercom/config.test.ts +8 -10
  30. package/dist/extensions/pi-intercom/config.ts +3 -3
  31. package/dist/extensions/pi-intercom/index.ts +218 -147
  32. package/dist/extensions/pi-intercom/intercom.integration.test.ts +891 -103
  33. package/dist/extensions/pi-intercom/package.json +3 -2
  34. package/dist/extensions/pi-intercom/project-agent.test.ts +145 -0
  35. package/dist/extensions/pi-intercom/project-agent.ts +324 -0
  36. package/dist/extensions/pi-intercom/reply-tracker.test.ts +86 -1
  37. package/dist/extensions/pi-intercom/reply-tracker.ts +41 -9
  38. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +49 -9
  39. package/dist/extensions/pi-intercom/test/inline-message.test.ts +9 -9
  40. package/dist/extensions/pi-intercom/types.ts +3 -1
  41. package/dist/extensions/pi-intercom/ui/inline-message.ts +7 -7
  42. package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +2 -2
  43. package/dist/extensions/pi-powerline-footer/CHANGELOG.md +15 -1
  44. package/dist/extensions/pi-powerline-footer/README.md +20 -37
  45. package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +40 -25
  46. package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +149 -18
  47. package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -0
  48. package/dist/extensions/pi-powerline-footer/editor-performance.ts +99 -0
  49. package/dist/extensions/pi-powerline-footer/git-status.ts +15 -0
  50. package/dist/extensions/pi-powerline-footer/index.ts +394 -586
  51. package/dist/extensions/pi-powerline-footer/package.json +5 -6
  52. package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -18
  53. package/dist/extensions/pi-powerline-footer/queue/store.ts +8 -56
  54. package/dist/extensions/pi-powerline-footer/queue/types.ts +1 -2
  55. package/dist/extensions/pi-powerline-footer/segments.ts +0 -3
  56. package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +231 -1
  57. package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +5 -19
  58. package/dist/extensions/pi-powerline-footer/tests/editor-performance.test.ts +43 -0
  59. package/dist/extensions/pi-powerline-footer/tests/fixed-editor-border.test.ts +2 -2
  60. package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
  61. package/dist/extensions/pi-powerline-footer/tests/guide.test.ts +1 -1
  62. package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +86 -19
  63. package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +19 -149
  64. package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +6 -0
  65. package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +5 -5
  66. package/dist/extensions/pi-powerline-footer/tsconfig.json +1 -1
  67. package/dist/extensions/pi-powerline-footer/types.ts +1 -2
  68. package/dist/extensions/pi-subagents/CHANGELOG.md +202 -14
  69. package/dist/extensions/pi-subagents/README.md +65 -1614
  70. package/dist/extensions/pi-subagents/agents/builder.md +0 -1
  71. package/dist/extensions/pi-subagents/agents/delegate.md +14 -0
  72. package/dist/extensions/pi-subagents/agents/oracle.md +74 -0
  73. package/dist/extensions/pi-subagents/agents/reviewer.md +78 -0
  74. package/dist/extensions/pi-subagents/agents/scout.md +50 -0
  75. package/dist/extensions/pi-subagents/agents/worker.md +58 -0
  76. package/dist/extensions/pi-subagents/docs/configuration.md +328 -0
  77. package/dist/extensions/pi-subagents/docs/extension-api.md +308 -0
  78. package/dist/extensions/pi-subagents/docs/missions.md +119 -0
  79. package/dist/extensions/pi-subagents/docs/models.md +192 -0
  80. package/dist/extensions/pi-subagents/docs/observability.md +174 -0
  81. package/dist/extensions/pi-subagents/docs/tool-reference.md +343 -0
  82. package/dist/extensions/pi-subagents/docs/watchdog.md +176 -0
  83. package/dist/extensions/pi-subagents/docs/workflows.md +163 -0
  84. package/dist/extensions/pi-subagents/inspector-runner.mjs +11 -0
  85. package/dist/extensions/pi-subagents/package-lock.json +152 -194
  86. package/dist/extensions/pi-subagents/package.json +9 -10
  87. package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
  88. package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
  89. package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
  90. package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
  91. package/dist/extensions/pi-subagents/prompts/review-loop.md +12 -12
  92. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -17
  93. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +77 -72
  94. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +177 -69
  95. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +28 -8
  96. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +88 -66
  97. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +3 -3
  98. package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +624 -0
  99. package/dist/extensions/pi-subagents/src/agents/agents.ts +29 -16
  100. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +7 -3
  101. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
  102. package/dist/extensions/pi-subagents/src/agents/skills.ts +2 -9
  103. package/dist/extensions/pi-subagents/src/api/delegation.ts +1 -2
  104. package/dist/extensions/pi-subagents/src/api/project-panes.ts +30 -0
  105. package/dist/extensions/pi-subagents/src/extension/config.ts +56 -8
  106. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
  107. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
  108. package/dist/extensions/pi-subagents/src/extension/index.ts +119 -50
  109. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +72 -0
  110. package/dist/extensions/pi-subagents/src/extension/rpc.ts +15 -15
  111. package/dist/extensions/pi-subagents/src/extension/schemas.ts +58 -21
  112. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +39 -0
  113. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +47 -25
  114. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +3 -3
  115. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +460 -64
  116. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +102 -4
  117. package/dist/extensions/pi-subagents/src/missions/actions.ts +77 -16
  118. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +162 -0
  119. package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +65 -14
  120. package/dist/extensions/pi-subagents/src/missions/store.ts +147 -5
  121. package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
  122. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +256 -0
  123. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
  124. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +42 -0
  125. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +41 -7
  126. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +294 -134
  127. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +19 -3
  128. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +39 -6
  129. package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +267 -0
  130. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +145 -60
  131. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +114 -6
  132. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +33 -0
  133. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +68 -0
  134. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +71 -0
  135. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +21 -2
  136. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +42 -14
  137. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +12 -24
  138. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +7 -5
  139. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +152 -68
  140. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -4
  141. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +146 -0
  142. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +21 -5
  143. package/dist/extensions/pi-subagents/src/runs/foreground/async-dismiss-action.ts +85 -0
  144. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +43 -18
  145. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +20 -19
  146. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +3 -0
  147. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +55 -26
  148. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
  149. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +798 -112
  150. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
  151. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +165 -22
  152. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  153. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +2 -0
  154. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +9 -5
  155. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +12 -2
  156. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +1 -0
  157. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +465 -116
  158. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
  159. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +189 -32
  160. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +2 -2
  161. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +3 -3
  162. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +128 -3
  163. package/dist/extensions/pi-subagents/src/shared/display-text.ts +100 -0
  164. package/dist/extensions/pi-subagents/src/shared/file-coalescer.ts +9 -0
  165. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +13 -0
  166. package/dist/extensions/pi-subagents/src/shared/formatters.ts +4 -6
  167. package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +51 -0
  168. package/dist/extensions/pi-subagents/src/shared/settings.ts +41 -11
  169. package/dist/extensions/pi-subagents/src/shared/types.ts +100 -3
  170. package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
  171. package/dist/extensions/pi-subagents/src/shared/utils.ts +43 -33
  172. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -14
  173. package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +1 -1
  174. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +14 -12
  175. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +176 -21
  176. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +12 -6
  177. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +52 -18
  178. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +36 -5
  179. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +30 -16
  180. package/dist/extensions/pi-subagents/src/tui/fleet.ts +151 -31
  181. package/dist/extensions/pi-subagents/src/tui/render.ts +201 -68
  182. package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +0 -6
  183. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +5 -4
  184. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +0 -1
  185. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +313 -25
  186. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +15 -15
  187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +84 -0
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/package.json +14 -0
  364. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +15 -15
  365. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +411 -300
  366. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +309 -123
  367. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +99 -56
  368. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
  369. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +159 -108
  370. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -1
  371. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +4 -2
  372. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +56 -56
  373. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +114 -45
  374. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +57 -19
  375. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +106 -106
  376. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +416 -106
  377. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +287 -17
  378. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +809 -87
  379. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +107 -20
  380. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
  381. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +26 -6
  382. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
  383. package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
  384. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +1 -1
  385. package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +0 -8
  386. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +163 -58
  387. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
  388. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
  389. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +334 -248
  390. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +52 -52
  391. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
  392. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +99 -99
  393. package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +160 -0
  394. package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
  395. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +43 -1
  396. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +36 -10
  397. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +387 -30
  398. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +9 -9
  399. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +2 -2
  400. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +94 -40
  401. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +5 -3
  402. package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +7 -7
  403. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +19 -19
  404. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +19 -19
  405. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
  406. package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
  407. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
  408. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +35 -5
  409. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
  410. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +52 -52
  411. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +187 -0
  412. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +125 -71
  413. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +18 -3
  414. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +12 -12
  415. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +17 -23
  416. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
  417. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
  418. package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
  419. package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +15 -0
  420. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +62 -44
  421. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +329 -37
  422. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -4
  423. package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +37 -0
  424. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +69 -0
  425. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +79 -2
  426. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +102 -49
  427. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +98 -32
  428. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +5 -5
  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 +55 -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 +28 -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/package-manifest.test.ts +16 -2
  440. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +7 -7
  441. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
  442. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
  443. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +26 -17
  444. package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +405 -0
  445. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +357 -92
  446. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +22 -6
  447. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +6 -6
  448. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +43 -43
  449. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
  450. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +4 -4
  451. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +19 -19
  452. package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +243 -0
  453. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +68 -168
  454. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +58 -15
  455. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +40 -0
  456. package/dist/extensions/pi-subagents/test/unit/reads-resolution.test.ts +66 -0
  457. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +47 -28
  458. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +12 -12
  459. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +57 -0
  460. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +107 -27
  461. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
  462. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +56 -50
  463. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +69 -28
  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 +59 -44
  466. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
  467. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +23 -1
  468. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +32 -5
  469. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
  470. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +120 -91
  471. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
  472. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +85 -0
  473. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
  474. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +24 -0
  475. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +312 -22
  476. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +150 -15
  477. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +26 -26
  478. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +73 -0
  479. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -25
  480. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +5 -5
  481. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +55 -6
  482. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
  483. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
  484. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
  485. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
  486. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +6 -6
  487. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +138 -11
  488. package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
  489. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +113 -0
  490. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +7 -7
  491. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +6 -6
  492. package/dist/extensions/workflow/extension.ts +21 -19
  493. package/dist/extensions/workflow/modes.ts +65 -0
  494. package/dist/index.d.ts +1 -1
  495. package/dist/main.js +1 -0
  496. package/dist/modes/interactive/components/settings-selector.d.ts +6 -2
  497. package/dist/modes/interactive/components/settings-selector.js +20 -0
  498. package/dist/modes/interactive/interactive-mode.d.ts +28 -0
  499. package/dist/modes/interactive/interactive-mode.js +214 -28
  500. package/dist/modes/interactive/theme/dark.json +1 -0
  501. package/dist/modes/interactive/theme/light.json +1 -0
  502. package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
  503. package/dist/modes/interactive/theme/theme-controller.js +10 -1
  504. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  505. package/dist/modes/interactive/theme/theme.js +24 -6
  506. package/dist/skills/pi-subagents/SKILL.md +20 -15
  507. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +77 -83
  508. package/dist/skills/pi-subagents/references/execution-controls.md +215 -106
  509. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +29 -9
  510. package/dist/skills/pi-subagents/references/prompting-and-roles.md +58 -43
  511. package/docs/keybindings.md +35 -7
  512. package/docs/plans/workflow-autoloop-reference.md +192 -0
  513. package/docs/plans/workflow-subagent-consolidation-planb.md +374 -0
  514. package/docs/plans/workflow-subagent-scripted-merge.md +406 -0
  515. package/docs/settings.md +16 -14
  516. package/docs/usage.md +5 -0
  517. package/package.json +5 -5
  518. package/dist/extensions/pi-powerline-footer/fixed-editor/cluster.ts +0 -113
  519. package/dist/extensions/pi-powerline-footer/fixed-editor/terminal-split.ts +0 -1080
  520. package/dist/extensions/pi-powerline-footer/tests/fixed-editor.test.ts +0 -1452
  521. package/dist/extensions/workflow/adapter.ts +0 -949
  522. package/dist/extensions/workflow/modes/loop.ts +0 -74
  523. package/dist/extensions/workflow/modes/prototype.ts +0 -170
  524. package/dist/extensions/workflow/modes/quicktype.ts +0 -150
  525. package/dist/extensions/workflow/modes/task.ts +0 -105
  526. package/dist/extensions/workflow/run-state.ts +0 -124
  527. package/dist/extensions/workflow/state-machine.ts +0 -484
  528. package/dist/extensions/workflow/validators.ts +0 -42
@@ -1,4 +1,4 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@selesai/code";
1
+ import { defineTool, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
2
2
  import { StringEnum } from "@earendil-works/pi-ai";
3
3
  import { randomUUID } from "crypto";
4
4
  import { Type } from "typebox";
@@ -24,12 +24,11 @@ import { ReplyTracker } from "./reply-tracker.ts";
24
24
  import { resolve as resolvePath } from "node:path";
25
25
  import { sameCwd } from "./cwd.ts";
26
26
  import { formatContextUsage } from "./format-context.ts";
27
+ import { openProjectPane, resolveTargetInCwd, waitForProjectSession, type ProjectPaneLaunch } from "./project-agent.ts";
27
28
 
28
29
  const SUBAGENT_CONTROL_INTERCOM_EVENT = "subagent:control-intercom";
29
30
  const SUBAGENT_RESULT_INTERCOM_EVENT = "subagent:result-intercom";
30
31
  const SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT = "subagent:result-intercom-delivery";
31
- const INBOUND_FLUSH_DELAY_MS = 200;
32
- const INBOUND_IDLE_RETRY_MS = 500;
33
32
  const INBOUND_MESSAGE_DEDUPE_MAX = 1000;
34
33
  const INBOUND_MESSAGE_DEDUPE_RETENTION_MS = 60 * 60 * 1000;
35
34
  const DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX = "subagent-chat";
@@ -60,6 +59,12 @@ interface InboundMessageEntry {
60
59
  bodyText: string;
61
60
  }
62
61
 
62
+ interface DeliveryTarget {
63
+ id: string;
64
+ label: string;
65
+ projectPane?: ProjectPaneLaunch;
66
+ }
67
+
63
68
  type ContactSupervisorReason = "need_decision" | "progress_update" | "interview_request";
64
69
 
65
70
  interface SupervisorInterviewQuestion extends Record<string, unknown> {
@@ -91,9 +96,9 @@ function formatAttachments(attachments: Attachment[]): string {
91
96
  let text = "";
92
97
  for (const att of attachments) {
93
98
  if (att.language) {
94
- text += `\n\n---\n📎 ${att.name}\n~~~${att.language}\n${att.content}\n~~~`;
99
+ text += `\n\n---\nAttachment: ${att.name}\n~~~${att.language}\n${att.content}\n~~~`;
95
100
  } else {
96
- text += `\n\n---\n📎 ${att.name}\n${att.content}`;
101
+ text += `\n\n---\nAttachment: ${att.name}\n${att.content}`;
97
102
  }
98
103
  }
99
104
  return text;
@@ -379,8 +384,26 @@ function duplicateSessionNames(sessions: SessionInfo[]): Set<string> {
379
384
  .filter((name, index, names) => names.indexOf(name) !== index)
380
385
  );
381
386
  }
382
- function shortSessionId(sessionId: string): string {
383
- return sessionId.slice(0, 8);
387
+ function sessionIdPrefixes(sessions: SessionInfo[]): Map<string, string> {
388
+ const prefixes = new Map<string, string>();
389
+ for (const session of sessions) {
390
+ let longestSharedPrefix = 0;
391
+ for (const other of sessions) {
392
+ if (other.id === session.id) {
393
+ continue;
394
+ }
395
+ let length = 0;
396
+ while (length < session.id.length && session.id[length] === other.id[length]) {
397
+ length += 1;
398
+ }
399
+ longestSharedPrefix = Math.max(longestSharedPrefix, length);
400
+ }
401
+ const minimumLength = Math.max(8, longestSharedPrefix + 1);
402
+ const groupBoundary = session.id.indexOf("-", minimumLength);
403
+ const length = groupBoundary === -1 ? minimumLength : groupBoundary;
404
+ prefixes.set(session.id, session.id.slice(0, length));
405
+ }
406
+ return prefixes;
384
407
  }
385
408
  function parseSubagentIntercomPayload(payload: unknown): { to: string; message: string; requestId?: string } | null {
386
409
  if (typeof payload !== "object" || payload === null) {
@@ -399,11 +422,13 @@ function resolveIntercomPresenceName(sessionName: string | undefined, sessionId:
399
422
  return trimmedName;
400
423
  }
401
424
  const normalizedSessionId = sessionId.startsWith("session-") ? sessionId.slice("session-".length) : sessionId;
402
- return `${DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX}-${normalizedSessionId.slice(0, 8)}`;
425
+ return `${DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX}-${normalizedSessionId.slice(0, 18)}`;
403
426
  }
404
- function buildPresenceIdentity(pi: ExtensionAPI, sessionId: string): { name: string } {
427
+ function buildPresenceIdentity(pi: ExtensionAPI, sessionId: string): { name: string; runtimeFallbackAlias: boolean } {
428
+ const sessionName = pi.getSessionName();
405
429
  return {
406
- name: resolveIntercomPresenceName(pi.getSessionName(), sessionId),
430
+ name: resolveIntercomPresenceName(sessionName, sessionId),
431
+ runtimeFallbackAlias: !sessionName?.trim(),
407
432
  };
408
433
  }
409
434
  function resolveConfiguredIntercomSessionId(piSessionId: string, config: IntercomConfig): string {
@@ -417,15 +442,15 @@ function formatSessionLabel(session: SessionInfo, duplicates: Set<string>): stri
417
442
  return session.id;
418
443
  }
419
444
  return duplicates.has(session.name.toLowerCase())
420
- ? `${session.name} (${shortSessionId(session.id)})`
445
+ ? `${session.name} (${session.id.slice(0, 8)})`
421
446
  : session.name;
422
447
  }
423
- function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean): string {
448
+ function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean, idPrefix: string): string {
424
449
  const name = session.name || "Unnamed session";
425
450
  const tags = [isSelf ? "self" : session.cwd === currentCwd ? "same cwd" : undefined, session.status]
426
451
  .filter((tag): tag is string => Boolean(tag));
427
452
  const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
428
- return `• ${name} (${shortSessionId(session.id)}) — ${session.cwd} (${session.model}${formatContextUsage(session)})${suffix}`;
453
+ return `• ${name} (${idPrefix}) — ${session.cwd} (${session.model}${formatContextUsage(session)})${suffix}`;
429
454
  }
430
455
  function previewText(value: unknown, maxLength = 72): string | undefined {
431
456
  if (typeof value !== "string") {
@@ -486,6 +511,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
486
511
  let reconnectTimer: NodeJS.Timeout | null = null;
487
512
  let namePollTimer: NodeJS.Timeout | null = null;
488
513
  let lastPresenceName: string | null = null;
514
+ let lastPresenceRuntimeFallbackAlias: boolean | null = null;
489
515
  const previousIntercomSessionId = process.env[INTERCOM_SESSION_ID_ENV];
490
516
  let reconnectPromise: Promise<IntercomClient> | null = null;
491
517
  let reconnectPromiseGeneration: number | null = null;
@@ -498,19 +524,10 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
498
524
  let agentRunning = false;
499
525
  const activeTools = new Map<string, string>();
500
526
  const replyTracker = new ReplyTracker();
501
- const pendingIdleMessages: InboundMessageEntry[] = [];
502
527
  const seenInboundMessages = new Map<string, number>();
503
528
  const latestOutboundReceipts = new Map<string, { status: MessageReceiptStatus; timestamp: number; detail?: string }>();
504
529
  function dismissIncomingAsk(messageId: string): void {
505
530
  replyTracker.dismissPendingAsk(messageId);
506
- const queuedIndex = pendingIdleMessages.findIndex((entry) => entry.message.id === messageId);
507
- if (queuedIndex >= 0) pendingIdleMessages.splice(queuedIndex, 1);
508
- }
509
- function expirePendingIdleMessages(detail: string): void {
510
- for (const entry of pendingIdleMessages) {
511
- emitMessageReceipt(entry.message.id, "expired", detail);
512
- }
513
- pendingIdleMessages.length = 0;
514
531
  }
515
532
  function hasSeenInboundMessage(from: SessionInfo, message: Message, now = Date.now()): boolean {
516
533
  for (const [key, seenAt] of seenInboundMessages) {
@@ -543,22 +560,11 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
543
560
  }
544
561
  }
545
562
  function handleMessageControl(control: MessageControl): void {
546
- const queuedIndex = pendingIdleMessages.findIndex((entry) => entry.message.id === control.messageId);
563
+ replyTracker.dismissPendingAsk(control.messageId);
547
564
  if (control.action === "cancel") {
548
- if (queuedIndex >= 0) {
549
- pendingIdleMessages.splice(queuedIndex, 1);
550
- replyTracker.dismissPendingAsk(control.messageId);
551
- emitMessageReceipt(control.messageId, "cancelled", "cancelled before injection");
552
- } else {
553
- emitMessageReceipt(control.messageId, "cancellation_requested", "message was not queued; it may already be injected or processed");
554
- }
565
+ emitMessageReceipt(control.messageId, "cancellation_requested", "message may already be injected or processed");
555
566
  return;
556
567
  }
557
-
558
- if (queuedIndex >= 0) {
559
- pendingIdleMessages.splice(queuedIndex, 1);
560
- }
561
- replyTracker.dismissPendingAsk(control.messageId);
562
568
  emitMessageReceipt(control.messageId, "superseded", control.supersededBy ? `superseded by ${control.supersededBy}` : undefined);
563
569
  }
564
570
  function latestDeliveryState(messageId: string | null, fallback: string): string {
@@ -568,7 +574,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
568
574
  const receipt = latestOutboundReceipts.get(messageId);
569
575
  return receipt ? receipt.status : fallback;
570
576
  }
571
- let inboundFlushTimer: NodeJS.Timeout | null = null;
572
577
  let replyWaiter: {
573
578
  from: string;
574
579
  replyTo: string;
@@ -638,13 +643,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
638
643
  clearInterval(namePollTimer);
639
644
  namePollTimer = null;
640
645
  }
641
- function clearInboundFlushTimer(): void {
642
- if (!inboundFlushTimer) {
643
- return;
644
- }
645
- clearTimeout(inboundFlushTimer);
646
- inboundFlushTimer = null;
647
- }
648
646
  function getLiveContext(ctx: ExtensionContext | null = runtimeContext, generation = runtimeGeneration): ExtensionContext | null {
649
647
  if (disposed || shuttingDown || generation !== runtimeGeneration || !ctx) {
650
648
  return null;
@@ -773,7 +771,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
773
771
 
774
772
  const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId);
775
773
  return {
776
- name: identity.name,
774
+ ...identity,
777
775
  cwd: liveContext.cwd,
778
776
  model: currentModel,
779
777
  pid: process.pid,
@@ -813,17 +811,20 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
813
811
  }
814
812
  const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? sessionId);
815
813
  lastPresenceName = identity.name;
814
+ lastPresenceRuntimeFallbackAlias = identity.runtimeFallbackAlias;
816
815
  client.updatePresence({ ...identity, status: currentStatus(), ...currentContextUsage() });
817
816
  }
818
817
  function startNamePoll(): void {
819
818
  clearNamePollTimer();
820
- lastPresenceName = currentSessionId ? buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId).name : null;
819
+ const initialIdentity = currentSessionId ? buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId) : null;
820
+ lastPresenceName = initialIdentity?.name ?? null;
821
+ lastPresenceRuntimeFallbackAlias = initialIdentity?.runtimeFallbackAlias ?? null;
821
822
  namePollTimer = setInterval(() => {
822
823
  if (!currentSessionId || !getLiveContext()) {
823
824
  return;
824
825
  }
825
826
  const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId);
826
- if (identity.name !== lastPresenceName) {
827
+ if (identity.name !== lastPresenceName || identity.runtimeFallbackAlias !== lastPresenceRuntimeFallbackAlias) {
827
828
  syncPresenceIdentity(currentSessionId);
828
829
  }
829
830
  }, getNamePollMs());
@@ -872,73 +873,32 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
872
873
  }
873
874
  return false;
874
875
  }
875
- function sendIncomingMessage(entry: InboundMessageEntry, delivery: "trigger" | "followUp", generation = runtimeGeneration, forceTrigger = false): void {
876
+ function sendIncomingMessage(entry: InboundMessageEntry, delivery: "trigger" | "steer", generation = runtimeGeneration, forceTrigger = false): void {
876
877
  if (runtimeStarted && !getLiveContext(runtimeContext, generation)) {
877
878
  return;
878
879
  }
879
880
  const injectedMessage = { ...entry.message, injectedAt: Date.now() };
880
881
  emitMessageReceipt(injectedMessage.id, "injected");
881
- const deliveredEntry = { ...entry, message: injectedMessage };
882
- if (delivery !== "followUp") {
883
- replyTracker.queueTurnContext({ from: entry.from, message: injectedMessage, receivedAt: Date.now() });
884
- }
882
+ const replyCommand = delivery === "steer" && entry.replyCommand && entry.message.expectsReply
883
+ ? `intercom({ action: "reply", replyTo: ${JSON.stringify(entry.message.id)}, message: "..." })`
884
+ : entry.replyCommand;
885
+ const deliveredEntry = { ...entry, message: injectedMessage, replyCommand };
886
+ replyTracker.queueTurnContext({ from: entry.from, message: injectedMessage, receivedAt: Date.now() });
885
887
  const senderDisplay = entry.from.name || entry.from.id.slice(0, 8);
886
- const replyInstruction = entry.replyCommand ? `\n\nTo reply, use the intercom tool: ${entry.replyCommand}` : "";
888
+ const replyInstruction = replyCommand ? `\n\nTo reply, use the intercom tool: ${replyCommand}` : "";
887
889
  const deliveryMetadata = formatInboundDeliveryMetadata(injectedMessage);
888
890
  pi.sendMessage(
889
891
  {
890
892
  customType: "intercom_message",
891
- content: `**📨 From ${senderDisplay}** (${entry.from.cwd})${replyInstruction}\n\n_${deliveryMetadata}_\n\n${entry.bodyText}`,
893
+ content: `**From ${senderDisplay}** (${entry.from.cwd})${replyInstruction}\n\n_${deliveryMetadata}_\n\n${entry.bodyText}`,
892
894
  display: true,
893
895
  details: deliveredEntry,
894
896
  },
895
897
  delivery === "trigger" && shouldTriggerInboundMessage(entry, forceTrigger)
896
898
  ? { triggerTurn: true }
897
- : { deliverAs: "followUp" }
899
+ : { deliverAs: "steer" }
898
900
  );
899
901
  }
900
- function scheduleInboundFlush(delayMs = INBOUND_FLUSH_DELAY_MS): void {
901
- if (!getLiveContext()) {
902
- return;
903
- }
904
- const scheduledGeneration = runtimeGeneration;
905
- clearInboundFlushTimer();
906
- inboundFlushTimer = setTimeout(() => {
907
- inboundFlushTimer = null;
908
- flushIdleMessages(scheduledGeneration);
909
- }, delayMs);
910
- }
911
- function flushIdleMessages(generation = runtimeGeneration): void {
912
- if (pendingIdleMessages.length === 0) {
913
- return;
914
- }
915
- const ctx = getLiveContext(runtimeContext, generation);
916
- if (!ctx) {
917
- return;
918
- }
919
-
920
- let isIdle: boolean;
921
- try {
922
- isIdle = ctx.isIdle();
923
- } catch {
924
- // Stale contexts are cleaned up by shutdown/reload; do not deliver queued messages through them.
925
- return;
926
- }
927
- if (!isIdle) {
928
- scheduleInboundFlush(INBOUND_IDLE_RETRY_MS);
929
- return;
930
- }
931
-
932
- const entries = pendingIdleMessages.splice(0, pendingIdleMessages.length);
933
- entries.forEach((entry, index) => {
934
- sendIncomingMessage(entry, index === 0 ? "trigger" : "followUp");
935
- });
936
- }
937
- function queueIdleMessage(entry: InboundMessageEntry): void {
938
- pendingIdleMessages.push(entry);
939
- emitMessageReceipt(entry.message.id, "queued");
940
- scheduleInboundFlush();
941
- }
942
902
  function handleIncomingMessage(ctx: ExtensionContext, from: SessionInfo, message: Message): void {
943
903
  const messageGeneration = runtimeGeneration;
944
904
  const liveContext = getLiveContext(ctx, messageGeneration);
@@ -996,7 +956,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
996
956
  }
997
957
  return;
998
958
  }
999
- queueIdleMessage(entry);
959
+ sendIncomingMessage(entry, "steer");
1000
960
  return;
1001
961
  }
1002
962
  if (getLiveContext(liveContext, messageGeneration)) {
@@ -1186,7 +1146,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1186
1146
  const lowerName = nameOrId.toLowerCase();
1187
1147
  const byName = sessions.filter(s => s.name?.toLowerCase() === lowerName);
1188
1148
  if (byName.length > 1) {
1189
- const ids = byName.map(s => shortSessionId(s.id)).join(", ");
1149
+ const prefixes = sessionIdPrefixes(sessions);
1150
+ const ids = byName.map((session) => prefixes.get(session.id)!).join(", ");
1190
1151
  throw new Error(`Multiple sessions named "${nameOrId}" are connected. Address one by the id shown in parentheses by "list" (${ids}).`);
1191
1152
  }
1192
1153
  if (byName.length === 1) {
@@ -1202,14 +1163,58 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1202
1163
  }
1203
1164
  return null;
1204
1165
  }
1205
- async function resolveSupervisorTarget(activeClient: IntercomClient, metadata: ChildOrchestratorMetadata): Promise<string> {
1166
+ async function resolveSupervisorTarget(activeClient: IntercomClient, metadata: ChildOrchestratorMetadata): Promise<string | null> {
1206
1167
  if (metadata.orchestratorSessionId) {
1207
1168
  const bySessionId = await resolveSessionTarget(activeClient, metadata.orchestratorSessionId);
1208
1169
  if (bySessionId) {
1209
1170
  return bySessionId;
1210
1171
  }
1211
1172
  }
1212
- return await resolveSessionTarget(activeClient, metadata.orchestratorTarget) ?? metadata.orchestratorTarget;
1173
+ return resolveSessionTarget(activeClient, metadata.orchestratorTarget);
1174
+ }
1175
+ async function resolveCwdDeliveryTarget(activeClient: IntercomClient, options: {
1176
+ to?: string;
1177
+ cwd: string;
1178
+ openProjectPaneIfMissing?: boolean;
1179
+ focus?: boolean;
1180
+ signal?: AbortSignal;
1181
+ }): Promise<DeliveryTarget> {
1182
+ const sessions = await activeClient.listSessions();
1183
+ const currentSessionId = activeClient.sessionId;
1184
+ if (!currentSessionId) {
1185
+ throw new Error("Current session is not registered with intercom.");
1186
+ }
1187
+ const currentSession = sessions.find((session) => session.id === currentSessionId);
1188
+ if (!currentSession) {
1189
+ throw new Error("Current session is missing from intercom session list.");
1190
+ }
1191
+
1192
+ const targetCwd = options.cwd && options.cwd !== "."
1193
+ ? resolvePath(currentSession.cwd, options.cwd)
1194
+ : currentSession.cwd;
1195
+ const existing = resolveTargetInCwd({
1196
+ sessions,
1197
+ currentSessionId,
1198
+ targetCwd,
1199
+ ...(options.to ? { to: options.to } : {}),
1200
+ });
1201
+ if (existing.kind === "found" && existing.session) {
1202
+ return { id: existing.session.id, label: options.to || existing.session.name || existing.session.id };
1203
+ }
1204
+ if (!options.openProjectPaneIfMissing) {
1205
+ throw new Error(`${existing.reason ?? `No intercom session is connected in ${targetCwd}.`} Pass openProjectPaneIfMissing: true to open a Herdr project pane and start Pi there.`);
1206
+ }
1207
+
1208
+ const beforeSessionIds = new Set(sessions.map((session) => session.id));
1209
+ const projectPane = await openProjectPane({ cwd: targetCwd, focus: options.focus, signal: options.signal });
1210
+ const session = await waitForProjectSession(activeClient, {
1211
+ projectRoot: projectPane.projectRoot,
1212
+ currentSessionId,
1213
+ beforeSessionIds,
1214
+ ...(options.to ? { to: options.to } : {}),
1215
+ signal: options.signal,
1216
+ });
1217
+ return { id: session.id, label: session.name || session.id, projectPane };
1213
1218
  }
1214
1219
  function deliverLocalSubagentRelayMessage(sender: "subagent-control" | "subagent-result", status: string, messageText: string): void {
1215
1220
  const liveContext = getLiveContext();
@@ -1251,10 +1256,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1251
1256
  clearReconnectTimer();
1252
1257
  clearStartupConnectTimer();
1253
1258
  clearNamePollTimer();
1254
- clearInboundFlushTimer();
1255
1259
  rejectReplyWaiter(new Error("Session replaced"));
1256
1260
  replyTracker.reset();
1257
- expirePendingIdleMessages("receiver session replaced before injection");
1258
1261
  if (previousClient) {
1259
1262
  client = null;
1260
1263
  void previousClient.disconnect().catch(() => undefined);
@@ -1265,7 +1268,9 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1265
1268
  publishIntercomSessionId(currentIntercomSessionId);
1266
1269
  currentModel = ctx.model?.id ?? "unknown";
1267
1270
  sessionStartedAt = Date.now();
1268
- lastPresenceName = buildPresenceIdentity(pi, currentIntercomSessionId).name;
1271
+ const initialPresenceIdentity = buildPresenceIdentity(pi, currentIntercomSessionId);
1272
+ lastPresenceName = initialPresenceIdentity.name;
1273
+ lastPresenceRuntimeFallbackAlias = initialPresenceIdentity.runtimeFallbackAlias;
1269
1274
  agentRunning = false;
1270
1275
  activeTools.clear();
1271
1276
  startNamePoll();
@@ -1400,8 +1405,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1400
1405
  restoreIntercomSessionId();
1401
1406
  rejectReplyWaiter(new Error("Session shutting down"));
1402
1407
  replyTracker.reset();
1403
- expirePendingIdleMessages("receiver session shut down before injection");
1404
- clearInboundFlushTimer();
1405
1408
  agentRunning = false;
1406
1409
  activeTools.clear();
1407
1410
  if (client) {
@@ -1418,7 +1421,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1418
1421
  return;
1419
1422
  }
1420
1423
  replyTracker.endTurn();
1421
- scheduleInboundFlush(0);
1422
1424
  });
1423
1425
  pi.on("agent_start", () => {
1424
1426
  if (!getLiveContext()) {
@@ -1449,7 +1451,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1449
1451
  agentRunning = false;
1450
1452
  activeTools.clear();
1451
1453
  syncPresenceStatus();
1452
- scheduleInboundFlush(0);
1453
1454
  });
1454
1455
  pi.on("turn_start", (_event, ctx) => {
1455
1456
  const sessionId = ctx.sessionManager.getSessionId();
@@ -1471,9 +1472,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1471
1472
  if (!getLiveContext(ctx)) {
1472
1473
  return;
1473
1474
  }
1474
- const sessionId = ctx.sessionManager.getSessionId();
1475
- currentSessionId = sessionId;
1476
- syncPresenceIdentity(sessionId);
1475
+ currentSessionId = ctx.sessionManager.getSessionId();
1476
+ syncPresenceIdentity(ctx.sessionManager.getSessionId());
1477
1477
  });
1478
1478
  pi.on("model_select", (event, ctx) => {
1479
1479
  if (!getLiveContext(ctx)) {
@@ -1512,7 +1512,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1512
1512
  const childOrchestratorMetadata = readChildOrchestratorMetadata();
1513
1513
  const nativeSupervisorChannelAvailable = Boolean(process.env[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV]?.trim());
1514
1514
  if (childOrchestratorMetadata && !nativeSupervisorChannelAvailable) {
1515
- pi.registerTool({
1515
+ pi.registerTool(defineTool({
1516
1516
  name: "contact_supervisor",
1517
1517
  label: "Contact Supervisor",
1518
1518
  description: "Subagent-only tool for contacting the supervisor agent that delegated this task. Use need_decision when blocked, uncertain, needing approval, or facing a product/API/scope decision before continuing; this waits for the supervisor's reply. Use interview_request when multiple structured questions need supervisor answers; this also waits for a reply. Use progress_update only for meaningful progress or unexpected discoveries that change the plan; this does not wait for a reply. Do not use for routine completion handoffs.",
@@ -1589,15 +1589,22 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1589
1589
  }
1590
1590
 
1591
1591
  const metadata = childOrchestratorMetadata;
1592
- let sendTo: string;
1592
+ let resolvedSupervisor: string | null;
1593
1593
  try {
1594
- sendTo = await resolveSupervisorTarget(connectedClient, metadata);
1594
+ resolvedSupervisor = await resolveSupervisorTarget(connectedClient, metadata);
1595
1595
  } catch (error) {
1596
1596
  return {
1597
1597
  content: [{ type: "text", text: `Failed to resolve supervisor target: ${getErrorMessage(error)}` }],
1598
1598
  details: { error: true },
1599
1599
  };
1600
1600
  }
1601
+ if (!resolvedSupervisor && reason !== "progress_update") {
1602
+ return {
1603
+ content: [{ type: "text", text: `Supervisor "${metadata.orchestratorTarget}" is not currently connected. Blocking requests are not queued; use a progress update or retry after the supervisor reconnects.` }],
1604
+ details: { error: true },
1605
+ };
1606
+ }
1607
+ const sendTo = resolvedSupervisor ?? metadata.orchestratorTarget;
1601
1608
  if (signal?.aborted) {
1602
1609
  return {
1603
1610
  content: [{ type: "text", text: "Cancelled" }],
@@ -1773,10 +1780,10 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1773
1780
  }
1774
1781
  return new Text(text, 0, 0);
1775
1782
  },
1776
- } as any);
1783
+ }));
1777
1784
  }
1778
1785
 
1779
- pi.registerTool({
1786
+ pi.registerTool(defineTool({
1780
1787
  name: "intercom",
1781
1788
  label: "Intercom",
1782
1789
  description: `Send a message to another Selesai session running on this machine.
@@ -1791,6 +1798,7 @@ Usage:
1791
1798
  intercom({ action: "list-cwd" }) → List sessions in the current working directory
1792
1799
  intercom({ action: "list-cwd", cwd: "/path" }) → List sessions in a specific directory
1793
1800
  intercom({ action: "send", to: "name-or-id", message: "..." }) → Send message
1801
+ intercom({ action: "send", cwd: "/path", openProjectPaneIfMissing: true, message: "..." }) → Open a visible Herdr project pane when needed, then send
1794
1802
  intercom({ action: "ask", to: "name-or-id", message: "..." }) → Ask and wait for reply
1795
1803
  intercom({ action: "cancel", messageId: "..." }) → Request cancellation of a sent message
1796
1804
  intercom({ action: "reply", message: "..." }) → Reply to the active/single pending ask
@@ -1804,7 +1812,7 @@ Usage:
1804
1812
  description: "Action: 'list', 'list-cwd', 'send', 'ask', 'reply', 'pending', 'status', or 'cancel'",
1805
1813
  }),
1806
1814
  to: Type.Optional(Type.String({
1807
- description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For 'send', 'ask', or disambiguating 'reply'.",
1815
+ description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For send/ask with cwd, omit to target the sole live session in that cwd or the newly opened project-pane session. For 'reply', disambiguates the pending ask.",
1808
1816
  })),
1809
1817
  message: Type.Optional(Type.String({
1810
1818
  description: "Message to send (for 'send', 'ask', or 'reply' action)",
@@ -1828,7 +1836,13 @@ Usage:
1828
1836
  description: "Previous message ID this send/ask is a user-authored retry of. Retries always send a new message ID.",
1829
1837
  })),
1830
1838
  cwd: Type.Optional(Type.String({
1831
- description: "Working directory filter for 'list-cwd' (absolute, or relative to the current session's cwd; '.' means the current cwd). Defaults to the current session's cwd.",
1839
+ description: "Working directory filter for 'list-cwd'. For send/ask, scopes target lookup to that directory; omit 'to' to target the sole live peer there. Absolute, or relative to the current session's cwd; '.' means the current cwd.",
1840
+ })),
1841
+ openProjectPaneIfMissing: Type.Optional(Type.Boolean({
1842
+ description: "For send/ask with cwd, open a visible Herdr project pane and launch Pi there when no matching live session is connected.",
1843
+ })),
1844
+ focus: Type.Optional(Type.Boolean({
1845
+ description: "For openProjectPaneIfMissing, focus the new Herdr pane. Defaults to true.",
1832
1846
  })),
1833
1847
  }),
1834
1848
 
@@ -1845,7 +1859,7 @@ Usage:
1845
1859
 
1846
1860
  syncPresenceIdentity(ctx.sessionManager.getSessionId());
1847
1861
 
1848
- const { action, to, message, attachments, replyTo, messageId, supersedes, retryOf, cwd } = params;
1862
+ const { action, to, message, attachments, replyTo, messageId, supersedes, retryOf, cwd, openProjectPaneIfMissing, focus } = params;
1849
1863
 
1850
1864
  switch (action) {
1851
1865
  case "list": {
@@ -1862,10 +1876,11 @@ Usage:
1862
1876
  };
1863
1877
  }
1864
1878
 
1865
- const currentSection = `**Current session:**\n${formatSessionListRow(currentSession, currentSession.cwd, true)}`;
1879
+ const prefixes = sessionIdPrefixes(sessions);
1880
+ const currentSection = `**Current session:**\n${formatSessionListRow(currentSession, currentSession.cwd, true, prefixes.get(currentSession.id)!)}`;
1866
1881
  const otherSection = otherSessions.length === 0
1867
1882
  ? "**Other sessions:**\nNo other sessions connected."
1868
- : `**Other sessions:**\n${otherSessions.map(s => formatSessionListRow(s, currentSession.cwd, false)).join("\n")}`;
1883
+ : `**Other sessions:**\n${otherSessions.map((session) => formatSessionListRow(session, currentSession.cwd, false, prefixes.get(session.id)!)).join("\n")}`;
1869
1884
 
1870
1885
  return {
1871
1886
  content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
@@ -1915,10 +1930,11 @@ Usage:
1915
1930
  }
1916
1931
  }
1917
1932
 
1918
- const currentSection = `**Current session:**\n${formatSessionListRow(currentSession, currentSession.cwd, true)}`;
1933
+ const prefixes = sessionIdPrefixes(sessions);
1934
+ const currentSection = `**Current session:**\n${formatSessionListRow(currentSession, currentSession.cwd, true, prefixes.get(currentSession.id)!)}`;
1919
1935
  const otherSection = otherSessions.length === 0
1920
1936
  ? `**Other sessions (cwd: ${filterCwd}):**\n${emptyNote}`
1921
- : `**Other sessions (cwd: ${filterCwd}):**\n${otherSessions.map(s => formatSessionListRow(s, currentSession.cwd, false)).join("\n")}`;
1937
+ : `**Other sessions (cwd: ${filterCwd}):**\n${otherSessions.map((session) => formatSessionListRow(session, currentSession.cwd, false, prefixes.get(session.id)!)).join("\n")}`;
1922
1938
 
1923
1939
  return {
1924
1940
  content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
@@ -1961,25 +1977,50 @@ Usage:
1961
1977
  }
1962
1978
 
1963
1979
  case "send": {
1964
- if (!to || !message) {
1980
+ if ((!to && !cwd) || !message) {
1965
1981
  return {
1966
- content: [{ type: "text", text: "Missing 'to' or 'message' parameter" }],
1982
+ content: [{ type: "text", text: "Missing 'to' or 'cwd', or missing 'message' parameter" }],
1967
1983
  details: { error: true },
1968
1984
  };
1969
1985
  }
1970
1986
  try {
1971
- const sendTo = await resolveSessionTarget(connectedClient, to) ?? to;
1987
+ if (openProjectPaneIfMissing && !cwd) {
1988
+ return {
1989
+ content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
1990
+ details: { error: true },
1991
+ };
1992
+ }
1993
+ const confirmSend = !replyTo && config.confirmSend && ctx.hasUI;
1994
+ const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
1995
+ if (confirmSend && cwd && openProjectPaneIfMissing) {
1996
+ const confirmed = await ctx.ui.confirm(
1997
+ "Send message",
1998
+ `Send to "${to ?? cwd}":\n\n${message}${attachmentText}`,
1999
+ );
2000
+ if (!confirmed) {
2001
+ return {
2002
+ content: [{ type: "text", text: "Message cancelled by user" }],
2003
+ details: {},
2004
+ };
2005
+ }
2006
+ }
2007
+ const target: DeliveryTarget = cwd
2008
+ ? await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal: _signal })
2009
+ : { id: await resolveSessionTarget(connectedClient, to) ?? to, label: to };
2010
+ const sendTo = target.id;
2011
+ const targetDisplay = target.projectPane ? target.label : to ?? target.label;
1972
2012
  if (sendTo === connectedClient.sessionId) {
1973
2013
  return {
1974
2014
  content: [{ type: "text", text: "Cannot message the current session" }],
1975
2015
  details: { error: true },
1976
2016
  };
1977
2017
  }
1978
- if (!replyTo && config.confirmSend && ctx.hasUI) {
1979
- const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
2018
+ const inferredAsk = replyTo ? null : replyTracker.findUniquePendingAskFrom(sendTo);
2019
+ const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
2020
+ if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
1980
2021
  const confirmed = await ctx.ui.confirm(
1981
- "Send Message",
1982
- `Send to "${to}":\n\n${message}${attachmentText}`,
2022
+ "Send message",
2023
+ `Send to "${targetDisplay}":\n\n${message}${attachmentText}`,
1983
2024
  );
1984
2025
  if (!confirmed) {
1985
2026
  return {
@@ -1991,29 +2032,39 @@ Usage:
1991
2032
  const result = await connectedClient.send(sendTo, {
1992
2033
  text: message,
1993
2034
  attachments,
1994
- replyTo,
2035
+ replyTo: effectiveReplyTo,
1995
2036
  supersedes,
1996
2037
  retryOf,
1997
2038
  });
1998
2039
  if (!result.delivered) {
1999
2040
  const errorText = result.reason ?? "Session may not exist or has disconnected.";
2000
2041
  return {
2001
- content: [{ type: "text", text: `Message to "${to}" was not delivered: ${errorText}` }],
2042
+ content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
2002
2043
  details: { messageId: result.id, delivered: false, reason: result.reason },
2003
2044
  };
2004
2045
  }
2005
2046
  pi.appendEntry("intercom_sent", {
2006
- to,
2007
- message: { text: message, attachments, replyTo, supersedes, retryOf },
2047
+ to: targetDisplay,
2048
+ message: { text: message, attachments, replyTo: effectiveReplyTo, supersedes, retryOf },
2008
2049
  messageId: result.id,
2009
2050
  timestamp: Date.now(),
2010
2051
  });
2011
- if (replyTo) {
2012
- dismissIncomingAsk(replyTo);
2052
+ if (effectiveReplyTo) {
2053
+ dismissIncomingAsk(effectiveReplyTo);
2013
2054
  }
2014
2055
  return {
2015
- content: [{ type: "text", text: `Message sent to ${to}` }],
2016
- details: { messageId: result.id, delivered: true },
2056
+ content: [{
2057
+ type: "text",
2058
+ text: target.projectPane
2059
+ ? `Opened Herdr project pane ${target.projectPane.paneId} for ${target.projectPane.projectRoot} and sent message to ${targetDisplay}`
2060
+ : inferredAsk ? `Reply sent to ${targetDisplay} (inferred from pending ask)` : `Message sent to ${targetDisplay}`,
2061
+ }],
2062
+ details: {
2063
+ messageId: result.id,
2064
+ delivered: true,
2065
+ ...(effectiveReplyTo ? { replyTo: effectiveReplyTo } : {}),
2066
+ ...(target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {}),
2067
+ },
2017
2068
  };
2018
2069
  } catch (error) {
2019
2070
  return {
@@ -2024,9 +2075,9 @@ Usage:
2024
2075
  }
2025
2076
 
2026
2077
  case "ask": {
2027
- if (!to || !message) {
2078
+ if ((!to && !cwd) || !message) {
2028
2079
  return {
2029
- content: [{ type: "text", text: "Missing 'to' or 'message' parameter" }],
2080
+ content: [{ type: "text", text: "Missing 'to' or 'cwd', or missing 'message' parameter" }],
2030
2081
  details: { error: true },
2031
2082
  };
2032
2083
  }
@@ -2049,7 +2100,27 @@ Usage:
2049
2100
  let questionId: string | null = null;
2050
2101
 
2051
2102
  try {
2052
- const sendTo = await resolveSessionTarget(connectedClient, to) ?? to;
2103
+ if (openProjectPaneIfMissing && !cwd) {
2104
+ return {
2105
+ content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
2106
+ details: { error: true },
2107
+ };
2108
+ }
2109
+ let target: DeliveryTarget;
2110
+ if (cwd) {
2111
+ target = await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal: _signal });
2112
+ } else {
2113
+ const resolved = await resolveSessionTarget(connectedClient, to);
2114
+ if (!resolved) {
2115
+ return {
2116
+ content: [{ type: "text", text: `Session "${to}" is not currently connected. Blocking asks are not queued; use send for a non-blocking mailbox delivery or retry after the session reconnects.` }],
2117
+ details: { error: true },
2118
+ };
2119
+ }
2120
+ target = { id: resolved, label: to };
2121
+ }
2122
+ const sendTo = target.id;
2123
+ const targetDisplay = target.projectPane ? target.label : to ?? target.label;
2053
2124
  if (_signal?.aborted) {
2054
2125
  return {
2055
2126
  content: [{ type: "text", text: "Cancelled" }],
@@ -2084,7 +2155,7 @@ Usage:
2084
2155
  deliveryState = sendResult.delivered ? "socket_delivered" : "delivery_failed";
2085
2156
  if (!sendResult.delivered) {
2086
2157
  const errorText = sendResult.reason ?? "Session may not exist or has disconnected.";
2087
- rejectReplyWaiter(new Error(`Message to "${to}" was not delivered: ${errorText}`));
2158
+ rejectReplyWaiter(new Error(`Message to "${targetDisplay}" was not delivered: ${errorText}`));
2088
2159
  if (replyPromise) {
2089
2160
  try {
2090
2161
  await replyPromise;
@@ -2093,12 +2164,12 @@ Usage:
2093
2164
  }
2094
2165
  }
2095
2166
  return {
2096
- content: [{ type: "text", text: `Message to "${to}" was not delivered: ${errorText}` }],
2167
+ content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
2097
2168
  details: { error: true },
2098
2169
  };
2099
2170
  }
2100
2171
  pi.appendEntry("intercom_sent", {
2101
- to,
2172
+ to: targetDisplay,
2102
2173
  message: { text: message, attachments, replyTo, supersedes, retryOf },
2103
2174
  messageId: sendResult.id,
2104
2175
  timestamp: Date.now(),
@@ -2109,14 +2180,14 @@ Usage:
2109
2180
  ? formatAttachments(replyMessage.content.attachments)
2110
2181
  : "";
2111
2182
  pi.appendEntry("intercom_received", {
2112
- from: to,
2183
+ from: targetDisplay,
2113
2184
  message: { text: replyText, attachments: replyMessage.content.attachments },
2114
2185
  messageId: replyMessage.id,
2115
2186
  timestamp: replyMessage.timestamp,
2116
2187
  });
2117
2188
  return {
2118
- content: [{ type: "text", text: `**Reply from ${to}:**\n${replyText}${replyAttachments}` }],
2119
- details: {},
2189
+ content: [{ type: "text", text: `**Reply from ${targetDisplay}:**\n${replyText}${replyAttachments}` }],
2190
+ details: target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {},
2120
2191
  };
2121
2192
  } catch (error) {
2122
2193
  rejectReplyWaiter(toError(error));
@@ -2264,7 +2335,7 @@ Usage:
2264
2335
  }
2265
2336
  return new Text(text, 0, 0);
2266
2337
  },
2267
- } as any);
2338
+ }));
2268
2339
 
2269
2340
  function insertIntoEditor(ctx: ExtensionContext, text: string): boolean {
2270
2341
  if (!ctx.hasUI) return false;