@selesai/code 0.13.39 → 0.14.0

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 (1401) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/dist/bun/runtime-setup.js +4 -1
  3. package/dist/cli/args.d.ts +3 -1
  4. package/dist/cli/args.js +76 -33
  5. package/dist/cli/auth-check.d.ts +18 -0
  6. package/dist/cli/auth-check.js +49 -0
  7. package/dist/cli/credential-print.d.ts +5 -15
  8. package/dist/cli/credential-print.js +42 -82
  9. package/dist/cli/file-processor.d.ts +1 -1
  10. package/dist/cli/file-processor.js +2 -1
  11. package/dist/cli/list-models.d.ts +1 -1
  12. package/dist/cli/list-models.js +2 -2
  13. package/dist/cli/startup-ui.js +38 -30
  14. package/dist/config.d.ts +35 -6
  15. package/dist/config.js +95 -17
  16. package/dist/core/agent-session-custom-tools.test.js +64 -0
  17. package/dist/core/agent-session-length-continuation.test.js +7 -3
  18. package/dist/core/agent-session-runtime.js +2 -2
  19. package/dist/core/agent-session-services.d.ts +1 -0
  20. package/dist/core/agent-session-services.js +14 -0
  21. package/dist/core/agent-session.d.ts +180 -40
  22. package/dist/core/agent-session.js +1061 -485
  23. package/dist/core/auth-storage.d.ts +25 -15
  24. package/dist/core/auth-storage.js +242 -66
  25. package/dist/core/bash-executor.js +42 -52
  26. package/dist/core/bug-report.js +1 -1
  27. package/dist/core/cache-warmer.d.ts +1 -0
  28. package/dist/core/cache-warmer.js +15 -1
  29. package/dist/core/compaction/branch-summarization.js +3 -0
  30. package/dist/core/compaction/compaction.d.ts +3 -1
  31. package/dist/core/compaction/compaction.js +156 -79
  32. package/dist/core/compaction/utils.d.ts +2 -1
  33. package/dist/core/compaction/utils.js +25 -18
  34. package/dist/core/crash-log.d.ts +5 -0
  35. package/dist/core/crash-log.js +69 -0
  36. package/dist/core/defaults.d.ts +1 -1
  37. package/dist/core/defaults.js +1 -1
  38. package/dist/core/export-html/template.css +10 -0
  39. package/dist/core/export-html/template.js +72 -18
  40. package/dist/core/export-html/tool-renderer.d.ts +3 -3
  41. package/dist/core/export-html/tool-renderer.js +5 -3
  42. package/dist/core/extensions/index.d.ts +2 -2
  43. package/dist/core/extensions/index.js +1 -1
  44. package/dist/core/extensions/loader.js +138 -55
  45. package/dist/core/extensions/runner.d.ts +38 -5
  46. package/dist/core/extensions/runner.js +220 -7
  47. package/dist/core/extensions/types.d.ts +438 -51
  48. package/dist/core/extensions/types.js +3 -0
  49. package/dist/core/extensions/virtual-modules.js +6 -0
  50. package/dist/core/extensions/wrapper.d.ts +2 -2
  51. package/dist/core/extensions/wrapper.js +3 -3
  52. package/dist/core/footer-data-provider.d.ts +1 -1
  53. package/dist/core/footer-data-provider.js +1 -1
  54. package/dist/core/handoff.d.ts +0 -1
  55. package/dist/core/handoff.js +0 -1
  56. package/dist/core/http-dispatcher.js +5 -0
  57. package/dist/core/index.d.ts +1 -1
  58. package/dist/core/intercom-rpc.d.ts +135 -0
  59. package/dist/core/intercom-rpc.js +64 -0
  60. package/dist/core/keybindings.d.ts +25 -24
  61. package/dist/core/keybindings.js +27 -6
  62. package/dist/core/mcp-servers.d.ts +134 -0
  63. package/dist/core/mcp-servers.js +223 -0
  64. package/dist/core/model-config.d.ts +122 -5
  65. package/dist/core/model-config.js +35 -1
  66. package/dist/core/model-registry.d.ts +23 -15
  67. package/dist/core/model-registry.js +46 -22
  68. package/dist/core/model-resolver.d.ts +6 -5
  69. package/dist/core/model-resolver.js +51 -21
  70. package/dist/core/model-runtime.d.ts +73 -14
  71. package/dist/core/model-runtime.js +398 -104
  72. package/dist/core/models-store.d.ts +12 -7
  73. package/dist/core/models-store.js +85 -15
  74. package/dist/core/nested-tool-calls.d.ts +102 -0
  75. package/dist/core/nested-tool-calls.js +178 -0
  76. package/dist/core/package-manager.d.ts +8 -1
  77. package/dist/core/package-manager.js +144 -61
  78. package/dist/core/package-manager.test.js +5 -5
  79. package/dist/core/pi-manifest.d.ts +9 -0
  80. package/dist/core/pi-manifest.js +25 -0
  81. package/dist/core/prompt-templates.d.ts +6 -1
  82. package/dist/core/prompt-templates.js +61 -35
  83. package/dist/core/provider-composer.d.ts +44 -19
  84. package/dist/core/provider-composer.js +166 -64
  85. package/dist/core/radius.d.ts +2 -0
  86. package/dist/core/radius.js +2 -0
  87. package/dist/core/release-rpc.d.ts +137 -0
  88. package/dist/core/release-rpc.js +77 -0
  89. package/dist/core/remote-catalog-provider.d.ts +8 -1
  90. package/dist/core/remote-catalog-provider.js +25 -13
  91. package/dist/core/resource-loader.d.ts +12 -1
  92. package/dist/core/resource-loader.js +180 -45
  93. package/dist/core/runtime-credentials.d.ts +5 -5
  94. package/dist/core/runtime-credentials.js +11 -8
  95. package/dist/core/sdk.d.ts +16 -7
  96. package/dist/core/sdk.js +57 -24
  97. package/dist/core/session-manager.d.ts +45 -9
  98. package/dist/core/session-manager.js +124 -31
  99. package/dist/core/settings-diagnostics.d.ts +8 -0
  100. package/dist/core/settings-diagnostics.js +20 -0
  101. package/dist/core/settings-manager.d.ts +62 -32
  102. package/dist/core/settings-manager.js +147 -69
  103. package/dist/core/skills.d.ts +5 -2
  104. package/dist/core/skills.js +58 -35
  105. package/dist/core/slash-commands.js +2 -1
  106. package/dist/core/source-info.d.ts +8 -0
  107. package/dist/core/source-info.js +16 -0
  108. package/dist/core/subagent-rpc.d.ts +110 -0
  109. package/dist/core/subagent-rpc.js +60 -0
  110. package/dist/core/system-prompt.d.ts +9 -3
  111. package/dist/core/system-prompt.js +9 -12
  112. package/dist/core/system-prompt.test.js +2 -7
  113. package/dist/core/tools/bash.d.ts +12 -0
  114. package/dist/core/tools/bash.js +33 -2
  115. package/dist/core/tools/edit-diff.d.ts +0 -5
  116. package/dist/core/tools/edit-diff.js +2 -5
  117. package/dist/core/tools/edit.d.ts +4 -0
  118. package/dist/core/tools/edit.js +31 -11
  119. package/dist/core/tools/find.d.ts +7 -0
  120. package/dist/core/tools/find.js +16 -19
  121. package/dist/core/tools/grep.d.ts +4 -0
  122. package/dist/core/tools/grep.js +5 -1
  123. package/dist/core/tools/index.d.ts +1 -1
  124. package/dist/core/tools/index.js +11 -2
  125. package/dist/core/tools/ls.d.ts +4 -0
  126. package/dist/core/tools/ls.js +5 -1
  127. package/dist/core/tools/output-accumulator.d.ts +11 -0
  128. package/dist/core/tools/output-accumulator.js +40 -10
  129. package/dist/core/tools/read.d.ts +17 -2
  130. package/dist/core/tools/read.js +23 -2
  131. package/dist/core/tools/render-utils.d.ts +6 -0
  132. package/dist/core/tools/render-utils.js +26 -0
  133. package/dist/core/tools/renderers/bash.js +19 -35
  134. package/dist/core/tools/renderers/edit.js +5 -4
  135. package/dist/core/tools/renderers/index.d.ts +2 -2
  136. package/dist/core/tools/renderers/read.js +3 -2
  137. package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
  138. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  139. package/dist/core/tools/truncate.d.ts +14 -0
  140. package/dist/core/tools/truncate.js +29 -0
  141. package/dist/core/tools/write.d.ts +4 -0
  142. package/dist/core/tools/write.js +6 -2
  143. package/dist/core/trust-manager.js +3 -1
  144. package/dist/core/usage-totals.d.ts +2 -0
  145. package/dist/core/usage-totals.js +23 -0
  146. package/dist/core/virtual-models.d.ts +116 -0
  147. package/dist/core/virtual-models.js +123 -0
  148. package/dist/defaults/models.json +32 -0
  149. package/dist/defaults/settings.json +1 -9
  150. package/dist/extensions/agent-browser.ts +9 -0
  151. package/dist/extensions/codemode/execute.d.ts +15 -0
  152. package/dist/extensions/codemode/execute.js +633 -0
  153. package/dist/extensions/codemode/execute.lazy.d.ts +2 -0
  154. package/dist/extensions/codemode/execute.lazy.js +2 -0
  155. package/dist/extensions/codemode/index.d.ts +20 -0
  156. package/dist/extensions/codemode/index.js +31 -0
  157. package/dist/extensions/codemode/renderer.d.ts +11 -0
  158. package/dist/extensions/codemode/renderer.js +136 -0
  159. package/dist/extensions/codemode/tool.d.ts +129 -0
  160. package/dist/extensions/codemode/tool.js +275 -0
  161. package/dist/extensions/context-compaction-reminder.ts +1 -1
  162. package/dist/extensions/grep-app/index.ts +2 -10
  163. package/dist/extensions/herdr-agent-state.ts +1 -1
  164. package/dist/extensions/{pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts → index.d.ts} +0 -1
  165. package/dist/extensions/index.js +12 -0
  166. package/dist/extensions/jev/classifier-context.ts +54 -0
  167. package/dist/extensions/jev/classifier.test.ts +85 -0
  168. package/dist/extensions/jev/classifier.ts +105 -0
  169. package/dist/extensions/jev/decisions.test.ts +35 -47
  170. package/dist/extensions/jev/decisions.ts +58 -104
  171. package/dist/extensions/jev/test-support.ts +33 -38
  172. package/dist/extensions/jev-advisory-lifecycle.test.ts +12 -12
  173. package/dist/extensions/jev-advisory-memory.test.ts +9 -9
  174. package/dist/extensions/jev-advisory-recommendations.test.ts +8 -8
  175. package/dist/extensions/jev-ask-tool.test.ts +41 -45
  176. package/dist/extensions/jev-ask-tool.ts +10 -38
  177. package/dist/extensions/jev-find-source.test.ts +26 -0
  178. package/dist/extensions/jev-find-source.ts +58 -19
  179. package/dist/{core → extensions}/llama/client.d.ts +2 -0
  180. package/dist/{core → extensions}/llama/client.js +7 -3
  181. package/dist/{core → extensions}/llama/index.js +13 -2
  182. package/dist/{core → extensions}/llama/provider.d.ts +1 -1
  183. package/dist/extensions/llama/provider.js +235 -0
  184. package/dist/extensions/mcp/cli.d.ts +20 -0
  185. package/dist/extensions/mcp/cli.js +496 -0
  186. package/dist/extensions/mcp/cli.lazy.d.ts +2 -0
  187. package/dist/extensions/mcp/cli.lazy.js +2 -0
  188. package/dist/extensions/mcp/config.d.ts +83 -0
  189. package/dist/extensions/mcp/config.js +193 -0
  190. package/dist/extensions/mcp/index.d.ts +78 -0
  191. package/dist/extensions/mcp/index.js +1201 -0
  192. package/dist/extensions/mcp/log.d.ts +15 -0
  193. package/dist/extensions/mcp/log.js +65 -0
  194. package/dist/extensions/mcp/oauth.d.ts +97 -0
  195. package/dist/extensions/mcp/oauth.js +401 -0
  196. package/dist/extensions/mcp/resources.d.ts +41 -0
  197. package/dist/extensions/mcp/resources.js +260 -0
  198. package/dist/extensions/mcp/runtime.d.ts +96 -0
  199. package/dist/extensions/mcp/runtime.js +412 -0
  200. package/dist/extensions/mcp/runtime.lazy.d.ts +2 -0
  201. package/dist/extensions/mcp/runtime.lazy.js +2 -0
  202. package/dist/extensions/mcp/tools.d.ts +86 -0
  203. package/dist/extensions/mcp/tools.js +252 -0
  204. package/dist/extensions/mcp/ui.d.ts +59 -0
  205. package/dist/extensions/mcp/ui.js +185 -0
  206. package/dist/extensions/package.json +1 -1
  207. package/dist/extensions/pi-graft/tools.ts +6 -0
  208. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +25 -0
  209. package/dist/extensions/pi-hermes-memory/README.md +140 -4
  210. package/dist/extensions/pi-hermes-memory/package-lock.json +624 -2720
  211. package/dist/extensions/pi-hermes-memory/package.json +9 -7
  212. package/dist/extensions/pi-hermes-memory/scripts/benchmark-memory-startup.mjs +72 -0
  213. package/dist/extensions/pi-hermes-memory/scripts/check-production-install.mjs +107 -0
  214. package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +2 -1
  215. package/dist/extensions/pi-hermes-memory/src/config.ts +35 -0
  216. package/dist/extensions/pi-hermes-memory/src/constants.ts +62 -15
  217. package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +374 -50
  218. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +7 -4
  219. package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +19 -14
  220. package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +75 -1
  221. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +322 -22
  222. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +8 -0
  223. package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +193 -54
  224. package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +6 -2
  225. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +33 -5
  226. package/dist/extensions/pi-hermes-memory/src/index.ts +116 -47
  227. package/dist/extensions/pi-hermes-memory/src/memory-initialization.ts +101 -0
  228. package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +10 -2
  229. package/dist/extensions/pi-hermes-memory/src/store/db.ts +34 -9
  230. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +44 -8
  231. package/dist/extensions/pi-hermes-memory/src/store/schema.ts +3 -1
  232. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +141 -0
  233. package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +17 -6
  234. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +20 -10
  235. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +1 -17
  236. package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +2 -10
  237. package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +4 -8
  238. package/dist/extensions/pi-hermes-memory/src/types.ts +48 -0
  239. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +108 -0
  240. package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +1185 -42
  241. package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +57 -1
  242. package/dist/extensions/pi-hermes-memory/tests/handlers/lazy-memory-hooks.test.ts +128 -0
  243. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +844 -1
  244. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +16 -0
  245. package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +512 -3
  246. package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +38 -0
  247. package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +183 -2
  248. package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +1 -3
  249. package/dist/extensions/pi-hermes-memory/tests/index.test.ts +17 -0
  250. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +21 -0
  251. package/dist/extensions/pi-hermes-memory/tests/lazy-startup.test.ts +313 -0
  252. package/dist/extensions/pi-hermes-memory/tests/memory-initialization.test.ts +182 -0
  253. package/dist/extensions/pi-hermes-memory/tests/prompt-injection.test.ts +184 -0
  254. package/dist/extensions/pi-hermes-memory/tests/skill-discovery-contract.test.ts +60 -0
  255. package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-lazy-probe.test.ts +80 -0
  256. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +2 -0
  257. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +79 -0
  258. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +268 -0
  259. package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +29 -0
  260. package/dist/extensions/pi-hermes-memory/tests/store/usage-tracking.test.ts +170 -0
  261. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +80 -1
  262. package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +51 -0
  263. package/dist/extensions/pi-intercom/CHANGELOG.md +66 -0
  264. package/dist/extensions/pi-intercom/README.md +115 -12
  265. package/dist/extensions/pi-intercom/broker/broker.ts +304 -24
  266. package/dist/extensions/pi-intercom/broker/client.ts +9 -2
  267. package/dist/extensions/pi-intercom/broker/cross-machine-provenance.test.ts +63 -0
  268. package/dist/extensions/pi-intercom/broker/mailbox-persistence.test.ts +523 -0
  269. package/dist/extensions/pi-intercom/broker/paths.test.ts +4 -4
  270. package/dist/extensions/pi-intercom/broker/paths.ts +4 -2
  271. package/dist/extensions/pi-intercom/broker/protocol.ts +64 -0
  272. package/dist/extensions/pi-intercom/broker/spawn.test.ts +58 -169
  273. package/dist/extensions/pi-intercom/broker/spawn.ts +40 -87
  274. package/dist/extensions/pi-intercom/cli.mjs +6 -0
  275. package/dist/extensions/pi-intercom/cli.test.ts +428 -0
  276. package/dist/extensions/pi-intercom/cli.ts +343 -0
  277. package/dist/extensions/pi-intercom/config.test.ts +61 -1
  278. package/dist/extensions/pi-intercom/config.ts +53 -2
  279. package/dist/extensions/pi-intercom/cross-machine-discovery.test.ts +218 -0
  280. package/dist/extensions/pi-intercom/cross-machine-discovery.ts +140 -0
  281. package/dist/extensions/pi-intercom/cross-machine-envelope.test.ts +106 -0
  282. package/dist/extensions/pi-intercom/cross-machine-envelope.ts +92 -0
  283. package/dist/extensions/pi-intercom/cross-machine-integration.test.ts +25 -0
  284. package/dist/extensions/pi-intercom/cross-machine-transport.test.ts +106 -0
  285. package/dist/extensions/pi-intercom/cross-machine-transport.ts +110 -0
  286. package/dist/extensions/pi-intercom/extension-api.ts +24 -0
  287. package/dist/extensions/pi-intercom/handover.test.ts +88 -0
  288. package/dist/extensions/pi-intercom/handover.ts +115 -0
  289. package/dist/extensions/pi-intercom/herdr-location.test.ts +173 -0
  290. package/dist/extensions/pi-intercom/herdr-location.ts +137 -0
  291. package/dist/extensions/pi-intercom/human-priority.pi.test.ts +489 -0
  292. package/dist/extensions/pi-intercom/index.ts +770 -172
  293. package/dist/extensions/pi-intercom/intercom.integration.test.ts +869 -21
  294. package/dist/extensions/pi-intercom/package.json +12 -2
  295. package/dist/extensions/pi-intercom/project-agent.ts +1 -1
  296. package/dist/extensions/pi-intercom/release-readiness.test.ts +116 -0
  297. package/dist/extensions/pi-intercom/release-readiness.ts +93 -0
  298. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +26 -2
  299. package/dist/extensions/pi-intercom/test/handover-picker.test.ts +134 -0
  300. package/dist/extensions/pi-intercom/test/inline-message.test.ts +43 -0
  301. package/dist/extensions/pi-intercom/types.d.ts +247 -0
  302. package/dist/extensions/pi-intercom/types.js +2 -0
  303. package/dist/extensions/pi-intercom/types.ts +39 -1
  304. package/dist/extensions/pi-intercom/ui/handover-picker.ts +318 -0
  305. package/dist/extensions/pi-intercom/ui/inline-message.ts +10 -3
  306. package/dist/extensions/pi-intercom/ui/session-list.ts +28 -15
  307. package/dist/extensions/pi-subagents/.github/workflows/release.yml +5 -1
  308. package/dist/extensions/pi-subagents/.github/workflows/test.yml +188 -18
  309. package/dist/extensions/pi-subagents/CHANGELOG.md +514 -1
  310. package/dist/extensions/pi-subagents/README.md +7 -5
  311. package/dist/extensions/pi-subagents/VISION.md +6 -0
  312. package/dist/extensions/pi-subagents/agents/reviewer.md +7 -5
  313. package/dist/extensions/pi-subagents/agents/worker.md +1 -1
  314. package/dist/extensions/pi-subagents/docs/agents.md +75 -35
  315. package/dist/extensions/pi-subagents/docs/configuration.md +156 -25
  316. package/dist/extensions/pi-subagents/docs/extension-api.md +121 -29
  317. package/dist/extensions/pi-subagents/docs/missions.md +46 -14
  318. package/dist/extensions/pi-subagents/docs/models.md +22 -84
  319. package/dist/extensions/pi-subagents/docs/observability.md +57 -24
  320. package/dist/extensions/pi-subagents/docs/standalone-background.md +59 -0
  321. package/dist/extensions/pi-subagents/docs/tool-reference.md +167 -116
  322. package/dist/extensions/pi-subagents/docs/watchdog.md +41 -10
  323. package/dist/extensions/pi-subagents/docs/workflows.md +239 -163
  324. package/dist/extensions/pi-subagents/examples/typed-gate/.pi/agents/classifier.md +14 -0
  325. package/dist/extensions/pi-subagents/examples/typed-gate/README.md +42 -0
  326. package/dist/extensions/pi-subagents/examples/typed-gate/classify +38 -0
  327. package/dist/extensions/pi-subagents/examples/typed-gate/workflow.js +32 -0
  328. package/dist/extensions/pi-subagents/index.ts +11 -3
  329. package/dist/extensions/pi-subagents/inspector-runner.mjs +3 -3
  330. package/dist/extensions/pi-subagents/package-lock.json +517 -1129
  331. package/dist/extensions/pi-subagents/package.json +22 -11
  332. package/dist/extensions/pi-subagents/prompts/council.md +7 -4
  333. package/dist/extensions/pi-subagents/prompts/parallel-review.md +2 -2
  334. package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
  335. package/dist/extensions/pi-subagents/runner-peer-loader.mjs +21 -0
  336. package/dist/extensions/pi-subagents/runner-peer-preload.mjs +30 -0
  337. package/dist/extensions/pi-subagents/scripts/build-package.mjs +79 -0
  338. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +2 -2
  339. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +46 -27
  340. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +11 -7
  341. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +78 -73
  342. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +4 -5
  343. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +10 -2
  344. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +69 -67
  345. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +3 -3
  346. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +21 -10
  347. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +113 -113
  348. package/dist/extensions/pi-subagents/src/agents/agent-memory.ts +91 -4
  349. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +15 -9
  350. package/dist/extensions/pi-subagents/src/agents/agents.ts +432 -193
  351. package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +6 -1
  352. package/dist/extensions/pi-subagents/src/agents/global-npm-root.ts +58 -0
  353. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +5 -2
  354. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +22 -18
  355. package/dist/extensions/pi-subagents/src/agents/skills.ts +43 -10
  356. package/dist/extensions/pi-subagents/src/api/delegation.ts +20 -1
  357. package/dist/extensions/pi-subagents/src/api/inspectors.ts +27 -0
  358. package/dist/extensions/pi-subagents/src/api/preflight.ts +140 -62
  359. package/dist/extensions/pi-subagents/src/api/required-child-extensions.ts +6 -0
  360. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  361. package/dist/extensions/pi-subagents/src/extension/config.ts +24 -40
  362. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +4 -1
  363. package/dist/extensions/pi-subagents/src/extension/doctor.ts +18 -15
  364. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +87 -13
  365. package/dist/extensions/pi-subagents/src/extension/herdr-pi-bridge.ts +162 -0
  366. package/dist/extensions/pi-subagents/src/extension/index.ts +331 -269
  367. package/dist/extensions/pi-subagents/src/extension/observability.ts +164 -0
  368. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +76 -37
  369. package/dist/extensions/pi-subagents/src/extension/release-readiness.ts +367 -0
  370. package/dist/extensions/pi-subagents/src/extension/reply-workflow-script.ts +67 -0
  371. package/dist/extensions/pi-subagents/src/extension/rpc.ts +42 -12
  372. package/dist/extensions/pi-subagents/src/extension/schemas.ts +116 -205
  373. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +13 -5
  374. package/dist/extensions/pi-subagents/src/extension/tool-activation.ts +146 -0
  375. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +77 -90
  376. package/dist/extensions/pi-subagents/src/extension/upgrade-notice.ts +40 -0
  377. package/dist/extensions/pi-subagents/src/inspectors/actions.ts +148 -0
  378. package/dist/extensions/pi-subagents/src/inspectors/ghostty/actions.ts +74 -0
  379. package/dist/extensions/pi-subagents/src/inspectors/ghostty/plugin.ts +29 -0
  380. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +100 -180
  381. package/dist/extensions/pi-subagents/src/inspectors/herdr/plugin.ts +20 -0
  382. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +2 -2
  383. package/dist/extensions/pi-subagents/src/inspectors/{herdr/inspector-runner.ts → inspector-runner.ts} +13 -13
  384. package/dist/extensions/pi-subagents/src/inspectors/plugins.ts +75 -0
  385. package/dist/extensions/pi-subagents/src/inspectors/{herdr/session-roots-codec.ts → session-roots-codec.ts} +4 -15
  386. package/dist/extensions/pi-subagents/src/inspectors/{herdr/shell-command.ts → shell-command.ts} +1 -1
  387. package/dist/extensions/pi-subagents/src/inspectors/types.ts +51 -0
  388. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +38 -53
  389. package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +7 -1
  390. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +53 -9
  391. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +69 -55
  392. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +7 -2
  393. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +45 -32
  394. package/dist/extensions/pi-subagents/src/missions/store.ts +11 -2
  395. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +1 -44
  396. package/dist/extensions/pi-subagents/src/policy/authority.ts +5 -1
  397. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +30 -18
  398. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +59 -9
  399. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +18 -2
  400. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +463 -248
  401. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +112 -66
  402. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +33 -20
  403. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +47 -17
  404. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -5
  405. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +24 -11
  406. package/dist/extensions/pi-subagents/src/runs/background/await-async-run.ts +78 -0
  407. package/dist/extensions/pi-subagents/src/runs/background/binary-bootstrap.ts +66 -0
  408. package/dist/extensions/pi-subagents/src/runs/background/calendar-schedule.ts +90 -0
  409. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -2
  410. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +19 -38
  411. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +62 -3
  412. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +82 -10
  413. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +272 -24
  414. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +30 -3
  415. package/dist/extensions/pi-subagents/src/runs/background/pid-namespace.ts +18 -0
  416. package/dist/extensions/pi-subagents/src/runs/background/process-terminal-candidate.ts +98 -0
  417. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +18 -97
  418. package/dist/extensions/pi-subagents/src/runs/background/result-delivery-ownership.ts +269 -7
  419. package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +14 -5
  420. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +77 -22
  421. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +4 -3
  422. package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +15 -3
  423. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +126 -45
  424. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +11 -6
  425. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +18 -7
  426. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +43 -51
  427. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +8 -1
  428. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +5 -4
  429. package/dist/extensions/pi-subagents/src/runs/background/runner-http-dispatcher.ts +119 -0
  430. package/dist/extensions/pi-subagents/src/runs/background/runner-startup-failure.ts +56 -0
  431. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +297 -69
  432. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +67 -16
  433. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +21 -3
  434. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner-bootstrap.ts +276 -0
  435. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +660 -578
  436. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +177 -29
  437. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +77 -28
  438. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +10 -4
  439. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +7 -13
  440. package/dist/extensions/pi-subagents/src/runs/background/workflow-terminal-proof.ts +41 -23
  441. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +19 -8
  442. package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +130 -7
  443. package/dist/extensions/pi-subagents/src/runs/foreground/command-action.ts +41 -0
  444. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +267 -385
  445. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +4 -2
  446. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +6 -10
  447. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1158 -413
  448. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +3 -1
  449. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +2 -1
  450. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +200 -74
  451. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +133 -34
  452. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +6 -1
  453. package/dist/extensions/pi-subagents/src/runs/shared/child-commands.ts +228 -0
  454. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +18 -18
  455. package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +16 -4
  456. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +55 -12
  457. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +6 -3
  458. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +11 -1
  459. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +367 -74
  460. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +50 -86
  461. package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +288 -0
  462. package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
  463. package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
  464. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +5 -5
  465. package/dist/extensions/pi-subagents/src/runs/shared/effective-system-prompt.ts +33 -0
  466. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +49 -10
  467. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +61 -9
  468. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +16 -9
  469. package/dist/extensions/pi-subagents/src/runs/shared/external-job-bridge.ts +55 -1
  470. package/dist/extensions/pi-subagents/src/runs/shared/git-environment.ts +1 -1
  471. package/dist/extensions/pi-subagents/src/runs/shared/herdr-connection.ts +134 -0
  472. package/dist/extensions/pi-subagents/src/runs/shared/herdr-external-adapters.ts +169 -0
  473. package/dist/extensions/pi-subagents/src/runs/shared/herdr-machine.ts +279 -0
  474. package/dist/extensions/pi-subagents/src/runs/shared/herdr-pi-protocol.ts +59 -0
  475. package/dist/extensions/pi-subagents/src/runs/shared/herdr-placed-run.ts +263 -0
  476. package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +6 -2
  477. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +108 -13
  478. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +23 -7
  479. package/dist/extensions/pi-subagents/src/runs/shared/model-resolution-diagnostic.ts +76 -0
  480. package/dist/extensions/pi-subagents/src/runs/shared/{model-fallback.ts → model-resolution.ts} +65 -245
  481. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +30 -11
  482. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +24 -3
  483. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +5 -4
  484. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +55 -7
  485. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +14 -4
  486. package/dist/extensions/pi-subagents/src/runs/shared/partial-output.ts +48 -0
  487. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +12 -4
  488. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +88 -1
  489. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +12 -3
  490. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +160 -9
  491. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +49 -35
  492. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +58 -19
  493. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +2 -2
  494. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +21 -0
  495. package/dist/extensions/pi-subagents/src/runs/shared/usage-reconciliation.ts +73 -0
  496. package/dist/extensions/pi-subagents/src/runs/shared/workflow-async-child-guidance.ts +18 -0
  497. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-apply.ts +160 -0
  498. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +42 -20
  499. package/dist/extensions/pi-subagents/src/runs/shared/worktree-lock.ts +29 -0
  500. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +27 -4
  501. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +94 -26
  502. package/dist/extensions/pi-subagents/src/shared/child-cache-retention.ts +43 -0
  503. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +5 -3
  504. package/dist/extensions/pi-subagents/src/shared/disabled-features.ts +123 -0
  505. package/dist/extensions/pi-subagents/src/shared/extension-context.ts +14 -1
  506. package/dist/extensions/pi-subagents/src/shared/file-lease.ts +74 -0
  507. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +27 -77
  508. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +70 -10
  509. package/dist/extensions/pi-subagents/src/shared/model-info.ts +10 -1
  510. package/dist/extensions/pi-subagents/src/shared/opencode-session-headers.ts +30 -0
  511. package/dist/extensions/pi-subagents/src/shared/owner-record.ts +107 -0
  512. package/dist/extensions/pi-subagents/src/shared/package-version.ts +17 -0
  513. package/dist/extensions/pi-subagents/src/shared/parent-wake.ts +66 -0
  514. package/dist/extensions/pi-subagents/src/shared/process-identity.ts +87 -0
  515. package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +71 -58
  516. package/dist/extensions/pi-subagents/src/shared/required-child-extensions.ts +115 -0
  517. package/dist/extensions/pi-subagents/src/shared/settings-file-lease.ts +36 -0
  518. package/dist/extensions/pi-subagents/src/shared/settings.ts +7 -4
  519. package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +1 -5
  520. package/dist/extensions/pi-subagents/src/shared/types.ts +155 -48
  521. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +28 -2
  522. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +15 -1
  523. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +19 -4
  524. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +13 -2
  525. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +15 -15
  526. package/dist/extensions/pi-subagents/src/slash/subagent-cost.ts +46 -9
  527. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +29 -16
  528. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +201 -26
  529. package/dist/extensions/pi-subagents/src/tui/fleet.ts +33 -16
  530. package/dist/extensions/pi-subagents/src/tui/render.ts +334 -103
  531. package/dist/extensions/pi-subagents/src/tui/running-tone.ts +28 -0
  532. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +27 -28
  533. package/dist/extensions/pi-subagents/src/watchdog/diff-tool.ts +47 -12
  534. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +2 -2
  535. package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +22 -2
  536. package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +17 -17
  537. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +24 -8
  538. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +43 -39
  539. package/dist/extensions/pi-subagents/src/watchdog/render.ts +2 -2
  540. package/dist/extensions/pi-subagents/src/watchdog/review.ts +127 -78
  541. package/dist/extensions/pi-subagents/src/watchdog/rules.ts +1 -1
  542. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +107 -31
  543. package/dist/extensions/pi-subagents/src/watchdog/scope.ts +1 -1
  544. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +22 -14
  545. package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +14 -13
  546. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +35 -6
  547. package/dist/extensions/pi-subagents/src/watchdog/types.ts +6 -4
  548. package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +2 -2
  549. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  550. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +500 -65
  551. package/dist/extensions/pi-subagents/src/workflows/structured-workflow-scripts.ts +177 -0
  552. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +8 -2
  553. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +5 -3
  554. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +70 -10
  555. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +57 -18
  556. package/dist/extensions/pi-subagents/src/workflows/workflow-reuse.ts +120 -0
  557. package/dist/extensions/pi-subagents/src/workflows/workflow-revival.ts +123 -0
  558. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +5 -2
  559. package/dist/extensions/pi-subagents/test/fixtures/cwd-workflow-child.ts +37 -0
  560. package/dist/extensions/pi-subagents/test/fixtures/herdr-allocation-lock-child.ts +16 -0
  561. package/dist/extensions/pi-subagents/test/fixtures/herdr-provision-child.ts +15 -0
  562. package/dist/extensions/pi-subagents/test/fixtures/native-nested-wait-provider.ts +76 -0
  563. package/dist/extensions/pi-subagents/test/fixtures/runner-bootstrap-harness.ts +36 -0
  564. package/dist/extensions/pi-subagents/test/fixtures/schedule-history-writer.mjs +48 -0
  565. package/dist/extensions/pi-subagents/test/fixtures/settings-race-writer.mjs +57 -0
  566. package/dist/extensions/pi-subagents/test/fixtures/workflow-cwd-access-failure.ts +33 -0
  567. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +40 -7
  568. package/dist/extensions/pi-subagents/test/integration/async-attention-clearing.test.ts +192 -0
  569. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +435 -276
  570. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +435 -397
  571. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +918 -497
  572. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +264 -17
  573. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +185 -22
  574. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +3 -2
  575. package/dist/extensions/pi-subagents/test/integration/claude-code-dispatch.test.ts +127 -0
  576. package/dist/extensions/pi-subagents/test/integration/deadline-checkpoint.test.ts +126 -0
  577. package/dist/extensions/pi-subagents/test/integration/doctor-executor.test.ts +29 -1
  578. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +88 -0
  579. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +450 -13
  580. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +10 -6
  581. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +105 -86
  582. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +403 -18
  583. package/dist/extensions/pi-subagents/test/integration/inline-workflow-visibility.test.ts +351 -0
  584. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +195 -10
  585. package/dist/extensions/pi-subagents/test/integration/model-resolution-diagnostic.test.ts +108 -0
  586. package/dist/extensions/pi-subagents/test/integration/nested-async-wait.test.ts +61 -0
  587. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +5 -4
  588. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +1 -1
  589. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +6 -4
  590. package/dist/extensions/pi-subagents/test/integration/render-widget-mouse.test.ts +84 -0
  591. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +242 -16
  592. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +2 -2
  593. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +221 -4
  594. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +1435 -248
  595. package/dist/extensions/pi-subagents/test/integration/single-execution.part-2.test.ts +454 -515
  596. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +140 -21
  597. package/dist/extensions/pi-subagents/test/integration/stop-all-background.test.ts +142 -0
  598. package/dist/extensions/pi-subagents/test/integration/structured-workflows.test.ts +105 -0
  599. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +90 -11
  600. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +18 -15
  601. package/dist/extensions/pi-subagents/test/integration/workflow-worktree-admission.test.ts +100 -0
  602. package/dist/extensions/pi-subagents/test/smoke/clean-install.mjs +106 -0
  603. package/dist/extensions/pi-subagents/test/smoke/npm-background.mjs +43 -0
  604. package/dist/extensions/pi-subagents/test/smoke/packed-runner-selection.mjs +42 -0
  605. package/dist/extensions/pi-subagents/test/smoke/runner-loader-capability.mjs +50 -0
  606. package/dist/extensions/pi-subagents/test/smoke/sdk-child.ts +57 -0
  607. package/dist/extensions/pi-subagents/test/smoke/{pi085-extension.ts → sdk-extension.ts} +2 -2
  608. package/dist/extensions/pi-subagents/test/smoke/standalone-background.mjs +140 -0
  609. package/dist/extensions/pi-subagents/test/smoke/standalone-fault.ts +43 -0
  610. package/dist/extensions/pi-subagents/test/smoke/standalone-matrix.mjs +65 -0
  611. package/dist/extensions/pi-subagents/test/smoke/standalone-observer.ts +8 -0
  612. package/dist/extensions/pi-subagents/test/smoke/standalone-parent.ts +220 -0
  613. package/dist/extensions/pi-subagents/test/smoke/standalone-provider.ts +58 -0
  614. package/dist/extensions/pi-subagents/test/smoke/standalone-release.json +8 -0
  615. package/dist/extensions/pi-subagents/test/smoke/standalone-revival.ts +109 -0
  616. package/dist/extensions/pi-subagents/test/smoke/standalone-shared.ts +79 -0
  617. package/dist/extensions/pi-subagents/test/smoke/tool-activation.test.ts +128 -0
  618. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +6 -25
  619. package/dist/extensions/pi-subagents/test/support/async-result-timeout-evidence.ts +61 -0
  620. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +130 -9
  621. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +15 -7
  622. package/dist/extensions/pi-subagents/test/support/helpers.ts +11 -14
  623. package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +21 -3
  624. package/dist/extensions/pi-subagents/test/support/native-peer-loader.mjs +15 -0
  625. package/dist/extensions/pi-subagents/test/support/node-command.ts +29 -6
  626. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +5 -3
  627. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +7 -15
  628. package/dist/extensions/pi-subagents/test/support/watchdog-stable-host-loader.mjs +23 -0
  629. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +3 -3
  630. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +158 -155
  631. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +52 -1
  632. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +21 -17
  633. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +105 -36
  634. package/dist/extensions/pi-subagents/test/unit/advertisement-barrier.test.ts +151 -0
  635. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -2
  636. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +33 -3
  637. package/dist/extensions/pi-subagents/test/unit/agent-end-auto-drain.test.ts +149 -0
  638. package/dist/extensions/pi-subagents/test/unit/agent-exclude-dirs.test.ts +246 -0
  639. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +62 -87
  640. package/dist/extensions/pi-subagents/test/unit/agent-global-root-override.test.ts +86 -0
  641. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +398 -48
  642. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +126 -1
  643. package/dist/extensions/pi-subagents/test/unit/agent-name-resolution.test.ts +75 -0
  644. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +94 -42
  645. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +73 -3
  646. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +428 -2
  647. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +4 -4
  648. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +112 -1
  649. package/dist/extensions/pi-subagents/test/unit/async-result-timeout-evidence.test.ts +53 -0
  650. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +92 -4
  651. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +58 -6
  652. package/dist/extensions/pi-subagents/test/unit/async-run-history.test.ts +123 -0
  653. package/dist/extensions/pi-subagents/test/unit/async-spawn-package-dir.test.ts +203 -0
  654. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +26 -35
  655. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +185 -0
  656. package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +9 -1
  657. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +106 -1
  658. package/dist/extensions/pi-subagents/test/unit/await-async-run.test.ts +202 -0
  659. package/dist/extensions/pi-subagents/test/unit/binary-async-spawn.test.ts +115 -0
  660. package/dist/extensions/pi-subagents/test/unit/binary-pi-spawn.test.ts +27 -0
  661. package/dist/extensions/pi-subagents/test/unit/calendar-schedule.test.ts +70 -0
  662. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +38 -0
  663. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +10 -2
  664. package/dist/extensions/pi-subagents/test/unit/changelog-format.test.ts +11 -0
  665. package/dist/extensions/pi-subagents/test/unit/child-cache-retention.test.ts +87 -0
  666. package/dist/extensions/pi-subagents/test/unit/child-commands.test.ts +243 -0
  667. package/dist/extensions/pi-subagents/test/unit/child-external-job-bridge.test.ts +126 -0
  668. package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +12 -1
  669. package/dist/extensions/pi-subagents/test/unit/child-lifecycle.test.ts +36 -0
  670. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +24 -0
  671. package/dist/extensions/pi-subagents/test/unit/child-session-commands.test.ts +162 -0
  672. package/dist/extensions/pi-subagents/test/unit/child-session-host-sdk.test.ts +226 -0
  673. package/dist/extensions/pi-subagents/test/unit/child-session-parent-providers.test.ts +200 -0
  674. package/dist/extensions/pi-subagents/test/unit/child-session-queued.test.ts +260 -0
  675. package/dist/extensions/pi-subagents/test/unit/child-tool-plan-permission-system.test.ts +3 -98
  676. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +222 -1
  677. package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +314 -0
  678. package/dist/extensions/pi-subagents/test/unit/claude-code-dispatch.test.ts +182 -0
  679. package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +157 -0
  680. package/dist/extensions/pi-subagents/test/unit/command-action.test.ts +50 -0
  681. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +25 -11
  682. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +3 -1
  683. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +18 -0
  684. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +7 -1
  685. package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +220 -0
  686. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +104 -32
  687. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +138 -1
  688. package/dist/extensions/pi-subagents/test/unit/disabled-features.test.ts +227 -0
  689. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +48 -9
  690. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +7 -4
  691. package/dist/extensions/pi-subagents/test/unit/extension-lazy-loading.test.ts +21 -0
  692. package/dist/extensions/pi-subagents/test/unit/extension-maintenance-lifecycle.test.ts +66 -0
  693. package/dist/extensions/pi-subagents/test/unit/extension-module-preload.test.ts +49 -0
  694. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +104 -3
  695. package/dist/extensions/pi-subagents/test/unit/file-lease.test.ts +17 -0
  696. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +316 -0
  697. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +58 -7
  698. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +25 -96
  699. package/dist/extensions/pi-subagents/test/unit/ghostty-inspector.test.ts +92 -0
  700. package/dist/extensions/pi-subagents/test/unit/global-npm-root.test.ts +108 -0
  701. package/dist/extensions/pi-subagents/test/unit/herdr-connection.test.ts +43 -0
  702. package/dist/extensions/pi-subagents/test/unit/herdr-external-adapters.test.ts +89 -0
  703. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +11 -20
  704. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +113 -19
  705. package/dist/extensions/pi-subagents/test/unit/herdr-machine.test.ts +161 -0
  706. package/dist/extensions/pi-subagents/test/unit/herdr-native-placement.test.ts +187 -0
  707. package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +7 -12
  708. package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
  709. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +182 -87
  710. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +68 -49
  711. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +295 -135
  712. package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +3 -3
  713. package/dist/extensions/pi-subagents/test/unit/inspector-authority-policy.test.ts +144 -0
  714. package/dist/extensions/pi-subagents/test/unit/inspector-registration.test.ts +128 -0
  715. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +49 -1
  716. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +74 -1
  717. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-resolution.test.ts +112 -0
  718. package/dist/extensions/pi-subagents/test/unit/mission-global-projection.test.ts +215 -0
  719. package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +65 -1
  720. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +2 -1
  721. package/dist/extensions/pi-subagents/test/unit/model-resolution-diagnostic.test.ts +78 -0
  722. package/dist/extensions/pi-subagents/test/unit/model-resolution.test.ts +153 -0
  723. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +43 -1
  724. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +1 -21
  725. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +279 -2
  726. package/dist/extensions/pi-subagents/test/unit/nested-control-fanout.test.ts +73 -0
  727. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +297 -3
  728. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +1 -1
  729. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +431 -23
  730. package/dist/extensions/pi-subagents/test/unit/observability.test.ts +198 -0
  731. package/dist/extensions/pi-subagents/test/unit/opencode-session-headers.test.ts +32 -0
  732. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +89 -21
  733. package/dist/extensions/pi-subagents/test/unit/owned-process-tree.test.ts +31 -1
  734. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +18 -24
  735. package/dist/extensions/pi-subagents/test/unit/parent-wake.test.ts +206 -0
  736. package/dist/extensions/pi-subagents/test/unit/partial-output.test.ts +53 -0
  737. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +216 -32
  738. package/dist/extensions/pi-subagents/test/unit/pi-spawn-host-root.test.ts +82 -0
  739. package/dist/extensions/pi-subagents/test/unit/pi-subagents-policy-guidance.test.ts +28 -0
  740. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +193 -104
  741. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +16 -1
  742. package/dist/extensions/pi-subagents/test/unit/process-identity.test.ts +75 -0
  743. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +17 -1
  744. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +89 -9
  745. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +6 -0
  746. package/dist/extensions/pi-subagents/test/unit/prompt-audit-provider-routing.test.ts +69 -0
  747. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +2 -2
  748. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +23 -1
  749. package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +117 -3
  750. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +35 -14
  751. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +3 -2
  752. package/dist/extensions/pi-subagents/test/unit/release-readiness.test.ts +715 -0
  753. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +261 -9
  754. package/dist/extensions/pi-subagents/test/unit/reply-workflow-script.test.ts +37 -0
  755. package/dist/extensions/pi-subagents/test/unit/required-child-extensions.test.ts +114 -0
  756. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +11 -1
  757. package/dist/extensions/pi-subagents/test/unit/result-takeover.test.ts +332 -0
  758. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +22 -2
  759. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +125 -18
  760. package/dist/extensions/pi-subagents/test/unit/run-child-session.test.ts +230 -0
  761. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +50 -1
  762. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +301 -4
  763. package/dist/extensions/pi-subagents/test/unit/runner-bootstrap.test.ts +182 -0
  764. package/dist/extensions/pi-subagents/test/unit/runner-http-dispatcher.test.ts +136 -0
  765. package/dist/extensions/pi-subagents/test/unit/runner-peer-loader.test.ts +68 -0
  766. package/dist/extensions/pi-subagents/test/unit/runner-peer-symlinks.test.ts +50 -0
  767. package/dist/extensions/pi-subagents/test/unit/running-tone.test.ts +13 -0
  768. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +155 -4
  769. package/dist/extensions/pi-subagents/test/unit/schedule-claim-initialization.test.ts +71 -0
  770. package/dist/extensions/pi-subagents/test/unit/schedule-claim-preservation.test.ts +98 -0
  771. package/dist/extensions/pi-subagents/test/unit/schedule-history-transactions.test.ts +201 -0
  772. package/dist/extensions/pi-subagents/test/unit/scheduled-mission.test.ts +317 -0
  773. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +412 -11
  774. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +2 -8
  775. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +70 -71
  776. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +748 -5
  777. package/dist/extensions/pi-subagents/test/unit/session-liveness-delivery.test.ts +337 -0
  778. package/dist/extensions/pi-subagents/test/unit/settings-atomic-save.test.ts +419 -0
  779. package/dist/extensions/pi-subagents/test/unit/settings-transactions.test.ts +88 -0
  780. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -1
  781. package/dist/extensions/pi-subagents/test/unit/skills-disable-model-invocation.test.ts +164 -0
  782. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +35 -2
  783. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +2 -2
  784. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +334 -9
  785. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +170 -0
  786. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +34 -5
  787. package/dist/extensions/pi-subagents/test/unit/structured-output-validation.test.ts +199 -0
  788. package/dist/extensions/pi-subagents/test/unit/structured-workflow-resources.test.ts +241 -0
  789. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +47 -38
  790. package/dist/extensions/pi-subagents/test/unit/subagent-cost.test.ts +97 -0
  791. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +10 -0
  792. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +343 -44
  793. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +410 -11
  794. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +459 -22
  795. package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +43 -3
  796. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +11 -1
  797. package/dist/extensions/pi-subagents/test/unit/tool-activation-stale-peer.test.ts +32 -0
  798. package/dist/extensions/pi-subagents/test/unit/tool-activation.test.ts +313 -0
  799. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +14 -0
  800. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -89
  801. package/dist/extensions/pi-subagents/test/unit/typed-gate-output.test.ts +141 -0
  802. package/dist/extensions/pi-subagents/test/unit/upgrade-notice.test.ts +31 -0
  803. package/dist/extensions/pi-subagents/test/unit/usage-reconciliation-owners.test.ts +66 -0
  804. package/dist/extensions/pi-subagents/test/unit/usage-reconciliation.test.ts +23 -0
  805. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +195 -1
  806. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +3 -1
  807. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +48 -45
  808. package/dist/extensions/pi-subagents/test/unit/watchdog-compaction-scope.test.ts +94 -0
  809. package/dist/extensions/pi-subagents/test/unit/watchdog-diff-tool.test.ts +48 -3
  810. package/dist/extensions/pi-subagents/test/unit/watchdog-native-scheduling.test.ts +107 -0
  811. package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +95 -7
  812. package/dist/extensions/pi-subagents/test/unit/watchdog-register-child.test.ts +79 -0
  813. package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +7 -4
  814. package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +111 -24
  815. package/dist/extensions/pi-subagents/test/unit/watchdog-rules.test.ts +1 -1
  816. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +283 -2
  817. package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +3 -0
  818. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +12 -1
  819. package/dist/extensions/pi-subagents/test/unit/watchdog-stable-host-layout.test.ts +23 -0
  820. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +30 -0
  821. package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +39 -2
  822. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +18 -1
  823. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +8 -4
  824. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +10 -0
  825. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +6 -3
  826. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +44 -1
  827. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +28 -1
  828. package/dist/extensions/pi-subagents/test/unit/workflow-revival.test.ts +85 -0
  829. package/dist/extensions/pi-subagents/test/unit/workflow-scripts-feature.test.ts +177 -0
  830. package/dist/extensions/pi-subagents/test/unit/workflow-terminal-proof.test.ts +8 -0
  831. package/dist/extensions/pi-subagents/test/unit/workflow-worktree-admission.test.ts +29 -0
  832. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +343 -4
  833. package/dist/extensions/pi-subagents/test/unit/worktree-lock.test.ts +123 -0
  834. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +252 -22
  835. package/dist/extensions/pi-subagents/tsconfig.build.json +13 -0
  836. package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +1 -1
  837. package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +1 -1
  838. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +24 -1
  839. package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +6 -2
  840. package/dist/extensions/pi-web-agent/src/extension.ts +1 -5
  841. package/dist/extensions/pi-zentui/.github/workflows/ci.yml +67 -4
  842. package/dist/extensions/pi-zentui/AGENTS.md +3 -2
  843. package/dist/extensions/pi-zentui/README.md +60 -32
  844. package/dist/extensions/pi-zentui/docs/configuration.md +662 -51
  845. package/dist/extensions/pi-zentui/docs/footer-format.md +174 -5
  846. package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-editor.ts +15 -4
  847. package/dist/extensions/pi-zentui/extensions/zentui/average-token-rate.ts +146 -0
  848. package/dist/extensions/pi-zentui/extensions/zentui/codex-quota-display.ts +34 -0
  849. package/dist/extensions/pi-zentui/extensions/zentui/codex-quota.ts +298 -0
  850. package/dist/extensions/pi-zentui/extensions/zentui/component-colors.ts +172 -0
  851. package/dist/extensions/pi-zentui/extensions/zentui/component-settings.ts +243 -0
  852. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +851 -114
  853. package/dist/extensions/pi-zentui/extensions/zentui/custom-value-colors.ts +93 -0
  854. package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-demand.ts +61 -0
  855. package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-format.ts +80 -0
  856. package/dist/extensions/pi-zentui/extensions/zentui/custom-variables.ts +152 -0
  857. package/dist/extensions/pi-zentui/extensions/zentui/editor-metadata-format.ts +138 -23
  858. package/dist/extensions/pi-zentui/extensions/zentui/editor-mouse.ts +89 -0
  859. package/dist/extensions/pi-zentui/extensions/zentui/extension-status-controller.ts +148 -0
  860. package/dist/extensions/pi-zentui/extensions/zentui/extension-status-settings.ts +40 -0
  861. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +109 -1
  862. package/dist/extensions/pi-zentui/extensions/zentui/footer-format.ts +203 -23
  863. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +80 -3
  864. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +1 -1
  865. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +432 -125
  866. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +92 -4
  867. package/dist/extensions/pi-zentui/extensions/zentui/git.ts +47 -30
  868. package/dist/extensions/pi-zentui/extensions/zentui/github-status.ts +575 -0
  869. package/dist/extensions/pi-zentui/extensions/zentui/host-project-changes.ts +25 -0
  870. package/dist/extensions/pi-zentui/extensions/zentui/host-template-values.ts +29 -0
  871. package/dist/extensions/pi-zentui/extensions/zentui/icons.ts +53 -13
  872. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +778 -258
  873. package/dist/extensions/pi-zentui/extensions/zentui/interaction-summary.ts +70 -5
  874. package/dist/extensions/pi-zentui/extensions/zentui/layered-editor.ts +55 -0
  875. package/dist/extensions/pi-zentui/extensions/zentui/live-context.ts +6 -1
  876. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-demand.ts +72 -0
  877. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-display.ts +21 -0
  878. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata.ts +255 -0
  879. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-editor.ts +476 -36
  880. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-settings.ts +118 -0
  881. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-template.ts +177 -0
  882. package/dist/extensions/pi-zentui/extensions/zentui/omp-editor-frame.ts +148 -0
  883. package/dist/extensions/pi-zentui/extensions/zentui/omp-statusline.ts +569 -0
  884. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-lookups.ts +344 -0
  885. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-metrics.ts +91 -0
  886. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-modes.ts +323 -0
  887. package/dist/extensions/pi-zentui/extensions/zentui/omp-ui.ts +210 -0
  888. package/dist/extensions/pi-zentui/extensions/zentui/package-version.ts +30 -12
  889. package/dist/extensions/pi-zentui/extensions/zentui/project-demand.ts +46 -0
  890. package/dist/extensions/pi-zentui/extensions/zentui/project-discovery.ts +58 -0
  891. package/dist/extensions/pi-zentui/extensions/zentui/project-refresh.ts +10 -3
  892. package/dist/extensions/pi-zentui/extensions/zentui/project-state.ts +37 -0
  893. package/dist/extensions/pi-zentui/extensions/zentui/repository-root.ts +1 -0
  894. package/dist/extensions/pi-zentui/extensions/zentui/runtime.ts +119 -43
  895. package/dist/extensions/pi-zentui/extensions/zentui/selector-border.ts +40 -29
  896. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +1268 -722
  897. package/dist/extensions/pi-zentui/extensions/zentui/settings-keys.ts +59 -0
  898. package/dist/extensions/pi-zentui/extensions/zentui/settings-list-selection.ts +13 -0
  899. package/dist/extensions/pi-zentui/extensions/zentui/settings-previews.ts +11 -4
  900. package/dist/extensions/pi-zentui/extensions/zentui/state.ts +24 -11
  901. package/dist/extensions/pi-zentui/extensions/zentui/style.ts +6 -0
  902. package/dist/extensions/pi-zentui/extensions/zentui/telemetry.ts +113 -11
  903. package/dist/extensions/pi-zentui/extensions/zentui/thinking-experimental.ts +234 -46
  904. package/dist/extensions/pi-zentui/extensions/zentui/thinking-steps.ts +20 -5
  905. package/dist/extensions/pi-zentui/extensions/zentui/token-rate.ts +313 -0
  906. package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-format.ts +59 -0
  907. package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-rate.ts +52 -0
  908. package/dist/extensions/pi-zentui/extensions/zentui/ui.ts +640 -172
  909. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +72 -34
  910. package/dist/extensions/pi-zentui/extensions/zentui/user-message.ts +219 -34
  911. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +495 -119
  912. package/dist/extensions/pi-zentui/omp.ts +157 -0
  913. package/dist/extensions/pi-zentui/package-lock.json +3762 -1507
  914. package/dist/extensions/pi-zentui/package.json +50 -12
  915. package/dist/extensions/pi-zentui/test/accent-rail-editor.test.ts +13 -2
  916. package/dist/extensions/pi-zentui/test/average-token-rate.test.ts +297 -0
  917. package/dist/extensions/pi-zentui/test/behavior-compatibility.mjs +89 -0
  918. package/dist/extensions/pi-zentui/test/codex-quota-lifecycle.test.ts +284 -0
  919. package/dist/extensions/pi-zentui/test/codex-quota-rendering.test.ts +466 -0
  920. package/dist/extensions/pi-zentui/test/codex-quota.test.ts +440 -0
  921. package/dist/extensions/pi-zentui/test/component-colors.test.ts +554 -0
  922. package/dist/extensions/pi-zentui/test/component-settings.test.ts +364 -0
  923. package/dist/extensions/pi-zentui/test/config-component-independence.test.ts +402 -0
  924. package/dist/extensions/pi-zentui/test/config-extension-status-choice.test.ts +233 -0
  925. package/dist/extensions/pi-zentui/test/config-hidden-extension-status-colors.test.ts +118 -0
  926. package/dist/extensions/pi-zentui/test/config-hidden-extension-status-placement.test.ts +142 -0
  927. package/dist/extensions/pi-zentui/test/config-minimalist-templates.test.ts +240 -0
  928. package/dist/extensions/pi-zentui/test/config-template-variables.test.ts +85 -0
  929. package/dist/extensions/pi-zentui/test/config.test.ts +80 -17
  930. package/dist/extensions/pi-zentui/test/custom-value-colors-integration.test.ts +453 -0
  931. package/dist/extensions/pi-zentui/test/custom-value-colors.test.ts +399 -0
  932. package/dist/extensions/pi-zentui/test/custom-variable-alias-prototypes.test.ts +177 -0
  933. package/dist/extensions/pi-zentui/test/custom-variable-consumers.test.ts +194 -0
  934. package/dist/extensions/pi-zentui/test/custom-variable-demand.test.ts +169 -0
  935. package/dist/extensions/pi-zentui/test/custom-variable-probe-reservation.test.ts +141 -0
  936. package/dist/extensions/pi-zentui/test/custom-variables-lifecycle.integration.test.ts +365 -0
  937. package/dist/extensions/pi-zentui/test/custom-variables.test.ts +330 -0
  938. package/dist/extensions/pi-zentui/test/editor-metadata-format.test.ts +121 -0
  939. package/dist/extensions/pi-zentui/test/editor-mouse.test.ts +507 -0
  940. package/dist/extensions/pi-zentui/test/editor-viewport-indicators.test.ts +247 -20
  941. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +204 -260
  942. package/dist/extensions/pi-zentui/test/extension-status-controller.test.ts +323 -0
  943. package/dist/extensions/pi-zentui/test/extension-status-lifecycle.integration.test.ts +466 -0
  944. package/dist/extensions/pi-zentui/test/extension-status-settings.test.ts +79 -0
  945. package/dist/extensions/pi-zentui/test/footer-alignment.test.ts +135 -0
  946. package/dist/extensions/pi-zentui/test/footer-authority.test.ts +69 -0
  947. package/dist/extensions/pi-zentui/test/footer-auto-compaction.test.ts +148 -0
  948. package/dist/extensions/pi-zentui/test/footer-format-cache.test.ts +186 -0
  949. package/dist/extensions/pi-zentui/test/footer-format.test.ts +154 -4
  950. package/dist/extensions/pi-zentui/test/footer-hidden.test.ts +312 -0
  951. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +22 -0
  952. package/dist/extensions/pi-zentui/test/footer-layout.test.ts +80 -0
  953. package/dist/extensions/pi-zentui/test/footer-thinking-level.test.ts +123 -0
  954. package/dist/extensions/pi-zentui/test/format.test.ts +75 -1
  955. package/dist/extensions/pi-zentui/test/git-probes.test.ts +182 -0
  956. package/dist/extensions/pi-zentui/test/github-status.test.ts +931 -0
  957. package/dist/extensions/pi-zentui/test/host-template-surfaces.test.ts +287 -0
  958. package/dist/extensions/pi-zentui/test/icons.test.ts +86 -16
  959. package/dist/extensions/pi-zentui/test/layered-editor.test.ts +53 -0
  960. package/dist/extensions/pi-zentui/test/live-context-integration.test.ts +154 -7
  961. package/dist/extensions/pi-zentui/test/live-context.test.ts +45 -0
  962. package/dist/extensions/pi-zentui/test/live-metadata-lifecycle.integration.test.ts +963 -0
  963. package/dist/extensions/pi-zentui/test/live-metadata.test.ts +767 -0
  964. package/dist/extensions/pi-zentui/test/minimalist-cache-hit-colors.test.ts +183 -0
  965. package/dist/extensions/pi-zentui/test/minimalist-editor.test.ts +222 -4
  966. package/dist/extensions/pi-zentui/test/minimalist-settings.test.ts +103 -0
  967. package/dist/extensions/pi-zentui/test/minimalist-templates.test.ts +489 -0
  968. package/dist/extensions/pi-zentui/test/omp-editor-composers.test.ts +324 -0
  969. package/dist/extensions/pi-zentui/test/omp-statusline.test.ts +579 -0
  970. package/dist/extensions/pi-zentui/test/omp-template-lookups.test.ts +630 -0
  971. package/dist/extensions/pi-zentui/test/omp-template-metrics.test.ts +72 -0
  972. package/dist/extensions/pi-zentui/test/omp-template-modes.test.ts +557 -0
  973. package/dist/extensions/pi-zentui/test/omp-ui.test.ts +93 -0
  974. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  975. package/dist/extensions/pi-zentui/test/pi-version-policy.test.ts +37 -0
  976. package/dist/extensions/pi-zentui/test/project-demand-integration.test.ts +542 -0
  977. package/dist/extensions/pi-zentui/test/project-discovery.test.ts +412 -0
  978. package/dist/extensions/pi-zentui/test/project-refresh.test.ts +44 -0
  979. package/dist/extensions/pi-zentui/test/project-state.test.ts +38 -1
  980. package/dist/extensions/pi-zentui/test/responsive-dependencies.test.ts +7 -7
  981. package/dist/extensions/pi-zentui/test/runtime.test.ts +127 -2
  982. package/dist/extensions/pi-zentui/test/selesai-v030-gate.json +939 -0
  983. package/dist/extensions/pi-zentui/test/settings-command.test.ts +1330 -82
  984. package/dist/extensions/pi-zentui/test/settings-keys.test.ts +41 -0
  985. package/dist/extensions/pi-zentui/test/settings-list-selection.test.ts +88 -0
  986. package/dist/extensions/pi-zentui/test/settings-previews.test.ts +4 -1
  987. package/dist/extensions/pi-zentui/test/state.test.ts +15 -1
  988. package/dist/extensions/pi-zentui/test/telemetry-lifecycle-integration.test.ts +214 -12
  989. package/dist/extensions/pi-zentui/test/telemetry-snapshot.test.ts +246 -0
  990. package/dist/extensions/pi-zentui/test/thinking-experimental-cache.test.ts +246 -0
  991. package/dist/extensions/pi-zentui/test/thinking-experimental-rows.test.ts +22 -0
  992. package/dist/extensions/pi-zentui/test/thinking-experimental-tui.mjs +113 -51
  993. package/dist/extensions/pi-zentui/test/thinking-experimental.test.ts +576 -76
  994. package/dist/extensions/pi-zentui/test/thinking-steps.test.ts +23 -0
  995. package/dist/extensions/pi-zentui/test/token-rate.test.ts +450 -0
  996. package/dist/extensions/pi-zentui/test/turn-summary-format.test.ts +207 -0
  997. package/dist/extensions/pi-zentui/test/turn-summary-lifecycle.integration.test.ts +72 -5
  998. package/dist/extensions/pi-zentui/test/turn-summary-rate.test.ts +158 -0
  999. package/dist/extensions/pi-zentui/test/usage-lifecycle-integration.test.ts +421 -0
  1000. package/dist/extensions/pi-zentui/test/usage-snapshot.test.ts +154 -0
  1001. package/dist/extensions/pi-zentui/test/user-message-cache.test.ts +239 -0
  1002. package/dist/extensions/pi-zentui/test/user-message-native-reduced-capabilities.test.ts +61 -0
  1003. package/dist/extensions/pi-zentui/test/user-message-native.test.ts +447 -0
  1004. package/dist/extensions/pi-zentui/test/user-message-styles.test.ts +2 -2
  1005. package/dist/extensions/pi-zentui/test/working-line-editor-placement.test.ts +317 -0
  1006. package/dist/extensions/pi-zentui/test/working-line-generation-cache.test.ts +238 -0
  1007. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +674 -179
  1008. package/dist/extensions/pi-zentui/test/working-line-message-ownership.test.ts +239 -0
  1009. package/dist/extensions/pi-zentui/test/working-line-metric-animation.test.ts +284 -0
  1010. package/dist/extensions/pi-zentui/test/working-line-placement.test.ts +298 -0
  1011. package/dist/extensions/pi-zentui/test/working-line.test.ts +386 -18
  1012. package/dist/extensions/pi-zentui/test/wrapped-editor-consumers.integration.test.ts +579 -0
  1013. package/dist/extensions/pi-zentui/test/wrapped-editor-usage.integration.test.ts +298 -0
  1014. package/dist/extensions/pi-zentui/tsconfig.json +1 -1
  1015. package/dist/extensions/pi-zentui/vitest.host.config.ts +33 -0
  1016. package/dist/extensions/question/index.ts +1 -5
  1017. package/dist/extensions/rtk.test.ts +28 -15
  1018. package/dist/extensions/rtk.ts +22 -22
  1019. package/dist/extensions/skills-index/index.test.ts +99 -0
  1020. package/dist/extensions/skills-index/index.ts +105 -0
  1021. package/dist/extensions/skills-index/package.json +9 -0
  1022. package/dist/extensions/tokenin-onboarding.ts +52 -210
  1023. package/dist/extensions/tool-search/index.d.ts +11 -0
  1024. package/dist/extensions/tool-search/index.js +14 -0
  1025. package/dist/extensions/tool-search/tool.d.ts +72 -0
  1026. package/dist/extensions/tool-search/tool.js +188 -0
  1027. package/dist/index.d.ts +21 -9
  1028. package/dist/index.js +17 -5
  1029. package/dist/main.d.ts +10 -0
  1030. package/dist/main.js +107 -43
  1031. package/dist/migrations.js +4 -3
  1032. package/dist/modes/index.d.ts +2 -1
  1033. package/dist/modes/interactive/bug-report.js +4 -0
  1034. package/dist/modes/interactive/components/armin.d.ts +3 -0
  1035. package/dist/modes/interactive/components/armin.js +7 -5
  1036. package/dist/modes/interactive/components/assistant-message.js +1 -1
  1037. package/dist/modes/interactive/components/auth-url.d.ts +13 -0
  1038. package/dist/modes/interactive/components/auth-url.js +36 -0
  1039. package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  1040. package/dist/modes/interactive/components/bash-execution.js +17 -14
  1041. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  1042. package/dist/modes/interactive/components/branch-summary-message.js +5 -2
  1043. package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
  1044. package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
  1045. package/dist/modes/interactive/components/config-selector.js +13 -3
  1046. package/dist/modes/interactive/components/custom-editor.js +7 -0
  1047. package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
  1048. package/dist/modes/interactive/components/custom-entry.js +8 -2
  1049. package/dist/modes/interactive/components/custom-message.js +1 -0
  1050. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  1051. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  1052. package/dist/modes/interactive/components/footer.d.ts +7 -0
  1053. package/dist/modes/interactive/components/footer.js +44 -4
  1054. package/dist/modes/interactive/components/index.d.ts +0 -1
  1055. package/dist/modes/interactive/components/index.js +0 -1
  1056. package/dist/modes/interactive/components/login-dialog.d.ts +2 -0
  1057. package/dist/modes/interactive/components/login-dialog.js +11 -5
  1058. package/dist/modes/interactive/components/mermaid.d.ts +10 -0
  1059. package/dist/modes/interactive/components/mermaid.js +74 -0
  1060. package/dist/modes/interactive/components/model-selector.d.ts +14 -9
  1061. package/dist/modes/interactive/components/model-selector.js +79 -31
  1062. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  1063. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  1064. package/dist/modes/interactive/components/pi-logo.d.ts +18 -0
  1065. package/dist/modes/interactive/components/pi-logo.js +36 -0
  1066. package/dist/modes/interactive/components/radius-login-selector.d.ts +14 -0
  1067. package/dist/modes/interactive/components/radius-login-selector.js +84 -0
  1068. package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
  1069. package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
  1070. package/dist/modes/interactive/components/settings-selector.d.ts +8 -11
  1071. package/dist/modes/interactive/components/settings-selector.js +60 -102
  1072. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  1073. package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
  1074. package/dist/modes/interactive/components/themed-text.d.ts +16 -0
  1075. package/dist/modes/interactive/components/themed-text.js +28 -0
  1076. package/dist/modes/interactive/components/tool-execution.d.ts +11 -18
  1077. package/dist/modes/interactive/components/tool-execution.js +34 -47
  1078. package/dist/modes/interactive/components/tree-selector.js +7 -0
  1079. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  1080. package/dist/modes/interactive/components/user-message.js +14 -6
  1081. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  1082. package/dist/modes/interactive/components/visual-truncate.js +39 -6
  1083. package/dist/modes/interactive/external-editor.js +2 -1
  1084. package/dist/modes/interactive/interactive-mode.d.ts +41 -8
  1085. package/dist/modes/interactive/interactive-mode.js +854 -492
  1086. package/dist/modes/interactive/program-status-reporter.d.ts +33 -0
  1087. package/dist/modes/interactive/program-status-reporter.js +109 -0
  1088. package/dist/modes/interactive/theme/dark.json +59 -72
  1089. package/dist/modes/interactive/theme/light.json +57 -69
  1090. package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
  1091. package/dist/modes/interactive/theme/system-theme.js +545 -0
  1092. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  1093. package/dist/modes/interactive/theme/theme-controller.js +127 -47
  1094. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  1095. package/dist/modes/interactive/theme/theme-json.js +3 -1
  1096. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  1097. package/dist/modes/interactive/theme/theme.d.ts +66 -39
  1098. package/dist/modes/interactive/theme/theme.js +243 -320
  1099. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  1100. package/dist/modes/interactive/tui-renderer.js +1 -0
  1101. package/dist/modes/json-event.d.ts +33 -0
  1102. package/dist/modes/json-event.js +28 -0
  1103. package/dist/modes/print-mode.js +12 -2
  1104. package/dist/modes/rpc/intercom-bridge.d.ts +14 -0
  1105. package/dist/modes/rpc/intercom-bridge.js +75 -0
  1106. package/dist/modes/rpc/intercom-bridge.test.js +65 -0
  1107. package/dist/modes/rpc/release-bridge.d.ts +35 -0
  1108. package/dist/modes/rpc/release-bridge.js +159 -0
  1109. package/dist/modes/rpc/release-bridge.test.d.ts +1 -0
  1110. package/dist/modes/rpc/release-bridge.test.js +347 -0
  1111. package/dist/modes/rpc/rpc-client.d.ts +43 -27
  1112. package/dist/modes/rpc/rpc-client.js +97 -37
  1113. package/dist/modes/rpc/rpc-intercom-transport.test.d.ts +1 -0
  1114. package/dist/modes/rpc/rpc-intercom-transport.test.js +85 -0
  1115. package/dist/modes/rpc/rpc-mode.d.ts +1 -13
  1116. package/dist/modes/rpc/rpc-mode.js +250 -34
  1117. package/dist/modes/rpc/rpc-release-transport.test.d.ts +1 -0
  1118. package/dist/modes/rpc/rpc-release-transport.test.js +329 -0
  1119. package/dist/modes/rpc/rpc-subagent-transport.test.d.ts +1 -0
  1120. package/dist/modes/rpc/rpc-subagent-transport.test.js +60 -0
  1121. package/dist/modes/rpc/rpc-types.d.ts +22 -23
  1122. package/dist/modes/rpc/rpc-types.js +0 -6
  1123. package/dist/modes/rpc/subagent-bridge.d.ts +23 -0
  1124. package/dist/modes/rpc/subagent-bridge.js +93 -0
  1125. package/dist/modes/rpc/test-fixtures/intercom-host.d.ts +1 -0
  1126. package/dist/modes/rpc/test-fixtures/intercom-host.js +13 -0
  1127. package/dist/package-manager-cli.js +16 -5
  1128. package/dist/rpc-entry.js +1 -0
  1129. package/dist/skills/pi-subagents/SKILL.md +109 -35
  1130. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +38 -238
  1131. package/dist/skills/pi-subagents/references/execution-controls.md +181 -83
  1132. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +9 -9
  1133. package/dist/skills/pi-subagents/references/multi-lane-orchestration.md +24 -2
  1134. package/dist/skills/pi-subagents/references/prompting-and-roles.md +121 -91
  1135. package/dist/skills/pi-subagents/references/review-and-validation.md +73 -0
  1136. package/dist/utils/ansi.d.ts +8 -0
  1137. package/dist/utils/ansi.js +30 -11
  1138. package/dist/utils/clipboard-image.js +14 -17
  1139. package/dist/utils/clipboard.d.ts +2 -0
  1140. package/dist/utils/clipboard.js +17 -11
  1141. package/dist/utils/frontmatter.js +2 -1
  1142. package/dist/utils/image-convert.d.ts +12 -0
  1143. package/dist/utils/image-convert.js +45 -6
  1144. package/dist/utils/image-resize-core.d.ts +12 -0
  1145. package/dist/utils/image-resize-core.js +5 -0
  1146. package/dist/utils/image-resize-worker.js +3 -2
  1147. package/dist/utils/image-resize.js +9 -10
  1148. package/dist/utils/mime.js +1 -1
  1149. package/dist/utils/output-files.d.ts +14 -0
  1150. package/dist/utils/output-files.js +29 -0
  1151. package/dist/utils/paths.d.ts +6 -3
  1152. package/dist/utils/paths.js +28 -5
  1153. package/dist/utils/shell.d.ts +1 -3
  1154. package/dist/utils/shell.js +3 -30
  1155. package/dist/utils/syntax-highlight.d.ts +1 -0
  1156. package/dist/utils/syntax-highlight.js +68 -2
  1157. package/dist/utils/tool-result-images.d.ts +20 -0
  1158. package/dist/utils/tool-result-images.js +47 -0
  1159. package/dist/utils/tools-manager.d.ts +5 -0
  1160. package/dist/utils/tools-manager.js +6 -6
  1161. package/dist/utils/version-check.d.ts +4 -0
  1162. package/dist/utils/version-check.js +20 -2
  1163. package/docs/cli-integration.md +104 -0
  1164. package/docs/cli.md +333 -0
  1165. package/docs/codemode.md +230 -0
  1166. package/docs/configuration.md +47 -0
  1167. package/docs/environment-variables.md +5 -0
  1168. package/docs/extensions.md +107 -30
  1169. package/docs/json.md +8 -4
  1170. package/docs/keybindings.md +10 -10
  1171. package/docs/mcp.md +262 -0
  1172. package/docs/models.md +104 -3
  1173. package/docs/providers.md +20 -2
  1174. package/docs/rpc-subagent.schema.json +491 -0
  1175. package/docs/rpc.md +223 -13
  1176. package/docs/sdk.md +41 -33
  1177. package/docs/security.md +21 -20
  1178. package/docs/settings.md +18 -46
  1179. package/docs/terminal-setup.md +14 -0
  1180. package/docs/virtual-models.md +114 -0
  1181. package/examples/extensions/jev-router.ts +113 -0
  1182. package/examples/extensions/tokenin-usage-widget.ts +124 -0
  1183. package/examples/rpc-client.ts +35 -0
  1184. package/examples/sdk/14-codemode-mcp.ts +67 -0
  1185. package/package.json +16 -8
  1186. package/dist/core/agent-session-auto-handoff.test.js +0 -195
  1187. package/dist/core/built-in-extensions.d.ts +0 -2
  1188. package/dist/core/built-in-extensions.js +0 -2
  1189. package/dist/core/llama/provider.js +0 -143
  1190. package/dist/core/settings-manager-auto-handoff.test.js +0 -53
  1191. package/dist/extensions/capability-gateway/catalog.ts +0 -177
  1192. package/dist/extensions/capability-gateway/index.test.ts +0 -226
  1193. package/dist/extensions/capability-gateway/index.ts +0 -669
  1194. package/dist/extensions/capability-gateway/integration.test.ts +0 -803
  1195. package/dist/extensions/capability-gateway/package.json +0 -16
  1196. package/dist/extensions/capability-gateway/routing.test.ts +0 -574
  1197. package/dist/extensions/capability-gateway/routing.ts +0 -403
  1198. package/dist/extensions/pi-subagents/runner-server-preload.mjs +0 -13
  1199. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +0 -89
  1200. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +0 -259
  1201. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +0 -312
  1202. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +0 -374
  1203. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +0 -69
  1204. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +0 -307
  1205. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +0 -211
  1206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  1207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  1208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  1209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  1210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  1211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  1212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  1213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  1214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  1215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  1216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  1217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  1218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  1219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  1220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  1221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  1222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  1223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  1224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  1225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  1226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  1227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  1228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  1229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  1230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  1231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  1232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  1233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  1234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  1235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  1236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  1237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  1238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  1239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  1240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  1241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  1242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  1243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  1244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  1245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  1246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  1247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  1248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  1249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  1250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  1251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  1252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  1253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  1254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  1255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  1256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  1257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  1258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  1259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  1260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  1261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  1262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  1263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  1264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  1265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  1266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  1267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  1268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  1269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  1270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  1271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  1272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  1273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  1274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  1275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  1276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  1277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  1278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  1279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  1280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  1281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  1282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  1283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  1284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  1285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  1286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  1287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  1288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  1289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  1290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  1291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  1292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  1293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  1294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  1295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  1296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  1297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  1298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  1299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  1300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  1301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  1302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  1303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  1304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  1305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  1306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  1307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  1308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  1309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  1310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  1311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  1312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  1313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  1314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  1315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  1316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  1317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  1318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  1319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  1320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  1321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  1322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  1323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  1324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  1325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  1326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  1327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  1328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  1329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  1330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  1331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  1332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  1333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  1334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  1335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  1336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  1337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  1338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  1339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  1340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  1341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  1342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  1343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  1344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  1345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  1346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  1347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  1348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  1349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  1350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  1351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  1352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  1353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  1354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  1355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  1356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  1357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  1358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  1359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  1360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  1361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  1362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  1363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  1364. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  1365. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  1366. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  1367. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  1368. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  1369. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  1370. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  1371. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  1372. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  1373. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  1374. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  1375. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  1376. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  1377. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  1378. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  1379. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
  1380. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +0 -31
  1381. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +0 -74
  1382. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +0 -150
  1383. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +0 -766
  1384. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +0 -327
  1385. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +0 -309
  1386. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +0 -1093
  1387. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +0 -94
  1388. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +0 -1329
  1389. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +0 -153
  1390. package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-layout-patch.ts +0 -457
  1391. package/dist/extensions/pi-zentui/test/accent-rail-layout-patch.test.ts +0 -669
  1392. package/dist/extensions/pi-zentui/test/thinking-experimental-docs.test.ts +0 -51
  1393. package/dist/modes/interactive/components/daxnuts.d.ts +0 -22
  1394. package/dist/modes/interactive/components/daxnuts.js +0 -139
  1395. /package/dist/core/{agent-session-auto-handoff.test.d.ts → agent-session-custom-tools.test.d.ts} +0 -0
  1396. /package/dist/{core → extensions}/llama/huggingface.d.ts +0 -0
  1397. /package/dist/{core → extensions}/llama/huggingface.js +0 -0
  1398. /package/dist/{core → extensions}/llama/index.d.ts +0 -0
  1399. /package/dist/{core → extensions}/llama/ui.d.ts +0 -0
  1400. /package/dist/{core → extensions}/llama/ui.js +0 -0
  1401. /package/dist/{core/settings-manager-auto-handoff.test.d.ts → modes/rpc/intercom-bridge.test.d.ts} +0 -0
