@selesai/code 0.13.40 → 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 (1356) 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/keybindings.d.ts +25 -24
  59. package/dist/core/keybindings.js +27 -6
  60. package/dist/core/mcp-servers.d.ts +134 -0
  61. package/dist/core/mcp-servers.js +223 -0
  62. package/dist/core/model-config.d.ts +122 -5
  63. package/dist/core/model-config.js +35 -1
  64. package/dist/core/model-registry.d.ts +23 -15
  65. package/dist/core/model-registry.js +46 -22
  66. package/dist/core/model-resolver.d.ts +6 -5
  67. package/dist/core/model-resolver.js +51 -21
  68. package/dist/core/model-runtime.d.ts +73 -14
  69. package/dist/core/model-runtime.js +398 -104
  70. package/dist/core/models-store.d.ts +12 -7
  71. package/dist/core/models-store.js +85 -15
  72. package/dist/core/nested-tool-calls.d.ts +102 -0
  73. package/dist/core/nested-tool-calls.js +178 -0
  74. package/dist/core/package-manager.d.ts +8 -1
  75. package/dist/core/package-manager.js +144 -61
  76. package/dist/core/package-manager.test.js +5 -5
  77. package/dist/core/pi-manifest.d.ts +9 -0
  78. package/dist/core/pi-manifest.js +25 -0
  79. package/dist/core/prompt-templates.d.ts +6 -1
  80. package/dist/core/prompt-templates.js +61 -35
  81. package/dist/core/provider-composer.d.ts +44 -19
  82. package/dist/core/provider-composer.js +166 -64
  83. package/dist/core/radius.d.ts +2 -0
  84. package/dist/core/radius.js +2 -0
  85. package/dist/core/remote-catalog-provider.d.ts +8 -1
  86. package/dist/core/remote-catalog-provider.js +25 -13
  87. package/dist/core/resource-loader.d.ts +9 -1
  88. package/dist/core/resource-loader.js +177 -45
  89. package/dist/core/runtime-credentials.d.ts +5 -5
  90. package/dist/core/runtime-credentials.js +11 -8
  91. package/dist/core/sdk.d.ts +16 -7
  92. package/dist/core/sdk.js +57 -24
  93. package/dist/core/session-manager.d.ts +45 -9
  94. package/dist/core/session-manager.js +124 -31
  95. package/dist/core/settings-diagnostics.d.ts +8 -0
  96. package/dist/core/settings-diagnostics.js +20 -0
  97. package/dist/core/settings-manager.d.ts +62 -32
  98. package/dist/core/settings-manager.js +147 -69
  99. package/dist/core/skills.d.ts +5 -2
  100. package/dist/core/skills.js +58 -35
  101. package/dist/core/slash-commands.js +2 -1
  102. package/dist/core/source-info.d.ts +8 -0
  103. package/dist/core/source-info.js +16 -0
  104. package/dist/core/system-prompt.d.ts +9 -3
  105. package/dist/core/system-prompt.js +9 -12
  106. package/dist/core/system-prompt.test.js +2 -7
  107. package/dist/core/tools/bash.d.ts +12 -0
  108. package/dist/core/tools/bash.js +33 -2
  109. package/dist/core/tools/edit-diff.d.ts +0 -5
  110. package/dist/core/tools/edit-diff.js +2 -5
  111. package/dist/core/tools/edit.d.ts +4 -0
  112. package/dist/core/tools/edit.js +31 -11
  113. package/dist/core/tools/find.d.ts +7 -0
  114. package/dist/core/tools/find.js +16 -19
  115. package/dist/core/tools/grep.d.ts +4 -0
  116. package/dist/core/tools/grep.js +5 -1
  117. package/dist/core/tools/index.d.ts +1 -1
  118. package/dist/core/tools/index.js +11 -2
  119. package/dist/core/tools/ls.d.ts +4 -0
  120. package/dist/core/tools/ls.js +5 -1
  121. package/dist/core/tools/output-accumulator.d.ts +11 -0
  122. package/dist/core/tools/output-accumulator.js +40 -10
  123. package/dist/core/tools/read.d.ts +17 -2
  124. package/dist/core/tools/read.js +23 -2
  125. package/dist/core/tools/render-utils.d.ts +6 -0
  126. package/dist/core/tools/render-utils.js +26 -0
  127. package/dist/core/tools/renderers/bash.js +19 -35
  128. package/dist/core/tools/renderers/edit.js +5 -4
  129. package/dist/core/tools/renderers/index.d.ts +2 -2
  130. package/dist/core/tools/renderers/read.js +3 -2
  131. package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
  132. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  133. package/dist/core/tools/truncate.d.ts +14 -0
  134. package/dist/core/tools/truncate.js +29 -0
  135. package/dist/core/tools/write.d.ts +4 -0
  136. package/dist/core/tools/write.js +6 -2
  137. package/dist/core/trust-manager.js +3 -1
  138. package/dist/core/usage-totals.d.ts +2 -0
  139. package/dist/core/usage-totals.js +23 -0
  140. package/dist/core/virtual-models.d.ts +116 -0
  141. package/dist/core/virtual-models.js +123 -0
  142. package/dist/defaults/models.json +32 -0
  143. package/dist/defaults/settings.json +1 -9
  144. package/dist/extensions/codemode/execute.d.ts +15 -0
  145. package/dist/extensions/codemode/execute.js +633 -0
  146. package/dist/extensions/codemode/execute.lazy.d.ts +2 -0
  147. package/dist/extensions/codemode/execute.lazy.js +2 -0
  148. package/dist/extensions/codemode/index.d.ts +20 -0
  149. package/dist/extensions/codemode/index.js +31 -0
  150. package/dist/extensions/codemode/renderer.d.ts +11 -0
  151. package/dist/extensions/codemode/renderer.js +136 -0
  152. package/dist/extensions/codemode/tool.d.ts +129 -0
  153. package/dist/extensions/codemode/tool.js +275 -0
  154. package/dist/extensions/context-compaction-reminder.ts +1 -1
  155. package/dist/extensions/grep-app/index.ts +2 -10
  156. package/dist/extensions/herdr-agent-state.ts +1 -1
  157. package/dist/extensions/{pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts → index.d.ts} +0 -1
  158. package/dist/extensions/index.js +12 -0
  159. package/dist/extensions/jev/classifier-context.ts +54 -0
  160. package/dist/extensions/jev/classifier.test.ts +85 -0
  161. package/dist/extensions/jev/classifier.ts +105 -0
  162. package/dist/extensions/jev/decisions.test.ts +35 -47
  163. package/dist/extensions/jev/decisions.ts +58 -104
  164. package/dist/extensions/jev/test-support.ts +33 -38
  165. package/dist/extensions/jev-advisory-lifecycle.test.ts +12 -12
  166. package/dist/extensions/jev-advisory-memory.test.ts +9 -9
  167. package/dist/extensions/jev-advisory-recommendations.test.ts +8 -8
  168. package/dist/extensions/jev-ask-tool.test.ts +41 -45
  169. package/dist/extensions/jev-ask-tool.ts +10 -38
  170. package/dist/extensions/jev-find-source.test.ts +26 -0
  171. package/dist/extensions/jev-find-source.ts +58 -19
  172. package/dist/{core → extensions}/llama/client.d.ts +2 -0
  173. package/dist/{core → extensions}/llama/client.js +7 -3
  174. package/dist/{core → extensions}/llama/index.js +13 -2
  175. package/dist/{core → extensions}/llama/provider.d.ts +1 -1
  176. package/dist/extensions/llama/provider.js +235 -0
  177. package/dist/extensions/mcp/cli.d.ts +20 -0
  178. package/dist/extensions/mcp/cli.js +496 -0
  179. package/dist/extensions/mcp/cli.lazy.d.ts +2 -0
  180. package/dist/extensions/mcp/cli.lazy.js +2 -0
  181. package/dist/extensions/mcp/config.d.ts +83 -0
  182. package/dist/extensions/mcp/config.js +193 -0
  183. package/dist/extensions/mcp/index.d.ts +78 -0
  184. package/dist/extensions/mcp/index.js +1201 -0
  185. package/dist/extensions/mcp/log.d.ts +15 -0
  186. package/dist/extensions/mcp/log.js +65 -0
  187. package/dist/extensions/mcp/oauth.d.ts +97 -0
  188. package/dist/extensions/mcp/oauth.js +401 -0
  189. package/dist/extensions/mcp/resources.d.ts +41 -0
  190. package/dist/extensions/mcp/resources.js +260 -0
  191. package/dist/extensions/mcp/runtime.d.ts +96 -0
  192. package/dist/extensions/mcp/runtime.js +412 -0
  193. package/dist/extensions/mcp/runtime.lazy.d.ts +2 -0
  194. package/dist/extensions/mcp/runtime.lazy.js +2 -0
  195. package/dist/extensions/mcp/tools.d.ts +86 -0
  196. package/dist/extensions/mcp/tools.js +252 -0
  197. package/dist/extensions/mcp/ui.d.ts +59 -0
  198. package/dist/extensions/mcp/ui.js +185 -0
  199. package/dist/extensions/package.json +1 -1
  200. package/dist/extensions/pi-graft/tools.ts +6 -0
  201. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +25 -0
  202. package/dist/extensions/pi-hermes-memory/README.md +140 -4
  203. package/dist/extensions/pi-hermes-memory/package-lock.json +624 -2720
  204. package/dist/extensions/pi-hermes-memory/package.json +9 -7
  205. package/dist/extensions/pi-hermes-memory/scripts/benchmark-memory-startup.mjs +72 -0
  206. package/dist/extensions/pi-hermes-memory/scripts/check-production-install.mjs +107 -0
  207. package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +2 -1
  208. package/dist/extensions/pi-hermes-memory/src/config.ts +35 -0
  209. package/dist/extensions/pi-hermes-memory/src/constants.ts +62 -15
  210. package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +374 -50
  211. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +7 -4
  212. package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +19 -14
  213. package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +75 -1
  214. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +322 -22
  215. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +8 -0
  216. package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +193 -54
  217. package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +6 -2
  218. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +33 -5
  219. package/dist/extensions/pi-hermes-memory/src/index.ts +116 -47
  220. package/dist/extensions/pi-hermes-memory/src/memory-initialization.ts +101 -0
  221. package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +10 -2
  222. package/dist/extensions/pi-hermes-memory/src/store/db.ts +34 -9
  223. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +44 -8
  224. package/dist/extensions/pi-hermes-memory/src/store/schema.ts +3 -1
  225. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +141 -0
  226. package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +17 -6
  227. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +20 -10
  228. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +1 -17
  229. package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +2 -10
  230. package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +4 -8
  231. package/dist/extensions/pi-hermes-memory/src/types.ts +48 -0
  232. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +108 -0
  233. package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +1185 -42
  234. package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +57 -1
  235. package/dist/extensions/pi-hermes-memory/tests/handlers/lazy-memory-hooks.test.ts +128 -0
  236. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +844 -1
  237. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +16 -0
  238. package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +512 -3
  239. package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +38 -0
  240. package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +183 -2
  241. package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +1 -3
  242. package/dist/extensions/pi-hermes-memory/tests/index.test.ts +17 -0
  243. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +21 -0
  244. package/dist/extensions/pi-hermes-memory/tests/lazy-startup.test.ts +313 -0
  245. package/dist/extensions/pi-hermes-memory/tests/memory-initialization.test.ts +182 -0
  246. package/dist/extensions/pi-hermes-memory/tests/prompt-injection.test.ts +184 -0
  247. package/dist/extensions/pi-hermes-memory/tests/skill-discovery-contract.test.ts +60 -0
  248. package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-lazy-probe.test.ts +80 -0
  249. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +2 -0
  250. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +79 -0
  251. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +268 -0
  252. package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +29 -0
  253. package/dist/extensions/pi-hermes-memory/tests/store/usage-tracking.test.ts +170 -0
  254. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +80 -1
  255. package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +51 -0
  256. package/dist/extensions/pi-intercom/CHANGELOG.md +66 -0
  257. package/dist/extensions/pi-intercom/README.md +100 -12
  258. package/dist/extensions/pi-intercom/broker/broker.ts +28 -12
  259. package/dist/extensions/pi-intercom/broker/client.ts +3 -0
  260. package/dist/extensions/pi-intercom/broker/cross-machine-provenance.test.ts +63 -0
  261. package/dist/extensions/pi-intercom/broker/protocol.ts +64 -0
  262. package/dist/extensions/pi-intercom/broker/spawn.test.ts +58 -167
  263. package/dist/extensions/pi-intercom/broker/spawn.ts +40 -87
  264. package/dist/extensions/pi-intercom/cli.mjs +6 -0
  265. package/dist/extensions/pi-intercom/cli.test.ts +428 -0
  266. package/dist/extensions/pi-intercom/cli.ts +343 -0
  267. package/dist/extensions/pi-intercom/config.test.ts +61 -1
  268. package/dist/extensions/pi-intercom/config.ts +53 -2
  269. package/dist/extensions/pi-intercom/cross-machine-discovery.test.ts +218 -0
  270. package/dist/extensions/pi-intercom/cross-machine-discovery.ts +140 -0
  271. package/dist/extensions/pi-intercom/cross-machine-envelope.test.ts +106 -0
  272. package/dist/extensions/pi-intercom/cross-machine-envelope.ts +92 -0
  273. package/dist/extensions/pi-intercom/cross-machine-integration.test.ts +25 -0
  274. package/dist/extensions/pi-intercom/cross-machine-transport.test.ts +106 -0
  275. package/dist/extensions/pi-intercom/cross-machine-transport.ts +110 -0
  276. package/dist/extensions/pi-intercom/extension-api.ts +14 -0
  277. package/dist/extensions/pi-intercom/handover.test.ts +88 -0
  278. package/dist/extensions/pi-intercom/handover.ts +115 -0
  279. package/dist/extensions/pi-intercom/herdr-location.test.ts +173 -0
  280. package/dist/extensions/pi-intercom/herdr-location.ts +137 -0
  281. package/dist/extensions/pi-intercom/human-priority.pi.test.ts +489 -0
  282. package/dist/extensions/pi-intercom/index.ts +582 -164
  283. package/dist/extensions/pi-intercom/intercom.integration.test.ts +590 -22
  284. package/dist/extensions/pi-intercom/package.json +12 -2
  285. package/dist/extensions/pi-intercom/project-agent.ts +1 -1
  286. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +26 -2
  287. package/dist/extensions/pi-intercom/test/handover-picker.test.ts +134 -0
  288. package/dist/extensions/pi-intercom/test/inline-message.test.ts +43 -0
  289. package/dist/extensions/pi-intercom/types.d.ts +247 -0
  290. package/dist/extensions/pi-intercom/types.js +2 -0
  291. package/dist/extensions/pi-intercom/types.ts +39 -1
  292. package/dist/extensions/pi-intercom/ui/handover-picker.ts +318 -0
  293. package/dist/extensions/pi-intercom/ui/inline-message.ts +10 -3
  294. package/dist/extensions/pi-intercom/ui/session-list.ts +28 -15
  295. package/dist/extensions/pi-subagents/.github/workflows/release.yml +5 -1
  296. package/dist/extensions/pi-subagents/.github/workflows/test.yml +188 -18
  297. package/dist/extensions/pi-subagents/CHANGELOG.md +514 -1
  298. package/dist/extensions/pi-subagents/README.md +7 -5
  299. package/dist/extensions/pi-subagents/VISION.md +6 -0
  300. package/dist/extensions/pi-subagents/agents/reviewer.md +7 -5
  301. package/dist/extensions/pi-subagents/agents/worker.md +1 -1
  302. package/dist/extensions/pi-subagents/docs/agents.md +75 -35
  303. package/dist/extensions/pi-subagents/docs/configuration.md +156 -25
  304. package/dist/extensions/pi-subagents/docs/extension-api.md +113 -29
  305. package/dist/extensions/pi-subagents/docs/missions.md +46 -14
  306. package/dist/extensions/pi-subagents/docs/models.md +22 -84
  307. package/dist/extensions/pi-subagents/docs/observability.md +49 -24
  308. package/dist/extensions/pi-subagents/docs/standalone-background.md +59 -0
  309. package/dist/extensions/pi-subagents/docs/tool-reference.md +167 -116
  310. package/dist/extensions/pi-subagents/docs/watchdog.md +41 -10
  311. package/dist/extensions/pi-subagents/docs/workflows.md +239 -163
  312. package/dist/extensions/pi-subagents/examples/typed-gate/.pi/agents/classifier.md +14 -0
  313. package/dist/extensions/pi-subagents/examples/typed-gate/README.md +42 -0
  314. package/dist/extensions/pi-subagents/examples/typed-gate/classify +38 -0
  315. package/dist/extensions/pi-subagents/examples/typed-gate/workflow.js +32 -0
  316. package/dist/extensions/pi-subagents/index.ts +11 -3
  317. package/dist/extensions/pi-subagents/inspector-runner.mjs +3 -3
  318. package/dist/extensions/pi-subagents/package-lock.json +517 -1129
  319. package/dist/extensions/pi-subagents/package.json +22 -11
  320. package/dist/extensions/pi-subagents/prompts/council.md +7 -4
  321. package/dist/extensions/pi-subagents/prompts/parallel-review.md +2 -2
  322. package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
  323. package/dist/extensions/pi-subagents/runner-peer-loader.mjs +21 -0
  324. package/dist/extensions/pi-subagents/runner-peer-preload.mjs +30 -0
  325. package/dist/extensions/pi-subagents/scripts/build-package.mjs +79 -0
  326. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +2 -2
  327. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +46 -27
  328. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +11 -7
  329. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +78 -73
  330. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +4 -5
  331. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +10 -2
  332. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +69 -67
  333. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +3 -3
  334. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +21 -10
  335. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +113 -113
  336. package/dist/extensions/pi-subagents/src/agents/agent-memory.ts +91 -4
  337. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +15 -9
  338. package/dist/extensions/pi-subagents/src/agents/agents.ts +432 -193
  339. package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +6 -1
  340. package/dist/extensions/pi-subagents/src/agents/global-npm-root.ts +58 -0
  341. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +5 -2
  342. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +22 -18
  343. package/dist/extensions/pi-subagents/src/agents/skills.ts +43 -10
  344. package/dist/extensions/pi-subagents/src/api/delegation.ts +20 -1
  345. package/dist/extensions/pi-subagents/src/api/inspectors.ts +27 -0
  346. package/dist/extensions/pi-subagents/src/api/preflight.ts +140 -62
  347. package/dist/extensions/pi-subagents/src/api/required-child-extensions.ts +6 -0
  348. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  349. package/dist/extensions/pi-subagents/src/extension/config.ts +24 -40
  350. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +4 -1
  351. package/dist/extensions/pi-subagents/src/extension/doctor.ts +18 -15
  352. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +87 -13
  353. package/dist/extensions/pi-subagents/src/extension/herdr-pi-bridge.ts +162 -0
  354. package/dist/extensions/pi-subagents/src/extension/index.ts +280 -268
  355. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +76 -37
  356. package/dist/extensions/pi-subagents/src/extension/reply-workflow-script.ts +67 -0
  357. package/dist/extensions/pi-subagents/src/extension/rpc.ts +34 -11
  358. package/dist/extensions/pi-subagents/src/extension/schemas.ts +116 -205
  359. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +13 -5
  360. package/dist/extensions/pi-subagents/src/extension/tool-activation.ts +146 -0
  361. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +77 -90
  362. package/dist/extensions/pi-subagents/src/extension/upgrade-notice.ts +40 -0
  363. package/dist/extensions/pi-subagents/src/inspectors/actions.ts +148 -0
  364. package/dist/extensions/pi-subagents/src/inspectors/ghostty/actions.ts +74 -0
  365. package/dist/extensions/pi-subagents/src/inspectors/ghostty/plugin.ts +29 -0
  366. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +100 -180
  367. package/dist/extensions/pi-subagents/src/inspectors/herdr/plugin.ts +20 -0
  368. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +2 -2
  369. package/dist/extensions/pi-subagents/src/inspectors/{herdr/inspector-runner.ts → inspector-runner.ts} +13 -13
  370. package/dist/extensions/pi-subagents/src/inspectors/plugins.ts +75 -0
  371. package/dist/extensions/pi-subagents/src/inspectors/{herdr/session-roots-codec.ts → session-roots-codec.ts} +4 -15
  372. package/dist/extensions/pi-subagents/src/inspectors/{herdr/shell-command.ts → shell-command.ts} +1 -1
  373. package/dist/extensions/pi-subagents/src/inspectors/types.ts +51 -0
  374. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +38 -53
  375. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +53 -9
  376. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +69 -55
  377. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +7 -2
  378. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +45 -32
  379. package/dist/extensions/pi-subagents/src/missions/store.ts +11 -2
  380. package/dist/extensions/pi-subagents/src/policy/authority.ts +5 -1
  381. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +30 -18
  382. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +59 -9
  383. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +18 -2
  384. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +463 -248
  385. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +106 -66
  386. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +33 -20
  387. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +47 -17
  388. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -5
  389. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +24 -11
  390. package/dist/extensions/pi-subagents/src/runs/background/await-async-run.ts +78 -0
  391. package/dist/extensions/pi-subagents/src/runs/background/binary-bootstrap.ts +66 -0
  392. package/dist/extensions/pi-subagents/src/runs/background/calendar-schedule.ts +90 -0
  393. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -2
  394. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +19 -38
  395. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +62 -3
  396. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +82 -10
  397. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +259 -21
  398. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +30 -3
  399. package/dist/extensions/pi-subagents/src/runs/background/pid-namespace.ts +18 -0
  400. package/dist/extensions/pi-subagents/src/runs/background/process-terminal-candidate.ts +98 -0
  401. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +18 -97
  402. package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +14 -5
  403. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +66 -12
  404. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +4 -3
  405. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +126 -45
  406. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +11 -6
  407. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +18 -7
  408. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +43 -51
  409. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +8 -1
  410. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +5 -4
  411. package/dist/extensions/pi-subagents/src/runs/background/runner-http-dispatcher.ts +119 -0
  412. package/dist/extensions/pi-subagents/src/runs/background/runner-startup-failure.ts +56 -0
  413. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +233 -69
  414. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +67 -16
  415. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +21 -3
  416. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner-bootstrap.ts +276 -0
  417. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +592 -573
  418. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +177 -29
  419. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +77 -28
  420. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +10 -4
  421. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +7 -13
  422. package/dist/extensions/pi-subagents/src/runs/background/workflow-terminal-proof.ts +41 -23
  423. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +19 -8
  424. package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +130 -7
  425. package/dist/extensions/pi-subagents/src/runs/foreground/command-action.ts +41 -0
  426. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +267 -385
  427. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +4 -2
  428. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +6 -10
  429. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1158 -413
  430. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +3 -1
  431. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +2 -1
  432. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +200 -74
  433. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +133 -34
  434. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +6 -1
  435. package/dist/extensions/pi-subagents/src/runs/shared/child-commands.ts +228 -0
  436. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +18 -18
  437. package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +16 -4
  438. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +55 -12
  439. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +6 -3
  440. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +11 -1
  441. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +367 -74
  442. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +50 -86
  443. package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +288 -0
  444. package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
  445. package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
  446. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +5 -5
  447. package/dist/extensions/pi-subagents/src/runs/shared/effective-system-prompt.ts +33 -0
  448. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +49 -10
  449. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +61 -9
  450. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +16 -9
  451. package/dist/extensions/pi-subagents/src/runs/shared/external-job-bridge.ts +55 -1
  452. package/dist/extensions/pi-subagents/src/runs/shared/git-environment.ts +1 -1
  453. package/dist/extensions/pi-subagents/src/runs/shared/herdr-connection.ts +134 -0
  454. package/dist/extensions/pi-subagents/src/runs/shared/herdr-external-adapters.ts +169 -0
  455. package/dist/extensions/pi-subagents/src/runs/shared/herdr-machine.ts +279 -0
  456. package/dist/extensions/pi-subagents/src/runs/shared/herdr-pi-protocol.ts +59 -0
  457. package/dist/extensions/pi-subagents/src/runs/shared/herdr-placed-run.ts +263 -0
  458. package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +6 -2
  459. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +108 -13
  460. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +23 -7
  461. package/dist/extensions/pi-subagents/src/runs/shared/model-resolution-diagnostic.ts +76 -0
  462. package/dist/extensions/pi-subagents/src/runs/shared/{model-fallback.ts → model-resolution.ts} +65 -245
  463. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +30 -11
  464. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +24 -3
  465. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +5 -4
  466. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +55 -7
  467. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +14 -4
  468. package/dist/extensions/pi-subagents/src/runs/shared/partial-output.ts +48 -0
  469. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +12 -4
  470. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +88 -1
  471. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +12 -3
  472. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +160 -9
  473. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +35 -34
  474. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +58 -19
  475. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +2 -2
  476. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +21 -0
  477. package/dist/extensions/pi-subagents/src/runs/shared/usage-reconciliation.ts +73 -0
  478. package/dist/extensions/pi-subagents/src/runs/shared/workflow-async-child-guidance.ts +18 -0
  479. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-apply.ts +160 -0
  480. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +42 -20
  481. package/dist/extensions/pi-subagents/src/runs/shared/worktree-lock.ts +29 -0
  482. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +27 -4
  483. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +94 -26
  484. package/dist/extensions/pi-subagents/src/shared/child-cache-retention.ts +43 -0
  485. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +5 -3
  486. package/dist/extensions/pi-subagents/src/shared/disabled-features.ts +123 -0
  487. package/dist/extensions/pi-subagents/src/shared/extension-context.ts +14 -1
  488. package/dist/extensions/pi-subagents/src/shared/file-lease.ts +74 -0
  489. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +27 -77
  490. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +70 -10
  491. package/dist/extensions/pi-subagents/src/shared/model-info.ts +10 -1
  492. package/dist/extensions/pi-subagents/src/shared/opencode-session-headers.ts +30 -0
  493. package/dist/extensions/pi-subagents/src/shared/package-version.ts +17 -0
  494. package/dist/extensions/pi-subagents/src/shared/parent-wake.ts +66 -0
  495. package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +71 -58
  496. package/dist/extensions/pi-subagents/src/shared/required-child-extensions.ts +115 -0
  497. package/dist/extensions/pi-subagents/src/shared/settings-file-lease.ts +36 -0
  498. package/dist/extensions/pi-subagents/src/shared/settings.ts +7 -4
  499. package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +1 -5
  500. package/dist/extensions/pi-subagents/src/shared/types.ts +146 -48
  501. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +28 -2
  502. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +15 -1
  503. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +19 -4
  504. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +13 -2
  505. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +15 -15
  506. package/dist/extensions/pi-subagents/src/slash/subagent-cost.ts +46 -9
  507. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +29 -16
  508. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +201 -26
  509. package/dist/extensions/pi-subagents/src/tui/fleet.ts +33 -16
  510. package/dist/extensions/pi-subagents/src/tui/render.ts +334 -103
  511. package/dist/extensions/pi-subagents/src/tui/running-tone.ts +28 -0
  512. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +27 -28
  513. package/dist/extensions/pi-subagents/src/watchdog/diff-tool.ts +47 -12
  514. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +2 -2
  515. package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +22 -2
  516. package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +17 -17
  517. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +24 -8
  518. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +43 -39
  519. package/dist/extensions/pi-subagents/src/watchdog/render.ts +2 -2
  520. package/dist/extensions/pi-subagents/src/watchdog/review.ts +127 -78
  521. package/dist/extensions/pi-subagents/src/watchdog/rules.ts +1 -1
  522. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +107 -31
  523. package/dist/extensions/pi-subagents/src/watchdog/scope.ts +1 -1
  524. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +22 -14
  525. package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +14 -13
  526. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +35 -6
  527. package/dist/extensions/pi-subagents/src/watchdog/types.ts +6 -4
  528. package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +2 -2
  529. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  530. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +500 -65
  531. package/dist/extensions/pi-subagents/src/workflows/structured-workflow-scripts.ts +177 -0
  532. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +8 -2
  533. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +5 -3
  534. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +70 -10
  535. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +57 -18
  536. package/dist/extensions/pi-subagents/src/workflows/workflow-reuse.ts +120 -0
  537. package/dist/extensions/pi-subagents/src/workflows/workflow-revival.ts +123 -0
  538. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +5 -2
  539. package/dist/extensions/pi-subagents/test/fixtures/cwd-workflow-child.ts +37 -0
  540. package/dist/extensions/pi-subagents/test/fixtures/herdr-allocation-lock-child.ts +16 -0
  541. package/dist/extensions/pi-subagents/test/fixtures/herdr-provision-child.ts +15 -0
  542. package/dist/extensions/pi-subagents/test/fixtures/native-nested-wait-provider.ts +76 -0
  543. package/dist/extensions/pi-subagents/test/fixtures/runner-bootstrap-harness.ts +36 -0
  544. package/dist/extensions/pi-subagents/test/fixtures/schedule-history-writer.mjs +48 -0
  545. package/dist/extensions/pi-subagents/test/fixtures/settings-race-writer.mjs +57 -0
  546. package/dist/extensions/pi-subagents/test/fixtures/workflow-cwd-access-failure.ts +33 -0
  547. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +40 -7
  548. package/dist/extensions/pi-subagents/test/integration/async-attention-clearing.test.ts +9 -8
  549. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +435 -276
  550. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +435 -397
  551. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +918 -497
  552. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +264 -17
  553. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +185 -22
  554. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +3 -2
  555. package/dist/extensions/pi-subagents/test/integration/claude-code-dispatch.test.ts +127 -0
  556. package/dist/extensions/pi-subagents/test/integration/deadline-checkpoint.test.ts +126 -0
  557. package/dist/extensions/pi-subagents/test/integration/doctor-executor.test.ts +29 -1
  558. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +88 -0
  559. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +450 -13
  560. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +10 -6
  561. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +105 -86
  562. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +403 -18
  563. package/dist/extensions/pi-subagents/test/integration/inline-workflow-visibility.test.ts +351 -0
  564. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +195 -10
  565. package/dist/extensions/pi-subagents/test/integration/model-resolution-diagnostic.test.ts +108 -0
  566. package/dist/extensions/pi-subagents/test/integration/nested-async-wait.test.ts +61 -0
  567. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +5 -4
  568. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +1 -1
  569. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +6 -4
  570. package/dist/extensions/pi-subagents/test/integration/render-widget-mouse.test.ts +84 -0
  571. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +242 -16
  572. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +2 -2
  573. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +158 -4
  574. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +1435 -248
  575. package/dist/extensions/pi-subagents/test/integration/single-execution.part-2.test.ts +454 -515
  576. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +140 -21
  577. package/dist/extensions/pi-subagents/test/integration/structured-workflows.test.ts +105 -0
  578. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +90 -11
  579. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +18 -15
  580. package/dist/extensions/pi-subagents/test/integration/workflow-worktree-admission.test.ts +100 -0
  581. package/dist/extensions/pi-subagents/test/smoke/clean-install.mjs +106 -0
  582. package/dist/extensions/pi-subagents/test/smoke/npm-background.mjs +43 -0
  583. package/dist/extensions/pi-subagents/test/smoke/packed-runner-selection.mjs +42 -0
  584. package/dist/extensions/pi-subagents/test/smoke/runner-loader-capability.mjs +50 -0
  585. package/dist/extensions/pi-subagents/test/smoke/sdk-child.ts +57 -0
  586. package/dist/extensions/pi-subagents/test/smoke/{pi085-extension.ts → sdk-extension.ts} +2 -2
  587. package/dist/extensions/pi-subagents/test/smoke/standalone-background.mjs +140 -0
  588. package/dist/extensions/pi-subagents/test/smoke/standalone-fault.ts +43 -0
  589. package/dist/extensions/pi-subagents/test/smoke/standalone-matrix.mjs +65 -0
  590. package/dist/extensions/pi-subagents/test/smoke/standalone-observer.ts +8 -0
  591. package/dist/extensions/pi-subagents/test/smoke/standalone-parent.ts +220 -0
  592. package/dist/extensions/pi-subagents/test/smoke/standalone-provider.ts +58 -0
  593. package/dist/extensions/pi-subagents/test/smoke/standalone-release.json +8 -0
  594. package/dist/extensions/pi-subagents/test/smoke/standalone-revival.ts +109 -0
  595. package/dist/extensions/pi-subagents/test/smoke/standalone-shared.ts +79 -0
  596. package/dist/extensions/pi-subagents/test/smoke/tool-activation.test.ts +128 -0
  597. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +6 -25
  598. package/dist/extensions/pi-subagents/test/support/async-result-timeout-evidence.ts +61 -0
  599. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +122 -9
  600. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +15 -7
  601. package/dist/extensions/pi-subagents/test/support/helpers.ts +11 -14
  602. package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +21 -3
  603. package/dist/extensions/pi-subagents/test/support/native-peer-loader.mjs +15 -0
  604. package/dist/extensions/pi-subagents/test/support/node-command.ts +29 -6
  605. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +5 -3
  606. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +7 -15
  607. package/dist/extensions/pi-subagents/test/support/watchdog-stable-host-loader.mjs +23 -0
  608. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +3 -3
  609. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +158 -155
  610. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +52 -1
  611. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +21 -17
  612. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +105 -36
  613. package/dist/extensions/pi-subagents/test/unit/advertisement-barrier.test.ts +151 -0
  614. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -2
  615. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +33 -3
  616. package/dist/extensions/pi-subagents/test/unit/agent-end-auto-drain.test.ts +149 -0
  617. package/dist/extensions/pi-subagents/test/unit/agent-exclude-dirs.test.ts +246 -0
  618. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +62 -87
  619. package/dist/extensions/pi-subagents/test/unit/agent-global-root-override.test.ts +86 -0
  620. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +398 -48
  621. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +126 -1
  622. package/dist/extensions/pi-subagents/test/unit/agent-name-resolution.test.ts +75 -0
  623. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +94 -42
  624. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +73 -3
  625. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +428 -2
  626. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +4 -4
  627. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +112 -1
  628. package/dist/extensions/pi-subagents/test/unit/async-result-timeout-evidence.test.ts +53 -0
  629. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +92 -4
  630. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +58 -6
  631. package/dist/extensions/pi-subagents/test/unit/async-run-history.test.ts +123 -0
  632. package/dist/extensions/pi-subagents/test/unit/async-spawn-package-dir.test.ts +203 -0
  633. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +26 -35
  634. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +185 -0
  635. package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +9 -1
  636. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +106 -1
  637. package/dist/extensions/pi-subagents/test/unit/await-async-run.test.ts +202 -0
  638. package/dist/extensions/pi-subagents/test/unit/binary-async-spawn.test.ts +115 -0
  639. package/dist/extensions/pi-subagents/test/unit/binary-pi-spawn.test.ts +27 -0
  640. package/dist/extensions/pi-subagents/test/unit/calendar-schedule.test.ts +70 -0
  641. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +38 -0
  642. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +10 -2
  643. package/dist/extensions/pi-subagents/test/unit/changelog-format.test.ts +11 -0
  644. package/dist/extensions/pi-subagents/test/unit/child-cache-retention.test.ts +87 -0
  645. package/dist/extensions/pi-subagents/test/unit/child-commands.test.ts +243 -0
  646. package/dist/extensions/pi-subagents/test/unit/child-external-job-bridge.test.ts +126 -0
  647. package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +12 -1
  648. package/dist/extensions/pi-subagents/test/unit/child-lifecycle.test.ts +36 -0
  649. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +24 -0
  650. package/dist/extensions/pi-subagents/test/unit/child-session-commands.test.ts +162 -0
  651. package/dist/extensions/pi-subagents/test/unit/child-session-host-sdk.test.ts +226 -0
  652. package/dist/extensions/pi-subagents/test/unit/child-session-parent-providers.test.ts +200 -0
  653. package/dist/extensions/pi-subagents/test/unit/child-session-queued.test.ts +260 -0
  654. package/dist/extensions/pi-subagents/test/unit/child-tool-plan-permission-system.test.ts +3 -98
  655. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +222 -1
  656. package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +314 -0
  657. package/dist/extensions/pi-subagents/test/unit/claude-code-dispatch.test.ts +182 -0
  658. package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +157 -0
  659. package/dist/extensions/pi-subagents/test/unit/command-action.test.ts +50 -0
  660. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +25 -11
  661. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +3 -1
  662. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +18 -0
  663. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +7 -1
  664. package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +220 -0
  665. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +104 -32
  666. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +138 -1
  667. package/dist/extensions/pi-subagents/test/unit/disabled-features.test.ts +227 -0
  668. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +48 -9
  669. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +7 -4
  670. package/dist/extensions/pi-subagents/test/unit/extension-lazy-loading.test.ts +21 -0
  671. package/dist/extensions/pi-subagents/test/unit/extension-maintenance-lifecycle.test.ts +66 -0
  672. package/dist/extensions/pi-subagents/test/unit/extension-module-preload.test.ts +49 -0
  673. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +104 -3
  674. package/dist/extensions/pi-subagents/test/unit/file-lease.test.ts +17 -0
  675. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +316 -0
  676. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +58 -7
  677. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +25 -96
  678. package/dist/extensions/pi-subagents/test/unit/ghostty-inspector.test.ts +92 -0
  679. package/dist/extensions/pi-subagents/test/unit/global-npm-root.test.ts +108 -0
  680. package/dist/extensions/pi-subagents/test/unit/herdr-connection.test.ts +43 -0
  681. package/dist/extensions/pi-subagents/test/unit/herdr-external-adapters.test.ts +89 -0
  682. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +11 -20
  683. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +113 -19
  684. package/dist/extensions/pi-subagents/test/unit/herdr-machine.test.ts +161 -0
  685. package/dist/extensions/pi-subagents/test/unit/herdr-native-placement.test.ts +187 -0
  686. package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +7 -12
  687. package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
  688. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +182 -87
  689. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +68 -49
  690. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +295 -135
  691. package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +3 -3
  692. package/dist/extensions/pi-subagents/test/unit/inspector-authority-policy.test.ts +144 -0
  693. package/dist/extensions/pi-subagents/test/unit/inspector-registration.test.ts +128 -0
  694. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +49 -1
  695. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +74 -1
  696. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-resolution.test.ts +112 -0
  697. package/dist/extensions/pi-subagents/test/unit/mission-global-projection.test.ts +215 -0
  698. package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +65 -1
  699. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +2 -1
  700. package/dist/extensions/pi-subagents/test/unit/model-resolution-diagnostic.test.ts +78 -0
  701. package/dist/extensions/pi-subagents/test/unit/model-resolution.test.ts +153 -0
  702. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +43 -1
  703. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +1 -21
  704. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +279 -2
  705. package/dist/extensions/pi-subagents/test/unit/nested-control-fanout.test.ts +73 -0
  706. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +297 -3
  707. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +1 -1
  708. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +431 -23
  709. package/dist/extensions/pi-subagents/test/unit/opencode-session-headers.test.ts +32 -0
  710. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +89 -21
  711. package/dist/extensions/pi-subagents/test/unit/owned-process-tree.test.ts +31 -1
  712. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +18 -24
  713. package/dist/extensions/pi-subagents/test/unit/parent-wake.test.ts +206 -0
  714. package/dist/extensions/pi-subagents/test/unit/partial-output.test.ts +53 -0
  715. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +216 -32
  716. package/dist/extensions/pi-subagents/test/unit/pi-spawn-host-root.test.ts +82 -0
  717. package/dist/extensions/pi-subagents/test/unit/pi-subagents-policy-guidance.test.ts +28 -0
  718. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +193 -104
  719. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +16 -1
  720. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +17 -1
  721. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +89 -9
  722. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +6 -0
  723. package/dist/extensions/pi-subagents/test/unit/prompt-audit-provider-routing.test.ts +69 -0
  724. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +2 -2
  725. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +23 -1
  726. package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +117 -3
  727. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +35 -14
  728. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +3 -2
  729. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +261 -9
  730. package/dist/extensions/pi-subagents/test/unit/reply-workflow-script.test.ts +37 -0
  731. package/dist/extensions/pi-subagents/test/unit/required-child-extensions.test.ts +114 -0
  732. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +11 -1
  733. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +22 -2
  734. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +125 -18
  735. package/dist/extensions/pi-subagents/test/unit/run-child-session.test.ts +230 -0
  736. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +50 -1
  737. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +301 -4
  738. package/dist/extensions/pi-subagents/test/unit/runner-bootstrap.test.ts +182 -0
  739. package/dist/extensions/pi-subagents/test/unit/runner-http-dispatcher.test.ts +136 -0
  740. package/dist/extensions/pi-subagents/test/unit/runner-peer-loader.test.ts +68 -0
  741. package/dist/extensions/pi-subagents/test/unit/runner-peer-symlinks.test.ts +50 -0
  742. package/dist/extensions/pi-subagents/test/unit/running-tone.test.ts +13 -0
  743. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +155 -4
  744. package/dist/extensions/pi-subagents/test/unit/schedule-claim-initialization.test.ts +71 -0
  745. package/dist/extensions/pi-subagents/test/unit/schedule-claim-preservation.test.ts +98 -0
  746. package/dist/extensions/pi-subagents/test/unit/schedule-history-transactions.test.ts +201 -0
  747. package/dist/extensions/pi-subagents/test/unit/scheduled-mission.test.ts +317 -0
  748. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +412 -11
  749. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +2 -8
  750. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +70 -71
  751. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +748 -5
  752. package/dist/extensions/pi-subagents/test/unit/session-liveness-delivery.test.ts +337 -0
  753. package/dist/extensions/pi-subagents/test/unit/settings-atomic-save.test.ts +419 -0
  754. package/dist/extensions/pi-subagents/test/unit/settings-transactions.test.ts +88 -0
  755. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -1
  756. package/dist/extensions/pi-subagents/test/unit/skills-disable-model-invocation.test.ts +164 -0
  757. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +35 -2
  758. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +2 -2
  759. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +334 -9
  760. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +170 -0
  761. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +34 -5
  762. package/dist/extensions/pi-subagents/test/unit/structured-output-validation.test.ts +199 -0
  763. package/dist/extensions/pi-subagents/test/unit/structured-workflow-resources.test.ts +241 -0
  764. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +47 -38
  765. package/dist/extensions/pi-subagents/test/unit/subagent-cost.test.ts +97 -0
  766. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +10 -0
  767. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +343 -44
  768. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +410 -11
  769. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +459 -22
  770. package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +43 -3
  771. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +11 -1
  772. package/dist/extensions/pi-subagents/test/unit/tool-activation-stale-peer.test.ts +32 -0
  773. package/dist/extensions/pi-subagents/test/unit/tool-activation.test.ts +313 -0
  774. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +14 -0
  775. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -89
  776. package/dist/extensions/pi-subagents/test/unit/typed-gate-output.test.ts +141 -0
  777. package/dist/extensions/pi-subagents/test/unit/upgrade-notice.test.ts +31 -0
  778. package/dist/extensions/pi-subagents/test/unit/usage-reconciliation-owners.test.ts +66 -0
  779. package/dist/extensions/pi-subagents/test/unit/usage-reconciliation.test.ts +23 -0
  780. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +195 -1
  781. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +3 -1
  782. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +48 -45
  783. package/dist/extensions/pi-subagents/test/unit/watchdog-compaction-scope.test.ts +94 -0
  784. package/dist/extensions/pi-subagents/test/unit/watchdog-diff-tool.test.ts +48 -3
  785. package/dist/extensions/pi-subagents/test/unit/watchdog-native-scheduling.test.ts +107 -0
  786. package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +95 -7
  787. package/dist/extensions/pi-subagents/test/unit/watchdog-register-child.test.ts +79 -0
  788. package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +7 -4
  789. package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +111 -24
  790. package/dist/extensions/pi-subagents/test/unit/watchdog-rules.test.ts +1 -1
  791. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +283 -2
  792. package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +3 -0
  793. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +12 -1
  794. package/dist/extensions/pi-subagents/test/unit/watchdog-stable-host-layout.test.ts +23 -0
  795. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +30 -0
  796. package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +39 -2
  797. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +18 -1
  798. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +8 -4
  799. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +10 -0
  800. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +6 -3
  801. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +44 -1
  802. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +28 -1
  803. package/dist/extensions/pi-subagents/test/unit/workflow-revival.test.ts +85 -0
  804. package/dist/extensions/pi-subagents/test/unit/workflow-scripts-feature.test.ts +177 -0
  805. package/dist/extensions/pi-subagents/test/unit/workflow-terminal-proof.test.ts +8 -0
  806. package/dist/extensions/pi-subagents/test/unit/workflow-worktree-admission.test.ts +29 -0
  807. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +343 -4
  808. package/dist/extensions/pi-subagents/test/unit/worktree-lock.test.ts +123 -0
  809. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +252 -22
  810. package/dist/extensions/pi-subagents/tsconfig.build.json +13 -0
  811. package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +1 -1
  812. package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +1 -1
  813. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +24 -1
  814. package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +6 -2
  815. package/dist/extensions/pi-web-agent/src/extension.ts +1 -5
  816. package/dist/extensions/pi-zentui/.github/workflows/ci.yml +67 -4
  817. package/dist/extensions/pi-zentui/AGENTS.md +3 -2
  818. package/dist/extensions/pi-zentui/README.md +60 -32
  819. package/dist/extensions/pi-zentui/docs/configuration.md +662 -51
  820. package/dist/extensions/pi-zentui/docs/footer-format.md +174 -5
  821. package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-editor.ts +15 -4
  822. package/dist/extensions/pi-zentui/extensions/zentui/average-token-rate.ts +146 -0
  823. package/dist/extensions/pi-zentui/extensions/zentui/codex-quota-display.ts +34 -0
  824. package/dist/extensions/pi-zentui/extensions/zentui/codex-quota.ts +298 -0
  825. package/dist/extensions/pi-zentui/extensions/zentui/component-colors.ts +172 -0
  826. package/dist/extensions/pi-zentui/extensions/zentui/component-settings.ts +243 -0
  827. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +851 -114
  828. package/dist/extensions/pi-zentui/extensions/zentui/custom-value-colors.ts +93 -0
  829. package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-demand.ts +61 -0
  830. package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-format.ts +80 -0
  831. package/dist/extensions/pi-zentui/extensions/zentui/custom-variables.ts +152 -0
  832. package/dist/extensions/pi-zentui/extensions/zentui/editor-metadata-format.ts +138 -23
  833. package/dist/extensions/pi-zentui/extensions/zentui/editor-mouse.ts +89 -0
  834. package/dist/extensions/pi-zentui/extensions/zentui/extension-status-controller.ts +148 -0
  835. package/dist/extensions/pi-zentui/extensions/zentui/extension-status-settings.ts +40 -0
  836. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +109 -1
  837. package/dist/extensions/pi-zentui/extensions/zentui/footer-format.ts +203 -23
  838. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +80 -3
  839. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +1 -1
  840. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +432 -125
  841. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +92 -4
  842. package/dist/extensions/pi-zentui/extensions/zentui/git.ts +47 -30
  843. package/dist/extensions/pi-zentui/extensions/zentui/github-status.ts +575 -0
  844. package/dist/extensions/pi-zentui/extensions/zentui/host-project-changes.ts +25 -0
  845. package/dist/extensions/pi-zentui/extensions/zentui/host-template-values.ts +29 -0
  846. package/dist/extensions/pi-zentui/extensions/zentui/icons.ts +53 -13
  847. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +778 -258
  848. package/dist/extensions/pi-zentui/extensions/zentui/interaction-summary.ts +70 -5
  849. package/dist/extensions/pi-zentui/extensions/zentui/layered-editor.ts +55 -0
  850. package/dist/extensions/pi-zentui/extensions/zentui/live-context.ts +6 -1
  851. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-demand.ts +72 -0
  852. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-display.ts +21 -0
  853. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata.ts +255 -0
  854. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-editor.ts +476 -36
  855. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-settings.ts +118 -0
  856. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-template.ts +177 -0
  857. package/dist/extensions/pi-zentui/extensions/zentui/omp-editor-frame.ts +148 -0
  858. package/dist/extensions/pi-zentui/extensions/zentui/omp-statusline.ts +569 -0
  859. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-lookups.ts +344 -0
  860. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-metrics.ts +91 -0
  861. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-modes.ts +323 -0
  862. package/dist/extensions/pi-zentui/extensions/zentui/omp-ui.ts +210 -0
  863. package/dist/extensions/pi-zentui/extensions/zentui/package-version.ts +30 -12
  864. package/dist/extensions/pi-zentui/extensions/zentui/project-demand.ts +46 -0
  865. package/dist/extensions/pi-zentui/extensions/zentui/project-discovery.ts +58 -0
  866. package/dist/extensions/pi-zentui/extensions/zentui/project-refresh.ts +10 -3
  867. package/dist/extensions/pi-zentui/extensions/zentui/project-state.ts +37 -0
  868. package/dist/extensions/pi-zentui/extensions/zentui/repository-root.ts +1 -0
  869. package/dist/extensions/pi-zentui/extensions/zentui/runtime.ts +119 -43
  870. package/dist/extensions/pi-zentui/extensions/zentui/selector-border.ts +40 -29
  871. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +1268 -722
  872. package/dist/extensions/pi-zentui/extensions/zentui/settings-keys.ts +59 -0
  873. package/dist/extensions/pi-zentui/extensions/zentui/settings-list-selection.ts +13 -0
  874. package/dist/extensions/pi-zentui/extensions/zentui/settings-previews.ts +11 -4
  875. package/dist/extensions/pi-zentui/extensions/zentui/state.ts +24 -11
  876. package/dist/extensions/pi-zentui/extensions/zentui/style.ts +6 -0
  877. package/dist/extensions/pi-zentui/extensions/zentui/telemetry.ts +113 -11
  878. package/dist/extensions/pi-zentui/extensions/zentui/thinking-experimental.ts +234 -46
  879. package/dist/extensions/pi-zentui/extensions/zentui/thinking-steps.ts +20 -5
  880. package/dist/extensions/pi-zentui/extensions/zentui/token-rate.ts +313 -0
  881. package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-format.ts +59 -0
  882. package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-rate.ts +52 -0
  883. package/dist/extensions/pi-zentui/extensions/zentui/ui.ts +640 -172
  884. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +72 -34
  885. package/dist/extensions/pi-zentui/extensions/zentui/user-message.ts +219 -34
  886. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +495 -119
  887. package/dist/extensions/pi-zentui/omp.ts +157 -0
  888. package/dist/extensions/pi-zentui/package-lock.json +3762 -1507
  889. package/dist/extensions/pi-zentui/package.json +50 -12
  890. package/dist/extensions/pi-zentui/test/accent-rail-editor.test.ts +13 -2
  891. package/dist/extensions/pi-zentui/test/average-token-rate.test.ts +297 -0
  892. package/dist/extensions/pi-zentui/test/behavior-compatibility.mjs +89 -0
  893. package/dist/extensions/pi-zentui/test/codex-quota-lifecycle.test.ts +284 -0
  894. package/dist/extensions/pi-zentui/test/codex-quota-rendering.test.ts +466 -0
  895. package/dist/extensions/pi-zentui/test/codex-quota.test.ts +440 -0
  896. package/dist/extensions/pi-zentui/test/component-colors.test.ts +554 -0
  897. package/dist/extensions/pi-zentui/test/component-settings.test.ts +364 -0
  898. package/dist/extensions/pi-zentui/test/config-component-independence.test.ts +402 -0
  899. package/dist/extensions/pi-zentui/test/config-extension-status-choice.test.ts +233 -0
  900. package/dist/extensions/pi-zentui/test/config-hidden-extension-status-colors.test.ts +118 -0
  901. package/dist/extensions/pi-zentui/test/config-hidden-extension-status-placement.test.ts +142 -0
  902. package/dist/extensions/pi-zentui/test/config-minimalist-templates.test.ts +240 -0
  903. package/dist/extensions/pi-zentui/test/config-template-variables.test.ts +85 -0
  904. package/dist/extensions/pi-zentui/test/config.test.ts +80 -17
  905. package/dist/extensions/pi-zentui/test/custom-value-colors-integration.test.ts +453 -0
  906. package/dist/extensions/pi-zentui/test/custom-value-colors.test.ts +399 -0
  907. package/dist/extensions/pi-zentui/test/custom-variable-alias-prototypes.test.ts +177 -0
  908. package/dist/extensions/pi-zentui/test/custom-variable-consumers.test.ts +194 -0
  909. package/dist/extensions/pi-zentui/test/custom-variable-demand.test.ts +169 -0
  910. package/dist/extensions/pi-zentui/test/custom-variable-probe-reservation.test.ts +141 -0
  911. package/dist/extensions/pi-zentui/test/custom-variables-lifecycle.integration.test.ts +365 -0
  912. package/dist/extensions/pi-zentui/test/custom-variables.test.ts +330 -0
  913. package/dist/extensions/pi-zentui/test/editor-metadata-format.test.ts +121 -0
  914. package/dist/extensions/pi-zentui/test/editor-mouse.test.ts +507 -0
  915. package/dist/extensions/pi-zentui/test/editor-viewport-indicators.test.ts +247 -20
  916. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +204 -260
  917. package/dist/extensions/pi-zentui/test/extension-status-controller.test.ts +323 -0
  918. package/dist/extensions/pi-zentui/test/extension-status-lifecycle.integration.test.ts +466 -0
  919. package/dist/extensions/pi-zentui/test/extension-status-settings.test.ts +79 -0
  920. package/dist/extensions/pi-zentui/test/footer-alignment.test.ts +135 -0
  921. package/dist/extensions/pi-zentui/test/footer-authority.test.ts +69 -0
  922. package/dist/extensions/pi-zentui/test/footer-auto-compaction.test.ts +148 -0
  923. package/dist/extensions/pi-zentui/test/footer-format-cache.test.ts +186 -0
  924. package/dist/extensions/pi-zentui/test/footer-format.test.ts +154 -4
  925. package/dist/extensions/pi-zentui/test/footer-hidden.test.ts +312 -0
  926. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +22 -0
  927. package/dist/extensions/pi-zentui/test/footer-layout.test.ts +80 -0
  928. package/dist/extensions/pi-zentui/test/footer-thinking-level.test.ts +123 -0
  929. package/dist/extensions/pi-zentui/test/format.test.ts +75 -1
  930. package/dist/extensions/pi-zentui/test/git-probes.test.ts +182 -0
  931. package/dist/extensions/pi-zentui/test/github-status.test.ts +931 -0
  932. package/dist/extensions/pi-zentui/test/host-template-surfaces.test.ts +287 -0
  933. package/dist/extensions/pi-zentui/test/icons.test.ts +86 -16
  934. package/dist/extensions/pi-zentui/test/layered-editor.test.ts +53 -0
  935. package/dist/extensions/pi-zentui/test/live-context-integration.test.ts +154 -7
  936. package/dist/extensions/pi-zentui/test/live-context.test.ts +45 -0
  937. package/dist/extensions/pi-zentui/test/live-metadata-lifecycle.integration.test.ts +963 -0
  938. package/dist/extensions/pi-zentui/test/live-metadata.test.ts +767 -0
  939. package/dist/extensions/pi-zentui/test/minimalist-cache-hit-colors.test.ts +183 -0
  940. package/dist/extensions/pi-zentui/test/minimalist-editor.test.ts +222 -4
  941. package/dist/extensions/pi-zentui/test/minimalist-settings.test.ts +103 -0
  942. package/dist/extensions/pi-zentui/test/minimalist-templates.test.ts +489 -0
  943. package/dist/extensions/pi-zentui/test/omp-editor-composers.test.ts +324 -0
  944. package/dist/extensions/pi-zentui/test/omp-statusline.test.ts +579 -0
  945. package/dist/extensions/pi-zentui/test/omp-template-lookups.test.ts +630 -0
  946. package/dist/extensions/pi-zentui/test/omp-template-metrics.test.ts +72 -0
  947. package/dist/extensions/pi-zentui/test/omp-template-modes.test.ts +557 -0
  948. package/dist/extensions/pi-zentui/test/omp-ui.test.ts +93 -0
  949. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  950. package/dist/extensions/pi-zentui/test/pi-version-policy.test.ts +37 -0
  951. package/dist/extensions/pi-zentui/test/project-demand-integration.test.ts +542 -0
  952. package/dist/extensions/pi-zentui/test/project-discovery.test.ts +412 -0
  953. package/dist/extensions/pi-zentui/test/project-refresh.test.ts +44 -0
  954. package/dist/extensions/pi-zentui/test/project-state.test.ts +38 -1
  955. package/dist/extensions/pi-zentui/test/responsive-dependencies.test.ts +7 -7
  956. package/dist/extensions/pi-zentui/test/runtime.test.ts +127 -2
  957. package/dist/extensions/pi-zentui/test/selesai-v030-gate.json +939 -0
  958. package/dist/extensions/pi-zentui/test/settings-command.test.ts +1330 -82
  959. package/dist/extensions/pi-zentui/test/settings-keys.test.ts +41 -0
  960. package/dist/extensions/pi-zentui/test/settings-list-selection.test.ts +88 -0
  961. package/dist/extensions/pi-zentui/test/settings-previews.test.ts +4 -1
  962. package/dist/extensions/pi-zentui/test/state.test.ts +15 -1
  963. package/dist/extensions/pi-zentui/test/telemetry-lifecycle-integration.test.ts +214 -12
  964. package/dist/extensions/pi-zentui/test/telemetry-snapshot.test.ts +246 -0
  965. package/dist/extensions/pi-zentui/test/thinking-experimental-cache.test.ts +246 -0
  966. package/dist/extensions/pi-zentui/test/thinking-experimental-rows.test.ts +22 -0
  967. package/dist/extensions/pi-zentui/test/thinking-experimental-tui.mjs +113 -51
  968. package/dist/extensions/pi-zentui/test/thinking-experimental.test.ts +576 -76
  969. package/dist/extensions/pi-zentui/test/thinking-steps.test.ts +23 -0
  970. package/dist/extensions/pi-zentui/test/token-rate.test.ts +450 -0
  971. package/dist/extensions/pi-zentui/test/turn-summary-format.test.ts +207 -0
  972. package/dist/extensions/pi-zentui/test/turn-summary-lifecycle.integration.test.ts +72 -5
  973. package/dist/extensions/pi-zentui/test/turn-summary-rate.test.ts +158 -0
  974. package/dist/extensions/pi-zentui/test/usage-lifecycle-integration.test.ts +421 -0
  975. package/dist/extensions/pi-zentui/test/usage-snapshot.test.ts +154 -0
  976. package/dist/extensions/pi-zentui/test/user-message-cache.test.ts +239 -0
  977. package/dist/extensions/pi-zentui/test/user-message-native-reduced-capabilities.test.ts +61 -0
  978. package/dist/extensions/pi-zentui/test/user-message-native.test.ts +447 -0
  979. package/dist/extensions/pi-zentui/test/user-message-styles.test.ts +2 -2
  980. package/dist/extensions/pi-zentui/test/working-line-editor-placement.test.ts +317 -0
  981. package/dist/extensions/pi-zentui/test/working-line-generation-cache.test.ts +238 -0
  982. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +674 -179
  983. package/dist/extensions/pi-zentui/test/working-line-message-ownership.test.ts +239 -0
  984. package/dist/extensions/pi-zentui/test/working-line-metric-animation.test.ts +284 -0
  985. package/dist/extensions/pi-zentui/test/working-line-placement.test.ts +298 -0
  986. package/dist/extensions/pi-zentui/test/working-line.test.ts +386 -18
  987. package/dist/extensions/pi-zentui/test/wrapped-editor-consumers.integration.test.ts +579 -0
  988. package/dist/extensions/pi-zentui/test/wrapped-editor-usage.integration.test.ts +298 -0
  989. package/dist/extensions/pi-zentui/tsconfig.json +1 -1
  990. package/dist/extensions/pi-zentui/vitest.host.config.ts +33 -0
  991. package/dist/extensions/question/index.ts +1 -5
  992. package/dist/extensions/rtk.test.ts +28 -15
  993. package/dist/extensions/rtk.ts +22 -22
  994. package/dist/extensions/skills-index/index.test.ts +99 -0
  995. package/dist/extensions/skills-index/index.ts +105 -0
  996. package/dist/extensions/skills-index/package.json +9 -0
  997. package/dist/extensions/tokenin-onboarding.ts +48 -208
  998. package/dist/extensions/tool-search/index.d.ts +11 -0
  999. package/dist/extensions/tool-search/index.js +14 -0
  1000. package/dist/extensions/tool-search/tool.d.ts +72 -0
  1001. package/dist/extensions/tool-search/tool.js +188 -0
  1002. package/dist/index.d.ts +16 -9
  1003. package/dist/index.js +10 -5
  1004. package/dist/main.d.ts +4 -0
  1005. package/dist/main.js +106 -42
  1006. package/dist/migrations.js +4 -3
  1007. package/dist/modes/index.d.ts +1 -0
  1008. package/dist/modes/interactive/bug-report.js +4 -0
  1009. package/dist/modes/interactive/components/armin.d.ts +3 -0
  1010. package/dist/modes/interactive/components/armin.js +7 -5
  1011. package/dist/modes/interactive/components/assistant-message.js +1 -1
  1012. package/dist/modes/interactive/components/auth-url.d.ts +13 -0
  1013. package/dist/modes/interactive/components/auth-url.js +36 -0
  1014. package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  1015. package/dist/modes/interactive/components/bash-execution.js +17 -14
  1016. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  1017. package/dist/modes/interactive/components/branch-summary-message.js +5 -2
  1018. package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
  1019. package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
  1020. package/dist/modes/interactive/components/config-selector.js +13 -3
  1021. package/dist/modes/interactive/components/custom-editor.js +7 -0
  1022. package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
  1023. package/dist/modes/interactive/components/custom-entry.js +8 -2
  1024. package/dist/modes/interactive/components/custom-message.js +1 -0
  1025. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  1026. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  1027. package/dist/modes/interactive/components/footer.d.ts +7 -0
  1028. package/dist/modes/interactive/components/footer.js +44 -4
  1029. package/dist/modes/interactive/components/index.d.ts +0 -1
  1030. package/dist/modes/interactive/components/index.js +0 -1
  1031. package/dist/modes/interactive/components/login-dialog.d.ts +2 -0
  1032. package/dist/modes/interactive/components/login-dialog.js +11 -5
  1033. package/dist/modes/interactive/components/mermaid.d.ts +10 -0
  1034. package/dist/modes/interactive/components/mermaid.js +74 -0
  1035. package/dist/modes/interactive/components/model-selector.d.ts +14 -9
  1036. package/dist/modes/interactive/components/model-selector.js +79 -31
  1037. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  1038. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  1039. package/dist/modes/interactive/components/pi-logo.d.ts +18 -0
  1040. package/dist/modes/interactive/components/pi-logo.js +36 -0
  1041. package/dist/modes/interactive/components/radius-login-selector.d.ts +14 -0
  1042. package/dist/modes/interactive/components/radius-login-selector.js +84 -0
  1043. package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
  1044. package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
  1045. package/dist/modes/interactive/components/settings-selector.d.ts +8 -11
  1046. package/dist/modes/interactive/components/settings-selector.js +60 -102
  1047. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  1048. package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
  1049. package/dist/modes/interactive/components/themed-text.d.ts +16 -0
  1050. package/dist/modes/interactive/components/themed-text.js +28 -0
  1051. package/dist/modes/interactive/components/tool-execution.d.ts +11 -18
  1052. package/dist/modes/interactive/components/tool-execution.js +34 -47
  1053. package/dist/modes/interactive/components/tree-selector.js +7 -0
  1054. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  1055. package/dist/modes/interactive/components/user-message.js +14 -6
  1056. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  1057. package/dist/modes/interactive/components/visual-truncate.js +39 -6
  1058. package/dist/modes/interactive/external-editor.js +2 -1
  1059. package/dist/modes/interactive/interactive-mode.d.ts +41 -8
  1060. package/dist/modes/interactive/interactive-mode.js +854 -492
  1061. package/dist/modes/interactive/program-status-reporter.d.ts +33 -0
  1062. package/dist/modes/interactive/program-status-reporter.js +109 -0
  1063. package/dist/modes/interactive/theme/dark.json +59 -72
  1064. package/dist/modes/interactive/theme/light.json +57 -69
  1065. package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
  1066. package/dist/modes/interactive/theme/system-theme.js +545 -0
  1067. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  1068. package/dist/modes/interactive/theme/theme-controller.js +127 -47
  1069. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  1070. package/dist/modes/interactive/theme/theme-json.js +3 -1
  1071. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  1072. package/dist/modes/interactive/theme/theme.d.ts +66 -39
  1073. package/dist/modes/interactive/theme/theme.js +243 -320
  1074. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  1075. package/dist/modes/interactive/tui-renderer.js +1 -0
  1076. package/dist/modes/json-event.d.ts +33 -0
  1077. package/dist/modes/json-event.js +28 -0
  1078. package/dist/modes/print-mode.js +12 -2
  1079. package/dist/modes/rpc/rpc-client.d.ts +11 -19
  1080. package/dist/modes/rpc/rpc-client.js +52 -35
  1081. package/dist/modes/rpc/rpc-mode.js +11 -26
  1082. package/dist/modes/rpc/rpc-types.d.ts +12 -23
  1083. package/dist/package-manager-cli.js +16 -5
  1084. package/dist/rpc-entry.js +1 -0
  1085. package/dist/skills/pi-subagents/SKILL.md +109 -35
  1086. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +38 -238
  1087. package/dist/skills/pi-subagents/references/execution-controls.md +181 -83
  1088. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +9 -9
  1089. package/dist/skills/pi-subagents/references/multi-lane-orchestration.md +24 -2
  1090. package/dist/skills/pi-subagents/references/prompting-and-roles.md +121 -91
  1091. package/dist/skills/pi-subagents/references/review-and-validation.md +73 -0
  1092. package/dist/utils/ansi.d.ts +8 -0
  1093. package/dist/utils/ansi.js +30 -11
  1094. package/dist/utils/clipboard-image.js +14 -17
  1095. package/dist/utils/clipboard.d.ts +2 -0
  1096. package/dist/utils/clipboard.js +17 -11
  1097. package/dist/utils/frontmatter.js +2 -1
  1098. package/dist/utils/image-convert.d.ts +12 -0
  1099. package/dist/utils/image-convert.js +45 -6
  1100. package/dist/utils/image-resize-core.d.ts +12 -0
  1101. package/dist/utils/image-resize-core.js +5 -0
  1102. package/dist/utils/image-resize-worker.js +3 -2
  1103. package/dist/utils/image-resize.js +9 -10
  1104. package/dist/utils/mime.js +1 -1
  1105. package/dist/utils/output-files.d.ts +14 -0
  1106. package/dist/utils/output-files.js +29 -0
  1107. package/dist/utils/paths.d.ts +6 -3
  1108. package/dist/utils/paths.js +28 -5
  1109. package/dist/utils/shell.d.ts +1 -3
  1110. package/dist/utils/shell.js +3 -30
  1111. package/dist/utils/syntax-highlight.d.ts +1 -0
  1112. package/dist/utils/syntax-highlight.js +68 -2
  1113. package/dist/utils/tool-result-images.d.ts +20 -0
  1114. package/dist/utils/tool-result-images.js +47 -0
  1115. package/dist/utils/tools-manager.d.ts +5 -0
  1116. package/dist/utils/tools-manager.js +6 -6
  1117. package/dist/utils/version-check.d.ts +4 -0
  1118. package/dist/utils/version-check.js +20 -2
  1119. package/docs/cli-integration.md +104 -0
  1120. package/docs/cli.md +333 -0
  1121. package/docs/codemode.md +230 -0
  1122. package/docs/configuration.md +47 -0
  1123. package/docs/environment-variables.md +5 -0
  1124. package/docs/extensions.md +107 -30
  1125. package/docs/json.md +8 -4
  1126. package/docs/keybindings.md +10 -10
  1127. package/docs/mcp.md +262 -0
  1128. package/docs/models.md +104 -3
  1129. package/docs/providers.md +20 -2
  1130. package/docs/rpc.md +13 -12
  1131. package/docs/sdk.md +41 -33
  1132. package/docs/security.md +21 -20
  1133. package/docs/settings.md +18 -46
  1134. package/docs/terminal-setup.md +14 -0
  1135. package/docs/virtual-models.md +114 -0
  1136. package/examples/extensions/jev-router.ts +113 -0
  1137. package/examples/extensions/tokenin-usage-widget.ts +124 -0
  1138. package/examples/rpc-client.ts +35 -0
  1139. package/examples/sdk/14-codemode-mcp.ts +67 -0
  1140. package/package.json +15 -8
  1141. package/dist/core/agent-session-auto-handoff.test.js +0 -195
  1142. package/dist/core/built-in-extensions.d.ts +0 -2
  1143. package/dist/core/built-in-extensions.js +0 -2
  1144. package/dist/core/llama/provider.js +0 -143
  1145. package/dist/core/settings-manager-auto-handoff.test.d.ts +0 -1
  1146. package/dist/core/settings-manager-auto-handoff.test.js +0 -53
  1147. package/dist/extensions/capability-gateway/catalog.ts +0 -177
  1148. package/dist/extensions/capability-gateway/index.test.ts +0 -226
  1149. package/dist/extensions/capability-gateway/index.ts +0 -669
  1150. package/dist/extensions/capability-gateway/integration.test.ts +0 -803
  1151. package/dist/extensions/capability-gateway/package.json +0 -16
  1152. package/dist/extensions/capability-gateway/routing.test.ts +0 -574
  1153. package/dist/extensions/capability-gateway/routing.ts +0 -403
  1154. package/dist/extensions/pi-subagents/runner-server-preload.mjs +0 -13
  1155. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +0 -89
  1156. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +0 -259
  1157. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +0 -312
  1158. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +0 -374
  1159. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +0 -69
  1160. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +0 -307
  1161. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +0 -211
  1162. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  1163. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  1164. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  1165. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  1166. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  1167. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  1168. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  1169. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  1170. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  1171. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  1172. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  1173. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  1174. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  1175. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  1176. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  1177. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  1178. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  1179. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  1180. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  1181. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  1182. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  1183. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  1184. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  1185. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  1186. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  1187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  1188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  1189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  1190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  1191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  1192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  1193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  1194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  1195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  1196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  1197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  1198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  1199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  1200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  1201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  1202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  1203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  1204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  1205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  1206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  1207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  1208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  1209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  1210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  1211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  1212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  1213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  1214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  1215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  1216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  1217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  1218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  1219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  1220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  1221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  1222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  1223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  1224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  1225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  1226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  1227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  1228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  1229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  1230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  1231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  1232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  1233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  1234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  1235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  1236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  1237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  1238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  1239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  1240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  1241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  1242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  1243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  1244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  1245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  1246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  1247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  1248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  1249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  1250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  1251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  1252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  1253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  1254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  1255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  1256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  1257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  1258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  1259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  1260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  1261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  1262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  1263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  1264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  1265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  1266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  1267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  1268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  1269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  1270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  1271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  1272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  1273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  1274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  1275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  1276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  1277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  1278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  1279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  1280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  1281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  1282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  1283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  1284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  1285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  1286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  1287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  1288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  1289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  1290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  1291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  1292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  1293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  1294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  1295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  1296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  1297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  1298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  1299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  1300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  1301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  1302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  1303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  1304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  1305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  1306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  1307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  1308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  1309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  1310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  1311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  1312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  1313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  1314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  1315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  1316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  1317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  1318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  1319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  1320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  1321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  1322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  1323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  1324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  1325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  1326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  1327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  1328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  1329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  1330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  1331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  1332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  1333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  1334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  1335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
  1336. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +0 -31
  1337. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +0 -74
  1338. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +0 -150
  1339. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +0 -766
  1340. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +0 -327
  1341. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +0 -309
  1342. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +0 -1093
  1343. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +0 -94
  1344. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +0 -1329
  1345. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +0 -153
  1346. package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-layout-patch.ts +0 -457
  1347. package/dist/extensions/pi-zentui/test/accent-rail-layout-patch.test.ts +0 -669
  1348. package/dist/extensions/pi-zentui/test/thinking-experimental-docs.test.ts +0 -51
  1349. package/dist/modes/interactive/components/daxnuts.d.ts +0 -22
  1350. package/dist/modes/interactive/components/daxnuts.js +0 -139
  1351. /package/dist/core/{agent-session-auto-handoff.test.d.ts → agent-session-custom-tools.test.d.ts} +0 -0
  1352. /package/dist/{core → extensions}/llama/huggingface.d.ts +0 -0
  1353. /package/dist/{core → extensions}/llama/huggingface.js +0 -0
  1354. /package/dist/{core → extensions}/llama/index.d.ts +0 -0
  1355. /package/dist/{core → extensions}/llama/ui.d.ts +0 -0
  1356. /package/dist/{core → extensions}/llama/ui.js +0 -0
