@earendil-works/pi-coding-agent 0.87.1 → 0.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (721) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  4. package/dist/bun/restore-sandbox-env.js.map +1 -1
  5. package/dist/bun/runtime-setup.d.ts.map +1 -1
  6. package/dist/bun/runtime-setup.js +4 -1
  7. package/dist/bun/runtime-setup.js.map +1 -1
  8. package/dist/bun/sandbox-env-setup.d.ts.map +1 -1
  9. package/dist/bundle/chunks/anthropic-messages-A6EXUBG6.js +6 -0
  10. package/dist/bundle/chunks/anthropic.js +2 -2
  11. package/dist/bundle/chunks/azure-openai-responses-EN5WOBET.js +2 -0
  12. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  13. package/dist/bundle/chunks/chunk-4CSSZFEW.js +1435 -0
  14. package/dist/bundle/chunks/chunk-7JGR3GZN.js +11 -0
  15. package/dist/bundle/chunks/chunk-AXPY26X7.js +146 -0
  16. package/dist/bundle/chunks/chunk-EPDRUIU6.js +2 -0
  17. package/dist/bundle/chunks/chunk-GOPCREV2.js +4 -0
  18. package/dist/bundle/chunks/chunk-H3QXYIF7.js +31 -0
  19. package/dist/bundle/chunks/{chunk-S7SZN6Z3.js → chunk-HSPCVFST.js} +1 -1
  20. package/dist/bundle/chunks/chunk-IMTXZUO7.js +82 -0
  21. package/dist/bundle/chunks/chunk-J4CWPC4N.js +2 -0
  22. package/dist/bundle/chunks/chunk-LLMKQWZS.js +21 -0
  23. package/dist/bundle/chunks/{chunk-WIUZI2CJ.js → chunk-LRS5S6EK.js} +3 -3
  24. package/dist/bundle/chunks/chunk-PEHWOV5U.js +187 -0
  25. package/dist/bundle/chunks/{chunk-XDUWOHPL.js → chunk-S3GGRYIO.js} +2 -2
  26. package/dist/bundle/chunks/chunk-UTB4DTYQ.js +2 -0
  27. package/dist/bundle/chunks/{chunk-FUXEF6JQ.js → chunk-W2DOMZSC.js} +1 -1
  28. package/dist/bundle/chunks/cli-AZXNGIZH.js +49 -0
  29. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-XJQQYGGU.js +2 -0
  30. package/dist/bundle/chunks/codemode-worker.js +295 -0
  31. package/dist/bundle/chunks/execute-7XXPZAWW.js +308 -0
  32. package/dist/bundle/chunks/github-copilot.js +1 -1
  33. package/dist/bundle/chunks/google-generative-ai-CQAKKJTA.js +2 -0
  34. package/dist/bundle/chunks/google-vertex-AE36YXJU.js +2 -0
  35. package/dist/bundle/chunks/{lib-HGQMNYVT.js → lib-TEDK3E5I.js} +2 -2
  36. package/dist/bundle/chunks/llama-cpp-classify-PJJYKPLD.js +22 -0
  37. package/dist/bundle/chunks/mistral-conversations-KEYTXJM7.js +5 -0
  38. package/dist/bundle/chunks/{openai-codex-responses-QDSOTBBO.js → openai-codex-responses-JQTCOVEG.js} +2 -2
  39. package/dist/bundle/chunks/openai-codex.js +2 -2
  40. package/dist/bundle/chunks/{openai-completions-OBX42CLD.js → openai-completions-XW2Q5HVC.js} +2 -2
  41. package/dist/bundle/chunks/openai-responses-6AXWFL75.js +3 -0
  42. package/dist/bundle/chunks/{openrouter-images-N4XVVFSD.js → openrouter-images-TPQ4V6OR.js} +1 -1
  43. package/dist/bundle/chunks/openrouter.js +2 -2
  44. package/dist/bundle/chunks/{pi-messages-GFKBWJHZ.js → pi-messages-TM5SOOIW.js} +2 -2
  45. package/dist/bundle/chunks/radius.js +2 -2
  46. package/dist/bundle/chunks/runtime-G5WJPRBM.js +2 -0
  47. package/dist/bundle/chunks/typesafe-system-one-E7A4HNJI.js +2 -0
  48. package/dist/bundle/chunks/virtual-modules-AQ3FLU6H.js +2 -0
  49. package/dist/bundle/cli-runtime.js +1 -1
  50. package/dist/bundle/index.js +1 -1
  51. package/dist/bundle/rpc-entry.js +1 -1
  52. package/dist/cli/args.d.ts.map +1 -1
  53. package/dist/cli/args.js +4 -3
  54. package/dist/cli/args.js.map +1 -1
  55. package/dist/cli/auth-check.d.ts.map +1 -1
  56. package/dist/cli/auth-check.js.map +1 -1
  57. package/dist/cli/auth-command.d.ts.map +1 -1
  58. package/dist/cli/auth-command.js.map +1 -1
  59. package/dist/cli/config-selector.d.ts.map +1 -1
  60. package/dist/cli/config-selector.js.map +1 -1
  61. package/dist/cli/credential-print.d.ts.map +1 -1
  62. package/dist/cli/credential-print.js.map +1 -1
  63. package/dist/cli/file-processor.d.ts.map +1 -1
  64. package/dist/cli/file-processor.js.map +1 -1
  65. package/dist/cli/initial-message.d.ts +1 -1
  66. package/dist/cli/initial-message.d.ts.map +1 -1
  67. package/dist/cli/initial-message.js.map +1 -1
  68. package/dist/cli/list-models.d.ts.map +1 -1
  69. package/dist/cli/list-models.js.map +1 -1
  70. package/dist/cli/project-trust.d.ts.map +1 -1
  71. package/dist/cli/project-trust.js.map +1 -1
  72. package/dist/cli/session-picker.d.ts.map +1 -1
  73. package/dist/cli/session-picker.js.map +1 -1
  74. package/dist/cli/setup.d.ts.map +1 -1
  75. package/dist/cli/setup.js.map +1 -1
  76. package/dist/cli/startup-ui.d.ts.map +1 -1
  77. package/dist/cli/startup-ui.js +38 -30
  78. package/dist/cli/startup-ui.js.map +1 -1
  79. package/dist/cli.d.ts.map +1 -1
  80. package/dist/config.d.ts +18 -4
  81. package/dist/config.d.ts.map +1 -1
  82. package/dist/config.js +30 -4
  83. package/dist/config.js.map +1 -1
  84. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  85. package/dist/core/agent-session-runtime.js +1 -1
  86. package/dist/core/agent-session-runtime.js.map +1 -1
  87. package/dist/core/agent-session-services.d.ts.map +1 -1
  88. package/dist/core/agent-session-services.js +13 -0
  89. package/dist/core/agent-session-services.js.map +1 -1
  90. package/dist/core/agent-session.d.ts +135 -11
  91. package/dist/core/agent-session.d.ts.map +1 -1
  92. package/dist/core/agent-session.js +509 -253
  93. package/dist/core/agent-session.js.map +1 -1
  94. package/dist/core/auth-guidance.d.ts.map +1 -1
  95. package/dist/core/auth-guidance.js.map +1 -1
  96. package/dist/core/auth-storage.d.ts.map +1 -1
  97. package/dist/core/auth-storage.js.map +1 -1
  98. package/dist/core/bash-executor.d.ts.map +1 -1
  99. package/dist/core/bash-executor.js.map +1 -1
  100. package/dist/core/bug-report-upload.d.ts.map +1 -1
  101. package/dist/core/bug-report-upload.js.map +1 -1
  102. package/dist/core/bug-report.d.ts +1 -1
  103. package/dist/core/bug-report.d.ts.map +1 -1
  104. package/dist/core/bug-report.js +1 -1
  105. package/dist/core/bug-report.js.map +1 -1
  106. package/dist/core/cache-stats.d.ts.map +1 -1
  107. package/dist/core/cache-stats.js.map +1 -1
  108. package/dist/core/cache-warmer.d.ts.map +1 -1
  109. package/dist/core/cache-warmer.js.map +1 -1
  110. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  111. package/dist/core/compaction/branch-summarization.js.map +1 -1
  112. package/dist/core/compaction/compaction.d.ts.map +1 -1
  113. package/dist/core/compaction/compaction.js +1 -22
  114. package/dist/core/compaction/compaction.js.map +1 -1
  115. package/dist/core/compaction/index.d.ts.map +1 -1
  116. package/dist/core/compaction/utils.d.ts +2 -1
  117. package/dist/core/compaction/utils.d.ts.map +1 -1
  118. package/dist/core/compaction/utils.js +25 -18
  119. package/dist/core/compaction/utils.js.map +1 -1
  120. package/dist/core/crash-log.d.ts.map +1 -1
  121. package/dist/core/crash-log.js +2 -1
  122. package/dist/core/crash-log.js.map +1 -1
  123. package/dist/core/defaults.d.ts.map +1 -1
  124. package/dist/core/diagnostics.d.ts.map +1 -1
  125. package/dist/core/event-bus.d.ts.map +1 -1
  126. package/dist/core/event-bus.js.map +1 -1
  127. package/dist/core/exec.d.ts.map +1 -1
  128. package/dist/core/exec.js.map +1 -1
  129. package/dist/core/experimental.d.ts.map +1 -1
  130. package/dist/core/experimental.js.map +1 -1
  131. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  132. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  133. package/dist/core/export-html/index.d.ts.map +1 -1
  134. package/dist/core/export-html/index.js.map +1 -1
  135. package/dist/core/export-html/template.css +10 -0
  136. package/dist/core/export-html/template.js +66 -17
  137. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  138. package/dist/core/export-html/tool-renderer.js.map +1 -1
  139. package/dist/core/extensions/index.d.ts +1 -1
  140. package/dist/core/extensions/index.d.ts.map +1 -1
  141. package/dist/core/extensions/index.js.map +1 -1
  142. package/dist/core/extensions/jiti-loader.d.ts.map +1 -1
  143. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -1
  144. package/dist/core/extensions/loader.d.ts.map +1 -1
  145. package/dist/core/extensions/loader.js +55 -5
  146. package/dist/core/extensions/loader.js.map +1 -1
  147. package/dist/core/extensions/runner.d.ts +18 -1
  148. package/dist/core/extensions/runner.d.ts.map +1 -1
  149. package/dist/core/extensions/runner.js +99 -0
  150. package/dist/core/extensions/runner.js.map +1 -1
  151. package/dist/core/extensions/types.d.ts +296 -22
  152. package/dist/core/extensions/types.d.ts.map +1 -1
  153. package/dist/core/extensions/types.js.map +1 -1
  154. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  155. package/dist/core/extensions/wrapper.d.ts +2 -2
  156. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  157. package/dist/core/extensions/wrapper.js +3 -3
  158. package/dist/core/extensions/wrapper.js.map +1 -1
  159. package/dist/core/footer-data-provider.d.ts.map +1 -1
  160. package/dist/core/footer-data-provider.js.map +1 -1
  161. package/dist/core/http-dispatcher.d.ts.map +1 -1
  162. package/dist/core/http-dispatcher.js.map +1 -1
  163. package/dist/core/index.d.ts.map +1 -1
  164. package/dist/core/keybindings.d.ts +1 -1
  165. package/dist/core/keybindings.d.ts.map +1 -1
  166. package/dist/core/keybindings.js +1 -1
  167. package/dist/core/keybindings.js.map +1 -1
  168. package/dist/core/mcp-servers.d.ts +98 -0
  169. package/dist/core/mcp-servers.d.ts.map +1 -0
  170. package/dist/core/mcp-servers.js +157 -0
  171. package/dist/core/mcp-servers.js.map +1 -0
  172. package/dist/core/messages.d.ts.map +1 -1
  173. package/dist/core/messages.js.map +1 -1
  174. package/dist/core/model-config.d.ts.map +1 -1
  175. package/dist/core/model-config.js.map +1 -1
  176. package/dist/core/model-registry.d.ts +13 -1
  177. package/dist/core/model-registry.d.ts.map +1 -1
  178. package/dist/core/model-registry.js +25 -0
  179. package/dist/core/model-registry.js.map +1 -1
  180. package/dist/core/model-resolver.d.ts +2 -2
  181. package/dist/core/model-resolver.d.ts.map +1 -1
  182. package/dist/core/model-resolver.js +4 -4
  183. package/dist/core/model-resolver.js.map +1 -1
  184. package/dist/core/model-runtime.d.ts +41 -3
  185. package/dist/core/model-runtime.d.ts.map +1 -1
  186. package/dist/core/model-runtime.js +167 -17
  187. package/dist/core/model-runtime.js.map +1 -1
  188. package/dist/core/models-store.d.ts.map +1 -1
  189. package/dist/core/models-store.js.map +1 -1
  190. package/dist/core/nested-tool-calls.d.ts +102 -0
  191. package/dist/core/nested-tool-calls.d.ts.map +1 -0
  192. package/dist/core/nested-tool-calls.js +178 -0
  193. package/dist/core/nested-tool-calls.js.map +1 -0
  194. package/dist/core/output-guard.d.ts.map +1 -1
  195. package/dist/core/output-guard.js.map +1 -1
  196. package/dist/core/package-manager.d.ts +4 -0
  197. package/dist/core/package-manager.d.ts.map +1 -1
  198. package/dist/core/package-manager.js +59 -12
  199. package/dist/core/package-manager.js.map +1 -1
  200. package/dist/core/pi-manifest.d.ts.map +1 -1
  201. package/dist/core/pi-manifest.js.map +1 -1
  202. package/dist/core/project-trust.d.ts.map +1 -1
  203. package/dist/core/project-trust.js.map +1 -1
  204. package/dist/core/prompt-templates.d.ts.map +1 -1
  205. package/dist/core/prompt-templates.js.map +1 -1
  206. package/dist/core/provider-attribution.d.ts.map +1 -1
  207. package/dist/core/provider-attribution.js.map +1 -1
  208. package/dist/core/provider-composer.d.ts +40 -21
  209. package/dist/core/provider-composer.d.ts.map +1 -1
  210. package/dist/core/provider-composer.js +92 -40
  211. package/dist/core/provider-composer.js.map +1 -1
  212. package/dist/core/radius.d.ts.map +1 -1
  213. package/dist/core/radius.js.map +1 -1
  214. package/dist/core/remote-catalog-provider.d.ts +8 -1
  215. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  216. package/dist/core/remote-catalog-provider.js +18 -3
  217. package/dist/core/remote-catalog-provider.js.map +1 -1
  218. package/dist/core/resolve-config-value.d.ts.map +1 -1
  219. package/dist/core/resolve-config-value.js.map +1 -1
  220. package/dist/core/resource-loader.d.ts +7 -1
  221. package/dist/core/resource-loader.d.ts.map +1 -1
  222. package/dist/core/resource-loader.js +161 -35
  223. package/dist/core/resource-loader.js.map +1 -1
  224. package/dist/core/runtime-credentials.d.ts.map +1 -1
  225. package/dist/core/runtime-credentials.js.map +1 -1
  226. package/dist/core/sdk.d.ts +1 -1
  227. package/dist/core/sdk.d.ts.map +1 -1
  228. package/dist/core/sdk.js +24 -6
  229. package/dist/core/sdk.js.map +1 -1
  230. package/dist/core/session-cwd.d.ts.map +1 -1
  231. package/dist/core/session-cwd.js.map +1 -1
  232. package/dist/core/session-export.d.ts.map +1 -1
  233. package/dist/core/session-export.js.map +1 -1
  234. package/dist/core/session-manager.d.ts +9 -0
  235. package/dist/core/session-manager.d.ts.map +1 -1
  236. package/dist/core/session-manager.js +22 -22
  237. package/dist/core/session-manager.js.map +1 -1
  238. package/dist/core/settings-diagnostics.d.ts.map +1 -1
  239. package/dist/core/settings-diagnostics.js.map +1 -1
  240. package/dist/core/settings-manager.d.ts +31 -1
  241. package/dist/core/settings-manager.d.ts.map +1 -1
  242. package/dist/core/settings-manager.js +72 -2
  243. package/dist/core/settings-manager.js.map +1 -1
  244. package/dist/core/skills.d.ts.map +1 -1
  245. package/dist/core/skills.js.map +1 -1
  246. package/dist/core/slash-commands.d.ts.map +1 -1
  247. package/dist/core/source-info.d.ts +8 -0
  248. package/dist/core/source-info.d.ts.map +1 -1
  249. package/dist/core/source-info.js +16 -0
  250. package/dist/core/source-info.js.map +1 -1
  251. package/dist/core/system-prompt.d.ts.map +1 -1
  252. package/dist/core/system-prompt.js +1 -1
  253. package/dist/core/system-prompt.js.map +1 -1
  254. package/dist/core/telemetry.d.ts.map +1 -1
  255. package/dist/core/telemetry.js.map +1 -1
  256. package/dist/core/timings.d.ts.map +1 -1
  257. package/dist/core/timings.js.map +1 -1
  258. package/dist/core/tools/bash.d.ts +12 -0
  259. package/dist/core/tools/bash.d.ts.map +1 -1
  260. package/dist/core/tools/bash.js +35 -2
  261. package/dist/core/tools/bash.js.map +1 -1
  262. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  263. package/dist/core/tools/edit-diff.js.map +1 -1
  264. package/dist/core/tools/edit.d.ts.map +1 -1
  265. package/dist/core/tools/edit.js.map +1 -1
  266. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  267. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  268. package/dist/core/tools/find.d.ts.map +1 -1
  269. package/dist/core/tools/find.js.map +1 -1
  270. package/dist/core/tools/grep.d.ts.map +1 -1
  271. package/dist/core/tools/grep.js.map +1 -1
  272. package/dist/core/tools/index.d.ts.map +1 -1
  273. package/dist/core/tools/index.js.map +1 -1
  274. package/dist/core/tools/ls.d.ts.map +1 -1
  275. package/dist/core/tools/ls.js.map +1 -1
  276. package/dist/core/tools/output-accumulator.d.ts +11 -0
  277. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  278. package/dist/core/tools/output-accumulator.js +36 -0
  279. package/dist/core/tools/output-accumulator.js.map +1 -1
  280. package/dist/core/tools/path-utils.d.ts.map +1 -1
  281. package/dist/core/tools/path-utils.js.map +1 -1
  282. package/dist/core/tools/powershell.d.ts.map +1 -1
  283. package/dist/core/tools/powershell.js.map +1 -1
  284. package/dist/core/tools/read.d.ts.map +1 -1
  285. package/dist/core/tools/read.js.map +1 -1
  286. package/dist/core/tools/render-utils.d.ts +6 -0
  287. package/dist/core/tools/render-utils.d.ts.map +1 -1
  288. package/dist/core/tools/render-utils.js +26 -0
  289. package/dist/core/tools/render-utils.js.map +1 -1
  290. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  291. package/dist/core/tools/renderers/bash.js +9 -10
  292. package/dist/core/tools/renderers/bash.js.map +1 -1
  293. package/dist/core/tools/renderers/edit.d.ts.map +1 -1
  294. package/dist/core/tools/renderers/edit.js.map +1 -1
  295. package/dist/core/tools/renderers/find.d.ts.map +1 -1
  296. package/dist/core/tools/renderers/find.js.map +1 -1
  297. package/dist/core/tools/renderers/grep.d.ts.map +1 -1
  298. package/dist/core/tools/renderers/grep.js.map +1 -1
  299. package/dist/core/tools/renderers/index.d.ts.map +1 -1
  300. package/dist/core/tools/renderers/index.js.map +1 -1
  301. package/dist/core/tools/renderers/ls.d.ts.map +1 -1
  302. package/dist/core/tools/renderers/ls.js.map +1 -1
  303. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  304. package/dist/core/tools/renderers/read.js +3 -2
  305. package/dist/core/tools/renderers/read.js.map +1 -1
  306. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  307. package/dist/core/tools/renderers/write.js.map +1 -1
  308. package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
  309. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  310. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  311. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  312. package/dist/core/tools/truncate.d.ts +14 -0
  313. package/dist/core/tools/truncate.d.ts.map +1 -1
  314. package/dist/core/tools/truncate.js +29 -0
  315. package/dist/core/tools/truncate.js.map +1 -1
  316. package/dist/core/tools/write.d.ts.map +1 -1
  317. package/dist/core/tools/write.js.map +1 -1
  318. package/dist/core/trust-manager.d.ts.map +1 -1
  319. package/dist/core/trust-manager.js +1 -0
  320. package/dist/core/trust-manager.js.map +1 -1
  321. package/dist/core/usage-totals.d.ts +2 -0
  322. package/dist/core/usage-totals.d.ts.map +1 -1
  323. package/dist/core/usage-totals.js +23 -0
  324. package/dist/core/usage-totals.js.map +1 -1
  325. package/dist/core/virtual-models.d.ts +115 -0
  326. package/dist/core/virtual-models.d.ts.map +1 -0
  327. package/dist/core/virtual-models.js +117 -0
  328. package/dist/core/virtual-models.js.map +1 -0
  329. package/dist/extensions/codemode/execute.d.ts +16 -0
  330. package/dist/extensions/codemode/execute.d.ts.map +1 -0
  331. package/dist/extensions/codemode/execute.js +390 -0
  332. package/dist/extensions/codemode/execute.js.map +1 -0
  333. package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
  334. package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
  335. package/dist/extensions/codemode/execute.lazy.js +3 -0
  336. package/dist/extensions/codemode/execute.lazy.js.map +1 -0
  337. package/dist/extensions/codemode/index.d.ts +21 -0
  338. package/dist/extensions/codemode/index.d.ts.map +1 -0
  339. package/dist/extensions/codemode/index.js +31 -0
  340. package/dist/extensions/codemode/index.js.map +1 -0
  341. package/dist/extensions/codemode/renderer.d.ts +12 -0
  342. package/dist/extensions/codemode/renderer.d.ts.map +1 -0
  343. package/dist/extensions/codemode/renderer.js +119 -0
  344. package/dist/extensions/codemode/renderer.js.map +1 -0
  345. package/dist/extensions/codemode/tool.d.ts +122 -0
  346. package/dist/extensions/codemode/tool.d.ts.map +1 -0
  347. package/dist/extensions/codemode/tool.js +324 -0
  348. package/dist/extensions/codemode/tool.js.map +1 -0
  349. package/dist/extensions/codemode/worker.d.ts +7 -0
  350. package/dist/extensions/codemode/worker.d.ts.map +1 -0
  351. package/dist/extensions/codemode/worker.js +7 -0
  352. package/dist/extensions/codemode/worker.js.map +1 -0
  353. package/dist/extensions/index.d.ts.map +1 -1
  354. package/dist/extensions/index.js +11 -1
  355. package/dist/extensions/index.js.map +1 -1
  356. package/dist/extensions/llama/client.d.ts.map +1 -1
  357. package/dist/extensions/llama/client.js.map +1 -1
  358. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  359. package/dist/extensions/llama/huggingface.js.map +1 -1
  360. package/dist/extensions/llama/index.d.ts.map +1 -1
  361. package/dist/extensions/llama/index.js.map +1 -1
  362. package/dist/extensions/llama/provider.d.ts +1 -1
  363. package/dist/extensions/llama/provider.d.ts.map +1 -1
  364. package/dist/extensions/llama/provider.js +65 -13
  365. package/dist/extensions/llama/provider.js.map +1 -1
  366. package/dist/extensions/llama/ui.d.ts.map +1 -1
  367. package/dist/extensions/llama/ui.js.map +1 -1
  368. package/dist/extensions/mcp/cli.d.ts +21 -0
  369. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  370. package/dist/extensions/mcp/cli.js +485 -0
  371. package/dist/extensions/mcp/cli.js.map +1 -0
  372. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  373. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  374. package/dist/extensions/mcp/cli.lazy.js +3 -0
  375. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  376. package/dist/extensions/mcp/config.d.ts +70 -0
  377. package/dist/extensions/mcp/config.d.ts.map +1 -0
  378. package/dist/extensions/mcp/config.js +146 -0
  379. package/dist/extensions/mcp/config.js.map +1 -0
  380. package/dist/extensions/mcp/index.d.ts +52 -0
  381. package/dist/extensions/mcp/index.d.ts.map +1 -0
  382. package/dist/extensions/mcp/index.js +902 -0
  383. package/dist/extensions/mcp/index.js.map +1 -0
  384. package/dist/extensions/mcp/log.d.ts +16 -0
  385. package/dist/extensions/mcp/log.d.ts.map +1 -0
  386. package/dist/extensions/mcp/log.js +66 -0
  387. package/dist/extensions/mcp/log.js.map +1 -0
  388. package/dist/extensions/mcp/oauth.d.ts +94 -0
  389. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  390. package/dist/extensions/mcp/oauth.js +333 -0
  391. package/dist/extensions/mcp/oauth.js.map +1 -0
  392. package/dist/extensions/mcp/resources.d.ts +43 -0
  393. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  394. package/dist/extensions/mcp/resources.js +262 -0
  395. package/dist/extensions/mcp/resources.js.map +1 -0
  396. package/dist/extensions/mcp/runtime.d.ts +96 -0
  397. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  398. package/dist/extensions/mcp/runtime.js +388 -0
  399. package/dist/extensions/mcp/runtime.js.map +1 -0
  400. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  401. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  402. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  403. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  404. package/dist/extensions/mcp/tools.d.ts +83 -0
  405. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  406. package/dist/extensions/mcp/tools.js +233 -0
  407. package/dist/extensions/mcp/tools.js.map +1 -0
  408. package/dist/extensions/mcp/ui.d.ts +60 -0
  409. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  410. package/dist/extensions/mcp/ui.js +172 -0
  411. package/dist/extensions/mcp/ui.js.map +1 -0
  412. package/dist/extensions/tool-search/index.d.ts +12 -0
  413. package/dist/extensions/tool-search/index.d.ts.map +1 -0
  414. package/dist/extensions/tool-search/index.js +15 -0
  415. package/dist/extensions/tool-search/index.js.map +1 -0
  416. package/dist/extensions/tool-search/tool.d.ts +72 -0
  417. package/dist/extensions/tool-search/tool.d.ts.map +1 -0
  418. package/dist/extensions/tool-search/tool.js +210 -0
  419. package/dist/extensions/tool-search/tool.js.map +1 -0
  420. package/dist/index.d.ts +9 -2
  421. package/dist/index.d.ts.map +1 -1
  422. package/dist/index.js +5 -0
  423. package/dist/index.js.map +1 -1
  424. package/dist/main.d.ts.map +1 -1
  425. package/dist/main.js +10 -0
  426. package/dist/main.js.map +1 -1
  427. package/dist/migrations.d.ts.map +1 -1
  428. package/dist/migrations.js.map +1 -1
  429. package/dist/modes/index.d.ts.map +1 -1
  430. package/dist/modes/interactive/bug-report.d.ts.map +1 -1
  431. package/dist/modes/interactive/bug-report.js.map +1 -1
  432. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -1
  433. package/dist/modes/interactive/chat-viewport.js.map +1 -1
  434. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/armin.js.map +1 -1
  436. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  438. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  440. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  441. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  442. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  444. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  446. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  447. package/dist/modes/interactive/components/config-selector.js +13 -3
  448. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  449. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  451. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  452. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  453. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  455. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  457. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  458. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  459. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  460. package/dist/modes/interactive/components/diff.js.map +1 -1
  461. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  463. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  464. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  465. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  467. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  469. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  470. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  471. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  472. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  473. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  474. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  475. package/dist/modes/interactive/components/footer.d.ts +7 -0
  476. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/footer.js +43 -3
  478. package/dist/modes/interactive/components/footer.js.map +1 -1
  479. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  481. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  482. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  484. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  485. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  486. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  487. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  488. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  489. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  490. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  491. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  492. package/dist/modes/interactive/components/pi-logo.d.ts +12 -0
  493. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
  494. package/dist/modes/interactive/components/pi-logo.js +25 -0
  495. package/dist/modes/interactive/components/pi-logo.js.map +1 -0
  496. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  497. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  498. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  499. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  500. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  501. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  502. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  503. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  504. package/dist/modes/interactive/components/settings-selector.js +28 -6
  505. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  506. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  507. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  508. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  509. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  510. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  511. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  512. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  513. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  514. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  515. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  516. package/dist/modes/interactive/components/themed-text.d.ts +17 -0
  517. package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
  518. package/dist/modes/interactive/components/themed-text.js +29 -0
  519. package/dist/modes/interactive/components/themed-text.js.map +1 -0
  520. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  521. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  522. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/tool-execution.js +2 -2
  524. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  525. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  526. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  527. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  528. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  529. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  530. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  531. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  532. package/dist/modes/interactive/components/user-message.js.map +1 -1
  533. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  534. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  535. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  536. package/dist/modes/interactive/external-editor.js.map +1 -1
  537. package/dist/modes/interactive/interactive-mode.d.ts +11 -0
  538. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  539. package/dist/modes/interactive/interactive-mode.js +199 -161
  540. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  541. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
  542. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  543. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  544. package/dist/modes/interactive/model-search.js.map +1 -1
  545. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  546. package/dist/modes/interactive/session-share.js.map +1 -1
  547. package/dist/modes/interactive/theme/dark.json +59 -72
  548. package/dist/modes/interactive/theme/light.json +57 -69
  549. package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
  550. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
  551. package/dist/modes/interactive/theme/system-theme.js +535 -0
  552. package/dist/modes/interactive/theme/system-theme.js.map +1 -0
  553. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  554. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  555. package/dist/modes/interactive/theme/theme-controller.js +127 -47
  556. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  557. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  558. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -1
  559. package/dist/modes/interactive/theme/theme-json.js +3 -1
  560. package/dist/modes/interactive/theme/theme-json.js.map +1 -1
  561. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  562. package/dist/modes/interactive/theme/theme.d.ts +66 -39
  563. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  564. package/dist/modes/interactive/theme/theme.js +238 -317
  565. package/dist/modes/interactive/theme/theme.js.map +1 -1
  566. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  567. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
  568. package/dist/modes/interactive/tui-renderer.js +1 -0
  569. package/dist/modes/interactive/tui-renderer.js.map +1 -1
  570. package/dist/modes/json-event.d.ts.map +1 -1
  571. package/dist/modes/json-event.js.map +1 -1
  572. package/dist/modes/print-mode.d.ts.map +1 -1
  573. package/dist/modes/print-mode.js.map +1 -1
  574. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  575. package/dist/modes/rpc/jsonl.js.map +1 -1
  576. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  577. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  578. package/dist/modes/rpc/rpc-client.js +12 -8
  579. package/dist/modes/rpc/rpc-client.js.map +1 -1
  580. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  581. package/dist/modes/rpc/rpc-mode.js +7 -9
  582. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  583. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  584. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  585. package/dist/modes/rpc/rpc-types.js.map +1 -1
  586. package/dist/package-manager-cli.d.ts.map +1 -1
  587. package/dist/package-manager-cli.js +6 -2
  588. package/dist/package-manager-cli.js.map +1 -1
  589. package/dist/rpc-entry.d.ts.map +1 -1
  590. package/dist/rpc-entry.js.map +1 -1
  591. package/dist/utils/abort.d.ts.map +1 -1
  592. package/dist/utils/abort.js.map +1 -1
  593. package/dist/utils/ansi.d.ts.map +1 -1
  594. package/dist/utils/ansi.js.map +1 -1
  595. package/dist/utils/changelog.d.ts.map +1 -1
  596. package/dist/utils/changelog.js.map +1 -1
  597. package/dist/utils/child-process.d.ts.map +1 -1
  598. package/dist/utils/child-process.js.map +1 -1
  599. package/dist/utils/clipboard-command.d.ts.map +1 -1
  600. package/dist/utils/clipboard-command.js.map +1 -1
  601. package/dist/utils/clipboard-image.d.ts.map +1 -1
  602. package/dist/utils/clipboard-image.js +14 -17
  603. package/dist/utils/clipboard-image.js.map +1 -1
  604. package/dist/utils/clipboard.d.ts +2 -0
  605. package/dist/utils/clipboard.d.ts.map +1 -1
  606. package/dist/utils/clipboard.js +5 -0
  607. package/dist/utils/clipboard.js.map +1 -1
  608. package/dist/utils/deprecation.d.ts.map +1 -1
  609. package/dist/utils/deprecation.js.map +1 -1
  610. package/dist/utils/exif-orientation.d.ts.map +1 -1
  611. package/dist/utils/exif-orientation.js.map +1 -1
  612. package/dist/utils/frontmatter.d.ts.map +1 -1
  613. package/dist/utils/frontmatter.js.map +1 -1
  614. package/dist/utils/fs-watch.d.ts.map +1 -1
  615. package/dist/utils/fs-watch.js.map +1 -1
  616. package/dist/utils/git.d.ts.map +1 -1
  617. package/dist/utils/git.js.map +1 -1
  618. package/dist/utils/html.d.ts.map +1 -1
  619. package/dist/utils/html.js.map +1 -1
  620. package/dist/utils/image-convert.d.ts.map +1 -1
  621. package/dist/utils/image-convert.js.map +1 -1
  622. package/dist/utils/image-process.d.ts.map +1 -1
  623. package/dist/utils/image-process.js.map +1 -1
  624. package/dist/utils/image-resize-core.d.ts.map +1 -1
  625. package/dist/utils/image-resize-core.js.map +1 -1
  626. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  627. package/dist/utils/image-resize-worker.js.map +1 -1
  628. package/dist/utils/image-resize.d.ts.map +1 -1
  629. package/dist/utils/image-resize.js.map +1 -1
  630. package/dist/utils/json.d.ts.map +1 -1
  631. package/dist/utils/json.js.map +1 -1
  632. package/dist/utils/management-http.d.ts.map +1 -1
  633. package/dist/utils/management-http.js.map +1 -1
  634. package/dist/utils/mime.d.ts.map +1 -1
  635. package/dist/utils/mime.js.map +1 -1
  636. package/dist/utils/open-browser.d.ts.map +1 -1
  637. package/dist/utils/open-browser.js.map +1 -1
  638. package/dist/utils/paths.d.ts +3 -3
  639. package/dist/utils/paths.d.ts.map +1 -1
  640. package/dist/utils/paths.js +5 -4
  641. package/dist/utils/paths.js.map +1 -1
  642. package/dist/utils/photon.d.ts.map +1 -1
  643. package/dist/utils/photon.js.map +1 -1
  644. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  645. package/dist/utils/pi-user-agent.js.map +1 -1
  646. package/dist/utils/shell.d.ts +1 -3
  647. package/dist/utils/shell.d.ts.map +1 -1
  648. package/dist/utils/shell.js +3 -30
  649. package/dist/utils/shell.js.map +1 -1
  650. package/dist/utils/sleep.d.ts.map +1 -1
  651. package/dist/utils/sleep.js.map +1 -1
  652. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  653. package/dist/utils/syntax-highlight.js +2 -0
  654. package/dist/utils/syntax-highlight.js.map +1 -1
  655. package/dist/utils/text.d.ts.map +1 -1
  656. package/dist/utils/text.js.map +1 -1
  657. package/dist/utils/tool-result-images.d.ts.map +1 -1
  658. package/dist/utils/tool-result-images.js.map +1 -1
  659. package/dist/utils/tools-manager.d.ts.map +1 -1
  660. package/dist/utils/tools-manager.js.map +1 -1
  661. package/dist/utils/version-check.d.ts.map +1 -1
  662. package/dist/utils/version-check.js.map +1 -1
  663. package/dist/utils/windows-self-update.d.ts.map +1 -1
  664. package/dist/utils/windows-self-update.js.map +1 -1
  665. package/dist/utils/wsl.d.ts.map +1 -1
  666. package/dist/utils/wsl.js.map +1 -1
  667. package/dist/utils/zip.d.ts.map +1 -1
  668. package/dist/utils/zip.js.map +1 -1
  669. package/docs/cli.md +64 -3
  670. package/docs/configuration.md +2 -0
  671. package/docs/custom-provider.md +43 -4
  672. package/docs/docs.json +8 -0
  673. package/docs/extensions.md +55 -0
  674. package/docs/keybindings.md +1 -1
  675. package/docs/llama-cpp.md +13 -0
  676. package/docs/mcp.md +188 -0
  677. package/docs/models.md +35 -0
  678. package/docs/packages.md +4 -2
  679. package/docs/providers.md +1 -0
  680. package/docs/rpc-commands.md +9 -3
  681. package/docs/rpc.md +3 -1
  682. package/docs/sdk.md +7 -2
  683. package/docs/security.md +2 -0
  684. package/docs/session-format.md +5 -1
  685. package/docs/settings.md +20 -3
  686. package/docs/themes.md +33 -7
  687. package/docs/tui.md +18 -0
  688. package/docs/virtual-models.md +114 -0
  689. package/docs/windows.md +2 -0
  690. package/examples/README.md +1 -1
  691. package/examples/extensions/README.md +2 -0
  692. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  693. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  694. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  695. package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
  696. package/examples/extensions/debug-provider.ts +90 -0
  697. package/examples/extensions/gondolin/package-lock.json +2 -2
  698. package/examples/extensions/gondolin/package.json +1 -1
  699. package/examples/extensions/jev-router.ts +113 -0
  700. package/examples/extensions/sandbox/package-lock.json +2 -2
  701. package/examples/extensions/sandbox/package.json +1 -1
  702. package/examples/extensions/with-deps/package-lock.json +2 -2
  703. package/examples/extensions/with-deps/package.json +1 -1
  704. package/examples/rpc-client.ts +1 -1
  705. package/examples/rpc-extension-ui.ts +1 -1
  706. package/examples/sdk/14-codemode-mcp.ts +61 -0
  707. package/examples/sdk/README.md +2 -1
  708. package/npm-shrinkwrap.json +89 -39
  709. package/package.json +14 -12
  710. package/dist/bundle/chunks/anthropic-messages-J5WXPPPC.js +0 -6
  711. package/dist/bundle/chunks/azure-openai-responses-HUSQ3GP2.js +0 -2
  712. package/dist/bundle/chunks/chunk-65HAU2C5.js +0 -2
  713. package/dist/bundle/chunks/chunk-6R7UI4IY.js +0 -2
  714. package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
  715. package/dist/bundle/chunks/chunk-OJP47DM6.js +0 -1568
  716. package/dist/bundle/chunks/chunk-RCZIEVGO.js +0 -11
  717. package/dist/bundle/chunks/google-generative-ai-IMS5EK2Y.js +0 -2
  718. package/dist/bundle/chunks/google-vertex-O4YJEQUW.js +0 -2
  719. package/dist/bundle/chunks/mistral-conversations-NOSQHBEY.js +0 -5
  720. package/dist/bundle/chunks/openai-responses-HWEUZ6WZ.js +0 -2
  721. package/dist/bundle/chunks/virtual-modules-VHMJYYWQ.js +0 -2