@@ -1,11 +1,12 @@
1
- import { defineTool, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
1
+ import { BorderedLoader, 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";
5
5
  import { Text } from "@earendil-works/pi-tui";
6
6
  import { IntercomClient, type SendResult } from "./broker/client.ts";
7
7
  import { spawnBrokerIfNeeded } from "./broker/spawn.ts";
8
- import { SessionListOverlay } from "./ui/session-list.ts";
8
+ import { SessionListOverlay, type SessionListSelection } from "./ui/session-list.ts";
9
+ import { HandoverPicker, type HandoverPickerResult, type RemoteSessionLister } from "./ui/handover-picker.ts";
9
10
  import { ComposeOverlay, type ComposeResult } from "./ui/compose.ts";
10
11
  import { InlineMessageComponent } from "./ui/inline-message.ts";
11
12
  import { getAskTimeoutMs, loadConfig, type IntercomConfig } from "./config.ts";
@@ -16,6 +17,7 @@ import {
16
17
  INTERCOM_EXTENSION_REGISTRY_READY_EVENT,
17
18
  INTERCOM_OUTBOX_REQUEST_EVENT,
18
19
  INTERCOM_OUTBOX_RESULT_EVENT,
20
+ INTERCOM_SESSION_IDENTITY_EVENT,
19
21
  type IntercomExtensionChannel,
20
22
  type IntercomExtensionEvent,
21
23
  type IntercomExtensionOwner,
@@ -25,12 +27,25 @@ import {
25
27
  type IntercomOutboxResultCode,
26
28
  type IntercomOutboxResultStatus,
27
29
  type IntercomOutboxResultV1,
30
+ INTERCOM_RPC_REQUEST_EVENT, INTERCOM_RPC_RESULT_EVENT, INTERCOM_RPC_EVENT,
31
+ intercomRpcTimeout, type IntercomRpcRequest, type IntercomRpcResult,
32
+ type IntercomRpcEventData as IntercomRpcEvent, type IntercomRpcDelivery,
33
+ RELEASE_READINESS_EVENT, answerReleaseReadiness,
34
+ STOP_ALL_BACKGROUND_EVENT, answerStopAllBackground,
35
+ type IntercomSessionIdentityRequestV1,
28
36
  } from "./extension-api.ts";
37
+ import { intercomReleaseBlockers, stopIntercom } from "./release-readiness.ts";
38
+ import { isMessage } from "./broker/protocol.ts";
29
39
  import { ReplyTracker } from "./reply-tracker.ts";
30
- import { resolve as resolvePath } from "node:path";
40
+ import { homedir } from "node:os";
41
+ import { join as joinPath, resolve as resolvePath } from "node:path";
31
42
  import { sameCwd } from "./cwd.ts";
32
43
  import { formatContextUsage } from "./format-context.ts";
33
44
  import { openProjectPane, resolveTargetInCwd, waitForProjectSession, type ProjectPaneLaunch } from "./project-agent.ts";
45
+ import { relaySenderName } from "./cross-machine-envelope.ts";
46
+ import { runCommand, sendCrossMachine } from "./cross-machine-transport.ts";
47
+ import { listMachineAgents, listSavedMachines, parseCrossMachineTarget } from "./cross-machine-discovery.ts";
48
+ import { formatHandoverMessage, generateHandoverBody, readGitState } from "./handover.ts";
34
49
 
35
50
  const INTERCOM_TOOL_NAME = "intercom";
36
51
  const SUBAGENT_CONTROL_INTERCOM_EVENT = "subagent:control-intercom";
@@ -72,6 +87,25 @@ interface DeliveryTarget {
72
87
  projectPane?: ProjectPaneLaunch;
73
88
  }
74
89
 
90
+ interface DeliveryRequest {
91
+ to?: string;
92
+ cwd?: string;
93
+ openProjectPaneIfMissing?: boolean;
94
+ focus?: boolean;
95
+ message: string;
96
+ attachments?: Attachment[];
97
+ replyTo?: string;
98
+ supersedes?: string;
99
+ retryOf?: string;
100
+ /** Handovers are always new messages and are not sent once the signal aborts. */
101
+ handover?: boolean;
102
+ }
103
+
104
+ interface IntercomToolResult {
105
+ content: Array<{ type: "text"; text: string }>;
106
+ details: Record<string, unknown>;
107
+ }
108
+
75
109
  interface OutboxTarget {
76
110
  id: string;
77
111
  label: string;
@@ -113,6 +147,25 @@ function getErrorMessage(error: unknown): string {
113
147
  return error instanceof Error ? error.message : String(error);
114
148
  }
115
149
 
150
+ export function explicitCrossMachineSendRestriction(options: {
151
+ to?: string;
152
+ cwd?: string;
153
+ openProjectPaneIfMissing?: boolean;
154
+ attachments?: readonly unknown[];
155
+ replyTo?: string;
156
+ supersedes?: string;
157
+ retryOf?: string;
158
+ }): string | undefined {
159
+ if (!options.to?.includes("@")) return undefined;
160
+ if (options.cwd || options.openProjectPaneIfMissing) {
161
+ return "Cross-machine send does not support cwd or opening project panes.";
162
+ }
163
+ if (options.replyTo || options.supersedes || options.retryOf || options.attachments?.length) {
164
+ return "Cross-machine send only supports a new text message; attachments, reply relationships, supersede, and retry are not supported.";
165
+ }
166
+ return undefined;
167
+ }
168
+
116
169
  function deliveryDetails(result: SendResult): Record<string, unknown> {
117
170
  return {
118
171
  messageId: result.id,
@@ -517,6 +570,14 @@ function currentTmuxPane(): string | undefined {
517
570
  const pane = process.env.TMUX_PANE?.trim();
518
571
  return pane ? pane : undefined;
519
572
  }
573
+ // Herdr exports a launch-time pane alias to hosted processes. Its visible,
574
+ // workspace-qualified id can change when the pane moves, so registration also
575
+ // carries the stable Pi session file and the broker resolves both against a
576
+ // fresh snapshot. Workspace and tab ids are intentionally never registered.
577
+ function currentHerdrPane(): string | undefined {
578
+ const pane = process.env.HERDR_PANE_ID?.trim();
579
+ return pane ? pane : undefined;
580
+ }
520
581
  function formatIntercomContactSnippet(sessionId: string): string {
521
582
  return `Use pi-intercom: intercom({ action: "send", to: "${sessionId}", message: "..." })`;
522
583
  }
@@ -528,13 +589,22 @@ function formatSessionLabel(session: SessionInfo, duplicates: Set<string>): stri
528
589
  ? `${session.name} (${session.id.slice(0, 8)})`
529
590
  : session.name;
530
591
  }
592
+ function formatHerdrLocation(session: SessionInfo): string {
593
+ const location = session.herdrLocation;
594
+ if (!location) return "";
595
+ if (location.status === "not_hosted") return "not under Herdr";
596
+ if (location.status === "unavailable") return `Herdr location unavailable: ${location.reason} (pane ${location.paneId})`;
597
+ return `Herdr ${location.workspace.label} [${location.workspace.id}] / ${location.tab.label} [${location.tab.id}] / pane ${location.paneId}`;
598
+ }
531
599
  function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean, idPrefix: string): string {
532
600
  const name = session.name || "Unnamed session";
533
601
  const tags = [isSelf ? "self" : session.cwd === currentCwd ? "same cwd" : undefined, session.status]
534
602
  .filter((tag): tag is string => Boolean(tag));
535
603
  const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
536
604
  const pane = session.tmuxPane ? ` · tmux ${session.tmuxPane}` : "";
537
- return `• ${name} (${idPrefix}) — ${session.cwd} (${session.model}${formatContextUsage(session)}${pane})${suffix}`;
605
+ const herdrLocation = formatHerdrLocation(session);
606
+ const herdr = herdrLocation ? ` · ${herdrLocation}` : "";
607
+ return `• ${name} (${idPrefix}) — ${session.cwd} (${session.model}${formatContextUsage(session)}${pane})${herdr}${suffix}`;
538
608
  }
539
609
  function previewText(value: unknown, maxLength = 72): string | undefined {
540
610
  if (typeof value !== "string") {
@@ -546,6 +616,9 @@ function previewText(value: unknown, maxLength = 72): string | undefined {
546
616
  }
547
617
  return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}…` : normalized;
548
618
  }
619
+ function expandHomePath(path: string): string {
620
+ return path === "~" ? homedir() : path.startsWith("~/") ? joinPath(homedir(), path.slice(2)) : path;
621
+ }
549
622
  function firstTextContent(result: { content?: Array<{ type: string; text?: string }> }): string {
550
623
  return result.content?.find((item) => item.type === "text" && typeof item.text === "string")?.text?.replace(/\*\*/g, "") ?? "";
551
624
  }
@@ -606,6 +679,27 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
606
679
  let runtimeStarted = false;
607
680
  let runtimeGeneration = 0;
608
681
  let agentRunning = false;
682
+ // A wake prompt stays pending until agent_start: Pi marks the run active only after its async
683
+ // preflight. Pi exposes no prompt completion, and a handled or failed preflight never emits
684
+ // agent_start, so the reservation expires after a bounded window instead of latching.
685
+ let idleWakeRequestedAt = 0;
686
+ const idleWakePending = () => idleWakeRequestedAt > 0 && Date.now() - idleWakeRequestedAt < 10_000;
687
+ const heldInboundMessages: InboundMessageEntry[] = [];
688
+ let heldInboundTimer: NodeJS.Timeout | null = null;
689
+ function dropHeldInboundMessage(messageId: string, receipt: { status: MessageReceiptStatus; detail?: string }): boolean {
690
+ const index = heldInboundMessages.findIndex((entry) => entry.message.id === messageId);
691
+ if (index < 0) return false;
692
+ heldInboundMessages.splice(index, 1);
693
+ if (heldInboundMessages.length === 0) clearHeldInboundTimer();
694
+ emitMessageReceipt(messageId, receipt.status, receipt.detail);
695
+ return true;
696
+ }
697
+ function expireHeldInboundMessages(detail: string): void {
698
+ for (const entry of heldInboundMessages.splice(0)) {
699
+ emitMessageReceipt(entry.message.id, "expired", detail);
700
+ }
701
+ clearHeldInboundTimer();
702
+ }
609
703
  const activeTools = new Map<string, string>();
610
704
  const replyTracker = new ReplyTracker();
611
705
 
@@ -615,6 +709,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
615
709
  const pendingOutboxRequests = new Map<string, PendingOutboxRequest>();
616
710
  function dismissIncomingAsk(messageId: string): void {
617
711
  replyTracker.dismissPendingAsk(messageId);
712
+ dropHeldInboundMessage(messageId, { status: "acknowledged", detail: "answered before injection" });
618
713
  }
619
714
  function hasSeenInboundMessage(from: SessionInfo, message: Message, now = Date.now()): boolean {
620
715
  for (const [key, seenAt] of seenInboundMessages) {
@@ -648,11 +743,15 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
648
743
  }
649
744
  function handleMessageControl(control: MessageControl): void {
650
745
  replyTracker.dismissPendingAsk(control.messageId);
746
+ const supersededDetail = control.supersededBy ? `superseded by ${control.supersededBy}` : undefined;
747
+ if (dropHeldInboundMessage(control.messageId, control.action === "cancel"
748
+ ? { status: "cancelled", detail: "dropped before injection" }
749
+ : { status: "superseded", detail: supersededDetail })) return;
651
750
  if (control.action === "cancel") {
652
751
  emitMessageReceipt(control.messageId, "cancellation_requested", "message may already be injected or processed");
653
752
  return;
654
753
  }
655
- emitMessageReceipt(control.messageId, "superseded", control.supersededBy ? `superseded by ${control.supersededBy}` : undefined);
754
+ emitMessageReceipt(control.messageId, "superseded", supersededDetail);
656
755
  }
657
756
  function latestDeliveryState(messageId: string | null, fallback: string): string {
658
757
  if (!messageId) {
@@ -664,10 +763,11 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
664
763
  let replyWaiter: {
665
764
  from: string;
666
765
  replyTo: string;
766
+ startedAt: number;
667
767
  resolve: (message: Message) => void;
668
768
  reject: (error: Error) => void;
669
769
  } | null = null;
670
- function waitForReply(from: string, replyTo: string, signal?: AbortSignal, cancelOnAbort?: () => void, getDeliveryState: () => string = () => "unknown"): Promise<Message> {
770
+ function waitForReply(from: string, replyTo: string, signal?: AbortSignal, cancelOnAbort?: () => void, getDeliveryState: () => string = () => "unknown", timeoutMs = askTimeoutMs): Promise<Message> {
671
771
  if (replyWaiter) {
672
772
  return Promise.reject(new Error("Already waiting for a reply"));
673
773
  }
@@ -676,9 +776,9 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
676
776
  }
677
777
  return new Promise((resolve, reject) => {
678
778
  const timeout = setTimeout(() => {
679
- const timeoutDescription = askTimeoutMs % 60000 === 0 ? `${askTimeoutMs / 60000} minutes` : `${askTimeoutMs}ms`;
779
+ const timeoutDescription = timeoutMs % 60000 === 0 ? `${timeoutMs / 60000} minutes` : `${timeoutMs}ms`;
680
780
  rejectReplyWaiter(new Error(`No reply from "${from}" for message ${replyTo} within ${timeoutDescription}. Last known delivery state: ${getDeliveryState()}. This waiter timeout is not cancellation; the delivered message may still be queued or actionable in the recipient session.`));
681
- }, askTimeoutMs);
781
+ }, timeoutMs);
682
782
  const cleanup = () => {
683
783
  clearTimeout(timeout);
684
784
  signal?.removeEventListener("abort", onAbort);
@@ -695,6 +795,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
695
795
  replyWaiter = {
696
796
  from,
697
797
  replyTo,
798
+ startedAt: Date.now(),
698
799
  resolve: (message) => {
699
800
  cleanup();
700
801
  resolve(message);
@@ -869,6 +970,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
869
970
 
870
971
  const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId);
871
972
  const tmuxPane = currentTmuxPane();
973
+ const herdrPaneId = currentHerdrPane();
974
+ const herdrSessionPath = herdrPaneId ? liveContext.sessionManager.getSessionFile() : undefined;
872
975
  return {
873
976
  ...identity,
874
977
  cwd: liveContext.cwd,
@@ -878,6 +981,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
878
981
  lastActivity: Date.now(),
879
982
  status: currentStatus(),
880
983
  ...(tmuxPane ? { tmuxPane } : {}),
984
+ ...(herdrPaneId ? { herdrPaneId } : {}),
985
+ ...(herdrSessionPath ? { herdrSessionPath } : {}),
881
986
  ...(localExtensions.size > 0
882
987
  ? {
883
988
  extensions: currentExtensionCapabilities(),
@@ -1162,6 +1267,126 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1162
1267
  }
1163
1268
  })();
1164
1269
  }
1270
+ function emitRpcEvent(event: IntercomRpcEvent): void {
1271
+ pi.events.emit(INTERCOM_RPC_EVENT, { sessionId: currentSessionId, event });
1272
+ }
1273
+ function emitRpcConnection(connected: boolean, reason?: string): void {
1274
+ emitRpcEvent({ type: "intercom_connection", enabled: config.enabled, connected,
1275
+ sessionId: currentIntercomSessionId, ...(reason ? { reason } : {}) });
1276
+ }
1277
+ const rpcRequests = new Map<string, { controller: AbortController; settle(result: IntercomRpcResult): void }>();
1278
+ function endRpcRequests(): void {
1279
+ for (const [requestId, request] of [...rpcRequests]) {
1280
+ request.settle({ requestId, success: false, error: "Intercom session ended" });
1281
+ request.controller.abort();
1282
+ }
1283
+ }
1284
+ function handleRpcRequest(payload: unknown): void {
1285
+ const request = payload as IntercomRpcRequest;
1286
+ if (!request || typeof request.accept !== "function" || !request.command || !request.signal) return;
1287
+ request.accept();
1288
+ const { requestId, command } = request;
1289
+ const controller = new AbortController();
1290
+ const signal = AbortSignal.any([request.signal, controller.signal]);
1291
+ const generation = runtimeGeneration;
1292
+ const ctx = getLiveContext();
1293
+ const settle = (result: IntercomRpcResult) => {
1294
+ signal.removeEventListener("abort", onAbort);
1295
+ if (!rpcRequests.delete(requestId)) return;
1296
+ pi.events.emit(INTERCOM_RPC_RESULT_EVENT, result);
1297
+ };
1298
+ const onAbort = () => settle({ requestId, success: false, error: "Intercom session ended or request timed out" });
1299
+ rpcRequests.set(requestId, { controller, settle });
1300
+ signal.addEventListener("abort", onAbort, { once: true });
1301
+ const checkLive = () => {
1302
+ if (signal.aborted || !getLiveContext(ctx, generation)) throw new Error("Intercom session ended or request timed out");
1303
+ };
1304
+ void (async () => {
1305
+ if (!["intercom_status", "intercom_list", "intercom_send", "intercom_ask", "intercom_reply", "intercom_pending"].includes(command.type)) throw new Error("Unknown Intercom RPC command");
1306
+ if (signal.aborted) throw new Error("Intercom request ended");
1307
+ const timeoutMs = intercomRpcTimeout(command);
1308
+ if (command.type === "intercom_status") {
1309
+ return { enabled: config.enabled, connected: Boolean(client?.isConnected()), sessionId: currentIntercomSessionId,
1310
+ ...(currentSessionId ? { name: buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId).name } : {}) };
1311
+ }
1312
+ if (!config.enabled) throw new Error("Intercom disabled");
1313
+ checkLive();
1314
+ if (command.type === "intercom_pending") return { asks: replyTracker.listPending() };
1315
+ if (command.type !== "intercom_list") {
1316
+ if (typeof command.message !== "string" || !command.message.trim()) throw new Error("message must be a non-empty string");
1317
+ if (command.to !== undefined && (typeof command.to !== "string" || !command.to.trim())) throw new Error("to must be a non-empty string");
1318
+ if (command.type !== "intercom_reply" && !command.to) throw new Error("to is required");
1319
+ if (command.replyTo !== undefined && (typeof command.replyTo !== "string" || !command.replyTo.trim())) throw new Error("replyTo must be a non-empty string");
1320
+ if (!isMessage({ id: "validation", timestamp: Date.now(), replyTo: command.replyTo,
1321
+ content: { text: command.message, attachments: command.attachments } })) throw new Error("Invalid message or attachments");
1322
+ }
1323
+ const activeClient = await ensureConnected("tool");
1324
+ checkLive();
1325
+ if (command.type === "intercom_list") {
1326
+ const sessions = await activeClient.listSessions();
1327
+ checkLive();
1328
+ return { sessionId: activeClient.sessionId!, sessions };
1329
+ }
1330
+ let replyTo = command.replyTo;
1331
+ let to: string;
1332
+ if (command.type === "intercom_reply") {
1333
+ const target = replyTracker.resolveReplyTarget({ to: command.to, replyTo });
1334
+ to = target.from.id;
1335
+ replyTo = target.message.id;
1336
+ } else {
1337
+ to = await resolveSessionTarget(activeClient, command.to) ?? command.to;
1338
+ if (command.type === "intercom_ask" && !(await activeClient.listSessions()).some(peer => peer.id === to)) {
1339
+ throw new Error("Recipient is not currently connected; blocking asks are not queued");
1340
+ }
1341
+ }
1342
+ checkLive();
1343
+ if (currentSessionTargetMatches(to, to, activeClient)) throw new Error("Cannot message the current session");
1344
+ if (command.type === "intercom_send" && !replyTo) {
1345
+ const mismatch = replyTracker.findActiveReplyTargetMismatch(to);
1346
+ if (mismatch) throw new Error(`Use reply for active ask ${mismatch.message.id}; refusing misdirected send`);
1347
+ replyTo = replyTracker.findUniquePendingAskFrom(to)?.message.id;
1348
+ }
1349
+ if (command.type === "intercom_send" && !command.replyTo && config.confirmSend) {
1350
+ if (!ctx!.hasUI) throw new Error("confirmation_unavailable: confirmSend requires UI");
1351
+ const confirmed = await ctx!.ui.confirm("Send message", `Send to "${command.to}":\n\n${command.message}${command.attachments?.length ? formatAttachments(command.attachments) : ""}`,
1352
+ { signal, timeout: 30_000 });
1353
+ checkLive();
1354
+ if (!confirmed) throw new Error("Message cancelled by user");
1355
+ }
1356
+ const questionId = randomUUID();
1357
+ let replyPromise: Promise<Message> | undefined;
1358
+ let deliveryState = "created";
1359
+ // Reserve the shared waiter before sending, so a fast reply cannot be lost.
1360
+ if (command.type === "intercom_ask") {
1361
+ if (replyWaiter) throw new Error("Already waiting for a reply");
1362
+ replyPromise = waitForReply(to, questionId, signal, undefined,
1363
+ () => latestDeliveryState(questionId, deliveryState), timeoutMs);
1364
+ replyPromise.catch(() => undefined);
1365
+ }
1366
+ try {
1367
+ checkLive();
1368
+ const result = await activeClient.send(to, { text: command.message, attachments: command.attachments, replyTo,
1369
+ ...(replyPromise ? { messageId: questionId, expectsReply: true } : {}) });
1370
+ deliveryState = result.delivery;
1371
+ checkLive();
1372
+ const data: IntercomRpcDelivery = { messageId: result.id, delivered: result.delivered, to, replyTo,
1373
+ delivery: result.delivery, retryable: result.retryable, outcomeKnown: result.outcomeKnown,
1374
+ ...(result.code ? { code: result.code } : {}), ...(result.reason ? { reason: result.reason } : {}) };
1375
+ if (!result.delivered) throw new Error(`Message ${result.id} not delivered: ${result.reason ?? result.delivery}`);
1376
+ pi.appendEntry("intercom_sent", { to, message: { text: command.message, attachments: command.attachments, replyTo }, messageId: result.id, timestamp: Date.now() });
1377
+ if (replyTo) dismissIncomingAsk(replyTo);
1378
+ if (!replyPromise) return data;
1379
+ const reply = await replyPromise;
1380
+ checkLive();
1381
+ pi.appendEntry("intercom_received", { from: to, message: reply.content, messageId: reply.id, timestamp: reply.timestamp });
1382
+ return { ...data, reply };
1383
+ } catch (error) {
1384
+ // Only the owner of this waiter may reject it; concurrent asks fail without replacing it.
1385
+ if (replyPromise && replyWaiter?.replyTo === questionId) rejectReplyWaiter(toError(error));
1386
+ throw error;
1387
+ }
1388
+ })().then(data => settle({ requestId, success: true, data }), error => settle({ requestId, success: false, error: getErrorMessage(error) }));
1389
+ }
1165
1390
  function shouldTriggerInboundMessage(entry: InboundMessageEntry, forceTrigger = false): boolean {
1166
1391
  if (forceTrigger) {
1167
1392
  return true;
@@ -1179,19 +1404,21 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1179
1404
  return;
1180
1405
  }
1181
1406
  const injectedMessage = { ...entry.message, injectedAt: Date.now() };
1182
- emitMessageReceipt(injectedMessage.id, "injected");
1183
1407
  const replyCommand = delivery === "steer" && entry.replyCommand && entry.message.expectsReply
1184
1408
  ? `intercom({ action: "reply", replyTo: ${JSON.stringify(entry.message.id)}, message: "..." })`
1185
1409
  : entry.replyCommand;
1186
1410
  const deliveredEntry = { ...entry, message: injectedMessage, replyCommand };
1187
1411
  replyTracker.queueTurnContext({ from: entry.from, message: injectedMessage, receivedAt: Date.now() });
1188
- const senderDisplay = entry.from.name || entry.from.id.slice(0, 8);
1412
+ const senderDisplay = injectedMessage.crossMachine
1413
+ ? `${relaySenderName(injectedMessage.crossMachine.origin)} · unverified cross-machine`
1414
+ : entry.from.name || entry.from.id.slice(0, 8);
1189
1415
  // The tool may be an inactive optional capability: say how to activate it, not just its call.
1190
1416
  const activateHint = pi.getActiveTools().includes("intercom")
1191
1417
  ? ""
1192
- : ' (not active yet: call capability_discover with name "intercom" first)';
1418
+ : ' (not active yet: use codemode searchTools() (or tool_search when enabled) to find and expose "intercom" first)';
1193
1419
  const replyInstruction = replyCommand ? `\n\nTo reply, use the intercom tool${activateHint}: ${replyCommand}` : "";
1194
1420
  const deliveryMetadata = formatInboundDeliveryMetadata(injectedMessage);
1421
+ const trigger = delivery === "trigger" && shouldTriggerInboundMessage(entry, forceTrigger);
1195
1422
  pi.sendMessage(
1196
1423
  {
1197
1424
  customType: "intercom_message",
@@ -1199,14 +1426,71 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1199
1426
  display: true,
1200
1427
  details: deliveredEntry,
1201
1428
  },
1202
- delivery === "trigger" && shouldTriggerInboundMessage(entry, forceTrigger)
1203
- ? { triggerTurn: true }
1204
- : { deliverAs: "steer" }
1429
+ trigger ? undefined : { deliverAs: "steer" }
1205
1430
  );
1431
+ // Pi skips before_agent_start for sendMessage({ triggerTurn: true }) turns (pi#5581),
1432
+ // so wake an idle session with a user prompt that runs the normal prompt lifecycle.
1433
+ if (trigger && !idleWakePending() && getLiveContext(runtimeContext, generation)?.isIdle()) {
1434
+ idleWakeRequestedAt = Date.now();
1435
+ pi.sendUserMessage("New intercom message above.");
1436
+ }
1437
+ emitMessageReceipt(injectedMessage.id, "injected");
1206
1438
  }
1207
1439
  function sendIncomingBrokerMessage(entry: InboundMessageEntry, delivery: "trigger" | "steer", generation = runtimeGeneration): void {
1208
1440
  sendIncomingMessage(entry, delivery, generation);
1209
1441
  }
1442
+ function deliverIncomingBrokerMessage(entry: InboundMessageEntry, ctx: ExtensionContext, generation: number): void {
1443
+ const activeContext = getLiveContext(ctx, generation);
1444
+ if (!activeContext) return;
1445
+ if (!activeContext.isIdle()) {
1446
+ if (!activeContext.hasUI) {
1447
+ const activeClient = client;
1448
+ if (!entry.message.replyTo && activeClient?.isConnected()) {
1449
+ void (async () => {
1450
+ try {
1451
+ const result = await activeClient.send(entry.from.id, {
1452
+ text: "This agent is running in non-interactive mode and cannot respond to intercom messages while it is working. It will continue its current task and exit when done.",
1453
+ replyTo: entry.message.id,
1454
+ });
1455
+ if (result.delivered && getLiveContext(ctx, generation)) dismissIncomingAsk(entry.message.id);
1456
+ } catch {
1457
+ // Best-effort reply; keep the busy non-interactive session running either way.
1458
+ }
1459
+ })();
1460
+ }
1461
+ return;
1462
+ }
1463
+ sendIncomingBrokerMessage(entry, "steer", generation);
1464
+ return;
1465
+ }
1466
+ sendIncomingBrokerMessage(entry, "trigger", generation);
1467
+ }
1468
+ function flushHeldInboundMessages(ctx: ExtensionContext, generation: number): void {
1469
+ if (!getLiveContext(ctx, generation)) return;
1470
+ if (config.busyDelivery === "human-first" && ctx.hasUI) {
1471
+ if (ctx.isIdle() && !idleWakePending() && heldInboundMessages.length > 0) {
1472
+ deliverIncomingBrokerMessage(heldInboundMessages.shift()!, ctx, generation);
1473
+ }
1474
+ if (heldInboundMessages.length === 0) clearHeldInboundTimer();
1475
+ return;
1476
+ }
1477
+ while (heldInboundMessages.length > 0 && (ctx.isIdle() || agentRunning) && getLiveContext(ctx, generation)) {
1478
+ deliverIncomingBrokerMessage(heldInboundMessages.shift()!, ctx, generation);
1479
+ }
1480
+ if (heldInboundMessages.length === 0) clearHeldInboundTimer();
1481
+ }
1482
+ function clearHeldInboundTimer(): void {
1483
+ if (heldInboundTimer) clearInterval(heldInboundTimer);
1484
+ heldInboundTimer = null;
1485
+ }
1486
+ function holdIncomingBrokerMessage(entry: InboundMessageEntry, ctx: ExtensionContext, generation: number): void {
1487
+ heldInboundMessages.push(entry);
1488
+ emitMessageReceipt(entry.message.id, "queued", "held until delivery is safe");
1489
+ if (!heldInboundTimer) {
1490
+ heldInboundTimer = setInterval(() => flushHeldInboundMessages(ctx, generation), 100);
1491
+ heldInboundTimer.unref();
1492
+ }
1493
+ }
1210
1494
  function handleIncomingMessage(ctx: ExtensionContext, from: SessionInfo, message: Message): void {
1211
1495
  const messageGeneration = runtimeGeneration;
1212
1496
  const liveContext = getLiveContext(ctx, messageGeneration);
@@ -1219,6 +1503,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1219
1503
  return;
1220
1504
  }
1221
1505
  const receivedMessage = { ...message, receiverReceivedAt };
1506
+ emitRpcEvent({ type: "intercom_message", from, message: receivedMessage });
1222
1507
  emitMessageReceipt(receivedMessage.id, "receiver_received");
1223
1508
  if (replyWaiter) {
1224
1509
  const senderTarget = from.name || from.id;
@@ -1235,48 +1520,27 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1235
1520
  ? formatAttachments(receivedMessage.content.attachments)
1236
1521
  : "";
1237
1522
  const bodyText = `${receivedMessage.content.text}${attachmentText}`;
1238
- const replyCommand = config.replyHint && receivedMessage.expectsReply
1239
- ? `intercom({ action: "reply", message: "..." })`
1240
- : undefined;
1523
+ const replyCommand = config.replyHint && receivedMessage.crossMachine
1524
+ ? `intercom({ action: "send", to: ${JSON.stringify(relaySenderName(receivedMessage.crossMachine.origin))}, message: "..." })`
1525
+ : config.replyHint && receivedMessage.expectsReply
1526
+ ? `intercom({ action: "reply", message: "..." })`
1527
+ : undefined;
1241
1528
  replyTracker.recordIncomingMessage(from, receivedMessage, receiverReceivedAt);
1242
1529
  emitMessageReceipt(receivedMessage.id, "acknowledged", "accepted by receiver");
1243
1530
  const entry = { from, message: receivedMessage, replyCommand, bodyText };
1244
- void (async () => {
1245
- const activeContext = getLiveContext(liveContext, messageGeneration);
1246
- if (!activeContext) {
1247
- return;
1248
- }
1249
- if (!activeContext.isIdle()) {
1250
- if (!activeContext.hasUI) {
1251
- const activeClient = client;
1252
- if (!message.replyTo && activeClient?.isConnected()) {
1253
- try {
1254
- const result = await activeClient.send(from.id, {
1255
- text: "This agent is running in non-interactive mode and cannot respond to intercom messages while it is working. It will continue its current task and exit when done.",
1256
- replyTo: message.id,
1257
- });
1258
- if (result.delivered && getLiveContext(liveContext, messageGeneration)) {
1259
- dismissIncomingAsk(message.id);
1260
- }
1261
- } catch {
1262
- // Best-effort reply; keep the busy non-interactive session running either way.
1263
- }
1264
- }
1265
- return;
1266
- }
1267
- sendIncomingBrokerMessage(entry, "steer");
1268
- return;
1269
- }
1270
- if (getLiveContext(liveContext, messageGeneration)) {
1271
- sendIncomingBrokerMessage(entry, "trigger", messageGeneration);
1272
- }
1273
- })();
1531
+ // Busy without an agent run cannot steer; manual compaction can discard an appended custom entry.
1532
+ if (heldInboundMessages.length > 0 || (!liveContext.isIdle() && (!agentRunning || (config.busyDelivery === "human-first" && liveContext.hasUI)))) {
1533
+ holdIncomingBrokerMessage(entry, liveContext, messageGeneration);
1534
+ } else {
1535
+ deliverIncomingBrokerMessage(entry, liveContext, messageGeneration);
1536
+ }
1274
1537
  }
1275
1538
  function attachClientHandlers(nextClient: IntercomClient): void {
1276
1539
  nextClient.onBrokerMessage((message: BrokerMessage) => {
1277
1540
  if (client !== nextClient) return;
1278
1541
  switch (message.type) {
1279
1542
  case "registered": {
1543
+ emitRpcConnection(true);
1280
1544
  const supported = message.features?.includes(EXTENSION_BUS_FEATURE) ?? false;
1281
1545
  if (supported && localExtensions.size > 0) {
1282
1546
  nextClient.updateExtensionCapabilities(currentExtensionCapabilities());
@@ -1323,7 +1587,12 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1323
1587
  ...(message.reason ? { reason: message.reason } : {}),
1324
1588
  });
1325
1589
  break;
1590
+ case "delivered":
1591
+ case "delivery_failed":
1592
+ emitRpcEvent({ type: "intercom_delivery", result: message });
1593
+ break;
1326
1594
  case "message_receipt":
1595
+ emitRpcEvent({ type: "intercom_receipt", from: message.from, receipt: message.receipt });
1327
1596
  latestOutboundReceipts.set(message.receipt.messageId, {
1328
1597
  status: message.receipt.status,
1329
1598
  timestamp: message.receipt.timestamp,
@@ -1334,16 +1603,19 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1334
1603
  handleMessageControl(message.control);
1335
1604
  break;
1336
1605
  case "session_joined":
1606
+ emitRpcEvent({ type: "intercom_session_joined", session: message.session });
1337
1607
  for (const namespace of localExtensions.keys()) {
1338
1608
  emitLocalExtensionEvent(namespace, { type: "session_joined", session: message.session });
1339
1609
  }
1340
1610
  break;
1341
1611
  case "session_left":
1612
+ emitRpcEvent({ type: "intercom_session_left", sessionId: message.sessionId });
1342
1613
  for (const namespace of localExtensions.keys()) {
1343
1614
  emitLocalExtensionEvent(namespace, { type: "session_left", sessionId: message.sessionId });
1344
1615
  }
1345
1616
  break;
1346
1617
  case "presence_update":
1618
+ emitRpcEvent({ type: "intercom_presence", session: message.session });
1347
1619
  for (const namespace of localExtensions.keys()) {
1348
1620
  emitLocalExtensionEvent(namespace, { type: "presence_update", session: message.session });
1349
1621
  }
@@ -1361,6 +1633,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1361
1633
  if (client !== nextClient) {
1362
1634
  return;
1363
1635
  }
1636
+ emitRpcConnection(false, error.message);
1637
+ endRpcRequests();
1364
1638
  rejectReplyWaiter(new Error(`Disconnected while waiting for reply: ${error.message}`, { cause: error }));
1365
1639
  for (const [namespace, extension] of localExtensions) {
1366
1640
  extension.owner = undefined;
@@ -1433,6 +1707,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1433
1707
  if (reason === "background" && getLiveContext(contextAtStart, generationAtStart)) {
1434
1708
  scheduleReconnect();
1435
1709
  }
1710
+ if (getLiveContext(contextAtStart, generationAtStart)) emitRpcConnection(false, getErrorMessage(error));
1436
1711
  throw toError(error);
1437
1712
  } finally {
1438
1713
  if (reconnectPromise === nextReconnectPromise) {
@@ -1524,6 +1799,196 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1524
1799
  });
1525
1800
  return { id: session.id, label: session.name || session.id, projectPane };
1526
1801
  }
1802
+ /** Shared by send, handover, and /handover. Never throws; failures are returned as error results. */
1803
+ async function deliverMessage(
1804
+ connectedClient: IntercomClient,
1805
+ ctx: ExtensionContext,
1806
+ signal: AbortSignal | undefined,
1807
+ request: DeliveryRequest,
1808
+ ): Promise<IntercomToolResult> {
1809
+ const { to, cwd, openProjectPaneIfMissing, focus, message, attachments, replyTo, supersedes, retryOf } = request;
1810
+ try {
1811
+ const crossMachineTarget = Boolean(to?.includes("@"));
1812
+ const crossMachineRestriction = explicitCrossMachineSendRestriction({
1813
+ to, cwd, openProjectPaneIfMissing, attachments, replyTo, supersedes, retryOf,
1814
+ });
1815
+ if (crossMachineRestriction) {
1816
+ return {
1817
+ content: [{ type: "text", text: crossMachineRestriction }],
1818
+ details: { error: true, crossMachine: false },
1819
+ };
1820
+ }
1821
+ if (crossMachineTarget) {
1822
+ try {
1823
+ parseCrossMachineTarget(to!);
1824
+ } catch (error) {
1825
+ return {
1826
+ content: [{ type: "text", text: getErrorMessage(error) }],
1827
+ details: { error: true, crossMachine: false },
1828
+ };
1829
+ }
1830
+ }
1831
+ if (openProjectPaneIfMissing && !cwd) {
1832
+ return {
1833
+ content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
1834
+ details: { error: true },
1835
+ };
1836
+ }
1837
+ const confirmSend = !replyTo && config.confirmSend && ctx.hasUI;
1838
+ const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
1839
+ if (confirmSend && cwd && openProjectPaneIfMissing) {
1840
+ const confirmed = await ctx.ui.confirm(
1841
+ "Send message",
1842
+ `Send to "${to ?? cwd}":\n\n${message}${attachmentText}`,
1843
+ );
1844
+ if (!confirmed) {
1845
+ return {
1846
+ content: [{ type: "text", text: "Message cancelled by user" }],
1847
+ details: {},
1848
+ };
1849
+ }
1850
+ }
1851
+ if (confirmSend && crossMachineTarget) {
1852
+ const confirmed = await ctx.ui.confirm("Send message", `Send to "${to}":\n\n${message}`);
1853
+ if (!confirmed) {
1854
+ return {
1855
+ content: [{ type: "text", text: "Message cancelled by user" }],
1856
+ details: {},
1857
+ };
1858
+ }
1859
+ }
1860
+ if (crossMachineTarget) {
1861
+ if (request.handover && signal?.aborted) {
1862
+ return { content: [{ type: "text", text: "Handover was cancelled before delivery." }], details: { error: true } };
1863
+ }
1864
+ const identity = buildPresenceIdentity(pi, connectedClient.sessionId ?? ctx.sessionManager.getSessionId());
1865
+ try {
1866
+ const remote = await sendCrossMachine(to!, message, {
1867
+ name: identity.name,
1868
+ sessionId: connectedClient.sessionId ?? ctx.sessionManager.getSessionId(),
1869
+ machine: config.crossMachine.machineName,
1870
+ }, {
1871
+ remoteCommand: config.crossMachine.remoteCommand,
1872
+ });
1873
+ const remoteTarget = relaySenderName({ name: remote.agent.name, machine: remote.machine.label });
1874
+ pi.appendEntry("intercom_sent", {
1875
+ to: remoteTarget,
1876
+ message: { text: message },
1877
+ timestamp: Date.now(),
1878
+ crossMachine: true,
1879
+ });
1880
+ return {
1881
+ content: [{ type: "text", text: `Message sent to ${remoteTarget} over SSH (origin identity is SSH-asserted)` }],
1882
+ details: { delivered: true, crossMachine: true, machine: remote.machine.label, target: remote.agent.name, trust: "ssh-asserted" },
1883
+ };
1884
+ } catch (remoteError) {
1885
+ return {
1886
+ content: [{ type: "text", text: `Explicit cross-machine message to "${to}" was not delivered: ${getErrorMessage(remoteError)}` }],
1887
+ details: { error: true, crossMachine: false },
1888
+ };
1889
+ }
1890
+ }
1891
+ const target: DeliveryTarget = cwd
1892
+ ? await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal })
1893
+ : { id: await resolveSessionTarget(connectedClient, to) ?? to!, label: to! };
1894
+ const sendTo = target.id;
1895
+ const targetDisplay = target.projectPane ? target.label : to ?? target.label;
1896
+ if (sendTo === connectedClient.sessionId) {
1897
+ return {
1898
+ content: [{ type: "text", text: "Cannot message the current session" }],
1899
+ details: { error: true },
1900
+ };
1901
+ }
1902
+ const activeReplyMismatch = replyTo ? null : replyTracker.findActiveReplyTargetMismatch(sendTo);
1903
+ if (activeReplyMismatch) {
1904
+ const senderLabel = activeReplyMismatch.from.name || activeReplyMismatch.from.id;
1905
+ return {
1906
+ content: [{ type: "text", text: `This turn is responding to an intercom ask from "${senderLabel}". Use intercom({ action: "reply", message: "..." }) or set replyTo: "${activeReplyMismatch.message.id}". Refusing non-reply send to "${targetDisplay}" to avoid a misdirected reply.` }],
1907
+ details: { error: true, replyTo: activeReplyMismatch.message.id },
1908
+ };
1909
+ }
1910
+ const inferredAsk = replyTo || request.handover ? null : replyTracker.findUniquePendingAskFrom(sendTo);
1911
+ const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
1912
+ if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
1913
+ const confirmed = await ctx.ui.confirm(
1914
+ "Send message",
1915
+ `Send to "${targetDisplay}":\n\n${message}${attachmentText}`,
1916
+ );
1917
+ if (!confirmed) {
1918
+ return {
1919
+ content: [{ type: "text", text: "Message cancelled by user" }],
1920
+ details: {},
1921
+ };
1922
+ }
1923
+ }
1924
+ if (request.handover && signal?.aborted) {
1925
+ return { content: [{ type: "text", text: "Handover was cancelled before delivery." }], details: { error: true } };
1926
+ }
1927
+ const result = await connectedClient.send(sendTo, {
1928
+ text: message,
1929
+ attachments,
1930
+ replyTo: effectiveReplyTo,
1931
+ supersedes,
1932
+ retryOf,
1933
+ });
1934
+ if (!result.delivered) {
1935
+ const errorText = result.reason ?? "Session may not exist or has disconnected.";
1936
+ return {
1937
+ content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
1938
+ details: deliveryDetails(result),
1939
+ };
1940
+ }
1941
+ pi.appendEntry("intercom_sent", {
1942
+ to: targetDisplay,
1943
+ message: { text: message, attachments, replyTo: effectiveReplyTo, supersedes, retryOf },
1944
+ messageId: result.id,
1945
+ timestamp: Date.now(),
1946
+ });
1947
+ if (effectiveReplyTo) {
1948
+ dismissIncomingAsk(effectiveReplyTo);
1949
+ }
1950
+ return {
1951
+ content: [{
1952
+ type: "text",
1953
+ text: target.projectPane
1954
+ ? `Opened Herdr project pane ${target.projectPane.paneId} for ${target.projectPane.projectRoot} and sent message to ${targetDisplay}`
1955
+ : inferredAsk ? `Reply sent to ${targetDisplay} (inferred from pending ask)` : `Message sent to ${targetDisplay}`,
1956
+ }],
1957
+ details: {
1958
+ ...deliveryDetails(result),
1959
+ ...(effectiveReplyTo ? { replyTo: effectiveReplyTo } : {}),
1960
+ ...(target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {}),
1961
+ },
1962
+ };
1963
+ } catch (error) {
1964
+ return {
1965
+ content: [{ type: "text", text: `Failed to send: ${getErrorMessage(error)}` }],
1966
+ details: { error: true },
1967
+ };
1968
+ }
1969
+ }
1970
+ async function buildHandoverText(
1971
+ connectedClient: IntercomClient,
1972
+ ctx: ExtensionContext,
1973
+ options: { goal?: string; crossMachine: boolean },
1974
+ signal: AbortSignal | undefined,
1975
+ ): Promise<string> {
1976
+ const [body, git] = await Promise.all([
1977
+ generateHandoverBody(ctx, options.goal, signal),
1978
+ readGitState(ctx.cwd),
1979
+ ]);
1980
+ if (signal?.aborted) {
1981
+ throw new Error("Handover generation was aborted.");
1982
+ }
1983
+ const sessionId = connectedClient.sessionId ?? ctx.sessionManager.getSessionId();
1984
+ return formatHandoverMessage({
1985
+ senderName: pi.getSessionName()?.trim() || sessionId.slice(0, 8),
1986
+ senderCwd: ctx.cwd,
1987
+ sessionFile: options.crossMachine ? undefined : ctx.sessionManager.getSessionFile(),
1988
+ git,
1989
+ body,
1990
+ });
1991
+ }
1527
1992
  function deliverLocalSubagentRelayMessage(sender: "subagent-control" | "subagent-result", status: string, messageText: string): void {
1528
1993
  const liveContext = getLiveContext();
1529
1994
  const now = Date.now();
@@ -1556,11 +2021,13 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1556
2021
  }
1557
2022
  function startSessionRuntime(ctx: ExtensionContext): void {
1558
2023
  const previousClient = client;
2024
+ endRpcRequests();
1559
2025
  failPendingOutboxRequests(runtimeGeneration, "session_ended", "Session replaced");
1560
2026
  shuttingDown = false;
1561
2027
  disposed = false;
1562
2028
  runtimeStarted = true;
1563
2029
  runtimeGeneration += 1;
2030
+ idleWakeRequestedAt = 0;
1564
2031
  outboxRequestIds.clear();
1565
2032
  reconnectAttempt = 0;
1566
2033
  clearReconnectTimer();
@@ -1574,14 +2041,24 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1574
2041
  }
1575
2042
  runtimeContext = ctx;
1576
2043
  currentSessionId = ctx.sessionManager.getSessionId();
1577
- currentIntercomSessionId = resolveConfiguredIntercomSessionId(currentSessionId, config);
2044
+ let claimedIntercomSessionId: string | undefined;
2045
+ const identityRequest: IntercomSessionIdentityRequestV1 = {
2046
+ version: 1,
2047
+ claim: (stableId) => {
2048
+ claimedIntercomSessionId ??= (typeof stableId === "string" && stableId.trim()) || undefined;
2049
+ },
2050
+ };
2051
+ pi.events.emit(INTERCOM_SESSION_IDENTITY_EVENT, identityRequest);
2052
+ currentIntercomSessionId = claimedIntercomSessionId ?? resolveConfiguredIntercomSessionId(currentSessionId, config);
1578
2053
  publishIntercomSessionId(currentIntercomSessionId);
2054
+ emitRpcConnection(false, "Session started");
1579
2055
  currentModel = ctx.model?.id ?? "unknown";
1580
2056
  sessionStartedAt = Date.now();
1581
2057
  const initialPresenceIdentity = buildPresenceIdentity(pi, currentIntercomSessionId);
1582
2058
  lastPresenceName = initialPresenceIdentity.name;
1583
2059
  lastPresenceRuntimeFallbackAlias = initialPresenceIdentity.runtimeFallbackAlias;
1584
2060
  agentRunning = false;
2061
+ expireHeldInboundMessages("session replaced before injection");
1585
2062
  activeTools.clear();
1586
2063
  startNamePoll();
1587
2064
  const startupGeneration = runtimeGeneration;
@@ -1695,9 +2172,40 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1695
2172
  acknowledge: true,
1696
2173
  });
1697
2174
  });
2175
+ const unsubscribeRpcRequest = pi.events.on(INTERCOM_RPC_REQUEST_EVENT, handleRpcRequest);
2176
+ // Release readiness (release:readiness:v1): answer only for the session this extension is bound to.
2177
+ const unsubscribeReleaseReadiness = pi.events.on(RELEASE_READINESS_EVENT, (payload) => {
2178
+ answerReleaseReadiness(payload, "intercom", currentSessionId, () => intercomReleaseBlockers({
2179
+ pendingAsks: replyTracker.listPending(),
2180
+ outboundAsk: replyWaiter,
2181
+ pendingOutboxRequests: pendingOutboxRequests.size,
2182
+ }));
2183
+ });
2184
+ // Kill switch (stop_all_background): cancel this session's blocking outbound ask; inbound asks cannot be cancelled by the receiver.
2185
+ const unsubscribeStopAll = pi.events.on(STOP_ALL_BACKGROUND_EVENT, (payload) => {
2186
+ answerStopAllBackground(payload, "intercom", currentSessionId, (request) => stopIntercom({
2187
+ pendingAsks: replyTracker.listPending(),
2188
+ outboundAsk: replyWaiter,
2189
+ cancelOutboundAsk: (ask) => {
2190
+ const activeClient = client;
2191
+ // Broker first (drops the ask edge + pending-ask record), then free the blocked tool call.
2192
+ activeClient?.cancelAsk(ask.replyTo);
2193
+ rejectReplyWaiter(new Error("Cancelled: session background work was stopped"));
2194
+ // Also ask the recipient to drop the ask. Best-effort: it may already be injected or processed.
2195
+ if (!activeClient?.isConnected()) return undefined;
2196
+ return activeClient.cancelMessage(ask.replyTo).then(
2197
+ (result) => result.delivered ? "recipient asked to drop it" : "recipient could not be asked to drop it (it may already be handled)",
2198
+ () => "recipient could not be asked to drop it (it may already be handled)",
2199
+ );
2200
+ },
2201
+ }, request));
2202
+ });
1698
2203
  const unsubscribeOutboxRequest = pi.events.on(INTERCOM_OUTBOX_REQUEST_EVENT, handleOutboxRequest);
1699
2204
  pi.on("session_start", (_event, ctx) => {
1700
2205
  if (!config.enabled) {
2206
+ runtimeContext = ctx;
2207
+ currentSessionId = ctx.sessionManager.getSessionId();
2208
+ emitRpcConnection(false, "Intercom disabled");
1701
2209
  return;
1702
2210
  }
1703
2211
  startSessionRuntime(ctx);
@@ -1708,6 +2216,11 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1708
2216
  unsubscribeSubagentControlIntercom();
1709
2217
  unsubscribeSubagentResultIntercom();
1710
2218
  unsubscribeOutboxRequest();
2219
+ unsubscribeRpcRequest();
2220
+ unsubscribeReleaseReadiness();
2221
+ unsubscribeStopAll();
2222
+ endRpcRequests();
2223
+ emitRpcConnection(false, "Session shutting down");
1711
2224
  shuttingDown = true;
1712
2225
  disposed = true;
1713
2226
  failPendingOutboxRequests(runtimeGeneration, "session_ended", "Session shutting down");
@@ -1719,6 +2232,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1719
2232
  rejectReplyWaiter(new Error("Session shutting down"));
1720
2233
  replyTracker.reset();
1721
2234
  agentRunning = false;
2235
+ expireHeldInboundMessages("session shut down before injection");
1722
2236
  activeTools.clear();
1723
2237
  if (client) {
1724
2238
  await client.disconnect();
@@ -1729,17 +2243,27 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1729
2243
  currentIntercomSessionId = null;
1730
2244
  sessionStartedAt = null;
1731
2245
  });
1732
- pi.on("turn_end", () => {
2246
+ pi.on("turn_end", (event, ctx) => {
1733
2247
  if (!getLiveContext()) {
1734
2248
  return;
1735
2249
  }
1736
2250
  replyTracker.endTurn();
2251
+ // Aborted/error turns cannot consume a steer; leave their peers for the idle trigger.
2252
+ if (config.busyDelivery === "human-first" && ctx.hasUI && event.message.role === "assistant"
2253
+ && event.message.stopReason !== "aborted" && event.message.stopReason !== "error"
2254
+ && heldInboundMessages.length > 0 && agentRunning
2255
+ && !ctx.isIdle() && !ctx.hasPendingMessages() && getLiveContext(ctx)) {
2256
+ sendIncomingBrokerMessage(heldInboundMessages.shift()!, "steer", runtimeGeneration);
2257
+ if (heldInboundMessages.length === 0) clearHeldInboundTimer();
2258
+ }
1737
2259
  });
1738
2260
  pi.on("agent_start", () => {
2261
+ idleWakeRequestedAt = 0;
1739
2262
  if (!getLiveContext()) {
1740
2263
  return;
1741
2264
  }
1742
2265
  agentRunning = true;
2266
+ if (runtimeContext) flushHeldInboundMessages(runtimeContext, runtimeGeneration);
1743
2267
  activeTools.clear();
1744
2268
  syncPresenceStatus();
1745
2269
  });
@@ -1823,11 +2347,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1823
2347
  label: "Contact Supervisor",
1824
2348
  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.",
1825
2349
  promptSnippet: "Subagent-only: contact the supervisor for decisions, structured interviews, or meaningful plan-changing updates. Do not use for routine completion handoffs.",
1826
- discovery: {
1827
- summary: "Subagent-only channel to ask the supervisor for decisions or send plan-changing updates",
1828
- aliases: ["contact supervisor", "ask supervisor"],
1829
- category: "coordination",
1830
- },
2350
+ exposure: "model-only",
1831
2351
  promptGuidelines: [
1832
2352
  "Use contact_supervisor with reason='need_decision' when a subagent is blocked, uncertain, needs approval, or faces a product/API/scope decision before continuing.",
1833
2353
  "Use contact_supervisor with reason='interview_request' when the child needs multiple structured answers from the supervisor in one blocking exchange.",
@@ -1976,7 +2496,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1976
2496
  replyPromise = waitForReply(sendTo, questionId, signal, () => connectedClient.cancelAsk(questionId!), () => latestDeliveryState(questionId, deliveryState));
1977
2497
  replyPromise.catch(() => undefined);
1978
2498
  if (signal?.aborted) {
1979
- rejectReplyWaiter(new Error("Cancelled"));
2499
+ if (replyWaiter?.replyTo === questionId) rejectReplyWaiter(new Error("Cancelled"));
1980
2500
  try {
1981
2501
  await replyPromise;
1982
2502
  } catch {
@@ -1998,7 +2518,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1998
2518
  deliveryState = sendResult.delivered ? "socket_delivered" : "delivery_failed";
1999
2519
  if (!sendResult.delivered) {
2000
2520
  const errorText = sendResult.reason ?? "Session may not exist or has disconnected.";
2001
- rejectReplyWaiter(new Error(`Message to "${metadata.orchestratorTarget}" was not delivered: ${errorText}`));
2521
+ if (replyWaiter?.replyTo === questionId) rejectReplyWaiter(new Error(`Message to "${metadata.orchestratorTarget}" was not delivered: ${errorText}`));
2002
2522
  if (replyPromise) {
2003
2523
  try {
2004
2524
  await replyPromise;
@@ -2044,7 +2564,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
2044
2564
  : {},
2045
2565
  };
2046
2566
  } catch (error) {
2047
- rejectReplyWaiter(toError(error));
2567
+ if (questionId && replyWaiter?.replyTo === questionId) rejectReplyWaiter(toError(error));
2048
2568
  if (replyPromise) {
2049
2569
  try {
2050
2570
  await replyPromise;
@@ -2058,17 +2578,19 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
2058
2578
  };
2059
2579
  }
2060
2580
  },
2061
- renderCall(args, theme) {
2581
+ renderCall(args, theme, context) {
2062
2582
  const reason = typeof args.reason === "string" ? args.reason : "contact";
2063
- const messagePreview = previewText(args.message, 96);
2583
+ const messageText = context.expanded && typeof args.message === "string"
2584
+ ? args.message
2585
+ : previewText(args.message, 96);
2064
2586
  const interview = args.interview && typeof args.interview === "object" ? args.interview as { title?: unknown } : undefined;
2065
2587
  let text = theme.fg("toolTitle", theme.bold("contact_supervisor "));
2066
2588
  text += theme.fg(reason === "need_decision" ? "warning" : reason === "progress_update" ? "muted" : "accent", reason);
2067
2589
  if (typeof interview?.title === "string" && interview.title.trim()) {
2068
2590
  text += " " + theme.fg("accent", interview.title.trim());
2069
2591
  }
2070
- if (messagePreview) {
2071
- text += "\n " + theme.fg("dim", messagePreview);
2592
+ if (messageText) {
2593
+ text += "\n " + theme.fg("dim", messageText);
2072
2594
  }
2073
2595
  return new Text(text, 0, 0);
2074
2596
  },
@@ -2097,11 +2619,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
2097
2619
  pi.registerTool(defineTool({
2098
2620
  name: "intercom",
2099
2621
  label: "Intercom",
2100
- discovery: {
2101
- summary: "Send messages and coordinate with other local Selesai sessions",
2102
- aliases: ["contact session", "session message", "peer session"],
2103
- category: "coordination",
2104
- },
2622
+ exposure: "deferred",
2105
2623
  description: `Send a message to another Selesai session running on this machine.
2106
2624
  Use this to communicate findings, request help, or coordinate work with other sessions.
2107
2625
 
@@ -2116,6 +2634,8 @@ Usage:
2116
2634
  intercom({ action: "send", to: "name-or-id", message: "..." }) → Send message
2117
2635
  intercom({ action: "send", cwd: "/path", openProjectPaneIfMissing: true, message: "..." }) → Open a visible Herdr project pane when needed, then send
2118
2636
  intercom({ action: "ask", to: "name-or-id", message: "..." }) → Ask and wait for reply
2637
+ intercom({ action: "handover", to: "name-or-id", message: "next task" }) → Summarize this session and hand it over; the receiver acts on it
2638
+ intercom({ action: "handover", cwd: "/path", openProjectPaneIfMissing: true }) → Hand over to the session in that project, opening a Herdr pane when needed
2119
2639
  intercom({ action: "cancel", messageId: "..." }) → Request cancellation of a sent message
2120
2640
  intercom({ action: "reply", message: "..." }) → Reply to the active/single pending ask
2121
2641
  intercom({ action: "pending" }) → List unresolved inbound asks
@@ -2124,14 +2644,14 @@ Usage:
2124
2644
  "Use to coordinate with other local Selesai sessions: list peers, send updates, ask for help, or check intercom connectivity.",
2125
2645
 
2126
2646
  parameters: Type.Object({
2127
- action: StringEnum(["list", "list-cwd", "send", "ask", "reply", "pending", "status", "cancel"] as const, {
2128
- description: "Action: 'list', 'list-cwd', 'send', 'ask', 'reply', 'pending', 'status', or 'cancel'",
2647
+ action: StringEnum(["list", "list-cwd", "send", "ask", "handover", "reply", "pending", "status", "cancel"] as const, {
2648
+ description: "Action: 'list', 'list-cwd', 'send', 'ask', 'handover', 'reply', 'pending', 'status', or 'cancel'. 'handover' summarizes this session with the current model and sends it to the target, which acts on it; 'message' is the optional next task.",
2129
2649
  }),
2130
2650
  to: Type.Optional(Type.String({
2131
- 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.",
2651
+ description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For send/ask/handover 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.",
2132
2652
  })),
2133
2653
  message: Type.Optional(Type.String({
2134
- description: "Message to send (for 'send', 'ask', or 'reply' action)",
2654
+ description: "Message to send (for 'send', 'ask', or 'reply' action). For 'handover', the optional next task for the receiver.",
2135
2655
  })),
2136
2656
  attachments: Type.Optional(Type.Array(Type.Object({
2137
2657
  type: StringEnum(["file", "snippet", "context"] as const),
@@ -2152,10 +2672,10 @@ Usage:
2152
2672
  description: "Previous message ID this send/ask is a user-authored retry of. Retries always send a new message ID.",
2153
2673
  })),
2154
2674
  cwd: Type.Optional(Type.String({
2155
- 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.",
2675
+ description: "Working directory filter for 'list-cwd'. For send/ask/handover, 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.",
2156
2676
  })),
2157
2677
  openProjectPaneIfMissing: Type.Optional(Type.Boolean({
2158
- description: "For send/ask with cwd, open a visible Herdr project pane and launch Selesai there when no matching live session is connected.",
2678
+ description: "For send/ask/handover with cwd, open a visible Herdr project pane and launch Selesai there when no matching live session is connected.",
2159
2679
  })),
2160
2680
  focus: Type.Optional(Type.Boolean({
2161
2681
  description: "For openProjectPaneIfMissing, focus the new Herdr pane. Defaults to true.",
@@ -2200,7 +2720,7 @@ Usage:
2200
2720
 
2201
2721
  return {
2202
2722
  content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
2203
- details: {},
2723
+ details: { roster: { peers: otherSessions.length, total: sessions.length } },
2204
2724
  };
2205
2725
  } catch (error) {
2206
2726
  return {
@@ -2254,7 +2774,7 @@ Usage:
2254
2774
 
2255
2775
  return {
2256
2776
  content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
2257
- details: {},
2777
+ details: { roster: { peers: otherSessions.length, total: sessions.length, cwd: filterCwd } },
2258
2778
  };
2259
2779
  } catch (error) {
2260
2780
  return {
@@ -2299,102 +2819,34 @@ Usage:
2299
2819
  details: { error: true },
2300
2820
  };
2301
2821
  }
2302
- try {
2303
- if (openProjectPaneIfMissing && !cwd) {
2304
- return {
2305
- content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
2306
- details: { error: true },
2307
- };
2308
- }
2309
- const confirmSend = !replyTo && config.confirmSend && ctx.hasUI;
2310
- const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
2311
- if (confirmSend && cwd && openProjectPaneIfMissing) {
2312
- const confirmed = await ctx.ui.confirm(
2313
- "Send message",
2314
- `Send to "${to ?? cwd}":\n\n${message}${attachmentText}`,
2315
- );
2316
- if (!confirmed) {
2317
- return {
2318
- content: [{ type: "text", text: "Message cancelled by user" }],
2319
- details: {},
2320
- };
2321
- }
2322
- }
2323
- const target: DeliveryTarget = cwd
2324
- ? await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal: _signal })
2325
- : { id: await resolveSessionTarget(connectedClient, to) ?? to, label: to };
2326
- const sendTo = target.id;
2327
- const targetDisplay = target.projectPane ? target.label : to ?? target.label;
2328
- if (sendTo === connectedClient.sessionId) {
2329
- return {
2330
- content: [{ type: "text", text: "Cannot message the current session" }],
2331
- details: { error: true },
2332
- };
2333
- }
2334
- const activeReplyMismatch = replyTo ? null : replyTracker.findActiveReplyTargetMismatch(sendTo);
2335
- if (activeReplyMismatch) {
2336
- const senderLabel = activeReplyMismatch.from.name || activeReplyMismatch.from.id;
2337
- return {
2338
- content: [{ type: "text", text: `This turn is responding to an intercom ask from "${senderLabel}". Use intercom({ action: "reply", message: "..." }) or set replyTo: "${activeReplyMismatch.message.id}". Refusing non-reply send to "${targetDisplay}" to avoid a misdirected reply.` }],
2339
- details: { error: true, replyTo: activeReplyMismatch.message.id },
2340
- };
2341
- }
2342
- const inferredAsk = replyTo ? null : replyTracker.findUniquePendingAskFrom(sendTo);
2343
- const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
2344
- if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
2345
- const confirmed = await ctx.ui.confirm(
2346
- "Send message",
2347
- `Send to "${targetDisplay}":\n\n${message}${attachmentText}`,
2348
- );
2349
- if (!confirmed) {
2350
- return {
2351
- content: [{ type: "text", text: "Message cancelled by user" }],
2352
- details: {},
2353
- };
2354
- }
2355
- }
2356
- const result = await connectedClient.send(sendTo, {
2357
- text: message,
2358
- attachments,
2359
- replyTo: effectiveReplyTo,
2360
- supersedes,
2361
- retryOf,
2362
- });
2363
- if (!result.delivered) {
2364
- const errorText = result.reason ?? "Session may not exist or has disconnected.";
2365
- return {
2366
- content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
2367
- details: deliveryDetails(result),
2368
- };
2369
- }
2370
- pi.appendEntry("intercom_sent", {
2371
- to: targetDisplay,
2372
- message: { text: message, attachments, replyTo: effectiveReplyTo, supersedes, retryOf },
2373
- messageId: result.id,
2374
- timestamp: Date.now(),
2375
- });
2376
- if (effectiveReplyTo) {
2377
- dismissIncomingAsk(effectiveReplyTo);
2378
- }
2822
+ return deliverMessage(connectedClient, ctx, _signal, {
2823
+ to, cwd, openProjectPaneIfMissing, focus, message, attachments, replyTo, supersedes, retryOf,
2824
+ });
2825
+ }
2826
+
2827
+ case "handover": {
2828
+ if (!to && !cwd) {
2379
2829
  return {
2380
- content: [{
2381
- type: "text",
2382
- text: target.projectPane
2383
- ? `Opened Herdr project pane ${target.projectPane.paneId} for ${target.projectPane.projectRoot} and sent message to ${targetDisplay}`
2384
- : inferredAsk ? `Reply sent to ${targetDisplay} (inferred from pending ask)` : `Message sent to ${targetDisplay}`,
2385
- }],
2386
- details: {
2387
- ...deliveryDetails(result),
2388
- ...(effectiveReplyTo ? { replyTo: effectiveReplyTo } : {}),
2389
- ...(target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {}),
2390
- },
2830
+ content: [{ type: "text", text: "Missing 'to' or 'cwd' parameter" }],
2831
+ details: { error: true },
2391
2832
  };
2833
+ }
2834
+ if (replyTo || supersedes || retryOf || attachments?.length) {
2835
+ return {
2836
+ content: [{ type: "text", text: "Handover always sends a new message; replyTo, supersedes, retryOf, and attachments are not supported." }],
2837
+ details: { error: true },
2838
+ };
2839
+ }
2840
+ let handoverText: string;
2841
+ try {
2842
+ handoverText = await buildHandoverText(connectedClient, ctx, { goal: message, crossMachine: Boolean(to?.includes("@")) }, _signal);
2392
2843
  } catch (error) {
2393
2844
  return {
2394
- content: [{ type: "text", text: `Failed to send: ${getErrorMessage(error)}` }],
2845
+ content: [{ type: "text", text: `Handover failed: ${getErrorMessage(error)}` }],
2395
2846
  details: { error: true },
2396
2847
  };
2397
2848
  }
2849
+ return deliverMessage(connectedClient, ctx, _signal, { to, cwd, openProjectPaneIfMissing, focus, message: handoverText, handover: true });
2398
2850
  }
2399
2851
 
2400
2852
  case "ask": {
@@ -2478,7 +2930,7 @@ Usage:
2478
2930
  deliveryState = sendResult.delivery;
2479
2931
  if (!sendResult.delivered) {
2480
2932
  const errorText = sendResult.reason ?? "Session may not exist or has disconnected.";
2481
- rejectReplyWaiter(new Error(`Message to "${targetDisplay}" was not delivered: ${errorText}`));
2933
+ if (replyWaiter?.replyTo === questionId) rejectReplyWaiter(new Error(`Message to "${targetDisplay}" was not delivered: ${errorText}`));
2482
2934
  if (replyPromise) {
2483
2935
  try {
2484
2936
  await replyPromise;
@@ -2513,7 +2965,7 @@ Usage:
2513
2965
  details: target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {},
2514
2966
  };
2515
2967
  } catch (error) {
2516
- rejectReplyWaiter(toError(error));
2968
+ if (questionId && replyWaiter?.replyTo === questionId) rejectReplyWaiter(toError(error));
2517
2969
  if (replyPromise) {
2518
2970
  try {
2519
2971
  await replyPromise;
@@ -2625,10 +3077,12 @@ Usage:
2625
3077
  };
2626
3078
  }
2627
3079
  },
2628
- renderCall(args, theme) {
3080
+ renderCall(args, theme, context) {
2629
3081
  const action = typeof args.action === "string" ? args.action : "intercom";
2630
3082
  const target = typeof args.to === "string" && args.to.trim() ? args.to.trim() : undefined;
2631
- const messagePreview = previewText(args.message, 96);
3083
+ const messageText = context.expanded && typeof args.message === "string"
3084
+ ? args.message
3085
+ : previewText(args.message, 96);
2632
3086
  const attachmentCount = Array.isArray(args.attachments) ? args.attachments.length : 0;
2633
3087
  let text = theme.fg("toolTitle", theme.bold("intercom "));
2634
3088
  text += theme.fg(action === "ask" ? "warning" : action === "reply" ? "success" : "accent", action);
@@ -2638,8 +3092,8 @@ Usage:
2638
3092
  if (attachmentCount > 0) {
2639
3093
  text += " " + theme.fg("dim", `(${attachmentCount} attachment${attachmentCount === 1 ? "" : "s"})`);
2640
3094
  }
2641
- if (messagePreview) {
2642
- text += "\n " + theme.fg("dim", messagePreview);
3095
+ if (messageText) {
3096
+ text += "\n " + theme.fg("dim", messageText);
2643
3097
  }
2644
3098
  return new Text(text, 0, 0);
2645
3099
  },
@@ -2647,9 +3101,17 @@ Usage:
2647
3101
  if (isPartial) {
2648
3102
  return new Text(theme.fg("warning", "Intercom working..."), 0, 0);
2649
3103
  }
2650
- const details = result.details as { delivered?: boolean; error?: boolean; messageId?: string; reason?: string } | undefined;
3104
+ const details = result.details as { delivered?: boolean; error?: boolean; messageId?: string; reason?: string; roster?: { peers: number; total: number; cwd?: string } } | undefined;
2651
3105
  const failed = Boolean(context.isError || details?.error === true || details?.delivered === false);
2652
3106
  let text = failed ? theme.fg("error", "✗ ") : theme.fg("success", "✓ ");
3107
+ if (details?.roster && !failed && !context.expanded) {
3108
+ // Collapsed rows are display-only; the model still receives the full roster text.
3109
+ const { peers, total, cwd: rosterCwd } = details.roster;
3110
+ const where = rosterCwd ? ` in ${rosterCwd}` : "";
3111
+ text += theme.fg("text", peers === 0 ? `no other sessions${where}` : `${peers} other session${peers === 1 ? "" : "s"}${where}`);
3112
+ text += theme.fg("dim", ` (${total} connected)`);
3113
+ return new Text(text, 0, 0);
3114
+ }
2653
3115
  text += theme.fg(failed ? "error" : "text", firstTextContent(result));
2654
3116
  if (details?.messageId && !context.expanded) {
2655
3117
  text += theme.fg("dim", ` (${details.messageId.slice(0, 8)})`);
@@ -2744,6 +3206,132 @@ Usage:
2744
3206
  notifyAliasCommand(liveContext, `Session alias set: ${alias}`, "info", commandGeneration);
2745
3207
  }
2746
3208
 
3209
+ async function runHandoverCommand(args: string, ctx: ExtensionContext): Promise<void> {
3210
+ const commandGeneration = runtimeGeneration;
3211
+ const liveContext = getLiveContext(ctx, commandGeneration);
3212
+ if (!liveContext) return;
3213
+ if (!liveContext.hasUI || (liveContext as ExtensionContext & { mode?: string }).mode !== "tui") {
3214
+ notifyAliasCommand(liveContext, "/handover requires the interactive terminal UI; use the intercom tool's handover action instead.", "error", commandGeneration);
3215
+ return;
3216
+ }
3217
+ const input = args.trim();
3218
+ if (!input) {
3219
+ await openHandoverPicker(liveContext, commandGeneration);
3220
+ return;
3221
+ }
3222
+ const target = input.split(/\s+/, 1)[0]!;
3223
+ const goal = input.slice(target.length).trim() || undefined;
3224
+ const isPath = /^(\/|\.\.?\/|~(\/|$))/.test(target);
3225
+ const request = isPath ? { cwd: expandHomePath(target), openProjectPaneIfMissing: true } : { to: target };
3226
+ await performHandover(liveContext, commandGeneration, request, { goal, crossMachine: !isPath && target.includes("@") });
3227
+ }
3228
+
3229
+ async function openHandoverPicker(ctx: ExtensionContext, generation: number, preselectSessionId?: string): Promise<void> {
3230
+ let pickerClient: IntercomClient;
3231
+ try {
3232
+ pickerClient = await ensureConnected("tool");
3233
+ } catch (error) {
3234
+ notifyIfLive(ctx, `Intercom unavailable: ${getErrorMessage(error)}`, "error", generation);
3235
+ return;
3236
+ }
3237
+ if (!getLiveContext(ctx, generation)) return;
3238
+ syncPresenceIdentity(ctx.sessionManager.getSessionId());
3239
+
3240
+ let sessions: SessionInfo[];
3241
+ try {
3242
+ sessions = await pickerClient.listSessions();
3243
+ } catch (error) {
3244
+ notifyIfLive(ctx, `Failed to list sessions: ${getErrorMessage(error)}`, "error", generation);
3245
+ return;
3246
+ }
3247
+ const currentSession = sessions.find((session) => session.id === pickerClient.sessionId);
3248
+ if (!currentSession) {
3249
+ notifyIfLive(ctx, "Current session is missing from intercom session list", "error", generation);
3250
+ return;
3251
+ }
3252
+ if (!getLiveContext(ctx, generation)) return;
3253
+
3254
+ const discoveryDeps = { run: runCommand, herdrBin: process.env.HERDR_BIN_PATH ?? "herdr" };
3255
+ const lister: RemoteSessionLister = {
3256
+ listMachines: () => listSavedMachines(discoveryDeps),
3257
+ listAgents: (machine) => listMachineAgents(machine, discoveryDeps),
3258
+ };
3259
+ const picked = await ctx.ui.custom<HandoverPickerResult | undefined>(
3260
+ (tui, theme, keybindings, done) => new HandoverPicker(tui, theme, keybindings, { currentSession, sessions, lister, preselectSessionId }, done),
3261
+ { overlay: true, overlayOptions: { width: 88 } },
3262
+ ).catch(() => undefined);
3263
+ if (!picked || !getLiveContext(ctx, generation)) return;
3264
+
3265
+ const { target, goal } = picked;
3266
+ if (target.kind === "local") {
3267
+ await performHandover(ctx, generation, { to: target.session.id }, { goal, crossMachine: false });
3268
+ return;
3269
+ }
3270
+ if (target.kind === "remote") {
3271
+ await performHandover(ctx, generation, { to: target.target }, { goal, crossMachine: true });
3272
+ return;
3273
+ }
3274
+ const path = (await ctx.ui.input("Project path for the new session", "~/dev/project"))?.trim();
3275
+ if (!getLiveContext(ctx, generation)) return;
3276
+ if (!path) {
3277
+ notifyIfLive(ctx, "Handover cancelled", "info", generation);
3278
+ return;
3279
+ }
3280
+ await performHandover(ctx, generation, { cwd: expandHomePath(path), openProjectPaneIfMissing: true }, { goal, crossMachine: false });
3281
+ }
3282
+
3283
+ async function performHandover(
3284
+ ctx: ExtensionContext,
3285
+ generation: number,
3286
+ request: Pick<DeliveryRequest, "to" | "cwd" | "openProjectPaneIfMissing">,
3287
+ options: { goal?: string; crossMachine: boolean },
3288
+ ): Promise<void> {
3289
+ let handoverClient: IntercomClient;
3290
+ try {
3291
+ handoverClient = await ensureConnected("tool");
3292
+ } catch (error) {
3293
+ notifyIfLive(ctx, `Intercom unavailable: ${getErrorMessage(error)}`, "error", generation);
3294
+ return;
3295
+ }
3296
+ if (!getLiveContext(ctx, generation)) return;
3297
+
3298
+ const generated = await ctx.ui.custom<{ text: string } | { error: string } | null>((tui, theme, _keybindings, done) => {
3299
+ const loader = new BorderedLoader(tui, theme, "Generating handover...");
3300
+ loader.onAbort = () => done(null);
3301
+ buildHandoverText(handoverClient, ctx, options, loader.signal).then(
3302
+ (text) => done({ text }),
3303
+ (error) => done(loader.signal.aborted ? null : { error: getErrorMessage(error) }),
3304
+ );
3305
+ return loader;
3306
+ });
3307
+ if (!getLiveContext(ctx, generation)) return;
3308
+ if (!generated) {
3309
+ notifyIfLive(ctx, "Handover cancelled", "info", generation);
3310
+ return;
3311
+ }
3312
+ if ("error" in generated) {
3313
+ notifyIfLive(ctx, `Handover failed: ${generated.error}`, "error", generation);
3314
+ return;
3315
+ }
3316
+
3317
+ const edited = await ctx.ui.editor("Edit handover", generated.text);
3318
+ if (!getLiveContext(ctx, generation)) return;
3319
+ if (edited === undefined || !edited.trim()) {
3320
+ notifyIfLive(ctx, "Handover cancelled", "info", generation);
3321
+ return;
3322
+ }
3323
+
3324
+ try {
3325
+ handoverClient = await ensureConnected("tool");
3326
+ } catch (error) {
3327
+ notifyIfLive(ctx, `Intercom unavailable: ${getErrorMessage(error)}`, "error", generation);
3328
+ return;
3329
+ }
3330
+ const result = await deliverMessage(handoverClient, ctx, undefined, { ...request, message: edited, handover: true });
3331
+ const failed = result.details.error === true || result.details.delivered === false;
3332
+ notifyIfLive(ctx, failed ? firstTextContent(result) : `Handover: ${firstTextContent(result)}`, failed ? "error" : "info", generation);
3333
+ }
3334
+
2747
3335
  async function openIntercomOverlay(ctx: ExtensionContext): Promise<void> {
2748
3336
  const overlayGeneration = runtimeGeneration;
2749
3337
  const liveContext = getLiveContext(ctx, overlayGeneration);
@@ -2780,12 +3368,17 @@ Usage:
2780
3368
  return;
2781
3369
  }
2782
3370
 
2783
- const selectedSession = await ctx.ui.custom<SessionInfo | undefined>(
3371
+ const selection = await ctx.ui.custom<SessionListSelection | undefined>(
2784
3372
  (_tui, theme, keybindings, done) => new SessionListOverlay(theme, keybindings, currentSession, sessions, done),
2785
3373
  { overlay: true, overlayOptions: { width: 88 } }
2786
3374
  ).catch(() => undefined);
2787
3375
 
2788
- if (!selectedSession || !getLiveContext(ctx, overlayGeneration)) return;
3376
+ if (!selection || !getLiveContext(ctx, overlayGeneration)) return;
3377
+ if (selection.action === "handover") {
3378
+ await openHandoverPicker(ctx, overlayGeneration, selection.session.id);
3379
+ return;
3380
+ }
3381
+ const selectedSession = selection.session;
2789
3382
 
2790
3383
  try {
2791
3384
  overlayClient = await ensureConnected("overlay");
@@ -2828,6 +3421,11 @@ Usage:
2828
3421
  handler: async (args, ctx) => setIntercomAlias(args, ctx),
2829
3422
  });
2830
3423
 
3424
+ pi.registerCommand("handover", {
3425
+ description: "Summarize this session and hand it over to another session (usage: /handover to pick a session, or /handover <target or project path> [next task])",
3426
+ handler: async (args, ctx) => runHandoverCommand(args, ctx),
3427
+ });
3428
+
2831
3429
  pi.registerShortcut("alt+m", {
2832
3430
  description: "Open session intercom",
2833
3431
  handler: async (ctx) => openIntercomOverlay(ctx),