@selesai/code 0.13.40 → 0.14.3

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 (1360) 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 +45 -7
  15. package/dist/config.js +134 -18
  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 +179 -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 +645 -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 +150 -0
  161. package/dist/extensions/jev/classifier.ts +191 -0
  162. package/dist/extensions/jev/decisions.test.ts +56 -47
  163. package/dist/extensions/jev/decisions.ts +94 -109
  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 +11 -39
  170. package/dist/extensions/jev-find-source.test.ts +26 -0
  171. package/dist/extensions/jev-find-source.ts +58 -19
  172. package/dist/extensions/jev-tool-ranker.test.ts +185 -0
  173. package/dist/extensions/jev-tool-ranker.ts +169 -0
  174. package/dist/{core → extensions}/llama/client.d.ts +2 -0
  175. package/dist/{core → extensions}/llama/client.js +7 -3
  176. package/dist/{core → extensions}/llama/index.js +13 -2
  177. package/dist/{core → extensions}/llama/provider.d.ts +1 -1
  178. package/dist/extensions/llama/provider.js +235 -0
  179. package/dist/extensions/mcp/cli.d.ts +20 -0
  180. package/dist/extensions/mcp/cli.js +496 -0
  181. package/dist/extensions/mcp/cli.lazy.d.ts +2 -0
  182. package/dist/extensions/mcp/cli.lazy.js +2 -0
  183. package/dist/extensions/mcp/config.d.ts +83 -0
  184. package/dist/extensions/mcp/config.js +193 -0
  185. package/dist/extensions/mcp/index.d.ts +78 -0
  186. package/dist/extensions/mcp/index.js +1201 -0
  187. package/dist/extensions/mcp/log.d.ts +15 -0
  188. package/dist/extensions/mcp/log.js +65 -0
  189. package/dist/extensions/mcp/oauth.d.ts +97 -0
  190. package/dist/extensions/mcp/oauth.js +401 -0
  191. package/dist/extensions/mcp/resources.d.ts +41 -0
  192. package/dist/extensions/mcp/resources.js +260 -0
  193. package/dist/extensions/mcp/runtime.d.ts +96 -0
  194. package/dist/extensions/mcp/runtime.js +412 -0
  195. package/dist/extensions/mcp/runtime.lazy.d.ts +2 -0
  196. package/dist/extensions/mcp/runtime.lazy.js +2 -0
  197. package/dist/extensions/mcp/tools.d.ts +86 -0
  198. package/dist/extensions/mcp/tools.js +252 -0
  199. package/dist/extensions/mcp/ui.d.ts +59 -0
  200. package/dist/extensions/mcp/ui.js +185 -0
  201. package/dist/extensions/package.json +2 -1
  202. package/dist/extensions/pi-graft/index.ts +4 -19
  203. package/dist/extensions/pi-graft/lifecycle.test.ts +32 -25
  204. package/dist/extensions/pi-graft/tools.ts +6 -0
  205. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +25 -0
  206. package/dist/extensions/pi-hermes-memory/README.md +140 -4
  207. package/dist/extensions/pi-hermes-memory/package-lock.json +624 -2720
  208. package/dist/extensions/pi-hermes-memory/package.json +9 -7
  209. package/dist/extensions/pi-hermes-memory/scripts/benchmark-memory-startup.mjs +72 -0
  210. package/dist/extensions/pi-hermes-memory/scripts/check-production-install.mjs +107 -0
  211. package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +2 -1
  212. package/dist/extensions/pi-hermes-memory/src/config.ts +35 -0
  213. package/dist/extensions/pi-hermes-memory/src/constants.ts +62 -15
  214. package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +374 -50
  215. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +7 -4
  216. package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +19 -14
  217. package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +75 -1
  218. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +322 -22
  219. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +8 -0
  220. package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +193 -54
  221. package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +6 -2
  222. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +33 -5
  223. package/dist/extensions/pi-hermes-memory/src/index.ts +116 -47
  224. package/dist/extensions/pi-hermes-memory/src/memory-initialization.ts +101 -0
  225. package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +10 -2
  226. package/dist/extensions/pi-hermes-memory/src/store/db.ts +34 -9
  227. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +44 -8
  228. package/dist/extensions/pi-hermes-memory/src/store/schema.ts +3 -1
  229. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +141 -0
  230. package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +17 -6
  231. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +20 -10
  232. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +1 -17
  233. package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +2 -10
  234. package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +4 -8
  235. package/dist/extensions/pi-hermes-memory/src/types.ts +48 -0
  236. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +108 -0
  237. package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +1185 -42
  238. package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +57 -1
  239. package/dist/extensions/pi-hermes-memory/tests/handlers/lazy-memory-hooks.test.ts +128 -0
  240. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +844 -1
  241. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +16 -0
  242. package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +512 -3
  243. package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +38 -0
  244. package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +183 -2
  245. package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +1 -3
  246. package/dist/extensions/pi-hermes-memory/tests/index.test.ts +17 -0
  247. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +21 -0
  248. package/dist/extensions/pi-hermes-memory/tests/lazy-startup.test.ts +313 -0
  249. package/dist/extensions/pi-hermes-memory/tests/memory-initialization.test.ts +182 -0
  250. package/dist/extensions/pi-hermes-memory/tests/prompt-injection.test.ts +184 -0
  251. package/dist/extensions/pi-hermes-memory/tests/skill-discovery-contract.test.ts +60 -0
  252. package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-lazy-probe.test.ts +80 -0
  253. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +2 -0
  254. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +79 -0
  255. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +268 -0
  256. package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +29 -0
  257. package/dist/extensions/pi-hermes-memory/tests/store/usage-tracking.test.ts +170 -0
  258. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +80 -1
  259. package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +51 -0
  260. package/dist/extensions/pi-intercom/CHANGELOG.md +66 -0
  261. package/dist/extensions/pi-intercom/README.md +100 -12
  262. package/dist/extensions/pi-intercom/broker/broker.ts +28 -12
  263. package/dist/extensions/pi-intercom/broker/client.ts +3 -0
  264. package/dist/extensions/pi-intercom/broker/cross-machine-provenance.test.ts +63 -0
  265. package/dist/extensions/pi-intercom/broker/protocol.ts +64 -0
  266. package/dist/extensions/pi-intercom/broker/spawn.test.ts +58 -167
  267. package/dist/extensions/pi-intercom/broker/spawn.ts +40 -87
  268. package/dist/extensions/pi-intercom/cli.mjs +6 -0
  269. package/dist/extensions/pi-intercom/cli.test.ts +428 -0
  270. package/dist/extensions/pi-intercom/cli.ts +343 -0
  271. package/dist/extensions/pi-intercom/config.test.ts +61 -1
  272. package/dist/extensions/pi-intercom/config.ts +53 -2
  273. package/dist/extensions/pi-intercom/cross-machine-discovery.test.ts +218 -0
  274. package/dist/extensions/pi-intercom/cross-machine-discovery.ts +140 -0
  275. package/dist/extensions/pi-intercom/cross-machine-envelope.test.ts +106 -0
  276. package/dist/extensions/pi-intercom/cross-machine-envelope.ts +92 -0
  277. package/dist/extensions/pi-intercom/cross-machine-integration.test.ts +25 -0
  278. package/dist/extensions/pi-intercom/cross-machine-transport.test.ts +106 -0
  279. package/dist/extensions/pi-intercom/cross-machine-transport.ts +110 -0
  280. package/dist/extensions/pi-intercom/extension-api.ts +14 -0
  281. package/dist/extensions/pi-intercom/handover.test.ts +88 -0
  282. package/dist/extensions/pi-intercom/handover.ts +115 -0
  283. package/dist/extensions/pi-intercom/herdr-location.test.ts +173 -0
  284. package/dist/extensions/pi-intercom/herdr-location.ts +137 -0
  285. package/dist/extensions/pi-intercom/human-priority.pi.test.ts +489 -0
  286. package/dist/extensions/pi-intercom/index.ts +582 -164
  287. package/dist/extensions/pi-intercom/intercom.integration.test.ts +590 -22
  288. package/dist/extensions/pi-intercom/package.json +12 -2
  289. package/dist/extensions/pi-intercom/project-agent.ts +1 -1
  290. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +26 -2
  291. package/dist/extensions/pi-intercom/test/handover-picker.test.ts +134 -0
  292. package/dist/extensions/pi-intercom/test/inline-message.test.ts +43 -0
  293. package/dist/extensions/pi-intercom/types.d.ts +247 -0
  294. package/dist/extensions/pi-intercom/types.js +2 -0
  295. package/dist/extensions/pi-intercom/types.ts +39 -1
  296. package/dist/extensions/pi-intercom/ui/handover-picker.ts +318 -0
  297. package/dist/extensions/pi-intercom/ui/inline-message.ts +10 -3
  298. package/dist/extensions/pi-intercom/ui/session-list.ts +28 -15
  299. package/dist/extensions/pi-subagents/.github/workflows/release.yml +5 -1
  300. package/dist/extensions/pi-subagents/.github/workflows/test.yml +188 -18
  301. package/dist/extensions/pi-subagents/CHANGELOG.md +514 -1
  302. package/dist/extensions/pi-subagents/README.md +7 -5
  303. package/dist/extensions/pi-subagents/VISION.md +6 -0
  304. package/dist/extensions/pi-subagents/agents/reviewer.md +7 -5
  305. package/dist/extensions/pi-subagents/agents/worker.md +1 -1
  306. package/dist/extensions/pi-subagents/docs/agents.md +75 -35
  307. package/dist/extensions/pi-subagents/docs/configuration.md +156 -25
  308. package/dist/extensions/pi-subagents/docs/extension-api.md +113 -29
  309. package/dist/extensions/pi-subagents/docs/missions.md +46 -14
  310. package/dist/extensions/pi-subagents/docs/models.md +22 -84
  311. package/dist/extensions/pi-subagents/docs/observability.md +49 -24
  312. package/dist/extensions/pi-subagents/docs/standalone-background.md +59 -0
  313. package/dist/extensions/pi-subagents/docs/tool-reference.md +167 -116
  314. package/dist/extensions/pi-subagents/docs/watchdog.md +41 -10
  315. package/dist/extensions/pi-subagents/docs/workflows.md +239 -163
  316. package/dist/extensions/pi-subagents/examples/typed-gate/.pi/agents/classifier.md +14 -0
  317. package/dist/extensions/pi-subagents/examples/typed-gate/README.md +42 -0
  318. package/dist/extensions/pi-subagents/examples/typed-gate/classify +38 -0
  319. package/dist/extensions/pi-subagents/examples/typed-gate/workflow.js +32 -0
  320. package/dist/extensions/pi-subagents/index.ts +11 -3
  321. package/dist/extensions/pi-subagents/inspector-runner.mjs +3 -3
  322. package/dist/extensions/pi-subagents/package-lock.json +517 -1129
  323. package/dist/extensions/pi-subagents/package.json +22 -11
  324. package/dist/extensions/pi-subagents/prompts/council.md +7 -4
  325. package/dist/extensions/pi-subagents/prompts/parallel-review.md +2 -2
  326. package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
  327. package/dist/extensions/pi-subagents/runner-peer-loader.mjs +21 -0
  328. package/dist/extensions/pi-subagents/runner-peer-preload.mjs +30 -0
  329. package/dist/extensions/pi-subagents/scripts/build-package.mjs +79 -0
  330. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +2 -2
  331. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +46 -27
  332. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +11 -7
  333. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +78 -73
  334. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +4 -5
  335. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +10 -2
  336. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +69 -67
  337. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +3 -3
  338. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +21 -10
  339. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +113 -113
  340. package/dist/extensions/pi-subagents/src/agents/agent-memory.ts +91 -4
  341. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +15 -9
  342. package/dist/extensions/pi-subagents/src/agents/agents.ts +432 -193
  343. package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +6 -1
  344. package/dist/extensions/pi-subagents/src/agents/global-npm-root.ts +58 -0
  345. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +5 -2
  346. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +22 -18
  347. package/dist/extensions/pi-subagents/src/agents/skills.ts +43 -10
  348. package/dist/extensions/pi-subagents/src/api/delegation.ts +20 -1
  349. package/dist/extensions/pi-subagents/src/api/inspectors.ts +27 -0
  350. package/dist/extensions/pi-subagents/src/api/preflight.ts +140 -62
  351. package/dist/extensions/pi-subagents/src/api/required-child-extensions.ts +6 -0
  352. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  353. package/dist/extensions/pi-subagents/src/extension/config.ts +24 -40
  354. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +4 -1
  355. package/dist/extensions/pi-subagents/src/extension/doctor.ts +18 -15
  356. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +87 -13
  357. package/dist/extensions/pi-subagents/src/extension/herdr-pi-bridge.ts +162 -0
  358. package/dist/extensions/pi-subagents/src/extension/index.ts +280 -268
  359. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +76 -37
  360. package/dist/extensions/pi-subagents/src/extension/reply-workflow-script.ts +67 -0
  361. package/dist/extensions/pi-subagents/src/extension/rpc.ts +34 -11
  362. package/dist/extensions/pi-subagents/src/extension/schemas.ts +116 -205
  363. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +13 -5
  364. package/dist/extensions/pi-subagents/src/extension/tool-activation.ts +146 -0
  365. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +77 -90
  366. package/dist/extensions/pi-subagents/src/extension/upgrade-notice.ts +40 -0
  367. package/dist/extensions/pi-subagents/src/inspectors/actions.ts +148 -0
  368. package/dist/extensions/pi-subagents/src/inspectors/ghostty/actions.ts +74 -0
  369. package/dist/extensions/pi-subagents/src/inspectors/ghostty/plugin.ts +29 -0
  370. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +100 -180
  371. package/dist/extensions/pi-subagents/src/inspectors/herdr/plugin.ts +20 -0
  372. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +2 -2
  373. package/dist/extensions/pi-subagents/src/inspectors/{herdr/inspector-runner.ts → inspector-runner.ts} +13 -13
  374. package/dist/extensions/pi-subagents/src/inspectors/plugins.ts +75 -0
  375. package/dist/extensions/pi-subagents/src/inspectors/{herdr/session-roots-codec.ts → session-roots-codec.ts} +4 -15
  376. package/dist/extensions/pi-subagents/src/inspectors/{herdr/shell-command.ts → shell-command.ts} +1 -1
  377. package/dist/extensions/pi-subagents/src/inspectors/types.ts +51 -0
  378. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +38 -53
  379. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +53 -9
  380. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +69 -55
  381. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +7 -2
  382. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +45 -32
  383. package/dist/extensions/pi-subagents/src/missions/store.ts +11 -2
  384. package/dist/extensions/pi-subagents/src/policy/authority.ts +5 -1
  385. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +30 -18
  386. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +59 -9
  387. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +18 -2
  388. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +463 -248
  389. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +106 -66
  390. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +33 -20
  391. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +47 -17
  392. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -5
  393. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +24 -11
  394. package/dist/extensions/pi-subagents/src/runs/background/await-async-run.ts +78 -0
  395. package/dist/extensions/pi-subagents/src/runs/background/binary-bootstrap.ts +66 -0
  396. package/dist/extensions/pi-subagents/src/runs/background/calendar-schedule.ts +90 -0
  397. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -2
  398. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +19 -38
  399. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +62 -3
  400. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +82 -10
  401. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +259 -21
  402. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +30 -3
  403. package/dist/extensions/pi-subagents/src/runs/background/pid-namespace.ts +18 -0
  404. package/dist/extensions/pi-subagents/src/runs/background/process-terminal-candidate.ts +98 -0
  405. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +18 -97
  406. package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +14 -5
  407. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +66 -12
  408. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +4 -3
  409. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +126 -45
  410. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +11 -6
  411. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +18 -7
  412. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +43 -51
  413. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +8 -1
  414. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +5 -4
  415. package/dist/extensions/pi-subagents/src/runs/background/runner-http-dispatcher.ts +119 -0
  416. package/dist/extensions/pi-subagents/src/runs/background/runner-startup-failure.ts +56 -0
  417. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +233 -69
  418. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +67 -16
  419. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +21 -3
  420. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner-bootstrap.ts +276 -0
  421. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +592 -573
  422. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +177 -29
  423. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +77 -28
  424. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +10 -4
  425. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +7 -13
  426. package/dist/extensions/pi-subagents/src/runs/background/workflow-terminal-proof.ts +41 -23
  427. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +19 -8
  428. package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +130 -7
  429. package/dist/extensions/pi-subagents/src/runs/foreground/command-action.ts +41 -0
  430. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +267 -385
  431. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +4 -2
  432. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +6 -10
  433. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1158 -413
  434. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +3 -1
  435. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +2 -1
  436. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +200 -74
  437. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +133 -34
  438. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +6 -1
  439. package/dist/extensions/pi-subagents/src/runs/shared/child-commands.ts +228 -0
  440. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +18 -18
  441. package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +16 -4
  442. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +55 -12
  443. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +6 -3
  444. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +11 -1
  445. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +367 -74
  446. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +50 -86
  447. package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +288 -0
  448. package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
  449. package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
  450. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +5 -5
  451. package/dist/extensions/pi-subagents/src/runs/shared/effective-system-prompt.ts +33 -0
  452. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +49 -10
  453. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +61 -9
  454. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +16 -9
  455. package/dist/extensions/pi-subagents/src/runs/shared/external-job-bridge.ts +55 -1
  456. package/dist/extensions/pi-subagents/src/runs/shared/git-environment.ts +1 -1
  457. package/dist/extensions/pi-subagents/src/runs/shared/herdr-connection.ts +134 -0
  458. package/dist/extensions/pi-subagents/src/runs/shared/herdr-external-adapters.ts +169 -0
  459. package/dist/extensions/pi-subagents/src/runs/shared/herdr-machine.ts +279 -0
  460. package/dist/extensions/pi-subagents/src/runs/shared/herdr-pi-protocol.ts +59 -0
  461. package/dist/extensions/pi-subagents/src/runs/shared/herdr-placed-run.ts +263 -0
  462. package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +6 -2
  463. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +108 -13
  464. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +23 -7
  465. package/dist/extensions/pi-subagents/src/runs/shared/model-resolution-diagnostic.ts +76 -0
  466. package/dist/extensions/pi-subagents/src/runs/shared/{model-fallback.ts → model-resolution.ts} +65 -245
  467. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +30 -11
  468. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +24 -3
  469. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +5 -4
  470. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +55 -7
  471. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +14 -4
  472. package/dist/extensions/pi-subagents/src/runs/shared/partial-output.ts +48 -0
  473. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +12 -4
  474. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +88 -1
  475. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +12 -3
  476. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +160 -9
  477. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +35 -34
  478. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +58 -19
  479. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +2 -2
  480. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +21 -0
  481. package/dist/extensions/pi-subagents/src/runs/shared/usage-reconciliation.ts +73 -0
  482. package/dist/extensions/pi-subagents/src/runs/shared/workflow-async-child-guidance.ts +18 -0
  483. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-apply.ts +160 -0
  484. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +42 -20
  485. package/dist/extensions/pi-subagents/src/runs/shared/worktree-lock.ts +29 -0
  486. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +27 -4
  487. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +94 -26
  488. package/dist/extensions/pi-subagents/src/shared/child-cache-retention.ts +43 -0
  489. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +5 -3
  490. package/dist/extensions/pi-subagents/src/shared/disabled-features.ts +123 -0
  491. package/dist/extensions/pi-subagents/src/shared/extension-context.ts +14 -1
  492. package/dist/extensions/pi-subagents/src/shared/file-lease.ts +74 -0
  493. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +27 -77
  494. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +70 -10
  495. package/dist/extensions/pi-subagents/src/shared/model-info.ts +10 -1
  496. package/dist/extensions/pi-subagents/src/shared/opencode-session-headers.ts +30 -0
  497. package/dist/extensions/pi-subagents/src/shared/package-version.ts +17 -0
  498. package/dist/extensions/pi-subagents/src/shared/parent-wake.ts +66 -0
  499. package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +71 -58
  500. package/dist/extensions/pi-subagents/src/shared/required-child-extensions.ts +115 -0
  501. package/dist/extensions/pi-subagents/src/shared/settings-file-lease.ts +36 -0
  502. package/dist/extensions/pi-subagents/src/shared/settings.ts +7 -4
  503. package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +1 -5
  504. package/dist/extensions/pi-subagents/src/shared/types.ts +146 -48
  505. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +28 -2
  506. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +15 -1
  507. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +19 -4
  508. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +13 -2
  509. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +15 -15
  510. package/dist/extensions/pi-subagents/src/slash/subagent-cost.ts +46 -9
  511. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +29 -16
  512. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +201 -26
  513. package/dist/extensions/pi-subagents/src/tui/fleet.ts +33 -16
  514. package/dist/extensions/pi-subagents/src/tui/render.ts +334 -103
  515. package/dist/extensions/pi-subagents/src/tui/running-tone.ts +28 -0
  516. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +27 -28
  517. package/dist/extensions/pi-subagents/src/watchdog/diff-tool.ts +47 -12
  518. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +2 -2
  519. package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +22 -2
  520. package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +17 -17
  521. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +24 -8
  522. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +43 -39
  523. package/dist/extensions/pi-subagents/src/watchdog/render.ts +2 -2
  524. package/dist/extensions/pi-subagents/src/watchdog/review.ts +127 -78
  525. package/dist/extensions/pi-subagents/src/watchdog/rules.ts +1 -1
  526. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +107 -31
  527. package/dist/extensions/pi-subagents/src/watchdog/scope.ts +1 -1
  528. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +22 -14
  529. package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +14 -13
  530. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +35 -6
  531. package/dist/extensions/pi-subagents/src/watchdog/types.ts +6 -4
  532. package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +2 -2
  533. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  534. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +500 -65
  535. package/dist/extensions/pi-subagents/src/workflows/structured-workflow-scripts.ts +177 -0
  536. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +8 -2
  537. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +5 -3
  538. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +70 -10
  539. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +57 -18
  540. package/dist/extensions/pi-subagents/src/workflows/workflow-reuse.ts +120 -0
  541. package/dist/extensions/pi-subagents/src/workflows/workflow-revival.ts +123 -0
  542. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +5 -2
  543. package/dist/extensions/pi-subagents/test/fixtures/cwd-workflow-child.ts +37 -0
  544. package/dist/extensions/pi-subagents/test/fixtures/herdr-allocation-lock-child.ts +16 -0
  545. package/dist/extensions/pi-subagents/test/fixtures/herdr-provision-child.ts +15 -0
  546. package/dist/extensions/pi-subagents/test/fixtures/native-nested-wait-provider.ts +76 -0
  547. package/dist/extensions/pi-subagents/test/fixtures/runner-bootstrap-harness.ts +36 -0
  548. package/dist/extensions/pi-subagents/test/fixtures/schedule-history-writer.mjs +48 -0
  549. package/dist/extensions/pi-subagents/test/fixtures/settings-race-writer.mjs +57 -0
  550. package/dist/extensions/pi-subagents/test/fixtures/workflow-cwd-access-failure.ts +33 -0
  551. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +40 -7
  552. package/dist/extensions/pi-subagents/test/integration/async-attention-clearing.test.ts +9 -8
  553. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +435 -276
  554. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +435 -397
  555. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +918 -497
  556. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +264 -17
  557. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +185 -22
  558. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +3 -2
  559. package/dist/extensions/pi-subagents/test/integration/claude-code-dispatch.test.ts +127 -0
  560. package/dist/extensions/pi-subagents/test/integration/deadline-checkpoint.test.ts +126 -0
  561. package/dist/extensions/pi-subagents/test/integration/doctor-executor.test.ts +29 -1
  562. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +88 -0
  563. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +450 -13
  564. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +10 -6
  565. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +105 -86
  566. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +403 -18
  567. package/dist/extensions/pi-subagents/test/integration/inline-workflow-visibility.test.ts +351 -0
  568. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +195 -10
  569. package/dist/extensions/pi-subagents/test/integration/model-resolution-diagnostic.test.ts +108 -0
  570. package/dist/extensions/pi-subagents/test/integration/nested-async-wait.test.ts +61 -0
  571. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +5 -4
  572. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +1 -1
  573. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +6 -4
  574. package/dist/extensions/pi-subagents/test/integration/render-widget-mouse.test.ts +84 -0
  575. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +242 -16
  576. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +2 -2
  577. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +158 -4
  578. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +1435 -248
  579. package/dist/extensions/pi-subagents/test/integration/single-execution.part-2.test.ts +454 -515
  580. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +140 -21
  581. package/dist/extensions/pi-subagents/test/integration/structured-workflows.test.ts +105 -0
  582. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +90 -11
  583. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +18 -15
  584. package/dist/extensions/pi-subagents/test/integration/workflow-worktree-admission.test.ts +100 -0
  585. package/dist/extensions/pi-subagents/test/smoke/clean-install.mjs +106 -0
  586. package/dist/extensions/pi-subagents/test/smoke/npm-background.mjs +43 -0
  587. package/dist/extensions/pi-subagents/test/smoke/packed-runner-selection.mjs +42 -0
  588. package/dist/extensions/pi-subagents/test/smoke/runner-loader-capability.mjs +50 -0
  589. package/dist/extensions/pi-subagents/test/smoke/sdk-child.ts +57 -0
  590. package/dist/extensions/pi-subagents/test/smoke/{pi085-extension.ts → sdk-extension.ts} +2 -2
  591. package/dist/extensions/pi-subagents/test/smoke/standalone-background.mjs +140 -0
  592. package/dist/extensions/pi-subagents/test/smoke/standalone-fault.ts +43 -0
  593. package/dist/extensions/pi-subagents/test/smoke/standalone-matrix.mjs +65 -0
  594. package/dist/extensions/pi-subagents/test/smoke/standalone-observer.ts +8 -0
  595. package/dist/extensions/pi-subagents/test/smoke/standalone-parent.ts +220 -0
  596. package/dist/extensions/pi-subagents/test/smoke/standalone-provider.ts +58 -0
  597. package/dist/extensions/pi-subagents/test/smoke/standalone-release.json +8 -0
  598. package/dist/extensions/pi-subagents/test/smoke/standalone-revival.ts +109 -0
  599. package/dist/extensions/pi-subagents/test/smoke/standalone-shared.ts +79 -0
  600. package/dist/extensions/pi-subagents/test/smoke/tool-activation.test.ts +128 -0
  601. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +6 -25
  602. package/dist/extensions/pi-subagents/test/support/async-result-timeout-evidence.ts +61 -0
  603. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +122 -9
  604. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +15 -7
  605. package/dist/extensions/pi-subagents/test/support/helpers.ts +11 -14
  606. package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +21 -3
  607. package/dist/extensions/pi-subagents/test/support/native-peer-loader.mjs +15 -0
  608. package/dist/extensions/pi-subagents/test/support/node-command.ts +29 -6
  609. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +5 -3
  610. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +7 -15
  611. package/dist/extensions/pi-subagents/test/support/watchdog-stable-host-loader.mjs +23 -0
  612. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +3 -3
  613. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +158 -155
  614. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +52 -1
  615. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +21 -17
  616. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +105 -36
  617. package/dist/extensions/pi-subagents/test/unit/advertisement-barrier.test.ts +151 -0
  618. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -2
  619. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +33 -3
  620. package/dist/extensions/pi-subagents/test/unit/agent-end-auto-drain.test.ts +149 -0
  621. package/dist/extensions/pi-subagents/test/unit/agent-exclude-dirs.test.ts +246 -0
  622. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +62 -87
  623. package/dist/extensions/pi-subagents/test/unit/agent-global-root-override.test.ts +86 -0
  624. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +398 -48
  625. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +126 -1
  626. package/dist/extensions/pi-subagents/test/unit/agent-name-resolution.test.ts +75 -0
  627. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +94 -42
  628. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +73 -3
  629. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +428 -2
  630. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +4 -4
  631. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +112 -1
  632. package/dist/extensions/pi-subagents/test/unit/async-result-timeout-evidence.test.ts +53 -0
  633. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +92 -4
  634. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +58 -6
  635. package/dist/extensions/pi-subagents/test/unit/async-run-history.test.ts +123 -0
  636. package/dist/extensions/pi-subagents/test/unit/async-spawn-package-dir.test.ts +203 -0
  637. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +26 -35
  638. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +185 -0
  639. package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +9 -1
  640. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +106 -1
  641. package/dist/extensions/pi-subagents/test/unit/await-async-run.test.ts +202 -0
  642. package/dist/extensions/pi-subagents/test/unit/binary-async-spawn.test.ts +115 -0
  643. package/dist/extensions/pi-subagents/test/unit/binary-pi-spawn.test.ts +27 -0
  644. package/dist/extensions/pi-subagents/test/unit/calendar-schedule.test.ts +70 -0
  645. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +38 -0
  646. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +10 -2
  647. package/dist/extensions/pi-subagents/test/unit/changelog-format.test.ts +11 -0
  648. package/dist/extensions/pi-subagents/test/unit/child-cache-retention.test.ts +87 -0
  649. package/dist/extensions/pi-subagents/test/unit/child-commands.test.ts +243 -0
  650. package/dist/extensions/pi-subagents/test/unit/child-external-job-bridge.test.ts +126 -0
  651. package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +12 -1
  652. package/dist/extensions/pi-subagents/test/unit/child-lifecycle.test.ts +36 -0
  653. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +24 -0
  654. package/dist/extensions/pi-subagents/test/unit/child-session-commands.test.ts +162 -0
  655. package/dist/extensions/pi-subagents/test/unit/child-session-host-sdk.test.ts +226 -0
  656. package/dist/extensions/pi-subagents/test/unit/child-session-parent-providers.test.ts +200 -0
  657. package/dist/extensions/pi-subagents/test/unit/child-session-queued.test.ts +260 -0
  658. package/dist/extensions/pi-subagents/test/unit/child-tool-plan-permission-system.test.ts +3 -98
  659. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +222 -1
  660. package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +314 -0
  661. package/dist/extensions/pi-subagents/test/unit/claude-code-dispatch.test.ts +182 -0
  662. package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +157 -0
  663. package/dist/extensions/pi-subagents/test/unit/command-action.test.ts +50 -0
  664. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +25 -11
  665. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +3 -1
  666. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +18 -0
  667. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +7 -1
  668. package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +220 -0
  669. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +104 -32
  670. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +138 -1
  671. package/dist/extensions/pi-subagents/test/unit/disabled-features.test.ts +227 -0
  672. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +48 -9
  673. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +7 -4
  674. package/dist/extensions/pi-subagents/test/unit/extension-lazy-loading.test.ts +21 -0
  675. package/dist/extensions/pi-subagents/test/unit/extension-maintenance-lifecycle.test.ts +66 -0
  676. package/dist/extensions/pi-subagents/test/unit/extension-module-preload.test.ts +49 -0
  677. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +104 -3
  678. package/dist/extensions/pi-subagents/test/unit/file-lease.test.ts +17 -0
  679. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +316 -0
  680. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +58 -7
  681. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +25 -96
  682. package/dist/extensions/pi-subagents/test/unit/ghostty-inspector.test.ts +92 -0
  683. package/dist/extensions/pi-subagents/test/unit/global-npm-root.test.ts +108 -0
  684. package/dist/extensions/pi-subagents/test/unit/herdr-connection.test.ts +43 -0
  685. package/dist/extensions/pi-subagents/test/unit/herdr-external-adapters.test.ts +89 -0
  686. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +11 -20
  687. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +113 -19
  688. package/dist/extensions/pi-subagents/test/unit/herdr-machine.test.ts +161 -0
  689. package/dist/extensions/pi-subagents/test/unit/herdr-native-placement.test.ts +187 -0
  690. package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +7 -12
  691. package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
  692. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +182 -87
  693. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +68 -49
  694. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +295 -135
  695. package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +3 -3
  696. package/dist/extensions/pi-subagents/test/unit/inspector-authority-policy.test.ts +144 -0
  697. package/dist/extensions/pi-subagents/test/unit/inspector-registration.test.ts +128 -0
  698. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +49 -1
  699. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +74 -1
  700. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-resolution.test.ts +112 -0
  701. package/dist/extensions/pi-subagents/test/unit/mission-global-projection.test.ts +215 -0
  702. package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +65 -1
  703. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +2 -1
  704. package/dist/extensions/pi-subagents/test/unit/model-resolution-diagnostic.test.ts +78 -0
  705. package/dist/extensions/pi-subagents/test/unit/model-resolution.test.ts +153 -0
  706. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +43 -1
  707. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +1 -21
  708. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +279 -2
  709. package/dist/extensions/pi-subagents/test/unit/nested-control-fanout.test.ts +73 -0
  710. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +297 -3
  711. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +1 -1
  712. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +431 -23
  713. package/dist/extensions/pi-subagents/test/unit/opencode-session-headers.test.ts +32 -0
  714. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +89 -21
  715. package/dist/extensions/pi-subagents/test/unit/owned-process-tree.test.ts +31 -1
  716. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +18 -24
  717. package/dist/extensions/pi-subagents/test/unit/parent-wake.test.ts +206 -0
  718. package/dist/extensions/pi-subagents/test/unit/partial-output.test.ts +53 -0
  719. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +216 -32
  720. package/dist/extensions/pi-subagents/test/unit/pi-spawn-host-root.test.ts +82 -0
  721. package/dist/extensions/pi-subagents/test/unit/pi-subagents-policy-guidance.test.ts +28 -0
  722. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +193 -104
  723. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +16 -1
  724. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +17 -1
  725. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +89 -9
  726. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +6 -0
  727. package/dist/extensions/pi-subagents/test/unit/prompt-audit-provider-routing.test.ts +69 -0
  728. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +2 -2
  729. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +23 -1
  730. package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +117 -3
  731. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +35 -14
  732. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +3 -2
  733. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +261 -9
  734. package/dist/extensions/pi-subagents/test/unit/reply-workflow-script.test.ts +37 -0
  735. package/dist/extensions/pi-subagents/test/unit/required-child-extensions.test.ts +114 -0
  736. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +11 -1
  737. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +22 -2
  738. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +125 -18
  739. package/dist/extensions/pi-subagents/test/unit/run-child-session.test.ts +230 -0
  740. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +50 -1
  741. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +301 -4
  742. package/dist/extensions/pi-subagents/test/unit/runner-bootstrap.test.ts +182 -0
  743. package/dist/extensions/pi-subagents/test/unit/runner-http-dispatcher.test.ts +136 -0
  744. package/dist/extensions/pi-subagents/test/unit/runner-peer-loader.test.ts +68 -0
  745. package/dist/extensions/pi-subagents/test/unit/runner-peer-symlinks.test.ts +50 -0
  746. package/dist/extensions/pi-subagents/test/unit/running-tone.test.ts +13 -0
  747. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +155 -4
  748. package/dist/extensions/pi-subagents/test/unit/schedule-claim-initialization.test.ts +71 -0
  749. package/dist/extensions/pi-subagents/test/unit/schedule-claim-preservation.test.ts +98 -0
  750. package/dist/extensions/pi-subagents/test/unit/schedule-history-transactions.test.ts +201 -0
  751. package/dist/extensions/pi-subagents/test/unit/scheduled-mission.test.ts +317 -0
  752. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +412 -11
  753. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +2 -8
  754. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +70 -71
  755. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +748 -5
  756. package/dist/extensions/pi-subagents/test/unit/session-liveness-delivery.test.ts +337 -0
  757. package/dist/extensions/pi-subagents/test/unit/settings-atomic-save.test.ts +419 -0
  758. package/dist/extensions/pi-subagents/test/unit/settings-transactions.test.ts +88 -0
  759. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -1
  760. package/dist/extensions/pi-subagents/test/unit/skills-disable-model-invocation.test.ts +164 -0
  761. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +35 -2
  762. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +2 -2
  763. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +334 -9
  764. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +170 -0
  765. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +34 -5
  766. package/dist/extensions/pi-subagents/test/unit/structured-output-validation.test.ts +199 -0
  767. package/dist/extensions/pi-subagents/test/unit/structured-workflow-resources.test.ts +241 -0
  768. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +47 -38
  769. package/dist/extensions/pi-subagents/test/unit/subagent-cost.test.ts +97 -0
  770. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +10 -0
  771. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +343 -44
  772. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +410 -11
  773. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +459 -22
  774. package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +43 -3
  775. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +11 -1
  776. package/dist/extensions/pi-subagents/test/unit/tool-activation-stale-peer.test.ts +32 -0
  777. package/dist/extensions/pi-subagents/test/unit/tool-activation.test.ts +313 -0
  778. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +14 -0
  779. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -89
  780. package/dist/extensions/pi-subagents/test/unit/typed-gate-output.test.ts +141 -0
  781. package/dist/extensions/pi-subagents/test/unit/upgrade-notice.test.ts +31 -0
  782. package/dist/extensions/pi-subagents/test/unit/usage-reconciliation-owners.test.ts +66 -0
  783. package/dist/extensions/pi-subagents/test/unit/usage-reconciliation.test.ts +23 -0
  784. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +195 -1
  785. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +3 -1
  786. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +48 -45
  787. package/dist/extensions/pi-subagents/test/unit/watchdog-compaction-scope.test.ts +94 -0
  788. package/dist/extensions/pi-subagents/test/unit/watchdog-diff-tool.test.ts +48 -3
  789. package/dist/extensions/pi-subagents/test/unit/watchdog-native-scheduling.test.ts +107 -0
  790. package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +95 -7
  791. package/dist/extensions/pi-subagents/test/unit/watchdog-register-child.test.ts +79 -0
  792. package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +7 -4
  793. package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +111 -24
  794. package/dist/extensions/pi-subagents/test/unit/watchdog-rules.test.ts +1 -1
  795. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +283 -2
  796. package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +3 -0
  797. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +12 -1
  798. package/dist/extensions/pi-subagents/test/unit/watchdog-stable-host-layout.test.ts +23 -0
  799. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +30 -0
  800. package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +39 -2
  801. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +18 -1
  802. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +8 -4
  803. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +10 -0
  804. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +6 -3
  805. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +44 -1
  806. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +28 -1
  807. package/dist/extensions/pi-subagents/test/unit/workflow-revival.test.ts +85 -0
  808. package/dist/extensions/pi-subagents/test/unit/workflow-scripts-feature.test.ts +177 -0
  809. package/dist/extensions/pi-subagents/test/unit/workflow-terminal-proof.test.ts +8 -0
  810. package/dist/extensions/pi-subagents/test/unit/workflow-worktree-admission.test.ts +29 -0
  811. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +343 -4
  812. package/dist/extensions/pi-subagents/test/unit/worktree-lock.test.ts +123 -0
  813. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +252 -22
  814. package/dist/extensions/pi-subagents/tsconfig.build.json +13 -0
  815. package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +1 -1
  816. package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +1 -1
  817. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +24 -1
  818. package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +6 -2
  819. package/dist/extensions/pi-web-agent/src/extension.ts +1 -5
  820. package/dist/extensions/pi-zentui/.github/workflows/ci.yml +67 -4
  821. package/dist/extensions/pi-zentui/AGENTS.md +3 -2
  822. package/dist/extensions/pi-zentui/README.md +60 -32
  823. package/dist/extensions/pi-zentui/docs/configuration.md +662 -51
  824. package/dist/extensions/pi-zentui/docs/footer-format.md +174 -5
  825. package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-editor.ts +15 -4
  826. package/dist/extensions/pi-zentui/extensions/zentui/average-token-rate.ts +146 -0
  827. package/dist/extensions/pi-zentui/extensions/zentui/codex-quota-display.ts +34 -0
  828. package/dist/extensions/pi-zentui/extensions/zentui/codex-quota.ts +298 -0
  829. package/dist/extensions/pi-zentui/extensions/zentui/component-colors.ts +172 -0
  830. package/dist/extensions/pi-zentui/extensions/zentui/component-settings.ts +243 -0
  831. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +851 -114
  832. package/dist/extensions/pi-zentui/extensions/zentui/custom-value-colors.ts +93 -0
  833. package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-demand.ts +61 -0
  834. package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-format.ts +80 -0
  835. package/dist/extensions/pi-zentui/extensions/zentui/custom-variables.ts +152 -0
  836. package/dist/extensions/pi-zentui/extensions/zentui/editor-metadata-format.ts +138 -23
  837. package/dist/extensions/pi-zentui/extensions/zentui/editor-mouse.ts +89 -0
  838. package/dist/extensions/pi-zentui/extensions/zentui/extension-status-controller.ts +148 -0
  839. package/dist/extensions/pi-zentui/extensions/zentui/extension-status-settings.ts +40 -0
  840. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +109 -1
  841. package/dist/extensions/pi-zentui/extensions/zentui/footer-format.ts +203 -23
  842. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +80 -3
  843. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +1 -1
  844. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +432 -125
  845. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +92 -4
  846. package/dist/extensions/pi-zentui/extensions/zentui/git.ts +47 -30
  847. package/dist/extensions/pi-zentui/extensions/zentui/github-status.ts +575 -0
  848. package/dist/extensions/pi-zentui/extensions/zentui/host-project-changes.ts +25 -0
  849. package/dist/extensions/pi-zentui/extensions/zentui/host-template-values.ts +29 -0
  850. package/dist/extensions/pi-zentui/extensions/zentui/icons.ts +53 -13
  851. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +778 -258
  852. package/dist/extensions/pi-zentui/extensions/zentui/interaction-summary.ts +70 -5
  853. package/dist/extensions/pi-zentui/extensions/zentui/layered-editor.ts +55 -0
  854. package/dist/extensions/pi-zentui/extensions/zentui/live-context.ts +6 -1
  855. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-demand.ts +72 -0
  856. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-display.ts +21 -0
  857. package/dist/extensions/pi-zentui/extensions/zentui/live-metadata.ts +255 -0
  858. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-editor.ts +476 -36
  859. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-settings.ts +118 -0
  860. package/dist/extensions/pi-zentui/extensions/zentui/minimalist-template.ts +177 -0
  861. package/dist/extensions/pi-zentui/extensions/zentui/omp-editor-frame.ts +148 -0
  862. package/dist/extensions/pi-zentui/extensions/zentui/omp-statusline.ts +569 -0
  863. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-lookups.ts +344 -0
  864. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-metrics.ts +91 -0
  865. package/dist/extensions/pi-zentui/extensions/zentui/omp-template-modes.ts +323 -0
  866. package/dist/extensions/pi-zentui/extensions/zentui/omp-ui.ts +210 -0
  867. package/dist/extensions/pi-zentui/extensions/zentui/package-version.ts +30 -12
  868. package/dist/extensions/pi-zentui/extensions/zentui/project-demand.ts +46 -0
  869. package/dist/extensions/pi-zentui/extensions/zentui/project-discovery.ts +58 -0
  870. package/dist/extensions/pi-zentui/extensions/zentui/project-refresh.ts +10 -3
  871. package/dist/extensions/pi-zentui/extensions/zentui/project-state.ts +37 -0
  872. package/dist/extensions/pi-zentui/extensions/zentui/repository-root.ts +1 -0
  873. package/dist/extensions/pi-zentui/extensions/zentui/runtime.ts +119 -43
  874. package/dist/extensions/pi-zentui/extensions/zentui/selector-border.ts +40 -29
  875. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +1268 -722
  876. package/dist/extensions/pi-zentui/extensions/zentui/settings-keys.ts +59 -0
  877. package/dist/extensions/pi-zentui/extensions/zentui/settings-list-selection.ts +13 -0
  878. package/dist/extensions/pi-zentui/extensions/zentui/settings-previews.ts +11 -4
  879. package/dist/extensions/pi-zentui/extensions/zentui/state.ts +24 -11
  880. package/dist/extensions/pi-zentui/extensions/zentui/style.ts +6 -0
  881. package/dist/extensions/pi-zentui/extensions/zentui/telemetry.ts +113 -11
  882. package/dist/extensions/pi-zentui/extensions/zentui/thinking-experimental.ts +234 -46
  883. package/dist/extensions/pi-zentui/extensions/zentui/thinking-steps.ts +20 -5
  884. package/dist/extensions/pi-zentui/extensions/zentui/token-rate.ts +313 -0
  885. package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-format.ts +59 -0
  886. package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-rate.ts +52 -0
  887. package/dist/extensions/pi-zentui/extensions/zentui/ui.ts +640 -172
  888. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +72 -34
  889. package/dist/extensions/pi-zentui/extensions/zentui/user-message.ts +219 -34
  890. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +495 -119
  891. package/dist/extensions/pi-zentui/omp.ts +157 -0
  892. package/dist/extensions/pi-zentui/package-lock.json +3762 -1507
  893. package/dist/extensions/pi-zentui/package.json +50 -12
  894. package/dist/extensions/pi-zentui/test/accent-rail-editor.test.ts +13 -2
  895. package/dist/extensions/pi-zentui/test/average-token-rate.test.ts +297 -0
  896. package/dist/extensions/pi-zentui/test/behavior-compatibility.mjs +89 -0
  897. package/dist/extensions/pi-zentui/test/codex-quota-lifecycle.test.ts +284 -0
  898. package/dist/extensions/pi-zentui/test/codex-quota-rendering.test.ts +466 -0
  899. package/dist/extensions/pi-zentui/test/codex-quota.test.ts +440 -0
  900. package/dist/extensions/pi-zentui/test/component-colors.test.ts +554 -0
  901. package/dist/extensions/pi-zentui/test/component-settings.test.ts +364 -0
  902. package/dist/extensions/pi-zentui/test/config-component-independence.test.ts +402 -0
  903. package/dist/extensions/pi-zentui/test/config-extension-status-choice.test.ts +233 -0
  904. package/dist/extensions/pi-zentui/test/config-hidden-extension-status-colors.test.ts +118 -0
  905. package/dist/extensions/pi-zentui/test/config-hidden-extension-status-placement.test.ts +142 -0
  906. package/dist/extensions/pi-zentui/test/config-minimalist-templates.test.ts +240 -0
  907. package/dist/extensions/pi-zentui/test/config-template-variables.test.ts +85 -0
  908. package/dist/extensions/pi-zentui/test/config.test.ts +80 -17
  909. package/dist/extensions/pi-zentui/test/custom-value-colors-integration.test.ts +453 -0
  910. package/dist/extensions/pi-zentui/test/custom-value-colors.test.ts +399 -0
  911. package/dist/extensions/pi-zentui/test/custom-variable-alias-prototypes.test.ts +177 -0
  912. package/dist/extensions/pi-zentui/test/custom-variable-consumers.test.ts +194 -0
  913. package/dist/extensions/pi-zentui/test/custom-variable-demand.test.ts +169 -0
  914. package/dist/extensions/pi-zentui/test/custom-variable-probe-reservation.test.ts +141 -0
  915. package/dist/extensions/pi-zentui/test/custom-variables-lifecycle.integration.test.ts +365 -0
  916. package/dist/extensions/pi-zentui/test/custom-variables.test.ts +330 -0
  917. package/dist/extensions/pi-zentui/test/editor-metadata-format.test.ts +121 -0
  918. package/dist/extensions/pi-zentui/test/editor-mouse.test.ts +507 -0
  919. package/dist/extensions/pi-zentui/test/editor-viewport-indicators.test.ts +247 -20
  920. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +204 -260
  921. package/dist/extensions/pi-zentui/test/extension-status-controller.test.ts +323 -0
  922. package/dist/extensions/pi-zentui/test/extension-status-lifecycle.integration.test.ts +466 -0
  923. package/dist/extensions/pi-zentui/test/extension-status-settings.test.ts +79 -0
  924. package/dist/extensions/pi-zentui/test/footer-alignment.test.ts +135 -0
  925. package/dist/extensions/pi-zentui/test/footer-authority.test.ts +69 -0
  926. package/dist/extensions/pi-zentui/test/footer-auto-compaction.test.ts +148 -0
  927. package/dist/extensions/pi-zentui/test/footer-format-cache.test.ts +186 -0
  928. package/dist/extensions/pi-zentui/test/footer-format.test.ts +154 -4
  929. package/dist/extensions/pi-zentui/test/footer-hidden.test.ts +312 -0
  930. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +22 -0
  931. package/dist/extensions/pi-zentui/test/footer-layout.test.ts +80 -0
  932. package/dist/extensions/pi-zentui/test/footer-thinking-level.test.ts +123 -0
  933. package/dist/extensions/pi-zentui/test/format.test.ts +75 -1
  934. package/dist/extensions/pi-zentui/test/git-probes.test.ts +182 -0
  935. package/dist/extensions/pi-zentui/test/github-status.test.ts +931 -0
  936. package/dist/extensions/pi-zentui/test/host-template-surfaces.test.ts +287 -0
  937. package/dist/extensions/pi-zentui/test/icons.test.ts +86 -16
  938. package/dist/extensions/pi-zentui/test/layered-editor.test.ts +53 -0
  939. package/dist/extensions/pi-zentui/test/live-context-integration.test.ts +154 -7
  940. package/dist/extensions/pi-zentui/test/live-context.test.ts +45 -0
  941. package/dist/extensions/pi-zentui/test/live-metadata-lifecycle.integration.test.ts +963 -0
  942. package/dist/extensions/pi-zentui/test/live-metadata.test.ts +767 -0
  943. package/dist/extensions/pi-zentui/test/minimalist-cache-hit-colors.test.ts +183 -0
  944. package/dist/extensions/pi-zentui/test/minimalist-editor.test.ts +222 -4
  945. package/dist/extensions/pi-zentui/test/minimalist-settings.test.ts +103 -0
  946. package/dist/extensions/pi-zentui/test/minimalist-templates.test.ts +489 -0
  947. package/dist/extensions/pi-zentui/test/omp-editor-composers.test.ts +324 -0
  948. package/dist/extensions/pi-zentui/test/omp-statusline.test.ts +579 -0
  949. package/dist/extensions/pi-zentui/test/omp-template-lookups.test.ts +630 -0
  950. package/dist/extensions/pi-zentui/test/omp-template-metrics.test.ts +72 -0
  951. package/dist/extensions/pi-zentui/test/omp-template-modes.test.ts +557 -0
  952. package/dist/extensions/pi-zentui/test/omp-ui.test.ts +93 -0
  953. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  954. package/dist/extensions/pi-zentui/test/pi-version-policy.test.ts +37 -0
  955. package/dist/extensions/pi-zentui/test/project-demand-integration.test.ts +542 -0
  956. package/dist/extensions/pi-zentui/test/project-discovery.test.ts +412 -0
  957. package/dist/extensions/pi-zentui/test/project-refresh.test.ts +44 -0
  958. package/dist/extensions/pi-zentui/test/project-state.test.ts +38 -1
  959. package/dist/extensions/pi-zentui/test/responsive-dependencies.test.ts +7 -7
  960. package/dist/extensions/pi-zentui/test/runtime.test.ts +127 -2
  961. package/dist/extensions/pi-zentui/test/selesai-v030-gate.json +939 -0
  962. package/dist/extensions/pi-zentui/test/settings-command.test.ts +1330 -82
  963. package/dist/extensions/pi-zentui/test/settings-keys.test.ts +41 -0
  964. package/dist/extensions/pi-zentui/test/settings-list-selection.test.ts +88 -0
  965. package/dist/extensions/pi-zentui/test/settings-previews.test.ts +4 -1
  966. package/dist/extensions/pi-zentui/test/state.test.ts +15 -1
  967. package/dist/extensions/pi-zentui/test/telemetry-lifecycle-integration.test.ts +214 -12
  968. package/dist/extensions/pi-zentui/test/telemetry-snapshot.test.ts +246 -0
  969. package/dist/extensions/pi-zentui/test/thinking-experimental-cache.test.ts +246 -0
  970. package/dist/extensions/pi-zentui/test/thinking-experimental-rows.test.ts +22 -0
  971. package/dist/extensions/pi-zentui/test/thinking-experimental-tui.mjs +113 -51
  972. package/dist/extensions/pi-zentui/test/thinking-experimental.test.ts +576 -76
  973. package/dist/extensions/pi-zentui/test/thinking-steps.test.ts +23 -0
  974. package/dist/extensions/pi-zentui/test/token-rate.test.ts +450 -0
  975. package/dist/extensions/pi-zentui/test/turn-summary-format.test.ts +207 -0
  976. package/dist/extensions/pi-zentui/test/turn-summary-lifecycle.integration.test.ts +72 -5
  977. package/dist/extensions/pi-zentui/test/turn-summary-rate.test.ts +158 -0
  978. package/dist/extensions/pi-zentui/test/usage-lifecycle-integration.test.ts +421 -0
  979. package/dist/extensions/pi-zentui/test/usage-snapshot.test.ts +154 -0
  980. package/dist/extensions/pi-zentui/test/user-message-cache.test.ts +239 -0
  981. package/dist/extensions/pi-zentui/test/user-message-native-reduced-capabilities.test.ts +61 -0
  982. package/dist/extensions/pi-zentui/test/user-message-native.test.ts +447 -0
  983. package/dist/extensions/pi-zentui/test/user-message-styles.test.ts +2 -2
  984. package/dist/extensions/pi-zentui/test/working-line-editor-placement.test.ts +317 -0
  985. package/dist/extensions/pi-zentui/test/working-line-generation-cache.test.ts +238 -0
  986. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +674 -179
  987. package/dist/extensions/pi-zentui/test/working-line-message-ownership.test.ts +239 -0
  988. package/dist/extensions/pi-zentui/test/working-line-metric-animation.test.ts +284 -0
  989. package/dist/extensions/pi-zentui/test/working-line-placement.test.ts +298 -0
  990. package/dist/extensions/pi-zentui/test/working-line.test.ts +386 -18
  991. package/dist/extensions/pi-zentui/test/wrapped-editor-consumers.integration.test.ts +579 -0
  992. package/dist/extensions/pi-zentui/test/wrapped-editor-usage.integration.test.ts +298 -0
  993. package/dist/extensions/pi-zentui/tsconfig.json +1 -1
  994. package/dist/extensions/pi-zentui/vitest.host.config.ts +33 -0
  995. package/dist/extensions/question/index.ts +1 -5
  996. package/dist/extensions/rtk.test.ts +28 -15
  997. package/dist/extensions/rtk.ts +22 -22
  998. package/dist/extensions/skills-index/index.test.ts +99 -0
  999. package/dist/extensions/skills-index/index.ts +105 -0
  1000. package/dist/extensions/skills-index/package.json +9 -0
  1001. package/dist/extensions/tokenin-onboarding.ts +48 -208
  1002. package/dist/extensions/tool-search/index.d.ts +11 -0
  1003. package/dist/extensions/tool-search/index.js +14 -0
  1004. package/dist/extensions/tool-search/tool.d.ts +91 -0
  1005. package/dist/extensions/tool-search/tool.js +214 -0
  1006. package/dist/index.d.ts +17 -9
  1007. package/dist/index.js +11 -5
  1008. package/dist/main.d.ts +4 -0
  1009. package/dist/main.js +106 -42
  1010. package/dist/migrations.js +4 -3
  1011. package/dist/modes/index.d.ts +1 -0
  1012. package/dist/modes/interactive/bug-report.js +4 -0
  1013. package/dist/modes/interactive/components/armin.d.ts +3 -0
  1014. package/dist/modes/interactive/components/armin.js +7 -5
  1015. package/dist/modes/interactive/components/assistant-message.js +1 -1
  1016. package/dist/modes/interactive/components/auth-url.d.ts +13 -0
  1017. package/dist/modes/interactive/components/auth-url.js +36 -0
  1018. package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  1019. package/dist/modes/interactive/components/bash-execution.js +17 -14
  1020. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  1021. package/dist/modes/interactive/components/branch-summary-message.js +5 -2
  1022. package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
  1023. package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
  1024. package/dist/modes/interactive/components/config-selector.js +13 -3
  1025. package/dist/modes/interactive/components/custom-editor.js +7 -0
  1026. package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
  1027. package/dist/modes/interactive/components/custom-entry.js +8 -2
  1028. package/dist/modes/interactive/components/custom-message.js +1 -0
  1029. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  1030. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  1031. package/dist/modes/interactive/components/footer.d.ts +7 -0
  1032. package/dist/modes/interactive/components/footer.js +44 -4
  1033. package/dist/modes/interactive/components/index.d.ts +0 -1
  1034. package/dist/modes/interactive/components/index.js +0 -1
  1035. package/dist/modes/interactive/components/login-dialog.d.ts +2 -0
  1036. package/dist/modes/interactive/components/login-dialog.js +11 -5
  1037. package/dist/modes/interactive/components/mermaid.d.ts +10 -0
  1038. package/dist/modes/interactive/components/mermaid.js +74 -0
  1039. package/dist/modes/interactive/components/model-selector.d.ts +14 -9
  1040. package/dist/modes/interactive/components/model-selector.js +79 -31
  1041. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  1042. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  1043. package/dist/modes/interactive/components/pi-logo.d.ts +18 -0
  1044. package/dist/modes/interactive/components/pi-logo.js +36 -0
  1045. package/dist/modes/interactive/components/radius-login-selector.d.ts +14 -0
  1046. package/dist/modes/interactive/components/radius-login-selector.js +84 -0
  1047. package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
  1048. package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
  1049. package/dist/modes/interactive/components/settings-selector.d.ts +8 -11
  1050. package/dist/modes/interactive/components/settings-selector.js +60 -102
  1051. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  1052. package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
  1053. package/dist/modes/interactive/components/themed-text.d.ts +16 -0
  1054. package/dist/modes/interactive/components/themed-text.js +28 -0
  1055. package/dist/modes/interactive/components/tool-execution.d.ts +11 -18
  1056. package/dist/modes/interactive/components/tool-execution.js +34 -47
  1057. package/dist/modes/interactive/components/tree-selector.js +7 -0
  1058. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  1059. package/dist/modes/interactive/components/user-message.js +14 -6
  1060. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  1061. package/dist/modes/interactive/components/visual-truncate.js +39 -6
  1062. package/dist/modes/interactive/external-editor.js +2 -1
  1063. package/dist/modes/interactive/interactive-mode.d.ts +41 -8
  1064. package/dist/modes/interactive/interactive-mode.js +854 -492
  1065. package/dist/modes/interactive/program-status-reporter.d.ts +33 -0
  1066. package/dist/modes/interactive/program-status-reporter.js +109 -0
  1067. package/dist/modes/interactive/theme/dark.json +59 -72
  1068. package/dist/modes/interactive/theme/light.json +57 -69
  1069. package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
  1070. package/dist/modes/interactive/theme/system-theme.js +545 -0
  1071. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  1072. package/dist/modes/interactive/theme/theme-controller.js +127 -47
  1073. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  1074. package/dist/modes/interactive/theme/theme-json.js +3 -1
  1075. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  1076. package/dist/modes/interactive/theme/theme.d.ts +66 -39
  1077. package/dist/modes/interactive/theme/theme.js +243 -320
  1078. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  1079. package/dist/modes/interactive/tui-renderer.js +1 -0
  1080. package/dist/modes/json-event.d.ts +33 -0
  1081. package/dist/modes/json-event.js +28 -0
  1082. package/dist/modes/print-mode.js +12 -2
  1083. package/dist/modes/rpc/rpc-client.d.ts +11 -19
  1084. package/dist/modes/rpc/rpc-client.js +52 -35
  1085. package/dist/modes/rpc/rpc-mode.js +11 -26
  1086. package/dist/modes/rpc/rpc-types.d.ts +12 -23
  1087. package/dist/package-manager-cli.js +16 -5
  1088. package/dist/rpc-entry.js +1 -0
  1089. package/dist/skills/pi-subagents/SKILL.md +109 -35
  1090. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +38 -238
  1091. package/dist/skills/pi-subagents/references/execution-controls.md +181 -83
  1092. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +9 -9
  1093. package/dist/skills/pi-subagents/references/multi-lane-orchestration.md +24 -2
  1094. package/dist/skills/pi-subagents/references/prompting-and-roles.md +121 -91
  1095. package/dist/skills/pi-subagents/references/review-and-validation.md +73 -0
  1096. package/dist/utils/ansi.d.ts +8 -0
  1097. package/dist/utils/ansi.js +30 -11
  1098. package/dist/utils/clipboard-image.js +14 -17
  1099. package/dist/utils/clipboard.d.ts +2 -0
  1100. package/dist/utils/clipboard.js +17 -11
  1101. package/dist/utils/frontmatter.js +2 -1
  1102. package/dist/utils/image-convert.d.ts +12 -0
  1103. package/dist/utils/image-convert.js +45 -6
  1104. package/dist/utils/image-resize-core.d.ts +12 -0
  1105. package/dist/utils/image-resize-core.js +5 -0
  1106. package/dist/utils/image-resize-worker.js +3 -2
  1107. package/dist/utils/image-resize.js +9 -10
  1108. package/dist/utils/mime.js +1 -1
  1109. package/dist/utils/output-files.d.ts +14 -0
  1110. package/dist/utils/output-files.js +29 -0
  1111. package/dist/utils/paths.d.ts +6 -3
  1112. package/dist/utils/paths.js +28 -5
  1113. package/dist/utils/shell.d.ts +1 -3
  1114. package/dist/utils/shell.js +3 -30
  1115. package/dist/utils/syntax-highlight.d.ts +1 -0
  1116. package/dist/utils/syntax-highlight.js +68 -2
  1117. package/dist/utils/tool-result-images.d.ts +20 -0
  1118. package/dist/utils/tool-result-images.js +47 -0
  1119. package/dist/utils/tools-manager.d.ts +5 -0
  1120. package/dist/utils/tools-manager.js +6 -6
  1121. package/dist/utils/version-check.d.ts +4 -0
  1122. package/dist/utils/version-check.js +20 -2
  1123. package/docs/cli-integration.md +104 -0
  1124. package/docs/cli.md +333 -0
  1125. package/docs/codemode.md +230 -0
  1126. package/docs/configuration.md +47 -0
  1127. package/docs/environment-variables.md +5 -0
  1128. package/docs/extensions.md +107 -30
  1129. package/docs/json.md +8 -4
  1130. package/docs/keybindings.md +10 -10
  1131. package/docs/mcp.md +262 -0
  1132. package/docs/models.md +104 -3
  1133. package/docs/providers.md +20 -2
  1134. package/docs/rpc.md +13 -12
  1135. package/docs/sdk.md +41 -33
  1136. package/docs/security.md +21 -20
  1137. package/docs/settings.md +18 -46
  1138. package/docs/terminal-setup.md +14 -0
  1139. package/docs/virtual-models.md +114 -0
  1140. package/examples/extensions/jev-router.ts +113 -0
  1141. package/examples/extensions/tokenin-usage-widget.ts +124 -0
  1142. package/examples/rpc-client.ts +35 -0
  1143. package/examples/sdk/14-codemode-mcp.ts +67 -0
  1144. package/package.json +15 -8
  1145. package/dist/core/agent-session-auto-handoff.test.js +0 -195
  1146. package/dist/core/built-in-extensions.d.ts +0 -2
  1147. package/dist/core/built-in-extensions.js +0 -2
  1148. package/dist/core/llama/provider.js +0 -143
  1149. package/dist/core/settings-manager-auto-handoff.test.d.ts +0 -1
  1150. package/dist/core/settings-manager-auto-handoff.test.js +0 -53
  1151. package/dist/extensions/capability-gateway/catalog.ts +0 -177
  1152. package/dist/extensions/capability-gateway/index.test.ts +0 -226
  1153. package/dist/extensions/capability-gateway/index.ts +0 -669
  1154. package/dist/extensions/capability-gateway/integration.test.ts +0 -803
  1155. package/dist/extensions/capability-gateway/package.json +0 -16
  1156. package/dist/extensions/capability-gateway/routing.test.ts +0 -574
  1157. package/dist/extensions/capability-gateway/routing.ts +0 -403
  1158. package/dist/extensions/pi-subagents/runner-server-preload.mjs +0 -13
  1159. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +0 -89
  1160. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +0 -259
  1161. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +0 -312
  1162. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +0 -374
  1163. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +0 -69
  1164. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +0 -307
  1165. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +0 -211
  1166. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  1167. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  1168. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  1169. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  1170. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  1171. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  1172. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  1173. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  1174. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  1175. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  1176. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  1177. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  1178. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  1179. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  1180. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  1181. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  1182. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  1183. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  1184. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  1185. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  1186. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  1187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  1188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  1189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  1190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  1191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  1192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  1193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  1194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  1195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  1196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  1197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  1198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  1199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  1200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  1201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  1202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  1203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  1204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  1205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  1206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  1207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  1208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  1209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  1210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  1211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  1212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  1213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  1214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  1215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  1216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  1217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  1218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  1219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  1220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  1221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  1222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  1223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  1224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  1225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  1226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  1227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  1228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  1229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  1230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  1231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  1232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  1233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  1234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  1235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  1236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  1237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  1238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  1239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  1240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  1241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  1242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  1243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  1244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  1245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  1246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  1247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  1248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  1249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  1250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  1251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  1252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  1253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  1254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  1255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  1256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  1257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  1258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  1259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  1260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  1261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  1262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  1263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  1264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  1265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  1266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  1267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  1268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  1269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  1270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  1271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  1272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  1273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  1274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  1275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  1276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  1277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  1278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  1279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  1280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  1281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  1282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  1283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  1284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  1285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  1286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  1287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  1288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  1289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  1290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  1291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  1292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  1293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  1294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  1295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  1296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  1297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  1298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  1299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  1300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  1301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  1302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  1303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  1304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  1305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  1306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  1307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  1308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  1309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  1310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  1311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  1312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  1313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  1314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  1315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  1316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  1317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  1318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  1319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  1320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  1321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  1322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  1323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  1324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  1325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  1326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  1327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  1328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  1329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  1330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  1331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  1332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  1333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  1334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  1335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  1336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  1337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  1338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  1339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
  1340. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +0 -31
  1341. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +0 -74
  1342. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +0 -150
  1343. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +0 -766
  1344. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +0 -327
  1345. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +0 -309
  1346. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +0 -1093
  1347. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +0 -94
  1348. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +0 -1329
  1349. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +0 -153
  1350. package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-layout-patch.ts +0 -457
  1351. package/dist/extensions/pi-zentui/test/accent-rail-layout-patch.test.ts +0 -669
  1352. package/dist/extensions/pi-zentui/test/thinking-experimental-docs.test.ts +0 -51
  1353. package/dist/modes/interactive/components/daxnuts.d.ts +0 -22
  1354. package/dist/modes/interactive/components/daxnuts.js +0 -139
  1355. /package/dist/core/{agent-session-auto-handoff.test.d.ts → agent-session-custom-tools.test.d.ts} +0 -0
  1356. /package/dist/{core → extensions}/llama/huggingface.d.ts +0 -0
  1357. /package/dist/{core → extensions}/llama/huggingface.js +0 -0
  1358. /package/dist/{core → extensions}/llama/index.d.ts +0 -0
  1359. /package/dist/{core → extensions}/llama/ui.d.ts +0 -0
  1360. /package/dist/{core → extensions}/llama/ui.js +0 -0
