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