@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
@@ -15,17 +15,39 @@ import {
15
15
  } from "node:fs";
16
16
  import { basename, dirname, join } from "node:path";
17
17
  import { getAgentDir } from "@earendil-works/pi-coding-agent";
18
+ import {
19
+ type ColorOwner,
20
+ type ComponentColorKey,
21
+ type ComponentColors,
22
+ componentColorKeys,
23
+ normalizeComponentColors,
24
+ } from "./component-colors";
25
+ import {
26
+ type CustomValueColors,
27
+ customValueColor,
28
+ normalizeCustomValueColors,
29
+ } from "./custom-value-colors";
30
+ import { normalizeTemplateVariables } from "./custom-variable-format";
31
+ import { MAX_CUSTOM_VARIABLES } from "./custom-variables";
32
+ import { HOST_TEMPLATE_VARIABLES } from "./host-template-values";
18
33
  import {
19
34
  ICON_GLYPH_KEYS,
35
+ type IconEnvironment,
20
36
  type IconGlyphs,
21
37
  type IconMode,
22
- NERD_DEFAULT_ICONS,
23
38
  normalizeIconMode,
24
39
  type ResolvedIcons,
25
40
  resolveConfiguredIcons,
26
41
  } from "./icons";
42
+ import {
43
+ MINIMALIST_FORMAT_SLOTS,
44
+ type MinimalistFormats,
45
+ normalizeMinimalistFormats,
46
+ normalizeMinimalistVariables,
47
+ } from "./minimalist-template";
27
48
  import type { ComponentPreset } from "./presets";
28
49
  import { isSupportedColorSpec } from "./style";
50
+ import { DEFAULT_TURN_SUMMARY_FORMAT, normalizeTurnSummaryFormat } from "./turn-summary-format";
29
51
  import { normalizeWorkingLineMessages } from "./working-line";
30
52
  import { PI_WORKING_LINE_MESSAGES } from "./working-line-messages";
31
53
 
@@ -47,16 +69,18 @@ export type WorkingLineSpinner =
47
69
  | "claude-inspired"
48
70
  | "pulse";
49
71
  export type WorkingLineTextAnimation = "classic" | "kitt" | "disabled";
72
+ export type WorkingLinePlacement = "above" | "border";
50
73
  export type ThinkingStepsMode = "rail" | "tree" | "streaming";
51
74
  export type ComponentStyleOwner = "editor" | "userMessages" | "selectorBorders" | "footer";
52
75
  export type MinimalistPathDisplayMode = "compact" | "project" | "full";
53
76
  export type MinimalistContextFormat = "percent" | "percent-total";
77
+ export type MinimalistEditorSeparator = "dash" | "dot";
54
78
  export type EditorBorderColorMode = "static" | "adaptive";
55
79
  export type CompletionMenuStyle = "native" | "palette";
56
80
  export type CompactFooterMaxLines = 1 | 2 | 3 | "unlimited";
57
81
 
58
82
  export const DEFAULT_COMPACT_FOOTER_FORMAT =
59
- "$cwd$wrap(in $session_name)$wrap(on $git_branch) $git_status$wrap$context$wrap_sep$tokens";
83
+ "$cwd$wrap(in $session_name)$wrap(on $git_branch) $git_status$wrap$context$wrap_sep$tokens$wrap_sep($codex_quota)";
60
84
 