@@ -1,11 +1,13 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { getCapabilities, } from "@earendil-works/pi-tui";
3
+ import { backgroundAnsi, colorToHex, colorToOklch, foregroundAnsi, getTerminalColorMode, indexedColor, mixColors, parseColor, rgbColor, styleTextWithAnsi, } from "@earendil-works/pi-tui";
4
4
  import chalk from "chalk";
5
5
  import { getCustomThemesDir, getThemesDir } from "../../../config.js";
6
6
  import { closeWatcher, watchWithErrorHandler } from "../../../utils/fs-watch.js";
7
7
  import { highlight, supportsLanguage } from "../../../utils/syntax-highlight.js";
8
8
  import { stripBom } from "../../../utils/text.js";
9
+ import { generateSystemThemeColors, SYSTEM_THEME_NAME, terminalAppearance } from "./system-theme.js";
10
+ export { SYSTEM_THEME_NAME } from "./system-theme.js";
9
11
  let themeJsonValidator;
10
12
  /**
11
13
  * Install full theme validation. Without it, documents are accepted as-is, which is what built-in
@@ -18,122 +20,8 @@ export function setThemeJsonValidator(validator) {
18
20
  // ============================================================================
19
21
  // Color Utilities
20
22
  // ============================================================================
21
- function hexToRgb(hex) {
22
- const cleaned = hex.replace("#", "");
23
- if (cleaned.length !== 6) {
24
- throw new Error(`Invalid hex color: ${hex}`);
25
- }
26
- const r = parseInt(cleaned.substring(0, 2), 16);
27
- const g = parseInt(cleaned.substring(2, 4), 16);
28
- const b = parseInt(cleaned.substring(4, 6), 16);
29
- if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) {
30
- throw new Error(`Invalid hex color: ${hex}`);
31
- }
32
- return { r, g, b };
33
- }
34
- // The 6x6x6 color cube channel values (indices 0-5)
35
- const CUBE_VALUES = [0, 95, 135, 175, 215, 255];
36
- // Grayscale ramp values (indices 232-255, 24 grays from 8 to 238)
37
- const GRAY_VALUES = Array.from({ length: 24 }, (_, i) => 8 + i * 10);
38
- function findClosestCubeIndex(value) {
39
- let minDist = Infinity;
40
- let minIdx = 0;
41
- for (let i = 0; i < CUBE_VALUES.length; i++) {
42
- const dist = Math.abs(value - CUBE_VALUES[i]);
43
- if (dist < minDist) {
44
- minDist = dist;
45
- minIdx = i;
46
- }
47
- }
48
- return minIdx;
49
- }
50
- function findClosestGrayIndex(gray) {
51
- let minDist = Infinity;
52
- let minIdx = 0;
53
- for (let i = 0; i < GRAY_VALUES.length; i++) {
54
- const dist = Math.abs(gray - GRAY_VALUES[i]);
55
- if (dist < minDist) {
56
- minDist = dist;
57
- minIdx = i;
58
- }
59
- }
60
- return minIdx;
61
- }
62
- function colorDistance(r1, g1, b1, r2, g2, b2) {
63
- // Weighted Euclidean distance (human eye is more sensitive to green)
64
- const dr = r1 - r2;
65
- const dg = g1 - g2;
66
- const db = b1 - b2;
67
- return dr * dr * 0.299 + dg * dg * 0.587 + db * db * 0.114;
68
- }
69
- function rgbTo256(r, g, b) {
70
- // Find closest color in the 6x6x6 cube
71
- const rIdx = findClosestCubeIndex(r);
72
- const gIdx = findClosestCubeIndex(g);
73
- const bIdx = findClosestCubeIndex(b);
74
- const cubeR = CUBE_VALUES[rIdx];
75
- const cubeG = CUBE_VALUES[gIdx];
76
- const cubeB = CUBE_VALUES[bIdx];
77
- const cubeIndex = 16 + 36 * rIdx + 6 * gIdx + bIdx;
78
- const cubeDist = colorDistance(r, g, b, cubeR, cubeG, cubeB);
79
- // Find closest grayscale
80
- const gray = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
81
- const grayIdx = findClosestGrayIndex(gray);
82
- const grayValue = GRAY_VALUES[grayIdx];
83
- const grayIndex = 232 + grayIdx;
84
- const grayDist = colorDistance(r, g, b, grayValue, grayValue, grayValue);
85
- // Check if color has noticeable saturation (hue matters)
86
- // If max-min spread is significant, prefer cube to preserve tint
87
- const maxC = Math.max(r, g, b);
88
- const minC = Math.min(r, g, b);
89
- const spread = maxC - minC;
90
- // Only consider grayscale if color is nearly neutral (spread < 10)
91
- // AND grayscale is actually closer
92
- if (spread < 10 && grayDist < cubeDist) {
93
- return grayIndex;
94
- }
95
- return cubeIndex;
96
- }
97
- function hexTo256(hex) {
98
- const { r, g, b } = hexToRgb(hex);
99
- return rgbTo256(r, g, b);
100
- }
101
- function fgAnsi(color, mode) {
102
- if (color === "")
103
- return "\x1b[39m";
104
- if (typeof color === "number")
105
- return `\x1b[38;5;${color}m`;
106
- if (color.startsWith("#")) {
107
- if (mode === "truecolor") {
108
- const { r, g, b } = hexToRgb(color);
109
- return `\x1b[38;2;${r};${g};${b}m`;
110
- }
111
- else {
112
- const index = hexTo256(color);
113
- return `\x1b[38;5;${index}m`;
114
- }
115
- }
116
- throw new Error(`Invalid color value: ${color}`);
117
- }
118
- function bgAnsi(color, mode) {
119
- if (color === "")
120
- return "\x1b[49m";
121
- if (typeof color === "number")
122
- return `\x1b[48;5;${color}m`;
123
- if (color.startsWith("#")) {
124
- if (mode === "truecolor") {
125
- const { r, g, b } = hexToRgb(color);
126
- return `\x1b[48;2;${r};${g};${b}m`;
127
- }
128
- else {
129
- const index = hexTo256(color);
130
- return `\x1b[48;5;${index}m`;
131
- }
132
- }
133
- throw new Error(`Invalid color value: ${color}`);
134
- }
135
23
  function resolveVarRefs(value, vars, visited = new Set()) {
136
- if (typeof value === "number" || value === "" || value.startsWith("#")) {
24
+ if (typeof value === "number" || value === "" || value.startsWith("#") || /^ok(lch|hsl)\(/i.test(value)) {
137
25
  return value;
138
26
  }
139
27
  if (visited.has(value)) {
@@ -162,6 +50,53 @@ function withThemeColorFallbacks(colors) {
162
50
  searchMatchText: colors.searchMatchText ?? colors.text,
163
51
  };
164
52
  }
53
+ // The terminal's reported colors. Replaced (never mutated) on update, so themes can cache resolved colors
54
+ // by identity.
55
+ let terminalColors = {};
56
+ // While the terminal color query is in flight, the system theme renders in grayscale.
57
+ let terminalColorsPending = false;
58
+ // The terminal's last light/dark report (mode 2031). Only used while it has not reported a background.
59
+ let terminalColorScheme;
60
+ /**
61
+ * Record the terminal's reported colors. Themes use the default colors for tokens set to "" (terminal
62
+ * default); the system theme is generated from all of them. Ends the pending state.
63
+ */
64
+ export function setTerminalColors(colors) {
65
+ terminalColors = { ...colors };
66
+ terminalColorsPending = false;
67
+ }
68
+ /** Record the terminal's light/dark report, the fallback for terminals that do not report their background. */
69
+ export function setTerminalColorScheme(scheme) {
70
+ terminalColorScheme = scheme;
71
+ }
72
+ /** Render the system theme in grayscale until `setTerminalColors()` reports the terminal's colors. */
73
+ export function markTerminalColorsPending() {
74
+ terminalColorsPending = true;
75
+ }
76
+ /** Assumed terminal default colors when the terminal does not report them. */
77
+ const GUESSED_DEFAULT_COLORS = {
78
+ dark: { foreground: parseColor("#e5e5e7"), background: parseColor("#000000") },
79
+ light: { foreground: parseColor("#000000"), background: parseColor("#ffffff") },
80
+ };
81
+ function averageLightness(colors) {
82
+ // Palette colors 0-15 follow the user's terminal palette, so they say nothing about the theme.
83
+ const fixed = colors.filter((color) => color.kind !== "indexed" || color.index >= 16);
84
+ if (fixed.length === 0)
85
+ return undefined;
86
+ return fixed.reduce((sum, color) => sum + colorToOklch(color).l, 0) / fixed.length;
87
+ }
88
+ /** Detect the background a theme is designed for from the lightness of its own colors. */
89
+ function detectAppearance(foregrounds, backgrounds) {
90
+ const fg = averageLightness(foregrounds);
91
+ const bg = averageLightness(backgrounds);
92
+ if (fg !== undefined && bg !== undefined)
93
+ return bg < fg ? "dark" : "light";
94
+ if (bg !== undefined)
95
+ return bg < 0.5 ? "dark" : "light";
96
+ if (fg !== undefined)
97
+ return fg > 0.5 ? "dark" : "light";
98
+ return undefined;
99
+ }
165
100
  // ============================================================================
