@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,18 +1,21 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
3
+ import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
4
4
  import path from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { EventEmitter, once } from "node:events";
7
7
  import { spawn, type ChildProcess } from "node:child_process";
8
+ import { pathToFileURL } from "node:url";
8
9
  import { ReplyTracker } from "./reply-tracker.ts";
9
10
  import type { BrokerMessage, Message, SessionInfo } from "./types.ts";
10
11
  import {
11
12
  INTERCOM_EXTENSION_REGISTER_EVENT,
12
13
  INTERCOM_OUTBOX_REQUEST_EVENT,
13
14
  INTERCOM_OUTBOX_RESULT_EVENT,
15
+ INTERCOM_SESSION_IDENTITY_EVENT,
14
16
  type IntercomExtensionChannel,
15
17
  type IntercomOutboxResultV1,
18
+ type IntercomSessionIdentityRequestV1,
16
19
  } from "./extension-api.ts";
17
20
 
18
21
  const repoDir = process.cwd();
@@ -27,17 +30,29 @@ const childEnvKeys = [
27
30
  "SELESAI_SUBAGENT_INTERCOM_SESSION_NAME",
28
31
  "SELESAI_SUBAGENT_SUPERVISOR_CHANNEL_DIR",
29
32
  ] as const;
30
- const sharedHomeDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-home-"));
33
+ // Darwin Unix sockets have a short path limit; its default tmpdir is already ~65 characters.
34
+ const sharedHomeDir = mkdtempSync(path.join(process.platform === "darwin" ? "/tmp" : tmpdir(), "pi-intercom-home-"));
35
+ const previousAgentDir = process.env.SELESAI_CODING_AGENT_DIR;
36
+ process.env.SELESAI_CODING_AGENT_DIR = path.join(sharedHomeDir, ".selesai", "agent");
31
37
  const previousHome = process.env.HOME;
32
38
  const previousUserProfile = process.env.USERPROFILE;
39
+ const previousHerdrPaneId = process.env.HERDR_PANE_ID;
33
40
  process.env.HOME = sharedHomeDir;
34
41
  process.env.USERPROFILE = sharedHomeDir;
42
+ // Synthetic extension harnesses are not running in the parent test runner's
43
+ // Herdr pane. Individual Herdr integration cases register an explicit pane id.
44
+ delete process.env.HERDR_PANE_ID;
35
45
  const { IntercomClient } = await import("./broker/client.ts");
36
- const { getTsxCliPath } = await import("./broker/spawn.ts");
46
+ const { getTsxLoaderPath } = await import("./broker/spawn.ts");
47
+ const tsxImportArgs = ["--import", pathToFileURL(getTsxLoaderPath()).href];
37
48
  const { getAskTimeoutMs, getConfigPath } = await import("./config.ts");
38
49
  process.on("exit", () => {
50
+ if (previousAgentDir === undefined) delete process.env.SELESAI_CODING_AGENT_DIR;
51
+ else process.env.SELESAI_CODING_AGENT_DIR = previousAgentDir;
39
52
  process.env.HOME = previousHome;
40
53
  process.env.USERPROFILE = previousUserProfile;
54
+ if (previousHerdrPaneId === undefined) delete process.env.HERDR_PANE_ID;
55
+ else process.env.HERDR_PANE_ID = previousHerdrPaneId;
41
56
  rmSync(sharedHomeDir, { recursive: true, force: true });
42
57
  });
43
58
 