61
85
  export type ContextThresholds = {
62
86
  warning: number;
@@ -109,12 +133,34 @@ export type FooterSegmentsConfig = {
109
133
  packageVersion: boolean;
110
134
  };
111
135
 
112
- export type PolishedEditorStyleConfig = {
136
+ export type TemplateVariableConfig = {
137
+ variables?: Record<string, string>;
138
+ extensionColorMode?: ExtensionStatusColorMode;
139
+ };
140
+ export const OPENCODE_FORMAT_VARIABLES = [
141
+ "model",
142
+ "model_id",
143
+ "model_name",
144
+ "provider",
145
+ "thinking",
146
+ "fast_mode",
147
+ "session_name",
148
+ "context",
149
+ "tokens",
150
+ "cache_hit",
151
+ "codex_quota",
152
+ "sep",
153
+ "join_sep",
154
+ "separator",
155
+ ...HOST_TEMPLATE_VARIABLES,
156
+ ] as const;
157
+
158
+ export type PolishedEditorStyleConfig = TemplateVariableConfig & {
113
159
  metadataFormat: string;
114
160
  completionMenu: CompletionMenuStyle;
115
161
  };
116
162
 
117
- export type PolishedCopyFriendlyEditorStyleConfig = {
163
+ export type PolishedCopyFriendlyEditorStyleConfig = TemplateVariableConfig & {
118
164
  metadataFormat: string;
119
165
  completionMenu: CompletionMenuStyle;
120
166
  };
@@ -126,14 +172,20 @@ export type AccentRailEditorStyleConfig = {
126
172
  };
127
173
 
128
174
  export type MinimalistEditorStyleConfig = {
175
+ formats?: MinimalistFormats;
176
+ variables?: Record<string, string>;
177
+ /** Missing means Original, keeping publisher SGR rather than recoloring it. */
178
+ extensionColorMode?: ExtensionStatusColorMode;
129
179
  pathDisplay: MinimalistPathDisplayMode;
130
180
  contextFormat: MinimalistContextFormat;
131
181
  contextGauge: boolean;
132
182
  showSessionName: boolean;
133
183
  showTimer: boolean;
134
184
  showCost: boolean;
185
+ showCacheHit: boolean;
135
186
  showGit: boolean;
136
187
  contextThresholds: ContextThresholds;
188
+ separator: MinimalistEditorSeparator;
137
189
  };
138
190
 
139
191
  /** Temporary name retained for existing settings consumers. */
@@ -144,6 +196,9 @@ export type EditorStylesConfig = {
144
196
  };
145
197
 
146
198
  export type EditorComponentConfig = {
199
+ codexQuota: boolean;
200
+ colors?: ComponentColors<"editor">;
201
+ customValueColors?: CustomValueColors;
147
202
  enabled: boolean;
148
203
  style: EditorStyle;
149
204
  colorSource: ColorSource;
@@ -164,6 +219,7 @@ export type CompactUserMessageStyleConfig = Record<string, never>;
164
219
  export type LabeledUserMessageStyleConfig = Record<string, never>;
165
220
 
166
221
  export type UserMessagesComponentConfig = {
222
+ colors?: ComponentColors<"userMessages">;
167
223
  enabled: boolean;
168
224
  style: UserMessageStyle;
169
225
  colorSource: ColorSource;
@@ -176,12 +232,13 @@ export type UserMessagesComponentConfig = {
176
232
  };
177
233
 
178
234
  export type SelectorBordersComponentConfig = {
235
+ colors?: ComponentColors<"selectorBorders">;
179
236
  enabled: boolean;
180
237
  style: SelectorBorderStyle;
181
238
  colorSource: ColorSource;
182
239
  };
183
240
 
184
- export type StarshipFooterStyleConfig = {
241
+ export type StarshipFooterStyleConfig = TemplateVariableConfig & {
185
242
  format: string;
186
243
  responsive: boolean;
187
244
  compactFormat: string;
@@ -198,6 +255,9 @@ export type StarshipFooterStyleConfig = {
198
255
  };
199
256
 
200
257
  export type FooterComponentConfig = {
258
+ codexQuota: boolean;
259
+ colors?: ComponentColors<"footer">;
260
+ customValueColors?: CustomValueColors;
201
261
  style: FooterStyle;
202
262
  colorSource: ColorSource;
203
263
  modelLabel: ModelLabelSource;
@@ -216,6 +276,7 @@ export type WorkingLineSegmentsConfig = {
216
276
  elapsed: boolean;
217
277
  thought: boolean;
218
278
  tokens: boolean;
279
+ tokenRate?: boolean;
219
280
  };
220
281
 
221
282
  export const DEFAULT_WORKING_LINE_SPINNER_INTERVAL_MS = 100;
@@ -233,8 +294,10 @@ export function isValidWorkingLineIntervalMs(value: unknown): value is number {
233
294
  }
234
295
 
235
296
  export type WorkingLineComponentConfig = {
297
+ colors?: ComponentColors<"workingLine">;
236
298
  enabled: boolean;
237
299
  turnSummary: boolean;
300
+ turnSummaryFormat: string;
238
301
  spinner: WorkingLineSpinner;
239
302
  spinnerIntervalMs: number;
240
303
  animateSpinnerColor: boolean;
@@ -243,10 +306,11 @@ export type WorkingLineComponentConfig = {
243
306
  colorSource: ColorSource;
244
307
  messages: WorkingLineMessagesConfig;
245
308
  segments: WorkingLineSegmentsConfig;
309
+ placement: WorkingLinePlacement;
246
310
  };
247
311
 
248
312
  export type WorkingLineComponentPatch = Partial<
249
- Omit<WorkingLineComponentConfig, "messages" | "segments">
313
+ Omit<WorkingLineComponentConfig, "messages" | "segments" | "colors">
250
314
  > & {
251
315
  messages?: Partial<WorkingLineMessagesConfig>;
252
316
  segments?: Partial<WorkingLineSegmentsConfig>;
@@ -257,7 +321,23 @@ export type ThinkingStepsComponentConfig = {
257
321
  mode: ThinkingStepsMode;
258
322
  };
259
323
 
324
+ export type ExtensionStatusVisibility = "show" | "hide";
325
+ export type ExtensionStatusVisibilityConfig = {
326
+ defaultVisibility: ExtensionStatusVisibility;
327
+ visibility: Record<string, ExtensionStatusVisibility>;
328
+ };
329
+
330
+ export type HiddenExtensionStatusPlacement = "left" | "middle" | "right";
331
+ export type ExtensionStatusComponentConfig = ExtensionStatusVisibilityConfig & {
332
+ hidden?: {
333
+ defaultPlacement?: HiddenExtensionStatusPlacement;
334
+ placements?: Record<string, HiddenExtensionStatusPlacement>;
335
+ colorModes?: Record<string, ExtensionStatusColorMode>;
336
+ };
337
+ };
338
+
260
339
  export type ComponentsConfig = {
340
+ extensionStatuses: ExtensionStatusComponentConfig;
261
341
  editor: EditorComponentConfig;
262
342
  userMessages: UserMessagesComponentConfig;
263
343
  thinkingSteps: ThinkingStepsComponentConfig;
@@ -299,7 +379,8 @@ export type ExtensionStatusesConfig = {
299
379
 
300
380
  const DEFAULT_PROJECT_REFRESH_INTERVAL_MS = 30_000;
301
381
  const MIN_PROJECT_REFRESH_INTERVAL_MS = 5_000;
302
- export const DEFAULT_EDITOR_METADATA_FORMAT = "$model $provider( $thinking)";
382
+ export const DEFAULT_EDITOR_METADATA_FORMAT =
383
+ "$model $provider( $thinking)( $fast_mode)( $codex_quota)";
303
384
 
304
385
  export type ZentuiConfig = {
305
386
  projectRefreshIntervalMs: number;
@@ -317,6 +398,7 @@ export type PolishedTuiColors = {
317
398
  contextWarning: ColorSpec;
318
399
  contextError: ColorSpec;
319
400
  tokens: ColorSpec;
401
+ cacheHit?: ColorSpec;
320
402
  cost: ColorSpec;
321
403
  separator: ColorSpec;
322
404
  runtimePrefix: ColorSpec;
@@ -330,6 +412,7 @@ export type PolishedTuiColors = {
330
412
  time: ColorSpec;
331
413
  os: ColorSpec;
332
414
  editorAccent?: ColorSpec;
415
+ editorShellRail?: ColorSpec;
333
416
  editorRail?: ColorSpec;
334
417
  editorPrompt?: ColorSpec;
335
418
  editorBorder?: ColorSpec;
@@ -388,11 +471,14 @@ export const FOOTER_FORMAT_VARIABLES = [
388
471
  "runtime",
389
472
  "model",
390
473
  "provider",
474
+ "thinkingLevel",
475
+ "fast_mode",
391
476
  "session_duration",
392
477
  "username",
393
478
  "os",
394
479
  "time",
395
480
  "context",
481
+ "codex_quota",
396
482
  "tokens",
397
483
  "cache_read",
398
484
  "cache_write",
@@ -407,6 +493,8 @@ export const FOOTER_FORMAT_VARIABLES = [
407
493
  "git_added",
408
494
  "git_deleted",
409
495
  "sep",
496
+ "join_sep",
497
+ ...HOST_TEMPLATE_VARIABLES,
410
498
  ] as const;
411
499
 
412
500
  /**
@@ -460,6 +548,8 @@ const defaultMinimalistStyle: MinimalistEditorStyleConfig = {
460
548
  showTimer: false,
461
549
  showCost: false,
462
550
  showGit: false,
551
+ showCacheHit: false,
552
+ separator: "dash",
463
553
  contextThresholds: { warning: 50, error: 80 },
464
554
  };
465
555
 
@@ -480,7 +570,9 @@ const defaultStarshipStyle: StarshipFooterStyleConfig = {
480
570
  };
481
571
 
482
572
  const defaultComponents: ComponentsConfig = {
573
+ extensionStatuses: { defaultVisibility: "show", visibility: {} },
483
574
  editor: {
575
+ codexQuota: false,
484
576
  enabled: true,
485
577
  style: "minimalist",
486
578
  colorSource: "theme",
@@ -510,6 +602,7 @@ const defaultComponents: ComponentsConfig = {
510
602
  workingLine: {
511
603
  enabled: true,
512
604
  turnSummary: true,
605
+ turnSummaryFormat: DEFAULT_TURN_SUMMARY_FORMAT,
513
606
  spinner: "claude-inspired",
514
607
  spinnerIntervalMs: 160,
515
608
  animateSpinnerColor: false,
@@ -517,10 +610,12 @@ const defaultComponents: ComponentsConfig = {
517
610
  textAnimation: "classic",
518
611
  colorSource: "theme",
519
612
  messages: { custom: true, values: [...PI_WORKING_LINE_MESSAGES] },
520
- segments: { tool: true, elapsed: true, thought: true, tokens: true },
613
+ segments: { tool: true, elapsed: true, thought: true, tokens: true, tokenRate: false },
614
+ placement: "above",
521
615
  },
522
616
  selectorBorders: { enabled: true, style: "zentui", colorSource: "theme" },
523
617
  footer: {
618
+ codexQuota: false,
524
619
  style: "starship",
525
620
  colorSource: "theme",
526
621
  modelLabel: "name",
@@ -530,7 +625,7 @@ const defaultComponents: ComponentsConfig = {
530
625
 
531
626
  export const defaultConfig: PolishedTuiConfig = {
532
627
  projectRefreshIntervalMs: DEFAULT_PROJECT_REFRESH_INTERVAL_MS,
533
- icons: { mode: "ascii", ...NERD_DEFAULT_ICONS },
628
+ icons: resolveConfiguredIcons("ascii"),
534
629
  colors: {
535
630
  cwd: "bold cyan",
536
631
  sessionName: "bold green",
@@ -745,6 +840,7 @@ function normalizeColors(record: Record<string, unknown>): Partial<PolishedTuiCo
745
840
  contextWarning: colorValue(record, "contextWarning"),
746
841
  contextError: colorValue(record, "contextError"),
747
842
  tokens: colorValue(record, "tokens"),
843
+ cacheHit: colorValue(record, "cacheHit"),
748
844
  cost: colorValue(record, "cost"),
749
845
  separator: colorValue(record, "separator"),
750
846
  runtimePrefix: colorValue(record, "runtimePrefix"),
@@ -758,6 +854,7 @@ function normalizeColors(record: Record<string, unknown>): Partial<PolishedTuiCo
758
854
  time: colorValue(record, "time"),
759
855
  os: colorValue(record, "os"),
760
856
  editorAccent: colorValue(record, "editorAccent"),
857
+ editorShellRail: colorValue(record, "editorShellRail"),
761
858
  editorRail: colorValue(record, "editorRail"),
762
859
  editorPrompt: colorValue(record, "editorPrompt"),
763
860
  editorBorder: colorValue(record, "editorBorder"),
@@ -996,6 +1093,20 @@ function recordValue(value: unknown): ConfigRecord {
996
1093
  return isRecord(value) ? value : {};
997
1094
  }
998
1095
 
1096
+ function templateVariableOptions(
1097
+ record: ConfigRecord,
1098
+ reserved: readonly string[],
1099
+ ): TemplateVariableConfig {
1100
+ return {
1101
+ ...(isRecord(record.variables)
1102
+ ? { variables: normalizeTemplateVariables(record.variables, reserved) }
1103
+ : {}),
1104
+ ...(isExtensionStatusColorMode(record.extensionColorMode)
1105
+ ? { extensionColorMode: record.extensionColorMode }
1106
+ : {}),
1107
+ };
1108
+ }
1109
+
999
1110
  function resolvedValue(
1000
1111
  canonical: ConfigRecord,
1001
1112
  canonicalKey: string,
@@ -1163,7 +1274,9 @@ function resolveUserMessagesSelection(
1163
1274
  };
1164
1275
  }
1165
1276
  return {
1166
- style: legacyCopyFriendly(features) ? "framed-copy-friendly" : defaultComponents.userMessages.style,
1277
+ style: legacyCopyFriendly(features)
1278
+ ? "framed-copy-friendly"
1279
+ : defaultComponents.userMessages.style,
1167
1280
  enabled: normalEnabled,
1168
1281
  };
1169
1282
  }
@@ -1190,6 +1303,75 @@ function resolveWorkingLineMessages(messages: ConfigRecord): WorkingLineMessages
1190
1303
  return { custom, values: hasOwn(messages, "values") ? legacyValues : preset() };
1191
1304
  }
1192
1305
 
1306
+ export function isHiddenExtensionStatusPlacement(
1307
+ value: unknown,
1308
+ ): value is HiddenExtensionStatusPlacement {
1309
+ return value === "left" || value === "middle" || value === "right";
1310
+ }
1311
+
1312
+ export function getHiddenExtensionStatusPlacement(
1313
+ config: ExtensionStatusComponentConfig,
1314
+ key: string,
1315
+ ): HiddenExtensionStatusPlacement {
1316
+ const placements = config.hidden?.placements;
1317
+ return (
1318
+ (placements && Object.hasOwn(placements, key) ? placements[key] : undefined) ??
1319
+ config.hidden?.defaultPlacement ??
1320
+ "left"
1321
+ );
1322
+ }
1323
+
1324
+ export function getHiddenExtensionStatusColorMode(
1325
+ config: ExtensionStatusComponentConfig,
1326
+ key: string,
1327
+ ): ExtensionStatusColorMode {
1328
+ const modes = config.hidden?.colorModes;
1329
+ return modes && Object.hasOwn(modes, key) && modes[key] === "zentui" ? "zentui" : "original";
1330
+ }
1331
+
1332
+ function resolveExtensionStatusComponent(raw: unknown): ExtensionStatusComponentConfig {
1333
+ const owner = recordValue(raw);
1334
+ const hidden = recordValue(owner.hidden);
1335
+ return {
1336
+ ...(isRecord(owner.hidden)
1337
+ ? {
1338
+ hidden: {
1339
+ ...(isHiddenExtensionStatusPlacement(hidden.defaultPlacement)
1340
+ ? { defaultPlacement: hidden.defaultPlacement }
1341
+ : {}),
1342
+ ...(isRecord(hidden.colorModes)
1343
+ ? {
1344
+ colorModes: Object.fromEntries(
1345
+ Object.entries(hidden.colorModes).filter(
1346
+ (entry): entry is [string, ExtensionStatusColorMode] =>
1347
+ isExtensionStatusColorMode(entry[1]),
1348
+ ),
1349
+ ),
1350
+ }
1351
+ : {}),
1352
+ ...(isRecord(hidden.placements)
1353
+ ? {
1354
+ placements: Object.fromEntries(
1355
+ Object.entries(hidden.placements).filter(
1356
+ (entry): entry is [string, HiddenExtensionStatusPlacement] =>
1357
+ isHiddenExtensionStatusPlacement(entry[1]),
1358
+ ),
1359
+ ),
1360
+ }
1361
+ : {}),
1362
+ },
1363
+ }
1364
+ : {}),
1365
+ defaultVisibility: owner.defaultVisibility === "hide" ? "hide" : "show",
1366
+ visibility: Object.fromEntries(
1367
+ Object.entries(recordValue(owner.visibility)).filter(
1368
+ (entry): entry is [string, ExtensionStatusVisibility] =>
1369
+ entry[1] === "show" || entry[1] === "hide",
1370
+ ),
1371
+ ),
1372
+ };
1373
+ }
1374
+
1193
1375
  function resolveComponents(config: ConfigRecord): ComponentsConfig {
1194
1376
  const components = recordValue(config.components);
1195
1377
  const editor = recordValue(components.editor);
@@ -1236,7 +1418,15 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1236
1418
  const userMessagesSelection = resolveUserMessagesSelection(userMessages, framed, features);
1237
1419
 
1238
1420
  return {
1421
+ extensionStatuses: resolveExtensionStatusComponent(components.extensionStatuses),
1239
1422
  editor: {
1423
+ codexQuota: parseBoolean(editor.codexQuota, false),
1424
+ ...(isRecord(editor.customValueColors)
1425
+ ? { customValueColors: normalizeCustomValueColors(editor.customValueColors) }
1426
+ : {}),
1427
+ ...(isRecord(editor.colors)
1428
+ ? { colors: normalizeComponentColors("editor", editor.colors) }
1429
+ : {}),
1240
1430
  enabled: parseBoolean(
1241
1431
  resolvedValue(editor, "enabled", features, "editor"),
1242
1432
  defaultComponents.editor.enabled,
@@ -1259,10 +1449,12 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1259
1449
  ),
1260
1450
  styles: {
1261
1451
  opencode: {
1452
+ ...templateVariableOptions(opencode, OPENCODE_FORMAT_VARIABLES),
1262
1453
  metadataFormat: parseNonEmptyString(metadataFormat, DEFAULT_EDITOR_METADATA_FORMAT),
1263
1454
  completionMenu: parseCompletionMenuStyle(opencode.completionMenu),
1264
1455
  },
1265
1456
  "opencode-copy-friendly": {
1457
+ ...templateVariableOptions(opencodeCopyFriendly, OPENCODE_FORMAT_VARIABLES),
1266
1458
  metadataFormat: parseNonEmptyString(
1267
1459
  lowRailMetadataFormat,
1268
1460
  DEFAULT_EDITOR_METADATA_FORMAT,
@@ -1275,6 +1467,15 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1275
1467
  transparent: parseBoolean(accentRail.transparent, defaultAccentRailStyle.transparent),
1276
1468
  },
1277
1469
  minimalist: {
1470
+ ...(isRecord(minimalist.formats)
1471
+ ? { formats: normalizeMinimalistFormats(minimalist.formats) }
1472
+ : {}),
1473
+ ...(isRecord(minimalist.variables)
1474
+ ? { variables: normalizeMinimalistVariables(minimalist.variables) }
1475
+ : {}),
1476
+ ...(isExtensionStatusColorMode(minimalist.extensionColorMode)
1477
+ ? { extensionColorMode: minimalist.extensionColorMode }
1478
+ : {}),
1278
1479
  pathDisplay:
1279
1480
  minimalist.pathDisplay === "compact" ||
1280
1481
  minimalist.pathDisplay === "project" ||
@@ -1292,12 +1493,20 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1292
1493
  ),
1293
1494
  showTimer: parseBoolean(minimalist.showTimer, defaultMinimalistStyle.showTimer),
1294
1495
  showCost: parseBoolean(minimalist.showCost, defaultMinimalistStyle.showCost),
1496
+ showCacheHit: parseBoolean(minimalist.showCacheHit, defaultMinimalistStyle.showCacheHit),
1295
1497
  showGit: parseBoolean(minimalist.showGit, defaultMinimalistStyle.showGit),
1296
1498
  contextThresholds: minimalistThresholds,
1499
+ separator:
1500
+ minimalist.separator === "dash" || minimalist.separator === "dot"
1501
+ ? minimalist.separator
1502
+ : defaultMinimalistStyle.separator,
1297
1503
  },
1298
1504
  },
1299
1505
  },
1300
1506
  userMessages: {
1507
+ ...(isRecord(userMessages.colors)
1508
+ ? { colors: normalizeComponentColors("userMessages", userMessages.colors) }
1509
+ : {}),
1301
1510
  enabled: userMessagesSelection.enabled,
1302
1511
  style: userMessagesSelection.style,
1303
1512
  colorSource: parseColorSource(
@@ -1321,8 +1530,12 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1321
1530
  : defaultComponents.thinkingSteps.mode,
1322
1531
  },
1323
1532
  workingLine: {
1533
+ ...(isRecord(workingLine.colors)
1534
+ ? { colors: normalizeComponentColors("workingLine", workingLine.colors) }
1535
+ : {}),
1324
1536
  enabled: parseBoolean(workingLine.enabled, defaultComponents.workingLine.enabled),
1325
1537
  turnSummary: parseBoolean(workingLine.turnSummary, defaultComponents.workingLine.turnSummary),
1538
+ turnSummaryFormat: normalizeTurnSummaryFormat(workingLine.turnSummaryFormat),
1326
1539
  spinner:
1327
1540
  workingLine.spinner === "braille" ||
1328
1541
  workingLine.spinner === "star-bloom" ||
@@ -1349,12 +1562,17 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1349
1562
  workingLine.textAnimation === "disabled"
1350
1563
  ? workingLine.textAnimation
1351
1564
  : defaultComponents.workingLine.textAnimation,
1565
+ placement:
1566
+ workingLine.placement === "border"
1567
+ ? workingLine.placement
1568
+ : defaultComponents.workingLine.placement,
1352
1569
  colorSource: parseColorSource(
1353
1570
  workingLine.colorSource,
1354
1571
  defaultComponents.workingLine.colorSource,
1355
1572
  ),
1356
1573
  messages: resolveWorkingLineMessages(workingLineMessages),
1357
1574
  segments: {
1575
+ tokenRate: parseBoolean(workingLineSegments.tokenRate, false),
1358
1576
  tool: parseBoolean(workingLineSegments.tool, defaultComponents.workingLine.segments.tool),
1359
1577
  elapsed: parseBoolean(
1360
1578
  workingLineSegments.elapsed,
@@ -1371,6 +1589,9 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1371
1589
  },
1372
1590
  },
1373
1591
  selectorBorders: {
1592
+ ...(isRecord(selectorBorders.colors)
1593
+ ? { colors: normalizeComponentColors("selectorBorders", selectorBorders.colors) }
1594
+ : {}),
1374
1595
  enabled: parseBoolean(
1375
1596
  resolvedValue(selectorBorders, "enabled", features, "editor"),
1376
1597
  defaultComponents.selectorBorders.enabled,
@@ -1382,6 +1603,13 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1382
1603
  ),
1383
1604
  },
1384
1605
  footer: {
1606
+ codexQuota: parseBoolean(footer.codexQuota, false),
1607
+ ...(isRecord(footer.customValueColors)
1608
+ ? { customValueColors: normalizeCustomValueColors(footer.customValueColors) }
1609
+ : {}),
1610
+ ...(isRecord(footer.colors)
1611
+ ? { colors: normalizeComponentColors("footer", footer.colors) }
1612
+ : {}),
1385
1613
  style: resolveFooterStyle(footer, features),
1386
1614
  colorSource: parseColorSource(
1387
1615
  resolvedValue(footer, "colorSource", colorSources, "starship"),
@@ -1393,6 +1621,10 @@ function resolveComponents(config: ConfigRecord): ComponentsConfig {
1393
1621
  ),
1394
1622
  styles: {
1395
1623
  starship: {
1624
+ ...templateVariableOptions(starship, [
1625
+ ...FOOTER_FORMAT_VARIABLES,
1626
+ ...Object.keys(FOOTER_FORMAT_ALIASES),
1627
+ ]),
1396
1628
  format:
1397
1629
  typeof resolvedValue(starship, "format", config, "footerFormat") === "string"
1398
1630
  ? (resolvedValue(starship, "format", config, "footerFormat") as string)
@@ -1502,7 +1734,10 @@ export function parseIconMode(value: unknown): IconMode {
1502
1734
  : defaultConfig.icons.mode;
1503
1735
  }
1504
1736
 
1505
- export function mergeConfig(parsed: unknown): PolishedTuiConfig {
1737
+ export function mergeConfig(
1738
+ parsed: unknown,
1739
+ iconEnvironment: IconEnvironment = process.env,
1740
+ ): PolishedTuiConfig {
1506
1741
  const config = isRecord(parsed) ? parsed : {};
1507
1742
  const iconsRecord = recordValue(config.icons);
1508
1743
  const colorsRecord = recordValue(config.colors);
@@ -1512,6 +1747,7 @@ export function mergeConfig(parsed: unknown): PolishedTuiConfig {
1512
1747
  icons: resolveConfiguredIcons(
1513
1748
  parseIconMode(iconsRecord.mode),
1514
1749
  normalizeIconOverrides(iconsRecord),
1750
+ iconEnvironment,
1515
1751
  ),
1516
1752
  colors: {
1517
1753
  ...defaultConfig.colors,
@@ -1607,6 +1843,7 @@ function restoreUnknownSelectedStyleIds(
1607
1843
  }
1608
1844
 
1609
1845
  function saveComponentsMutation(
1846
+ owners: readonly (keyof ComponentsConfig)[],
1610
1847
  update: (components: ComponentsConfig) => void,
1611
1848
  path: string,
1612
1849
  cleanupRaw?: (record: ConfigRecord) => void,
@@ -1617,8 +1854,23 @@ function saveComponentsMutation(
1617
1854
  const components = mergeConfig(record).components;
1618
1855
  update(components);
1619
1856
  const normalized = resolveComponents({ components });
1620
- record.components = overlayKnown(record.components, normalized);
1857
+ const rawComponents = { ...recordValue(record.components) };
1858
+ for (const owner of owners) {
1859
+ const {
1860
+ colors: _colors,
1861
+ customValueColors: _customValueColors,
1862
+ ...selection
1863
+ } = normalized[owner] as (typeof normalized)[typeof owner] & {
1864
+ colors?: unknown;
1865
+ customValueColors?: unknown;
1866
+ };
1867
+ rawComponents[owner] = overlayKnown(rawComponents[owner], selection);
1868
+ }
1869
+ record.components = rawComponents;
1621
1870
  restoreUnknownSelectedStyleIds(record, preservedStyles, replacedStyle);
1871
+ if (owners.includes("editor")) deleteLegacyEditorCopyFriendly(record);
1872
+ if (owners.includes("userMessages")) deleteLegacyMessageCopyFriendly(record);
1873
+ if (owners.includes("footer")) deleteLegacyFooterEnabled(record);
1622
1874
  cleanupRaw?.(record);
1623
1875
  });
1624
1876
  }
@@ -1667,10 +1919,17 @@ function applyEditorComponentPatch(
1667
1919
  patch: Partial<
1668
1920
  Pick<
1669
1921
  EditorComponentConfig,
1670
- "enabled" | "style" | "colorSource" | "borderColorMode" | "modelLabel" | "viewportIndicators"
1922
+ | "enabled"
1923
+ | "style"
1924
+ | "colorSource"
1925
+ | "borderColorMode"
1926
+ | "modelLabel"
1927
+ | "viewportIndicators"
1928
+ | "codexQuota"
1671
1929
  >
1672
1930
  >,
1673
1931
  ): void {
1932
+ if (patch.codexQuota !== undefined) component.codexQuota = patch.codexQuota;
1674
1933
  if (patch.enabled !== undefined) component.enabled = patch.enabled;
1675
1934
  if (patch.style !== undefined) component.style = patch.style;
1676
1935
  if (patch.colorSource !== undefined) component.colorSource = patch.colorSource;
@@ -1685,12 +1944,19 @@ export function saveEditorComponentPatch(
1685
1944
  patch: Partial<
1686
1945
  Pick<
1687
1946
  EditorComponentConfig,
1688
- "enabled" | "style" | "colorSource" | "borderColorMode" | "modelLabel" | "viewportIndicators"
1947
+ | "enabled"
1948
+ | "style"
1949
+ | "colorSource"
1950
+ | "borderColorMode"
1951
+ | "modelLabel"
1952
+ | "viewportIndicators"
1953
+ | "codexQuota"
1689
1954
  >
1690
1955
  >,
1691
1956
  path = configPath,
1692
1957
  ): PolishedTuiConfig {
1693
1958
  return saveComponentsMutation(
1959
+ ["editor"],
1694
1960
  (components) => applyEditorComponentPatch(components.editor, patch),
1695
1961
  path,
1696
1962
  patch.style !== undefined ? deleteLegacyEditorCopyFriendly : undefined,
@@ -1698,43 +1964,111 @@ export function saveEditorComponentPatch(
1698
1964
  );
1699
1965
  }
1700
1966
 
1967
+ export type TemplateVariablePatch = {
1968
+ variables?: Record<string, string | null>;
1969
+ extensionColorMode?: ExtensionStatusColorMode | null;
1970
+ };
1971
+ export type PolishedEditorStylePatch = Partial<
1972
+ Omit<PolishedEditorStyleConfig, keyof TemplateVariableConfig>
1973
+ > &
1974
+ TemplateVariablePatch;
1975
+ export type PolishedCopyFriendlyEditorStylePatch = Partial<
1976
+ Omit<PolishedCopyFriendlyEditorStyleConfig, keyof TemplateVariableConfig>
1977
+ > &
1978
+ TemplateVariablePatch;
1979
+ export type StarshipFooterStylePatch = Partial<
1980
+ Omit<StarshipFooterStyleConfig, keyof TemplateVariableConfig>
1981
+ > &
1982
+ TemplateVariablePatch;
1983
+
1984
+ function applyTemplateVariablePatch(
1985
+ record: ConfigRecord,
1986
+ owner: "editor" | "footer",
1987
+ id: string,
1988
+ patch: TemplateVariablePatch,
1989
+ reserved: readonly string[],
1990
+ ): void {
1991
+ const style = recordValue(
1992
+ recordValue(recordValue(recordValue(record.components)[owner]).styles)[id],
1993
+ );
1994
+ if (patch.variables !== undefined) {
1995
+ const saved = { ...recordValue(style.variables) };
1996
+ for (const [name, key] of Object.entries(patch.variables)) {
1997
+ if (key === null) delete saved[name];
1998
+ else if (
1999
+ Object.hasOwn(normalizeTemplateVariables({ [name]: key }, reserved), name) &&
2000
+ (Object.hasOwn(saved, name) ||
2001
+ Object.keys(normalizeTemplateVariables(saved, reserved)).length < MAX_CUSTOM_VARIABLES)
2002
+ )
2003
+ saved[name] = key;
2004
+ }
2005
+ if (Object.keys(saved).length) style.variables = saved;
2006
+ else delete style.variables;
2007
+ }
2008
+ if (patch.extensionColorMode === null) delete style.extensionColorMode;
2009
+ else if (isExtensionStatusColorMode(patch.extensionColorMode))
2010
+ style.extensionColorMode = patch.extensionColorMode;
2011
+ }
2012
+
1701
2013
  export function savePolishedEditorStylePatch(
1702
- patch: Partial<PolishedEditorStyleConfig>,
2014
+ patch: PolishedEditorStylePatch,
1703
2015
  path = configPath,
1704
2016
  ): PolishedTuiConfig {
1705
- return saveComponentsMutation((components) => {
1706
- const style = components.editor.styles.opencode;
1707
- if (patch.metadataFormat !== undefined) style.metadataFormat = patch.metadataFormat;
1708
- if (patch.completionMenu !== undefined) style.completionMenu = patch.completionMenu;
1709
- }, path);
2017
+ return saveComponentsMutation(
2018
+ ["editor"],
2019
+ (components) => {
2020
+ const style = components.editor.styles.opencode;
2021
+ if (patch.metadataFormat !== undefined) style.metadataFormat = patch.metadataFormat;
2022
+ if (patch.completionMenu !== undefined) style.completionMenu = patch.completionMenu;
2023
+ },
2024
+ path,
2025
+ (record) =>
2026
+ applyTemplateVariablePatch(record, "editor", "opencode", patch, OPENCODE_FORMAT_VARIABLES),
2027
+ );
1710
2028
  }
1711
2029
 
1712
2030
  export function savePolishedCopyFriendlyEditorStylePatch(
1713
- patch: Partial<PolishedCopyFriendlyEditorStyleConfig>,
2031
+ patch: PolishedCopyFriendlyEditorStylePatch,
1714
2032
  path = configPath,
1715
2033
  ): PolishedTuiConfig {
1716
- return saveComponentsMutation((components) => {
1717
- const style = components.editor.styles["opencode-copy-friendly"];
1718
- if (patch.metadataFormat !== undefined) style.metadataFormat = patch.metadataFormat;
1719
- if (patch.completionMenu !== undefined) style.completionMenu = patch.completionMenu;
1720
- }, path);
2034
+ return saveComponentsMutation(
2035
+ ["editor"],
2036
+ (components) => {
2037
+ const style = components.editor.styles["opencode-copy-friendly"];
2038
+ if (patch.metadataFormat !== undefined) style.metadataFormat = patch.metadataFormat;
2039
+ if (patch.completionMenu !== undefined) style.completionMenu = patch.completionMenu;
2040
+ },
2041
+ path,
2042
+ (record) =>
2043
+ applyTemplateVariablePatch(
2044
+ record,
2045
+ "editor",
2046
+ "opencode-copy-friendly",
2047
+ patch,
2048
+ OPENCODE_FORMAT_VARIABLES,
2049
+ ),
2050
+ );
1721
2051
  }
1722
2052
 
1723
2053
  export function saveAccentRailEditorStylePatch(
1724
2054
  patch: Partial<AccentRailEditorStyleConfig>,
1725
2055
  path = configPath,
1726
2056
  ): PolishedTuiConfig {
1727
- return saveComponentsMutation((components) => {
1728
- const style = components.editor.styles["accent-rail"];
1729
- if (patch.rail !== undefined) style.rail = patch.rail;
1730
- if (patch.asciiRail !== undefined) style.asciiRail = patch.asciiRail;
1731
- if (patch.transparent !== undefined) style.transparent = patch.transparent;
1732
- }, path);
2057
+ return saveComponentsMutation(
2058
+ ["editor"],
2059
+ (components) => {
2060
+ const style = components.editor.styles["accent-rail"];
2061
+ if (patch.rail !== undefined) style.rail = patch.rail;
2062
+ if (patch.asciiRail !== undefined) style.asciiRail = patch.asciiRail;
2063
+ if (patch.transparent !== undefined) style.transparent = patch.transparent;
2064
+ },
2065
+ path,
2066
+ );
1733
2067
  }
1734
2068
 
1735
2069
  function applyMinimalistStylePatch(
1736
2070
  style: MinimalistEditorStyleConfig,
1737
- patch: Partial<MinimalistEditorStyleConfig>,
2071
+ patch: Partial<Omit<MinimalistEditorStyleConfig, "formats" | "variables" | "extensionColorMode">>,
1738
2072
  ): void {
1739
2073
  if (patch.pathDisplay !== undefined) style.pathDisplay = patch.pathDisplay;
1740
2074
  if (patch.contextFormat !== undefined) style.contextFormat = patch.contextFormat;
@@ -1742,17 +2076,90 @@ function applyMinimalistStylePatch(
1742
2076
  if (patch.showSessionName !== undefined) style.showSessionName = patch.showSessionName;
1743
2077
  if (patch.showTimer !== undefined) style.showTimer = patch.showTimer;
1744
2078
  if (patch.showCost !== undefined) style.showCost = patch.showCost;
2079
+ if (patch.showCacheHit !== undefined) style.showCacheHit = patch.showCacheHit;
1745
2080
  if (patch.showGit !== undefined) style.showGit = patch.showGit;
2081
+ if (patch.separator !== undefined) style.separator = patch.separator;
1746
2082
  if (patch.contextThresholds !== undefined) {
1747
2083
  style.contextThresholds = { ...style.contextThresholds, ...patch.contextThresholds };
1748
2084
  }
1749
2085
  }
1750
2086
 
2087
+ export type MinimalistEditorStylePatch = Partial<
2088
+ Omit<MinimalistEditorStyleConfig, "formats" | "variables" | "extensionColorMode">
2089
+ > & {
2090
+ /** null removes an override; empty strings deliberately hide a slot. */
2091
+ formats?: Partial<Record<keyof MinimalistFormats, string | null>>;
2092
+ variables?: Record<string, string | null>;
2093
+ extensionColorMode?: ExtensionStatusColorMode | null;
2094
+ };
2095
+
2096
+ /** Sparse template transaction: never snapshot another style or component. */
2097
+ export function saveMinimalistTemplatePatch(
2098
+ patch: MinimalistEditorStylePatch,
2099
+ path = configPath,
2100
+ ): PolishedTuiConfig {
2101
+ return mutateConfig(path, (record) => {
2102
+ const rawStyle = recordValue(
2103
+ recordValue(recordValue(recordValue(record.components).editor).styles).minimalist,
2104
+ );
2105
+ const style = { ...rawStyle };
2106
+ const { formats, variables, extensionColorMode, ...ordinary } = patch;
2107
+ const updated = mergeConfig(record).components.editor.styles.minimalist;
2108
+ applyMinimalistStylePatch(updated, ordinary);
2109
+ const normalized = mergeConfig({ components: { editor: { styles: { minimalist: updated } } } })
2110
+ .components.editor.styles.minimalist;
2111
+ for (const key of Object.keys(ordinary) as Array<keyof typeof ordinary>) {
2112
+ if (ordinary[key] !== undefined)
2113
+ style[key] =
2114
+ key === "contextThresholds"
2115
+ ? { ...recordValue(style[key]), ...normalized.contextThresholds }
2116
+ : normalized[key];
2117
+ }
2118
+ if (formats !== undefined) {
2119
+ const saved = { ...recordValue(style.formats) };
2120
+ for (const slot of MINIMALIST_FORMAT_SLOTS) {
2121
+ if (formats[slot] === null) delete saved[slot];
2122
+ else if (typeof formats[slot] === "string") saved[slot] = formats[slot];
2123
+ }
2124
+ if (Object.keys(saved).length) style.formats = saved;
2125
+ else delete style.formats;
2126
+ }
2127
+ if (variables !== undefined) {
2128
+ const saved = { ...recordValue(style.variables) };
2129
+ for (const [name, key] of Object.entries(variables)) {
2130
+ if (key === null) delete saved[name];
2131
+ else if (Object.hasOwn(normalizeMinimalistVariables({ [name]: key }), name)) {
2132
+ if (
2133
+ Object.hasOwn(saved, name) ||
2134
+ Object.keys(normalizeMinimalistVariables(saved)).length < MAX_CUSTOM_VARIABLES
2135
+ )
2136
+ saved[name] = key;
2137
+ }
2138
+ }
2139
+ if (Object.keys(saved).length) style.variables = saved;
2140
+ else delete style.variables;
2141
+ }
2142
+ if (extensionColorMode === null) delete style.extensionColorMode;
2143
+ else if (isExtensionStatusColorMode(extensionColorMode))
2144
+ style.extensionColorMode = extensionColorMode;
2145
+ record.components = overlayKnown(record.components, { editor: { styles: { minimalist: {} } } });
2146
+ const styles = recordValue(recordValue(recordValue(record.components).editor).styles);
2147
+ styles.minimalist = style;
2148
+ });
2149
+ }
2150
+
1751
2151
  export function saveMinimalistEditorStylePatch(
1752
- patch: Partial<MinimalistEditorStyleConfig>,
2152
+ patch: MinimalistEditorStylePatch,
1753
2153
  path = configPath,
1754
2154
  ): PolishedTuiConfig {
2155
+ if (
2156
+ patch.formats !== undefined ||
2157
+ patch.variables !== undefined ||
2158
+ patch.extensionColorMode !== undefined
2159
+ )
2160
+ return saveMinimalistTemplatePatch(patch, path);
1755
2161
  return saveComponentsMutation(
2162
+ ["editor"],
1756
2163
  (components) => applyMinimalistStylePatch(components.editor.styles.minimalist, patch),
1757
2164
  path,
1758
2165
  );
@@ -1763,6 +2170,7 @@ export function saveUserMessagesComponentPatch(
1763
2170
  path = configPath,
1764
2171
  ): PolishedTuiConfig {
1765
2172
  return saveComponentsMutation(
2173
+ ["userMessages"],
1766
2174
  (components) => {
1767
2175
  const component = components.userMessages;
1768
2176
  if (patch.enabled !== undefined) component.enabled = patch.enabled;
@@ -1779,11 +2187,15 @@ export function saveThinkingStepsComponentPatch(
1779
2187
  patch: Partial<ThinkingStepsComponentConfig>,
1780
2188
  path = configPath,
1781
2189
  ): PolishedTuiConfig {
1782
- return saveComponentsMutation((components) => {
1783
- const component = components.thinkingSteps;
1784
- if (patch.enabled !== undefined) component.enabled = patch.enabled;
1785
- if (patch.mode !== undefined) component.mode = patch.mode;
1786
- }, path);
2190
+ return saveComponentsMutation(
2191
+ ["thinkingSteps"],
2192
+ (components) => {
2193
+ const component = components.thinkingSteps;
2194
+ if (patch.enabled !== undefined) component.enabled = patch.enabled;
2195
+ if (patch.mode !== undefined) component.mode = patch.mode;
2196
+ },
2197
+ path,
2198
+ );
1787
2199
  }
1788
2200
 
1789
2201
  export function saveWorkingLineComponentPatch(
@@ -1791,10 +2203,13 @@ export function saveWorkingLineComponentPatch(
1791
2203
  path = configPath,
1792
2204
  ): PolishedTuiConfig {
1793
2205
  return saveComponentsMutation(
2206
+ ["workingLine"],
1794
2207
  (components) => {
1795
2208
  const component = components.workingLine;
1796
2209
  if (patch.enabled !== undefined) component.enabled = patch.enabled;
1797
2210
  if (patch.turnSummary !== undefined) component.turnSummary = patch.turnSummary;
2211
+ if (patch.turnSummaryFormat !== undefined)
2212
+ component.turnSummaryFormat = normalizeTurnSummaryFormat(patch.turnSummaryFormat);
1798
2213
  if (patch.spinner !== undefined) component.spinner = patch.spinner;
1799
2214
  if (patch.spinnerIntervalMs !== undefined)
1800
2215
  component.spinnerIntervalMs = patch.spinnerIntervalMs;
@@ -1803,6 +2218,7 @@ export function saveWorkingLineComponentPatch(
1803
2218
  if (patch.textIntervalMs !== undefined) component.textIntervalMs = patch.textIntervalMs;
1804
2219
  if (patch.textAnimation !== undefined) component.textAnimation = patch.textAnimation;
1805
2220
  if (patch.colorSource !== undefined) component.colorSource = patch.colorSource;
2221
+ if (patch.placement !== undefined) component.placement = patch.placement;
1806
2222
  if (patch.messages?.custom !== undefined) component.messages.custom = patch.messages.custom;
1807
2223
  if (patch.messages?.values !== undefined) {
1808
2224
  component.messages.values = normalizeWorkingLineMessages([...patch.messages.values]);
@@ -1813,11 +2229,15 @@ export function saveWorkingLineComponentPatch(
1813
2229
  if (patch.segments?.thought !== undefined)
1814
2230
  component.segments.thought = patch.segments.thought;
1815
2231
  if (patch.segments?.tokens !== undefined) component.segments.tokens = patch.segments.tokens;
2232
+ if (patch.segments?.tokenRate !== undefined)
2233
+ component.segments.tokenRate = patch.segments.tokenRate;
1816
2234
  },
1817
2235
  path,
1818
2236
  (record) => {
1819
2237
  const workingLine = recordValue(recordValue(record.components).workingLine);
1820
2238
  delete workingLine.intervalMs;
2239
+ if (typeof patch.turnSummaryFormat === "string" && !patch.turnSummaryFormat.trim())
2240
+ delete workingLine.turnSummaryFormat;
1821
2241
  const messages = recordValue(workingLine.messages);
1822
2242
  delete messages.mode;
1823
2243
  },
@@ -1825,10 +2245,11 @@ export function saveWorkingLineComponentPatch(
1825
2245
  }
1826
2246
 
1827
2247
  export function saveSelectorBordersComponentPatch(
1828
- patch: Partial<SelectorBordersComponentConfig>,
2248
+ patch: Partial<Omit<SelectorBordersComponentConfig, "colors">>,
1829
2249
  path = configPath,
1830
2250
  ): PolishedTuiConfig {
1831
2251
  return saveComponentsMutation(
2252
+ ["selectorBorders"],
1832
2253
  (components) => {
1833
2254
  const component = components.selectorBorders;
1834
2255
  if (patch.enabled !== undefined) component.enabled = patch.enabled;
@@ -1842,12 +2263,16 @@ export function saveSelectorBordersComponentPatch(
1842
2263
  }
1843
2264
 
1844
2265
  export function saveFooterComponentPatch(
1845
- patch: Partial<Pick<FooterComponentConfig, "style" | "colorSource" | "modelLabel">>,
2266
+ patch: Partial<
2267
+ Pick<FooterComponentConfig, "style" | "colorSource" | "modelLabel" | "codexQuota">
2268
+ >,
1846
2269
  path = configPath,
1847
2270
  ): PolishedTuiConfig {
1848
2271
  return saveComponentsMutation(
2272
+ ["footer"],
1849
2273
  (components) => {
1850
2274
  const component = components.footer;
2275
+ if (patch.codexQuota !== undefined) component.codexQuota = patch.codexQuota;
1851
2276
  if (patch.style !== undefined) component.style = patch.style;
1852
2277
  if (patch.colorSource !== undefined) component.colorSource = patch.colorSource;
1853
2278
  if (patch.modelLabel !== undefined) component.modelLabel = patch.modelLabel;
@@ -1860,7 +2285,7 @@ export function saveFooterComponentPatch(
1860
2285
 
1861
2286
  function applyStarshipStylePatch(
1862
2287
  style: StarshipFooterStyleConfig,
1863
- patch: Partial<StarshipFooterStyleConfig>,
2288
+ patch: StarshipFooterStylePatch,
1864
2289
  ): void {
1865
2290
  if (patch.format !== undefined) style.format = patch.format;
1866
2291
  if (patch.responsive !== undefined) style.responsive = patch.responsive;
@@ -1896,12 +2321,18 @@ function applyStarshipStylePatch(
1896
2321
  }
1897
2322
 
1898
2323
  export function saveStarshipFooterStylePatch(
1899
- patch: Partial<StarshipFooterStyleConfig>,
2324
+ patch: StarshipFooterStylePatch,
1900
2325
  path = configPath,
1901
2326
  ): PolishedTuiConfig {
1902
2327
  return saveComponentsMutation(
2328
+ ["footer"],
1903
2329
  (components) => applyStarshipStylePatch(components.footer.styles.starship, patch),
1904
2330
  path,
2331
+ (record) =>
2332
+ applyTemplateVariablePatch(record, "footer", "starship", patch, [
2333
+ ...FOOTER_FORMAT_VARIABLES,
2334
+ ...Object.keys(FOOTER_FORMAT_ALIASES),
2335
+ ]),
1905
2336
  );
1906
2337
  }
1907
2338
 
@@ -1910,16 +2341,24 @@ export function saveColorSourcesPatch(
1910
2341
  path = configPath,
1911
2342
  ): PolishedTuiConfig {
1912
2343
  const valid = validColorSourceEntries(patch);
1913
- return saveComponentsMutation((components) => {
1914
- if (valid.starship !== undefined) components.footer.colorSource = valid.starship;
1915
- if (valid.editor !== undefined) {
1916
- components.editor.colorSource = valid.editor;
1917
- components.selectorBorders.colorSource = valid.editor;
1918
- }
1919
- if (valid.userMessages !== undefined) {
1920
- components.userMessages.colorSource = valid.userMessages;
1921
- }
1922
- }, path);
2344
+ return saveComponentsMutation(
2345
+ [
2346
+ ...(valid.editor !== undefined ? (["editor", "selectorBorders"] as const) : []),
2347
+ ...(valid.userMessages !== undefined ? (["userMessages"] as const) : []),
2348
+ ...(valid.starship !== undefined ? (["footer"] as const) : []),
2349
+ ],
2350
+ (components) => {
2351
+ if (valid.starship !== undefined) components.footer.colorSource = valid.starship;
2352
+ if (valid.editor !== undefined) {
2353
+ components.editor.colorSource = valid.editor;
2354
+ components.selectorBorders.colorSource = valid.editor;
2355
+ }
2356
+ if (valid.userMessages !== undefined) {
2357
+ components.userMessages.colorSource = valid.userMessages;
2358
+ }
2359
+ },
2360
+ path,
2361
+ );
1923
2362
  }
1924
2363
 
1925
2364
  export function saveUiFeaturesPatch(
@@ -1928,6 +2367,14 @@ export function saveUiFeaturesPatch(
1928
2367
  ): PolishedTuiConfig {
1929
2368
  const valid = validUiFeatureEntries(patch);
1930
2369
  return saveComponentsMutation(
2370
+ [
2371
+ ...(valid.editor !== undefined
2372
+ ? (["editor", "userMessages", "selectorBorders"] as const)
2373
+ : valid.viewportIndicators !== undefined
2374
+ ? (["editor"] as const)
2375
+ : []),
2376
+ ...(valid.statusLine !== undefined ? (["footer"] as const) : []),
2377
+ ],
1931
2378
  (components) => {
1932
2379
  if (valid.editor !== undefined) {
1933
2380
  components.editor.enabled = valid.editor;
@@ -2002,51 +2449,67 @@ export function saveContextThresholdsPatch(
2002
2449
  if (typeof thresholds.warning === "bigint" || typeof thresholds.error === "bigint") {
2003
2450
  throw new TypeError("Context thresholds must be JSON-serializable numbers");
2004
2451
  }
2005
- return saveComponentsMutation((components) => {
2006
- components.editor.styles.minimalist.contextThresholds = {
2007
- ...components.editor.styles.minimalist.contextThresholds,
2008
- ...thresholds,
2009
- };
2010
- components.footer.styles.starship.contextThresholds = {
2011
- ...components.footer.styles.starship.contextThresholds,
2012
- ...thresholds,
2013
- };
2014
- }, path);
2452
+ return saveComponentsMutation(
2453
+ ["editor", "footer"],
2454
+ (components) => {
2455
+ components.editor.styles.minimalist.contextThresholds = {
2456
+ ...components.editor.styles.minimalist.contextThresholds,
2457
+ ...thresholds,
2458
+ };
2459
+ components.footer.styles.starship.contextThresholds = {
2460
+ ...components.footer.styles.starship.contextThresholds,
2461
+ ...thresholds,
2462
+ };
2463
+ },
2464
+ path,
2465
+ );
2015
2466
  }
2016
2467
 
2017
2468
  export function savePathDisplayPatch(
2018
2469
  patch: Partial<PathDisplayConfig>,
2019
2470
  path = configPath,
2020
2471
  ): PolishedTuiConfig {
2021
- return saveComponentsMutation((components) => {
2022
- components.footer.styles.starship.pathDisplay = {
2023
- ...components.footer.styles.starship.pathDisplay,
2024
- ...patch,
2025
- };
2026
- }, path);
2472
+ return saveComponentsMutation(
2473
+ ["footer"],
2474
+ (components) => {
2475
+ components.footer.styles.starship.pathDisplay = {
2476
+ ...components.footer.styles.starship.pathDisplay,
2477
+ ...patch,
2478
+ };
2479
+ },
2480
+ path,
2481
+ );
2027
2482
  }
2028
2483
 
2029
2484
  export function saveGitBranchPatch(
2030
2485
  patch: Partial<GitBranchConfig>,
2031
2486
  path = configPath,
2032
2487
  ): PolishedTuiConfig {
2033
- return saveComponentsMutation((components) => {
2034
- components.footer.styles.starship.gitBranch = {
2035
- ...components.footer.styles.starship.gitBranch,
2036
- ...patch,
2037
- };
2038
- }, path);
2488
+ return saveComponentsMutation(
2489
+ ["footer"],
2490
+ (components) => {
2491
+ components.footer.styles.starship.gitBranch = {
2492
+ ...components.footer.styles.starship.gitBranch,
2493
+ ...patch,
2494
+ };
2495
+ },
2496
+ path,
2497
+ );
2039
2498
  }
2040
2499
 
2041
2500
  export function saveEditorModelLabel(
2042
2501
  value: ModelLabelSource,
2043
2502
  path = configPath,
2044
2503
  ): PolishedTuiConfig {
2045
- return saveComponentsMutation((components) => {
2046
- const normalized = parseEditorModelLabel(value);
2047
- components.editor.modelLabel = normalized;
2048
- components.footer.modelLabel = normalized;
2049
- }, path);
2504
+ return saveComponentsMutation(
2505
+ ["editor", "footer"],
2506
+ (components) => {
2507
+ const normalized = parseEditorModelLabel(value);
2508
+ components.editor.modelLabel = normalized;
2509
+ components.footer.modelLabel = normalized;
2510
+ },
2511
+ path,
2512
+ );
2050
2513
  }
2051
2514
 
2052
2515
  export function saveEditorStyle(value: EditorStyle, path = configPath): PolishedTuiConfig {
@@ -2054,7 +2517,7 @@ export function saveEditorStyle(value: EditorStyle, path = configPath): Polished
2054
2517
  }
2055
2518
 
2056
2519
  export function saveMinimalistPatch(
2057
- patch: Partial<MinimalistConfig>,
2520
+ patch: MinimalistEditorStylePatch,
2058
2521
  path = configPath,
2059
2522
  ): PolishedTuiConfig {
2060
2523
  return saveMinimalistEditorStylePatch(patch, path);
@@ -2074,12 +2537,16 @@ export function saveGitCommitPatch(
2074
2537
  const valid: Partial<GitCommitConfig> = {};
2075
2538
  if (typeof patch.onlyDetached === "boolean") valid.onlyDetached = patch.onlyDetached;
2076
2539
  if (typeof patch.showTag === "boolean") valid.showTag = patch.showTag;
2077
- return saveComponentsMutation((components) => {
2078
- components.footer.styles.starship.gitCommit = {
2079
- ...components.footer.styles.starship.gitCommit,
2080
- ...valid,
2081
- };
2082
- }, path);
2540
+ return saveComponentsMutation(
2541
+ ["footer"],
2542
+ (components) => {
2543
+ components.footer.styles.starship.gitCommit = {
2544
+ ...components.footer.styles.starship.gitCommit,
2545
+ ...valid,
2546
+ };
2547
+ },
2548
+ path,
2549
+ );
2083
2550
  }
2084
2551
 
2085
2552
  export function saveGitMetricsPatch(
@@ -2089,24 +2556,32 @@ export function saveGitMetricsPatch(
2089
2556
  const valid: Partial<GitMetricsConfig> = {};
2090
2557
  if (typeof patch.onlyNonzero === "boolean") valid.onlyNonzero = patch.onlyNonzero;
2091
2558
  if (typeof patch.ignoreSubmodules === "boolean") valid.ignoreSubmodules = patch.ignoreSubmodules;
2092
- return saveComponentsMutation((components) => {
2093
- components.footer.styles.starship.gitMetrics = {
2094
- ...components.footer.styles.starship.gitMetrics,
2095
- ...valid,
2096
- };
2097
- }, path);
2559
+ return saveComponentsMutation(
2560
+ ["footer"],
2561
+ (components) => {
2562
+ components.footer.styles.starship.gitMetrics = {
2563
+ ...components.footer.styles.starship.gitMetrics,
2564
+ ...valid,
2565
+ };
2566
+ },
2567
+ path,
2568
+ );
2098
2569
  }
2099
2570
 
2100
2571
  export function saveExtensionStatusDefaultPlacement(
2101
2572
  placement: ExtensionStatusPlacement,
2102
2573
  path = configPath,
2103
2574
  ): PolishedTuiConfig {
2104
- return saveComponentsMutation((components) => {
2105
- components.footer.styles.starship.extensionStatuses.defaultPlacement =
2106
- isExtensionStatusPlacement(placement)
2107
- ? placement
2108
- : defaultConfig.extensionStatuses.defaultPlacement;
2109
- }, path);
2575
+ return saveComponentsMutation(
2576
+ ["footer"],
2577
+ (components) => {
2578
+ components.footer.styles.starship.extensionStatuses.defaultPlacement =
2579
+ isExtensionStatusPlacement(placement)
2580
+ ? placement
2581
+ : defaultConfig.extensionStatuses.defaultPlacement;
2582
+ },
2583
+ path,
2584
+ );
2110
2585
  }
2111
2586
 
2112
2587
  export function saveExtensionStatusPlacement(
@@ -2114,14 +2589,18 @@ export function saveExtensionStatusPlacement(
2114
2589
  placement: ExtensionStatusPlacement,
2115
2590
  path = configPath,
2116
2591
  ): PolishedTuiConfig {
2117
- return saveComponentsMutation((components) => {
2118
- Object.defineProperty(components.footer.styles.starship.extensionStatuses.placements, key, {
2119
- value: placement,
2120
- enumerable: true,
2121
- configurable: true,
2122
- writable: true,
2123
- });
2124
- }, path);
2592
+ return saveComponentsMutation(
2593
+ ["footer"],
2594
+ (components) => {
2595
+ Object.defineProperty(components.footer.styles.starship.extensionStatuses.placements, key, {
2596
+ value: placement,
2597
+ enumerable: true,
2598
+ configurable: true,
2599
+ writable: true,
2600
+ });
2601
+ },
2602
+ path,
2603
+ );
2125
2604
  }
2126
2605
 
2127
2606
  export function saveExtensionStatusColorMode(
@@ -2129,12 +2608,270 @@ export function saveExtensionStatusColorMode(
2129
2608
  colorMode: ExtensionStatusColorMode,
2130
2609
  path = configPath,
2131
2610
  ): PolishedTuiConfig {
2132
- return saveComponentsMutation((components) => {
2133
- Object.defineProperty(components.footer.styles.starship.extensionStatuses.colorModes, key, {
2134
- value: colorMode,
2135
- enumerable: true,
2136
- configurable: true,
2137
- writable: true,
2611
+ return mutateConfig(path, (record) => {
2612
+ const footer = recordValue(recordValue(record.components).footer);
2613
+ const starship = recordValue(recordValue(footer.styles).starship);
2614
+ const statuses = recordValue(starship.extensionStatuses);
2615
+ const colorModes = Object.hasOwn(statuses, "colorModes")
2616
+ ? recordValue(statuses.colorModes)
2617
+ : recordValue(recordValue(record.extensionStatuses).colorModes);
2618
+ record.components = overlayKnown(record.components, {
2619
+ footer: {
2620
+ styles: {
2621
+ starship: { extensionStatuses: { colorModes: { ...colorModes, [key]: colorMode } } },
2622
+ },
2623
+ },
2624
+ });
2625
+ });
2626
+ }
2627
+
2628
+ /** Hidden placement edits remain sparse and never snapshot another owner's preferences. */
2629
+ export function saveHiddenExtensionStatusDefaultPlacement(
2630
+ placement: HiddenExtensionStatusPlacement,
2631
+ path = configPath,
2632
+ ): PolishedTuiConfig {
2633
+ return mutateConfig(path, (record) => {
2634
+ record.components = overlayKnown(record.components, {
2635
+ extensionStatuses: { hidden: { defaultPlacement: placement } },
2138
2636
  });
2139
- }, path);
2637
+ });
2638
+ }
2639
+
2640
+ export function saveHiddenExtensionStatusPlacement(
2641
+ key: string,
2642
+ placement: HiddenExtensionStatusPlacement | undefined,
2643
+ path = configPath,
2644
+ ): PolishedTuiConfig {
2645
+ return mutateConfig(path, (record) => {
2646
+ if (placement === undefined) {
2647
+ const owner = recordValue(recordValue(record.components).extensionStatuses);
2648
+ delete recordValue(recordValue(owner.hidden).placements)[key];
2649
+ } else {
2650
+ record.components = overlayKnown(record.components, {
2651
+ extensionStatuses: { hidden: { placements: { [key]: placement } } },
2652
+ });
2653
+ }
2654
+ });
2655
+ }
2656
+
2657
+ /** Original is Hidden's default; choosing it removes only this color override. */
2658
+ export function saveHiddenExtensionStatusColorMode(
2659
+ key: string,
2660
+ colorMode: ExtensionStatusColorMode,
2661
+ path = configPath,
2662
+ ): PolishedTuiConfig {
2663
+ return mutateConfig(path, (record) => {
2664
+ if (colorMode === "original") {
2665
+ const owner = recordValue(recordValue(record.components).extensionStatuses);
2666
+ delete recordValue(recordValue(owner.hidden).colorModes)[key];
2667
+ } else {
2668
+ record.components = overlayKnown(record.components, {
2669
+ extensionStatuses: { hidden: { colorModes: { [key]: colorMode } } },
2670
+ });
2671
+ }
2672
+ });
2673
+ }
2674
+
2675
+ export function saveExtensionStatusDefaultVisibility(
2676
+ visibility: ExtensionStatusVisibility,
2677
+ path = configPath,
2678
+ ): PolishedTuiConfig {
2679
+ return saveComponentsMutation(
2680
+ ["extensionStatuses"],
2681
+ (components) => {
2682
+ components.extensionStatuses.defaultVisibility = visibility;
2683
+ },
2684
+ path,
2685
+ );
2686
+ }
2687
+
2688
+ /** Undefined resumes the independent default, without changing Starship presentation. */
2689
+ export function saveExtensionStatusVisibility(
2690
+ key: string,
2691
+ visibility: ExtensionStatusVisibility | undefined,
2692
+ path = configPath,
2693
+ ): PolishedTuiConfig {
2694
+ return saveComponentsMutation(
2695
+ ["extensionStatuses"],
2696
+ (components) => {
2697
+ if (visibility === undefined) delete components.extensionStatuses.visibility[key];
2698
+ else
2699
+ Object.defineProperty(components.extensionStatuses.visibility, key, {
2700
+ value: visibility,
2701
+ enumerable: true,
2702
+ configurable: true,
2703
+ writable: true,
2704
+ });
2705
+ },
2706
+ path,
2707
+ (record) => {
2708
+ // overlayKnown preserves unknown leaves; explicitly remove a reset override.
2709
+ if (visibility === undefined) {
2710
+ const owner = recordValue(recordValue(record.components).extensionStatuses);
2711
+ delete recordValue(owner.visibility)[key];
2712
+ }
2713
+ },
2714
+ );
2715
+ }
2716
+
2717
+ export type ExtensionStatusChoice = "default" | ExtensionStatusPlacement;
2718
+
2719
+ /** Save one menu choice in a single atomic write, without snapshotting other components. */
2720
+ export function saveExtensionStatusDefaultChoice(
2721
+ placement: ExtensionStatusPlacement,
2722
+ style: FooterStyle,
2723
+ path = configPath,
2724
+ ): PolishedTuiConfig {
2725
+ return mutateConfig(path, (record) => {
2726
+ record.components = overlayKnown(record.components, {
2727
+ extensionStatuses: { defaultVisibility: placement === "off" ? "hide" : "show" },
2728
+ });
2729
+ if (placement === "off") return;
2730
+ if (style === "hidden") {
2731
+ record.components = overlayKnown(record.components, {
2732
+ extensionStatuses: { hidden: { defaultPlacement: placement } },
2733
+ });
2734
+ } else {
2735
+ // Native retains Starship positioning as a dormant preference; Pi owns its layout.
2736
+ record.components = overlayKnown(record.components, {
2737
+ footer: { styles: { starship: { extensionStatuses: { defaultPlacement: placement } } } },
2738
+ });
2739
+ }
2740
+ });
2741
+ }
2742
+
2743
+ /** Default removes both visibility and current-mode placement, shadowing legacy Starship maps. */
2744
+ export function saveExtensionStatusChoice(
2745
+ key: string,
2746
+ choice: ExtensionStatusChoice,
2747
+ style: FooterStyle,
2748
+ path = configPath,
2749
+ ): PolishedTuiConfig {
2750
+ return mutateConfig(path, (record) => {
2751
+ const components = recordValue(record.components);
2752
+ const owner = recordValue(components.extensionStatuses);
2753
+ const hidden = recordValue(owner.hidden);
2754
+ const starship = recordValue(recordValue(recordValue(components.footer).styles).starship);
2755
+ const canonicalStatuses = recordValue(starship.extensionStatuses);
2756
+ if (choice === "default") {
2757
+ delete recordValue(owner.visibility)[key];
2758
+ if (style === "hidden") {
2759
+ delete recordValue(hidden.placements)[key];
2760
+ } else {
2761
+ // An empty canonical map must remain to prevent top-level legacy fallback.
2762
+ const placements = {
2763
+ ...recordValue(
2764
+ Object.hasOwn(canonicalStatuses, "placements")
2765
+ ? canonicalStatuses.placements
2766
+ : recordValue(record.extensionStatuses).placements,
2767
+ ),
2768
+ };
2769
+ delete placements[key];
2770
+ record.components = overlayKnown(record.components, {
2771
+ footer: { styles: { starship: { extensionStatuses: { placements: {} } } } },
2772
+ });
2773
+ const footer = recordValue(recordValue(record.components).footer);
2774
+ const savedStarship = recordValue(recordValue(footer.styles).starship);
2775
+ recordValue(savedStarship.extensionStatuses).placements = placements;
2776
+ }
2777
+ return;
2778
+ }
2779
+ record.components = overlayKnown(record.components, {
2780
+ extensionStatuses: { visibility: { [key]: choice === "off" ? "hide" : "show" } },
2781
+ });
2782
+ if (choice === "off") return;
2783
+ if (style === "hidden") {
2784
+ record.components = overlayKnown(record.components, {
2785
+ extensionStatuses: { hidden: { placements: { [key]: choice } } },
2786
+ });
2787
+ } else {
2788
+ const placements = Object.hasOwn(canonicalStatuses, "placements")
2789
+ ? recordValue(canonicalStatuses.placements)
2790
+ : recordValue(recordValue(record.extensionStatuses).placements);
2791
+ record.components = overlayKnown(record.components, {
2792
+ footer: {
2793
+ styles: {
2794
+ starship: { extensionStatuses: { placements: { ...placements, [key]: choice } } },
2795
+ },
2796
+ },
2797
+ });
2798
+ }
2799
+ });
2800
+ }
2801
+
2802
+ /** Explicit all-owner migration; callers must obtain confirmation before invoking. */
2803
+ export function migrateComponentSelections(path = configPath): PolishedTuiConfig {
2804
+ return saveComponentsMutation(
2805
+ [
2806
+ "editor",
2807
+ "userMessages",
2808
+ "thinkingSteps",
2809
+ "workingLine",
2810
+ "selectorBorders",
2811
+ "footer",
2812
+ "extensionStatuses",
2813
+ ],
2814
+ () => {},
2815
+ path,
2816
+ );
2817
+ }
2818
+
2819
+ /** Undefined deletes the local key: empty and whitespace strings are deliberate unstyled overrides. */
2820
+ export function saveComponentColor<O extends ColorOwner>(
2821
+ owner: O,
2822
+ key: ComponentColorKey<O>,
2823
+ value: string | undefined,
2824
+ path = configPath,
2825
+ ): PolishedTuiConfig {
2826
+ if (!(componentColorKeys[owner] as readonly string[]).includes(key))
2827
+ throw new Error("Unknown component color role");
2828
+ if (value !== undefined && !isSupportedColorSpec(value))
2829
+ throw new Error("Unsupported color style");
2830
+ return saveComponentsMutation(
2831
+ [owner],
2832
+ () => {},
2833
+ path,
2834
+ (record) => {
2835
+ const component = recordValue(recordValue(record.components)[owner]);
2836
+ const colors = { ...recordValue(component.colors) };
2837
+ if (value === undefined) delete colors[key];
2838
+ else
2839
+ Object.defineProperty(colors, key, {
2840
+ value,
2841
+ enumerable: true,
2842
+ configurable: true,
2843
+ writable: true,
2844
+ });
2845
+ component.colors = colors;
2846
+ },
2847
+ );
2848
+ }
2849
+
2850
+ /** One sparse publisher leaf; selection snapshots exclude the entire map. */
2851
+ export function saveCustomValueColor(
2852
+ owner: "editor" | "footer",
2853
+ key: string,
2854
+ value: string | undefined,
2855
+ path = configPath,
2856
+ ): PolishedTuiConfig {
2857
+ if (customValueColor({ [key]: value ?? "" }, key) === undefined)
2858
+ throw new Error("Unsupported publisher key or color style");
2859
+ return saveComponentsMutation(
2860
+ [owner],
2861
+ () => {},
2862
+ path,
2863
+ (record) => {
2864
+ const component = recordValue(recordValue(record.components)[owner]);
2865
+ const colors = { ...recordValue(component.customValueColors) };
2866
+ if (value === undefined) delete colors[key];
2867
+ else
2868
+ Object.defineProperty(colors, key, {
2869
+ value,
2870
+ enumerable: true,
2871
+ configurable: true,
2872
+ writable: true,
2873
+ });
2874
+ component.customValueColors = colors;
2875
+ },
2876
+ );
2140
2877
  }