166
101
  // Theme Class
167
102
  // ============================================================================
@@ -169,45 +104,115 @@ export class Theme {
169
104
  name;
170
105
  sourcePath;
171
106
  sourceInfo;
172
- fgColors;
173
- bgColors;
174
107
  mode;
108
+ // Precomputed escape sequences keep fg()/bg() on the render hot path to a lookup and concat.
109
+ fgAnsi = new Map();
110
+ bgAnsi = new Map();
111
+ // Tokens set to "" have no color of their own; `colors` fills them from the terminal defaults.
112
+ concreteColors = {};
113
+ defaultForegroundTokens = [];
114
+ defaultBackgroundTokens = [];
115
+ // Foreground tokens rendered faint (SGR 2) on top of their color.
116
+ dimTokens;
117
+ ownAppearance;
118
+ resolvedColors;
175
119
  constructor(fgColors, bgColors, mode, options = {}) {
176
120
  this.name = options.name;
177
121
  this.sourcePath = options.sourcePath;
178
122
  this.sourceInfo = options.sourceInfo;
179
123
  this.mode = mode;
180
- this.fgColors = new Map();
181
- const colors = {
124
+ this.dimTokens = new Set(options.dim);
125
+ const foregrounds = {
182
126
  ...fgColors,
183
127
  scrollbarTrack: fgColors.scrollbarTrack ?? fgColors.muted,
184
128
  scrollbarThumb: fgColors.scrollbarThumb ?? fgColors.text,
185
129
  thinkingMax: fgColors.thinkingMax ?? fgColors.thinkingXhigh,
186
130
  searchMatchText: fgColors.searchMatchText ?? fgColors.text,
187
131
  };
188
- for (const [key, value] of Object.entries(colors)) {
189
- this.fgColors.set(key, fgAnsi(value, mode));
190
- }
191
- this.bgColors = new Map();
192
- const backgrounds = {
193
- ...bgColors,
194
- searchMatchBg: bgColors.searchMatchBg ?? bgColors.selectedBg,
132
+ const backgrounds = { ...bgColors, searchMatchBg: bgColors.searchMatchBg ?? bgColors.selectedBg };
133
+ const concreteForegrounds = [];
134
+ const concreteBackgrounds = [];
135
+ // Returns the escape sequence for the token's own slot.
136
+ const addToken = (token, value, isBackground) => {
137
+ if (value === "") {
138
+ (isBackground ? this.defaultBackgroundTokens : this.defaultForegroundTokens).push(token);
139
+ return isBackground ? "\x1b[49m" : "\x1b[39m";
140
+ }
141
+ const color = parseColor(value);
142
+ this.concreteColors[token] = color;
143
+ (isBackground ? concreteBackgrounds : concreteForegrounds).push(color);
144
+ return isBackground ? backgroundAnsi(color, mode) : foregroundAnsi(color, mode);
195
145
  };
196
- for (const [key, value] of Object.entries(backgrounds)) {
197
- this.bgColors.set(key, bgAnsi(value, mode));
146
+ for (const [token, value] of Object.entries(foregrounds)) {
147
+ this.fgAnsi.set(token, addToken(token, value, false));
148
+ }
149
+ for (const [token, value] of Object.entries(backgrounds)) {
150
+ this.bgAnsi.set(token, addToken(token, value, true));
198
151
  }
152
+ this.ownAppearance = options.appearance ?? detectAppearance(concreteForegrounds, concreteBackgrounds);
153
+ }
154
+ /**
155
+ * The background the theme is designed for: declared in the theme JSON, detected from its colors,
156
+ * or, for themes without usable colors, the terminal's appearance.
157
+ */
158
+ get appearance() {
159
+ return this.ownAppearance ?? getTerminalTheme();
160
+ }
161
+ /**
162
+ * Concrete colors for all tokens. Tokens set to "" (terminal default) use the terminal's reported
163
+ * default colors, or a guess based on `appearance` when the terminal did not report them. Faint
164
+ * tokens are approximated by mixing their color toward the background.
165
+ */
166
+ get colors() {
167
+ const terminal = terminalColors;
168
+ if (this.resolvedColors?.terminal !== terminal) {
169
+ const guess = GUESSED_DEFAULT_COLORS[this.appearance];
170
+ const toColor = (rgb, fallback) => rgb ? rgbColor(rgb.r, rgb.g, rgb.b) : fallback;
171
+ const foreground = toColor(terminal.foreground, guess.foreground);
172
+ const background = toColor(terminal.background, guess.background);
173
+ const colors = { ...this.concreteColors };
174
+ for (const token of this.defaultForegroundTokens)
175
+ colors[token] = foreground;
176
+ for (const token of this.defaultBackgroundTokens)
177
+ colors[token] = background;
178
+ for (const token of this.dimTokens) {
179
+ const color = colors[token];
180
+ if (color)
181
+ colors[token] = mixColors(color, background, 0.4);
182
+ }
183
+ this.resolvedColors = { terminal, colors: Object.freeze(colors) };
184
+ }
185
+ return this.resolvedColors.colors;
186
+ }
187
+ style(text, options) {
188
+ const { fg, bg } = options;
189
+ if (typeof fg === "string" && this.dimTokens.has(fg))
190
+ options = { ...options, dim: true };
191
+ return styleTextWithAnsi(text, fg === undefined
192
+ ? undefined
193
+ : typeof fg === "string"
194
+ ? this.tokenAnsi(this.fgAnsi, fg)
195
+ : foregroundAnsi(fg, this.mode), bg === undefined
196
+ ? undefined
197
+ : typeof bg === "string"
198
+ ? this.tokenAnsi(this.bgAnsi, bg)
199
+ : backgroundAnsi(bg, this.mode), options);
199
200
  }
200
201
  fg(color, text) {
201
- const ansi = this.fgColors.get(color);
202
- if (!ansi)
203
- throw new Error(`Unknown theme color: ${color}`);
204
- return `${ansi}${text}\x1b[39m`; // Reset only foreground color
202
+ const ansi = this.tokenAnsi(this.fgAnsi, color);
203
+ if (this.dimTokens.has(color))
204
+ return `${ansi}\x1b[2m${text}\x1b[22;39m`;
205
+ return `${ansi}${text}\x1b[39m`;
205
206
  }
206
207
  bg(color, text) {
207
- const ansi = this.bgColors.get(color);
208
- if (!ansi)
209
- throw new Error(`Unknown theme background color: ${color}`);
210
- return `${ansi}${text}\x1b[49m`; // Reset only background color
208
+ const ansi = this.tokenAnsi(this.bgAnsi, color);
209
+ return `${ansi}${text}\x1b[49m`;
210
+ }
211
+ tokenAnsi(ansi, token) {
212
+ const value = ansi.get(token);
213
+ if (value === undefined)
214
+ throw new Error(`Unknown theme color: ${token}`);
215
+ return value;
211
216
  }
212
217
  bold(text) {
213
218
  return chalk.bold(text);
@@ -224,17 +229,13 @@ export class Theme {
224
229
  strikethrough(text) {
225
230
  return chalk.strikethrough(text);
226
231
  }
232
+ /** Opening escape sequence for a foreground token. Faint tokens include SGR 2, which `\x1b[22m` closes. */
227
233
  getFgAnsi(color) {
228
- const ansi = this.fgColors.get(color);
229
- if (!ansi)
230
- throw new Error(`Unknown theme color: ${color}`);
231
- return ansi;
234
+ const ansi = this.tokenAnsi(this.fgAnsi, color);
235
+ return this.dimTokens.has(color) ? `${ansi}\x1b[2m` : ansi;
232
236
  }
233
237
  getBgAnsi(color) {
234
- const ansi = this.bgColors.get(color);
235
- if (!ansi)
236
- throw new Error(`Unknown theme background color: ${color}`);
237
- return ansi;
238
+ return this.tokenAnsi(this.bgAnsi, color);
238
239
  }
239
240
  getColorMode() {
240
241
  return this.mode;
@@ -294,7 +295,8 @@ export function getAvailableThemesWithPaths() {
294
295
  seen.add(themeInfo.name);
295
296
  result.push(themeInfo);
296
297
  };
297
- // Built-in themes
298
+ // Built-in themes. The system theme is generated, so it has no file.
299
+ addTheme({ name: SYSTEM_THEME_NAME, path: undefined });
298
300
  for (const name of Object.keys(getBuiltinThemes())) {
299
301
  addTheme({ name, path: path.join(themesDir, `${name}.json`) });
300
302
  }
@@ -305,7 +307,8 @@ export function getAvailableThemesWithPaths() {
305
307
  for (const [name, theme] of registeredThemes.entries()) {
306
308
  addTheme({ name, path: theme.sourcePath });
307
309
  }
308
- return result.sort((a, b) => a.name.localeCompare(b.name));
310
+ // The system theme comes first: it is the default and adapts to every terminal.
311
+ return result.sort((a, b) => a.name === SYSTEM_THEME_NAME ? -1 : b.name === SYSTEM_THEME_NAME ? 1 : a.name.localeCompare(b.name));
309
312
  }
310
313
  function getCustomThemeInfos() {
311
314
  const customThemesDir = getCustomThemesDir();
@@ -375,31 +378,50 @@ function loadThemeJson(name) {
375
378
  const content = fs.readFileSync(themePath, "utf-8");
376
379
  return parseThemeJsonContent(name, content);
377
380
  }
378
- function createTheme(themeJson, mode, sourcePath) {
379
- const colorMode = mode ?? (getCapabilities().trueColor ? "truecolor" : "256color");
380
- const resolvedColors = resolveThemeColors(withThemeColorFallbacks(themeJson.colors), themeJson.vars);
381
+ const BACKGROUND_TOKENS = new Set([
382
+ "selectedBg",
383
+ "searchMatchBg",
384
+ "userMessageBg",
385
+ "customMessageBg",
386
+ "toolPendingBg",
387
+ "toolSuccessBg",
388
+ "toolErrorBg",
389
+ ]);
390
+ function splitThemeColors(colors) {
381
391
  const fgColors = {};
382
392
  const bgColors = {};
383
- const bgColorKeys = new Set([
384
- "selectedBg",
385
- "searchMatchBg",
386
- "userMessageBg",
387
- "customMessageBg",
388
- "toolPendingBg",
389
- "toolSuccessBg",
390
- "toolErrorBg",
391
- ]);
392
- for (const [key, value] of Object.entries(resolvedColors)) {
393
- if (bgColorKeys.has(key)) {
393
+ for (const [key, value] of Object.entries(colors)) {
394
+ if (BACKGROUND_TOKENS.has(key)) {
394
395
  bgColors[key] = value;
395
396
  }
396
397
  else {
397
398
  fgColors[key] = value;
398
399
  }
399
400
  }
401
+ return { fgColors, bgColors };
402
+ }
403
+ function createTheme(themeJson, mode, sourcePath) {
404
+ const colorMode = mode ?? getTerminalColorMode();
405
+ const resolvedColors = resolveThemeColors(withThemeColorFallbacks(themeJson.colors), themeJson.vars);
406
+ const { fgColors, bgColors } = splitThemeColors(resolvedColors);
400
407
  return new Theme(fgColors, bgColors, colorMode, {
401
408
  name: themeJson.name,
402
409
  sourcePath,
410
+ appearance: themeJson.appearance,
411
+ });
412
+ }
413
+ /** Generate the system theme from the terminal's reported colors (grayscale while they are pending). */
414
+ function createSystemTheme(mode) {
415
+ const generated = generateSystemThemeColors({
416
+ ...terminalColors,
417
+ saturation: terminalColorsPending ? 0 : 1,
418
+ appearanceHint: getTerminalTheme(),
419
+ });
420
+ const { fgColors, bgColors } = splitThemeColors(generated.colors);
421
+ return new Theme(fgColors, bgColors, mode ?? getTerminalColorMode(), {
422
+ name: SYSTEM_THEME_NAME,
423
+ appearance: generated.appearance,
424
+ dim: generated.dim,
403
425
  });
404
426
  }
405
427
  export function loadThemeFromPath(themePath, mode) {
@@ -408,6 +430,9 @@ export function loadThemeFromPath(themePath, mode) {
408
430
  return createTheme(themeJson, mode, themePath);
409
431
  }
410
432
  function loadTheme(name, mode) {
433
+ // The system theme name is reserved: it takes precedence over custom themes of the same name.
434
+ if (name === SYSTEM_THEME_NAME)
435
+ return createSystemTheme(mode);
411
436
  const registeredTheme = registeredThemes.get(name);
412
437
  if (registeredTheme) {
413
438
  return registeredTheme;
@@ -448,95 +473,45 @@ export function resolveThemeSetting(themeSetting, terminalTheme) {
448
473
  return themeSetting;
449
474
  return undefined;
450
475
  }
451
- function getColorFgBgBackgroundIndex(colorfgbg) {
452
- const parts = colorfgbg.split(";");
453
- for (let i = parts.length - 1; i >= 0; i--) {
454
- const bg = parseInt(parts[i].trim(), 10);
455
- if (Number.isInteger(bg) && bg >= 0 && bg <= 255) {
456
- return bg;
457
- }
458
- }
459
- return undefined;
460
- }
461
- function getRgbColorLuminance({ r, g, b }) {
462
- const toLinear = (channel) => {
463
- const value = channel / 255;
464
- return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
465
- };
466
- return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
467
- }
468
- function getAnsiColorLuminance(index) {
469
- return getRgbColorLuminance(hexToRgb(ansi256ToHex(index)));
470
- }
471
- export function getThemeForRgbColor(rgb) {
472
- return getRgbColorLuminance(rgb) >= 0.5 ? "light" : "dark";
473
- }
474
- export function detectTerminalBackgroundFromEnv(options = {}) {
475
- const env = options.env ?? process.env;
476
- const colorfgbg = env.COLORFGBG || "";
477
- const bg = getColorFgBgBackgroundIndex(colorfgbg);
478
- if (bg !== undefined) {
479
- return {
480
- theme: getAnsiColorLuminance(bg) >= 0.5 ? "light" : "dark",
481
- source: "COLORFGBG",
482
- detail: `background color index ${bg}`,
483
- confidence: "high",
484
- };
485
- }
486
- return {
487
- theme: "dark",
488
- source: "fallback",
489
- detail: "no terminal background hint found",
490
- confidence: "low",
491
- };
492
- }
493
- export async function detectTerminalBackgroundTheme({ ui, timeoutMs, env, }) {
494
- try {
495
- const rgb = await ui.queryTerminalBackgroundColor({ timeoutMs });
496
- if (rgb) {
497
- return {
498
- theme: getThemeForRgbColor(rgb),
499
- source: "terminal background",
500
- detail: `OSC 11 background rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`,
501
- confidence: "high",
502
- };
503
- }
504
- }
505
- catch {
506
- // Fall back to environment-based detection when the terminal query fails.
507
- }
508
- return detectTerminalBackgroundFromEnv({ env });
476
+ /**
477
+ * Dark or light from the `COLORFGBG` environment variable some terminals set, or undefined without a
478
+ * usable background index. The value is `fg;bg` or `fg;xpm;bg` (rxvt), where a field is an ANSI color
479
+ * index or `default` when the color is not in the palette. The index refers to the terminal's own palette,
480
+ * whose colors are unknown here, so it is classified by index like Vim does: 0-6 and 8 (bright black, e.g.
481
+ * Solarized Dark's background) are dark, 7 and 9-15 are light.
482
+ */
483
+ export function detectColorFgBgTheme(env = process.env) {
484
+ const bg = env.COLORFGBG?.split(";").at(-1)?.trim();
485
+ if (!bg || !/^\d{1,2}$/.test(bg))
486
+ return undefined;
487
+ const index = Number(bg);
488
+ if (index > 15)
489
+ return undefined;
490
+ return index <= 6 || index === 8 ? "dark" : "light";
509
491
  }
510
- export async function detectTerminalThemeForAuto({ ui, timeoutMs, env, }) {
511
- let colorSchemePromise;
512
- try {
513
- colorSchemePromise = ui.queryTerminalColorScheme?.({ timeoutMs });
514
- }
515
- catch {
516
- // Fall back to OSC 11 / COLORFGBG detection when starting the color-scheme query fails.
517
- }
518
- const backgroundThemePromise = detectTerminalBackgroundTheme({ ui, timeoutMs, env });
519
- try {
520
- const colorScheme = await colorSchemePromise;
521
- if (colorScheme)
522
- return colorScheme;
523
- }
524
- catch {
525
- // Fall back to the concurrently queried OSC 11 / COLORFGBG detection.
526
- }
527
- return (await backgroundThemePromise).theme;
492
+ /**
493
+ * Whether the terminal is dark or light. The background it renders decides, classified the same way the
494
+ * system theme does. Without a reported background: the terminal's light/dark report, then COLORFGBG,
495
+ * then dark.
496
+ */
497
+ export function detectTerminalTheme(colors = {}, reportedScheme, env = process.env) {
498
+ const { background, foreground } = colors;
499
+ if (background)
500
+ return terminalAppearance(background, foreground);
501
+ return reportedScheme ?? detectColorFgBgTheme(env) ?? "dark";
528
502
  }
529
- export function getDefaultTheme() {
530
- return detectTerminalBackgroundFromEnv().theme;
503
+ /** Whether the terminal is dark or light, from everything it reported so far. See `detectTerminalTheme()`. */
504
+ export function getTerminalTheme() {
505
+ return detectTerminalTheme(terminalColors, terminalColorScheme);
531
506
  }
532
507
  // ============================================================================
533
508
  // Global Theme Instance
534
509
  // ============================================================================
535
- // Use globalThis to share theme across module loaders (tsx + jiti in dev mode)
510
+ // Use globalThis to share theme across module loaders (node + jiti in dev mode)
536
511
  const THEME_KEY = Symbol.for("@earendil-works/pi-coding-agent:theme");
537
512
  const THEME_KEY_OLD = Symbol.for("@mariozechner/pi-coding-agent:theme");
538
513
  // Export theme as a getter that reads from globalThis
539
- // This ensures all module instances (tsx, jiti) see the same theme
514
+ // This ensures all module instances (node, jiti) see the same theme
540
515
  export const theme = new Proxy({}, {
541
516
  get(_target, prop) {
542
517
  const t = globalThis[THEME_KEY];
@@ -564,7 +539,7 @@ export function setRegisteredThemes(themes) {
564
539
  }
565
540
  }
566
541
  export function initTheme(themeName, enableWatcher = false) {
567
- const name = themeName ?? getDefaultTheme();
542
+ const name = themeName ?? SYSTEM_THEME_NAME;
568
543
  currentThemeName = name;
569
544
  try {
570
545
  setGlobalTheme(loadTheme(name));
@@ -573,9 +548,9 @@ export function initTheme(themeName, enableWatcher = false) {
573
548
  }
574
549
  }
575
550
  catch (_error) {
576
- // Theme is invalid - fall back to dark theme silently
577
- currentThemeName = "dark";
578
- setGlobalTheme(loadTheme("dark"));
551
+ // Theme is invalid - fall back to the system theme silently
552
+ currentThemeName = SYSTEM_THEME_NAME;
553
+ setGlobalTheme(loadTheme(SYSTEM_THEME_NAME));
579
554
  // Don't start watcher for fallback theme
580
555
  }
581
556
  }
@@ -592,9 +567,9 @@ export function setTheme(name, enableWatcher = false) {
592
567
  return { success: true };
593
568
  }
594
569
  catch (error) {
595
- // Theme is invalid - fall back to dark theme
596
- currentThemeName = "dark";
597
- setGlobalTheme(loadTheme("dark"));
570
+ // Theme is invalid - fall back to the system theme
571
+ currentThemeName = SYSTEM_THEME_NAME;
572
+ setGlobalTheme(loadTheme(SYSTEM_THEME_NAME));
598
573
  // Don't start watcher for fallback theme
599
574
  return {
600
575
  success: false,
@@ -616,7 +591,10 @@ export function onThemeChange(callback) {
616
591
  function startThemeWatcher() {
617
592
  stopThemeWatcher();
618
593
  // Only watch if it's a custom theme (not built-in)
619
- if (!currentThemeName || currentThemeName === "dark" || currentThemeName === "light") {
594
+ if (!currentThemeName ||
595
+ currentThemeName === "dark" ||
596
+ currentThemeName === "light" ||
597
+ currentThemeName === SYSTEM_THEME_NAME) {
620
598
  return;
621
599
  }
622
600
  const customThemesDir = getCustomThemesDir();
@@ -685,102 +663,45 @@ export function stopThemeWatcher() {
685
663
  // ============================================================================
686
664
  // HTML Export Helpers
687
665
  // ============================================================================
688
- /**
689
- * Convert a 256-color index to hex string.
690
- * Indices 0-15: basic colors (approximate)
691
- * Indices 16-231: 6x6x6 color cube
692
- * Indices 232-255: grayscale ramp
693
- */
694
- function ansi256ToHex(index) {
695
- // Basic colors (0-15) - approximate common terminal values
696
- const basicColors = [
697
- "#000000",
698
- "#800000",
699
- "#008000",
700
- "#808000",
701
- "#000080",
702
- "#800080",
703
- "#008080",
704
- "#c0c0c0",
705
- "#808080",
706
- "#ff0000",
707
- "#00ff00",
708
- "#ffff00",
709
- "#0000ff",
710
- "#ff00ff",
711
- "#00ffff",
712
- "#ffffff",
713
- ];
714
- if (index < 16) {
715
- return basicColors[index];
716
- }
717
- // Color cube (16-231): 6x6x6 = 216 colors
718
- if (index < 232) {
719
- const cubeIndex = index - 16;
720
- const r = Math.floor(cubeIndex / 36);
721
- const g = Math.floor((cubeIndex % 36) / 6);
722
- const b = cubeIndex % 6;
723
- const toHex = (n) => (n === 0 ? 0 : 55 + n * 40).toString(16).padStart(2, "0");
724
- return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
725
- }
726
- // Grayscale (232-255): 24 shades
727
- const gray = 8 + (index - 232) * 10;
728
- const grayHex = gray.toString(16).padStart(2, "0");
729
- return `#${grayHex}${grayHex}${grayHex}`;
730
- }
731
666
  /**
732
667
  * Get resolved theme colors as CSS-compatible hex strings.
733
668
  * Used by HTML export to generate CSS custom properties.
734
669
  */
735
670
  export function getResolvedThemeColors(themeName) {
736
- const name = themeName ?? currentThemeName ?? getDefaultTheme();
737
- const isLight = name === "light";
738
- const themeJson = loadThemeJson(name);
739
- const resolved = resolveThemeColors(withThemeColorFallbacks(themeJson.colors), themeJson.vars);
740
- // Default text color for empty values (terminal uses default fg color)
741
- const defaultText = isLight ? "#000000" : "#e5e5e7";
742
- const cssColors = {};
743
- for (const [key, value] of Object.entries(resolved)) {
744
- if (typeof value === "number") {
745
- cssColors[key] = ansi256ToHex(value);
746
- }
747
- else if (value === "") {
748
- // Empty means default terminal color - use sensible fallback for HTML
749
- cssColors[key] = defaultText;
750
- }
751
- else {
752
- cssColors[key] = value;
753
- }
754
- }
755
- return cssColors;
671
+ const colors = loadTheme(themeName ?? currentThemeName ?? SYSTEM_THEME_NAME).colors;
672
+ return Object.fromEntries(Object.entries(colors).map(([token, color]) => [token, colorToHex(color)]));
756
673
  }
757
674
  /**
758
675
  * Check if a theme is a "light" theme (for CSS that needs light/dark variants).
759
676
  */
760
677
  export function isLightTheme(themeName) {
761
- // Currently just check the name - could be extended to analyze colors
762
- return themeName === "light";
678
+ return loadTheme(themeName ?? currentThemeName ?? SYSTEM_THEME_NAME).appearance === "light";
763
679
  }
764
680
  /**
765
681
  * Get explicit export colors from theme JSON, if specified.
766
682
  * Returns undefined for each color that isn't explicitly set.
767
683
  */
768
684
  export function getThemeExportColors(themeName) {
769
- const name = themeName ?? currentThemeName ?? getDefaultTheme();
685
+ const name = themeName ?? currentThemeName ?? SYSTEM_THEME_NAME;
686
+ if (name === SYSTEM_THEME_NAME)
687
+ return {};
770
688
  try {
771
689
  const themeJson = loadThemeJson(name);
772
690
  const exportSection = themeJson.export;
773
691
  if (!exportSection)
774
692
  return {};
775
693
  const vars = themeJson.vars ?? {};
694
+ // Export colors end up in CSS, which understands hex and oklch() values directly but not okhsl().
776
695
  const resolve = (value) => {
777
696
  if (value === undefined)
778
697
  return undefined;
779
698
  const resolved = resolveVarRefs(value, vars);
780
699
  if (typeof resolved === "number")
781
- return ansi256ToHex(resolved);
700
+ return colorToHex(indexedColor(resolved));
782
701
  if (resolved === "")
783
702
  return undefined;
703
+ if (/^okhsl\(/i.test(resolved))
704
+ return colorToHex(parseColor(resolved));
784
705
  return resolved;
785
706
  };
786
707
  return {
@@ -940,7 +861,7 @@ export function getMarkdownTheme() {
940
861
  bold: (text) => theme.bold(text),
941
862
  italic: (text) => theme.italic(text),
942
863
  underline: (text) => theme.underline(text),
943
- strikethrough: (text) => chalk.strikethrough(text),
864
+ strikethrough: (text) => theme.strikethrough(text),
944
865
  highlightCode: (code, lang) => {
945
866
  // Validate language before highlighting to avoid stderr spam from cli-highlight
946
867
  const validLang = lang && supportsLanguage(lang) ? lang : undefined;