@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
@@ -10,6 +10,14 @@ import {
10
10
  truncateToWidth,
11
11
  visibleWidth,
12
12
  } from "@earendil-works/pi-tui";
13
+ import { type ColorOwner, componentColor } from "./component-colors";
14
+ import {
15
+ type ComponentSettingsDeps,
16
+ confirmComponentMigration,
17
+ editComponentColors,
18
+ editCustomValueColors,
19
+ editTurnSummaryFormat,
20
+ } from "./component-settings";
13
21
  import {
14
22
  type AccentRailEditorStyleConfig,
15
23
  type ColorSource,
@@ -19,6 +27,7 @@ import {
19
27
  type EditorBorderColorMode,
20
28
  type EditorComponentConfig,
21
29
  type EditorStyle,
30
+ type ExtensionStatusChoice,
22
31
  type ExtensionStatusColorMode,
23
32
  type ExtensionStatusPlacement,
24
33
  type FooterComponentConfig,
@@ -29,7 +38,7 @@ import {
29
38
  type GitCommitConfig,
30
39
  type GitMetricsConfig,
31
40
  getExtensionStatusColorMode,
32
- getExtensionStatusPlacement,
41
+ getHiddenExtensionStatusColorMode,
33
42
  type IconMode,
34
43
  isExtensionStatusColorMode,
35
44
  isExtensionStatusPlacement,
@@ -38,6 +47,8 @@ import {
38
47
  MAX_WORKING_LINE_INTERVAL_MS,
39
48
  MIN_WORKING_LINE_INTERVAL_MS,
40
49
  type MinimalistConfig,
50
+ type MinimalistEditorSeparator,
51
+ type MinimalistEditorStylePatch,
41
52
  type ModelLabelSource,
42
53
  type PathDisplayConfig,
43
54
  type PolishedCopyFriendlyEditorStyleConfig,
@@ -50,12 +61,19 @@ import {
50
61
  type UserMessageStyle,
51
62
  type UserMessagesComponentConfig,
52
63
  type WorkingLineComponentPatch,
64
+ type WorkingLinePlacement,
53
65
  type WorkingLineSpinner,
54
66
  type WorkingLineTextAnimation,
55
67
  } from "./config";
56
68
  import { prepareEditorTextForCustomUi } from "./editor-transfer";
57
69
  import { sanitizeExtensionStatusText } from "./extension-status";
70
+ import {
71
+ extensionStatusChoice,
72
+ extensionStatusChoiceLabels,
73
+ extensionStatusDefaultChoice,
74
+ } from "./extension-status-settings";
58
75
  import { isIconMode } from "./icons";
76
+ import { editMinimalistTemplates, editMinimalistVariables } from "./minimalist-settings";
59
77
  import {
60
78
  componentPresets,
61
79
  getComponentPreset,
@@ -63,13 +81,15 @@ import {
63
81
  type PresetId,
64
82
  } from "./presets";
65
83
  import type { SessionLifecycle } from "./session-lifecycle";
84
+ import { settingsKeys } from "./settings-keys";
85
+ import { selectOwnedSetting } from "./settings-list-selection";
66
86
  import {
67
87
  renderEditorSettingsPreview,
68
88
  renderThinkingStepsSettingsPreview,
69
89
  renderUserMessageSettingsPreview,
70
90
  SETTINGS_PREVIEW_MAX_WIDTH,
71
91
  } from "./settings-previews";
72
- import { EDITOR_BORDER_STYLE, renderChromeBorder, safeThemeFg } from "./style";
92
+ import { EDITOR_BORDER_FALLBACK, renderStyleForSourceOrFallback, safeThemeFg } from "./style";
73
93
  import { formatThinkingStatus, thinkingStatusLabels } from "./thinking-status";
74
94
  import {
75
95
  buildWorkingLinePreviewFrames,
@@ -79,13 +99,8 @@ import {
79
99
  } from "./working-line";
80
100
 
81
101
  const colorSourceValues: ColorSource[] = ["theme", "terminal"];
82
- const extensionStatusPlacementValues: ExtensionStatusPlacement[] = [
83
- "off",
84
- "left",
85
- "middle",
86
- "right",
87
- ];
88
- const extensionStatusColorModeValues: ExtensionStatusColorMode[] = ["zentui", "original"];
102
+ const extensionStatusPlacementValues = ["Left", "Middle", "Right", "Off"];
103
+ const extensionStatusColorModeValues = ["Original", "Zentui"];
89
104
  const contextStyleValues: ContextStyle[] = ["text", "gauge", "text+gauge"];
90
105
  const separatorStyleValues: SeparatorStyle[] = ["pipe", "dot", "chevron", "none"];
91
106
  const pathDisplayModeValues: PathDisplayConfig["mode"][] = ["basename", "repository", "full"];
@@ -117,6 +132,7 @@ const completionMenuValues: CompletionMenuStyle[] = ["palette", "native"];
117
132
  const accentRailSurfaceValues = ["filled", "transparent"];
118
133
  const minimalistPathDisplayValues = ["compact", "project", "full"];
119
134
  const minimalistContextFormatValues = ["percent", "percent-total"];
135
+ const minimalistSeparatorValues: MinimalistEditorSeparator[] = ["dash", "dot"];
120
136
  const editorBorderColorModeValues: EditorBorderColorMode[] = ["static", "adaptive"];
121
137
  const compactFooterMaxLineValues = ["1", "2", "3", "unlimited"];
122
138
  const featureStateValues: FeatureState[] = ["enabled", "disabled"];
@@ -142,6 +158,11 @@ const speedValues = (presets: readonly { label: string }[]) => [
142
158
  ...presets.map(({ label }) => label),
143
159
  "Custom…",
144
160
  ];
161
+ const workingLinePlacementLabels: Record<WorkingLinePlacement, string> = {
162
+ above: "Above",
163
+ border: "Border",
164
+ };
165
+ const workingLinePlacementValues = Object.values(workingLinePlacementLabels);
145
166
  const workingLineTextAnimationValues: WorkingLineTextAnimation[] = ["classic", "kitt", "disabled"];
146
167
  const thinkingStepsModeLabels: Record<ThinkingStepsMode, string> = {
147
168
  rail: "Rail",
@@ -161,28 +182,53 @@ const settingsSections = [
161
182
  "thinkingSteps",
162
183
  "workingLine",
163
184
  "footer",
164
- "segments",
165
- "git",
166
185
  "extensions",
167
186
  ] as const;
168
-
187
+ const skinSections: readonly TopLevelSection[] = ["editor", "userMessages", "footer"];
188
+ const footerPages = ["segments", "git"] as const;
189
+ type FooterPage = (typeof footerPages)[number];
190
+ type TopLevelSection = (typeof settingsSections)[number];
169
191
  type FeatureState = "enabled" | "disabled";
170
- type SettingsSection = (typeof settingsSections)[number];
192
+ type SettingsSection = TopLevelSection | FooterPage;
193
+
194
+ function isFooterPage(section: string): section is FooterPage {
195
+ return footerPages.some((page) => page === section);
196
+ }
197
+ function topLevelSection(section: SettingsSection): TopLevelSection {
198
+ return isFooterPage(section) ? "footer" : section;
199
+ }
200
+ function footerPageSettingId(page: FooterPage): string {
201
+ return `footerPage:${page}`;
202
+ }
171
203
  type FooterSegmentSettingId = keyof FooterSegmentsConfig;
172
204
  type EditorPatch = Partial<
173
205
  Pick<
174
206
  EditorComponentConfig,
175
- "enabled" | "style" | "colorSource" | "borderColorMode" | "modelLabel" | "viewportIndicators"
207
+ | "enabled"
208
+ | "style"
209
+ | "colorSource"
210
+ | "borderColorMode"
211
+ | "modelLabel"
212
+ | "viewportIndicators"
213
+ | "codexQuota"
176
214
  >
177
215
  >;
178
216
  type UserMessagesPatch = Partial<
179
217
  Pick<UserMessagesComponentConfig, "enabled" | "style" | "colorSource">
180
218
  >;
181
- type FooterPatch = Partial<Pick<FooterComponentConfig, "style" | "colorSource" | "modelLabel">>;
219
+ type FooterPatch = Partial<
220
+ Pick<FooterComponentConfig, "style" | "colorSource" | "modelLabel" | "codexQuota">
221
+ >;
182
222
  type ApplyResult = { applied: boolean; reason?: string };
183
223
  type SettingsOutcome =
184
224
  | "close"
225
+ | "migrate"
226
+ | `edit-colors:${ColorOwner}`
227
+ | `edit-custom-value-colors:${"editor" | "footer"}`
228
+ | "edit-minimalist-templates"
229
+ | "edit-minimalist-variables"
185
230
  | "edit-working-line-messages"
231
+ | "edit-turn-summary-format"
186
232
  | "edit-working-line-spinner-speed"
187
233
  | "edit-working-line-text-speed";
188
234
 
@@ -217,7 +263,8 @@ function experimentalThinkingCapability(
217
263
  };
218
264
  }
219
265
 
220
- type SettingsCommandDeps = {
266
+ type SettingsCommandDeps = Omit<ComponentSettingsDeps, "getConfig"> & {
267
+ skinOnly?: boolean;
221
268
  sessionLifecycle: SessionLifecycle;
222
269
  getConfig: () => PolishedTuiConfig;
223
270
  applyPreset: (
@@ -237,7 +284,7 @@ type SettingsCommandDeps = {
237
284
  ctx: ExtensionContext,
238
285
  ) => void;
239
286
  setAccentRail: (patch: Partial<AccentRailEditorStyleConfig>, ctx: ExtensionContext) => void;
240
- setMinimalist: (patch: Partial<MinimalistConfig>, ctx: ExtensionContext) => void;
287
+ setMinimalist: (patch: MinimalistEditorStylePatch, ctx: ExtensionContext) => void;
241
288
  setUserMessagesComponent: (patch: UserMessagesPatch, ctx: ExtensionContext) => void;
242
289
  thinkingStepsCapability: ThinkingStepsSettingsCapability;
243
290
  setThinkingStepsComponent: (
@@ -246,7 +293,7 @@ type SettingsCommandDeps = {
246
293
  ) => ApplyResult;
247
294
  setWorkingLineComponent: (patch: WorkingLineComponentPatch, ctx: ExtensionContext) => ApplyResult;
248
295
  setSelectorBordersComponent: (
249
- patch: Partial<SelectorBordersComponentConfig>,
296
+ patch: Partial<Omit<SelectorBordersComponentConfig, "colors">>,
250
297
  ctx: ExtensionContext,
251
298
  ) => void;
252
299
  setFooterComponent: (patch: FooterPatch, ctx: ExtensionContext) => void;
@@ -267,8 +314,9 @@ type SettingsCommandDeps = {
267
314
  ) => void;
268
315
  setGitMetrics: (patch: Partial<GitMetricsConfig>, ctx: ExtensionContext) => void;
269
316
  getActiveExtensionStatuses: () => ReadonlyMap<string, string>;
270
- setExtensionStatusDefaultPlacement: (placement: ExtensionStatusPlacement) => void;
271
- setExtensionStatusPlacement: (key: string, placement: ExtensionStatusPlacement) => void;
317
+ setExtensionStatusDefaultChoice: (placement: ExtensionStatusPlacement) => void;
318
+ setExtensionStatusChoice: (key: string, choice: ExtensionStatusChoice) => void;
319
+ setHiddenExtensionStatusColorMode: (key: string, colorMode: ExtensionStatusColorMode) => void;
272
320
  setExtensionStatusColorMode: (key: string, colorMode: ExtensionStatusColorMode) => void;
273
321
  requestRender: () => void;
274
322
  settingsListTheme?: SettingsListTheme;
@@ -283,7 +331,7 @@ const sectionLabels: Record<SettingsSection, string> = {
283
331
  footer: "Footer",
284
332
  segments: "Segments",
285
333
  git: "Git",
286
- extensions: "Extensions",
334
+ extensions: "Extension statuses",
287
335
  };
288
336
 
289
337
  const footerSegmentSettingLabels: Record<FooterSegmentSettingId, string> = {
@@ -326,7 +374,32 @@ const footerSegmentSettingDescriptions: Record<FooterSegmentSettingId, string> =
326
374
  gitMetrics: "Show aggregate added/deleted line counts.",
327
375
  };
328
376
 
377
+ function footerSegmentDescription(key: FooterSegmentSettingId): string {
378
+ if (key === "gitCounts")
379
+ return "Show numeric ahead/behind and stash counts in built-in segments and template git-status variables.";
380
+ return `Built-in layout: ${footerSegmentSettingDescriptions[key]} Explicit wide format and compactFormat templates choose their own segments, independent of these toggles.`;
381
+ }
382
+
383
+ const sectionRoutes: Record<string, SettingsSection> = {
384
+ appearance: "appearance",
385
+ editor: "editor",
386
+ messages: "userMessages",
387
+ "user-messages": "userMessages",
388
+ thinking: "thinkingSteps",
389
+ "thinking-steps": "thinkingSteps",
390
+ "working-line": "workingLine",
391
+ footer: "footer",
392
+ statusline: "footer",
393
+ status: "footer",
394
+ "status-line": "footer",
395
+ segments: "segments",
396
+ git: "git",
397
+ extensions: "extensions",
398
+ };
399
+
329
400
  const directCommandSuggestions = [
401
+ ...Object.keys(sectionRoutes),
402
+ "migrate",
330
403
  ...componentPresets.map(({ id }) => `preset ${id}`),
331
404
  "editor enable",
332
405
  "editor disable",
@@ -340,9 +413,6 @@ const directCommandSuggestions = [
340
413
  "viewport-indicators enable",
341
414
  "viewport-indicators disable",
342
415
  "viewport-indicators toggle",
343
- "messages",
344
- "user-messages",
345
- "working-line",
346
416
  "format clear",
347
417
  "format $cwd on $git_branch $fill $context",
348
418
  ];
@@ -468,28 +538,32 @@ function parseFormatCommand(args: string): { value: string | undefined } | undef
468
538
  }
469
539
 
470
540
  function directSection(args: string): SettingsSection | undefined {
471
- const normalized = args.trim().toLowerCase().replaceAll("_", "-");
472
- if (
473
- normalized === "messages" ||
474
- normalized === "user-messages" ||
475
- normalized === "user messages"
476
- ) {
477
- return "userMessages";
478
- }
479
- if (normalized === "working-line" || normalized === "working line") return "workingLine";
480
- return undefined;
541
+ return sectionRoutes[args.trim().toLowerCase().replaceAll(/[_ ]+/g, "-")];
481
542
  }
482
543
 
483
- function argumentCompletions(prefix: string): AutocompleteItem[] | null {
544
+ function argumentCompletions(prefix: string, skinOnly = false): AutocompleteItem[] | null {
484
545
  const normalized = prefix.trimStart().toLowerCase();
485
- const matches = directCommandSuggestions
486
- .map((value) => ({ value, label: value }))
546
+ const suggestions = skinOnly
547
+ ? directCommandSuggestions.filter((value) => {
548
+ const section = directSection(value);
549
+ return section
550
+ ? skinSections.includes(topLevelSection(section))
551
+ : /^(editor|messages|statusline|viewport-indicators|format|preset) /.test(value);
552
+ })
553
+ : directCommandSuggestions;
554
+ const matches = suggestions
555
+ .map((value) => ({
556
+ value,
557
+ label: isFooterPage(value)
558
+ ? `${value} — ${skinOnly ? "Statusline" : "Footer"} > ${sectionLabels[value]}`
559
+ : value,
560
+ }))
487
561
  .filter((item) => item.value.startsWith(normalized));
488
562
  return matches.length ? matches : null;
489
563
  }
490
564
 
491
565
  function usageText(): string {
492
- return "Usage: /zentui [editor|messages|statusline|viewport-indicators] [enable|disable|toggle], /zentui [messages|user-messages|working-line], /zentui preset <opencode|opencode-copy-friendly|rail|minimalist>, or /zentui format <template>";
566
+ return "Usage: /zentui [editor|messages|statusline|viewport-indicators] [enable|disable|toggle], /zentui [appearance|editor|user-messages|thinking|working-line|footer|segments|git|extensions], /zentui preset <opencode|opencode-copy-friendly|rail|minimalist>, or /zentui format <template>";
493
567
  }
494
568
 
495
569
  function buildAppearanceItems(config: PolishedTuiConfig): SettingItem[] {
@@ -506,16 +580,15 @@ function buildAppearanceItems(config: PolishedTuiConfig): SettingItem[] {
506
580
  {
507
581
  id: "selectorBordersEnabled",
508
582
  label: "Selector borders",
509
- description: "Enable or disable Zentui borders around Pi selectors.",
583
+ description: "Disable to leave selector borders native or predecessor-controlled.",
510
584
  currentValue: featureValue(component.enabled),
511
585
  values: featureStateValues,
512
586
  },
513
587
  {
514
588
  id: "selectorBordersStyle",
515
589
  label: "Selector border style",
516
- description: "Choose the selector-border style.",
590
+ description: "Zentui is the only selector-border treatment. Informational, not a choice.",
517
591
  currentValue: component.style,
518
- values: ["zentui"],
519
592
  },
520
593
  {
521
594
  id: "selectorBordersColorSource",
@@ -527,20 +600,25 @@ function buildAppearanceItems(config: PolishedTuiConfig): SettingItem[] {
527
600
  {
528
601
  id: "iconMode",
529
602
  label: "Icon mode",
530
- description: "auto/nerd use Nerd Font glyphs; ascii uses plain fallbacks.",
603
+ description:
604
+ "Auto uses conservative signals: TERM_PROGRAM=iTerm.app|WezTerm|ghostty (case-insensitive), nonempty KITTY_WINDOW_ID or ALACRITTY_SOCKET, and exact ZENTUI_NERD_FONTS=1|0; otherwise ASCII. Environment heuristics cannot detect whether a Nerd Font is installed/configured.",
531
605
  currentValue: config.icons.mode,
532
606
  values: iconModeValues,
533
607
  },
534
608
  ];
535
609
  }
536
610
 
611
+ const codexQuotaDescription =
612
+ "Remaining ChatGPT account quota for active openai-codex. Authenticated background refresh roughly every minute while active. Custom templates require $codex_quota; the toggle always gates access.";
613
+
537
614
  function buildEditorItems(config: PolishedTuiConfig): SettingItem[] {
538
615
  const editor = config.components.editor;
539
616
  return [
540
617
  {
541
618
  id: "editorEnabled",
542
619
  label: "Editor",
543
- description: "Enable or disable Zentui's custom editor.",
620
+ description:
621
+ "Disable to leave the editor native or predecessor-controlled; saved preferences are retained.",
544
622
  currentValue: featureValue(editor.enabled),
545
623
  values: featureStateValues,
546
624
  },
@@ -551,6 +629,7 @@ function buildEditorItems(config: PolishedTuiConfig): SettingItem[] {
551
629
  currentValue: editorStyleLabel(editor.style),
552
630
  values: editorStyleValues,
553
631
  },
632
+ ...(editor.style === "accent-rail" ? buildAccentRailEditorStyleItems(config) : []),
554
633
  {
555
634
  id: "editorColorSource",
556
635
  label: "Editor colors",
@@ -558,6 +637,13 @@ function buildEditorItems(config: PolishedTuiConfig): SettingItem[] {
558
637
  currentValue: editor.colorSource,
559
638
  values: colorSourceValues,
560
639
  },
640
+ {
641
+ id: "editorCodexQuota",
642
+ label: "Codex quota",
643
+ description: codexQuotaDescription,
644
+ currentValue: featureValue(editor.codexQuota),
645
+ values: featureStateValues,
646
+ },
561
647
  {
562
648
  id: "editorModelLabel",
563
649
  label: "Editor model label",
@@ -575,7 +661,7 @@ function buildEditorItems(config: PolishedTuiConfig): SettingItem[] {
575
661
  {
576
662
  id: "editorViewportIndicators",
577
663
  label: "Editor viewport indicators",
578
- description: "Show Pi's native wrapped-row counts in editor borders.",
664
+ description: "Show Pi's native wrapped-row counts when editor content is clipped.",
579
665
  currentValue: featureValue(editor.viewportIndicators),
580
666
  values: featureStateValues,
581
667
  },
@@ -604,8 +690,9 @@ function buildAccentRailEditorStyleItems(config: PolishedTuiConfig): SettingItem
604
690
  return [
605
691
  {
606
692
  id: "accentRailSurface",
607
- label: "Accent Rail surface",
608
- description: "Fill input and autocomplete surfaces or keep them transparent.",
693
+ label: "Editor background",
694
+ description:
695
+ "Filled adds the rail's background; transparent lets the terminal background show through. Native selection highlights are preserved.",
609
696
  currentValue: accentRail.transparent ? "transparent" : "filled",
610
697
  values: accentRailSurfaceValues,
611
698
  },
@@ -657,6 +744,13 @@ function buildMinimalistEditorStyleItems(config: PolishedTuiConfig): SettingItem
657
744
  currentValue: featureValue(minimalist.showCost),
658
745
  values: featureStateValues,
659
746
  },
747
+ {
748
+ id: "minimalistShowCacheHit",
749
+ label: "Cache hit rate",
750
+ description: "Show the latest prompt cache hit rate.",
751
+ currentValue: featureValue(minimalist.showCacheHit),
752
+ values: featureStateValues,
753
+ },
660
754
  {
661
755
  id: "minimalistShowGit",
662
756
  label: "Git",
@@ -664,6 +758,37 @@ function buildMinimalistEditorStyleItems(config: PolishedTuiConfig): SettingItem
664
758
  currentValue: featureValue(minimalist.showGit),
665
759
  values: featureStateValues,
666
760
  },
761
+ {
762
+ id: "minimalistSeparator",
763
+ label: "Separator",
764
+ description: "Choose dash (–) or dot (·) between editor metadata items.",
765
+ currentValue: minimalist.separator,
766
+ values: minimalistSeparatorValues,
767
+ },
768
+ {
769
+ id: "minimalistExtensionColorMode",
770
+ label: "Custom value colors",
771
+ description:
772
+ "Original preserves safe publisher styling; Zentui uses the Editor's color source.",
773
+ currentValue: minimalist.extensionColorMode === "zentui" ? "Zentui" : "Original",
774
+ values: extensionStatusColorModeValues,
775
+ },
776
+ {
777
+ id: "edit-minimalist-templates",
778
+ label: "Metadata templates",
779
+ description:
780
+ "Edit or reset six border slots. Explicit templates override metadata visibility toggles, never quota consent or operational indicators.",
781
+ currentValue: "Edit…",
782
+ values: ["Edit…"],
783
+ },
784
+ {
785
+ id: "edit-minimalist-variables",
786
+ label: "Custom variable aliases",
787
+ description:
788
+ "Map template variables to extension publisher keys; edit JSON or reset aliases.",
789
+ currentValue: "Edit…",
790
+ values: ["Edit…"],
791
+ },
667
792
  ];
668
793
  }
669
794
 
@@ -673,7 +798,8 @@ function buildUserMessagesItems(config: PolishedTuiConfig): SettingItem[] {
673
798
  {
674
799
  id: "userMessagesEnabled",
675
800
  label: "User messages",
676
- description: "Enable or disable previous user-message styling.",
801
+ description:
802
+ "Disable to leave previous messages native or predecessor-controlled; saved preferences are retained.",
677
803
  currentValue: featureValue(messages.enabled),
678
804
  values: featureStateValues,
679
805
  },
@@ -731,6 +857,16 @@ function buildWorkingLineItems(config: PolishedTuiConfig): SettingItem[] {
731
857
  currentValue: featureValue(workingLine.enabled),
732
858
  values: featureStateValues,
733
859
  },
860
+ ...(config.components.editor.enabled && config.components.editor.style !== "accent-rail"
861
+ ? [
862
+ {
863
+ id: "workingLinePlacement",
864
+ label: "Placement",
865
+ currentValue: workingLinePlacementLabels[workingLine.placement],
866
+ values: workingLinePlacementValues,
867
+ },
868
+ ]
869
+ : []),
734
870
  {
735
871
  id: "workingLineTurnSummary",
736
872
  label: "Turn summary",
@@ -740,6 +876,13 @@ function buildWorkingLineItems(config: PolishedTuiConfig): SettingItem[] {
740
876
  currentValue: featureValue(workingLine.turnSummary),
741
877
  values: featureStateValues,
742
878
  },
879
+ {
880
+ id: "workingLineTurnSummaryFormat",
881
+ label: "Turn summary format",
882
+ description: "Edit/reset the template for new summaries only.",
883
+ currentValue: "Edit / Reset…",
884
+ values: ["Edit / Reset…"],
885
+ },
743
886
  {
744
887
  id: "workingLineSpinner",
745
888
  label: "Spinner",
@@ -767,7 +910,8 @@ function buildWorkingLineItems(config: PolishedTuiConfig): SettingItem[] {
767
910
  {
768
911
  id: "workingLineTextAnimation",
769
912
  label: "Text animation",
770
- description: "Animate the owned row or keep it uniformly static.",
913
+ description:
914
+ "Classic/KITT animate every segment, including Token rate; Static uses mid with optional Token rate override.",
771
915
  currentValue: workingLine.textAnimation,
772
916
  values: workingLineTextAnimationValues,
773
917
  },
@@ -814,6 +958,14 @@ function buildWorkingLineItems(config: PolishedTuiConfig): SettingItem[] {
814
958
  currentValue: featureValue(workingLine.segments.thought),
815
959
  values: featureStateValues,
816
960
  },
961
+ {
962
+ id: "workingLineTokenRate",
963
+ label: "Token rate",
964
+ description:
965
+ "Recent generated output per second; ~ marks an estimate. Hidden during tools, idle, compaction, or stale/unsupported output.",
966
+ currentValue: featureValue(workingLine.segments.tokenRate ?? false),
967
+ values: featureStateValues,
968
+ },
817
969
  {
818
970
  id: "workingLineTokens",
819
971
  label: "Tokens",
@@ -839,7 +991,8 @@ function buildFooterItems(config: PolishedTuiConfig): SettingItem[] {
839
991
  {
840
992
  id: "footerStyle",
841
993
  label: "Footer style",
842
- description: "Use Pi's native footer, Zentui's Starship footer, or no footer rows.",
994
+ description:
995
+ "Native leaves Pi or a predecessor unowned; Starship installs Zentui; Hidden keeps only allowed extension statuses.",
843
996
  currentValue: footerStyleLabel(footer.style),
844
997
  values: footerStyleValues,
845
998
  },
@@ -853,10 +1006,18 @@ function buildFooterItems(config: PolishedTuiConfig): SettingItem[] {
853
1006
  currentValue: footer.colorSource,
854
1007
  values: colorSourceValues,
855
1008
  },
1009
+ {
1010
+ id: "footerCodexQuota",
1011
+ label: "Codex quota",
1012
+ description: codexQuotaDescription,
1013
+ currentValue: featureValue(footer.codexQuota),
1014
+ values: featureStateValues,
1015
+ },
856
1016
  {
857
1017
  id: "footerModelLabel",
858
1018
  label: "Footer model label",
859
- description: "Show the model id or display name in the footer.",
1019
+ description:
1020
+ "Choose the label when built-in Model info or a template's $model is shown; this does not enable that segment.",
860
1021
  currentValue: footer.modelLabel,
861
1022
  values: modelLabelValues,
862
1023
  },
@@ -870,14 +1031,16 @@ function buildStarshipFooterStyleItems(config: PolishedTuiConfig): SettingItem[]
870
1031
  {
871
1032
  id: "responsiveFooter",
872
1033
  label: "Responsive footer",
873
- description: "Use the compact template when space is tight.",
1034
+ description:
1035
+ "Reflow the wide layout, then use compactFormat when it cannot fit. An explicit wide format and the compact template choose segments independently of segment toggles.",
874
1036
  currentValue: featureValue(footer.responsive),
875
1037
  values: featureStateValues,
876
1038
  },
877
1039
  {
878
1040
  id: "compactFooterMaxLines",
879
1041
  label: "Compact footer rows",
880
- description: "Maximum compact rows before cropping.",
1042
+ description:
1043
+ "Maximum compactFormat template rows before cropping; does not change template segments.",
881
1044
  currentValue: String(footer.compactMaxLines),
882
1045
  values: compactFooterMaxLineValues,
883
1046
  },
@@ -891,7 +1054,8 @@ function buildStarshipFooterStyleItems(config: PolishedTuiConfig): SettingItem[]
891
1054
  {
892
1055
  id: "separator",
893
1056
  label: "Separator",
894
- description: "Choose the separator between default footer segments.",
1057
+ description:
1058
+ "Choose built-in/layout separators, including extension-status joins. Their width can affect when the layout switches to compact. Does not change $sep (fixed pipe) or literal template separators.",
895
1059
  currentValue: footer.separator,
896
1060
  values: separatorStyleValues,
897
1061
  },
@@ -942,7 +1106,7 @@ function buildSegmentsItems(config: PolishedTuiConfig): SettingItem[] {
942
1106
  return nonGitSegmentKeys.map((key) => ({
943
1107
  id: footerSegmentSettingId(key),
944
1108
  label: footerSegmentSettingLabels[key],
945
- description: footerSegmentSettingDescriptions[key],
1109
+ description: footerSegmentDescription(key),
946
1110
  currentValue: featureValue(segments[key]),
947
1111
  values: featureStateValues,
948
1112
  }));
@@ -958,7 +1122,7 @@ function buildGitItems(config: PolishedTuiConfig): SettingItem[] {
958
1122
  const segment = (key: FooterSegmentSettingId): SettingItem => ({
959
1123
  id: footerSegmentSettingId(key),
960
1124
  label: footerSegmentSettingLabels[key],
961
- description: footerSegmentSettingDescriptions[key],
1125
+ description: footerSegmentDescription(key),
962
1126
  currentValue: featureValue(starship.segments[key]),
963
1127
  values: featureStateValues,
964
1128
  });
@@ -1019,42 +1183,67 @@ function buildExtensionsItems(
1019
1183
  config: PolishedTuiConfig,
1020
1184
  active: ReadonlyMap<string, string>,
1021
1185
  ): SettingItem[] {
1022
- const defaultItem: SettingItem = {
1023
- id: "extensionStatusDefaultPlacement",
1024
- label: "Default placement",
1025
- description: "Placement for active statuses without an override.",
1026
- currentValue: config.components.footer.styles.starship.extensionStatuses.defaultPlacement,
1027
- values: extensionStatusPlacementValues,
1028
- };
1029
- const statuses = [...active.entries()].sort(([a], [b]) => a.localeCompare(b));
1030
- if (!statuses.length)
1031
- return [
1032
- defaultItem,
1033
- {
1034
- id: "noThirdPartyStatuses",
1035
- label: "No active statuses",
1036
- description: "Only statuses currently published through ctx.ui.setStatus().",
1037
- currentValue: "—",
1038
- },
1039
- ];
1186
+ const local = config.components.footer.styles.starship.extensionStatuses;
1187
+ const visibility = config.components.extensionStatuses;
1188
+ const hidden = config.components.footer.style === "hidden";
1189
+ const hiddenPlacement = visibility.hidden;
1190
+ const keys = [
1191
+ ...new Set([
1192
+ ...active.keys(),
1193
+ ...Object.keys(visibility.visibility),
1194
+ ...Object.keys(hiddenPlacement?.placements ?? {}),
1195
+ ...Object.keys(hiddenPlacement?.colorModes ?? {}),
1196
+ ...Object.keys(local.placements),
1197
+ ...Object.keys(local.colorModes),
1198
+ ]),
1199
+ ].sort((a, b) => a.localeCompare(b));
1200
+ const nativeNote =
1201
+ "Native uses Pi's layout; positioning and color are saved for Starship, not applied to Native.";
1202
+ const placementNote = hidden
1203
+ ? "Off hides statuses. Hidden places visible statuses."
1204
+ : config.components.footer.style === "native"
1205
+ ? `Off hides statuses. ${nativeNote}`
1206
+ : "Off hides statuses. Starship positions visible statuses.";
1040
1207
  return [
1041
- defaultItem,
1042
- ...statuses.flatMap(([key, value]) => {
1043
- const sanitized = sanitizeExtensionStatusText(value);
1044
- const description = sanitized ? `Current status: ${sanitized}` : undefined;
1208
+ {
1209
+ id: "extensionStatusDefaultPlacement",
1210
+ label: "Default placement",
1211
+ description: hidden
1212
+ ? "Off hides statuses by default; Hidden places visible statuses."
1213
+ : config.components.footer.style === "native"
1214
+ ? `Off hides statuses by default. ${nativeNote}`
1215
+ : "Off hides statuses by default; Starship places visible statuses.",
1216
+ currentValue: extensionStatusChoiceLabels[extensionStatusDefaultChoice(config)],
1217
+ values: extensionStatusPlacementValues,
1218
+ },
1219
+ ...(!keys.length
1220
+ ? [{ id: "noThirdPartyStatuses", label: "No observed statuses", currentValue: "—" }]
1221
+ : []),
1222
+ ...keys.flatMap((key) => {
1223
+ const sanitized = sanitizeExtensionStatusText(active.get(key) ?? "");
1045
1224
  return [
1046
1225
  {
1047
1226
  id: thirdPartyStatusSettingId(key, "placement"),
1048
1227
  label: `${key} placement`,
1049
- description,
1050
- currentValue: getExtensionStatusPlacement(config, key),
1228
+ description: `${placementNote}${sanitized ? ` Current status: ${sanitized}` : ""}`,
1229
+ currentValue: extensionStatusChoiceLabels[extensionStatusChoice(config, key)],
1051
1230
  values: extensionStatusPlacementValues,
1052
1231
  },
1053
1232
  {
1054
1233
  id: thirdPartyStatusSettingId(key, "colorMode"),
1055
1234
  label: `${key} color`,
1056
- description,
1057
- currentValue: getExtensionStatusColorMode(config, key),
1235
+ description: hidden
1236
+ ? "Original keeps extension styling; Zentui uses the theme's muted color."
1237
+ : config.components.footer.style === "native"
1238
+ ? `Original keeps extension styling in Starship; Zentui uses its palette. ${nativeNote}`
1239
+ : "Original keeps extension styling; Zentui uses Starship's palette.",
1240
+ currentValue: hidden
1241
+ ? getHiddenExtensionStatusColorMode(visibility, key) === "zentui"
1242
+ ? "Zentui"
1243
+ : "Original"
1244
+ : getExtensionStatusColorMode(config, key) === "zentui"
1245
+ ? "Zentui"
1246
+ : "Original",
1058
1247
  values: extensionStatusColorModeValues,
1059
1248
  },
1060
1249
  ];
@@ -1078,9 +1267,6 @@ function buildSectionItems(
1078
1267
  config.components.editor.style === "opencode-copy-friendly"
1079
1268
  ? buildPolishedEditorStyleItems(config)
1080
1269
  : []),
1081
- ...(config.components.editor.style === "accent-rail"
1082
- ? buildAccentRailEditorStyleItems(config)
1083
- : []),
1084
1270
  ...(config.components.editor.style === "minimalist"
1085
1271
  ? buildMinimalistEditorStyleItems(config)
1086
1272
  : []),
@@ -1095,7 +1281,16 @@ function buildSectionItems(
1095
1281
  return [
1096
1282
  ...buildFooterItems(config),
1097
1283
  ...(config.components.footer.style === "starship"
1098
- ? buildStarshipFooterStyleItems(config)
1284
+ ? [
1285
+ ...buildStarshipFooterStyleItems(config),
1286
+ ...footerPages.map((page) => ({
1287
+ id: footerPageSettingId(page),
1288
+ label: sectionLabels[page],
1289
+ description: `Configure Starship Footer ${sectionLabels[page]}; other components are unchanged.`,
1290
+ currentValue: "->",
1291
+ values: ["->"],
1292
+ })),
1293
+ ]
1099
1294
  : []),
1100
1295
  ];
1101
1296
  case "segments":
@@ -1107,49 +1302,106 @@ function buildSectionItems(
1107
1302
  }
1108
1303
  }
1109
1304
 
1110
- function nextSection(section: SettingsSection): SettingsSection {
1305
+ function nextSection(
1306
+ section: SettingsSection,
1307
+ sections: readonly TopLevelSection[] = settingsSections,
1308
+ ): SettingsSection {
1111
1309
  return (
1112
- settingsSections[(settingsSections.indexOf(section) + 1) % settingsSections.length] ??
1113
- "appearance"
1310
+ sections[(sections.indexOf(topLevelSection(section)) + 1) % sections.length] ??
1311
+ sections[0] ??
1312
+ "editor"
1114
1313
  );
1115
1314
  }
1116
- function previousSection(section: SettingsSection): SettingsSection {
1315
+ function previousSection(
1316
+ section: SettingsSection,
1317
+ sections: readonly TopLevelSection[] = settingsSections,
1318
+ ): SettingsSection {
1117
1319
  return (
1118
- settingsSections[
1119
- (settingsSections.indexOf(section) - 1 + settingsSections.length) % settingsSections.length
1120
- ] ?? "appearance"
1320
+ sections[
1321
+ (sections.indexOf(topLevelSection(section)) - 1 + sections.length) % sections.length
1322
+ ] ??
1323
+ sections[0] ??
1324
+ "editor"
1121
1325
  );
1122
1326
  }
1123
1327
  function formatSectionTabs(
1124
1328
  active: SettingsSection,
1125
1329
  theme: ExtensionContext["ui"]["theme"],
1126
1330
  width: number,
1331
+ sections: readonly TopLevelSection[] = settingsSections,
1332
+ skinOnly = false,
1127
1333
  ): string {
1128
- const rendered = settingsSections.map((section) =>
1129
- section === active
1130
- ? theme.bold(sectionLabels[section])
1131
- : safeThemeFg(theme, "muted", sectionLabels[section]),
1334
+ const label = (section: SettingsSection) =>
1335
+ skinOnly && section === "footer" ? "Statusline" : sectionLabels[section];
1336
+ if (isFooterPage(active)) return ` ${theme.bold(`${label("footer")} > ${label(active)}`)}`;
1337
+ const rendered = sections.map((section) =>
1338
+ section === active ? theme.bold(label(section)) : safeThemeFg(theme, "muted", label(section)),
1132
1339
  );
1133
1340
  const full = ` ${rendered.join(safeThemeFg(theme, "muted", " / "))}`;
1134
1341
  if (visibleWidth(full) <= width) return full;
1135
- return ` ${theme.bold(sectionLabels[active])} (${settingsSections.indexOf(active) + 1}/${settingsSections.length})`;
1342
+ return ` ${theme.bold(label(active))} (${sections.indexOf(topLevelSection(active)) + 1}/${sections.length})`;
1136
1343
  }
1137
- function withSectionFooter(lines: string[], theme: ExtensionContext["ui"]["theme"]): string[] {
1138
- const copy = [...lines];
1139
- for (let index = copy.length - 1; index >= 0; index -= 1) {
1140
- if (copy[index]?.includes("Enter/Space")) {
1141
- copy[index] = safeThemeFg(
1142
- theme,
1143
- "muted",
1144
- " Enter/Space to change · Tab/Shift+Tab to switch sections · Esc to close",
1145
- );
1146
- break;
1147
- }
1344
+ function markDormantItems(
1345
+ items: SettingItem[],
1346
+ section: SettingsSection,
1347
+ config: PolishedTuiConfig,
1348
+ ): void {
1349
+ const editor = config.components.editor;
1350
+ const footer = config.components.footer;
1351
+ for (const item of items) {
1352
+ let reason = "";
1353
+ if (section === "editor" && item.id !== "editorEnabled" && !editor.enabled)
1354
+ reason = "Editor disabled";
1355
+ else if (
1356
+ section === "editor" &&
1357
+ editor.style === "accent-rail" &&
1358
+ ["editorModelLabel", "editorBorderColorMode"].includes(item.id)
1359
+ )
1360
+ reason = "other editor styles; Accent Rail has no model label or enclosing border";
1361
+ else if (
1362
+ section === "userMessages" &&
1363
+ item.id !== "userMessagesEnabled" &&
1364
+ !config.components.userMessages.enabled
1365
+ )
1366
+ reason = "User messages disabled";
1367
+ else if (
1368
+ section === "workingLine" &&
1369
+ item.id !== "workingLineEnabled" &&
1370
+ !config.components.workingLine.enabled
1371
+ )
1372
+ reason = "Working line disabled";
1373
+ else if (
1374
+ section === "workingLine" &&
1375
+ config.components.workingLine.textAnimation === "disabled" &&
1376
+ ["workingLineTextSpeed", "workingLineAnimateSpinnerColor"].includes(item.id)
1377
+ )
1378
+ reason = "animated modes; Static ignores color motion";
1379
+ else if (
1380
+ ["footer", "segments", "git"].includes(section) &&
1381
+ item.id !== "footerStyle" &&
1382
+ footer.style !== "starship"
1383
+ )
1384
+ reason = `Starship; current Footer is ${footerStyleLabel(footer.style)}`;
1385
+ else if (item.id === "compactFooterMaxLines" && !footer.styles.starship.responsive)
1386
+ reason = "responsive mode";
1387
+ else if (item.id === "pathDepth" && footer.styles.starship.pathDisplay.mode === "basename")
1388
+ reason = "Full or Repository paths; Basename ignores depth";
1389
+ else if (
1390
+ ["selectorBordersColorSource", "edit-colors:selectorBorders"].includes(item.id) &&
1391
+ !config.components.selectorBorders.enabled
1392
+ )
1393
+ reason = "selector borders disabled";
1394
+ if (reason) item.description = `Saved for ${reason}. Inactive now. ${item.description ?? ""}`;
1148
1395
  }
1149
- return copy;
1150
1396
  }
1151
1397
 
1152
1398
  export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCommandDeps): void {
1399
+ const sections = deps.skinOnly ? skinSections : settingsSections;
1400
+ const scopeWarning =
1401
+ "OMP Zentui skins only Editor, User messages, and Statusline. Working, thinking, selectors, and all-owner migration remain host-owned.";
1402
+ const usage = deps.skinOnly
1403
+ ? "Usage: /zentui [editor|user-messages|statusline|segments|git], /zentui [editor|messages|statusline|viewport-indicators] [enable|disable|toggle], /zentui preset <opencode|opencode-copy-friendly|rail|minimalist>, or /zentui format <template>"
1404
+ : usageText();
1153
1405
  const setEditor = (patch: EditorPatch, ctx: ExtensionContext): ApplyResult =>
1154
1406
  deps.setEditorComponent(patch, ctx);
1155
1407
  const setMessages = (patch: UserMessagesPatch, ctx: ExtensionContext) => {
@@ -1181,14 +1433,35 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1181
1433
 
1182
1434
  pi.registerCommand("zentui", {
1183
1435
  description: "Configure Zentui",
1184
- getArgumentCompletions: argumentCompletions,
1436
+ getArgumentCompletions: (prefix) => argumentCompletions(prefix, deps.skinOnly),
1185
1437
  handler: async (_args, ctx) => {
1186
1438
  const args = typeof _args === "string" ? _args : "";
1187
1439
  const words = args.trim().split(/\s+/);
1440
+ if (deps.skinOnly && args.trim().toLowerCase() === "migrate") {
1441
+ if (ctx.hasUI) ctx.ui.notify(scopeWarning, "warning");
1442
+ return;
1443
+ }
1444
+ if (args.trim().toLowerCase() === "migrate") {
1445
+ await confirmComponentMigration(ctx, deps);
1446
+ return;
1447
+ }
1188
1448
  if (words[0]?.toLowerCase() === "preset") {
1189
1449
  const preset = words.length === 2 ? getComponentPreset(words[1] ?? "") : undefined;
1190
- if (preset) applyPreset(preset.id, ctx);
1191
- else if (ctx.hasUI) ctx.ui.notify(usageText(), "warning");
1450
+ if (
1451
+ preset &&
1452
+ deps.skinOnly &&
1453
+ (Object.keys(preset.components).length !== 3 ||
1454
+ Object.keys(preset.components).some(
1455
+ (owner) => !skinSections.includes(owner as TopLevelSection),
1456
+ ))
1457
+ ) {
1458
+ if (ctx.hasUI)
1459
+ ctx.ui.notify(
1460
+ "This preset changes owners outside OMP's Editor, User messages, and Statusline skin scope.",
1461
+ "warning",
1462
+ );
1463
+ } else if (preset) applyPreset(preset.id, ctx);
1464
+ else if (ctx.hasUI) ctx.ui.notify(usage, "warning");
1192
1465
  return;
1193
1466
  }
1194
1467
  const format = parseFormatCommand(args);
@@ -1199,7 +1472,7 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1199
1472
  if (ctx.hasUI)
1200
1473
  ctx.ui.notify(
1201
1474
  format.value === undefined
1202
- ? "Footer format cleared (using default layout)"
1475
+ ? "Footer wide format cleared (using built-in segments; compactFormat unchanged)"
1203
1476
  : `Footer format: ${format.value}`,
1204
1477
  "info",
1205
1478
  );
@@ -1253,16 +1526,25 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1253
1526
  }
1254
1527
 
1255
1528
  const initialSection = directSection(args);
1529
+ if (
1530
+ deps.skinOnly &&
1531
+ initialSection &&
1532
+ !skinSections.includes(topLevelSection(initialSection))
1533
+ ) {
1534
+ if (ctx.hasUI) ctx.ui.notify(scopeWarning, "warning");
1535
+ return;
1536
+ }
1256
1537
  if (args.trim() && !initialSection) {
1257
- if (ctx.hasUI) ctx.ui.notify(usageText(), "warning");
1538
+ if (ctx.hasUI) ctx.ui.notify(usage, "warning");
1258
1539
  return;
1259
1540
  }
1260
1541
  const mode = (ctx as typeof ctx & { mode?: string }).mode;
1261
1542
  if (!ctx.hasUI || (mode !== undefined && mode !== "tui")) return;
1262
1543
 
1263
- let requestedSection = initialSection ?? "appearance";
1544
+ let requestedSection = initialSection ?? (deps.skinOnly ? "editor" : "appearance");
1264
1545
  let requestedFocusId: string | undefined;
1265
1546
  while (true) {
1547
+ if (!deps.sessionLifecycle.isCurrent()) return;
1266
1548
  try {
1267
1549
  prepareEditorTextForCustomUi(ctx.ui);
1268
1550
  } catch (error) {
@@ -1276,653 +1558,877 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1276
1558
  requestedFocusId = undefined;
1277
1559
  const generation = deps.sessionLifecycle.currentGeneration();
1278
1560
  let pendingPresetEditor = false;
1279
- const outcome = await ctx.ui.custom<SettingsOutcome>((tui, theme, _keybindings, done) => {
1280
- const listTheme = deps.settingsListTheme ?? getSettingsListTheme();
1281
- let activeSection = requestedSection;
1282
- let settingsList: SettingsList;
1283
- let preview: WorkingLineFrames | undefined;
1284
- let previewFrameIndex = 0;
1285
- let cancelPreview = () => {};
1286
- const stopPreview = (reset = true) => {
1287
- cancelPreview();
1288
- cancelPreview = () => {};
1289
- if (reset) {
1290
- preview = undefined;
1291
- previewFrameIndex = 0;
1292
- }
1293
- };
1294
- const startPreview = () => {
1295
- const previous = preview;
1296
- const previousState = previous?.frameStates[previewFrameIndex];
1297
- stopPreview(false);
1298
- if (activeSection !== "workingLine") return;
1299
- try {
1300
- const config = deps.getConfig();
1301
- const spinnerTick = previousState?.spinnerTick ?? 0;
1302
- let textTick = previousState?.textTick ?? 0;
1303
- let generated = buildWorkingLinePreviewFrames(
1304
- config.components.workingLine,
1305
- config.colors,
1306
- theme,
1307
- spinnerTick,
1308
- textTick,
1309
- );
1310
- if (previous && previousState) {
1311
- textTick = remapWorkingLineTextTick(
1312
- previous.textAnimation,
1313
- previous.textWidth,
1314
- previousState.textTick,
1315
- generated.textAnimation,
1316
- generated.textWidth,
1317
- previous.textOrigin,
1318
- generated.textOrigin,
1319
- );
1320
- generated = buildWorkingLinePreviewFrames(
1561
+ let outcome: SettingsOutcome | undefined;
1562
+ try {
1563
+ outcome = await ctx.ui.custom<SettingsOutcome>((tui, theme, keybindings, done) => {
1564
+ const keys = settingsKeys(keybindings);
1565
+ let selectedIndex = 0;
1566
+ let currentItems: SettingItem[] = [];
1567
+ let listVisible = 8;
1568
+ const listTheme = deps.settingsListTheme ?? getSettingsListTheme();
1569
+ let activeSection = requestedSection;
1570
+ let settingsList: SettingsList;
1571
+ let activateSelectedSetting = () => {};
1572
+ let preview: WorkingLineFrames | undefined;
1573
+ let previewFrameIndex = 0;
1574
+ let cancelPreview = () => {};
1575
+ const stopPreview = (reset = true) => {
1576
+ cancelPreview();
1577
+ cancelPreview = () => {};
1578
+ if (reset) {
1579
+ preview = undefined;
1580
+ previewFrameIndex = 0;
1581
+ }
1582
+ };
1583
+ const startPreview = () => {
1584
+ const previous = preview;
1585
+ const previousState = previous?.frameStates[previewFrameIndex];
1586
+ stopPreview(false);
1587
+ if (activeSection !== "workingLine") return;
1588
+ try {
1589
+ const config = deps.getConfig();
1590
+ const spinnerTick = previousState?.spinnerTick ?? 0;
1591
+ let textTick = previousState?.textTick ?? 0;
1592
+ let generated = buildWorkingLinePreviewFrames(
1321
1593
  config.components.workingLine,
1322
1594
  config.colors,
1323
1595
  theme,
1324
1596
  spinnerTick,
1325
1597
  textTick,
1326
1598
  );
1599
+ if (previous && previousState) {
1600
+ textTick = remapWorkingLineTextTick(
1601
+ previous.textAnimation,
1602
+ previous.textWidth,
1603
+ previousState.textTick,
1604
+ generated.textAnimation,
1605
+ generated.textWidth,
1606
+ previous.textOrigin,
1607
+ generated.textOrigin,
1608
+ );
1609
+ generated = buildWorkingLinePreviewFrames(
1610
+ config.components.workingLine,
1611
+ config.colors,
1612
+ theme,
1613
+ spinnerTick,
1614
+ textTick,
1615
+ );
1616
+ }
1617
+ preview = generated;
1618
+ previewFrameIndex = 0;
1619
+ const advance = () => {
1620
+ if (activeSection !== "workingLine" || !preview || preview.frames.length === 0)
1621
+ return;
1622
+ previewFrameIndex = (previewFrameIndex + 1) % preview.frames.length;
1623
+ tui.requestRender();
1624
+ cancelPreview = deps.sessionLifecycle.defer(advance, preview.intervalMs);
1625
+ };
1626
+ cancelPreview = deps.sessionLifecycle.defer(advance, generated.intervalMs);
1627
+ } catch {
1628
+ stopPreview();
1327
1629
  }
1328
- preview = generated;
1329
- previewFrameIndex = 0;
1330
- const advance = () => {
1331
- if (activeSection !== "workingLine" || !preview || preview.frames.length === 0)
1332
- return;
1333
- previewFrameIndex = (previewFrameIndex + 1) % preview.frames.length;
1334
- tui.requestRender();
1335
- cancelPreview = deps.sessionLifecycle.defer(advance, preview.intervalMs);
1336
- };
1337
- cancelPreview = deps.sessionLifecycle.defer(advance, generated.intervalMs);
1338
- } catch {
1630
+ };
1631
+ const finishSettings = (result: SettingsOutcome) => {
1339
1632
  stopPreview();
1340
- }
1341
- };
1342
- const finishSettings = (result: SettingsOutcome) => {
1343
- stopPreview();
1344
- done(result);
1345
- };
1346
- const notifyChange = (label: string, value: string, result?: ApplyResult) => {
1347
- deps.requestRender();
1348
- const detail = result?.reason?.trim();
1349
- ctx.ui.notify(
1350
- `${label}: ${value}${detail ? ` (${detail})` : result && !result.applied ? " (reload Pi to apply this change)" : ""}`,
1351
- result && (!result.applied || detail) ? "warning" : "info",
1352
- );
1353
- startPreview();
1354
- tui.requestRender();
1355
- };
1356
- const notifyWorkingLineChange = (
1357
- label: string,
1358
- value: string,
1359
- result: ApplyResult,
1360
- previewChanged = true,
1361
- ) => {
1362
- ctx.ui.notify(
1363
- `${label}: ${value}${result.applied ? "" : ` (${result.reason ?? "reload Pi to apply this change"})`}`,
1364
- "info",
1365
- );
1366
- if (previewChanged) startPreview();
1367
- tui.requestRender();
1368
- };
1369
- const makeSettingsList = (focusId?: string): SettingsList => {
1370
- const items = buildSectionItems(
1371
- activeSection,
1372
- deps.getConfig(),
1373
- deps.getActiveExtensionStatuses(),
1374
- deps.thinkingStepsCapability,
1375
- );
1376
- const list = new SettingsList(
1377
- items,
1378
- 8,
1379
- listTheme,
1380
- (id, newValue) => {
1381
- try {
1382
- if (id === "preset") {
1383
- const preset = componentPresets.find(({ label }) => label === newValue);
1384
- if (!preset) return;
1633
+ done(result);
1634
+ };
1635
+ const notifyChange = (label: string, value: string, result?: ApplyResult) => {
1636
+ if (
1637
+ ["User messages", "Selector borders", "Responsive footer", "Path display"].includes(
1638
+ label,
1639
+ )
1640
+ )
1641
+ settingsList = makeSettingsList(currentItems[selectedIndex]?.id);
1642
+ deps.requestRender();
1643
+ const detail = result?.reason?.trim();
1644
+ ctx.ui.notify(
1645
+ `${label}: ${value}${detail ? ` (${detail})` : result && !result.applied ? " (reload Pi to apply this change)" : ""}`,
1646
+ result && (!result.applied || detail) ? "warning" : "info",
1647
+ );
1648
+ startPreview();
1649
+ tui.requestRender();
1650
+ };
1651
+ const notifyWorkingLineChange = (
1652
+ label: string,
1653
+ value: string,
1654
+ result: ApplyResult,
1655
+ previewChanged = true,
1656
+ ) => {
1657
+ if (label === "Working line" || label === "Text animation")
1658
+ settingsList = makeSettingsList(currentItems[selectedIndex]?.id);
1659
+ ctx.ui.notify(
1660
+ `${label}: ${value}${result.applied ? "" : ` (${result.reason ?? "reload Pi to apply this change"})`}`,
1661
+ "info",
1662
+ );
1663
+ if (previewChanged) startPreview();
1664
+ tui.requestRender();
1665
+ };
1666
+ const backOrClose = () => {
1667
+ if (isFooterPage(activeSection) && deps.sessionLifecycle.isCurrent(generation)) {
1668
+ const focusId = footerPageSettingId(activeSection);
1669
+ activeSection = "footer";
1670
+ settingsList = makeSettingsList(focusId);
1671
+ tui.requestRender();
1672
+ } else finishSettings("close");
1673
+ };
1674
+ const makeSettingsList = (focusId?: string): SettingsList => {
1675
+ if (
1676
+ isFooterPage(activeSection) &&
1677
+ deps.getConfig().components.footer.style !== "starship"
1678
+ ) {
1679
+ ctx.ui.notify(
1680
+ `Footer > ${sectionLabels[activeSection]} requires Starship. Current Footer is ${footerStyleLabel(deps.getConfig().components.footer.style)}; saved settings are unchanged.`,
1681
+ "info",
1682
+ );
1683
+ activeSection = "footer";
1684
+ focusId = "footerStyle";
1685
+ }
1686
+ const items = buildSectionItems(
1687
+ activeSection,
1688
+ deps.getConfig(),
1689
+ deps.getActiveExtensionStatuses(),
1690
+ deps.thinkingStepsCapability,
1691
+ );
1692
+ if (deps.skinOnly && activeSection === "footer") {
1693
+ for (const item of items) {
1694
+ item.label = item.label.replaceAll("Footer", "Statusline");
1695
+ item.description = item.description?.replaceAll("Pi", "OMP");
1696
+ }
1697
+ }
1698
+ const colorOwner =
1699
+ activeSection === "appearance"
1700
+ ? "selectorBorders"
1701
+ : activeSection === "editor" ||
1702
+ activeSection === "userMessages" ||
1703
+ activeSection === "workingLine" ||
1704
+ activeSection === "footer"
1705
+ ? activeSection
1706
+ : undefined;
1707
+ if (colorOwner)
1708
+ items.push({
1709
+ id: `edit-colors:${colorOwner}`,
1710
+ label: "Color overrides",
1711
+ description:
1712
+ "Edit only this component's raw styles. Roles unused by the selected style stay saved for other styles; Static Working line uses mid with optional Token rate override; Classic/KITT animate every segment; Turn summaries use high. Reset resumes inheritance; empty means unstyled.",
1713
+ currentValue: "Edit…",
1714
+ values: ["Edit…"],
1715
+ });
1716
+ if (
1717
+ activeSection === "editor" ||
1718
+ (activeSection === "footer" &&
1719
+ deps.getConfig().components.footer.style === "starship")
1720
+ )
1721
+ items.push({
1722
+ id: `edit-custom-value-colors:${activeSection}`,
1723
+ label: "Individual custom value colors",
1724
+ description:
1725
+ "Style one publisher key across aliases in this owner. Original/Zentui remains the fallback; Reset inherits, empty is unstyled.",
1726
+ currentValue: "Edit…",
1727
+ values: ["Edit…"],
1728
+ });
1729
+ if (activeSection === "appearance")
1730
+ items.push({
1731
+ id: "migrate",
1732
+ label: "Migrate component selections",
1733
+ description:
1734
+ "Explicit, confirmed snapshot of all current selections. Shared color fallbacks remain active.",
1735
+ currentValue: "Confirm…",
1736
+ values: ["Confirm…"],
1737
+ });
1738
+ markDormantItems(items, activeSection, deps.getConfig());
1739
+ currentItems = items;
1740
+ selectedIndex = Math.max(
1741
+ 0,
1742
+ items.findIndex((item) => item.id === focusId),
1743
+ );
1744
+ const actions = {
1745
+ change(id: string, newValue: string) {
1746
+ try {
1385
1747
  if (!deps.sessionLifecycle.isCurrent(generation)) return;
1386
- const result = deps.applyPreset(preset.id, ctx, { deferEditor: true });
1387
- pendingPresetEditor = true;
1388
- settingsList = makeSettingsList("preset");
1389
- notifyChange("Preset saved", preset.label, result);
1390
- return;
1391
- }
1392
- const enabled = isFeatureState(newValue) ? newValue === "enabled" : undefined;
1393
- if (id === "editorEnabled" && enabled !== undefined) {
1394
- if (pendingPresetEditor) {
1395
- const result = deps.setEditorComponent({ enabled }, ctx, {
1396
- deferEditor: true,
1397
- });
1398
- notifyChange("Editor", newValue, result);
1748
+ const footerPage = footerPages.find((page) => footerPageSettingId(page) === id);
1749
+ if (footerPage) {
1750
+ activeSection = footerPage;
1751
+ settingsList = makeSettingsList();
1752
+ tui.requestRender();
1753
+ return;
1754
+ }
1755
+ if (
1756
+ isFooterPage(activeSection) &&
1757
+ deps.getConfig().components.footer.style !== "starship"
1758
+ ) {
1759
+ settingsList = makeSettingsList();
1760
+ tui.requestRender();
1761
+ return;
1762
+ }
1763
+ if (
1764
+ id === "migrate" ||
1765
+ id.startsWith("edit-colors:") ||
1766
+ id.startsWith("edit-custom-value-colors:") ||
1767
+ id === "edit-minimalist-templates" ||
1768
+ id === "edit-minimalist-variables"
1769
+ ) {
1770
+ requestedSection = activeSection;
1771
+ requestedFocusId = id;
1772
+ finishSettings(id as SettingsOutcome);
1773
+ return;
1774
+ }
1775
+ if (id === "preset") {
1776
+ const preset = componentPresets.find(({ label }) => label === newValue);
1777
+ if (!preset) return;
1778
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1779
+ const result = deps.applyPreset(preset.id, ctx, { deferEditor: true });
1780
+ pendingPresetEditor = true;
1781
+ settingsList = makeSettingsList("preset");
1782
+ notifyChange("Preset saved", preset.label, result);
1783
+ return;
1784
+ }
1785
+ const enabled = isFeatureState(newValue) ? newValue === "enabled" : undefined;
1786
+ if (
1787
+ (id === "editorCodexQuota" || id === "footerCodexQuota") &&
1788
+ enabled !== undefined
1789
+ ) {
1790
+ if (id === "editorCodexQuota") setEditor({ codexQuota: enabled }, ctx);
1791
+ else setFooter({ codexQuota: enabled }, ctx);
1792
+ settingsList.updateValue(id, newValue);
1793
+ notifyChange("Codex quota", newValue);
1794
+ return;
1795
+ }
1796
+ if (id === "editorEnabled" && enabled !== undefined) {
1797
+ if (pendingPresetEditor) {
1798
+ const result = deps.setEditorComponent({ enabled }, ctx, {
1799
+ deferEditor: true,
1800
+ });
1801
+ notifyChange("Editor", newValue, result);
1802
+ finishSettings("close");
1803
+ return;
1804
+ }
1399
1805
  finishSettings("close");
1806
+ deps.sessionLifecycle.defer(() => {
1807
+ try {
1808
+ const result = setEditor({ enabled }, ctx);
1809
+ deps.requestRender();
1810
+ ctx.ui.notify(
1811
+ `Editor: ${newValue}${result.applied ? "" : ` (${result.reason ?? "reload Pi to apply this change"})`}`,
1812
+ "info",
1813
+ );
1814
+ } catch (error) {
1815
+ ctx.ui.notify(
1816
+ `Could not update Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
1817
+ "error",
1818
+ );
1819
+ }
1820
+ });
1821
+ return;
1822
+ }
1823
+ const selectedEditorStyle =
1824
+ id === "editorStyle" ? editorStyleId(newValue) : undefined;
1825
+ if (selectedEditorStyle) {
1826
+ setEditor({ style: selectedEditorStyle }, ctx);
1827
+ settingsList = makeSettingsList("editorStyle");
1828
+ notifyChange("Editor style", newValue);
1400
1829
  return;
1401
1830
  }
1402
- finishSettings("close");
1403
- deps.sessionLifecycle.defer(() => {
1404
- try {
1405
- const result = setEditor({ enabled }, ctx);
1406
- deps.requestRender();
1407
- ctx.ui.notify(
1408
- `Editor: ${newValue}${result.applied ? "" : ` (${result.reason ?? "reload Pi to apply this change"})`}`,
1409
- "info",
1831
+ if (id === "editorColorSource" && isColorSource(newValue)) {
1832
+ setEditor({ colorSource: newValue }, ctx);
1833
+ settingsList.updateValue(id, newValue);
1834
+ notifyChange("Editor colors", newValue);
1835
+ return;
1836
+ }
1837
+ if (id === "editorModelLabel" && (newValue === "id" || newValue === "name")) {
1838
+ setEditor({ modelLabel: newValue }, ctx);
1839
+ settingsList.updateValue(id, newValue);
1840
+ notifyChange("Editor model label", newValue);
1841
+ return;
1842
+ }
1843
+ if (
1844
+ id === "editorBorderColorMode" &&
1845
+ (newValue === "static" || newValue === "adaptive")
1846
+ ) {
1847
+ setEditor({ borderColorMode: newValue }, ctx);
1848
+ settingsList.updateValue(id, newValue);
1849
+ notifyChange("Editor border color", newValue);
1850
+ return;
1851
+ }
1852
+ if (id === "editorViewportIndicators" && enabled !== undefined) {
1853
+ setEditor({ viewportIndicators: enabled }, ctx);
1854
+ settingsList.updateValue(id, newValue);
1855
+ notifyChange("Editor viewport indicators", newValue);
1856
+ return;
1857
+ }
1858
+ if (
1859
+ id === "opencodeCompletionMenu" &&
1860
+ (newValue === "native" || newValue === "palette")
1861
+ ) {
1862
+ const style = deps.getConfig().components.editor.style;
1863
+ if (style === "opencode") deps.setPolished({ completionMenu: newValue }, ctx);
1864
+ else if (style === "opencode-copy-friendly")
1865
+ deps.setPolishedCopyFriendly({ completionMenu: newValue }, ctx);
1866
+ else return;
1867
+ settingsList.updateValue(id, newValue);
1868
+ notifyChange("Completion menu", newValue);
1869
+ return;
1870
+ }
1871
+ if (
1872
+ id === "accentRailSurface" &&
1873
+ (newValue === "filled" || newValue === "transparent")
1874
+ ) {
1875
+ deps.setAccentRail({ transparent: newValue === "transparent" }, ctx);
1876
+ settingsList.updateValue(id, newValue);
1877
+ notifyChange("Editor background", newValue);
1878
+ return;
1879
+ }
1880
+ if (id.startsWith("minimalist")) {
1881
+ if (
1882
+ id === "minimalistExtensionColorMode" &&
1883
+ (newValue === "Original" || newValue === "Zentui")
1884
+ )
1885
+ deps.setMinimalist(
1886
+ { extensionColorMode: newValue === "Original" ? null : "zentui" },
1887
+ ctx,
1410
1888
  );
1411
- } catch (error) {
1412
- ctx.ui.notify(
1413
- `Could not update Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
1414
- "error",
1889
+ else if (
1890
+ id === "minimalistPathDisplay" &&
1891
+ ["compact", "project", "full"].includes(newValue)
1892
+ )
1893
+ deps.setMinimalist(
1894
+ { pathDisplay: newValue as MinimalistConfig["pathDisplay"] },
1895
+ ctx,
1415
1896
  );
1897
+ else if (
1898
+ id === "minimalistContextFormat" &&
1899
+ ["percent", "percent-total"].includes(newValue)
1900
+ )
1901
+ deps.setMinimalist(
1902
+ { contextFormat: newValue as MinimalistConfig["contextFormat"] },
1903
+ ctx,
1904
+ );
1905
+ else if (
1906
+ id === "minimalistSeparator" &&
1907
+ (newValue === "dash" || newValue === "dot")
1908
+ )
1909
+ deps.setMinimalist(
1910
+ { separator: newValue as MinimalistEditorSeparator },
1911
+ ctx,
1912
+ );
1913
+ else if (enabled !== undefined) {
1914
+ const key =
1915
+ id === "minimalistContextGauge"
1916
+ ? "contextGauge"
1917
+ : id === "minimalistShowSessionName"
1918
+ ? "showSessionName"
1919
+ : id === "minimalistShowTimer"
1920
+ ? "showTimer"
1921
+ : id === "minimalistShowCost"
1922
+ ? "showCost"
1923
+ : id === "minimalistShowCacheHit"
1924
+ ? "showCacheHit"
1925
+ : id === "minimalistShowGit"
1926
+ ? "showGit"
1927
+ : undefined;
1928
+ if (!key) return;
1929
+ deps.setMinimalist({ [key]: enabled }, ctx);
1930
+ } else return;
1931
+ settingsList.updateValue(id, newValue);
1932
+ notifyChange(id, newValue);
1933
+ return;
1934
+ }
1935
+
1936
+ if (id === "userMessagesEnabled" && enabled !== undefined) {
1937
+ setMessages({ enabled }, ctx);
1938
+ settingsList.updateValue(id, newValue);
1939
+ notifyChange("User messages", newValue);
1940
+ return;
1941
+ }
1942
+ const selectedMessageStyle =
1943
+ id === "userMessagesStyle" ? userMessageStyleId(newValue) : undefined;
1944
+ if (selectedMessageStyle) {
1945
+ setMessages({ style: selectedMessageStyle }, ctx);
1946
+ settingsList = makeSettingsList("userMessagesStyle");
1947
+ notifyChange("Message style", newValue);
1948
+ return;
1949
+ }
1950
+ if (id === "userMessagesColorSource" && isColorSource(newValue)) {
1951
+ setMessages({ colorSource: newValue }, ctx);
1952
+ settingsList.updateValue(id, newValue);
1953
+ notifyChange("Message colors", newValue);
1954
+ return;
1955
+ }
1956
+ if (id === "thinkingStepsEnabled" && enabled !== undefined) {
1957
+ const result = deps.setThinkingStepsComponent({ enabled }, ctx);
1958
+ settingsList = makeSettingsList("thinkingStepsEnabled");
1959
+ notifyChange("Thinking (Experimental)", newValue, result);
1960
+ return;
1961
+ }
1962
+ const selectedThinkingStepsMode =
1963
+ id === "thinkingStepsMode" ? thinkingStepsModeId(newValue) : undefined;
1964
+ if (selectedThinkingStepsMode) {
1965
+ const result = deps.setThinkingStepsComponent(
1966
+ { mode: selectedThinkingStepsMode },
1967
+ ctx,
1968
+ );
1969
+ settingsList = makeSettingsList("thinkingStepsMode");
1970
+ notifyChange("Thinking (Experimental)", newValue, result);
1971
+ return;
1972
+ }
1973
+ if (id === "workingLineEnabled" && enabled !== undefined) {
1974
+ const result = deps.setWorkingLineComponent({ enabled }, ctx);
1975
+ settingsList.updateValue(id, newValue);
1976
+ notifyWorkingLineChange("Working line", newValue, result);
1977
+ return;
1978
+ }
1979
+ if (id === "workingLineTurnSummary" && enabled !== undefined) {
1980
+ const result = deps.setWorkingLineComponent({ turnSummary: enabled }, ctx);
1981
+ settingsList.updateValue(id, newValue);
1982
+ notifyWorkingLineChange("Turn summary", newValue, result, false);
1983
+ return;
1984
+ }
1985
+ if (id === "workingLinePlacement") {
1986
+ const editor = deps.getConfig().components.editor;
1987
+ if (!editor.enabled || editor.style === "accent-rail") return;
1988
+ const placement = (
1989
+ Object.entries(workingLinePlacementLabels) as Array<
1990
+ [WorkingLinePlacement, string]
1991
+ >
1992
+ ).find(([, label]) => label === newValue)?.[0];
1993
+ if (placement) {
1994
+ const result = deps.setWorkingLineComponent({ placement }, ctx);
1995
+ settingsList.updateValue(id, newValue);
1996
+ notifyWorkingLineChange("Placement", newValue, result);
1997
+ return;
1416
1998
  }
1417
- });
1418
- return;
1419
- }
1420
- const selectedEditorStyle =
1421
- id === "editorStyle" ? editorStyleId(newValue) : undefined;
1422
- if (selectedEditorStyle) {
1423
- setEditor({ style: selectedEditorStyle }, ctx);
1424
- settingsList = makeSettingsList("editorStyle");
1425
- notifyChange("Editor style", newValue);
1426
- return;
1427
- }
1428
- if (id === "editorColorSource" && isColorSource(newValue)) {
1429
- setEditor({ colorSource: newValue }, ctx);
1430
- settingsList.updateValue(id, newValue);
1431
- notifyChange("Editor colors", newValue);
1432
- return;
1433
- }
1434
- if (id === "editorModelLabel" && (newValue === "id" || newValue === "name")) {
1435
- setEditor({ modelLabel: newValue }, ctx);
1436
- settingsList.updateValue(id, newValue);
1437
- notifyChange("Editor model label", newValue);
1438
- return;
1439
- }
1440
- if (
1441
- id === "editorBorderColorMode" &&
1442
- (newValue === "static" || newValue === "adaptive")
1443
- ) {
1444
- setEditor({ borderColorMode: newValue }, ctx);
1445
- settingsList.updateValue(id, newValue);
1446
- notifyChange("Editor border color", newValue);
1447
- return;
1448
- }
1449
- if (id === "editorViewportIndicators" && enabled !== undefined) {
1450
- setEditor({ viewportIndicators: enabled }, ctx);
1451
- settingsList.updateValue(id, newValue);
1452
- notifyChange("Editor viewport indicators", newValue);
1453
- return;
1454
- }
1455
- if (
1456
- id === "opencodeCompletionMenu" &&
1457
- (newValue === "native" || newValue === "palette")
1458
- ) {
1459
- const style = deps.getConfig().components.editor.style;
1460
- if (style === "opencode") deps.setPolished({ completionMenu: newValue }, ctx);
1461
- else if (style === "opencode-copy-friendly")
1462
- deps.setPolishedCopyFriendly({ completionMenu: newValue }, ctx);
1463
- else return;
1464
- settingsList.updateValue(id, newValue);
1465
- notifyChange("Completion menu", newValue);
1466
- return;
1467
- }
1468
- if (
1469
- id === "accentRailSurface" &&
1470
- (newValue === "filled" || newValue === "transparent")
1471
- ) {
1472
- deps.setAccentRail({ transparent: newValue === "transparent" }, ctx);
1473
- settingsList.updateValue(id, newValue);
1474
- notifyChange("Accent Rail surface", newValue);
1475
- return;
1476
- }
1477
- if (id.startsWith("minimalist")) {
1478
- if (
1479
- id === "minimalistPathDisplay" &&
1480
- ["compact", "project", "full"].includes(newValue)
1481
- )
1482
- deps.setMinimalist(
1483
- { pathDisplay: newValue as MinimalistConfig["pathDisplay"] },
1999
+ }
2000
+ const selectedWorkingLineSpinner =
2001
+ id === "workingLineSpinner" ? workingLineSpinnerId(newValue) : undefined;
2002
+ if (selectedWorkingLineSpinner) {
2003
+ const result = deps.setWorkingLineComponent(
2004
+ { spinner: selectedWorkingLineSpinner },
1484
2005
  ctx,
1485
2006
  );
1486
- else if (
1487
- id === "minimalistContextFormat" &&
1488
- ["percent", "percent-total"].includes(newValue)
1489
- )
1490
- deps.setMinimalist(
1491
- { contextFormat: newValue as MinimalistConfig["contextFormat"] },
2007
+ settingsList.updateValue(id, newValue);
2008
+ notifyWorkingLineChange("Spinner", newValue, result);
2009
+ return;
2010
+ }
2011
+ if (id === "workingLineSpinnerSpeed" || id === "workingLineTextSpeed") {
2012
+ const spinnerSpeed = id === "workingLineSpinnerSpeed";
2013
+ if (newValue === "Custom…") {
2014
+ finishSettings(
2015
+ spinnerSpeed
2016
+ ? "edit-working-line-spinner-speed"
2017
+ : "edit-working-line-text-speed",
2018
+ );
2019
+ return;
2020
+ }
2021
+ const presets = spinnerSpeed
2022
+ ? workingLineSpinnerSpeedPresets
2023
+ : workingLineTextSpeedPresets;
2024
+ const intervalMs = presets.find(
2025
+ (preset) => preset.label === newValue,
2026
+ )?.intervalMs;
2027
+ if (intervalMs !== undefined) {
2028
+ const result = deps.setWorkingLineComponent(
2029
+ spinnerSpeed
2030
+ ? { spinnerIntervalMs: intervalMs }
2031
+ : { textIntervalMs: intervalMs },
2032
+ ctx,
2033
+ );
2034
+ settingsList.updateValue(id, newValue);
2035
+ notifyWorkingLineChange(
2036
+ spinnerSpeed ? "Spinner speed" : "Text motion speed",
2037
+ `${intervalMs} ms`,
2038
+ result,
2039
+ );
2040
+ }
2041
+ return;
2042
+ }
2043
+ if (
2044
+ id === "workingLineTextAnimation" &&
2045
+ workingLineTextAnimationValues.includes(newValue as WorkingLineTextAnimation)
2046
+ ) {
2047
+ const result = deps.setWorkingLineComponent(
2048
+ { textAnimation: newValue as WorkingLineTextAnimation },
1492
2049
  ctx,
1493
2050
  );
1494
- else if (enabled !== undefined) {
1495
- const key =
1496
- id === "minimalistContextGauge"
1497
- ? "contextGauge"
1498
- : id === "minimalistShowSessionName"
1499
- ? "showSessionName"
1500
- : id === "minimalistShowTimer"
1501
- ? "showTimer"
1502
- : id === "minimalistShowCost"
1503
- ? "showCost"
1504
- : id === "minimalistShowGit"
1505
- ? "showGit"
1506
- : undefined;
1507
- if (!key) return;
1508
- deps.setMinimalist({ [key]: enabled }, ctx);
1509
- } else return;
1510
- settingsList.updateValue(id, newValue);
1511
- notifyChange(id, newValue);
1512
- return;
1513
- }
1514
-
1515
- if (id === "userMessagesEnabled" && enabled !== undefined) {
1516
- setMessages({ enabled }, ctx);
1517
- settingsList.updateValue(id, newValue);
1518
- notifyChange("User messages", newValue);
1519
- return;
1520
- }
1521
- const selectedMessageStyle =
1522
- id === "userMessagesStyle" ? userMessageStyleId(newValue) : undefined;
1523
- if (selectedMessageStyle) {
1524
- setMessages({ style: selectedMessageStyle }, ctx);
1525
- settingsList = makeSettingsList("userMessagesStyle");
1526
- notifyChange("Message style", newValue);
1527
- return;
1528
- }
1529
- if (id === "userMessagesColorSource" && isColorSource(newValue)) {
1530
- setMessages({ colorSource: newValue }, ctx);
1531
- settingsList.updateValue(id, newValue);
1532
- notifyChange("Message colors", newValue);
1533
- return;
1534
- }
1535
- if (id === "thinkingStepsEnabled" && enabled !== undefined) {
1536
- const result = deps.setThinkingStepsComponent({ enabled }, ctx);
1537
- settingsList = makeSettingsList("thinkingStepsEnabled");
1538
- notifyChange("Thinking (Experimental)", newValue, result);
1539
- return;
1540
- }
1541
- const selectedThinkingStepsMode =
1542
- id === "thinkingStepsMode" ? thinkingStepsModeId(newValue) : undefined;
1543
- if (selectedThinkingStepsMode) {
1544
- const result = deps.setThinkingStepsComponent(
1545
- { mode: selectedThinkingStepsMode },
1546
- ctx,
1547
- );
1548
- settingsList = makeSettingsList("thinkingStepsMode");
1549
- notifyChange("Thinking (Experimental)", newValue, result);
1550
- return;
1551
- }
1552
- if (id === "workingLineEnabled" && enabled !== undefined) {
1553
- const result = deps.setWorkingLineComponent({ enabled }, ctx);
1554
- settingsList.updateValue(id, newValue);
1555
- notifyWorkingLineChange("Working line", newValue, result);
1556
- return;
1557
- }
1558
- if (id === "workingLineTurnSummary" && enabled !== undefined) {
1559
- const result = deps.setWorkingLineComponent({ turnSummary: enabled }, ctx);
1560
- settingsList.updateValue(id, newValue);
1561
- notifyWorkingLineChange("Turn summary", newValue, result, false);
1562
- return;
1563
- }
1564
- const selectedWorkingLineSpinner =
1565
- id === "workingLineSpinner" ? workingLineSpinnerId(newValue) : undefined;
1566
- if (selectedWorkingLineSpinner) {
1567
- const result = deps.setWorkingLineComponent(
1568
- { spinner: selectedWorkingLineSpinner },
1569
- ctx,
1570
- );
1571
- settingsList.updateValue(id, newValue);
1572
- notifyWorkingLineChange("Spinner", newValue, result);
1573
- return;
1574
- }
1575
- if (id === "workingLineSpinnerSpeed" || id === "workingLineTextSpeed") {
1576
- const spinnerSpeed = id === "workingLineSpinnerSpeed";
1577
- if (newValue === "Custom…") {
1578
- finishSettings(
1579
- spinnerSpeed
1580
- ? "edit-working-line-spinner-speed"
1581
- : "edit-working-line-text-speed",
2051
+ settingsList.updateValue(id, newValue);
2052
+ notifyWorkingLineChange("Text animation", newValue, result);
2053
+ return;
2054
+ }
2055
+ if (id === "workingLineColorSource" && isColorSource(newValue)) {
2056
+ const result = deps.setWorkingLineComponent({ colorSource: newValue }, ctx);
2057
+ settingsList.updateValue(id, newValue);
2058
+ notifyWorkingLineChange("Color source", newValue, result);
2059
+ return;
2060
+ }
2061
+ if (id === "workingLineAnimateSpinnerColor" && enabled !== undefined) {
2062
+ const result = deps.setWorkingLineComponent(
2063
+ { animateSpinnerColor: enabled },
2064
+ ctx,
1582
2065
  );
2066
+ settingsList.updateValue(id, newValue);
2067
+ notifyWorkingLineChange("Animate spinner color", newValue, result);
1583
2068
  return;
1584
2069
  }
1585
- const presets = spinnerSpeed
1586
- ? workingLineSpinnerSpeedPresets
1587
- : workingLineTextSpeedPresets;
1588
- const intervalMs = presets.find(
1589
- (preset) => preset.label === newValue,
1590
- )?.intervalMs;
1591
- if (intervalMs !== undefined) {
2070
+ if (id === "workingLineCustomMessages" && enabled !== undefined) {
1592
2071
  const result = deps.setWorkingLineComponent(
1593
- spinnerSpeed
1594
- ? { spinnerIntervalMs: intervalMs }
1595
- : { textIntervalMs: intervalMs },
2072
+ { messages: { custom: enabled } },
1596
2073
  ctx,
1597
2074
  );
1598
2075
  settingsList.updateValue(id, newValue);
1599
- notifyWorkingLineChange(
1600
- spinnerSpeed ? "Spinner speed" : "Text motion speed",
1601
- `${intervalMs} ms`,
1602
- result,
2076
+ notifyWorkingLineChange("Custom messages", newValue, result);
2077
+ return;
2078
+ }
2079
+ if (
2080
+ (id === "workingLineTool" ||
2081
+ id === "workingLineElapsed" ||
2082
+ id === "workingLineThought" ||
2083
+ id === "workingLineTokens" ||
2084
+ id === "workingLineTokenRate") &&
2085
+ enabled !== undefined
2086
+ ) {
2087
+ const key =
2088
+ id === "workingLineTool"
2089
+ ? "tool"
2090
+ : id === "workingLineElapsed"
2091
+ ? "elapsed"
2092
+ : id === "workingLineThought"
2093
+ ? "thought"
2094
+ : id === "workingLineTokenRate"
2095
+ ? "tokenRate"
2096
+ : "tokens";
2097
+ const result = deps.setWorkingLineComponent(
2098
+ { segments: { [key]: enabled } },
2099
+ ctx,
1603
2100
  );
2101
+ settingsList.updateValue(id, newValue);
2102
+ notifyWorkingLineChange(id.slice("workingLine".length), newValue, result);
2103
+ return;
2104
+ }
2105
+ if (id === "workingLineTurnSummaryFormat") {
2106
+ finishSettings("edit-turn-summary-format");
2107
+ return;
2108
+ }
2109
+ if (id === "workingLineMessageList") {
2110
+ finishSettings("edit-working-line-messages");
2111
+ return;
2112
+ }
2113
+ if (id === "selectorBordersEnabled" && enabled !== undefined) {
2114
+ deps.setSelectorBordersComponent({ enabled }, ctx);
2115
+ settingsList.updateValue(id, newValue);
2116
+ notifyChange("Selector borders", newValue);
2117
+ return;
2118
+ }
2119
+ if (id === "selectorBordersStyle" && newValue === "zentui") {
2120
+ deps.setSelectorBordersComponent({ style: newValue }, ctx);
2121
+ settingsList.updateValue(id, newValue);
2122
+ notifyChange("Selector border style", newValue);
2123
+ return;
2124
+ }
2125
+ if (id === "selectorBordersColorSource" && isColorSource(newValue)) {
2126
+ deps.setSelectorBordersComponent({ colorSource: newValue }, ctx);
2127
+ settingsList.updateValue(id, newValue);
2128
+ notifyChange("Selector border colors", newValue);
2129
+ return;
2130
+ }
2131
+ if (id === "iconMode" && isIconMode(newValue)) {
2132
+ deps.setIconMode(newValue);
2133
+ settingsList.updateValue(id, newValue);
2134
+ notifyChange("Icon mode", newValue);
2135
+ return;
1604
2136
  }
1605
- return;
1606
- }
1607
- if (
1608
- id === "workingLineTextAnimation" &&
1609
- workingLineTextAnimationValues.includes(newValue as WorkingLineTextAnimation)
1610
- ) {
1611
- const result = deps.setWorkingLineComponent(
1612
- { textAnimation: newValue as WorkingLineTextAnimation },
1613
- ctx,
1614
- );
1615
- settingsList.updateValue(id, newValue);
1616
- notifyWorkingLineChange("Text animation", newValue, result);
1617
- return;
1618
- }
1619
- if (id === "workingLineColorSource" && isColorSource(newValue)) {
1620
- const result = deps.setWorkingLineComponent({ colorSource: newValue }, ctx);
1621
- settingsList.updateValue(id, newValue);
1622
- notifyWorkingLineChange("Color source", newValue, result);
1623
- return;
1624
- }
1625
- if (id === "workingLineAnimateSpinnerColor" && enabled !== undefined) {
1626
- const result = deps.setWorkingLineComponent(
1627
- { animateSpinnerColor: enabled },
1628
- ctx,
1629
- );
1630
- settingsList.updateValue(id, newValue);
1631
- notifyWorkingLineChange("Animate spinner color", newValue, result);
1632
- return;
1633
- }
1634
- if (id === "workingLineCustomMessages" && enabled !== undefined) {
1635
- const result = deps.setWorkingLineComponent(
1636
- { messages: { custom: enabled } },
1637
- ctx,
1638
- );
1639
- settingsList.updateValue(id, newValue);
1640
- notifyWorkingLineChange("Custom messages", newValue, result);
1641
- return;
1642
- }
1643
- if (
1644
- (id === "workingLineTool" ||
1645
- id === "workingLineElapsed" ||
1646
- id === "workingLineThought" ||
1647
- id === "workingLineTokens") &&
1648
- enabled !== undefined
1649
- ) {
1650
- const key =
1651
- id === "workingLineTool"
1652
- ? "tool"
1653
- : id === "workingLineElapsed"
1654
- ? "elapsed"
1655
- : id === "workingLineThought"
1656
- ? "thought"
1657
- : "tokens";
1658
- const result = deps.setWorkingLineComponent(
1659
- { segments: { [key]: enabled } },
1660
- ctx,
1661
- );
1662
- settingsList.updateValue(id, newValue);
1663
- notifyWorkingLineChange(id.slice("workingLine".length), newValue, result);
1664
- return;
1665
- }
1666
- if (id === "workingLineMessageList") {
1667
- finishSettings("edit-working-line-messages");
1668
- return;
1669
- }
1670
- if (id === "selectorBordersEnabled" && enabled !== undefined) {
1671
- deps.setSelectorBordersComponent({ enabled }, ctx);
1672
- settingsList.updateValue(id, newValue);
1673
- notifyChange("Selector borders", newValue);
1674
- return;
1675
- }
1676
- if (id === "selectorBordersStyle" && newValue === "zentui") {
1677
- deps.setSelectorBordersComponent({ style: newValue }, ctx);
1678
- settingsList.updateValue(id, newValue);
1679
- notifyChange("Selector border style", newValue);
1680
- return;
1681
- }
1682
- if (id === "selectorBordersColorSource" && isColorSource(newValue)) {
1683
- deps.setSelectorBordersComponent({ colorSource: newValue }, ctx);
1684
- settingsList.updateValue(id, newValue);
1685
- notifyChange("Selector border colors", newValue);
1686
- return;
1687
- }
1688
- if (id === "iconMode" && isIconMode(newValue)) {
1689
- deps.setIconMode(newValue);
1690
- settingsList.updateValue(id, newValue);
1691
- notifyChange("Icon mode", newValue);
1692
- return;
1693
- }
1694
2137
 
1695
- const selectedFooterStyle =
1696
- id === "footerStyle" ? footerStyleId(newValue) : undefined;
1697
- if (selectedFooterStyle) {
1698
- setFooter({ style: selectedFooterStyle }, ctx);
1699
- settingsList = makeSettingsList("footerStyle");
1700
- notifyChange("Footer style", newValue);
1701
- return;
1702
- }
1703
- if (id === "footerColorSource" && isColorSource(newValue)) {
1704
- setFooter({ colorSource: newValue }, ctx);
1705
- settingsList.updateValue(id, newValue);
1706
- notifyChange("Footer colors", newValue);
1707
- return;
1708
- }
1709
- if (id === "footerModelLabel" && (newValue === "id" || newValue === "name")) {
1710
- setFooter({ modelLabel: newValue }, ctx);
1711
- settingsList.updateValue(id, newValue);
1712
- notifyChange("Footer model label", newValue);
1713
- return;
1714
- }
2138
+ const selectedFooterStyle =
2139
+ id === "footerStyle" ? footerStyleId(newValue) : undefined;
2140
+ if (selectedFooterStyle) {
2141
+ setFooter({ style: selectedFooterStyle }, ctx);
2142
+ settingsList = makeSettingsList("footerStyle");
2143
+ notifyChange("Footer style", newValue);
2144
+ return;
2145
+ }
2146
+ if (id === "footerColorSource" && isColorSource(newValue)) {
2147
+ setFooter({ colorSource: newValue }, ctx);
2148
+ settingsList.updateValue(id, newValue);
2149
+ notifyChange("Footer colors", newValue);
2150
+ return;
2151
+ }
2152
+ if (id === "footerModelLabel" && (newValue === "id" || newValue === "name")) {
2153
+ setFooter({ modelLabel: newValue }, ctx);
2154
+ settingsList.updateValue(id, newValue);
2155
+ notifyChange("Footer model label", newValue);
2156
+ return;
2157
+ }
1715
2158
 
1716
- if (id === "responsiveFooter" && enabled !== undefined) {
1717
- deps.setResponsiveFooter({ responsiveFooter: enabled }, ctx);
1718
- settingsList.updateValue(id, newValue);
1719
- notifyChange("Responsive footer", newValue);
1720
- return;
1721
- }
1722
- if (
1723
- id === "compactFooterMaxLines" &&
1724
- compactFooterMaxLineValues.includes(newValue as never)
1725
- ) {
1726
- const value: CompactFooterMaxLines =
1727
- newValue === "unlimited" ? "unlimited" : (Number(newValue) as 1 | 2 | 3);
1728
- deps.setResponsiveFooter({ compactFooterMaxLines: value }, ctx);
1729
- settingsList.updateValue(id, newValue);
1730
- notifyChange("Compact footer rows", newValue);
1731
- return;
1732
- }
1733
- if (
1734
- id === "contextStyle" &&
1735
- contextStyleValues.includes(newValue as ContextStyle)
1736
- ) {
1737
- deps.setContextStyle(newValue as ContextStyle);
1738
- settingsList.updateValue(id, newValue);
1739
- notifyChange("Context style", newValue);
1740
- return;
1741
- }
1742
- if (id === "separator" && isSeparatorStyle(newValue)) {
1743
- deps.setSeparator(newValue);
1744
- settingsList.updateValue(id, newValue);
1745
- notifyChange("Separator", newValue);
1746
- return;
1747
- }
1748
- if (
1749
- id === "pathDisplay" &&
1750
- pathDisplayModeValues.includes(newValue as PathDisplayConfig["mode"])
1751
- ) {
1752
- deps.setPathDisplay({ mode: newValue as PathDisplayConfig["mode"] });
1753
- settingsList.updateValue(id, newValue);
1754
- notifyChange("Path display", newValue);
1755
- return;
1756
- }
1757
- if (id === "pathDepth" && pathDepthValues.includes(newValue as never)) {
1758
- deps.setPathDisplay({ depth: Number(newValue) });
1759
- settingsList.updateValue(id, newValue);
1760
- notifyChange("Path depth", newValue);
1761
- return;
1762
- }
2159
+ if (id === "responsiveFooter" && enabled !== undefined) {
2160
+ deps.setResponsiveFooter({ responsiveFooter: enabled }, ctx);
2161
+ settingsList.updateValue(id, newValue);
2162
+ notifyChange("Responsive footer", newValue);
2163
+ return;
2164
+ }
2165
+ if (
2166
+ id === "compactFooterMaxLines" &&
2167
+ compactFooterMaxLineValues.includes(newValue as never)
2168
+ ) {
2169
+ const value: CompactFooterMaxLines =
2170
+ newValue === "unlimited" ? "unlimited" : (Number(newValue) as 1 | 2 | 3);
2171
+ deps.setResponsiveFooter({ compactFooterMaxLines: value }, ctx);
2172
+ settingsList.updateValue(id, newValue);
2173
+ notifyChange("Compact footer rows", newValue);
2174
+ return;
2175
+ }
2176
+ if (
2177
+ id === "contextStyle" &&
2178
+ contextStyleValues.includes(newValue as ContextStyle)
2179
+ ) {
2180
+ deps.setContextStyle(newValue as ContextStyle);
2181
+ settingsList.updateValue(id, newValue);
2182
+ notifyChange("Context style", newValue);
2183
+ return;
2184
+ }
2185
+ if (id === "separator" && isSeparatorStyle(newValue)) {
2186
+ deps.setSeparator(newValue);
2187
+ settingsList.updateValue(id, newValue);
2188
+ notifyChange("Separator", newValue);
2189
+ return;
2190
+ }
2191
+ if (
2192
+ id === "pathDisplay" &&
2193
+ pathDisplayModeValues.includes(newValue as PathDisplayConfig["mode"])
2194
+ ) {
2195
+ deps.setPathDisplay({ mode: newValue as PathDisplayConfig["mode"] });
2196
+ settingsList.updateValue(id, newValue);
2197
+ notifyChange("Path display", newValue);
2198
+ return;
2199
+ }
2200
+ if (id === "pathDepth" && pathDepthValues.includes(newValue as never)) {
2201
+ deps.setPathDisplay({ depth: Number(newValue) });
2202
+ settingsList.updateValue(id, newValue);
2203
+ notifyChange("Path depth", newValue);
2204
+ return;
2205
+ }
1763
2206
 
1764
- const segment = footerSegmentSettingFromId(id);
1765
- if (segment && enabled !== undefined) {
1766
- deps.setFooterSegments({ [segment]: enabled }, ctx);
1767
- settingsList.updateValue(id, newValue);
1768
- notifyChange(footerSegmentSettingLabels[segment], newValue);
1769
- return;
1770
- }
1771
- if (id === "branchLength") {
1772
- const value = newValue === "full" ? "full" : Number(newValue);
1773
- if (value !== "full" && (!Number.isInteger(value) || value <= 0)) return;
1774
- deps.setGitBranch({ maxLength: value });
1775
- settingsList.updateValue(id, newValue);
1776
- notifyChange("Branch length", newValue);
1777
- return;
1778
- }
1779
- if (id === "gitCommitOnlyDetached" && enabled !== undefined) {
1780
- deps.setGitCommit({ onlyDetached: enabled }, ctx);
1781
- settingsList.updateValue(id, newValue);
1782
- notifyChange("Commit only on detached HEAD", newValue);
1783
- return;
1784
- }
1785
- if (id === "gitCommitShowTag" && enabled !== undefined) {
1786
- deps.setGitCommit({ showTag: enabled }, ctx);
1787
- settingsList.updateValue(id, newValue);
1788
- notifyChange("Show exact-match tag", newValue);
1789
- return;
1790
- }
1791
- if (id === "gitMetricsOnlyNonzero" && enabled !== undefined) {
1792
- deps.setGitMetrics({ onlyNonzero: enabled }, ctx);
1793
- settingsList.updateValue(id, newValue);
1794
- notifyChange("Hide zero metrics", newValue);
1795
- return;
1796
- }
1797
- if (id === "gitMetricsIgnoreSubmodules" && enabled !== undefined) {
1798
- deps.setGitMetrics({ ignoreSubmodules: enabled }, ctx);
1799
- settingsList.updateValue(id, newValue);
1800
- notifyChange("Ignore submodules", newValue);
1801
- return;
1802
- }
2207
+ const segment = footerSegmentSettingFromId(id);
2208
+ if (segment && enabled !== undefined) {
2209
+ deps.setFooterSegments({ [segment]: enabled }, ctx);
2210
+ settingsList.updateValue(id, newValue);
2211
+ notifyChange(footerSegmentSettingLabels[segment], newValue);
2212
+ return;
2213
+ }
2214
+ if (id === "branchLength") {
2215
+ const value = newValue === "full" ? "full" : Number(newValue);
2216
+ if (value !== "full" && (!Number.isInteger(value) || value <= 0)) return;
2217
+ deps.setGitBranch({ maxLength: value });
2218
+ settingsList.updateValue(id, newValue);
2219
+ notifyChange("Branch length", newValue);
2220
+ return;
2221
+ }
2222
+ if (id === "gitCommitOnlyDetached" && enabled !== undefined) {
2223
+ deps.setGitCommit({ onlyDetached: enabled }, ctx);
2224
+ settingsList.updateValue(id, newValue);
2225
+ notifyChange("Commit only on detached HEAD", newValue);
2226
+ return;
2227
+ }
2228
+ if (id === "gitCommitShowTag" && enabled !== undefined) {
2229
+ deps.setGitCommit({ showTag: enabled }, ctx);
2230
+ settingsList.updateValue(id, newValue);
2231
+ notifyChange("Show exact-match tag", newValue);
2232
+ return;
2233
+ }
2234
+ if (id === "gitMetricsOnlyNonzero" && enabled !== undefined) {
2235
+ deps.setGitMetrics({ onlyNonzero: enabled }, ctx);
2236
+ settingsList.updateValue(id, newValue);
2237
+ notifyChange("Hide zero metrics", newValue);
2238
+ return;
2239
+ }
2240
+ if (id === "gitMetricsIgnoreSubmodules" && enabled !== undefined) {
2241
+ deps.setGitMetrics({ ignoreSubmodules: enabled }, ctx);
2242
+ settingsList.updateValue(id, newValue);
2243
+ notifyChange("Ignore submodules", newValue);
2244
+ return;
2245
+ }
1803
2246
 
1804
- if (
1805
- id === "extensionStatusDefaultPlacement" &&
1806
- isExtensionStatusPlacement(newValue)
1807
- ) {
1808
- deps.setExtensionStatusDefaultPlacement(newValue);
1809
- settingsList = makeSettingsList("extensionStatusDefaultPlacement");
1810
- notifyChange("Default extension status placement", newValue);
1811
- return;
1812
- }
1813
- const thirdParty = thirdPartyStatusSettingFromId(id);
1814
- if (thirdParty?.kind === "placement" && isExtensionStatusPlacement(newValue)) {
1815
- deps.setExtensionStatusPlacement(thirdParty.key, newValue);
1816
- settingsList.updateValue(id, newValue);
1817
- notifyChange(`Third-party status ${thirdParty.key} placement`, newValue);
1818
- return;
1819
- }
1820
- if (thirdParty?.kind === "colorMode" && isExtensionStatusColorMode(newValue)) {
1821
- deps.setExtensionStatusColorMode(thirdParty.key, newValue);
1822
- settingsList.updateValue(id, newValue);
1823
- notifyChange(`Third-party status ${thirdParty.key} color`, newValue);
2247
+ const choice = newValue.toLowerCase();
2248
+ if (
2249
+ id === "extensionStatusDefaultPlacement" &&
2250
+ isExtensionStatusPlacement(choice)
2251
+ ) {
2252
+ deps.setExtensionStatusDefaultChoice(choice);
2253
+ settingsList = makeSettingsList(id);
2254
+ notifyChange("Default placement", newValue);
2255
+ return;
2256
+ }
2257
+ const thirdParty = thirdPartyStatusSettingFromId(id);
2258
+ if (
2259
+ thirdParty?.kind === "placement" &&
2260
+ (choice === "default" || isExtensionStatusPlacement(choice))
2261
+ ) {
2262
+ deps.setExtensionStatusChoice(thirdParty.key, choice);
2263
+ settingsList = makeSettingsList(id);
2264
+ notifyChange(`${thirdParty.key} placement`, newValue);
2265
+ return;
2266
+ }
2267
+ if (thirdParty?.kind === "colorMode" && isExtensionStatusColorMode(choice)) {
2268
+ if (deps.getConfig().components.footer.style === "hidden")
2269
+ deps.setHiddenExtensionStatusColorMode(thirdParty.key, choice);
2270
+ else deps.setExtensionStatusColorMode(thirdParty.key, choice);
2271
+ settingsList = makeSettingsList(id);
2272
+ notifyChange(`${thirdParty.key} color`, newValue);
2273
+ }
2274
+ } catch (error) {
2275
+ stopPreview();
2276
+ settingsList = makeSettingsList(id);
2277
+ tui.requestRender();
2278
+ ctx.ui.notify(
2279
+ `Could not update Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
2280
+ "error",
2281
+ );
1824
2282
  }
1825
- } catch (error) {
2283
+ },
2284
+ activate() {
2285
+ // Panel rows use value cycles (including one-value dialog actions).
2286
+ // Share the native onChange route, not a synthetic key that native
2287
+ // navigation bindings could consume before activation.
2288
+ const item = items[selectedIndex];
2289
+ if (!item?.values?.length) return;
2290
+ const next = (item.values.indexOf(item.currentValue) + 1) % item.values.length;
2291
+ actions.change(item.id, item.values[next]);
2292
+ },
2293
+ };
2294
+ const list = new SettingsList(
2295
+ items,
2296
+ listVisible,
2297
+ // Native hint text is not binding-aware. Own the hint surface via its supported theme callback.
2298
+ { ...listTheme, hint: () => "" },
2299
+ actions.change,
2300
+ backOrClose,
2301
+ );
2302
+ activateSelectedSetting = actions.activate;
2303
+ if (focusId && !selectOwnedSetting(list, items, focusId)) selectedIndex = 0;
2304
+ return list;
2305
+ };
2306
+ settingsList = makeSettingsList(initialFocusId);
2307
+ startPreview();
2308
+ const renderPreviewRows = (previewWidth: number): string[] => {
2309
+ if (previewWidth <= 0) return [];
2310
+ if (activeSection === "editor")
2311
+ return renderEditorSettingsPreview(deps.getConfig(), theme, previewWidth);
2312
+ if (activeSection === "userMessages")
2313
+ return renderUserMessageSettingsPreview(deps.getConfig(), theme, previewWidth);
2314
+ if (activeSection === "thinkingSteps")
2315
+ return renderThinkingStepsSettingsPreview(
2316
+ deps.getConfig(),
2317
+ theme,
2318
+ previewWidth,
2319
+ deps.thinkingStepsCapability,
2320
+ );
2321
+ if (activeSection === "workingLine" && preview && preview.frames.length > 0)
2322
+ return [
2323
+ truncateToWidth(
2324
+ preview.frames[previewFrameIndex] ?? preview.frames[0],
2325
+ Math.min(SETTINGS_PREVIEW_MAX_WIDTH, previewWidth),
2326
+ "",
2327
+ ),
2328
+ ];
2329
+ return [];
2330
+ };
2331
+ return {
2332
+ render(width: number) {
2333
+ if (width <= 0) return [];
2334
+ const border = renderStyleForSourceOrFallback(
2335
+ theme,
2336
+ deps.getConfig().components.selectorBorders.colorSource,
2337
+ componentColor(deps.getConfig(), "selectorBorders", "border"),
2338
+ EDITOR_BORDER_FALLBACK,
2339
+ "─".repeat(Math.max(0, width)),
2340
+ );
2341
+ const height = tui.terminal?.rows ?? 80;
2342
+ const help = keys
2343
+ .help(width, isFooterPage(activeSection) ? "Back" : "Close")
2344
+ .map((line) => safeThemeFg(theme, "muted", line));
2345
+ const nextVisible = Math.max(1, Math.min(8, height - help.length - 8));
2346
+ if (nextVisible !== listVisible) {
2347
+ listVisible = nextVisible;
2348
+ settingsList = makeSettingsList(currentItems[selectedIndex]?.id);
2349
+ }
2350
+ const settingsRows = settingsList
2351
+ .render(Math.max(5, width))
2352
+ .map((line) => truncateToWidth(line, width, ""));
2353
+ while (settingsRows.length && visibleWidth(settingsRows.at(-1) ?? "") === 0)
2354
+ settingsRows.pop();
2355
+ const bodyBudget = Math.max(1, height - 4 - help.length);
2356
+ const previewRows = renderPreviewRows(Math.max(0, width - 4));
2357
+ while (previewRows.length > 0 && visibleWidth(previewRows.at(-1) ?? "") === 0)
2358
+ previewRows.pop();
2359
+ const indentedPreviewRows = previewRows.map((line) =>
2360
+ truncateToWidth(` ${line}`, width, ""),
2361
+ );
2362
+ const showPreview =
2363
+ indentedPreviewRows.length + 2 + settingsRows.length <= bodyBudget;
2364
+ const bodyRows =
2365
+ showPreview && indentedPreviewRows.some((line) => visibleWidth(line) > 0)
2366
+ ? ["", ...indentedPreviewRows, "", ...settingsRows]
2367
+ : settingsRows.slice(0, bodyBudget);
2368
+ bodyRows.push(...help);
2369
+ return [
2370
+ truncateToWidth(border, width, ""),
2371
+ truncateToWidth(
2372
+ formatSectionTabs(activeSection, theme, width, sections, deps.skinOnly),
2373
+ width,
2374
+ "",
2375
+ ),
2376
+ truncateToWidth(border, width, ""),
2377
+ ...bodyRows,
2378
+ truncateToWidth(border, width, ""),
2379
+ ];
2380
+ },
2381
+ invalidate() {
2382
+ settingsList.invalidate();
2383
+ },
2384
+ handleInput(data: string) {
2385
+ // Closing is safe even after shutdown: let Pi restore its saved editor draft.
2386
+ if (keys.matches(data, "cancel")) {
2387
+ backOrClose();
2388
+ return;
2389
+ }
2390
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
2391
+ if (matchesKey(data, Key.tab)) {
1826
2392
  stopPreview();
1827
- settingsList = makeSettingsList(id);
2393
+ activeSection = nextSection(activeSection, sections);
2394
+ settingsList = makeSettingsList();
2395
+ startPreview();
1828
2396
  tui.requestRender();
1829
- ctx.ui.notify(
1830
- `Could not update Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
1831
- "error",
1832
- );
2397
+ return;
1833
2398
  }
1834
- },
1835
- () => finishSettings("close"),
1836
- );
1837
- if (focusId) {
1838
- const target = items.findIndex((item) => item.id === focusId);
1839
- for (let index = 0; index < target; index += 1) list.handleInput("\x1b[B");
1840
- }
1841
- return list;
1842
- };
1843
- settingsList = makeSettingsList(initialFocusId);
1844
- startPreview();
1845
- const renderPreviewRows = (previewWidth: number): string[] => {
1846
- if (previewWidth <= 0) return [];
1847
- if (activeSection === "editor")
1848
- return renderEditorSettingsPreview(deps.getConfig(), theme, previewWidth);
1849
- if (activeSection === "userMessages")
1850
- return renderUserMessageSettingsPreview(deps.getConfig(), theme, previewWidth);
1851
- if (activeSection === "thinkingSteps")
1852
- return renderThinkingStepsSettingsPreview(
1853
- deps.getConfig(),
1854
- theme,
1855
- previewWidth,
1856
- deps.thinkingStepsCapability,
1857
- );
1858
- if (activeSection === "workingLine" && preview && preview.frames.length > 0)
1859
- return [
1860
- truncateToWidth(
1861
- preview.frames[previewFrameIndex] ?? preview.frames[0],
1862
- Math.min(SETTINGS_PREVIEW_MAX_WIDTH, previewWidth),
1863
- "",
1864
- ),
1865
- ];
1866
- return [];
1867
- };
1868
- return {
1869
- render(width: number) {
1870
- const border = renderChromeBorder(
1871
- theme,
1872
- deps.getConfig().components.selectorBorders.colorSource,
1873
- EDITOR_BORDER_STYLE,
1874
- "─".repeat(Math.max(0, width)),
1875
- );
1876
- const settingsRows = withSectionFooter(settingsList.render(width), theme).map(
1877
- (line) => truncateToWidth(line, width, ""),
1878
- );
1879
- const previewRows = renderPreviewRows(Math.max(0, width - 4));
1880
- while (previewRows.length > 0 && visibleWidth(previewRows.at(-1) ?? "") === 0)
1881
- previewRows.pop();
1882
- const indentedPreviewRows = previewRows.map((line) =>
1883
- truncateToWidth(` ${line}`, width, ""),
1884
- );
1885
- const bodyRows = indentedPreviewRows.some((line) => visibleWidth(line) > 0)
1886
- ? ["", ...indentedPreviewRows, "", ...settingsRows]
1887
- : settingsRows;
1888
- return [
1889
- truncateToWidth(border, width, ""),
1890
- truncateToWidth(formatSectionTabs(activeSection, theme, width), width, ""),
1891
- truncateToWidth(border, width, ""),
1892
- ...bodyRows,
1893
- truncateToWidth(border, width, ""),
1894
- ];
1895
- },
1896
- invalidate() {
1897
- settingsList.invalidate();
1898
- },
1899
- handleInput(data: string) {
1900
- if (matchesKey(data, Key.tab)) {
1901
- stopPreview();
1902
- activeSection = nextSection(activeSection);
1903
- settingsList = makeSettingsList();
1904
- startPreview();
2399
+ if (matchesKey(data, Key.shift("tab"))) {
2400
+ stopPreview();
2401
+ activeSection = previousSection(activeSection, sections);
2402
+ settingsList = makeSettingsList();
2403
+ startPreview();
2404
+ tui.requestRender();
2405
+ return;
2406
+ }
2407
+ if (keys.matches(data, "up") || keys.matches(data, "down")) {
2408
+ const delta = keys.matches(data, "up") ? -1 : 1;
2409
+ const next = (selectedIndex + delta + currentItems.length) % currentItems.length;
2410
+ const id = currentItems[next]?.id;
2411
+ if (id && selectOwnedSetting(settingsList, currentItems, id))
2412
+ selectedIndex = next;
2413
+ } else if (keys.matches(data, "confirm") || data === " ") activateSelectedSetting();
1905
2414
  tui.requestRender();
1906
- return;
1907
- }
1908
- if (matchesKey(data, Key.shift("tab"))) {
2415
+ },
2416
+ dispose() {
1909
2417
  stopPreview();
1910
- activeSection = previousSection(activeSection);
1911
- settingsList = makeSettingsList();
1912
- startPreview();
1913
- tui.requestRender();
1914
- return;
1915
- }
1916
- settingsList.handleInput(data);
1917
- },
1918
- dispose() {
1919
- stopPreview();
1920
- },
1921
- };
1922
- });
2418
+ },
2419
+ };
2420
+ });
2421
+ } catch (error) {
2422
+ if (deps.sessionLifecycle.isCurrent(generation))
2423
+ ctx.ui.notify(
2424
+ `Could not open Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
2425
+ "error",
2426
+ );
2427
+ return;
2428
+ }
1923
2429
  // Pi restores its saved editor text before custom() resolves. Reconcile only
1924
2430
  // now, using the latest config and observed factory, never a captured factory.
1925
- if (pendingPresetEditor && !deps.sessionLifecycle.isCurrent(generation)) return;
2431
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1926
2432
  if (pendingPresetEditor) {
1927
2433
  try {
1928
2434
  const result = deps.reconcilePresetEditor(ctx);
@@ -1933,6 +2439,7 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1933
2439
  );
1934
2440
  }
1935
2441
  } catch (error) {
2442
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1936
2443
  ctx.ui.notify(
1937
2444
  `Could not apply preset editor; reload Pi: ${error instanceof Error ? error.message : String(error)}`,
1938
2445
  "error",
@@ -1940,6 +2447,37 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1940
2447
  }
1941
2448
  }
1942
2449
  if (outcome === "close" || outcome === undefined) return;
2450
+ if (outcome.startsWith("edit-custom-value-colors:")) {
2451
+ await editCustomValueColors(
2452
+ ctx,
2453
+ deps,
2454
+ outcome.slice("edit-custom-value-colors:".length) as "editor" | "footer",
2455
+ );
2456
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
2457
+ continue;
2458
+ }
2459
+ if (outcome === "edit-turn-summary-format") {
2460
+ await editTurnSummaryFormat(ctx, deps);
2461
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
2462
+ continue;
2463
+ }
2464
+ if (outcome === "migrate" || outcome.startsWith("edit-colors:")) {
2465
+ if (outcome === "migrate") await confirmComponentMigration(ctx, deps);
2466
+ else
2467
+ await editComponentColors(
2468
+ ctx,
2469
+ deps,
2470
+ outcome.slice("edit-colors:".length) as ColorOwner,
2471
+ );
2472
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
2473
+ continue;
2474
+ }
2475
+ if (outcome === "edit-minimalist-templates" || outcome === "edit-minimalist-variables") {
2476
+ if (outcome === "edit-minimalist-templates") await editMinimalistTemplates(ctx, deps);
2477
+ else await editMinimalistVariables(ctx, deps);
2478
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
2479
+ continue;
2480
+ }
1943
2481
  if (
1944
2482
  outcome === "edit-working-line-spinner-speed" ||
1945
2483
  outcome === "edit-working-line-text-speed"
@@ -1949,10 +2487,12 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1949
2487
  const before = spinnerSpeed ? workingLine.spinnerIntervalMs : workingLine.textIntervalMs;
1950
2488
  const label = spinnerSpeed ? "Spinner speed" : "Text motion speed";
1951
2489
  try {
2490
+ prepareEditorTextForCustomUi(ctx.ui);
1952
2491
  const edited = await ctx.ui.input(
1953
2492
  `${label} (${MIN_WORKING_LINE_INTERVAL_MS}–${MAX_WORKING_LINE_INTERVAL_MS} ms)`,
1954
2493
  String(before),
1955
2494
  );
2495
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1956
2496
  if (edited === undefined) {
1957
2497
  ctx.ui.notify(`${label} unchanged (input canceled)`, "info");
1958
2498
  } else {
@@ -1975,18 +2515,22 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1975
2515
  }
1976
2516
  }
1977
2517
  } catch (error) {
2518
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1978
2519
  ctx.ui.notify(
1979
2520
  `Could not update Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
1980
2521
  "error",
1981
2522
  );
1982
2523
  }
2524
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1983
2525
  requestedSection = "workingLine";
1984
2526
  requestedFocusId = spinnerSpeed ? "workingLineSpinnerSpeed" : "workingLineTextSpeed";
1985
2527
  continue;
1986
2528
  }
1987
2529
  try {
1988
2530
  const before = deps.getConfig().components.workingLine.messages.values.join("\n");
2531
+ prepareEditorTextForCustomUi(ctx.ui);
1989
2532
  const edited = await ctx.ui.editor("Working line message list", before);
2533
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1990
2534
  if (edited !== undefined) {
1991
2535
  const values = normalizeWorkingLineMessages(edited.split(/\r?\n/));
1992
2536
  const result = deps.setWorkingLineComponent({ messages: { values } }, ctx);
@@ -1996,11 +2540,13 @@ export function registerZentuiSettingsCommand(pi: ExtensionAPI, deps: SettingsCo
1996
2540
  );
1997
2541
  }
1998
2542
  } catch (error) {
2543
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
1999
2544
  ctx.ui.notify(
2000
2545
  `Could not update Zentui settings: ${error instanceof Error ? error.message : String(error)}`,
2001
2546
  "error",
2002
2547
  );
2003
2548
  }
2549
+ if (!deps.sessionLifecycle.isCurrent(generation)) return;
2004
2550
  requestedSection = "workingLine";
2005
2551
  requestedFocusId = "workingLineMessageList";
2006
2552
  }