@@ -187,6 +202,7 @@ function createExtensionHarness(sessionName: string | (() => string) = "child-wo
187
202
  let activeToolNames = [...(options.activeTools ?? [])];
188
203
  const entries: Array<{ type: string; data: unknown }> = [];
189
204
  const sentMessages: Array<{ message: { customType?: string; content?: string; details?: unknown }; options?: { triggerTurn?: boolean; deliverAs?: string }; activeTools: string[] }> = [];
205
+ const userMessages: string[] = [];
190
206
  const pi = {
191
207
  getSessionName: () => typeof sessionName === "function" ? sessionName() : currentSessionName,
192
208
  setSessionName: (name: string) => { currentSessionName = name; },
@@ -216,6 +232,7 @@ function createExtensionHarness(sessionName: string | (() => string) = "child-wo
216
232
  sendMessage: (message: { customType?: string; content?: string; details?: unknown }, options?: { triggerTurn?: boolean; deliverAs?: string }) => {
217
233
  sentMessages.push({ message, options, activeTools: [...activeToolNames] });
218
234
  },
235
+ sendUserMessage: (content: string) => { userMessages.push(content); },
219
236
  appendEntry: (type: string, data: unknown) => entries.push({ type, data }),
220
237
  };
221
238
  const ctx = {
@@ -235,7 +252,9 @@ function createExtensionHarness(sessionName: string | (() => string) = "child-wo
235
252
  commands,
236
253
  entries,
237
254
  sentMessages,
255
+ userMessages,
238
256
  getActiveTools: () => pi.getActiveTools(),
257
+ clearLifecycleHandlers: () => lifecycleHandlers.clear(),
239
258
  async emitLifecycle(event: string, payload: unknown = {}, eventContext: unknown = ctx) {
240
259
  for (const handler of lifecycleHandlers.get(event) ?? []) {
241
260
  await handler(payload, eventContext);
@@ -291,7 +310,7 @@ test("opt-in TCP broker requires endpoint state for health and registration", {
291
310
  const { createMessageReader, writeMessage } = await import("./broker/framing.ts");
292
311
  const agentDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-tcp-agent-"));
293
312
  const broker = spawn(process.execPath, [
294
- getTsxCliPath(),
313
+ ...tsxImportArgs,
295
314
  "-e",
296
315
  "Object.defineProperty(process, 'platform', { value: 'win32' }); import('./broker/broker.ts').catch((error) => { console.error(error); process.exit(1); });",
297
316
  ], {
@@ -405,7 +424,7 @@ test("opt-in TCP broker requires endpoint state for health and registration", {
405
424
  });
406
425
 
407
426
  async function setupClients() {
408
- const broker = spawn(process.execPath, [getTsxCliPath(), path.join(repoDir, "broker", "broker.ts")], {
427
+ const broker = spawn(process.execPath, [...tsxImportArgs, path.join(repoDir, "broker", "broker.ts")], {
409
428
  cwd: repoDir,
410
429
  env: { ...process.env, HOME: sharedHomeDir, USERPROFILE: sharedHomeDir },
411
430
  stdio: ["ignore", "pipe", "pipe"],
@@ -439,13 +458,19 @@ async function setupClients() {
439
458
  cleanup: async () => {
440
459
  await planner.disconnect().catch(() => undefined);
441
460
  await orchestrator.disconnect().catch(() => undefined);
442
- broker.kill("SIGTERM");
443
- await once(broker, "exit").catch(() => undefined);
461
+ if (broker.exitCode === null && broker.signalCode === null) {
462
+ const exited = once(broker, "exit").catch(() => undefined);
463
+ broker.kill("SIGTERM");
464
+ await exited;
465
+ }
444
466
  },
445
467
  };
446
468
  } catch (error) {
447
- broker.kill("SIGTERM");
448
- await once(broker, "exit").catch(() => undefined);
469
+ if (broker.exitCode === null && broker.signalCode === null) {
470
+ const exited = once(broker, "exit").catch(() => undefined);
471
+ broker.kill("SIGTERM");
472
+ await exited;
473
+ }
449
474
  throw error;
450
475
  }
451
476
  }
@@ -497,6 +522,14 @@ function waitForOutboxResults(results: IntercomOutboxResultV1[], count: number,
497
522
  });
498
523
  }
499
524
 
525
+ async function waitForCondition(condition: () => boolean, description: string): Promise<void> {
526
+ const deadline = Date.now() + 3000;
527
+ while (!condition() && Date.now() < deadline) {
528
+ await new Promise((resolve) => setTimeout(resolve, 10));
529
+ }
530
+ assert.ok(condition(), `Timed out waiting for ${description}`);
531
+ }
532
+
500
533
  async function waitForReplyMessage(messages: Message[], messageId: string, timeoutMs = 3000): Promise<Message> {
501
534
  const deadline = Date.now() + timeoutMs;
502
535
  while (Date.now() < deadline) {
@@ -658,7 +691,7 @@ test("broker accepts caller supplied stable IDs across reconnect", { concurrency
658
691
  });
659
692
 
660
693
  test("broker scopes discovery, routing, mailbox, and presence", { concurrency: false }, async () => {
661
- const broker = spawn(process.execPath, [getTsxCliPath(), path.join(repoDir, "broker", "broker.ts")], {
694
+ const broker = spawn(process.execPath, [...tsxImportArgs, path.join(repoDir, "broker", "broker.ts")], {
662
695
  cwd: repoDir,
663
696
  env: { ...process.env, HOME: sharedHomeDir, USERPROFILE: sharedHomeDir },
664
697
  stdio: ["ignore", "pipe", "pipe"],
@@ -731,8 +764,11 @@ test("broker scopes discovery, routing, mailbox, and presence", { concurrency: f
731
764
  await waitForReplyMessage(recovered, "alpha-scoped-mailbox");
732
765
  } finally {
733
766
  await Promise.all(clients.map((client) => client.disconnect().catch(() => undefined)));
734
- if (broker.exitCode === null && broker.signalCode === null) broker.kill("SIGTERM");
735
- await once(broker, "exit").catch(() => undefined);
767
+ if (broker.exitCode === null && broker.signalCode === null) if (broker.exitCode === null && broker.signalCode === null) {
768
+ const exited = once(broker, "exit").catch(() => undefined);
769
+ broker.kill("SIGTERM");
770
+ await exited;
771
+ }
736
772
  }
737
773
  });
738
774
 
@@ -908,6 +944,94 @@ test("broker rejects changed message content after a rebound exact-target failur
908
944
  }
909
945
  });
910
946
 
947
+ test("all-non-Herdr rosters preserve upstream structured and text output without invoking Herdr", { concurrency: false }, async () => {
948
+ const fixtureDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-no-herdr-"));
949
+ const marker = path.join(fixtureDir, "invoked");
950
+ const fixtureBin = path.join(fixtureDir, "herdr-must-not-run");
951
+ writeFileSync(fixtureBin, `#!/bin/sh\ntouch ${JSON.stringify(marker)}\nexit 99\n`);
952
+ chmodSync(fixtureBin, 0o755);
953
+ const previousHerdrBin = process.env.HERDR_BIN;
954
+ process.env.HERDR_BIN = fixtureBin;
955
+ let setup: Awaited<ReturnType<typeof setupClients>>;
956
+ try {
957
+ setup = await setupClients();
958
+ } finally {
959
+ if (previousHerdrBin === undefined) delete process.env.HERDR_BIN;
960
+ else process.env.HERDR_BIN = previousHerdrBin;
961
+ }
962
+ const harness = createExtensionHarness("plain-worker", { sessionId: "plain-worker-session" });
963
+
964
+ try {
965
+ const structured = await setup.planner.listSessions();
966
+ assert.equal(structured.every((session) => !("herdrLocation" in session)), true);
967
+ assert.equal(existsSync(marker), false);
968
+
969
+ const { default: piIntercomExtension } = await import("./index.ts");
970
+ piIntercomExtension(harness.pi as never);
971
+ await harness.emitLifecycle("session_start");
972
+ await waitForSessionByName(setup.planner, "plain-worker");
973
+ const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
974
+ const result = await intercomTool.execute("plain-list", { action: "list" }, new AbortController().signal, undefined, harness.ctx);
975
+ const text = result.content.map((part) => part.text).join("\n");
976
+ assert.match(text, /Current session:/);
977
+ assert.match(text, /Other sessions:/);
978
+ assert.doesNotMatch(text, /Herdr|not under/);
979
+ assert.equal(existsSync(marker), false);
980
+ } finally {
981
+ await harness.emitLifecycle("session_shutdown");
982
+ await setup.cleanup();
983
+ rmSync(fixtureDir, { recursive: true, force: true });
984
+ }
985
+ });
986
+
987
+ test("broker resolves a registered Herdr pane through one live snapshot", { concurrency: false }, async () => {
988
+ const fixtureDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-herdr-"));
989
+ const fixtureBin = path.join(fixtureDir, "herdr-fixture");
990
+ writeFileSync(fixtureBin, `#!/usr/bin/env node
991
+ console.log(JSON.stringify({ result: { snapshot: {
992
+ panes: [{ pane_id: "pane-current", tab_id: "tab-current", workspace_id: "workspace-current", agent_session: { kind: "path", source: "herdr:pi", value: "/sessions/worker.jsonl" } }],
993
+ tabs: [{ tab_id: "tab-current", workspace_id: "workspace-current", label: "Review" }],
994
+ workspaces: [{ workspace_id: "workspace-current", label: "Research" }]
995
+ } } }));
996
+ `);
997
+ chmodSync(fixtureBin, 0o755);
998
+ const previousHerdrBin = process.env.HERDR_BIN;
999
+ process.env.HERDR_BIN = fixtureBin;
1000
+ let setup: Awaited<ReturnType<typeof setupClients>>;
1001
+ try {
1002
+ setup = await setupClients();
1003
+ } finally {
1004
+ if (previousHerdrBin === undefined) delete process.env.HERDR_BIN;
1005
+ else process.env.HERDR_BIN = previousHerdrBin;
1006
+ }
1007
+ const worker = new IntercomClient();
1008
+
1009
+ try {
1010
+ await worker.connect({
1011
+ name: "herdr-worker",
1012
+ cwd: repoDir,
1013
+ model: "test-model",
1014
+ pid: process.pid,
1015
+ startedAt: Date.now(),
1016
+ lastActivity: Date.now(),
1017
+ herdrPaneId: "pane-at-launch",
1018
+ herdrSessionPath: "/sessions/worker.jsonl",
1019
+ });
1020
+ const session = await waitForSessionByName(setup.planner, "herdr-worker");
1021
+ assert.deepEqual(session.herdrLocation && { ...session.herdrLocation, refreshedAt: 0 }, {
1022
+ status: "current",
1023
+ workspace: { id: "workspace-current", label: "Research" },
1024
+ tab: { id: "tab-current", label: "Review" },
1025
+ paneId: "pane-current",
1026
+ refreshedAt: 0,
1027
+ });
1028
+ } finally {
1029
+ await worker.disconnect().catch(() => undefined);
1030
+ await setup.cleanup();
1031
+ rmSync(fixtureDir, { recursive: true, force: true });
1032
+ }
1033
+ });
1034
+
911
1035
  test("broker propagates a session's tmux pane id into the roster", { concurrency: false }, async () => {
912
1036
  const { planner, cleanup } = await setupClients();
913
1037
  const worker = new IntercomClient();
@@ -1314,6 +1438,84 @@ test("extension can pin a restart-stable intercom session id", { concurrency: fa
1314
1438
  }
1315
1439
  });
1316
1440
 
1441
+ test("a session identity claim sets the intercom id and keeps the readable session name", { concurrency: false }, async () => {
1442
+ const { planner, cleanup } = await setupClients();
1443
+ const { default: piIntercomExtension } = await import("./index.ts");
1444
+ const previousStableId = process.env.PI_INTERCOM_STABLE_ID;
1445
+ const previousPublishedId = process.env.PI_INTERCOM_SESSION_ID;
1446
+ process.env.PI_INTERCOM_STABLE_ID = "process-wide-id";
1447
+ const harness = createExtensionHarness("worker: fix auth refresh", { sessionId: "transient-pi-session" });
1448
+ harness.pi.events.on(INTERCOM_SESSION_IDENTITY_EVENT, (request) => {
1449
+ (request as IntercomSessionIdentityRequestV1).claim(" subagent-worker-run1-1 ");
1450
+ });
1451
+
1452
+ try {
1453
+ piIntercomExtension(harness.pi as never);
1454
+ await harness.emitLifecycle("session_start");
1455
+ const session = await waitForSessionId(planner, "subagent-worker-run1-1");
1456
+ assert.equal(session.name, "worker: fix auth refresh");
1457
+ await harness.emitLifecycle("session_shutdown");
1458
+ } finally {
1459
+ if (previousStableId === undefined) delete process.env.PI_INTERCOM_STABLE_ID;
1460
+ else process.env.PI_INTERCOM_STABLE_ID = previousStableId;
1461
+ if (previousPublishedId === undefined) delete process.env.PI_INTERCOM_SESSION_ID;
1462
+ else process.env.PI_INTERCOM_SESSION_ID = previousPublishedId;
1463
+ await cleanup();
1464
+ }
1465
+ });
1466
+
1467
+ test("intercom handover summarizes the session and delivers it to the target", { concurrency: false }, async () => {
1468
+ const { orchestrator, cleanup } = await setupClients();
1469
+ const { default: piIntercomExtension } = await import("./index.ts");
1470
+ const harness = createExtensionHarness("handover-sender");
1471
+ const modelRequests: Array<{ systemPrompt?: string; messages: Array<{ content: Array<{ text: string }> }> }> = [];
1472
+ const ctx = {
1473
+ ...harness.ctx,
1474
+ sessionManager: {
1475
+ ...harness.ctx.sessionManager,
1476
+ getSessionFile: () => "/sessions/handover-sender.jsonl",
1477
+ getBranch: () => [{ type: "message", id: "a", parentId: null, timestamp: "2026-09-30T00:00:00.000Z", message: { role: "user", content: "fix the adapter", timestamp: 0 } }],
1478
+ },
1479
+ modelRegistry: {
1480
+ complete: async (_model: unknown, context: (typeof modelRequests)[number]) => {
1481
+ modelRequests.push(context);
1482
+ return { stopReason: "stop", content: [{ type: "text", text: "## Next task\nPort the fix" }] };
1483
+ },
1484
+ },
1485
+ };
1486
+
1487
+ try {
1488
+ piIntercomExtension(harness.pi as never);
1489
+ await harness.emitLifecycle("session_start");
1490
+ const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
1491
+
1492
+ const rejected = await intercomTool.execute("handover-reply", { action: "handover", to: "orchestrator", replyTo: "m1" }, new AbortController().signal, undefined, ctx);
1493
+ assert.equal(rejected.details?.error, true);
1494
+ const withAttachment = await intercomTool.execute("handover-attach", { action: "handover", to: "orchestrator", attachments: [{ type: "file", name: "a", content: "b" }] }, new AbortController().signal, undefined, ctx);
1495
+ assert.equal(withAttachment.details?.error, true);
1496
+ assert.equal(modelRequests.length, 0);
1497
+
1498
+ const sender = await waitForSessionByName(orchestrator, "handover-sender");
1499
+ assert.equal((await orchestrator.send(sender.id, { messageId: "handover-pending-ask", text: "What's next?", expectsReply: true })).delivered, true);
1500
+ await new Promise((resolve) => setTimeout(resolve, 50));
1501
+ const received = once(orchestrator, "message") as Promise<[SessionInfo, Message]>;
1502
+ const result = await intercomTool.execute("handover", { action: "handover", to: "orchestrator", message: "continue in pi-mcp-adapter" }, new AbortController().signal, undefined, ctx);
1503
+ assert.notEqual(result.details?.error, true);
1504
+ assert.equal(result.details?.delivery, "socket_delivered");
1505
+ assert.equal(result.details?.replyTo, undefined);
1506
+
1507
+ const [, message] = await received;
1508
+ assert.match(message.content.text, /^# Handover from handover-sender\n/);
1509
+ assert.equal(message.replyTo, undefined);
1510
+ assert.match(message.content.text, /Sender session file: \/sessions\/handover-sender\.jsonl/);
1511
+ assert.ok(message.content.text.endsWith("## Next task\nPort the fix"));
1512
+ assert.match(modelRequests[0]!.messages[0]!.content[0]!.text, /fix the adapter[\s\S]*continue in pi-mcp-adapter/);
1513
+ } finally {
1514
+ await harness.emitLifecycle("session_shutdown");
1515
+ await cleanup();
1516
+ }
1517
+ });
1518
+
1317
1519
  test("intercom-id inserts a stable handoff snippet into the editor", { concurrency: false }, async () => {
1318
1520
  const { cleanup } = await setupClients();
1319
1521
  const { default: piIntercomExtension } = await import("./index.ts");
@@ -1765,6 +1967,36 @@ test("intercom tool renders compact call and result rows", async () => {
1765
1967
  }, { isPartial: false, expanded: true }, renderTheme, { isError: false, expanded: true }));
1766
1968
  assert.match(errorText, /✗ Missing 'to' or 'message' parameter/);
1767
1969
  assert.match(errorText, /Reason: Missing target/);
1970
+
1971
+ const roster = {
1972
+ content: [{ type: "text", text: "**Current session:**\n• me\n\n**Other sessions (cwd: /repo):**\n• peer-a\n• peer-b" }],
1973
+ details: { roster: { peers: 2, total: 3, cwd: "/repo" } },
1974
+ };
1975
+ const collapsedRoster = renderToText(intercomTool.renderResult(roster, { isPartial: false, expanded: false }, renderTheme, { isError: false, expanded: false }));
1976
+ assert.equal(collapsedRoster, "✓ 2 other sessions in /repo (3 connected)");
1977
+ const expandedRoster = renderToText(intercomTool.renderResult(roster, { isPartial: false, expanded: true }, renderTheme, { isError: false, expanded: true }));
1978
+ assert.match(expandedRoster, /peer-a\n• peer-b/);
1979
+ });
1980
+
1981
+ test("outgoing tool calls preserve full messages when expanded", async () => {
1982
+ const { default: piIntercomExtension } = await import("./index.ts");
1983
+ await withChildOrchestratorEnv({
1984
+ orchestratorTarget: "orchestrator", runId: "expanded-call-test", agent: "worker", index: "0",
1985
+ }, () => {
1986
+ const harness = createExtensionHarness();
1987
+ piIntercomExtension(harness.pi as never);
1988
+ const message = ` ${"a".repeat(100)}\n\n 中文🧪 tail`;
1989
+ for (const [name, args, title] of [
1990
+ ["intercom", { action: "send", to: "planner", message }, "intercom send → planner"],
1991
+ ["contact_supervisor", { reason: "progress_update", message }, "contact_supervisor progress_update"],
1992
+ ] as const) {
1993
+ const tool = harness.tools.find((candidate) => candidate.name === name)!;
1994
+ assert.ok(tool.renderCall);
1995
+ assert.equal(renderToText(tool.renderCall(args, renderTheme, { expanded: true })), `${title}\n ${message}`);
1996
+ assert.equal(renderToText(tool.renderCall(args, renderTheme, { expanded: false })), `${title}\n ${"a".repeat(95)}…`);
1997
+ assert.equal(args.message, message);
1998
+ }
1999
+ });
1768
2000
  });
1769
2001
 
1770
2002
  test("intercom tool result hook marks failed details as errors", async () => {
@@ -1806,7 +2038,7 @@ test("obsolete toolVisibility config never hides or reveals the intercom tool",
1806
2038
  custom: async () => {
1807
2039
  overlayStep += 1;
1808
2040
  return overlayStep === 1
1809
- ? selectedSession
2041
+ ? { session: selectedSession, action: "message" }
1810
2042
  : { sent: true, messageId: "overlay-message", text: "Hello from the overlay" };
1811
2043
  },
1812
2044
  },
@@ -1991,6 +2223,7 @@ test("busy interactive sessions steer top-level asks without aborting", { concur
1991
2223
  await harness.emitLifecycle("session_start");
1992
2224
 
1993
2225
  const target = await waitForSessionByName(planner, "interactive-worker");
2226
+ await harness.emitLifecycle("agent_start");
1994
2227
 
1995
2228
  const delivered = await planner.send(target.id, {
1996
2229
  messageId: 'interactive-busy-"ask',
@@ -2021,7 +2254,7 @@ test("busy interactive sessions steer top-level asks without aborting", { concur
2021
2254
  }
2022
2255
  });
2023
2256
 
2024
- test("idle interactive sessions trigger a new turn immediately", { concurrency: false }, async () => {
2257
+ test("idle interactive sessions wake through a user prompt instead of triggerTurn", { concurrency: false }, async () => {
2025
2258
  const { default: piIntercomExtension } = await import("./index.ts");
2026
2259
  const { planner, cleanup } = await setupClients();
2027
2260
  const harness = createExtensionHarness("idle-trigger-worker", {
@@ -2038,8 +2271,14 @@ test("idle interactive sessions trigger a new turn immediately", { concurrency:
2038
2271
  await new Promise((resolve) => setTimeout(resolve, 20));
2039
2272
 
2040
2273
  assert.equal(harness.sentMessages.length, 1);
2041
- assert.equal(harness.sentMessages[0]?.options?.triggerTurn, true);
2042
- assert.equal(harness.sentMessages[0]?.options?.deliverAs, undefined);
2274
+ assert.equal(harness.sentMessages[0]?.options, undefined, "triggerTurn would bypass before_agent_start");
2275
+ assert.deepEqual(harness.userMessages, ["New intercom message above."]);
2276
+
2277
+ await harness.emitLifecycle("agent_start");
2278
+ await harness.emitLifecycle("agent_end");
2279
+ assert.equal((await planner.send(worker.id, { messageId: "idle-trigger-2", text: "And this" })).delivered, true);
2280
+ await waitForCondition(() => harness.sentMessages.length === 2, "second injected message");
2281
+ assert.equal(harness.userMessages.length, 2, "a started run re-arms the wake");
2043
2282
  } finally {
2044
2283
  await harness.emitLifecycle("session_shutdown");
2045
2284
  await cleanup();
@@ -2109,6 +2348,7 @@ test("busy interactive sessions steer same-sender messages in sequence order", {
2109
2348
  piIntercomExtension(harness.pi as never);
2110
2349
  await harness.emitLifecycle("session_start");
2111
2350
  const worker = await waitForSessionByName(planner, "sequence-worker");
2351
+ await harness.emitLifecycle("agent_start");
2112
2352
  const receipts = new Map<string, string[]>();
2113
2353
  const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
2114
2354
  const statuses = receipts.get(receipt.messageId) ?? [];
@@ -2142,6 +2382,208 @@ test("busy interactive sessions steer same-sender messages in sequence order", {
2142
2382
  }
2143
2383
  });
2144
2384
 
2385
+ for (const outcome of ["success", "failure", "abort", "cancel"]) {
2386
+ test(`busy without an agent run holds inbound messages through compaction ${outcome}`, { concurrency: false }, async () => {
2387
+ const { default: piIntercomExtension } = await import("./index.ts");
2388
+ const { planner, cleanup } = await setupClients();
2389
+ let idle = false;
2390
+ const harness = createExtensionHarness(`compact-${outcome}`, { hasUI: true, isIdle: () => idle });
2391
+ try {
2392
+ piIntercomExtension(harness.pi as never);
2393
+ await harness.emitLifecycle("session_start");
2394
+ const target = await waitForSessionByName(planner, `compact-${outcome}`);
2395
+ const receipts = new Map<string, string[]>();
2396
+ const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
2397
+ const statuses = receipts.get(receipt.messageId) ?? [];
2398
+ statuses.push(receipt.status);
2399
+ receipts.set(receipt.messageId, statuses);
2400
+ });
2401
+ assert.equal((await planner.send(target.id, { messageId: `${outcome}-1`, text: "First held" })).delivered, true);
2402
+ assert.equal((await planner.send(target.id, { messageId: `${outcome}-2`, text: "Second held" })).delivered, true);
2403
+ await waitForCondition(() => receipts.get(`${outcome}-1`)?.includes("queued") === true, "first queued receipt");
2404
+ await waitForCondition(() => receipts.get(`${outcome}-2`)?.includes("queued") === true, "second queued receipt");
2405
+ assert.equal(harness.sentMessages.length, 0);
2406
+ assert.deepEqual(receipts.get(`${outcome}-1`), ["receiver_received", "acknowledged", "queued"]);
2407
+ assert.deepEqual(receipts.get(`${outcome}-2`), ["receiver_received", "acknowledged", "queued"]);
2408
+ // No lifecycle event is needed: Pi becomes idle after success, failure, abort or cancellation.
2409
+ idle = true;
2410
+ await waitForCondition(() => harness.sentMessages.length === 2, "two injected messages");
2411
+ assert.equal(harness.sentMessages.length, 2);
2412
+ assert.match(harness.sentMessages[0]?.message.content ?? "", /First held/);
2413
+ assert.match(harness.sentMessages[1]?.message.content ?? "", /Second held/);
2414
+ assert.deepEqual(harness.sentMessages.map(({ options }) => options), [undefined, undefined]);
2415
+ assert.deepEqual(harness.userMessages, ["New intercom message above."], "one wake covers both messages");
2416
+ await waitForCondition(() => receipts.get(`${outcome}-1`)?.includes("injected") === true, "first injected receipt");
2417
+ await waitForCondition(() => receipts.get(`${outcome}-2`)?.includes("injected") === true, "second injected receipt");
2418
+ assert.deepEqual(receipts.get(`${outcome}-1`), ["receiver_received", "acknowledged", "queued", "injected"]);
2419
+ assert.deepEqual(receipts.get(`${outcome}-2`), ["receiver_received", "acknowledged", "queued", "injected"]);
2420
+ unsubscribe();
2421
+ } finally {
2422
+ await harness.emitLifecycle("session_shutdown");
2423
+ await cleanup();
2424
+ }
2425
+ });
2426
+ }
2427
+
2428
+ test("shutdown discards inbound messages held during compaction", { concurrency: false }, async () => {
2429
+ const { default: piIntercomExtension } = await import("./index.ts");
2430
+ const { planner, cleanup } = await setupClients();
2431
+ let idle = false;
2432
+ const harness = createExtensionHarness("compact-shutdown", { hasUI: true, isIdle: () => idle });
2433
+ const receipts: string[] = [];
2434
+ const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
2435
+ if (receipt.messageId === "compact-shutdown-message") receipts.push(receipt.status);
2436
+ });
2437
+ try {
2438
+ piIntercomExtension(harness.pi as never);
2439
+ await harness.emitLifecycle("session_start");
2440
+ const target = await waitForSessionByName(planner, "compact-shutdown");
2441
+ assert.equal((await planner.send(target.id, { messageId: "compact-shutdown-message", text: "Held" })).delivered, true);
2442
+ await waitForCondition(() => receipts.includes("queued"), "compaction queued receipt");
2443
+ assert.equal(harness.sentMessages.length, 0);
2444
+ await harness.emitLifecycle("session_shutdown");
2445
+ await waitForCondition(() => receipts.includes("expired"), "shutdown expired receipt");
2446
+ idle = true;
2447
+ await new Promise((resolve) => setTimeout(resolve, 150));
2448
+ assert.equal(harness.sentMessages.length, 0);
2449
+ assert.deepEqual(receipts, ["receiver_received", "acknowledged", "queued", "expired"]);
2450
+ } finally {
2451
+ unsubscribe();
2452
+ await cleanup();
2453
+ }
2454
+ });
2455
+
2456
+ test("cancelling a compaction-held message drops it before injection", { concurrency: false }, async () => {
2457
+ const { default: piIntercomExtension } = await import("./index.ts");
2458
+ const { planner, cleanup } = await setupClients();
2459
+ let idle = false;
2460
+ const harness = createExtensionHarness("compact-cancel", { hasUI: true, isIdle: () => idle });
2461
+ const receipts: string[] = [];
2462
+ const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
2463
+ if (receipt.messageId === "compact-cancel-message") receipts.push(receipt.status);
2464
+ });
2465
+ try {
2466
+ piIntercomExtension(harness.pi as never);
2467
+ await harness.emitLifecycle("session_start");
2468
+ const target = await waitForSessionByName(planner, "compact-cancel");
2469
+ assert.equal((await planner.send(target.id, { messageId: "compact-cancel-message", text: "Held" })).delivered, true);
2470
+ await waitForCondition(() => receipts.includes("queued"), "compaction queued receipt");
2471
+ assert.equal((await planner.cancelMessage("compact-cancel-message")).delivered, true);
2472
+ await waitForCondition(() => receipts.includes("cancelled"), "compaction cancelled receipt");
2473
+ idle = true;
2474
+ await new Promise((resolve) => setTimeout(resolve, 150));
2475
+ assert.equal(harness.sentMessages.length, 0);
2476
+ assert.deepEqual(receipts, ["receiver_received", "acknowledged", "queued", "cancelled"]);
2477
+ } finally {
2478
+ unsubscribe();
2479
+ await harness.emitLifecycle("session_shutdown");
2480
+ await cleanup();
2481
+ }
2482
+ });
2483
+
2484
+ test("runtime replacement discards held inbound messages", { concurrency: false }, async () => {
2485
+ const { default: piIntercomExtension } = await import("./index.ts");
2486
+ const { planner, cleanup } = await setupClients();
2487
+ let idle = false;
2488
+ const harness = createExtensionHarness("compact-replacement", { hasUI: true, isIdle: () => idle });
2489
+ try {
2490
+ piIntercomExtension(harness.pi as never);
2491
+ await harness.emitLifecycle("session_start");
2492
+ const target = await waitForSessionByName(planner, "compact-replacement");
2493
+ assert.equal((await planner.send(target.id, { messageId: "compact-replacement-message", text: "Old runtime" })).delivered, true);
2494
+ await new Promise((resolve) => setTimeout(resolve, 20));
2495
+ assert.equal(harness.sentMessages.length, 0);
2496
+ await harness.emitLifecycle("session_start");
2497
+ idle = true;
2498
+ await new Promise((resolve) => setTimeout(resolve, 150));
2499
+ assert.equal(harness.sentMessages.length, 0);
2500
+ } finally {
2501
+ await harness.emitLifecycle("session_shutdown");
2502
+ await cleanup();
2503
+ }
2504
+ });
2505
+
2506
+ test("held inbound messages steer when an agent run is busy after compaction", { concurrency: false }, async () => {
2507
+ const { default: piIntercomExtension } = await import("./index.ts");
2508
+ const { planner, cleanup } = await setupClients();
2509
+ const harness = createExtensionHarness("compact-busy", { hasUI: true, isIdle: () => false });
2510
+ try {
2511
+ piIntercomExtension(harness.pi as never);
2512
+ await harness.emitLifecycle("session_start");
2513
+ const target = await waitForSessionByName(planner, "compact-busy");
2514
+ assert.equal((await planner.send(target.id, { messageId: "compact-busy-message", text: "Steer later" })).delivered, true);
2515
+ await new Promise((resolve) => setTimeout(resolve, 20));
2516
+ assert.equal(harness.sentMessages.length, 0);
2517
+ await harness.emitLifecycle("agent_start");
2518
+ assert.equal(harness.sentMessages.length, 1);
2519
+ assert.equal(harness.sentMessages[0]?.options?.deliverAs, "steer");
2520
+ } finally {
2521
+ await harness.emitLifecycle("session_shutdown");
2522
+ await cleanup();
2523
+ }
2524
+ });
2525
+
2526
+ test("human-first leaves non-UI sessions on the busy auto-reply path after compaction", { concurrency: false }, async () => {
2527
+ await withIntercomConfig({ busyDelivery: "human-first" }, async () => {
2528
+ const { default: piIntercomExtension } = await import("./index.ts");
2529
+ const { planner, cleanup } = await setupClients();
2530
+ const harness = createExtensionHarness("human-first-pipe", { hasUI: false, isIdle: () => false });
2531
+ try {
2532
+ piIntercomExtension(harness.pi as never);
2533
+ await harness.emitLifecycle("session_start");
2534
+ const target = await waitForSessionByName(planner, "human-first-pipe");
2535
+ const askId = "human-first-pipe-ask";
2536
+ const replyPromise = waitForReply(planner, askId, 1000);
2537
+ assert.equal((await planner.send(target.id, { messageId: askId, text: "Still there?", expectsReply: true })).delivered, true);
2538
+ await new Promise((resolve) => setTimeout(resolve, 20));
2539
+ await harness.emitLifecycle("agent_start");
2540
+ const reply = await replyPromise;
2541
+ assert.match(reply.message.content.text, /non-interactive|cannot respond/i);
2542
+ assert.equal(harness.sentMessages.length, 0);
2543
+ } finally {
2544
+ await harness.emitLifecycle("session_shutdown");
2545
+ await cleanup();
2546
+ }
2547
+ });
2548
+ });
2549
+
2550
+ test("human-first releases the next held peer only after the woken run starts", { concurrency: false }, async () => {
2551
+ await withIntercomConfig({ busyDelivery: "human-first" }, async () => {
2552
+ const { default: piIntercomExtension } = await import("./index.ts");
2553
+ const { planner, cleanup } = await setupClients();
2554
+ let idle = false;
2555
+ const harness = createExtensionHarness("human-first-wake", { hasUI: true, isIdle: () => idle });
2556
+ try {
2557
+ piIntercomExtension(harness.pi as never);
2558
+ await harness.emitLifecycle("session_start");
2559
+ const target = await waitForSessionByName(planner, "human-first-wake");
2560
+ await harness.emitLifecycle("agent_start");
2561
+ const queued = new Set<string>();
2562
+ const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
2563
+ if (receipt.status === "queued") queued.add(receipt.messageId);
2564
+ });
2565
+ assert.equal((await planner.send(target.id, { messageId: "peer-a", text: "Peer A" })).delivered, true);
2566
+ assert.equal((await planner.send(target.id, { messageId: "peer-b", text: "Peer B" })).delivered, true);
2567
+ await waitForCondition(() => queued.has("peer-a") && queued.has("peer-b"), "both peers held");
2568
+ unsubscribe();
2569
+
2570
+ // The run ends; the wake prompt's preflight keeps Pi idle across several flush ticks.
2571
+ idle = true;
2572
+ await waitForCondition(() => harness.sentMessages.length === 1, "peer A injected");
2573
+ await new Promise((resolve) => setTimeout(resolve, 350));
2574
+ assert.equal(harness.sentMessages.length, 1, "peer B must wait for a later turn");
2575
+ assert.deepEqual(harness.userMessages, ["New intercom message above."]);
2576
+
2577
+ await harness.emitLifecycle("agent_start");
2578
+ await waitForCondition(() => harness.sentMessages.length === 2, "peer B injected");
2579
+ assert.match(harness.sentMessages[1]?.message.content ?? "", /Peer B/);
2580
+ } finally {
2581
+ await harness.emitLifecycle("session_shutdown");
2582
+ await cleanup();
2583
+ }
2584
+ });
2585
+ });
2586
+
2145
2587
  test("explicit cancel acknowledges that a steered inbound message may already be processed", { concurrency: false }, async () => {
2146
2588
  const { default: piIntercomExtension } = await import("./index.ts");
2147
2589
  const { planner, cleanup } = await setupClients();
@@ -2155,6 +2597,7 @@ test("explicit cancel acknowledges that a steered inbound message may already be
2155
2597
  piIntercomExtension(harness.pi as never);
2156
2598
  await harness.emitLifecycle("session_start");
2157
2599
  const worker = await waitForSessionByName(planner, "cancel-worker");
2600
+ await harness.emitLifecycle("agent_start");
2158
2601
  const receipts: string[] = [];
2159
2602
  const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
2160
2603
  if (receipt.messageId === "cancel-steered") receipts.push(receipt.status);
@@ -2197,6 +2640,7 @@ test("intercom cancel action requests cancellation for a sent message", { concur
2197
2640
  await senderHarness.emitLifecycle("session_start");
2198
2641
  await receiverHarness.emitLifecycle("session_start");
2199
2642
  await waitForSessionByName(planner, "cancel-tool-worker");
2643
+ await receiverHarness.emitLifecycle("agent_start");
2200
2644
  const intercomTool = senderHarness.tools.find((tool) => tool.name === "intercom")!;
2201
2645
 
2202
2646
  const sendResult = await intercomTool.execute("send-before-cancel", { action: "send", to: "cancel-tool-worker", message: "Cancel this through the tool" }, new AbortController().signal, undefined, senderHarness.ctx);
@@ -2235,6 +2679,7 @@ test("same-sender supersede reports an already-steered inbound message", { concu
2235
2679
  piIntercomExtension(harness.pi as never);
2236
2680
  await harness.emitLifecycle("session_start");
2237
2681
  const worker = await waitForSessionByName(planner, "supersede-worker");
2682
+ await harness.emitLifecycle("agent_start");
2238
2683
  const receipts = new Map<string, string[]>();
2239
2684
  const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
2240
2685
  const statuses = receipts.get(receipt.messageId) ?? [];
@@ -2290,6 +2735,8 @@ test("supersede is scoped to the same sender and receiver", { concurrency: false
2290
2735
  await secondHarness.emitLifecycle("session_start");
2291
2736
  const first = await waitForSessionByName(planner, "supersede-first");
2292
2737
  const second = await waitForSessionByName(planner, "supersede-second");
2738
+ await firstHarness.emitLifecycle("agent_start");
2739
+ await secondHarness.emitLifecycle("agent_start");
2293
2740
 
2294
2741
  assert.equal((await planner.send(first.id, { messageId: "wrong-target-old", text: "Old target" })).delivered, true);
2295
2742
  const wrongReceiver = await planner.send(second.id, { messageId: "wrong-target-new", text: "Wrong receiver", supersedes: "wrong-target-old" });
@@ -2319,6 +2766,7 @@ test("replied steered asks are not injected again after the current turn", { con
2319
2766
  piIntercomExtension(harness.pi as never);
2320
2767
  await harness.emitLifecycle("session_start");
2321
2768
  const worker = await waitForSessionByName(planner, "reply-while-busy-worker");
2769
+ await harness.emitLifecycle("agent_start");
2322
2770
 
2323
2771
  const askId = "reply-while-busy-ask";
2324
2772
  const replyReceived = waitForReply(planner, askId);
@@ -2402,7 +2850,7 @@ test("stale overlay work stops after same-session restart", { concurrency: false
2402
2850
  const plannerSession = await waitForSessionByName(planner, "planner");
2403
2851
  await harness.emitLifecycle("session_shutdown");
2404
2852
  await harness.emitLifecycle("session_start");
2405
- resolveFirstCustom(plannerSession);
2853
+ resolveFirstCustom({ session: plannerSession, action: "message" });
2406
2854
  await overlayPromise;
2407
2855
 
2408
2856
  assert.equal(customCalls, 1);
@@ -2425,6 +2873,7 @@ test("steered inbound messages are not reinjected after shutdown", { concurrency
2425
2873
  piIntercomExtension(harness.pi as never);
2426
2874
  await harness.emitLifecycle("session_start");
2427
2875
  const target = await waitForSessionByName(planner, "disposed-worker");
2876
+ await harness.emitLifecycle("agent_start");
2428
2877
  const receipts: string[] = [];
2429
2878
  const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
2430
2879
  if (receipt.messageId === "disposed-ask") receipts.push(receipt.status);
@@ -2468,6 +2917,7 @@ test("busy non-interactive sessions auto-reply to top-level asks without abortin
2468
2917
  await harness.emitLifecycle("session_start");
2469
2918
 
2470
2919
  const target = await waitForSessionByName(planner, "pipe-worker");
2920
+ await harness.emitLifecycle("agent_start");
2471
2921
 
2472
2922
  const askId = "pipe-mode-ask";
2473
2923
  const replyPromise = waitForReply(planner, askId, 1000);
@@ -3809,12 +4259,13 @@ test("intercom reply queues mail for a disconnected named sender", { concurrency
3809
4259
  }
3810
4260
  });
3811
4261
 
3812
- test("subagent control intercom events wake the current orchestrator session", async () => {
4262
+ test("subagent control intercom events reach the current orchestrator session", async () => {
3813
4263
  const { default: piIntercomExtension } = await import("./index.ts");
3814
4264
  const events = new EventEmitter();
3815
4265
  const sentMessages: Array<{ message: { customType?: string; content?: string }; options?: { triggerTurn?: boolean } }> = [];
3816
4266
  const pi = {
3817
4267
  getSessionName: () => "orchestrator",
4268
+ getActiveTools: () => ["intercom"],
3818
4269
  events: {
3819
4270
  on: (channel: string, handler: (payload: unknown) => void) => {
3820
4271
  events.on(channel, handler);
@@ -3844,10 +4295,9 @@ test("subagent control intercom events wake the current orchestrator session", a
3844
4295
  assert.equal(sentMessages[0]?.message.customType, "intercom_message");
3845
4296
  assert.match(sentMessages[0]?.message.content ?? "", /From subagent-control/);
3846
4297
  assert.match(sentMessages[0]?.message.content ?? "", /worker needs attention in run 78f659a3/);
3847
- assert.equal(sentMessages[0]?.options?.triggerTurn, true);
3848
4298
  });
3849
4299
 
3850
- test("subagent result intercom events wake the current orchestrator session", async () => {
4300
+ test("subagent result intercom events reach the current orchestrator session", async () => {
3851
4301
  const { default: piIntercomExtension } = await import("./index.ts");
3852
4302
  const events = new EventEmitter();
3853
4303
  const sentMessages: Array<{ message: { customType?: string; content?: string }; options?: { triggerTurn?: boolean } }> = [];
@@ -3855,6 +4305,7 @@ test("subagent result intercom events wake the current orchestrator session", as
3855
4305
  events.on("subagent:result-intercom-delivery", (payload) => deliveryAcks.push(payload));
3856
4306
  const pi = {
3857
4307
  getSessionName: () => "orchestrator",
4308
+ getActiveTools: () => ["intercom"],
3858
4309
  events: {
3859
4310
  on: (channel: string, handler: (payload: unknown) => void) => {
3860
4311
  events.on(channel, handler);
@@ -3885,10 +4336,64 @@ test("subagent result intercom events wake the current orchestrator session", as
3885
4336
  assert.equal(sentMessages[0]?.message.customType, "intercom_message");
3886
4337
  assert.match(sentMessages[0]?.message.content ?? "", /From subagent-result/);
3887
4338
  assert.match(sentMessages[0]?.message.content ?? "", /Status: completed/);
3888
- assert.equal(sentMessages[0]?.options?.triggerTurn, true);
3889
4339
  assert.deepEqual(deliveryAcks, [{ requestId: "result-1", delivered: true }]);
3890
4340
  });
3891
4341
 
4342
+ test("subagent relay events wake an idle orchestrator and steer a busy one", { concurrency: false }, async () => {
4343
+ const { default: piIntercomExtension } = await import("./index.ts");
4344
+ const { cleanup } = await setupClients();
4345
+ let idle = true;
4346
+ const harness = createExtensionHarness("relay-orchestrator", { hasUI: true, isIdle: () => idle });
4347
+ try {
4348
+ piIntercomExtension(harness.pi as never);
4349
+ await harness.emitLifecycle("session_start");
4350
+
4351
+ harness.pi.events.emit("subagent:result-intercom", { to: "relay-orchestrator", requestId: "idle-result", message: "subagent result\n\nStatus: completed" });
4352
+ await waitForCondition(() => harness.sentMessages.length === 1, "idle relay message");
4353
+ assert.equal(harness.sentMessages[0]?.options, undefined);
4354
+ assert.deepEqual(harness.userMessages, ["New intercom message above."]);
4355
+
4356
+ await harness.emitLifecycle("agent_start");
4357
+ idle = false;
4358
+ harness.pi.events.emit("subagent:control-intercom", { to: "relay-orchestrator", message: "subagent needs attention" });
4359
+ await waitForCondition(() => harness.sentMessages.length === 2, "busy relay message");
4360
+ assert.equal(harness.sentMessages[1]?.options, undefined, "Pi steers untriggered messages while streaming");
4361
+ assert.equal(harness.userMessages.length, 1, "a busy session must not get a wake prompt");
4362
+ } finally {
4363
+ await harness.emitLifecycle("session_shutdown");
4364
+ await cleanup();
4365
+ }
4366
+ });
4367
+
4368
+ test("a wake prompt that never starts a run stops blocking later wakes after its window", { concurrency: false }, async (t) => {
4369
+ const { default: piIntercomExtension } = await import("./index.ts");
4370
+ const { cleanup } = await setupClients();
4371
+ const realNow = Date.now.bind(Date);
4372
+ let offset = 0;
4373
+ t.mock.method(Date, "now", () => realNow() + offset);
4374
+ const harness = createExtensionHarness("unstarted-wake", { hasUI: true, isIdle: () => true });
4375
+ const relay = (message: string) => harness.pi.events.emit("subagent:control-intercom", { to: "unstarted-wake", message });
4376
+ try {
4377
+ piIntercomExtension(harness.pi as never);
4378
+ await harness.emitLifecycle("session_start");
4379
+
4380
+ // An input handler can handle the wake prompt, so no agent_start follows it.
4381
+ relay("first");
4382
+ await waitForCondition(() => harness.sentMessages.length === 1, "first relay message");
4383
+ relay("second");
4384
+ await waitForCondition(() => harness.sentMessages.length === 2, "second relay message");
4385
+ assert.equal(harness.userMessages.length, 1, "a recent wake may still be starting");
4386
+
4387
+ offset += 10_001;
4388
+ relay("third");
4389
+ await waitForCondition(() => harness.sentMessages.length === 3, "third relay message");
4390
+ assert.equal(harness.userMessages.length, 2, "an expired wake must not block the next one");
4391
+ } finally {
4392
+ await harness.emitLifecycle("session_shutdown");
4393
+ await cleanup();
4394
+ }
4395
+ });
4396
+
3892
4397
  test("async ask can be replied to later from the single pending ask fallback", { concurrency: false }, async () => {
3893
4398
  const { planner, orchestrator, cleanup } = await setupClients();
3894
4399
  const replyTracker = new ReplyTracker();
@@ -4075,6 +4580,68 @@ test("confirmSend still gates an inferred reply; cancellation preserves the pend
4075
4580
  });
4076
4581
  });
4077
4582
 
4583
+ test("confirmSend decline blocks explicit cross-machine transport after fail-closed validation", { concurrency: false }, async () => {
4584
+ await withConfirmSendEnabled(async () => {
4585
+ const { cleanup } = await setupClients();
4586
+ const { default: piIntercomExtension } = await import("./index.ts");
4587
+ const temp = mkdtempSync(path.join(repoDir, ".cross-machine-confirm-"));
4588
+ const marker = path.join(temp, "transport-called");
4589
+ const herdr = path.join(temp, "herdr");
4590
+ const previousHerdrBin = process.env.HERDR_BIN_PATH;
4591
+ writeFileSync(herdr, `#!/bin/sh\ntouch ${JSON.stringify(marker)}\nexit 1\n`);
4592
+ chmodSync(herdr, 0o755);
4593
+ process.env.HERDR_BIN_PATH = herdr;
4594
+ const confirmCalls: Array<[string, string]> = [];
4595
+ const harness = createExtensionHarness("cross-machine-confirm-worker", {
4596
+ hasUI: true,
4597
+ ui: {
4598
+ confirm: async (title: string, text: string) => {
4599
+ confirmCalls.push([title, text]);
4600
+ return false;
4601
+ },
4602
+ },
4603
+ });
4604
+
4605
+ try {
4606
+ piIntercomExtension(harness.pi as never);
4607
+ await harness.emitLifecycle("session_start");
4608
+ const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
4609
+
4610
+ const unsupported = await intercomTool.execute("remote-unsupported", {
4611
+ action: "send",
4612
+ to: "reviewer@workstation",
4613
+ message: "hello",
4614
+ attachments: [{ type: "snippet", name: "note", content: "body" }],
4615
+ }, new AbortController().signal, undefined, harness.ctx);
4616
+ assert.equal(unsupported.details?.error, true);
4617
+
4618
+ const malformed = await intercomTool.execute("remote-malformed", {
4619
+ action: "send",
4620
+ to: "review er@workstation",
4621
+ message: "hello",
4622
+ }, new AbortController().signal, undefined, harness.ctx);
4623
+ assert.equal(malformed.details?.error, true);
4624
+ assert.equal(confirmCalls.length, 0);
4625
+
4626
+ const declined = await intercomTool.execute("remote-declined", {
4627
+ action: "send",
4628
+ to: "reviewer@workstation",
4629
+ message: "hello",
4630
+ }, new AbortController().signal, undefined, harness.ctx);
4631
+ assert.equal(declined.content[0]?.text, "Message cancelled by user");
4632
+ assert.equal(confirmCalls.length, 1);
4633
+ assert.match(confirmCalls[0]![1], /reviewer@workstation/);
4634
+ assert.equal(existsSync(marker), false);
4635
+ } finally {
4636
+ await harness.emitLifecycle("session_shutdown");
4637
+ await cleanup();
4638
+ if (previousHerdrBin === undefined) delete process.env.HERDR_BIN_PATH;
4639
+ else process.env.HERDR_BIN_PATH = previousHerdrBin;
4640
+ rmSync(temp, { recursive: true, force: true });
4641
+ }
4642
+ });
4643
+ });
4644
+
4078
4645
  test("contact_supervisor progress_update stays unthreaded despite a pending ask; a later inferred send resolves it", { concurrency: false }, async () => {
4079
4646
  const { orchestrator, cleanup } = await setupClients();
4080
4647
 
@@ -4349,3 +4916,284 @@ test("failed delivery from an inferred reply preserves the pending ask", { concu
4349
4916
  await cleanup();
4350
4917
  }
4351
4918
  });
4919
+
4920
+ test("structured RPC uses the shared runtime for commands, fast replies, receipts, presence and idle/busy incoming messages", { concurrency: false }, async () => {
4921
+ const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
4922
+ const { INTERCOM_RPC_EVENT } = await import("./extension-api.ts");
4923
+ const { default: piIntercomExtension } = await import("./index.ts");
4924
+ const { planner, orchestrator, cleanup } = await setupClients();
4925
+ let idle = true;
4926
+ const harness = createExtensionHarness("rpc-worker", { mode: "rpc", hasUI: true, isIdle: () => idle });
4927
+ const events: Array<{ type: string; [key: string]: unknown }> = [];
4928
+ const bridge = new RpcIntercomBridge(harness.pi.events, event => events.push(event as never), harness.ctx.sessionManager.getSessionId());
4929
+ try {
4930
+ await withIntercomConfig({ inboundTrigger: "always" }, async () => {
4931
+ piIntercomExtension(harness.pi as never);
4932
+ await harness.emitLifecycle("session_start");
4933
+ const self = await waitForSessionByName(planner, "rpc-worker");
4934
+ assert.equal((await bridge.request({ type: "intercom_status" })).success, true);
4935
+ const unknown = await bridge.request({ type: "intercom_arbitrary", to: "planner", message: "must not send" } as never);
4936
+ assert.ok(!unknown.success);
4937
+ assert.match(unknown.error, /Unknown/);
4938
+ const list = await bridge.request({ type: "intercom_list" });
4939
+ assert.ok(list.success && "data" in list && "sessions" in list.data);
4940
+ assert.equal(list.data.sessions.filter(peer => peer.name === "rpc-worker").length, 1);
4941
+ assert.ok(events.some(event => event.type === "intercom_connection" && event.connected === true));
4942
+ const sent = await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "Desktop update" });
4943
+ assert.ok(sent.success && "data" in sent && "messageId" in sent.data);
4944
+ planner.sendMessageReceipt({ messageId: sent.data.messageId, status: "receiver_received", timestamp: Date.now() });
4945
+ assert.equal((await bridge.request({ type: "intercom_send", to: self.id, message: "self" })).success, false);
4946
+ assert.equal((await bridge.request({ type: "intercom_ask", to: "missing-peer", message: "?", timeoutMs: 100 })).success, false);
4947
+ assert.equal((await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "", attachments: [] })).success, false);
4948
+ assert.equal((await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "bad", attachments: [{ type: "invalid", name: "x", content: "x" }] as never })).success, false);
4949
+ const answer = (from: SessionInfo, message: Message) => {
4950
+ if (message.expectsReply && message.content.text === "Fast question") void planner.send(from.id, { text: "Fast answer", replyTo: message.id });
4951
+ };
4952
+ planner.on("message", answer);
4953
+ const asked = await bridge.request({ id: "ask-correlation", type: "intercom_ask", to: planner.sessionId!, message: "Fast question", timeoutMs: 2000 });
4954
+ planner.off("message", answer);
4955
+ assert.ok(asked.success && "data" in asked && "reply" in asked.data);
4956
+ assert.equal(asked.id, "ask-correlation");
4957
+ assert.equal(asked.data.reply.replyTo, asked.data.messageId);
4958
+ assert.equal(asked.data.reply.content.text, "Fast answer");
4959
+ const askId = "rpc-inbound-ask";
4960
+ await planner.send(self.id, { messageId: askId, text: "Inbound", expectsReply: true });
4961
+ await new Promise(resolve => setTimeout(resolve, 30));
4962
+ assert.ok(harness.userMessages.includes("New intercom message above."));
4963
+ assert.ok(harness.sentMessages.every(item => !item.options?.triggerTurn));
4964
+ const pending = await bridge.request({ type: "intercom_pending" });
4965
+ assert.ok(pending.success && "data" in pending && "asks" in pending.data);
4966
+ assert.equal(pending.data.asks[0]?.message.id, askId);
4967
+ const replyReceived = waitForReply(planner, askId);
4968
+ assert.equal((await bridge.request({ type: "intercom_reply", message: "Desktop answer", replyTo: askId })).success, true);
4969
+ assert.equal((await replyReceived).message.content.text, "Desktop answer");
4970
+ idle = false;
4971
+ await harness.emitLifecycle("agent_start");
4972
+ const messagesBefore = harness.sentMessages.length;
4973
+ await orchestrator.send(self.id, { text: "Busy message" });
4974
+ await new Promise(resolve => setTimeout(resolve, 30));
4975
+ assert.equal(harness.sentMessages.length, messagesBefore + 1);
4976
+ assert.equal(harness.sentMessages.at(-1)?.options?.deliverAs, "steer");
4977
+ orchestrator.updatePresence({ status: "thinking" });
4978
+ await new Promise(resolve => setTimeout(resolve, 30));
4979
+ assert.ok(events.some(event => event.type === "intercom_message"));
4980
+ assert.ok(events.some(event => event.type === "intercom_receipt"));
4981
+ assert.ok(events.some(event => event.type === "intercom_delivery"));
4982
+ assert.ok(events.some(event => event.type === "intercom_presence"));
4983
+ await orchestrator.disconnect();
4984
+ await new Promise(resolve => setTimeout(resolve, 30));
4985
+ assert.ok(events.some(event => event.type === "intercom_session_left"));
4986
+ // Duplicate broker messages must not create a second structured incoming event.
4987
+ const incomingCount = events.filter(event => event.type === "intercom_message").length;
4988
+ await planner.send(self.id, { messageId: askId, text: "Inbound", expectsReply: true });
4989
+ await new Promise(resolve => setTimeout(resolve, 30));
4990
+ assert.equal(events.filter(event => event.type === "intercom_message").length, incomingCount);
4991
+ const timedOut = await bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "Unanswered", timeoutMs: 30 });
4992
+ assert.ok(!timedOut.success);
4993
+ assert.match(timedOut.error, /not cancellation/);
4994
+ const blocked = bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "Pending at shutdown", timeoutMs: 1000 });
4995
+ await new Promise(resolve => setTimeout(resolve, 30));
4996
+ const competing = await bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "Competing ask", timeoutMs: 1000 });
4997
+ assert.ok(!competing.success);
4998
+ assert.match(competing.error, /Already waiting/);
4999
+ await harness.emitLifecycle("session_shutdown");
5000
+ assert.equal((await blocked).success, false);
5001
+ assert.equal((await bridge.request({ type: "intercom_list" })).success, false);
5002
+ assert.ok(events.some(event => event.type === "intercom_connection" && event.reason === "Session shutting down"));
5003
+ // Reload installs exactly one listener on the same bus and stale results are ignored.
5004
+ harness.clearLifecycleHandlers();
5005
+ piIntercomExtension(harness.pi as never);
5006
+ await harness.emitLifecycle("session_start");
5007
+ assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
5008
+ await harness.emitLifecycle("session_shutdown");
5009
+ harness.pi.events.emit(INTERCOM_RPC_EVENT, { type: "intercom_connection", enabled: true, connected: false, sessionId: null });
5010
+ });
5011
+ } finally {
5012
+ bridge.dispose();
5013
+ await harness.emitLifecycle("session_shutdown");
5014
+ await cleanup();
5015
+ }
5016
+ });
5017
+
5018
+ test("stop_all_background cancels the blocking outbound ask and reports inbound asks it cannot cancel", { concurrency: false }, async () => {
5019
+ const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
5020
+ const { RpcReleaseBridge } = await import("../../modes/rpc/release-bridge.ts");
5021
+ const { default: piIntercomExtension } = await import("./index.ts");
5022
+ const { planner, orchestrator, cleanup } = await setupClients();
5023
+ const harness = createExtensionHarness("stop-all-worker", { mode: "rpc", hasUI: true, isIdle: () => true });
5024
+ const sessionId = harness.ctx.sessionManager.getSessionId();
5025
+ const intercomBridge = new RpcIntercomBridge(harness.pi.events, () => undefined, sessionId);
5026
+ const releaseBridge = new RpcReleaseBridge(harness.pi.events, { version: 1, sessionId, epoch: "e1" });
5027
+ const stopCommand = { type: "stop_all_background" as const, version: 1 as const };
5028
+ try {
5029
+ await withIntercomConfig({ inboundTrigger: "always" }, async () => {
5030
+ piIntercomExtension(harness.pi as never);
5031
+ await harness.emitLifecycle("session_start");
5032
+ const self = await waitForSessionByName(planner, "stop-all-worker");
5033
+ // Idle: nothing to stop, and the intercom contributor answered.
5034
+ const idle = await releaseBridge.stopAll(stopCommand, () => [], () => []);
5035
+ assert.ok(idle.success && idle.command === "stop_all_background");
5036
+ assert.deepEqual(idle.data.stopped, []);
5037
+
5038
+ await planner.send(self.id, { messageId: "stop-all-inbound", text: "Please answer", expectsReply: true });
5039
+ // A different peer than the inbound asker: the broker refuses mutual asks.
5040
+ const blocked = intercomBridge.request({ type: "intercom_ask", to: orchestrator.sessionId!, message: "Pending ask", timeoutMs: 20_000 });
5041
+ await new Promise(resolve => setTimeout(resolve, 100));
5042
+ const reply = await releaseBridge.stopAll(stopCommand, () => [], () => []);
5043
+ assert.ok(reply.success && reply.command === "stop_all_background");
5044
+ const intercomItems = reply.data.stopped.filter(item => item.source === "intercom");
5045
+ const outbound = intercomItems.find(item => item.kind === "outbound_ask");
5046
+ assert.ok(outbound, JSON.stringify(reply.data.stopped));
5047
+ assert.equal(outbound.ok, true);
5048
+ assert.match(outbound.detail, /^Cancelled blocking ask to /);
5049
+ assert.deepEqual(intercomItems.filter(item => item.kind === "inbound_ask").map(item => [item.id, item.ok, item.error]), [["stop-all-inbound", false, "cannot cancel inbound"]]);
5050
+ // The blocked tool call returned with the cancellation instead of waiting for its 20s timeout.
5051
+ const settled = await blocked;
5052
+ assert.equal(settled.success, false);
5053
+ assert.match((settled as { error: string }).error, /Cancelled: session background work was stopped/);
5054
+ // Readiness afterwards has no outbound ask; the inbound ask is still ours to answer.
5055
+ assert.deepEqual(reply.data.remaining.blockers.filter(b => b.source === "intercom").map(b => b.kind), ["inbound_ask"]);
5056
+ // Idempotent: only the inbound ask is reported the second time.
5057
+ const again = await releaseBridge.stopAll(stopCommand, () => [], () => []);
5058
+ assert.ok(again.success && again.command === "stop_all_background");
5059
+ assert.deepEqual(again.data.stopped.map(item => [item.kind, item.ok]), [["inbound_ask", false]]);
5060
+ });
5061
+ } finally {
5062
+ intercomBridge.dispose();
5063
+ releaseBridge.dispose();
5064
+ await harness.emitLifecycle("session_shutdown");
5065
+ await cleanup();
5066
+ }
5067
+ });
5068
+
5069
+ test("structured RPC fails closed for disabled runtime, missing backend, and rejected/unavailable confirmation", { concurrency: false }, async () => {
5070
+ const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
5071
+ const { default: piIntercomExtension } = await import("./index.ts");
5072
+ const { planner, cleanup } = await setupClients();
5073
+ try {
5074
+ for (const options of [
5075
+ { config: { enabled: false }, hasUI: true },
5076
+ { config: { confirmSend: true }, hasUI: false },
5077
+ { config: { confirmSend: true }, hasUI: true },
5078
+ ]) {
5079
+ const harness = createExtensionHarness("rpc-consent", { mode: "rpc", hasUI: options.hasUI, ui: { confirm: async () => false } });
5080
+ const bridge = new RpcIntercomBridge(harness.pi.events, () => {}, harness.ctx.sessionManager.getSessionId());
5081
+ await withIntercomConfig(options.config, async () => {
5082
+ piIntercomExtension(harness.pi as never);
5083
+ await harness.emitLifecycle("session_start");
5084
+ const sent = await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "Must not send" });
5085
+ assert.ok(!sent.success);
5086
+ assert.match(sent.error, /disabled|confirmation_unavailable|cancelled/);
5087
+ if (options.config.enabled === false) {
5088
+ const status = await bridge.request({ type: "intercom_status" });
5089
+ assert.ok(status.success && "data" in status && "enabled" in status.data);
5090
+ assert.equal(status.data.enabled, false);
5091
+ }
5092
+ await harness.emitLifecycle("session_shutdown");
5093
+ const missing = await bridge.request({ type: "intercom_list" });
5094
+ assert.ok(!missing.success);
5095
+ assert.match(missing.error, /unavailable/);
5096
+ });
5097
+ bridge.dispose();
5098
+ }
5099
+ } finally { await cleanup(); }
5100
+ });
5101
+
5102
+ test("structured RPC aborts a pending confirmation on disconnect and can reconnect", { concurrency: false }, async () => {
5103
+ const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
5104
+ const { default: piIntercomExtension } = await import("./index.ts");
5105
+ const { planner, cleanup } = await setupClients();
5106
+ let confirmSignal: AbortSignal | undefined;
5107
+ let signalAborted = false;
5108
+ let enteredConfirm!: () => void;
5109
+ const confirming = new Promise<void>(resolve => { enteredConfirm = resolve; });
5110
+ const harness = createExtensionHarness("rpc-disconnect-confirm", { mode: "rpc", hasUI: true,
5111
+ ui: { confirm: (_title: string, _message: string, options: { signal: AbortSignal }) => new Promise<boolean>(resolve => {
5112
+ confirmSignal = options.signal;
5113
+ options.signal.addEventListener("abort", () => { signalAborted = true; resolve(false); }, { once: true });
5114
+ enteredConfirm();
5115
+ }) } });
5116
+ const bridge = new RpcIntercomBridge(harness.pi.events, () => {}, harness.ctx.sessionManager.getSessionId());
5117
+ const originalList = IntercomClient.prototype.listSessions;
5118
+ let extensionClient: InstanceType<typeof IntercomClient> | undefined;
5119
+ try {
5120
+ await withIntercomConfig({ confirmSend: true }, async () => {
5121
+ piIntercomExtension(harness.pi as never);
5122
+ await harness.emitLifecycle("session_start");
5123
+ IntercomClient.prototype.listSessions = function (options) {
5124
+ extensionClient = this;
5125
+ return originalList.call(this, options);
5126
+ };
5127
+ assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
5128
+ IntercomClient.prototype.listSessions = originalList;
5129
+ const sent = bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "Do not send after disconnect" });
5130
+ await confirming;
5131
+ assert.ok(confirmSignal && !confirmSignal.aborted);
5132
+ // Destroy the live transport without graceful unregister so the real disconnect handler runs.
5133
+ (extensionClient as unknown as { socket: { destroy(): void } }).socket.destroy();
5134
+ const response = await Promise.race([sent, new Promise<never>((_, reject) => setTimeout(() => reject(new Error("Disconnect did not settle confirmation promptly")), 1000).unref())]);
5135
+ assert.ok(!response.success);
5136
+ assert.match(response.error, /session ended/);
5137
+ assert.equal(signalAborted, true);
5138
+ assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
5139
+ assert.equal(harness.entries.filter(entry => entry.type === "intercom_sent").length, 0);
5140
+ });
5141
+ } finally {
5142
+ IntercomClient.prototype.listSessions = originalList;
5143
+ bridge.dispose();
5144
+ await harness.emitLifecycle("session_shutdown");
5145
+ await cleanup();
5146
+ }
5147
+ });
5148
+
5149
+ test("structured RPC ask survives a concurrent model ask target-resolution failure", { concurrency: false }, async () => {
5150
+ const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
5151
+ const { default: piIntercomExtension } = await import("./index.ts");
5152
+ const { planner, cleanup } = await setupClients();
5153
+ const harness = createExtensionHarness("rpc-model-waiter-owner", { mode: "rpc", hasUI: true });
5154
+ const bridge = new RpcIntercomBridge(harness.pi.events, () => {}, harness.ctx.sessionManager.getSessionId());
5155
+ const originalList = IntercomClient.prototype.listSessions;
5156
+ let releaseResolution!: () => void;
5157
+ let startedResolution!: () => void;
5158
+ const resolving = new Promise<void>(resolve => { startedResolution = resolve; });
5159
+ const resolutionGate = new Promise<void>(resolve => { releaseResolution = resolve; });
5160
+ try {
5161
+ piIntercomExtension(harness.pi as never);
5162
+ await harness.emitLifecycle("session_start");
5163
+ assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
5164
+ IntercomClient.prototype.listSessions = async function () {
5165
+ startedResolution();
5166
+ await resolutionGate;
5167
+ throw new Error("Injected model target-resolution failure");
5168
+ };
5169
+ const tool = harness.tools.find(tool => tool.name === "intercom")!;
5170
+ const modelAsk = tool.execute("model-resolution-race", { action: "ask", to: "planner", message: "Model question" }, new AbortController().signal, undefined, harness.ctx);
5171
+ await resolving;
5172
+ IntercomClient.prototype.listSessions = originalList;
5173
+ const rpcQuestion = new Promise<{ from: SessionInfo; message: Message }>(resolve => {
5174
+ const handler = (from: SessionInfo, message: Message) => {
5175
+ if (message.content.text !== "RPC question owns waiter") return;
5176
+ planner.off("message", handler);
5177
+ resolve({ from, message });
5178
+ };
5179
+ planner.on("message", handler);
5180
+ });
5181
+ const rpcAsk = bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "RPC question owns waiter", timeoutMs: 3000 });
5182
+ const question = await rpcQuestion;
5183
+ releaseResolution();
5184
+ const modelResult = await modelAsk;
5185
+ assert.equal(modelResult.details?.error, true);
5186
+ assert.match(modelResult.content[0].text, /target-resolution failure/);
5187
+ await planner.send(question.from.id, { text: "RPC waiter was preserved", replyTo: question.message.id });
5188
+ const rpcResult = await rpcAsk;
5189
+ assert.ok(rpcResult.success && "data" in rpcResult && "reply" in rpcResult.data);
5190
+ assert.equal(rpcResult.data.reply.content.text, "RPC waiter was preserved");
5191
+ assert.equal(rpcResult.data.reply.replyTo, rpcResult.data.messageId);
5192
+ } finally {
5193
+ releaseResolution?.();
5194
+ IntercomClient.prototype.listSessions = originalList;
5195
+ bridge.dispose();
5196
+ await harness.emitLifecycle("session_shutdown");
5197
+ await cleanup();
5198
+ }
5199
+ });