@@ -5,17 +5,14 @@ import type {
5
5
  Theme,
6
6
  } from "@earendil-works/pi-coding-agent";
7
7
  import type { EditorTheme, TUI } from "@earendil-works/pi-tui";
8
- import {
9
- type AccentRailLayoutPatchDiagnostic,
10
- installHostAccentRailLayoutPatch,
11
- markAccentRailLayoutEditor,
12
- retainAccentRailLayoutPatchInstallation,
13
- } from "./accent-rail-layout-patch";
8
+ import { CodexQuotaCollector, editorWantsCodexQuota } from "./codex-quota";
9
+ import { componentColor } from "./component-colors";
14
10
  import {
15
11
  type AccentRailEditorStyleConfig,
16
12
  type ContextStyle,
17
13
  defaultConfig,
18
14
  type EditorComponentConfig,
15
+ type ExtensionStatusChoice,
19
16
  type ExtensionStatusColorMode,
20
17
  type ExtensionStatusPlacement,
21
18
  ensureConfigExists,
@@ -28,7 +25,8 @@ import {
28
25
  hasUnsupportedComponentStyle,
29
26
  type IconMode,
30
27
  loadConfig,
31
- type MinimalistConfig,
28
+ type MinimalistEditorStylePatch,
29
+ migrateComponentSelections,
32
30
  type PathDisplayConfig,
33
31
  type PolishedCopyFriendlyEditorStyleConfig,
34
32
  type PolishedEditorStyleConfig,
@@ -36,12 +34,15 @@ import {
36
34
  type SelectorBordersComponentConfig,
37
35
  type SeparatorStyle,
38
36
  saveAccentRailEditorStylePatch,
37
+ saveComponentColor,
39
38
  saveComponentPreset,
39
+ saveCustomValueColor,
40
40
  saveEditorComponentPatch,
41
+ saveExtensionStatusChoice,
41
42
  saveExtensionStatusColorMode,
42
- saveExtensionStatusDefaultPlacement,
43
- saveExtensionStatusPlacement,
43
+ saveExtensionStatusDefaultChoice,
44
44
  saveFooterComponentPatch,
45
+ saveHiddenExtensionStatusColorMode,
45
46
  saveIconsModePatch,
46
47
  saveMinimalistEditorStylePatch,
47
48
  savePolishedCopyFriendlyEditorStylePatch,
@@ -56,26 +57,40 @@ import {
56
57
  type WorkingLineComponentPatch,
57
58
  type ZentuiConfig,
58
59
  } from "./config";
60
+ import {
61
+ editorDemandsCustomVariable,
62
+ editorMetadataReferences,
63
+ footerDemandsCustomVariable,
64
+ } from "./custom-variable-demand";
65
+ import { CustomVariables } from "./custom-variables";
59
66
  import {
60
67
  type EditorTransferFailureReason,
61
68
  replaceEditorComponentWithExpandedText,
62
69
  } from "./editor-transfer";
70
+ import { createExtensionStatusController } from "./extension-status-controller";
63
71
  import { installFooter, installHiddenFooter } from "./footer";
64
- import { collectFooterFormatReferences, parseFooterFormat } from "./footer-format";
72
+ import { compiledFooterFormat } from "./footer-format";
65
73
  import {
66
74
  buildSessionDurationLabel,
67
- invalidateUsageTotalsCache,
75
+ EventUsageTotalsController,
68
76
  resolveContextUsage,
69
77
  } from "./format";
70
78
  import { emptyGitStatus, readGitStatus } from "./git";
79
+ import type { HostTemplateValues } from "./host-template-values";
71
80
  import {
81
+ createTurnSummaryData,
72
82
  InteractionMetricsTracker,
73
83
  renderTurnSummaryEntry,
74
84
  TURN_SUMMARY_ENTRY_TYPE,
75
85
  } from "./interaction-summary";
86
+ import { LayeredEditorConsumer } from "./layered-editor";
76
87
  import { LiveContextController } from "./live-context";
88
+ import { LiveMetadataController } from "./live-metadata";
89
+ import { editorHostReferences, liveMetadataDemand } from "./live-metadata-demand";
77
90
  import { readPackageVersionResult } from "./package-version";
78
91
  import { getComponentPreset } from "./presets";
92
+ import { projectDemand } from "./project-demand";
93
+ import { ProjectDiscovery } from "./project-discovery.js";
79
94
  import {
80
95
  createProjectRefreshScheduler,
81
96
  type ProjectRefreshRun,
@@ -83,22 +98,26 @@ import {
83
98
  type StopProjectRefreshInterval,
84
99
  startProjectRefreshInterval,
85
100
  } from "./project-refresh";
86
- import { applyProjectRefreshToState } from "./project-state";
101
+ import { applyProjectRefreshToState, projectStateSnapshot } from "./project-state";
87
102
  import { RepositoryRootController, type RepositoryRootRequest } from "./repository-root";
88
103
  import { readRuntimeInfo } from "./runtime";
89
104
  import { installSelectorBorderStyle, removeSelectorBorderStyle } from "./selector-border";
90
105
  import { SessionLifecycle } from "./session-lifecycle";
91
106
  import { registerZentuiSettingsCommand } from "./settings-command";
92
- import { createInitialState, type FooterState, modelLabelFor, syncState } from "./state";
93
- import { resolveFooterTelemetry } from "./telemetry";
107
+ import {
108
+ createInitialState,
109
+ type FooterState,
110
+ modelLabelFor,
111
+ syncModelState,
112
+ syncState,
113
+ syncUsageState,
114
+ } from "./state";
115
+ import { FooterTelemetryController } from "./telemetry";
94
116
  import { ThinkingExperimentalController } from "./thinking-experimental";
95
- import { PolishedEditor, WrappedPolishedEditor } from "./ui";
117
+ import { TurnSummaryRateTracker } from "./turn-summary-rate";
118
+ import { editorWantsContext, PolishedEditor, WrappedPolishedEditor } from "./ui";
96
119
  import { installUserMessageStyle, removeUserMessageStyle } from "./user-message";
97
- import {
98
- AgentDurationClock,
99
- snapshotWorkingLineHighStyle,
100
- WorkingLineController,
101
- } from "./working-line";
120
+ import { AgentDurationClock, WorkingLineController } from "./working-line";
102
121
  import { WorkingLineExtensionSegments } from "./working-line-extension-segments";
103
122
 
104
123
  const ZENTUI_EDITOR_FACTORY = Symbol.for("pi-zentui.editor-factory");
@@ -152,8 +171,13 @@ function getZentuiEditorBaseFactory(factory: EditorFactory | undefined): EditorF
152
171
  export function activeFooterReferences(config: ZentuiConfig): Set<string> {
153
172
  const starship = config.components.footer.styles.starship;
154
173
  const references = starship.format
155
- ? collectFooterFormatReferences(parseFooterFormat(starship.format), FOOTER_FORMAT_ALIASES)
174
+ ? new Set(compiledFooterFormat(starship.format, FOOTER_FORMAT_ALIASES).references)
156
175
  : new Set<string>([
176
+ ...(starship.segments.cwd ? ["cwd"] : []),
177
+ ...(starship.segments.gitBranch ? ["git_branch"] : []),
178
+ ...(starship.segments.gitStatus ? ["git_status"] : []),
179
+ ...(starship.segments.gitBranch || starship.segments.gitStatus ? ["git_state"] : []),
180
+ ...(config.components.footer.codexQuota ? ["codex_quota"] : []),
157
181
  ...(starship.segments.sessionName ? ["session_name"] : []),
158
182
  ...(starship.segments.runtime ? ["runtime"] : []),
159
183
  ...(starship.segments.gitCommit ? ["git_commit"] : []),
@@ -161,12 +185,13 @@ export function activeFooterReferences(config: ZentuiConfig): Set<string> {
161
185
  ...(starship.segments.packageVersion ? ["package"] : []),
162
186
  ...(starship.segments.sessionDuration ? ["session_duration"] : []),
163
187
  ...(starship.segments.time ? ["time"] : []),
188
+ ...(starship.segments.cost ? ["cost", "subscription"] : []),
189
+ ...(starship.segments.tokens ? ["tokens"] : []),
190
+ ...(starship.segments.context ? ["auto_compaction"] : []),
164
191
  ]);
165
192
  if (starship.responsive) {
166
- for (const name of collectFooterFormatReferences(
167
- parseFooterFormat(starship.compactFormat),
168
- FOOTER_FORMAT_ALIASES,
169
- )) {
193
+ for (const name of compiledFooterFormat(starship.compactFormat, FOOTER_FORMAT_ALIASES)
194
+ .references) {
170
195
  references.add(name);
171
196
  }
172
197
  }
@@ -182,21 +207,46 @@ function isTuiContext(ctx: ExtensionContext): boolean {
182
207
  }
183
208
  }
184
209
 
185
- export default function (pi: ExtensionAPI) {
210
+ export type ZentuiHost = {
211
+ wrapEditor?: boolean;
212
+ skinOnly?: boolean;
213
+ liveModel?: boolean;
214
+ subscribeProjectChanges?: (invalidate: () => void) => () => void;
215
+ getFastMode?: (ctx: ExtensionContext) => string | undefined;
216
+ getHostTemplateValues?: (
217
+ ctx: ExtensionContext,
218
+ names: ReadonlySet<string>,
219
+ ) => HostTemplateValues | undefined;
220
+ };
221
+
222
+ export default function (pi: ExtensionAPI, host: ZentuiHost = {}) {
186
223
  const state: FooterState = createInitialState(emptyGitStatus());
187
224
  const sessionLifecycle = new SessionLifecycle();
188
225
  const editorOwnerToken = Symbol("zentui-editor-owner");
189
226
 
190
- let currentConfig: PolishedTuiConfig = structuredClone(defaultConfig);
227
+ // Unsupported OMP surfaces stay native; this runtime view is never written back.
228
+ const scopeConfig = (config: PolishedTuiConfig): PolishedTuiConfig =>
229
+ host.skinOnly
230
+ ? {
231
+ ...config,
232
+ components: {
233
+ ...config.components,
234
+ thinkingSteps: { ...config.components.thinkingSteps, enabled: false },
235
+ workingLine: { ...config.components.workingLine, enabled: false },
236
+ selectorBorders: { ...config.components.selectorBorders, enabled: false },
237
+ },
238
+ }
239
+ : config;
240
+ let currentConfig: PolishedTuiConfig = scopeConfig(structuredClone(defaultConfig));
191
241
  // Keep the capability guard defensive for hosts with incomplete extension APIs.
192
- if (typeof pi.registerEntryRenderer === "function") {
242
+ if (!host.skinOnly && typeof pi.registerEntryRenderer === "function") {
193
243
  pi.registerEntryRenderer(TURN_SUMMARY_ENTRY_TYPE, (entry, options, theme) =>
194
244
  renderTurnSummaryEntry(
195
245
  entry,
196
246
  {
197
247
  ...options,
198
248
  colorSource: currentConfig.components.workingLine.colorSource,
199
- workingLineHigh: currentConfig.colors.workingLineHigh,
249
+ workingLineHigh: componentColor(currentConfig, "workingLine", "high"),
200
250
  },
201
251
  theme,
202
252
  ),
@@ -205,6 +255,9 @@ export default function (pi: ExtensionAPI) {
205
255
  let activeTheme: Theme | undefined;
206
256
  let requestFooterRender: (() => void) | undefined;
207
257
  let requestEditorRender: (() => void) | undefined;
258
+ const extensionStatuses = createExtensionStatusController(
259
+ () => currentConfig.components.extensionStatuses,
260
+ );
208
261
  let getActiveExtensionStatuses: () => ReadonlyMap<string, string> = () => new Map();
209
262
  let stopRefreshInterval: StopProjectRefreshInterval = () => {};
210
263
  let cleanupUserMessageStyle: () => void = () => {};
@@ -216,35 +269,34 @@ export default function (pi: ExtensionAPI) {
216
269
  let editorInstalled = false;
217
270
  let editorInstallMode: EditorInstallMode = "none";
218
271
  let installedEditorFactory: EditorFactory | undefined;
272
+ let activeEditor:
273
+ | {
274
+ editor: PolishedEditor | WrappedPolishedEditor;
275
+ factory: EditorFactory;
276
+ generation: number;
277
+ }
278
+ | undefined;
219
279
  let wrappedEditorFactory: EditorFactory | undefined;
220
280
  let stopSessionTimer: () => void = () => {};
221
281
  let stopMinimalistDurationUpdates: () => void = () => {};
222
282
  let minimalistDurationUpdatesActive = false;
223
- let minimalistDecorationActive = false;
283
+ let minimalistDecorationEditor: PolishedEditor | WrappedPolishedEditor | undefined;
284
+ let customVariableSessionReady = false;
224
285
  let sessionTimerRequirements = "";
225
286
  let lastDurationLabel = "";
226
287
  let lastProjectCwd: string | undefined;
227
288
  const agentDurationClock = new AgentDurationClock();
228
289
  const interactionMetrics = new InteractionMetricsTracker();
290
+ const summaryRate = new TurnSummaryRateTracker();
291
+ const summaryEnabled = () =>
292
+ !host.skinOnly &&
293
+ currentConfig.components.workingLine.enabled &&
294
+ currentConfig.components.workingLine.turnSummary;
229
295
  let agentRunActive = false;
230
296
  let minimalistProjectRoot: string | undefined;
231
297
  const repositoryRoots = new RepositoryRootController();
232
298
  let projectRefreshActive = false;
233
299
  let activeTuiContext: ExtensionContext | undefined;
234
- let cleanupAccentRailLayoutPatch: () => void = () => {};
235
- let accentRailLayoutPatchInstallSerial = 0;
236
-
237
- const recordAccentRailLayoutPatchDiagnostic = (
238
- diagnostic: AccentRailLayoutPatchDiagnostic,
239
- version?: string,
240
- ) => {
241
- if (process.env.ZENTUI_DEBUG === "1") {
242
- console.error(
243
- `[zentui] Accent Rail fullscreen layout patch: ${diagnostic}${version ? ` (Pi TUI ${version})` : ""}`,
244
- );
245
- }
246
- };
247
-
248
300
  const isOwnedEditorFactory = (factory: EditorFactory | undefined) =>
249
301
  (factory as ZentuiEditorFactory | undefined)?.[ZENTUI_EDITOR_OWNER] === editorOwnerToken;
250
302
  const effectiveEditorEnabled = () =>
@@ -280,10 +332,61 @@ export default function (pi: ExtensionAPI) {
280
332
  }
281
333
  };
282
334
 
335
+ const layeredEditor = new LayeredEditorConsumer<
336
+ EditorFactory,
337
+ PolishedEditor | WrappedPolishedEditor
338
+ >((generation) => sessionLifecycle.isCurrent(generation));
339
+ const currentEditorFactory = (): EditorFactory | undefined => {
340
+ try {
341
+ return activeTuiContext?.ui.getEditorComponent();
342
+ } catch {
343
+ return undefined;
344
+ }
345
+ };
346
+ // Layered visibility does not grant installation ownership: editor install/restore stays exclusive.
347
+ // Data, demand, and timer consumers use these helpers; Working-line placement additionally
348
+ // requires focused, rendered border capability before its controller hides its own host row.
349
+ // Ownership counts before Pi constructs its editor; layered visibility requires the recorded
350
+ // instance to remain reachable through the current factory.
351
+ const layeredVisibleEditor = () => layeredEditor.editorVisibleThrough(currentEditorFactory());
352
+ const editorConsumerActive = () =>
353
+ ownsInstalledEditorFactory() || layeredVisibleEditor() !== undefined;
354
+ const visibleEditor = () =>
355
+ ownsInstalledEditorFactory() ? activeEditor?.editor : layeredVisibleEditor();
356
+ const requestEditorRepaint = () => {
357
+ requestEditorRender?.();
358
+ // The layered record intentionally outlives ownership clearing, so disabling the editor is
359
+ // gated here; a live wrapper keeps repainting while the editor remains enabled.
360
+ if (effectiveEditorEnabled()) layeredEditor.requestRender(currentEditorFactory());
361
+ };
362
+
363
+ const customVariables = new CustomVariables(
364
+ pi.events,
365
+ (key) => {
366
+ if (!customVariableSessionReady || !sessionLifecycle.isCurrent()) return false;
367
+ return (
368
+ (effectiveEditorEnabled() &&
369
+ visibleEditor()?.isMetadataDecorated() === true &&
370
+ editorDemandsCustomVariable(currentConfig, key)) ||
371
+ (installedFooterKind === "starship" &&
372
+ ownsInstalledFooter() &&
373
+ footerDemandsCustomVariable(currentConfig, key))
374
+ );
375
+ },
376
+ () => {
377
+ if (!customVariableSessionReady || !sessionLifecycle.isCurrent()) return;
378
+ requestEditorRepaint();
379
+ requestFooterRender?.();
380
+ },
381
+ );
283
382
  const refresh = () => {
284
383
  if (!sessionLifecycle.isCurrent()) return;
384
+ customVariables.reconcile();
385
+ summaryRate.reconcile(summaryEnabled());
386
+ codexQuota.reconcile();
387
+ reconcileLiveMetadata();
285
388
  requestFooterRender?.();
286
- requestEditorRender?.();
389
+ requestEditorRepaint();
287
390
  };
288
391
  const thinkingExperimental = new ThinkingExperimentalController(
289
392
  () => currentConfig.components.thinkingSteps,
@@ -305,10 +408,28 @@ export default function (pi: ExtensionAPI) {
305
408
  Date.now,
306
409
  () => interactionMetrics.currentThought(),
307
410
  () => invalidateWorkingLinePublisherState(),
411
+ undefined,
412
+ (ctx) => {
413
+ if (!activeTuiContext || ctx.ui !== activeTuiContext.ui) return false;
414
+ // Factory visibility alone is insufficient: the current focused editor must have
415
+ // rendered safe border geometry before the separately owned Working row can hide.
416
+ return Boolean(
417
+ sessionLifecycle.isCurrent() &&
418
+ effectiveEditorEnabled() &&
419
+ currentConfig.components.editor.style !== "accent-rail" &&
420
+ visibleEditor()?.canEmbedWorkingLineBorder(),
421
+ );
422
+ },
308
423
  );
424
+ if (!host.skinOnly)
425
+ workingLine.setRequestRender(() => {
426
+ if (sessionLifecycle.isCurrent()) {
427
+ requestEditorRepaint();
428
+ }
429
+ });
309
430
  let workingLineSessionReady = false;
310
431
  const workingLineExtensions = new WorkingLineExtensionSegments(
311
- pi.events,
432
+ host.skinOnly ? undefined : pi.events,
312
433
  () =>
313
434
  workingLineSessionReady &&
314
435
  sessionLifecycle.isCurrent() &&
@@ -319,39 +440,81 @@ export default function (pi: ExtensionAPI) {
319
440
  if (activeTuiContext && sessionLifecycle.isCurrent()) {
320
441
  const applied = workingLine.updateExtensionSegments(segments, activeTuiContext);
321
442
  if (!applied && !workingLine.isAvailable()) {
322
- workingLine.invalidateExtensionSegments();
443
+ if (!host.skinOnly) workingLine.invalidateExtensionSegments();
323
444
  }
324
445
  return applied;
325
446
  }
326
447
  return false;
327
448
  },
328
449
  );
329
- invalidateWorkingLinePublisherState = () => workingLineExtensions.invalidate();
330
- const getContextSnapshot = (ctx: ExtensionContext) => resolveContextUsage(ctx, liveContext.get());
331
- const getContextWindow = (ctx: ExtensionContext): number | undefined =>
332
- getContextSnapshot(ctx).contextWindow;
333
- const getContextPercent = (ctx: ExtensionContext): number | undefined =>
334
- getContextSnapshot(ctx).percent;
450
+ invalidateWorkingLinePublisherState = () => {
451
+ workingLineExtensions.invalidate();
452
+ reconcileLiveMetadata();
453
+ };
454
+ const getEditorContextMetadata = (ctx: ExtensionContext) => {
455
+ const context = editorWantsContext(currentConfig)
456
+ ? resolveContextUsage(ctx, liveContext.get())
457
+ : undefined;
458
+ return { contextPercent: context?.percent, contextWindow: context?.contextWindow };
459
+ };
460
+ const getEditorHostTemplateValues = (ctx: ExtensionContext) => {
461
+ const names = editorHostReferences(currentConfig);
462
+ return liveMetadata.read(names, host.getHostTemplateValues?.(ctx, names));
463
+ };
335
464
  const getEditorMeta = (ctx: ExtensionContext) => {
336
- const context = getContextSnapshot(ctx);
465
+ if (host.liveModel) syncModelState(state, ctx.model);
337
466
  return {
467
+ codexQuota: getEditorQuota(),
338
468
  modelLabel: modelLabelFor(state, currentConfig.components.editor.modelLabel),
339
469
  modelId: state.modelId,
340
470
  modelName: state.modelName,
341
471
  providerLabel: state.providerLabel,
472
+ fastMode: host.getFastMode?.(ctx),
473
+ hostTemplateValues: getEditorHostTemplateValues(ctx),
342
474
  sessionName: ctx.sessionManager.getSessionName() ?? "",
343
- contextPercent: context.percent,
344
- contextWindow: context.contextWindow,
475
+ ...getEditorContextMetadata(ctx),
345
476
  inputTokens: state.usageTotals.input,
346
477
  outputTokens: state.usageTotals.output,
347
478
  cacheHitRate: state.usageTotals.latestCacheHitRate,
479
+ customVariables: customVariables.snapshot(),
348
480
  };
349
481
  };
350
482
  const getAgentDurationMs = () => agentDurationClock.elapsedMs();
351
483
  const getThinkingLevel = () =>
352
484
  sessionLifecycle.isCurrent() ? pi.getThinkingLevel() : ("off" as const);
485
+ const footerTelemetry = new FooterTelemetryController();
486
+ const getFooterTelemetry = (ctx: ExtensionContext) => {
487
+ const references = installedFooterReferences();
488
+ return footerTelemetry.resolve(ctx, {
489
+ subscription: references.has("subscription"),
490
+ autoCompaction: references.has("auto_compaction"),
491
+ });
492
+ };
493
+ const syncFooterTelemetry = (ctx: ExtensionContext) => {
494
+ const telemetry = getFooterTelemetry(ctx);
495
+ state.subscription = telemetry.subscription === true;
496
+ state.autoCompaction = telemetry.autoCompaction === true;
497
+ };
498
+ const usageTotals = new EventUsageTotalsController();
499
+ const getFooterUsage = (ctx: ExtensionContext) => {
500
+ const references = installedFooterReferences();
501
+ return usageTotals.resolve(
502
+ ctx,
503
+ (effectiveEditorEnabled() &&
504
+ editorConsumerActive() &&
505
+ ["tokens", "input_tokens", "output_tokens", "cost", "cache_hit"].some((name) =>
506
+ editorMetadataReferences(currentConfig).has(name),
507
+ )) ||
508
+ ["tokens", "cache_read", "cache_write", "cost"].some((name) => references.has(name)),
509
+ );
510
+ };
511
+ const syncFooterUsage = (ctx: ExtensionContext) =>
512
+ syncUsageState(state, getFooterUsage(ctx), currentConfig.icons.cacheHit);
353
513
  const syncFooterState = (ctx: ExtensionContext) =>
354
- syncState(state, ctx, currentConfig.icons.cacheHit, resolveFooterTelemetry(ctx));
514
+ syncState(state, ctx, currentConfig.icons.cacheHit, getFooterTelemetry(ctx), {
515
+ includeContextLabel: false,
516
+ usageTotals: getFooterUsage(ctx),
517
+ });
355
518
  const ownsInstalledFooter = () =>
356
519
  Boolean(
357
520
  activeTuiContext &&
@@ -363,6 +526,81 @@ export default function (pi: ExtensionAPI) {
363
526
  ? activeFooterReferences(currentConfig)
364
527
  : new Set<string>();
365
528
 
529
+ const createLiveMetadata = () =>
530
+ new LiveMetadataController(
531
+ (command, args, options) => pi.exec(command, args, options),
532
+ (text) => {
533
+ if (!host.skinOnly && activeTuiContext && sessionLifecycle.isCurrent())
534
+ workingLine.updateTokenRate(text, activeTuiContext);
535
+ },
536
+ () => {
537
+ if (sessionLifecycle.isCurrent()) {
538
+ requestEditorRepaint();
539
+ requestFooterRender?.();
540
+ }
541
+ },
542
+ () => reconcileLiveMetadata(),
543
+ );
544
+ let liveMetadata = createLiveMetadata();
545
+ let unsubscribeHostProjectChanges = () => {};
546
+ const reconcileLiveMetadata = () => {
547
+ const ctx = activeTuiContext;
548
+ const current = ctx && sessionLifecycle.isCurrent() && isTuiContext(ctx);
549
+ liveMetadata.reconcile(
550
+ current
551
+ ? { cwd: ctx.cwd, scopeKey: String(sessionLifecycle.currentGeneration()) }
552
+ : undefined,
553
+ liveMetadataDemand(
554
+ currentConfig,
555
+ {
556
+ editor: Boolean(
557
+ current &&
558
+ effectiveEditorEnabled() &&
559
+ editorConsumerActive() &&
560
+ visibleEditor()?.isMetadataDecorated() === true,
561
+ ),
562
+ footer: Boolean(current && installedFooterKind === "starship" && ownsInstalledFooter()),
563
+ workingLine: Boolean(
564
+ current && !host.skinOnly && workingLineSessionReady && workingLine.isAvailable(),
565
+ ),
566
+ },
567
+ !host.skinOnly,
568
+ ),
569
+ );
570
+ };
571
+ const suspendTokenRate = () => liveMetadata.suspendRate();
572
+ const clearTokenRate = () => liveMetadata.suspendRate(true);
573
+
574
+ const codexQuota = new CodexQuotaCollector(
575
+ () => {
576
+ const ctx = activeTuiContext;
577
+ if (
578
+ !ctx ||
579
+ !sessionLifecycle.isCurrent() ||
580
+ !isTuiContext(ctx) ||
581
+ ctx.model?.provider !== "openai-codex"
582
+ )
583
+ return undefined;
584
+ const editorDemand =
585
+ effectiveEditorEnabled() && editorConsumerActive() && editorWantsCodexQuota(currentConfig);
586
+ const footerDemand =
587
+ effectiveFooterStyle() === "starship" &&
588
+ currentConfig.components.footer.codexQuota &&
589
+ installedFooterReferences().has("codex_quota");
590
+ return editorDemand || footerDemand ? ctx : undefined;
591
+ },
592
+ () => {
593
+ if (!sessionLifecycle.isCurrent()) return;
594
+ requestFooterRender?.();
595
+ requestEditorRepaint();
596
+ },
597
+ );
598
+ const getEditorQuota = () =>
599
+ currentConfig.components.editor.codexQuota &&
600
+ activeTuiContext?.model?.provider === "openai-codex"
601
+ ? codexQuota.get()
602
+ : undefined;
603
+
366
604
  type ProjectRefreshTarget = {
367
605
  repository: RepositoryRootRequest;
368
606
  sessionGeneration: number;
@@ -377,29 +615,21 @@ export default function (pi: ExtensionAPI) {
377
615
  !sessionLifecycle.isCurrent(sessionGeneration) ||
378
616
  !repositoryRoots.isCurrent(repository)
379
617
  ) {
380
- return;
618
+ return false;
381
619
  }
382
- const starship = currentConfig.components.footer.styles.starship;
383
- const gitCommitConfig = starship.gitCommit;
384
- const gitMetricsConfig = starship.gitMetrics;
385
- const references = installedFooterReferences();
386
- const wantExactTag =
387
- (references.has("git_commit") && gitCommitConfig.showTag) || references.has("git_tag");
388
- const wantMetrics =
389
- references.has("git_metrics") || references.has("git_added") || references.has("git_deleted");
390
- const wantPackage = references.has("package") || references.has("package_version");
391
- const wantRuntime = references.has("runtime");
620
+ const demand = getProjectDemand();
621
+ if (!demand.active) return false;
622
+ const discovery =
623
+ demand.runtime || demand.packageVersion ? new ProjectDiscovery(cwd) : undefined;
392
624
  const [git, runtime, packageVersion] = await Promise.all([
393
- readGitStatus(cwd, {
394
- readExactTag: wantExactTag,
395
- readMetrics: wantMetrics,
396
- ignoreSubmodules: gitMetricsConfig.ignoreSubmodules,
397
- }),
398
- wantRuntime
399
- ? readRuntimeInfo(cwd)
625
+ demand.git
626
+ ? readGitStatus(cwd, demand.gitOptions)
627
+ : Promise.resolve({ kind: "not_a_repo" as const }),
628
+ demand.runtime
629
+ ? readRuntimeInfo(cwd, discovery)
400
630
  : Promise.resolve({ kind: "ok" as const, runtime: undefined }),
401
- wantPackage
402
- ? readPackageVersionResult(cwd)
631
+ demand.packageVersion
632
+ ? readPackageVersionResult(cwd, discovery)
403
633
  : Promise.resolve({ kind: "ok" as const, result: null }),
404
634
  ]);
405
635
  if (
@@ -407,9 +637,12 @@ export default function (pi: ExtensionAPI) {
407
637
  !sessionLifecycle.isCurrent(sessionGeneration) ||
408
638
  !repositoryRoots.isCurrent(repository)
409
639
  ) {
410
- return;
640
+ return false;
411
641
  }
412
- minimalistProjectRoot = repositoryRoots.update(repository, git.kind === "ok");
642
+ if (JSON.stringify(demand) !== JSON.stringify(getProjectDemand())) return false;
643
+ const previous = projectStateSnapshot(state, lastProjectCwd, minimalistProjectRoot);
644
+ // Root-only consumers validate markers without paying for a git status probe.
645
+ minimalistProjectRoot = repositoryRoots.update(repository, demand.root);
413
646
  lastProjectCwd = applyProjectRefreshToState(state, {
414
647
  cwd,
415
648
  previousCwd: lastProjectCwd,
@@ -417,6 +650,9 @@ export default function (pi: ExtensionAPI) {
417
650
  runtime,
418
651
  packageVersion,
419
652
  });
653
+ const changed = previous !== projectStateSnapshot(state, lastProjectCwd, minimalistProjectRoot);
654
+ if (changed) liveMetadata.invalidateProject();
655
+ return changed;
420
656
  };
421
657
 
422
658
  const projectRefreshScheduler = createProjectRefreshScheduler(refreshProjectState, refresh);
@@ -426,30 +662,37 @@ export default function (pi: ExtensionAPI) {
426
662
  ) => {
427
663
  const sessionGeneration = sessionLifecycle.currentGeneration();
428
664
  if (!sessionLifecycle.isCurrent(sessionGeneration)) return;
665
+ if (!needsProjectRefresh()) {
666
+ stopProjectRefresh();
667
+ return;
668
+ }
429
669
  const repository = repositoryRoots.request(ctx.cwd);
430
670
  minimalistProjectRoot = repositoryRoots.cachedRootForCwd(ctx.cwd);
431
671
  projectRefreshScheduler.schedule({ repository, sessionGeneration }, options);
432
672
  };
433
673
 
434
- const minimalistProjectRequired = () => {
435
- const editor = currentConfig.components.editor;
436
- const minimalist = editor.styles.minimalist;
437
- return (
674
+ const getProjectDemand = () =>
675
+ projectDemand(
676
+ currentConfig,
677
+ installedFooterReferences(),
438
678
  effectiveEditorEnabled() &&
439
- ownsInstalledEditorFactory() &&
440
- editor.style === "minimalist" &&
441
- (minimalist.showGit || minimalist.pathDisplay === "project")
679
+ editorConsumerActive() &&
680
+ currentConfig.components.editor.style === "minimalist",
442
681
  );
443
- };
444
682
 
445
- const needsProjectRefresh = () =>
446
- (installedFooterKind === "starship" && ownsInstalledFooter()) || minimalistProjectRequired();
683
+ const needsProjectRefresh = () => getProjectDemand().active;
447
684
 
448
685
  const stopProjectRefresh = () => {
449
686
  stopRefreshInterval();
450
687
  stopRefreshInterval = () => {};
451
688
  projectRefreshScheduler.stop();
452
689
  projectRefreshActive = false;
690
+ Object.assign(state, emptyGitStatus());
691
+ state.runtime = undefined;
692
+ state.packageVersion = undefined;
693
+ lastProjectCwd = undefined;
694
+ minimalistProjectRoot = undefined;
695
+ repositoryRoots.reset();
453
696
  };
454
697
 
455
698
  const reconcileProjectRefresh = (ctx: ExtensionContext, force = false) => {
@@ -480,7 +723,10 @@ export default function (pi: ExtensionAPI) {
480
723
 
481
724
  const refreshInteractiveState = (ctx: ExtensionContext, project = false) => {
482
725
  if (!sessionLifecycle.isCurrent() || !ctx.hasUI) return;
726
+ if (activeTuiContext?.ui === ctx.ui) activeTuiContext = ctx;
483
727
  if (editorInstalled && !ownsInstalledEditorFactory()) reconcileObservedEditorOwnership(ctx);
728
+ // A layered editor can stop being visible without any ownership transition to observe.
729
+ if (projectRefreshActive && !needsProjectRefresh()) stopProjectRefresh();
484
730
  syncFooterState(ctx);
485
731
  if (project && needsProjectRefresh()) scheduleProjectRefresh(ctx);
486
732
  refresh();
@@ -532,11 +778,10 @@ export default function (pi: ExtensionAPI) {
532
778
  sessionLifecycle.isCurrent() &&
533
779
  agentRunActive &&
534
780
  agentDurationClock.isActive() &&
535
- minimalistDecorationActive &&
781
+ minimalistDecorationActive() &&
536
782
  effectiveEditorEnabled() &&
537
- ownsInstalledEditorFactory() &&
538
783
  currentConfig.components.editor.style === "minimalist" &&
539
- currentConfig.components.editor.styles.minimalist.showTimer;
784
+ editorMetadataReferences(currentConfig).has("turn_duration");
540
785
  if (!needed) {
541
786
  stopMinimalistDurationUpdates();
542
787
  stopMinimalistDurationUpdates = () => {};
@@ -555,12 +800,26 @@ export default function (pi: ExtensionAPI) {
555
800
  });
556
801
  };
557
802
 
558
- const setMinimalistDecorationActive = (active: boolean) => {
559
- const next = sessionLifecycle.isCurrent() && active && ownsInstalledEditorFactory();
560
- if (minimalistDecorationActive === next) return;
561
- minimalistDecorationActive = next;
803
+ // Decoration is bound to the editor instance that reported it, so it stays valid while that
804
+ // editor is visible (owned or layered) and cannot leak to a replacement editor.
805
+ const minimalistDecorationActive = () =>
806
+ sessionLifecycle.isCurrent() &&
807
+ minimalistDecorationEditor !== undefined &&
808
+ visibleEditor() === minimalistDecorationEditor;
809
+ const reconcileMinimalistDecoration = () => {
810
+ customVariables.reconcile();
811
+ reconcileLiveMetadata();
562
812
  reconcileAgentTimer();
563
813
  };
814
+ const setMinimalistDecorationActive = (
815
+ active: boolean,
816
+ editor?: PolishedEditor | WrappedPolishedEditor,
817
+ ) => {
818
+ const next = active ? editor : undefined;
819
+ if (minimalistDecorationEditor === next) return;
820
+ minimalistDecorationEditor = next;
821
+ reconcileMinimalistDecoration();
822
+ };
564
823
 
565
824
  const startAgentTurn = (interactionStarted: boolean) => {
566
825
  agentRunActive = true;
@@ -601,7 +860,10 @@ export default function (pi: ExtensionAPI) {
601
860
  const before = activeFooterReferences(currentConfig);
602
861
  const nextConfig = save();
603
862
  const after = activeFooterReferences(nextConfig);
604
- currentConfig = nextConfig;
863
+ currentConfig = scopeConfig(nextConfig);
864
+ syncFooterUsage(ctx);
865
+ syncFooterTelemetry(ctx);
866
+ codexQuota.reconcile();
605
867
  if (sameReferences(before, after)) return;
606
868
  reconcileSessionTimer();
607
869
  reconcileProjectRefresh(ctx, true);
@@ -678,20 +940,26 @@ export default function (pi: ExtensionAPI) {
678
940
  };
679
941
 
680
942
  const clearEditorOwnership = () => {
681
- setMinimalistDecorationActive(false);
943
+ activeEditor = undefined;
944
+ if (activeTuiContext && workingLineSessionReady) {
945
+ if (!host.skinOnly) workingLine.reconcile(activeTuiContext);
946
+ }
682
947
  requestEditorRender = undefined;
683
948
  wrappedEditorFactory = undefined;
684
949
  installedEditorFactory = undefined;
685
950
  editorInstallMode = "none";
686
951
  editorInstalled = false;
952
+ reconcileMinimalistDecoration();
953
+ codexQuota.reconcile();
687
954
  };
688
955
 
689
956
  const trackZentuiEditorFactory = (factory: EditorFactory): boolean => {
690
957
  if (!isOwnedEditorFactory(factory)) return false;
958
+ if (activeEditor?.factory !== factory) activeEditor = undefined;
691
959
  const baseFactory = getZentuiEditorBaseFactory(factory);
692
960
  wrappedEditorFactory = baseFactory;
693
961
  installedEditorFactory = factory;
694
- editorInstallMode = baseFactory ? "wrapper" : "standalone";
962
+ editorInstallMode = baseFactory && host.wrapEditor !== false ? "wrapper" : "standalone";
695
963
  editorInstalled = true;
696
964
  return true;
697
965
  };
@@ -708,7 +976,13 @@ export default function (pi: ExtensionAPI) {
708
976
 
709
977
  const reconcileObservedEditorOwnership = (ctx: ExtensionContext) => {
710
978
  const observed = observeEditorFactory(ctx);
711
- if (!observed.known) return observed;
979
+ if (!observed.known) {
980
+ activeEditor = undefined;
981
+ if (workingLineSessionReady) {
982
+ if (!host.skinOnly) workingLine.reconcile(ctx);
983
+ }
984
+ return observed;
985
+ }
712
986
  if (observed.factory && isOwnedEditorFactory(observed.factory)) {
713
987
  trackZentuiEditorFactory(observed.factory);
714
988
  } else {
@@ -718,52 +992,126 @@ export default function (pi: ExtensionAPI) {
718
992
  return observed;
719
993
  };
720
994
 
721
- const accentRailLayoutActive = () =>
722
- sessionLifecycle.isCurrent() &&
723
- ownsInstalledEditorFactory() &&
724
- effectiveEditorEnabled() &&
725
- currentConfig.components.editor.style === "accent-rail";
995
+ // Also true for an editor still visible beneath a foreign wrapper; installation stays exclusive.
996
+ const isVisibleEditor = (editor: PolishedEditor | WrappedPolishedEditor, generation: number) =>
997
+ sessionLifecycle.isCurrent(generation) && visibleEditor() === editor;
998
+
999
+ const editorBorderCapabilityChanged = (
1000
+ editor: PolishedEditor | WrappedPolishedEditor,
1001
+ generation: number,
1002
+ ) => {
1003
+ if (!isVisibleEditor(editor, generation) || !activeTuiContext || !workingLineSessionReady)
1004
+ return;
1005
+ if (!host.skinOnly) workingLine.reconcile(activeTuiContext);
1006
+ if (workingLine.isAvailable()) requestEditorRepaint();
1007
+ };
1008
+
1009
+ const editorMetadataDecorationChanged = (
1010
+ editor: PolishedEditor | WrappedPolishedEditor,
1011
+ generation: number,
1012
+ ) => {
1013
+ if (isVisibleEditor(editor, generation)) {
1014
+ customVariables.reconcile();
1015
+ reconcileLiveMetadata();
1016
+ }
1017
+ };
726
1018
 
727
- const markOwnedAccentRailEditor = <T extends object>(editor: T): T => {
728
- markAccentRailLayoutEditor(editor, editorOwnerToken, accentRailLayoutActive);
729
- return editor;
1019
+ const editorWorkingLineFrame = (
1020
+ editor: PolishedEditor | WrappedPolishedEditor,
1021
+ generation: number,
1022
+ ) => {
1023
+ if (host.skinOnly || !sessionLifecycle.isCurrent(generation)) return undefined;
1024
+ // Even a stale instance render must release a row whose current border disappeared.
1025
+ const frame = workingLine.currentWorkingLineFrame();
1026
+ return isVisibleEditor(editor, generation) ? frame : undefined;
1027
+ };
1028
+
1029
+ /** Records a freshly constructed editor as owned (exclusive) or visible beneath a foreign wrapper. */
1030
+ const registerConstructedEditor = (
1031
+ ctx: ExtensionContext,
1032
+ factory: ZentuiEditorFactory,
1033
+ generation: number,
1034
+ editor: PolishedEditor | WrappedPolishedEditor,
1035
+ tui: TUI,
1036
+ ) => {
1037
+ const observed = observeEditorFactory(ctx);
1038
+ if (
1039
+ !sessionLifecycle.isCurrent(generation) ||
1040
+ activeTuiContext?.ui !== ctx.ui ||
1041
+ !observed.known
1042
+ ) {
1043
+ return;
1044
+ }
1045
+ if (observed.factory === factory) {
1046
+ activeEditor = { editor, factory, generation };
1047
+ requestEditorRender = () => tui.requestRender();
1048
+ } else if (observed.factory && !isZentuiEditorFactory(observed.factory)) {
1049
+ // A foreign wrapper built this editor beneath its own outer factory.
1050
+ layeredEditor.attach(observed.factory, generation, editor, () => tui.requestRender());
1051
+ }
730
1052
  };
731
1053
 
732
- const makeEditorFactory = (ctx: ExtensionContext): ZentuiEditorFactory => {
1054
+ const makeEditorFactory = (
1055
+ ctx: ExtensionContext,
1056
+ baseFactory: EditorFactory | undefined,
1057
+ ): ZentuiEditorFactory => {
733
1058
  const sessionTheme = ctx.ui.theme;
1059
+ const generation = sessionLifecycle.currentGeneration();
734
1060
  const factory = ((tui: TUI, theme: EditorTheme, keybindings: KeybindingsManager) => {
735
- requestEditorRender = () => tui.requestRender();
736
- return markOwnedAccentRailEditor(
737
- new PolishedEditor(
738
- tui,
739
- theme,
740
- keybindings,
741
- sessionTheme,
742
- getCurrentConfig,
743
- () => getEditorMeta(ctx),
744
- getThinkingLevel,
745
- () => ({
746
- cwd: ctx.cwd,
1061
+ const editor: PolishedEditor = new PolishedEditor(
1062
+ tui,
1063
+ theme,
1064
+ keybindings,
1065
+ sessionTheme,
1066
+ getCurrentConfig,
1067
+ () => getEditorMeta(activeTuiContext ?? ctx),
1068
+ getThinkingLevel,
1069
+ () => {
1070
+ if (host.liveModel) syncModelState(state, (activeTuiContext ?? ctx).model);
1071
+ const workingLineFrame = editorWorkingLineFrame(editor, generation);
1072
+ if (currentConfig.components.editor.style !== "minimalist") {
1073
+ return { cwd: "", workingLineFrame };
1074
+ }
1075
+ return {
1076
+ codexQuota: getEditorQuota(),
1077
+ cwd: (activeTuiContext ?? ctx).cwd,
747
1078
  projectRoot: minimalistProjectRoot,
748
1079
  branch: state.branch,
749
1080
  dirty: state.dirty,
750
1081
  ahead: state.ahead,
751
1082
  behind: state.behind,
752
1083
  costLabel: state.costLabel,
1084
+ customVariables: customVariables.snapshot(),
1085
+ modelId: state.modelId,
1086
+ modelName: state.modelName,
1087
+ provider: state.providerLabel,
1088
+ inputTokens: state.usageTotals.input,
1089
+ outputTokens: state.usageTotals.output,
753
1090
  modelLabel: modelLabelFor(state, currentConfig.components.editor.modelLabel),
754
1091
  thinkingLevel: getThinkingLevel(),
755
- contextPercent: getContextPercent(ctx),
756
- contextWindow: getContextWindow(ctx),
757
- sessionName: ctx.sessionManager.getSessionName() ?? "",
1092
+ fastMode: host.getFastMode?.(activeTuiContext ?? ctx),
1093
+ hostTemplateValues: getEditorHostTemplateValues(activeTuiContext ?? ctx),
1094
+ ...getEditorContextMetadata(activeTuiContext ?? ctx),
1095
+ cacheHitRate: state.usageTotals.latestCacheHitRate,
1096
+ sessionName: (activeTuiContext ?? ctx).sessionManager.getSessionName() ?? "",
758
1097
  agentDurationMs: getAgentDurationMs(),
759
1098
  agentActive: agentRunActive,
760
- }),
761
- setMinimalistDecorationActive,
762
- ),
1099
+ workingLineFrame,
1100
+ };
1101
+ },
1102
+ (active) => {
1103
+ if (isVisibleEditor(editor, generation)) setMinimalistDecorationActive(active, editor);
1104
+ },
1105
+ () => editorBorderCapabilityChanged(editor, generation),
1106
+ () => editorMetadataDecorationChanged(editor, generation),
763
1107
  );
1108
+ registerConstructedEditor(ctx, factory, generation, editor, tui);
1109
+ return editor;
764
1110
  }) as ZentuiEditorFactory;
765
1111
  factory[ZENTUI_EDITOR_FACTORY] = true;
766
1112
  factory[ZENTUI_EDITOR_OWNER] = editorOwnerToken;
1113
+ // Retain an observed predecessor for restoration without delegating input to it.
1114
+ factory[ZENTUI_EDITOR_BASE_FACTORY] = baseFactory;
767
1115
  return factory;
768
1116
  };
769
1117
 
@@ -772,34 +1120,55 @@ export default function (pi: ExtensionAPI) {
772
1120
  baseFactory: EditorFactory,
773
1121
  ): ZentuiEditorFactory => {
774
1122
  const sessionTheme = ctx.ui.theme;
1123
+ const generation = sessionLifecycle.currentGeneration();
775
1124
  const factory = ((tui: TUI, theme: EditorTheme, keybindings: KeybindingsManager) => {
776
- requestEditorRender = () => tui.requestRender();
777
- return markOwnedAccentRailEditor(
778
- new WrappedPolishedEditor(
779
- baseFactory(tui, theme, keybindings),
780
- sessionTheme,
781
- getCurrentConfig,
782
- () => getEditorMeta(ctx),
783
- getThinkingLevel,
784
- () => ({
785
- cwd: ctx.cwd,
1125
+ const editor: WrappedPolishedEditor = new WrappedPolishedEditor(
1126
+ baseFactory(tui, theme, keybindings),
1127
+ sessionTheme,
1128
+ getCurrentConfig,
1129
+ () => getEditorMeta(activeTuiContext ?? ctx),
1130
+ getThinkingLevel,
1131
+ () => {
1132
+ if (host.liveModel) syncModelState(state, (activeTuiContext ?? ctx).model);
1133
+ const workingLineFrame = editorWorkingLineFrame(editor, generation);
1134
+ if (currentConfig.components.editor.style !== "minimalist") {
1135
+ return { cwd: "", workingLineFrame };
1136
+ }
1137
+ return {
1138
+ codexQuota: getEditorQuota(),
1139
+ cwd: (activeTuiContext ?? ctx).cwd,
786
1140
  projectRoot: minimalistProjectRoot,
787
1141
  branch: state.branch,
788
1142
  dirty: state.dirty,
789
1143
  ahead: state.ahead,
790
1144
  behind: state.behind,
791
1145
  costLabel: state.costLabel,
1146
+ customVariables: customVariables.snapshot(),
1147
+ modelId: state.modelId,
1148
+ modelName: state.modelName,
1149
+ provider: state.providerLabel,
1150
+ inputTokens: state.usageTotals.input,
1151
+ outputTokens: state.usageTotals.output,
792
1152
  modelLabel: modelLabelFor(state, currentConfig.components.editor.modelLabel),
793
1153
  thinkingLevel: getThinkingLevel(),
794
- contextPercent: getContextPercent(ctx),
795
- contextWindow: getContextWindow(ctx),
796
- sessionName: ctx.sessionManager.getSessionName() ?? "",
1154
+ fastMode: host.getFastMode?.(activeTuiContext ?? ctx),
1155
+ hostTemplateValues: getEditorHostTemplateValues(activeTuiContext ?? ctx),
1156
+ ...getEditorContextMetadata(activeTuiContext ?? ctx),
1157
+ cacheHitRate: state.usageTotals.latestCacheHitRate,
1158
+ sessionName: (activeTuiContext ?? ctx).sessionManager.getSessionName() ?? "",
797
1159
  agentDurationMs: getAgentDurationMs(),
798
1160
  agentActive: agentRunActive,
799
- }),
800
- setMinimalistDecorationActive,
801
- ),
1161
+ workingLineFrame,
1162
+ };
1163
+ },
1164
+ (active) => {
1165
+ if (isVisibleEditor(editor, generation)) setMinimalistDecorationActive(active, editor);
1166
+ },
1167
+ () => editorBorderCapabilityChanged(editor, generation),
1168
+ () => editorMetadataDecorationChanged(editor, generation),
802
1169
  );
1170
+ registerConstructedEditor(ctx, factory, generation, editor, tui);
1171
+ return editor;
803
1172
  }) as ZentuiEditorFactory;
804
1173
  factory[ZENTUI_EDITOR_FACTORY] = true;
805
1174
  factory[ZENTUI_EDITOR_OWNER] = editorOwnerToken;
@@ -826,9 +1195,10 @@ export default function (pi: ExtensionAPI) {
826
1195
  const baseFactory =
827
1196
  currentZentuiBaseFactory ??
828
1197
  (currentFactory && !isZentuiEditorFactory(currentFactory) ? currentFactory : undefined);
829
- const nextFactory = baseFactory
830
- ? makeWrappedEditorFactory(ctx, baseFactory)
831
- : makeEditorFactory(ctx);
1198
+ const nextFactory =
1199
+ baseFactory && host.wrapEditor !== false
1200
+ ? makeWrappedEditorFactory(ctx, baseFactory)
1201
+ : makeEditorFactory(ctx, baseFactory);
832
1202
  const replacement = replaceEditor(ctx, nextFactory);
833
1203
  if (!replacement.ok) return replacement;
834
1204
 
@@ -895,6 +1265,9 @@ export default function (pi: ExtensionAPI) {
895
1265
  requestFooterRender = undefined;
896
1266
  getActiveExtensionStatuses = () => new Map();
897
1267
  stopSessionTimer();
1268
+ customVariables.reconcile();
1269
+ codexQuota.reconcile();
1270
+ reconcileLiveMetadata();
898
1271
  if (sessionLifecycle.isCurrent()) reconcileProjectRefresh(ctx, true);
899
1272
  };
900
1273
 
@@ -937,6 +1310,7 @@ export default function (pi: ExtensionAPI) {
937
1310
  const installStatusLine = (ctx: ExtensionContext) => {
938
1311
  if (installedFooterKind === "starship" && ownsStatusLine(ctx)) return;
939
1312
  const token = Symbol("zentui-starship-footer");
1313
+ const generation = sessionLifecycle.currentGeneration();
940
1314
  const previous = snapshotFooterBookkeeping(ctx);
941
1315
  try {
942
1316
  installFooter(ctx, state, getCurrentConfig, {
@@ -944,11 +1318,22 @@ export default function (pi: ExtensionAPI) {
944
1318
  requestFooterRender = fn;
945
1319
  },
946
1320
  scheduleProjectRefresh,
1321
+ onProjectChanged: () => {
1322
+ if (sessionLifecycle.isCurrent(generation) && ownsStatusLine(ctx))
1323
+ liveMetadata.invalidateProject();
1324
+ },
947
1325
  setExtensionStatusesGetter(fn) {
948
1326
  getActiveExtensionStatuses = fn ?? (() => new Map());
949
1327
  },
1328
+ getThinkingLevel,
1329
+ beforeRender: host.liveModel ? () => syncModelState(state, ctx.model) : undefined,
1330
+ getFastMode: () => host.getFastMode?.(ctx),
1331
+ getHostTemplateValues: (names) =>
1332
+ liveMetadata.read(names, host.getHostTemplateValues?.(ctx, names)),
950
1333
  getLiveContext: () => liveContext.get(),
951
- getRepositoryRoot: (cwd) => repositoryRoots.rootForCwd(cwd),
1334
+ getCodexQuota: () => codexQuota.get(),
1335
+ getCustomVariables: () => customVariables.snapshot(),
1336
+ getRepositoryRoot: (cwd) => repositoryRoots.cachedRootForCwd(cwd),
952
1337
  onDispose: () => clearFooterOwnership(ctx, token),
953
1338
  });
954
1339
  installedFooterKind = "starship";
@@ -966,12 +1351,18 @@ export default function (pi: ExtensionAPI) {
966
1351
  const token = Symbol("zentui-hidden-footer");
967
1352
  const previous = snapshotFooterBookkeeping(ctx);
968
1353
  try {
969
- installHiddenFooter(ctx, () => clearFooterOwnership(ctx, token));
1354
+ installHiddenFooter(ctx, () => currentConfig.components.extensionStatuses, {
1355
+ setRequestRender: (fn) => {
1356
+ requestFooterRender = fn;
1357
+ },
1358
+ setExtensionStatusesGetter: (fn) => {
1359
+ getActiveExtensionStatuses = fn ?? (() => new Map());
1360
+ },
1361
+ onDispose: () => clearFooterOwnership(ctx, token),
1362
+ });
970
1363
  installedFooterKind = "hidden";
971
1364
  installedFooterToken = token;
972
1365
  setStatusLineOwnership(ctx, token);
973
- requestFooterRender = undefined;
974
- getActiveExtensionStatuses = () => new Map();
975
1366
  stopSessionTimer();
976
1367
  } catch {
977
1368
  resetFailedFooterInstallation(ctx, token, previous);
@@ -1006,6 +1397,7 @@ export default function (pi: ExtensionAPI) {
1006
1397
  uninstallStatusLine(ctx);
1007
1398
  break;
1008
1399
  }
1400
+ syncFooterTelemetry(ctx);
1009
1401
  };
1010
1402
 
1011
1403
  const reconcileEditor = (
@@ -1038,6 +1430,10 @@ export default function (pi: ExtensionAPI) {
1038
1430
  ok: false,
1039
1431
  reason: "the editor could not be reconciled safely; reload Pi to apply this change",
1040
1432
  };
1433
+ } finally {
1434
+ if (workingLineSessionReady) {
1435
+ if (!host.skinOnly) workingLine.reconcile(ctx);
1436
+ }
1041
1437
  }
1042
1438
  };
1043
1439
 
@@ -1060,6 +1456,7 @@ export default function (pi: ExtensionAPI) {
1060
1456
  reconcileProjectRefresh(ctx);
1061
1457
  reconcileSessionTimer();
1062
1458
  reconcileAgentTimer();
1459
+ syncFooterUsage(ctx);
1063
1460
  return result;
1064
1461
  };
1065
1462
 
@@ -1080,10 +1477,12 @@ export default function (pi: ExtensionAPI) {
1080
1477
  } catch {
1081
1478
  // Startup alone may supersede a stale registration from an earlier reload.
1082
1479
  }
1083
- try {
1084
- removeSelectorBorderStyle();
1085
- } catch {
1086
- // Startup alone may supersede a stale registration from an earlier reload.
1480
+ if (!host.skinOnly) {
1481
+ try {
1482
+ removeSelectorBorderStyle();
1483
+ } catch {
1484
+ // Startup alone may supersede a stale registration from an earlier reload.
1485
+ }
1087
1486
  }
1088
1487
  uninstallStatusLine(ctx);
1089
1488
  if (effectiveEditorEnabled()) clearEditorOwnership();
@@ -1106,6 +1505,9 @@ export default function (pi: ExtensionAPI) {
1106
1505
  if (!observed.known) return;
1107
1506
  if (observed.factory === installedEditorFactory) {
1108
1507
  reconcileProjectRefresh(ctx);
1508
+ const previousTotals = state.usageTotals;
1509
+ syncFooterUsage(ctx);
1510
+ if (state.usageTotals !== previousTotals) refresh();
1109
1511
  return;
1110
1512
  }
1111
1513
  if (!observed.factory || !isOwnedEditorFactory(observed.factory)) {
@@ -1116,6 +1518,7 @@ export default function (pi: ExtensionAPI) {
1116
1518
  }
1117
1519
  trackZentuiEditorFactory(observed.factory);
1118
1520
  reconcileProjectRefresh(ctx);
1521
+ syncFooterUsage(ctx);
1119
1522
  refresh();
1120
1523
  });
1121
1524
  };
@@ -1123,6 +1526,11 @@ export default function (pi: ExtensionAPI) {
1123
1526
  const cleanupUi = (ctx?: ExtensionContext) => {
1124
1527
  if (!ctx || !sessionLifecycle.isCurrent()) return;
1125
1528
  sessionLifecycle.shutdown();
1529
+ activeEditor = undefined;
1530
+ minimalistDecorationEditor = undefined;
1531
+ layeredEditor.detach();
1532
+ extensionStatuses.dispose();
1533
+ codexQuota.stop();
1126
1534
  stopSessionTimer();
1127
1535
  resetAgentTimer();
1128
1536
  stopProjectRefresh();
@@ -1154,9 +1562,6 @@ export default function (pi: ExtensionAPI) {
1154
1562
  }
1155
1563
  }
1156
1564
  if (!retainedEditorOwnership) clearEditorOwnership();
1157
- accentRailLayoutPatchInstallSerial += 1;
1158
- cleanupAccentRailLayoutPatch();
1159
- cleanupAccentRailLayoutPatch = () => {};
1160
1565
  uninstallUserMessages();
1161
1566
  uninstallSelectorBorders();
1162
1567
  installedFooterKind = undefined;
@@ -1176,80 +1581,115 @@ export default function (pi: ExtensionAPI) {
1176
1581
  };
1177
1582
 
1178
1583
  pi.on("session_start", async (_event, ctx) => {
1584
+ unsubscribeHostProjectChanges();
1585
+ liveMetadata.dispose();
1586
+ liveMetadata = createLiveMetadata();
1587
+ codexQuota.stop();
1588
+ usageTotals.invalidate();
1589
+ footerTelemetry.reset();
1590
+ customVariableSessionReady = false;
1591
+ customVariables.clear();
1179
1592
  const lifecycleGeneration = sessionLifecycle.start();
1593
+ unsubscribeHostProjectChanges = isTuiContext(ctx)
1594
+ ? (host.subscribeProjectChanges?.(() => {
1595
+ if (sessionLifecycle.isCurrent(lifecycleGeneration)) liveMetadata.invalidateProject();
1596
+ }) ?? (() => {}))
1597
+ : () => {};
1598
+ activeEditor = undefined;
1599
+ minimalistDecorationEditor = undefined;
1180
1600
  // A new generation must not expose or route extension segments through the previous
1181
- // session while asynchronous TUI startup is still pending.
1601
+ // session while TUI startup is in progress.
1182
1602
  workingLineSessionReady = false;
1183
- workingLineExtensions.invalidate();
1184
- if (activeTuiContext) workingLine.dispose(activeTuiContext);
1185
- else workingLine.invalidateExtensionSegments();
1603
+ if (!host.skinOnly) workingLineExtensions.invalidate();
1604
+ if (activeTuiContext) {
1605
+ if (!host.skinOnly) workingLine.dispose(activeTuiContext);
1606
+ } else {
1607
+ if (!host.skinOnly) workingLine.invalidateExtensionSegments();
1608
+ }
1186
1609
  // Reload synchronously so private ownership uses this session's disk snapshot before
1187
1610
  // any await or transcript restoration.
1188
- currentConfig = loadConfig();
1189
- thinkingExperimental.startSession(ctx);
1190
- const layoutInstallSerial = ++accentRailLayoutPatchInstallSerial;
1191
- cleanupAccentRailLayoutPatch();
1192
- cleanupAccentRailLayoutPatch = () => {};
1193
- if (isTuiContext(ctx)) {
1194
- const layoutPatchRetention = await retainAccentRailLayoutPatchInstallation(
1195
- () => installHostAccentRailLayoutPatch(editorOwnerToken),
1196
- () =>
1197
- sessionLifecycle.isCurrent(lifecycleGeneration) &&
1198
- layoutInstallSerial === accentRailLayoutPatchInstallSerial,
1199
- (layoutPatch) => {
1200
- cleanupAccentRailLayoutPatch = layoutPatch.cleanup;
1201
- recordAccentRailLayoutPatchDiagnostic(layoutPatch.diagnostic, layoutPatch.version);
1202
- },
1203
- );
1204
- if (layoutPatchRetention === "stale") return;
1205
- if (layoutPatchRetention === "failed") {
1206
- recordAccentRailLayoutPatchDiagnostic("host-module-unavailable");
1207
- }
1208
- }
1611
+ currentConfig = scopeConfig(loadConfig());
1612
+ extensionStatuses.dispose();
1613
+ if (!host.skinOnly && isTuiContext(ctx)) extensionStatuses.install(ctx.ui);
1614
+ if (!host.skinOnly) thinkingExperimental.startSession(ctx);
1209
1615
  if (!sessionLifecycle.isCurrent(lifecycleGeneration)) return;
1210
1616
  liveContext.clear();
1211
1617
  interactionMetrics.shutdown();
1212
- workingLineExtensions.invalidate();
1618
+ summaryRate.reset();
1619
+ if (!host.skinOnly) workingLineExtensions.invalidate();
1213
1620
  state.sessionStartEpoch = Date.now();
1214
- invalidateUsageTotalsCache();
1215
1621
  resetAgentTimer();
1216
1622
  lastProjectCwd = undefined;
1217
1623
  minimalistProjectRoot = undefined;
1218
1624
  repositoryRoots.reset();
1219
1625
  installUi(ctx);
1220
- workingLine.startSession(ctx);
1221
- workingLineSessionReady = true;
1626
+ customVariableSessionReady = isTuiContext(ctx);
1627
+ if (!host.skinOnly) workingLine.startSession(ctx);
1628
+ workingLineSessionReady = !host.skinOnly;
1629
+ reconcileLiveMetadata();
1222
1630
  scheduleEditorReconciliation(ctx);
1223
1631
  });
1224
1632
 
1225
1633
  registerZentuiSettingsCommand(pi, {
1226
1634
  sessionLifecycle,
1635
+ skinOnly: host.skinOnly,
1227
1636
  getConfig: getCurrentConfig,
1228
1637
  applyPreset(id, ctx, options) {
1229
1638
  const preset = getComponentPreset(id);
1230
1639
  if (!preset) throw new Error(`Unknown Zentui preset: ${id}`);
1231
1640
  const previousFooterStyle = effectiveFooterStyle();
1232
- currentConfig = saveComponentPreset(preset);
1641
+ currentConfig = scopeConfig(saveComponentPreset(preset));
1233
1642
  if (!isTuiContext(ctx)) return { applied: true };
1234
1643
  activeTheme = ctx.ui.theme;
1235
1644
  const result = options?.deferEditor ? undefined : reconcileEditor(ctx);
1236
1645
  if (currentConfig.components.editor.style !== "minimalist") {
1237
1646
  setMinimalistDecorationActive(false);
1238
1647
  }
1648
+ if (!host.skinOnly) workingLine.reconcile(ctx);
1239
1649
  reconcileUserMessages();
1240
1650
  reconcileFooter(ctx);
1241
1651
  reconcileProjectRefresh(ctx, effectiveFooterStyle() !== previousFooterStyle);
1242
1652
  reconcileSessionTimer();
1243
1653
  reconcileAgentTimer();
1654
+ syncFooterUsage(ctx);
1244
1655
  refresh();
1245
1656
  return {
1246
1657
  applied: !result || result.ok,
1247
1658
  reason: result && !result.ok ? result.reason : undefined,
1248
1659
  };
1249
1660
  },
1661
+ migrateSelections(ctx) {
1662
+ currentConfig = scopeConfig(migrateComponentSelections());
1663
+ if (!isTuiContext(ctx)) return;
1664
+ activeTheme = ctx.ui.theme;
1665
+ reconcileEditor(ctx);
1666
+ reconcileUserMessages();
1667
+ reconcileSelectorBorders();
1668
+ reconcileFooter(ctx);
1669
+ if (!host.skinOnly) workingLine.reconcile(ctx);
1670
+ if (!host.skinOnly) thinkingExperimental.reconcile();
1671
+ syncFooterState(ctx);
1672
+ reconcileProjectRefresh(ctx);
1673
+ reconcileSessionTimer();
1674
+ reconcileAgentTimer();
1675
+ refresh();
1676
+ },
1677
+ getCustomVariables: () => customVariables.snapshot(),
1678
+ setCustomValueColor(owner, key, value) {
1679
+ currentConfig = scopeConfig(saveCustomValueColor(owner, key, value));
1680
+ refresh();
1681
+ },
1682
+ setComponentColor(owner, key, value, ctx) {
1683
+ currentConfig = scopeConfig(saveComponentColor(owner, key, value));
1684
+ if (owner === "workingLine") {
1685
+ if (!host.skinOnly) workingLine.reconcile(ctx);
1686
+ }
1687
+ refresh();
1688
+ },
1250
1689
  reconcilePresetEditor(ctx) {
1251
1690
  if (!isTuiContext(ctx) || !sessionLifecycle.isCurrent()) return { applied: true };
1252
1691
  const result = reconcileEditor(ctx);
1692
+ syncFooterUsage(ctx);
1253
1693
  reconcileProjectRefresh(ctx);
1254
1694
  reconcileAgentTimer();
1255
1695
  refresh();
@@ -1259,7 +1699,7 @@ export default function (pi: ExtensionAPI) {
1259
1699
  };
1260
1700
  },
1261
1701
  setEditorComponent(patch: Partial<EditorComponentConfig>, ctx: ExtensionContext, options) {
1262
- currentConfig = saveEditorComponentPatch(patch);
1702
+ currentConfig = scopeConfig(saveEditorComponentPatch(patch));
1263
1703
  let result: EditorChangeResult | undefined;
1264
1704
  if (patch.enabled !== undefined && isTuiContext(ctx) && !options?.deferEditor) {
1265
1705
  result = reconcileEditor(ctx);
@@ -1267,6 +1707,8 @@ export default function (pi: ExtensionAPI) {
1267
1707
  if (patch.style !== undefined && patch.style !== "minimalist") {
1268
1708
  setMinimalistDecorationActive(false);
1269
1709
  }
1710
+ if (!host.skinOnly) workingLine.reconcile(ctx);
1711
+ syncFooterUsage(ctx);
1270
1712
  if (patch.modelLabel !== undefined) syncFooterState(ctx);
1271
1713
  reconcileProjectRefresh(ctx);
1272
1714
  reconcileAgentTimer();
@@ -1276,29 +1718,38 @@ export default function (pi: ExtensionAPI) {
1276
1718
  reason: result && !result.ok ? result.reason : undefined,
1277
1719
  };
1278
1720
  },
1279
- setPolished(patch: Partial<PolishedEditorStyleConfig>, _ctx: ExtensionContext) {
1280
- currentConfig = savePolishedEditorStylePatch(patch);
1721
+ setPolished(patch: Partial<PolishedEditorStyleConfig>, ctx: ExtensionContext) {
1722
+ currentConfig = scopeConfig(savePolishedEditorStylePatch(patch));
1723
+ syncFooterUsage(ctx);
1281
1724
  refresh();
1282
1725
  },
1283
1726
  setPolishedCopyFriendly(
1284
1727
  patch: Partial<PolishedCopyFriendlyEditorStyleConfig>,
1285
- _ctx: ExtensionContext,
1728
+ ctx: ExtensionContext,
1286
1729
  ) {
1287
- currentConfig = savePolishedCopyFriendlyEditorStylePatch(patch);
1730
+ currentConfig = scopeConfig(savePolishedCopyFriendlyEditorStylePatch(patch));
1731
+ syncFooterUsage(ctx);
1288
1732
  refresh();
1289
1733
  },
1290
1734
  setAccentRail(patch: Partial<AccentRailEditorStyleConfig>, _ctx: ExtensionContext) {
1291
- currentConfig = saveAccentRailEditorStylePatch(patch);
1735
+ currentConfig = scopeConfig(saveAccentRailEditorStylePatch(patch));
1292
1736
  refresh();
1293
1737
  },
1294
- setMinimalist(patch: Partial<MinimalistConfig>, ctx: ExtensionContext) {
1295
- currentConfig = saveMinimalistEditorStylePatch(patch);
1738
+ setMinimalist(patch: MinimalistEditorStylePatch, ctx: ExtensionContext) {
1739
+ currentConfig = scopeConfig(saveMinimalistEditorStylePatch(patch));
1740
+ customVariables.reconcile();
1741
+ syncFooterUsage(ctx);
1296
1742
  reconcileAgentTimer();
1297
- reconcileProjectRefresh(ctx, patch.pathDisplay !== undefined || patch.showGit !== undefined);
1743
+ reconcileProjectRefresh(
1744
+ ctx,
1745
+ patch.formats !== undefined ||
1746
+ patch.pathDisplay !== undefined ||
1747
+ patch.showGit !== undefined,
1748
+ );
1298
1749
  refresh();
1299
1750
  },
1300
1751
  setUserMessagesComponent(patch: Partial<UserMessagesComponentConfig>, _ctx: ExtensionContext) {
1301
- currentConfig = saveUserMessagesComponentPatch(patch);
1752
+ currentConfig = scopeConfig(saveUserMessagesComponentPatch(patch));
1302
1753
  if (patch.enabled !== undefined || patch.style !== undefined) reconcileUserMessages();
1303
1754
  refresh();
1304
1755
  },
@@ -1307,30 +1758,36 @@ export default function (pi: ExtensionAPI) {
1307
1758
  patch: Partial<ThinkingStepsComponentConfig>,
1308
1759
  _ctx: ExtensionContext,
1309
1760
  ) {
1310
- currentConfig = saveThinkingStepsComponentPatch(patch);
1761
+ currentConfig = scopeConfig(saveThinkingStepsComponentPatch(patch));
1311
1762
  return thinkingExperimental.reconcile();
1312
1763
  },
1313
1764
  setWorkingLineComponent(patch: WorkingLineComponentPatch, ctx: ExtensionContext) {
1314
- currentConfig = saveWorkingLineComponentPatch(patch);
1315
- if (patch.enabled === false) workingLineExtensions.clear();
1316
- return workingLine.reconcile(ctx);
1765
+ currentConfig = scopeConfig(saveWorkingLineComponentPatch(patch));
1766
+ if (patch.enabled === false) {
1767
+ if (!host.skinOnly) workingLineExtensions.clear();
1768
+ }
1769
+ summaryRate.reconcile(summaryEnabled());
1770
+ const result = workingLine.reconcile(ctx);
1771
+ reconcileLiveMetadata();
1772
+ return result;
1317
1773
  },
1318
1774
  setSelectorBordersComponent(
1319
1775
  patch: Partial<SelectorBordersComponentConfig>,
1320
1776
  _ctx: ExtensionContext,
1321
1777
  ) {
1322
- currentConfig = saveSelectorBordersComponentPatch(patch);
1778
+ currentConfig = scopeConfig(saveSelectorBordersComponentPatch(patch));
1323
1779
  if (patch.enabled !== undefined || patch.style !== undefined) reconcileSelectorBorders();
1324
1780
  refresh();
1325
1781
  },
1326
1782
  setFooterComponent(patch: Partial<FooterComponentConfig>, ctx: ExtensionContext) {
1327
1783
  const previousStyle = effectiveFooterStyle();
1328
- currentConfig = saveFooterComponentPatch(patch);
1784
+ currentConfig = scopeConfig(saveFooterComponentPatch(patch));
1329
1785
  const styleChanged = effectiveFooterStyle() !== previousStyle;
1330
1786
  if (patch.style !== undefined) reconcileFooter(ctx);
1331
1787
  if (patch.modelLabel !== undefined) syncFooterState(ctx);
1332
1788
  reconcileProjectRefresh(ctx, styleChanged);
1333
1789
  reconcileSessionTimer();
1790
+ syncFooterUsage(ctx);
1334
1791
  refresh();
1335
1792
  },
1336
1793
  setFooterSegments(patch: Partial<FooterSegmentsConfig>, ctx: ExtensionContext) {
@@ -1355,42 +1812,60 @@ export default function (pi: ExtensionAPI) {
1355
1812
  );
1356
1813
  },
1357
1814
  setIconMode(mode: IconMode) {
1358
- currentConfig = saveIconsModePatch(mode);
1815
+ currentConfig = scopeConfig(saveIconsModePatch(mode));
1359
1816
  },
1360
1817
  setContextStyle(style: ContextStyle) {
1361
- currentConfig = saveStarshipFooterStylePatch({ contextStyle: style });
1818
+ currentConfig = scopeConfig(saveStarshipFooterStylePatch({ contextStyle: style }));
1362
1819
  },
1363
1820
  setSeparator(separator: SeparatorStyle) {
1364
- currentConfig = saveStarshipFooterStylePatch({ separator });
1821
+ currentConfig = scopeConfig(saveStarshipFooterStylePatch({ separator }));
1365
1822
  },
1366
1823
  setPathDisplay(patch: Partial<PathDisplayConfig>) {
1367
- currentConfig = saveStarshipFooterStylePatch({ pathDisplay: patch as PathDisplayConfig });
1824
+ currentConfig = scopeConfig(
1825
+ saveStarshipFooterStylePatch({ pathDisplay: patch as PathDisplayConfig }),
1826
+ );
1827
+ if (activeTuiContext) reconcileProjectRefresh(activeTuiContext, true);
1368
1828
  },
1369
1829
  setGitBranch(patch: Partial<GitBranchConfig>) {
1370
- currentConfig = saveStarshipFooterStylePatch({ gitBranch: patch as GitBranchConfig });
1830
+ currentConfig = scopeConfig(
1831
+ saveStarshipFooterStylePatch({ gitBranch: patch as GitBranchConfig }),
1832
+ );
1371
1833
  },
1372
1834
  setGitCommit(
1373
1835
  patch: Partial<Pick<GitCommitConfig, "onlyDetached" | "showTag">>,
1374
1836
  ctx: ExtensionContext,
1375
1837
  ) {
1376
- currentConfig = saveStarshipFooterStylePatch({ gitCommit: patch as GitCommitConfig });
1838
+ currentConfig = scopeConfig(
1839
+ saveStarshipFooterStylePatch({ gitCommit: patch as GitCommitConfig }),
1840
+ );
1377
1841
  if (patch.showTag !== undefined) reconcileProjectRefresh(ctx, true);
1378
1842
  },
1379
1843
  setGitMetrics(patch: Partial<GitMetricsConfig>, ctx: ExtensionContext) {
1380
- currentConfig = saveStarshipFooterStylePatch({ gitMetrics: patch as GitMetricsConfig });
1844
+ currentConfig = scopeConfig(
1845
+ saveStarshipFooterStylePatch({ gitMetrics: patch as GitMetricsConfig }),
1846
+ );
1381
1847
  if (patch.ignoreSubmodules !== undefined) reconcileProjectRefresh(ctx, true);
1382
1848
  },
1383
1849
  getActiveExtensionStatuses() {
1384
- return getActiveExtensionStatuses();
1850
+ return new Map([...getActiveExtensionStatuses(), ...extensionStatuses.snapshot()]);
1851
+ },
1852
+ setExtensionStatusDefaultChoice(placement: ExtensionStatusPlacement) {
1853
+ currentConfig = scopeConfig(
1854
+ saveExtensionStatusDefaultChoice(placement, currentConfig.components.footer.style),
1855
+ );
1856
+ extensionStatuses.reconcile();
1385
1857
  },
1386
- setExtensionStatusDefaultPlacement(placement: ExtensionStatusPlacement) {
1387
- currentConfig = saveExtensionStatusDefaultPlacement(placement);
1858
+ setExtensionStatusChoice(key: string, choice: ExtensionStatusChoice) {
1859
+ currentConfig = scopeConfig(
1860
+ saveExtensionStatusChoice(key, choice, currentConfig.components.footer.style),
1861
+ );
1862
+ extensionStatuses.reconcile();
1388
1863
  },
1389
- setExtensionStatusPlacement(key: string, placement: ExtensionStatusPlacement) {
1390
- currentConfig = saveExtensionStatusPlacement(key, placement);
1864
+ setHiddenExtensionStatusColorMode(key, colorMode) {
1865
+ currentConfig = scopeConfig(saveHiddenExtensionStatusColorMode(key, colorMode));
1391
1866
  },
1392
1867
  setExtensionStatusColorMode(key: string, colorMode: ExtensionStatusColorMode) {
1393
- currentConfig = saveExtensionStatusColorMode(key, colorMode);
1868
+ currentConfig = scopeConfig(saveExtensionStatusColorMode(key, colorMode));
1394
1869
  },
1395
1870
  requestRender() {
1396
1871
  refresh();
@@ -1398,66 +1873,95 @@ export default function (pi: ExtensionAPI) {
1398
1873
  });
1399
1874
 
1400
1875
  pi.on("session_shutdown", async (_event, ctx) => {
1876
+ unsubscribeHostProjectChanges();
1877
+ liveMetadata.dispose();
1878
+ customVariableSessionReady = false;
1879
+ customVariables.clear();
1880
+ usageTotals.invalidate();
1881
+ footerTelemetry.reset();
1401
1882
  workingLineSessionReady = false;
1402
- thinkingExperimental.shutdown();
1883
+ if (!host.skinOnly) thinkingExperimental.shutdown();
1403
1884
  liveContext.clear();
1404
1885
  interactionMetrics.shutdown();
1405
- workingLine.dispose(ctx);
1406
- workingLineExtensions.invalidate();
1886
+ summaryRate.reset();
1887
+ if (!host.skinOnly) workingLine.dispose(ctx);
1888
+ if (!host.skinOnly) workingLineExtensions.invalidate();
1407
1889
  cleanupUi(ctx);
1408
1890
  });
1409
1891
 
1410
1892
  const syncInteractiveAndProjectStateWithUsage = (_event: unknown, ctx: ExtensionContext) => {
1411
- invalidateUsageTotalsCache();
1893
+ usageTotals.invalidate();
1412
1894
  refreshInteractiveState(ctx, true);
1413
1895
  };
1414
1896
 
1415
- pi.on("message_start", (event) => thinkingExperimental.beginMessage(event));
1897
+ if (!host.skinOnly) pi.on("message_start", (event) => thinkingExperimental.beginMessage(event));
1416
1898
 
1417
1899
  pi.on("agent_start", (event, ctx) => {
1418
1900
  liveContext.clear();
1419
1901
  const { interactionStarted } = interactionMetrics.agentStart();
1902
+ liveMetadata.startAgent(interactionStarted);
1903
+ summaryRate.agentStart(interactionStarted, summaryEnabled());
1420
1904
  startAgentTurn(interactionStarted);
1421
- workingLine.startAgent(ctx);
1905
+ if (!host.skinOnly) workingLine.startAgent(ctx);
1422
1906
  syncInteractiveState(event, ctx);
1423
1907
  });
1424
1908
  pi.on("turn_start", (_event, ctx) => {
1909
+ liveMetadata.startResponse();
1425
1910
  interactionMetrics.turnStart();
1426
- workingLine.startTurn(ctx);
1911
+ summaryRate.turnStart();
1912
+ if (!host.skinOnly) workingLine.startTurn(ctx);
1427
1913
  });
1428
1914
  pi.on("agent_end", (event, ctx) => {
1429
- thinkingExperimental.endAgent();
1915
+ suspendTokenRate();
1916
+ if (!host.skinOnly) thinkingExperimental.endAgent();
1430
1917
  liveContext.clear();
1431
1918
  const displayTokens = interactionMetrics.currentDisplayTokens();
1432
1919
  interactionMetrics.agentEnd();
1920
+ summaryRate.agentEnd();
1433
1921
  pauseAgentRun();
1434
- workingLine.finishAgent(ctx);
1435
- workingLine.updateMetrics(displayTokens, interactionMetrics.currentThought(), ctx);
1922
+ if (host.skinOnly) {
1923
+ const settled = interactionMetrics.settle(ctx.isIdle());
1924
+ if (settled) settleAgentTurn(settled.nextStartedAt);
1925
+ }
1926
+ if (!host.skinOnly) workingLine.finishAgent(ctx);
1927
+ if (!host.skinOnly)
1928
+ workingLine.flushMetrics(displayTokens, interactionMetrics.currentThought(), ctx);
1436
1929
  // Reconcile once more after Pi has persisted the assistant message.
1437
1930
  syncInteractiveAndProjectStateWithUsage(event, ctx);
1438
1931
  });
1439
1932
  pi.on("model_select", (event, ctx) => {
1933
+ clearTokenRate();
1440
1934
  liveContext.clear();
1441
1935
  syncInteractiveState(event, ctx);
1442
1936
  });
1443
1937
  pi.on("thinking_level_select", syncInteractiveState);
1444
1938
  pi.on("session_info_changed", syncInteractiveState);
1445
1939
  pi.on("message_update", (event, ctx) => {
1446
- thinkingExperimental.updateMessage(event);
1940
+ if (!host.skinOnly) thinkingExperimental.updateMessage(event);
1447
1941
  liveContext.update(event.message);
1942
+ summaryRate.observeTime();
1943
+ if (!host.skinOnly)
1944
+ liveMetadata.updateResponse(
1945
+ event.message,
1946
+ "assistantMessageEvent" in event ? event.assistantMessageEvent : undefined,
1947
+ );
1448
1948
  const metrics = interactionMetrics.messageUpdate(
1449
1949
  event.message,
1450
1950
  "assistantMessageEvent" in event ? event.assistantMessageEvent : undefined,
1451
1951
  );
1452
1952
  if (metrics.usageChanged || metrics.thoughtChanged) {
1453
- workingLine.updateMetrics(metrics.displayTokens, interactionMetrics.currentThought(), ctx);
1953
+ if (!host.skinOnly)
1954
+ workingLine.updateMetrics(metrics.displayTokens, interactionMetrics.currentThought(), ctx);
1454
1955
  }
1455
1956
  });
1456
1957
  pi.on("message_end", (event, ctx) => {
1457
- thinkingExperimental.endMessage(event);
1958
+ if (!host.skinOnly) thinkingExperimental.endMessage(event);
1458
1959
  const result = interactionMetrics.messageEnd(event.message);
1960
+ summaryRate.messageEnd(event.message, result);
1961
+ if (!host.skinOnly) liveMetadata.endResponse(event.message, result);
1459
1962
  if (result.status === "accepted") {
1460
- workingLine.updateMetrics(result.displayTokens, interactionMetrics.currentThought(), ctx);
1963
+ if (!host.skinOnly)
1964
+ workingLine.flushMetrics(result.displayTokens, interactionMetrics.currentThought(), ctx);
1461
1965
  }
1462
1966
  // Pi notifies extensions before persisting a successful message, so retain its live
1463
1967
  // context until agent_end; accepted failed messages clear immediately instead of showing
@@ -1471,48 +1975,64 @@ export default function (pi: ExtensionAPI) {
1471
1975
  }
1472
1976
  syncInteractiveAndProjectStateWithUsage(event, ctx);
1473
1977
  });
1474
- pi.on("agent_settled", (_event, ctx) => {
1475
- const settled = interactionMetrics.settle(ctx.isIdle());
1476
- if (!settled) return;
1477
- settleAgentTurn(settled.nextStartedAt);
1478
- workingLine.settle(settled.nextTokens, settled.nextThought, ctx);
1479
- const config = currentConfig.components.workingLine;
1480
- if (config.enabled && config.turnSummary) {
1481
- try {
1482
- pi.appendEntry(TURN_SUMMARY_ENTRY_TYPE, {
1483
- version: 3,
1484
- ...settled.summary,
1485
- stylePrefix: snapshotWorkingLineHighStyle(ctx.ui.theme, config, currentConfig.colors),
1486
- });
1487
- } catch {
1488
- // A transcript persistence failure must not break settlement cleanup.
1978
+ if (!host.skinOnly)
1979
+ pi.on("agent_settled", (_event, ctx) => {
1980
+ // Includes usage persisted by later agent_end handlers and pre-settlement drafts.
1981
+ usageTotals.invalidate();
1982
+ refreshInteractiveState(ctx);
1983
+ const settled = interactionMetrics.settle(ctx.isIdle());
1984
+ if (!settled) return;
1985
+ const averageTokenRate = summaryRate.settle(settled.nextStartedAt === undefined);
1986
+ if (settled.nextStartedAt !== undefined) liveMetadata.partitionRates();
1987
+ settleAgentTurn(settled.nextStartedAt);
1988
+ if (!host.skinOnly) workingLine.settle(settled.nextTokens, settled.nextThought, ctx);
1989
+ const config = currentConfig.components.workingLine;
1990
+ if (config.enabled && config.turnSummary) {
1991
+ try {
1992
+ const summary = createTurnSummaryData(
1993
+ settled.summary,
1994
+ averageTokenRate,
1995
+ ctx.ui.theme,
1996
+ config,
1997
+ currentConfig.colors,
1998
+ );
1999
+ pi.appendEntry(TURN_SUMMARY_ENTRY_TYPE, summary);
2000
+ } catch {
2001
+ // A transcript persistence failure must not break settlement cleanup.
2002
+ }
1489
2003
  }
1490
- }
1491
- // Gateway cost reconciliation lands a few seconds after settle; refresh
1492
- // once late so the cost label picks up authoritative totals when they
1493
- // arrive. Best-effort: harmless in non-TUI contexts.
1494
- sessionLifecycle.defer(
1495
- () => {
1496
- invalidateUsageTotalsCache();
2004
+ // Gateway cost reconciliation lands a few seconds after settle; refresh
2005
+ // once late so the cost label picks up authoritative totals when they
2006
+ // arrive. Best-effort: harmless in non-TUI contexts.
2007
+ sessionLifecycle.defer(() => {
2008
+ usageTotals.invalidate();
1497
2009
  refreshInteractiveState(ctx);
1498
- },
1499
- 12_000,
1500
- );
1501
- });
2010
+ }, 12_000);
2011
+ });
1502
2012
  pi.on("tool_execution_start", (event, ctx) => {
2013
+ suspendTokenRate();
1503
2014
  liveContext.clear();
1504
- workingLine.startTool(event.toolCallId, event.toolName, ctx);
2015
+ if (!host.skinOnly) workingLine.startTool(event.toolCallId, event.toolName, ctx);
1505
2016
  syncInteractiveState(event, ctx);
1506
2017
  });
1507
2018
  pi.on("tool_execution_end", (event, ctx) => {
1508
- workingLine.finishTool(event.toolCallId, ctx);
2019
+ liveMetadata.invalidateProject();
2020
+ if (!host.skinOnly) workingLine.finishTool(event.toolCallId, ctx);
1509
2021
  syncInteractiveAndProjectState(event, ctx);
1510
2022
  });
2023
+ // Hook presence changes OMP maintenance/transition behavior, even for no-op handlers.
2024
+ if (!host.skinOnly) {
2025
+ pi.on("session_before_compact", clearTokenRate);
2026
+ pi.on("session_before_switch", clearTokenRate);
2027
+ }
1511
2028
  pi.on("session_compact", (event, ctx) => {
2029
+ clearTokenRate();
1512
2030
  liveContext.clear();
1513
2031
  syncInteractiveAndProjectStateWithUsage(event, ctx);
1514
2032
  });
1515
2033
  pi.on("session_tree", (event, ctx) => {
2034
+ liveMetadata.resetRate();
2035
+ liveMetadata.invalidateProject();
1516
2036
  liveContext.clear();
1517
2037
  syncInteractiveAndProjectStateWithUsage(event, ctx);
1518
2038
  });