@@ -3,15 +3,17 @@ import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process";
3
3
  import * as fs from "node:fs";
4
4
  import * as path from "node:path";
5
5
  import { finished } from "node:stream/promises";
6
- import type { ExternalProcessStatus } from "../../shared/types.ts";
6
+ import type { ExternalProcessStatus, ProcessTreeTerminal } from "../../shared/types.ts";
7
7
  import { createOwnedProcessTreeController, type OwnedProcessTreeController } from "../background/owned-process-tree.ts";
8
8
  import { omitExtensionBindingsEnv } from "./extension-bindings.ts";
9
9
  import { omitGitRoutingEnv } from "./git-environment.ts";
10
10
  import {
11
11
  invalidateExternalCliPreflight,
12
12
  preflightExternalCli,
13
+ resolveExternalCliSpawn,
13
14
  type ExternalCliPreflightResult,
14
15
  type ExternalCliPreflightSpec,
16
+ type ExternalCliSpawn,
15
17
  } from "./external-cli-preflight.ts";
16
18
 
17
19
  const MAX_OUTPUT_TAIL_BYTES = 64 * 1024;
@@ -87,6 +89,7 @@ function narrowLimit(value: number | undefined, ceiling: number, label: string):
87
89
  }
88
90
 
89
91
  function externalEnvironment(allowlist: readonly string[] | undefined, values: Readonly<Record<string, string>> | undefined): NodeJS.ProcessEnv {
92
+ // An adapter allowlist is a deliberate choice, so only the inherited default is filtered.
90
93
  if (!allowlist) return omitGitRoutingEnv(omitExtensionBindingsEnv(process.env));
91
94
  const allowed = new Set(allowlist);
92
95
  const env: NodeJS.ProcessEnv = {};
@@ -142,7 +145,7 @@ function classifyInvalidation(error: string): "auth" | "permission" | "launch" {
142
145
  return "launch";
143
146
  }
144
147
 
145
- function terminateExternalProcessTree(pid: number, controller: OwnedProcessTreeController): Promise<unknown> {
148
+ function terminateExternalProcessTree(pid: number, controller: OwnedProcessTreeController): Promise<ProcessTreeTerminal> {
146
149
  if (process.platform !== "win32") return controller.terminate();
147
150
  return new Promise((resolve) => {
148
151
  const cleanup = spawn("taskkill", ["/PID", String(pid), "/T", "/F"], { stdio: "ignore", windowsHide: true });
@@ -197,6 +200,7 @@ export function runExternalCli(input: {
197
200
  };
198
201
  const env = externalEnvironment(input.environment?.allowlist, input.environment?.values);
199
202
  let preflight: ExternalCliPreflightResult | undefined;
203
+ let launch: ExternalCliSpawn;
200
204
  try {
201
205
  for (const directory of input.temporaryDirectories ?? []) {
202
206
  fs.mkdirSync(directory, { mode: 0o700 });
@@ -209,6 +213,7 @@ export function runExternalCli(input: {
209
213
  finally { fs.closeSync(promptDescriptor); }
210
214
  }
211
215
  if (input.preflight) preflight = preflightExternalCli(input.command, input.preflight, env, input.cwd);
216
+ launch = resolveExternalCliSpawn(preflight?.binaryPath ?? input.command, input.args ?? [], env);
212
217
  } catch (error) {
213
218
  const endedAt = Date.now();
214
219
  const externalProcess = { startedAt, endedAt, durationMs: endedAt - startedAt, exitCode: 1, processSignal: null, stdoutPath, stderrPath, ...(input.finalOutputPath ? { finalOutputPath: input.finalOutputPath } : {}) } satisfies ExternalProcessStatus;
@@ -240,7 +245,7 @@ export function runExternalCli(input: {
240
245
  let settled = false;
241
246
  let processTree: OwnedProcessTreeController | undefined;
242
247
  let processPid: number | undefined;
243
- let termination: Promise<unknown> | undefined;
248
+ let termination: Promise<ProcessTreeTerminal> | undefined;
244
249
  const flushProgress = () => {
245
250
  if (!latestProgress) return;
246
251
  input.onParserProgress?.(latestProgress);
@@ -328,7 +333,7 @@ export function runExternalCli(input: {
328
333
  }
329
334
  appendPendingLine(chunk.subarray(start));
330
335
  };
331
- const child = spawn(preflight?.binaryPath ?? input.command, input.args ?? [], {
336
+ const child = spawn(launch.command, launch.args, {
332
337
  cwd: input.cwd,
333
338
  env,
334
339
  stdio: ["pipe", "pipe", "pipe"],
@@ -382,8 +387,7 @@ export function runExternalCli(input: {
382
387
  input.registerTimeout?.(undefined);
383
388
  input.registerStop?.(undefined);
384
389
  void (async () => {
385
- if (termination) await termination;
386
- else if (processTree) await processTree.finishAfterWriterClose();
390
+ const treeProof = termination ? await termination : processTree ? await processTree.finishAfterWriterClose() : undefined;
387
391
  const endedAt = Date.now();
388
392
  const externalProcess: ExternalProcessStatus = {
389
393
  ...initialProcess,
@@ -399,15 +403,18 @@ export function runExternalCli(input: {
399
403
  input.onProcess?.(externalProcess);
400
404
  const stderr = stderrTail.text().trim();
401
405
  const parserFailure = parserError?.message ?? (parserTerminal?.state === "failed" ? parserTerminal.error ?? "External CLI parser reported terminal failure." : undefined);
406
+ const treeFailure = process.platform !== "win32" && treeProof?.state === "unknown"
407
+ ? `Process-tree cleanup failed: ${treeProof.reason}.`
408
+ : undefined;
402
409
  const error = stopped
403
410
  ? input.stopMessage ?? "Subagent stopped by user."
404
411
  : timedOut
405
412
  ? input.timeoutMessage ?? "Subagent timed out."
406
- : spawnError?.message ?? parserFailure ?? (exitCode === 0 ? undefined : stderr || `External CLI exited with code ${exitCode}.`);
413
+ : spawnError?.message ?? parserFailure ?? treeFailure ?? (exitCode === 0 ? undefined : stderr || `External CLI exited with code ${exitCode}.`);
407
414
  if (error && input.preflight && !parserError) invalidateExternalCliPreflight(input.command, input.preflight, classifyInvalidation(error));
408
415
  const result: ExternalCliRunResult = {
409
416
  output: (!parserError && parserTerminal?.state === "completed" ? parserTerminal.output ?? "" : stdoutTail.text()).trim(),
410
- exitCode: timedOut || stopped || spawnError || parserFailure ? 1 : exitCode,
417
+ exitCode: timedOut || stopped || spawnError || parserFailure || treeFailure ? 1 : exitCode,
411
418
  ...(error ? { error } : {}),
412
419
  ...(timedOut ? { timedOut: true } : {}),
413
420
  ...(stopped ? { stopped: true } : {}),
@@ -427,4 +434,4 @@ export function runExternalCli(input: {
427
434
  })();
428
435
  });
429
436
  });
430
- }
437
+ }
@@ -3,6 +3,8 @@ import * as fs from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
5
  import { writeAtomicJson } from "../../shared/atomic-json.ts";
6
+ import { readStatus } from "../../shared/utils.ts";
7
+ import { isActiveAsyncState } from "../background/active-run-index.ts";
6
8
  import {
7
9
  ExternalJobProviderError,
8
10
  getExternalJobProvider,
@@ -19,6 +21,7 @@ export const EXTERNAL_JOB_BRIDGE_REQUEST_DIR = "external-job-requests";
19
21
  const EXTERNAL_JOB_BRIDGE_RESPONSE_DIR = "external-job-responses";
20
22
  const DEFAULT_OPERATION_TIMEOUT_MS = 120_000;
21
23
  const POLL_INTERVAL_MS = 50;
24
+ const CHILD_BRIDGE_SWEEP_INTERVAL_MS = 1_000;
22
25
  const MAX_REQUESTS_PER_SWEEP = 100;
23
26
 
24
27
  interface ExternalJobBridgeRequest {
@@ -309,6 +312,57 @@ function readClaimHandle(provider: string, claimDir: string): ExternalJobHandle
309
312
  }
310
313
  }
311
314
 
315
+ export function externalJobBridgeEligibility(steps: unknown): "required" | "not-required" | "unknown" {
316
+ if (!Array.isArray(steps)) return "unknown";
317
+ for (const step of steps) {
318
+ const runner = (step as { runner?: unknown } | null)?.runner;
319
+ if (runner === undefined) continue;
320
+ if (!runner || typeof runner !== "object" || Array.isArray(runner)) return "unknown";
321
+ const runnerType = (runner as { type?: unknown }).type;
322
+ if (typeof runnerType !== "string") return "unknown";
323
+ if (runnerType === "external-job") return "required";
324
+ if (runnerType !== "pi" && runnerType !== "external-cli") return "unknown";
325
+ }
326
+ return "not-required";
327
+ }
328
+
329
+ /** Services the bridges of external-job runs that a child session launched; only the root has an async job tracker. */
330
+ export function createChildExternalJobBridgeSweeper() {
331
+ const runs = new Map<string, string>();
332
+ let timer: ReturnType<typeof setInterval> | undefined;
333
+ const sweep = (): number => {
334
+ for (const [runId, asyncDir] of runs) {
335
+ try {
336
+ const status = readStatus(asyncDir);
337
+ // The launch status has no runner metadata until the runner starts, so re-check on every sweep.
338
+ if (externalJobBridgeEligibility(status?.steps) !== "not-required") serviceExternalJobBridgeRequests(asyncDir);
339
+ if (status && !isActiveAsyncState(status.state)) runs.delete(runId);
340
+ } catch (error) {
341
+ console.error(`Failed to service external-job bridge requests for '${asyncDir}':`, error);
342
+ }
343
+ }
344
+ if (runs.size === 0 && timer) {
345
+ clearInterval(timer);
346
+ timer = undefined;
347
+ }
348
+ return runs.size;
349
+ };
350
+ return {
351
+ track(runId: string, asyncDir: string): void {
352
+ runs.set(runId, asyncDir);
353
+ if (timer) return;
354
+ timer = setInterval(sweep, CHILD_BRIDGE_SWEEP_INTERVAL_MS);
355
+ timer.unref?.();
356
+ },
357
+ sweep,
358
+ dispose(): void {
359
+ runs.clear();
360
+ if (timer) clearInterval(timer);
361
+ timer = undefined;
362
+ },
363
+ };
364
+ }
365
+
312
366
  export function serviceExternalJobBridgeRequests(asyncDir: string): void {
313
367
  let files: string[];
314
368
  try {
@@ -457,4 +511,4 @@ export async function requestExternalJobOperation<T extends ExternalJobHandle |
457
511
  fs.rmSync(outPath, { force: true });
458
512
  if (!response.ok) throw new ExternalJobProviderError(response.message, { code: response.code, ...(response.blockingJobId ? { blockingJobId: response.blockingJobId } : {}) });
459
513
  return response.result as T;
460
- }
514
+ }
@@ -1,4 +1,3 @@
1
- // ponytail: this static list can lag Git additions; refresh from `git rev-parse --local-env-vars` and indexed config keys when Git changes.
2
1
  const GIT_ROUTING_VARIABLES = new Set([
3
2
  "GIT_ALTERNATE_OBJECT_DIRECTORIES",
4
3
  "GIT_COMMON_DIR",
@@ -19,6 +18,7 @@ const GIT_ROUTING_VARIABLES = new Set([
19
18
  ]);
20
19
 
21
20
  function isGitRoutingVariable(name: string): boolean {
21
+ // Windows environment names are case-insensitive, and Git for Windows reads them that way.
22
22
  const upper = name.toUpperCase();
23
23
  return GIT_ROUTING_VARIABLES.has(upper) || /^GIT_CONFIG_(?:KEY|VALUE)_\d+$/.test(upper);
24
24
  }
@@ -0,0 +1,134 @@
1
+ import { spawn, spawnSync, type ChildProcess } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as net from "node:net";
4
+ import * as os from "node:os";
5
+ import * as path from "node:path";
6
+ import type { HerdrMachineReference } from "../../shared/types.ts";
7
+
8
+ const MAX_DISCOVERY_BYTES = 256 * 1024;
9
+ const MAX_RPC_BYTES = 4 * 1024 * 1024;
10
+ const SUBSCRIPTION_ACK_TIMEOUT_MS = 15_000;
11
+ export const HERDR_REMOTE_PATH = "$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin";
12
+ export const HERDR_SSH_BASE = ["-T", "-o", "BatchMode=yes", "-o", "NumberOfPasswordPrompts=0", "-o", "StrictHostKeyChecking=yes", "-o", "ConnectTimeout=10", "-o", "ConnectionAttempts=1", "-o", "ForwardAgent=no", "-o", "ExitOnForwardFailure=yes", "-o", "ServerAliveInterval=15", "-o", "ServerAliveCountMax=4", "-o", "SendEnv=-*", "-o", "SetEnv=SELESAI_SUBAGENTS_SSH_GUARD="] as const;
13
+ export function hardenedSshEnv(source: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv { return { PATH: process.platform === "win32" ? source.PATH : "/usr/bin:/bin:/usr/sbin:/sbin", ...(source.SystemRoot ? { SystemRoot: source.SystemRoot } : {}), ...(source.WINDIR ? { WINDIR: source.WINDIR } : {}) }; }
14
+ export function herdrSshArgs(source: NodeJS.ProcessEnv = process.env): string[] { return [...HERDR_SSH_BASE, ...(source.SSH_AUTH_SOCK ? ["-o", `IdentityAgent=${source.SSH_AUTH_SOCK}`] : [])]; }
15
+
16
+ export interface HerdrEndpoint { socket: string; session: string | null; version: string; protocol: number; compatible: boolean; running: boolean }
17
+ export interface HerdrRpcClient {
18
+ call<T>(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
19
+ subscribe(subscriptions: unknown[], listener: (event: unknown) => void, onDisconnect?: (error: Error) => void): Promise<() => void>;
20
+ }
21
+ export class HerdrRpcError extends Error {
22
+ readonly code?: string; readonly requestId: string;
23
+ constructor(message: string, requestId: string, code?: string) { super(message); this.name = "HerdrRpcError"; this.requestId = requestId; this.code = code; }
24
+ }
25
+ export class HerdrTransportError extends Error { constructor(message: string, options?: ErrorOptions) { super(message, options); this.name = "HerdrTransportError"; } }
26
+ export interface HerdrForwardedConnection { endpoint: HerdrEndpoint; socketPath: string; client: HerdrRpcClient; forwardRemoteSocket(remotePath: string, name: string): Promise<{ socketPath: string; close(): Promise<void> }>; close(): Promise<void> }
27
+ export function decodeHerdrJsonLine(line: Buffer): unknown { try { return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(line)) as unknown; } catch { throw new Error("Herdr emitted malformed JSON or UTF-8."); } }
28
+
29
+ export function shellQuoteRemote(value: string): string { return `'${value.replaceAll("'", "'\\''")}'`; }
30
+ export function remoteShellCommand(script: string, args: string[] = []): string { return `sh -c ${shellQuoteRemote(`PATH="${HERDR_REMOTE_PATH}"; export PATH; ${script}`)} sh${args.map((arg) => ` ${shellQuoteRemote(arg)}`).join("")}`; }
31
+ function canonicalHerdrSession(session: string | null | undefined): string | null { return session && session !== "default" ? session : null; }
32
+ function sshEnvCommand(session: string | undefined, command: string): string { const selected = canonicalHerdrSession(session), assignment = selected ? ` HERDR_SESSION=${shellQuoteRemote(selected)}` : ""; return `/usr/bin/env -u HERDR_SOCKET_PATH -u HERDR_SESSION${assignment} ${remoteShellCommand(command)}`; }
33
+
34
+ export function runHerdrRemoteCommand(machine: HerdrMachineReference, command: string, options: { sshBin?: string; env?: NodeJS.ProcessEnv; timeout?: number; maxBuffer?: number } = {}) { return spawnSync(options.sshBin ?? "ssh", [...herdrSshArgs(options.env), machine.target, command], { encoding: "utf8", env: hardenedSshEnv(options.env), timeout: options.timeout ?? 15_000, maxBuffer: options.maxBuffer ?? MAX_DISCOVERY_BYTES, windowsHide: true }); }
35
+
36
+ export function runHerdrRemoteCommandAsync(machine: HerdrMachineReference, command: string, options: { sshBin?: string; env?: NodeJS.ProcessEnv; timeout?: number; maxBuffer?: number } = {}): Promise<{ status: number | null; stdout: string; stderr: string; error?: Error }> {
37
+ return new Promise((resolve) => {
38
+ const child = spawn(options.sshBin ?? "ssh", [...herdrSshArgs(options.env), machine.target, command], { env: hardenedSshEnv(options.env), stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
39
+ const stdout: Buffer[] = [], stderr: Buffer[] = [], maxBuffer = options.maxBuffer ?? MAX_DISCOVERY_BYTES; let stdoutBytes = 0, stderrBytes = 0, error: Error | undefined, settled = false, escalation: NodeJS.Timeout | undefined;
40
+ const finish = (status: number | null, spawnError = error) => { if (settled) return; settled = true; clearTimeout(timer); if (escalation) clearTimeout(escalation); resolve({ status, stdout: Buffer.concat(stdout).toString("utf8"), stderr: Buffer.concat(stderr).toString("utf8"), ...(spawnError ? { error: spawnError } : {}) }); };
41
+ const terminate = () => { child.kill("SIGTERM"); escalation ??= setTimeout(() => { if (!settled) { child.kill("SIGKILL"); finish(child.exitCode ?? null); } }, 1_000); escalation.unref?.(); };
42
+ const collect = (target: Buffer[], stream: "stdout" | "stderr") => (chunk: Buffer) => { const bytes = stream === "stdout" ? (stdoutBytes += chunk.byteLength) : (stderrBytes += chunk.byteLength); if (bytes > maxBuffer) { error ??= new Error(`${stream} maxBuffer length exceeded`); terminate(); } else target.push(chunk); };
43
+ child.stdout.on("data", collect(stdout, "stdout")); child.stderr.on("data", collect(stderr, "stderr"));
44
+ child.once("error", (spawnError) => finish(null, spawnError));
45
+ child.once("close", (status) => finish(status));
46
+ const timer = setTimeout(terminate, options.timeout ?? 15_000); timer.unref?.();
47
+ });
48
+ }
49
+
50
+ export function parseHerdrEndpoint(value: string, expectedSession?: string): HerdrEndpoint {
51
+ let parsed: unknown;
52
+ try { parsed = JSON.parse(value) as unknown; } catch { throw new Error("Remote Herdr endpoint discovery returned malformed JSON."); }
53
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("Remote Herdr endpoint discovery returned no endpoint.");
54
+ const p = parsed as Record<string, unknown>;
55
+ if (typeof p.socket !== "string" || !path.posix.isAbsolute(p.socket) || typeof p.version !== "string" || typeof p.protocol !== "number") throw new Error("Remote Herdr endpoint discovery returned incomplete identity.");
56
+ const session = canonicalHerdrSession(typeof p.session === "string" ? p.session : null), expected = canonicalHerdrSession(expectedSession);
57
+ if (expected !== session) throw new Error(`Remote Herdr session identity mismatch: expected ${expected ?? "default"}, received ${session ?? "default"}.`);
58
+ if (p.running !== true || p.compatible !== true || p.endpoint_compatible === false) throw new Error("The selected remote Herdr session is stopped or incompatible.");
59
+ return { socket: p.socket, session, version: p.version, protocol: p.protocol, compatible: true, running: true };
60
+ }
61
+
62
+ export async function discoverHerdrEndpoint(machine: HerdrMachineReference, options: { sshBin?: string; env?: NodeJS.ProcessEnv } = {}): Promise<HerdrEndpoint> {
63
+ const discovery = 'herdr_path=$(command -v herdr) || exit 127; case "$herdr_path" in /*/herdr) ;; *) exit 126;; esac; exec "$herdr_path" status server --json';
64
+ const result = await runHerdrRemoteCommandAsync(machine, sshEnvCommand(machine.session, discovery), { ...options, timeout: 15_000, maxBuffer: MAX_DISCOVERY_BYTES });
65
+ if (result.error) throw new Error(`Remote Herdr discovery failed: ${result.error.message}`);
66
+ if (result.status !== 0) throw new Error(`Remote Herdr discovery failed with code ${result.status}: ${(result.stderr || result.stdout).trim()}`);
67
+ return parseHerdrEndpoint(result.stdout, machine.session);
68
+ }
69
+
70
+ export class SocketRpcClient implements HerdrRpcClient {
71
+ readonly #socketPath: string;
72
+ readonly #subscriptionAckTimeoutMs: number;
73
+ #next = 0;
74
+ constructor(socketPath: string, subscriptionAckTimeoutMs = SUBSCRIPTION_ACK_TIMEOUT_MS) { this.#socketPath = socketPath; this.#subscriptionAckTimeoutMs = subscriptionAckTimeoutMs; }
75
+ call<T>(method: string, params: Record<string, unknown> = {}, timeoutMs = 15_000): Promise<T> {
76
+ return new Promise((resolve, reject) => {
77
+ const socket = net.createConnection(this.#socketPath); let bytes = 0; let data = Buffer.alloc(0); let finished = false; const id = String(++this.#next);
78
+ const timer = setTimeout(() => finish(new HerdrTransportError(`Herdr RPC '${method}' timed out.`)), timeoutMs); timer.unref?.();
79
+ const finish = (error?: Error, value?: T) => { if (finished) return; finished = true; clearTimeout(timer); socket.destroy(); error ? reject(error) : resolve(value as T); };
80
+ socket.on("connect", () => socket.write(`${JSON.stringify({ id, method, params })}\n`));
81
+ socket.on("data", (chunk: Buffer) => {
82
+ bytes += chunk.byteLength; if (bytes > MAX_RPC_BYTES) { finish(new Error("Herdr RPC response exceeded its byte bound.")); return; }
83
+ data = Buffer.concat([data, chunk]); const newline = data.indexOf(10); if (newline < 0) return;
84
+ let frame: unknown; try { frame = decodeHerdrJsonLine(data.subarray(0, newline)); } catch { finish(new Error("Herdr RPC returned malformed JSON or UTF-8.")); return; }
85
+ const record = frame as { id?: unknown; result?: T; error?: { message?: unknown; code?: unknown } };
86
+ if (record.id !== id) { finish(new Error("Herdr RPC response identity mismatch.")); return; }
87
+ if (record.error) finish(new HerdrRpcError(String(record.error.message ?? "Herdr RPC failed."), id, typeof record.error.code === "string" ? record.error.code : undefined)); else finish(undefined, record.result);
88
+ });
89
+ socket.on("error", (error) => finish(new HerdrTransportError(error.message, { cause: error })));
90
+ socket.on("close", () => finish(new HerdrTransportError(`Herdr RPC '${method}' ended before a response.`)));
91
+ });
92
+ }
93
+ async subscribe(subscriptions: unknown[], listener: (event: unknown) => void, onDisconnect?: (error: Error) => void): Promise<() => void> {
94
+ const socket = net.createConnection(this.#socketPath); const id = String(++this.#next); let buffer = Buffer.alloc(0), bytes = 0, acknowledged = false, intentional = false, notified = false, settled = false;
95
+ let resolveAck!: () => void, rejectAck!: (error: Error) => void;
96
+ const acknowledgement = new Promise<void>((resolve, reject) => { resolveAck = resolve; rejectAck = reject; });
97
+ const failHandshake = (error: Error) => { if (settled) return; settled = true; clearTimeout(timer); socket.destroy(); rejectAck(error); };
98
+ const disconnect = (error: Error) => { if (intentional || notified) return; notified = true; if (!acknowledged) failHandshake(error); else onDisconnect?.(error); };
99
+ const timer = setTimeout(() => failHandshake(new Error("Herdr subscription acknowledgement timed out.")), this.#subscriptionAckTimeoutMs); timer.unref?.();
100
+ socket.on("data", (chunk: Buffer) => { bytes += chunk.byteLength; if (bytes > (acknowledged ? MAX_RPC_BYTES * 32 : MAX_RPC_BYTES)) { disconnect(new Error("Herdr subscription exceeded its byte bound.")); socket.destroy(); return; } buffer = Buffer.concat([buffer, chunk]); for (;;) { const i = buffer.indexOf(10); if (i < 0) break; const line = buffer.subarray(0, i); buffer = buffer.subarray(i + 1); let value: unknown; try { value = decodeHerdrJsonLine(line); } catch { disconnect(new Error("Herdr subscription emitted malformed JSON or UTF-8.")); socket.destroy(); return; } const record = value as { id?: unknown; result?: { type?: unknown }; error?: { message?: unknown; code?: unknown } }; if (!acknowledged) { if (record.id === id) { if (record.error) { failHandshake(new HerdrRpcError(String(record.error.message ?? "Herdr subscription failed."), id, typeof record.error.code === "string" ? record.error.code : undefined)); return; } if (record.result?.type !== "subscription_started") { failHandshake(new Error("Herdr subscription returned an invalid acknowledgement.")); return; } acknowledged = true; settled = true; clearTimeout(timer); resolveAck(); continue; } if (record.id === "" && record.error && record.error.code === "invalid_request") { failHandshake(new HerdrRpcError(String(record.error.message ?? "Herdr subscription request was invalid."), "", "invalid_request")); return; } failHandshake(new Error("Herdr subscription emitted an event before acknowledgement.")); return; } if (record.error) { disconnect(new HerdrRpcError(String(record.error.message ?? "Herdr subscription failed."), typeof record.id === "string" ? record.id : "", typeof record.error.code === "string" ? record.error.code : undefined)); socket.destroy(); return; } listener(value); } });
101
+ socket.on("error", (error) => disconnect(error));
102
+ socket.on("close", () => disconnect(new Error("Herdr subscription connection was lost.")));
103
+ socket.on("connect", () => socket.write(`${JSON.stringify({ id, method: "events.subscribe", params: { subscriptions } })}\n`));
104
+ await acknowledgement;
105
+ return () => { intentional = true; clearTimeout(timer); socket.destroy(); };
106
+ }
107
+ }
108
+
109
+ async function waitForSocket(socketPath: string, child: ChildProcess): Promise<void> {
110
+ for (let attempt = 0; attempt < 100; attempt++) {
111
+ if (child.exitCode !== null) throw new Error(`SSH StreamLocal forwarding exited with code ${child.exitCode}.`);
112
+ try { const stat = fs.lstatSync(socketPath); if (stat.isSocket()) { fs.chmodSync(socketPath, 0o600); return; } } catch {}
113
+ await new Promise((resolve) => setTimeout(resolve, 25));
114
+ }
115
+ throw new Error("SSH StreamLocal forwarding did not create its local socket.");
116
+ }
117
+ async function terminateChild(child: ChildProcess): Promise<void> { const wait = (ms: number) => child.exitCode !== null || child.signalCode !== null ? Promise.resolve() : Promise.race([new Promise<void>((resolve) => child.once("exit", () => resolve())), new Promise<void>((resolve) => setTimeout(resolve, ms))]); if (child.exitCode === null && child.signalCode === null) child.kill("SIGTERM"); await wait(1_000); if (child.exitCode === null && child.signalCode === null) { child.kill("SIGKILL"); await wait(1_000); } }
118
+
119
+ export async function connectHerdrMachine(machine: HerdrMachineReference, options: { sshBin?: string; env?: NodeJS.ProcessEnv } = {}): Promise<HerdrForwardedConnection> {
120
+ if (process.platform === "win32") throw new Error("Pane-native Herdr placement requires OpenSSH StreamLocal forwarding and is not supported on Windows.");
121
+ const endpoint = await discoverHerdrEndpoint(machine, options);
122
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-herdr-")); fs.chmodSync(dir, 0o700);
123
+ const children = new Set<ChildProcess>();
124
+ const forward = async (remotePath: string, name: string) => {
125
+ if (!path.posix.isAbsolute(remotePath)) throw new Error("Remote socket path must be absolute.");
126
+ const local = path.join(dir, `${name}.sock`);
127
+ const child = spawn(options.sshBin ?? "ssh", [...herdrSshArgs(options.env), "-N", "-o", "StreamLocalBindUnlink=yes", "-L", `${local}:${remotePath}`, machine.target], { env: hardenedSshEnv(options.env), stdio: "ignore", windowsHide: true }); children.add(child);
128
+ const stop = async () => { await terminateChild(child); children.delete(child); try { fs.rmSync(local, { force: true }); } catch {} };
129
+ try { await waitForSocket(local, child); } catch (error) { await stop(); throw error; }
130
+ return { socketPath: local, close: stop };
131
+ };
132
+ const primary = await forward(endpoint.socket, "herdr").catch((error) => { fs.rmSync(dir, { recursive: true, force: true }); throw error; });
133
+ return { endpoint, socketPath: primary.socketPath, client: new SocketRpcClient(primary.socketPath), forwardRemoteSocket: forward, close: async () => { await Promise.all([...children].map(terminateChild)); children.clear(); fs.rmSync(dir, { recursive: true, force: true }); } };
134
+ }
@@ -0,0 +1,169 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import * as path from "node:path";
3
+ import { stripVTControlCharacters } from "node:util";
4
+ import type { HerdrMachineReference, HerdrRemoteGitStatus } from "../../shared/types.ts";
5
+ import { connectHerdrMachine, HerdrRpcError, HerdrTransportError, remoteShellCommand, shellQuoteRemote, type HerdrForwardedConnection } from "./herdr-connection.ts";
6
+ import { HerdrPlacedRunOwner, herdrStatusSubscriptions, ownsHerdrPane, parseHerdrAgent, reconcileHerdrPlacedRun, type HerdrReconnectCandidate, type HerdrRunIdentity } from "./herdr-placed-run.ts";
7
+
8
+ export type HerdrExternalAdapterId = "claude-code" | "claude-code-writer" | "cursor-agent" | "cursor-agent-writer" | "codex-exec" | "codex-exec-writer";
9
+ export type HerdrExternalKind = "claude" | "cursor" | "codex";
10
+ export interface HerdrExternalCapabilities { stop: true; steer: false; resume: false; supervisor: "unsupported" }
11
+ export interface HerdrExternalLaunch { adapter: HerdrExternalAdapterId; kind: HerdrExternalKind; nativeSessionId: string; args: string[]; capabilities: HerdrExternalCapabilities }
12
+ export interface HerdrExternalResult {
13
+ protocol: 1; adapter: HerdrExternalAdapterId; runId: string; requestId: string; nativeSessionId: "unverified"; nativeTurnId: "unverified";
14
+ outcome: "partial"; output: string; initialGit?: HerdrRemoteGitStatus; finalGit?: HerdrRemoteGitStatus;
15
+ settlement?: { verification: "best-effort/unverified"; evidence: "sanitized-terminal-snapshots" };
16
+ }
17
+ export interface HerdrExternalEvidenceInput { runId: string; requestId: string; task: string; cwd: string; nativeSessionId: string; requestedModel?: string; initialGit?: unknown; finalGit?: unknown }
18
+ export interface HerdrExternalCommandEvidence { binary: string; args: readonly string[]; status: number; stdout: string; stderr: string }
19
+ export interface HerdrExternalPreflightEvidence { version: HerdrExternalCommandEvidence; help: HerdrExternalCommandEvidence }
20
+ export interface HerdrExternalAdapter {
21
+ readonly id: HerdrExternalAdapterId; readonly kind: HerdrExternalKind;
22
+ preflight(evidence: HerdrExternalPreflightEvidence): void;
23
+ launch(input: Omit<Parameters<typeof createHerdrExternalAdapterLaunch>[0], "adapter">): HerdrExternalLaunch;
24
+ normalize(input: HerdrExternalEvidenceInput, evidence: Buffer | string): HerdrExternalResult;
25
+ }
26
+
27
+ const CAPABILITIES: HerdrExternalCapabilities = { stop: true, steer: false, resume: false, supervisor: "unsupported" };
28
+ const MAX_EVIDENCE_BYTES = 4 * 1024 * 1024, MAX_OUTPUT_BYTES = 1024 * 1024, MAX_PREFLIGHT_BYTES = 64 * 1024, MAX_GIT_BYTES = 2048;
29
+ const CODEX_OUTPUT_BYTES = 64 * 1024, EXTERNAL_STARTUP_TIMEOUT_MS = 45_000, EXTERNAL_STARTUP_BACKOFF_AFTER_MS = 15_000, EXTERNAL_STARTUP_SLOW_POLL_MS = 2_500, CODEX_STARTUP_GRACE_MS = 15_000, CODEX_QUIET_MS = 8_000, CODEX_POLL_MS = 1_000, CODEX_DEFAULT_TIMEOUT_MS = 30 * 60_000;
30
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu, SHA = /^[0-9a-f]{4,64}$/iu;
31
+
32
+ function boundedString(value: unknown, label: string, maximum = MAX_OUTPUT_BYTES): string { if (typeof value !== "string" || !value.trim()) throw new Error(`${label} is missing.`); if (Buffer.byteLength(value) > maximum) throw new Error(`${label} exceeded its byte bound.`); return value; }
33
+ function exactUuid(value: unknown, label: string): string { const result = boundedString(value, label, 64); if (!UUID.test(result)) throw new Error(`${label} is not a UUID.`); return result; }
34
+ function normalizeGit(value: unknown, label: string): HerdrRemoteGitStatus | undefined {
35
+ if (value === undefined) return undefined; if (!value || typeof value !== "object" || Array.isArray(value) || Buffer.byteLength(JSON.stringify(value)) > MAX_GIT_BYTES) throw new Error(`${label} is malformed or oversized.`);
36
+ const data = value as Record<string, unknown>, unknown = Object.keys(data).filter((key) => key !== "head" && key !== "branch" && key !== "dirty"); if (unknown.length) throw new Error(`${label} has unsupported keys.`);
37
+ if (data.head !== undefined && (typeof data.head !== "string" || !SHA.test(data.head))) throw new Error(`${label}.head is invalid.`);
38
+ if (data.branch !== undefined && (typeof data.branch !== "string" || !data.branch.trim() || Buffer.byteLength(data.branch) > 256 || /[\x00-\x1f\x7f]/u.test(data.branch))) throw new Error(`${label}.branch is invalid.`);
39
+ if (data.dirty !== undefined && typeof data.dirty !== "boolean") throw new Error(`${label}.dirty is invalid.`);
40
+ return { ...(data.head !== undefined ? { head: data.head } : {}), ...(data.branch !== undefined ? { branch: data.branch } : {}), ...(data.dirty !== undefined ? { dirty: data.dirty } : {}) };
41
+ }
42
+ function resultGit(input: HerdrExternalEvidenceInput) { const initialGit = normalizeGit(input.initialGit, "initial Git evidence"), finalGit = normalizeGit(input.finalGit, "final Git evidence"); return { ...(initialGit ? { initialGit } : {}), ...(finalGit ? { finalGit } : {}) }; }
43
+ function atLeast(actual: [number, number, number], floor: [number, number, number]): boolean { return actual[0] > floor[0] || actual[0] === floor[0] && (actual[1] > floor[1] || actual[1] === floor[1] && actual[2] >= floor[2]); }
44
+ function requireHelp(help: string, values: string[], label: string): void { if (!/^(?:Usage:|Claude Code|Codex|Start the Cursor Agent)/u.test(help.trimStart())) throw new Error(`${label} help response has an unsupported header.`); for (const value of values) { const matches = help.match(new RegExp(`(^|\\s)${value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}(?=\\s|[=,.;:]|$)`, "gmu")); if (!matches?.length) throw new Error(`${label} help does not document required interactive option ${JSON.stringify(value)}.`); } }
45
+ function validateCommand(record: HerdrExternalCommandEvidence, binary: string, args: readonly string[], label: string): void {
46
+ if (!path.posix.isAbsolute(record.binary) || path.posix.basename(record.binary) !== binary || record.args.length !== args.length || record.args.some((value, index) => value !== args[index])) throw new Error(`${label} preflight command identity is invalid.`);
47
+ if (record.status !== 0) throw new Error(`${label} preflight exited ${record.status}: ${record.stderr.slice(0, 512)}`); for (const [name, value] of [["stdout", record.stdout], ["stderr", record.stderr]] as const) if (typeof value !== "string" || Buffer.byteLength(value) > MAX_PREFLIGHT_BYTES) throw new Error(`${label} preflight ${name} exceeded its bound.`);
48
+ }
49
+ function adapterKind(adapter: HerdrExternalAdapterId): HerdrExternalKind { return adapter.startsWith("claude") ? "claude" : adapter.startsWith("cursor") ? "cursor" : "codex"; }
50
+ function adapterBinary(adapter: HerdrExternalAdapterId): string { return adapterKind(adapter) === "claude" ? "claude" : adapterKind(adapter) === "cursor" ? "cursor-agent" : "codex"; }
51
+ function expectedStartedArgv(launch: HerdrExternalLaunch): string[] { return [launch.kind, ...launch.args]; }
52
+ function sameStrings(actual: unknown, expected: readonly string[]): actual is string[] { return Array.isArray(actual) && actual.length === expected.length && actual.every((value, index) => value === expected[index]); }
53
+ function validateStartedArgv(launch: HerdrExternalLaunch, actual: unknown): string[] { const expected = expectedStartedArgv(launch); if (!sameStrings(actual, expected)) throw new Error(`Herdr started ${launch.kind} with unexpected native argv.`); return [...actual]; }
54
+ function canonicalPreflightBinary(adapter: HerdrExternalAdapterId, evidence: HerdrExternalPreflightEvidence): string { const binary = evidence.version.binary; if (!path.posix.isAbsolute(binary) || evidence.help.binary !== binary || path.posix.basename(binary) !== adapterBinary(adapter)) throw new Error("External preflight canonical binary identity is inconsistent."); return binary; }
55
+ function matchesExternalProcess(entry: Record<string, unknown>, cwd: string, canonicalArgv0: string): boolean { const name = entry.name; return typeof entry.pid === "number" && typeof name === "string" && Boolean(name.trim()) && Buffer.byteLength(name) <= 128 && !/[\x00-\x1f\x7f]/u.test(name) && entry.argv0 === canonicalArgv0 && entry.cwd === cwd; }
56
+ export function reconcileHerdrExternalRun(identity: HerdrRunIdentity, candidate: HerdrReconnectCandidate) { const check = reconcileHerdrPlacedRun(identity, candidate, () => ({ ok: true, cursor: 0 })); if (!check.ok) return check; if (check.paneId !== identity.paneId) return { ok: false as const, reason: "External reconnect refused pane identity drift." }; return check; }
57
+
58
+ export function validateHerdrExternalPreflight(adapter: HerdrExternalAdapterId, evidence: HerdrExternalPreflightEvidence): void {
59
+ const kind = adapterKind(adapter), binary = adapterBinary(adapter); validateCommand(evidence.version, binary, ["--version"], binary); validateCommand(evidence.help, binary, ["--help"], binary);
60
+ canonicalPreflightBinary(adapter, evidence);
61
+ const version = evidence.version.stdout.trim(), match = kind === "claude" ? version.match(/^(\d+)\.(\d+)\.(\d+) \(Claude Code\)$/u) : kind === "codex" ? version.match(/^codex-cli (\d+)\.(\d+)\.(\d+)$/u) : version.match(/^(\d{4})\.(\d{2})\.(\d{2})-[0-9a-f]+$/u); if (!match) throw new Error(`Unsupported ${binary} version response: ${JSON.stringify(version)}.`);
62
+ const parsed: [number, number, number] = [Number(match[1]), Number(match[2]), Number(match[3])]; const floor: [number, number, number] = kind === "claude" ? [2, 1, 269] : kind === "codex" ? [0, 154, 0] : [2026, 9, 10]; if (!atLeast(parsed, floor)) throw new Error(`Remote ${binary} is below the tested pane-native capability floor.`);
63
+ requireHelp(evidence.help.stdout, kind === "claude" ? ["--session-id", "--restricted", "--permission-mode", "--tools", "--strict-mcp-config", "--mcp-config", "--disable-slash-commands", "--no-chrome"] : kind === "cursor" ? ["--mode", "--sandbox", "--workspace", "--trust"] : ["--sandbox", "--ask-for-approval", "--no-alt-screen"], binary);
64
+ }
65
+ function commandEvidence(binary: string, args: readonly string[], result: ReturnType<HerdrPlacedRunOwner["runRemote"]>): HerdrExternalCommandEvidence { return { binary, args, status: result.status ?? -1, stdout: String(result.stdout), stderr: String(result.stderr) }; }
66
+ export function runHerdrExternalPreflight(owner: HerdrPlacedRunOwner, adapter: HerdrExternalAdapterId): HerdrExternalPreflightEvidence {
67
+ const name = adapterBinary(adapter), located = owner.runRemote(remoteShellCommand(`command -v ${name}`), { timeout: 10_000, maxBuffer: 4096 }), binary = String(located.stdout).trim(); if (located.status !== 0 || !path.posix.isAbsolute(binary) || path.posix.basename(binary) !== name || binary.includes("\n")) throw new Error(`Remote canonical ${name} binary could not be resolved.`);
68
+ const invoke = (args: readonly string[]) => commandEvidence(binary, args, owner.runRemote(remoteShellCommand(adapterKind(adapter) === "cursor" ? `exec /usr/bin/env AGENT_CLI_CREDENTIAL_STORE=file ${shellQuoteRemote(binary)} "$@"` : `exec ${shellQuoteRemote(binary)} "$@"`, [...args]), { timeout: 10_000, maxBuffer: MAX_PREFLIGHT_BYTES })); const evidence = { version: invoke(["--version"]), help: invoke(["--help"]) }; validateHerdrExternalPreflight(adapter, evidence); return evidence;
69
+ }
70
+ export function createHerdrExternalAdapterLaunch(input: { adapter: HerdrExternalAdapterId; remoteRuntimeDir: string; cwd?: string; nativeSessionId?: string; model?: string; environment?: Readonly<Record<string, string>>; resources?: Readonly<Record<string, unknown>> }): HerdrExternalLaunch {
71
+ if (!path.posix.isAbsolute(input.remoteRuntimeDir) || path.posix.basename(input.remoteRuntimeDir).length < 8) throw new Error("External adapter requires the accepted run-private remote runtime root."); if (input.environment && Object.keys(input.environment).length) throw new Error("Pane-native external adapters reject caller environment bindings; credentials remain machine-owned."); if (input.resources && Object.keys(input.resources).length) throw new Error("Pane-native external adapters do not accept expanded prompts, local paths, callbacks, tools, skills, or MCP bindings."); if (input.model !== undefined) throw new Error("Pane-native M2b adapters use the remote managed model registry and reject model override.");
72
+ const nativeSessionId = input.nativeSessionId ?? randomUUID(); exactUuid(nativeSessionId, "External adapter native session identity"); const kind = adapterKind(input.adapter);
73
+ if (kind === "claude") {
74
+ const writer = input.adapter === "claude-code-writer";
75
+ return { adapter: input.adapter, kind, nativeSessionId, capabilities: CAPABILITIES, args: ["--session-id", nativeSessionId, "--restricted", "--permission-mode", writer ? "acceptEdits" : "plan", "--tools", writer ? "Read,Write,Edit,Glob,Grep" : "", "--strict-mcp-config", "--mcp-config", "{\"mcpServers\":{}}", "--disable-slash-commands", "--no-chrome"] };
76
+ }
77
+ if (kind === "cursor") { if (!input.cwd || !path.posix.isAbsolute(input.cwd)) throw new Error("Pane-native Cursor requires the exact remote-absolute owned workspace."); return { adapter: input.adapter, kind, nativeSessionId, capabilities: CAPABILITIES, args: [...(input.adapter === "cursor-agent" ? ["--mode", "ask"] : []), "--sandbox", "enabled", "--workspace", input.cwd] }; }
78
+ return { adapter: input.adapter, kind, nativeSessionId, capabilities: CAPABILITIES, args: ["--sandbox", input.adapter === "codex-exec-writer" ? "workspace-write" : "read-only", "--ask-for-approval", "never", "--no-alt-screen"] };
79
+ }
80
+
81
+ export interface HerdrCodexSnapshot { at: number; workspaceId: string; paneId: string; terminalId: string; pid: number; text: string; source?: "visible" | "recent_unwrapped" }
82
+ export interface HerdrCodexMonitorClock { now(): number; wait(ms: number): Promise<void> }
83
+ export class HerdrExternalNeedsAttentionError extends Error { readonly code = "HERDR_EXTERNAL_NEEDS_ATTENTION"; readonly identity: { machineId: string; workspaceId: string; paneId: string; terminalId: string }; constructor(message: string, identity: { machineId: string; workspaceId: string; paneId: string; terminalId: string }) { super(message); this.identity = identity; } }
84
+ function sanitizeTerminal(input: string): string { const clean = stripVTControlCharacters(input).replace(/\r/g, "").replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/gu, "").replace(/[ \t]+$/gmu, "").trim(); const bytes = Buffer.from(clean); return bytes.length <= CODEX_OUTPUT_BYTES ? clean : bytes.subarray(bytes.length - CODEX_OUTPUT_BYTES).toString("utf8").replace(/^\uFFFD/u, ""); }
85
+ function codexAttention(text: string): boolean { return /(?:trust this|do you trust the contents of this directory|approval required|approve\?|review (?:hook|action)|action required|permission required|error:|fatal:)/iu.test(text); }
86
+ function codexWorking(text: string): boolean { return /(?:working|thinking|running|esc to interrupt|ctrl\+c to interrupt|•\s*[^\n]+…)/iu.test(text); }
87
+ function codexReady(text: string): boolean { return /(?:›|>)\s*(?:Ask|Describe|Type)\b|(?:Ask|Describe) anything/iu.test(text); }
88
+ function codexSubmissionEnd(text: string, task: string): number {
89
+ const lines = text.split("\n").map((line) => line.trimEnd()), taskLines = task.split(/\r?\n/u).map((line) => line.trimEnd());
90
+ for (let index = 0; index < lines.length; index++) {
91
+ const first = lines[index]!.match(/^[›>]\s?(.*)$/u); if (!first || first[1] !== taskLines[0]) continue;
92
+ if (taskLines.slice(1).every((line, offset) => lines[index + offset + 1] === line)) return index + taskLines.length;
93
+ }
94
+ return -1;
95
+ }
96
+ function codexAssistantOutput(text: string, task: string): string {
97
+ const lines = text.split("\n").map((line) => line.trimEnd()), submittedEnd = codexSubmissionEnd(text, task); if (submittedEnd < 0) return ""; const after = lines.slice(submittedEnd).filter((line) => line.trim() && !codexReady(line) && !/^tokens? used\b/iu.test(line)); return after.join("\n").trim();
98
+ }
99
+ export async function monitorHerdrCodex(input: { machineId: string; task: string; preSubmitText: string; identity: Omit<HerdrCodexSnapshot, "at" | "text" | "source">; snapshot(): Promise<HerdrCodexSnapshot>; stop(): Promise<void>; timeoutMs?: number; clock?: HerdrCodexMonitorClock }): Promise<{ output: string; snapshots: number }> {
100
+ const clock = input.clock ?? { now: () => Date.now(), wait: (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) }, started = clock.now(), deadline = started + (input.timeoutMs ?? CODEX_DEFAULT_TIMEOUT_MS), expected = input.identity, before = sanitizeTerminal(input.preSubmitText); if (codexSubmissionEnd(before, input.task) >= 0) throw new HerdrExternalNeedsAttentionError("Codex pre-submit screen already contained the task; correlation is ambiguous.", { machineId: input.machineId, workspaceId: expected.workspaceId, paneId: expected.paneId, terminalId: expected.terminalId }); let previous = before, previousSource: HerdrCodexSnapshot["source"], lastChange = started, meaningful = false, stable = 0, reads = 0;
101
+ const attention = (message: string) => new HerdrExternalNeedsAttentionError(message, { machineId: input.machineId, workspaceId: expected.workspaceId, paneId: expected.paneId, terminalId: expected.terminalId });
102
+ while (clock.now() <= deadline) { const sample = await input.snapshot(); reads++; if (sample.workspaceId !== expected.workspaceId || sample.paneId !== expected.paneId || sample.terminalId !== expected.terminalId || sample.pid !== expected.pid) throw attention("Placed Codex identity drifted; truthful pane retained for inspection."); const text = sanitizeTerminal(sample.text), sourceChanged = previousSource !== undefined && sample.source !== previousSource; if (codexAttention(text)) throw attention("Placed Codex requires attention; truthful pane retained for inspection."); if (text !== previous || sourceChanged) { if (text !== previous) meaningful = true; previous = text; previousSource = sample.source; lastChange = clock.now(); stable = 0; } else { previousSource = sample.source; stable++; }
103
+ const output = codexAssistantOutput(text, input.task), quiet = clock.now() - lastChange >= CODEX_QUIET_MS; if (sample.source === "recent_unwrapped" && clock.now() - started >= CODEX_STARTUP_GRACE_MS && meaningful && quiet && stable >= 1 && !codexWorking(text) && codexReady(text) && output) { await input.stop(); return { output: sanitizeTerminal(output), snapshots: reads }; }
104
+ await clock.wait(CODEX_POLL_MS);
105
+ }
106
+ throw attention("Placed Codex settlement remained ambiguous until timeout; truthful pane retained for inspection.");
107
+ }
108
+ function normalizePlacedTerminal(input: HerdrExternalEvidenceInput, output: string, adapter: HerdrExternalAdapterId): HerdrExternalResult {
109
+ if (input.requestedModel !== undefined) throw new Error("Pane-native external adapters use the remote managed model registry and reject model override.");
110
+ return { protocol: 1, adapter, runId: input.runId, requestId: input.requestId, nativeSessionId: "unverified", nativeTurnId: "unverified", outcome: "partial", output: `[best-effort/unverified]\n${boundedString(sanitizeTerminal(output), "sanitized terminal output", CODEX_OUTPUT_BYTES)}`, settlement: { verification: "best-effort/unverified", evidence: "sanitized-terminal-snapshots" }, ...resultGit(input) };
111
+ }
112
+
113
+ export function createHerdrExternalAdapter(id: HerdrExternalAdapterId): HerdrExternalAdapter { const kind = adapterKind(id); return { id, kind, preflight: (evidence) => validateHerdrExternalPreflight(id, evidence), launch: (input) => createHerdrExternalAdapterLaunch({ adapter: id, ...input }), normalize: (input, evidence) => normalizePlacedTerminal(input, Buffer.isBuffer(evidence) ? evidence.toString("utf8") : evidence, id) }; }
114
+
115
+ function unwrap<T extends Record<string, unknown>>(value: unknown, type: string, key: string): T { if (!value || typeof value !== "object" || (value as Record<string, unknown>).type !== type || !(key in (value as Record<string, unknown>))) throw new Error(`Herdr returned invalid ${type} evidence.`); return (value as Record<string, T>)[key]!; }
116
+ export class HerdrExternalSession {
117
+ readonly owner: HerdrPlacedRunOwner; readonly launch: HerdrExternalLaunch; readonly preflight: HerdrExternalPreflightEvidence; readonly #adapter: HerdrExternalAdapter; readonly #connect: typeof connectHerdrMachine; #settled = false; #prompted = false; #nativePid?: number; #cursorWorkspace?: { realpath: string; device: number; inode: number; uid: number }; #reconnectPromise?: Promise<void>; #disposePromise?: Promise<void>;
118
+ #reconnectCandidatesRemaining = 3; #reconnectDeadline?: number; #reconnectFailure?: Error;
119
+ constructor(owner: HerdrPlacedRunOwner, launch: HerdrExternalLaunch, preflight: HerdrExternalPreflightEvidence, connect: typeof connectHerdrMachine = connectHerdrMachine) { this.owner = owner; this.launch = launch; this.preflight = preflight; this.#adapter = createHerdrExternalAdapter(launch.adapter); this.#connect = connect; }
120
+ settle(input: HerdrExternalEvidenceInput, evidence: Buffer | string): HerdrExternalResult { if (this.#settled || this.#disposePromise) throw new Error("Pane-native external run evidence already settled or disposed."); if (input.nativeSessionId !== this.launch.nativeSessionId) throw new Error("Pane-native external evidence session identity changed."); const result = this.#adapter.normalize(input, evidence); this.#settled = true; return result; }
121
+ async promptAndSettle(input: HerdrExternalEvidenceInput, options: { timeoutMs?: number; clock?: HerdrCodexMonitorClock; snapshot?: () => Promise<HerdrCodexSnapshot> } = {}): Promise<HerdrExternalResult> {
122
+ if (this.#prompted || this.#settled || this.#disposePromise) throw new Error("Pane-native external task was already submitted, settled, or disposed."); this.#prompted = true; if (!this.owner.agentName || !this.owner.owned || !this.owner.terminalId) throw new Error("Pane-native external owner identity is incomplete.");
123
+ let preSubmitText = "";
124
+ if (this.launch.kind === "cursor") { try { this.#cursorWorkspace = this.#proveCursorWorkspace(); } catch (error) { throw this.#needsAttention(`Placed Cursor requires attention before input: ${error instanceof Error ? error.message : String(error)}; truthful pane retained for inspection.`); } }
125
+ if (this.launch.kind === "cursor" || this.launch.kind === "codex") { const ready = await this.#waitForStartup(options.clock); preSubmitText = ready.text; this.#nativePid = ready.pid; }
126
+ else this.#nativePid = (await this.#exactProcess()).pid;
127
+ const waitTimeout = Math.min(Math.max(1, options.timeoutMs ?? 90_000), CODEX_DEFAULT_TIMEOUT_MS), params: Record<string, unknown> = { target: this.owner.agentName, text: input.task };
128
+ if (this.launch.kind !== "codex") params.wait = { until: ["idle", "done", "blocked"], timeout_ms: waitTimeout };
129
+ let response: unknown, recovered = false; try { response = await this.owner.connection.client.call("agent.prompt", params, waitTimeout + 5_000); } catch (error) { if (error instanceof HerdrRpcError || !(error instanceof HerdrTransportError)) throw error; if (this.owner.snapshot.connection !== "unknown") throw this.#needsAttention(`Placed external prompt settlement is unresolved: ${error.message}; truthful pane retained for inspection.`); await this.reconnect(); response = await this.owner.connection.client.call("agent.get", { target: this.owner.agentName }); recovered = true; }
130
+ const prompted = parseHerdrAgent(response, recovered ? "agent_info" : "agent_prompted"); if (!ownsHerdrPane(prompted, this.owner.terminalId, this.owner.owned.paneId)) throw new Error("Herdr prompt settlement identity changed.");
131
+ if (this.launch.kind !== "codex" && prompted.agent_status !== "idle" && prompted.agent_status !== "done") throw this.#needsAttention(`Herdr external prompt did not settle safely (status ${String(prompted.agent_status)}); truthful pane retained for inspection.`);
132
+ await this.#exactProcessAfterReconnect(this.#nativePid);
133
+ if (this.launch.kind === "cursor") this.#assertSameCursorWorkspace();
134
+ if (this.launch.kind !== "codex") {
135
+ const terminal = await this.#readSettledPane();
136
+ this.#settled = true;
137
+ return normalizePlacedTerminal(input, terminal, this.launch.adapter);
138
+ }
139
+ const expected = { workspaceId: this.owner.owned.workspaceId, paneId: this.owner.owned.paneId, terminalId: this.owner.terminalId, pid: this.#nativePid }, snapshot = options.snapshot ?? (() => this.#codexSnapshot(this.#nativePid!)); const monitored = await monitorHerdrCodex({ machineId: this.owner.machine.id, task: input.task, preSubmitText, identity: expected, snapshot, stop: () => this.owner.cleanup(true), timeoutMs: waitTimeout, clock: options.clock }); this.#settled = true; return normalizePlacedTerminal(input, monitored.output, this.launch.adapter);
140
+ }
141
+ #needsAttention(message: string): HerdrExternalNeedsAttentionError { return new HerdrExternalNeedsAttentionError(message, { machineId: this.owner.machine.id, workspaceId: this.owner.owned!.workspaceId, paneId: this.owner.owned!.paneId, terminalId: this.owner.terminalId! }); }
142
+ #proveCursorWorkspace(): { realpath: string; device: number; inode: number; uid: number } { const script = `const fs=require("node:fs"),p=process.argv[1],s=fs.lstatSync(p),r=fs.realpathSync(p),u=process.getuid();if(!s.isDirectory()||s.isSymbolicLink()||r!==p||s.uid!==u||(s.mode&18)!==0)process.exit(65);process.stdout.write(JSON.stringify({realpath:r,device:s.dev,inode:s.ino,uid:s.uid}))`, raw = this.#remoteEvidence(script, [this.owner.machine.cwd]); let value: unknown; try { value = JSON.parse(raw); } catch { throw new Error("Cursor workspace identity evidence is malformed."); } const data = value as Record<string, unknown>; if (!data || data.realpath !== this.owner.machine.cwd || !Number.isSafeInteger(data.device) || !Number.isSafeInteger(data.inode) || !Number.isSafeInteger(data.uid)) throw new Error("Cursor workspace is not the exact canonical owned safe directory."); return data as unknown as { realpath: string; device: number; inode: number; uid: number }; }
143
+ #assertSameCursorWorkspace(): void { const current = this.#proveCursorWorkspace(), expected = this.#cursorWorkspace; if (!expected || current.realpath !== expected.realpath || current.device !== expected.device || current.inode !== expected.inode || current.uid !== expected.uid) throw new Error("Cursor workspace identity changed before settlement."); }
144
+ async #readCurrentPane(): Promise<string> { const value = await this.owner.connection.client.call("pane.read", { pane_id: this.owner.owned!.paneId, source: "visible", strip_ansi: true }), read = unwrap<Record<string, unknown>>(value, "pane_read", "read"); if (read.pane_id !== this.owner.owned!.paneId) throw new Error("External pane read identity changed."); return String(read.text ?? ""); }
145
+ async #readSettledPane(): Promise<string> { const value = await this.owner.connection.client.call("pane.read", { pane_id: this.owner.owned!.paneId, source: "recent_unwrapped", lines: 400, strip_ansi: true }), read = unwrap<Record<string, unknown>>(value, "pane_read", "read"); if (read.pane_id !== this.owner.owned!.paneId || read.source !== "recent_unwrapped") throw new Error("External terminal evidence identity or source changed."); return String(read.text ?? ""); }
146
+ #cursorReady(text: string): boolean { if (/trust (?:this|workspace|folder)|untrusted/iu.test(text) || codexAttention(text)) throw this.#needsAttention("Placed Cursor requires trust or other attention before input; truthful pane retained for inspection."); return /(?:Ask|Plan|Agent)\b/iu.test(text); }
147
+ async #processProjection(): Promise<{ processes: Record<string, unknown>[]; canonical: Record<string, unknown>[] }> { validateStartedArgv(this.launch, this.owner.startedArgv); const canonicalArgv0 = path.posix.basename(canonicalPreflightBinary(this.launch.adapter, this.preflight)), value = await this.owner.connection.client.call("pane.process_info", { pane_id: this.owner.owned!.paneId }), info = unwrap<Record<string, unknown>>(value, "pane_process_info", "process_info"); if (info.pane_id !== this.owner.owned!.paneId) throw new Error("External process evidence pane identity changed."); if (!Array.isArray(info.foreground_processes)) throw new Error("External process evidence foreground process projection is malformed."); const processes = info.foreground_processes as Record<string, unknown>[]; return { processes, canonical: processes.filter((entry) => matchesExternalProcess(entry, this.owner.machine.cwd, canonicalArgv0)) }; }
148
+ async #exactProcess(requiredPid?: number): Promise<{ pid: number }> { const projection = await this.#processProjection(), canonical = projection.canonical[0]; if (projection.canonical.length !== 1 || requiredPid !== undefined && canonical?.pid !== requiredPid) throw new Error(`Could not prove exactly one canonical ${path.posix.basename(this.preflight.version.binary)} native PID with the exact cwd${requiredPid === undefined ? "" : " and retained PID"}.`); return { pid: canonical!.pid as number }; }
149
+ async #exactProcessAfterReconnect(requiredPid: number): Promise<{ pid: number }> { try { return await this.#exactProcess(requiredPid); } catch (error) { if (!(error instanceof HerdrTransportError) || this.owner.snapshot.connection !== "unknown") throw error; await this.reconnect(); return this.#exactProcess(requiredPid); } }
150
+ async #waitForStartup(clock: HerdrCodexMonitorClock = { now: () => Date.now(), wait: (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) }): Promise<{ pid: number; text: string }> { const started = clock.now(), deadline = started + EXTERNAL_STARTUP_TIMEOUT_MS; let last = "not ready"; for (;;) { const text = await this.#readCurrentPane(); let uiReady: boolean; if (this.launch.kind === "cursor") uiReady = this.#cursorReady(text); else { if (codexAttention(text)) throw this.#needsAttention("Placed Codex requires attention before input; truthful pane retained for inspection."); uiReady = codexReady(text); } const projection = await this.#processProjection(); const current = parseHerdrAgent(await this.owner.connection.client.call<Record<string, unknown>>("agent.get", { target: this.owner.agentName }), "agent_info"); if (!ownsHerdrPane(current, this.owner.terminalId!, this.owner.owned!.paneId) || current.name !== this.owner.agentName) throw new Error("External startup agent owner, pane, terminal, or name identity changed."); const status = current.agent_status; if (status === "blocked" || status === "action_required") throw this.#needsAttention(`Placed ${this.launch.kind === "cursor" ? "Cursor" : "Codex"} requires attention before input; truthful pane retained for inspection.`); if (current.interactive_ready === true && current.agent !== this.launch.kind) throw new Error("External startup agent kind identity changed."); const managedReady = current.agent === this.launch.kind && current.interactive_ready === true && current.launch_pending !== true && (status === "idle" || status === "done"); if (uiReady && projection.canonical.length === 1 && managedReady) return { pid: projection.canonical[0]!.pid as number, text }; last = `${uiReady ? "ready UI" : "startup UI"}; ${projection.canonical.length} canonical processes; managed ${managedReady ? "ready" : String(status ?? "unknown")}`; const now = clock.now(); if (now >= deadline) break; const poll = now - started < EXTERNAL_STARTUP_BACKOFF_AFTER_MS ? CODEX_POLL_MS : EXTERNAL_STARTUP_SLOW_POLL_MS; await clock.wait(Math.min(poll, deadline - now)); } throw this.#needsAttention(`Placed ${this.launch.kind === "cursor" ? "Cursor" : "Codex"} startup did not stabilize (${last}); truthful pane retained for inspection.`); }
151
+ async #codexSnapshotOnce(pid: number): Promise<HerdrCodexSnapshot> { const current = parseHerdrAgent(await this.owner.connection.client.call<Record<string, unknown>>("agent.get", { target: this.owner.agentName }), "agent_info"); if (!ownsHerdrPane(current, this.owner.terminalId!, this.owner.owned!.paneId)) throw new Error("Codex owner identity changed."); const status = current.agent_status, source = status === "idle" || status === "done" ? "recent_unwrapped" : "visible", process = await this.#exactProcess(pid), read = unwrap<Record<string, unknown>>(await this.owner.connection.client.call("pane.read", { pane_id: this.owner.owned!.paneId, source, lines: 400, strip_ansi: true }), "pane_read", "read"); if (read.pane_id !== this.owner.owned!.paneId || read.source !== source) throw new Error("Codex pane read identity or source changed."); return { at: Date.now(), workspaceId: this.owner.owned!.workspaceId, paneId: String(read.pane_id), terminalId: this.owner.terminalId!, pid: process.pid, text: String(read.text ?? ""), source }; }
152
+ async #codexSnapshot(pid: number): Promise<HerdrCodexSnapshot> { try { return await this.#codexSnapshotOnce(pid); } catch (error) { if (!(error instanceof HerdrTransportError) || this.owner.snapshot.connection !== "unknown") throw error; await this.reconnect(); return this.#codexSnapshotOnce(pid); } }
153
+ #remoteEvidence(script: string, args: string[]): string { const result = this.owner.runRemote(remoteShellCommand(`exec node -e ${shellQuoteRemote(script)} "$@"`, args), { timeout: 10_000, maxBuffer: MAX_EVIDENCE_BYTES }); if (result.status !== 0 || result.stderr) throw new Error(`Could not read exact owned external evidence: ${String(result.stderr).slice(0, 512)}`); return String(result.stdout); }
154
+ handleDisconnect(observed: HerdrForwardedConnection = this.owner.connection): void { const owner = this.owner as HerdrPlacedRunOwner & { markConnectionUnknown?: (connection: HerdrForwardedConnection) => boolean }; if (owner.markConnectionUnknown ? !owner.markConnectionUnknown(observed) : this.owner.connection !== observed) return; void this.reconnect().catch(() => {}); }
155
+ reconnect(): Promise<void> { if (this.#reconnectFailure) return Promise.reject(this.#reconnectFailure); return this.#reconnectPromise ??= this.#performReconnect().catch((error) => { const failure = error instanceof Error ? error : new Error(String(error)); if (/reconnect remains unknown/u.test(failure.message)) this.#reconnectFailure = failure; throw failure; }).finally(() => { this.#reconnectPromise = undefined; }); }
156
+ async #performReconnect(): Promise<void> { if (this.#disposePromise) throw new Error("External reconnect is blocked because disposal or retention has begun."); if (!this.owner.identity) throw new Error("External reconnect has no persisted owner identity."); this.#reconnectDeadline ??= Date.now() + 15_000; let last: unknown; while (this.#reconnectCandidatesRemaining > 0 && Date.now() < this.#reconnectDeadline) { this.#reconnectCandidatesRemaining--; let connection: HerdrForwardedConnection | undefined, unsubscribe = () => {}, adopted = false, candidateLost: Error | undefined; try { if (this.#disposePromise) throw new Error("External reconnect is blocked because disposal or retention has begun."); connection = await this.#connect(this.owner.machine); const value = await connection.client.call<Record<string, unknown>>("session.snapshot"), envelope = unwrap<Record<string, unknown>>(value, "session_snapshot", "snapshot"), raw = Array.isArray(envelope.agents) ? envelope.agents as Record<string, unknown>[] : [], agents = raw.map((agent) => ({ terminal_id: typeof agent.terminal_id === "string" ? agent.terminal_id : undefined, pane_id: typeof agent.pane_id === "string" ? agent.pane_id : undefined, agent_status: typeof agent.agent_status === "string" ? agent.agent_status : undefined }));
157
+ const check = reconcileHerdrExternalRun(this.owner.identity, { endpoint: connection.endpoint, agents, bridge: {} }); if (!check.ok) throw new Error(check.reason);
158
+ if (this.#nativePid !== undefined) { validateStartedArgv(this.launch, this.owner.startedArgv); const canonicalArgv0 = path.posix.basename(canonicalPreflightBinary(this.launch.adapter, this.preflight)), process = unwrap<Record<string, unknown>>(await connection.client.call("pane.process_info", { pane_id: this.owner.identity.paneId }), "pane_process_info", "process_info"), rows = Array.isArray(process.foreground_processes) ? process.foreground_processes as Record<string, unknown>[] : [], canonical = rows.filter((row) => matchesExternalProcess(row, this.owner.identity!.cwd, canonicalArgv0)); if (process.pane_id !== this.owner.identity.paneId || canonical.length !== 1 || canonical[0]!.pid !== this.#nativePid) throw new Error("External canonical native PID, cwd, or argv0 changed during reconnect."); }
159
+ const observed = connection; unsubscribe = await connection.client.subscribe(herdrStatusSubscriptions(check.paneId), (event) => this.owner.observeEvent?.(event), (error) => { if (!adopted) { candidateLost ??= error; return; } this.handleDisconnect(observed); }); if (candidateLost) throw candidateLost; if (this.#disposePromise) throw new Error("External reconnect is blocked because disposal or retention has begun."); adopted = true; await this.owner.replaceConnection({ connection, unsubscribe, paneId: check.paneId, state: check.state }); return;
160
+ } catch (error) { last = error; unsubscribe(); await connection?.close(); }
161
+ } if (this.#disposePromise) throw new Error("External reconnect is blocked because disposal or retention has begun."); throw new Error(`Pane-native external reconnect remains unknown: ${last instanceof Error ? last.message : String(last)}`); }
162
+ retain(): Promise<void> { return this.#disposePromise ??= this.owner.cleanup(false); }
163
+ abort(): Promise<void> { return this.#dispose(); } dispose(): Promise<void> { return this.#dispose(); } #dispose(): Promise<void> { return this.#disposePromise ??= this.owner.cleanup(true); }
164
+ }
165
+
166
+ export async function prepareInternalHerdrExternalAdapter(input: { adapter: HerdrExternalAdapterId; machine: HerdrMachineReference; runId: string }, launch: Omit<Parameters<typeof createHerdrExternalAdapterLaunch>[0], "adapter" | "remoteRuntimeDir" | "cwd">, createOwner: typeof HerdrPlacedRunOwner.create = HerdrPlacedRunOwner.create): Promise<HerdrExternalSession> {
167
+ let evidence: HerdrExternalPreflightEvidence | undefined; const owner = await createOwner(input.machine, input.runId, (owned) => { evidence = runHerdrExternalPreflight(owned, input.adapter); });
168
+ try { const descriptor = createHerdrExternalAdapterLaunch({ adapter: input.adapter, remoteRuntimeDir: owner.runtimeDir, ...launch, cwd: input.machine.cwd }); let session: HerdrExternalSession | undefined; const owned = await owner.provision({}); await owner.subscribe(() => {}, () => { void session?.reconnect().catch(() => {}); }); const agentName = `${descriptor.kind}-${input.runId.slice(-20)}`, started = await owner.start(descriptor.kind, agentName, descriptor.args); validateStartedArgv(descriptor, started.argv); owner.journal({ runId: input.runId, machineId: input.machine.id, target: input.machine.target, session: owner.connection.endpoint.session, workspaceId: owned.workspaceId, tabId: owned.tabId, paneId: owned.paneId, terminalId: started.terminalId, agentName, nativeSessionId: descriptor.nativeSessionId, cwd: input.machine.cwd, runtimeDir: owner.runtimeDir }); return session = new HerdrExternalSession(owner, descriptor, evidence!); } catch (error) { try { await owner.cleanup(true); } catch (cleanupError) { throw new AggregateError([error, cleanupError], "External adapter preparation and cleanup both failed.", { cause: error }); } throw error; }
169
+ }