@astralyn/pi 1.0.5 → 1.2.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 (436) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/bundle/chunks/anthropic-messages-NVP5OPIM.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +1 -1
  4. package/dist/bundle/chunks/{azure-openai-responses-LDW4FGAQ.js → azure-openai-responses-IBTOZ5MH.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  6. package/dist/bundle/chunks/chunk-4XZYHGVN.js +11 -0
  7. package/dist/bundle/chunks/{chunk-GIG5IHES.js → chunk-5KJH3GGH.js} +1 -1
  8. package/dist/bundle/chunks/chunk-6VYRLG5F.js +2 -0
  9. package/dist/bundle/chunks/{chunk-UCXU7KLO.js → chunk-7HJ6CHUB.js} +1 -1
  10. package/dist/bundle/chunks/chunk-7UBIBLPN.js +2 -0
  11. package/dist/bundle/chunks/{chunk-IE3Z7ESB.js → chunk-A5HU4TE6.js} +418 -362
  12. package/dist/bundle/chunks/{chunk-HDHRZ7GT.js → chunk-B2UOWO4A.js} +1 -1
  13. package/dist/bundle/chunks/chunk-J75WV3FL.js +2 -0
  14. package/dist/bundle/chunks/{chunk-A6ALEEY5.js → chunk-LHSPN2IO.js} +1 -1
  15. package/dist/bundle/chunks/chunk-Q74S7ILH.js +2 -0
  16. package/dist/bundle/chunks/chunk-QDDSFJ35.js +2 -0
  17. package/dist/bundle/chunks/{chunk-IFELM7MW.js → chunk-UQECUCUH.js} +1 -1
  18. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-HGOVFZDC.js +2 -0
  19. package/dist/bundle/chunks/codemode-worker.js +18 -10
  20. package/dist/bundle/chunks/github-copilot.js +1 -1
  21. package/dist/bundle/chunks/{google-generative-ai-S5A5IBU4.js → google-generative-ai-M44TSMAN.js} +1 -1
  22. package/dist/bundle/chunks/{google-vertex-UBRQFDB4.js → google-vertex-3C4OWLFX.js} +1 -1
  23. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  24. package/dist/bundle/chunks/{llama-cpp-classify-R7DQLTQN.js → llama-cpp-classify-H3IZDR5O.js} +2 -2
  25. package/dist/bundle/chunks/mistral-conversations-I5PL4VCZ.js +5 -0
  26. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  27. package/dist/bundle/chunks/openai-codex-responses-O5EUDL54.js +10 -0
  28. package/dist/bundle/chunks/openai-codex.js +1 -1
  29. package/dist/bundle/chunks/{openai-completions-H4VMO7AU.js → openai-completions-X3SSG5BQ.js} +1 -1
  30. package/dist/bundle/chunks/openai-decisions-TVCDIPZX.js +5 -0
  31. package/dist/bundle/chunks/{openai-responses-G4PGNM2H.js → openai-responses-NYPNKVDV.js} +1 -1
  32. package/dist/bundle/chunks/{openrouter-images-YP3YVB54.js → openrouter-images-TDLJV5N4.js} +1 -1
  33. package/dist/bundle/chunks/{pi-messages-HZZ7GEEW.js → pi-messages-ZXNERWJG.js} +1 -1
  34. package/dist/bundle/chunks/typesafe-system-one-LWPJYTJP.js +2 -0
  35. package/dist/bundle/chunks/{virtual-modules-46MSJGKO.js → virtual-modules-OZTPKGU7.js} +1 -1
  36. package/dist/bundle/cli.js +1 -1
  37. package/dist/bundle/index.js +1 -1
  38. package/dist/bundle/rpc-entry.js +1 -1
  39. package/dist/cli/args.d.ts +1 -1
  40. package/dist/cli/args.d.ts.map +1 -1
  41. package/dist/cli/args.js +13 -1
  42. package/dist/cli/args.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +26 -7
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +190 -183
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/auth-storage.d.ts.map +1 -1
  48. package/dist/core/auth-storage.js +20 -13
  49. package/dist/core/auth-storage.js.map +1 -1
  50. package/dist/core/bash-executor.d.ts.map +1 -1
  51. package/dist/core/bash-executor.js +40 -45
  52. package/dist/core/bash-executor.js.map +1 -1
  53. package/dist/core/bug-report.d.ts +9 -1
  54. package/dist/core/bug-report.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.d.ts +6 -0
  56. package/dist/core/compaction/utils.d.ts.map +1 -1
  57. package/dist/core/compaction/utils.js +7 -8
  58. package/dist/core/compaction/utils.js.map +1 -1
  59. package/dist/core/context-snapshot.d.ts +4 -1
  60. package/dist/core/context-snapshot.d.ts.map +1 -1
  61. package/dist/core/context-snapshot.js +45 -0
  62. package/dist/core/context-snapshot.js.map +1 -1
  63. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  64. package/dist/core/export-html/tool-renderer.js +2 -0
  65. package/dist/core/export-html/tool-renderer.js.map +1 -1
  66. package/dist/core/extensions/index.d.ts +1 -1
  67. package/dist/core/extensions/index.d.ts.map +1 -1
  68. package/dist/core/extensions/index.js.map +1 -1
  69. package/dist/core/extensions/runner.d.ts +4 -2
  70. package/dist/core/extensions/runner.d.ts.map +1 -1
  71. package/dist/core/extensions/runner.js +2 -3
  72. package/dist/core/extensions/runner.js.map +1 -1
  73. package/dist/core/extensions/types.d.ts +42 -7
  74. package/dist/core/extensions/types.d.ts.map +1 -1
  75. package/dist/core/extensions/types.js.map +1 -1
  76. package/dist/core/key-id-schema.d.ts +6 -0
  77. package/dist/core/key-id-schema.d.ts.map +1 -0
  78. package/dist/core/key-id-schema.js +16 -0
  79. package/dist/core/key-id-schema.js.map +1 -0
  80. package/dist/core/keybinding-registry.d.ts +4 -3
  81. package/dist/core/keybinding-registry.d.ts.map +1 -1
  82. package/dist/core/keybinding-registry.js +4 -3
  83. package/dist/core/keybinding-registry.js.map +1 -1
  84. package/dist/core/keybindings-schema.d.ts +4 -0
  85. package/dist/core/keybindings-schema.d.ts.map +1 -0
  86. package/dist/core/keybindings-schema.js +16 -0
  87. package/dist/core/keybindings-schema.js.map +1 -0
  88. package/dist/core/keybindings.d.ts +258 -81
  89. package/dist/core/keybindings.d.ts.map +1 -1
  90. package/dist/core/keybindings.js +27 -24
  91. package/dist/core/keybindings.js.map +1 -1
  92. package/dist/core/model-config.d.ts +713 -180
  93. package/dist/core/model-config.d.ts.map +1 -1
  94. package/dist/core/model-config.js +18 -179
  95. package/dist/core/model-config.js.map +1 -1
  96. package/dist/core/model-runtime.d.ts.map +1 -1
  97. package/dist/core/model-runtime.js +13 -7
  98. package/dist/core/model-runtime.js.map +1 -1
  99. package/dist/core/nested-tool-calls.d.ts +1 -0
  100. package/dist/core/nested-tool-calls.d.ts.map +1 -1
  101. package/dist/core/nested-tool-calls.js +1 -0
  102. package/dist/core/nested-tool-calls.js.map +1 -1
  103. package/dist/core/package-manager.d.ts.map +1 -1
  104. package/dist/core/package-manager.js +3 -3
  105. package/dist/core/package-manager.js.map +1 -1
  106. package/dist/core/project-trust.d.ts.map +1 -1
  107. package/dist/core/project-trust.js +2 -1
  108. package/dist/core/project-trust.js.map +1 -1
  109. package/dist/core/remote-catalog-provider.d.ts +12 -1
  110. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  111. package/dist/core/remote-catalog-provider.js +82 -24
  112. package/dist/core/remote-catalog-provider.js.map +1 -1
  113. package/dist/core/resource-loader.d.ts.map +1 -1
  114. package/dist/core/resource-loader.js +7 -2
  115. package/dist/core/resource-loader.js.map +1 -1
  116. package/dist/core/sdk.d.ts +4 -0
  117. package/dist/core/sdk.d.ts.map +1 -1
  118. package/dist/core/sdk.js +17 -5
  119. package/dist/core/sdk.js.map +1 -1
  120. package/dist/core/settings-defaults.d.ts +65 -0
  121. package/dist/core/settings-defaults.d.ts.map +1 -0
  122. package/dist/core/settings-defaults.js +66 -0
  123. package/dist/core/settings-defaults.js.map +1 -0
  124. package/dist/core/settings-manager.d.ts +15 -147
  125. package/dist/core/settings-manager.d.ts.map +1 -1
  126. package/dist/core/settings-manager.js +85 -57
  127. package/dist/core/settings-manager.js.map +1 -1
  128. package/dist/core/settings-schema.d.ts +231 -0
  129. package/dist/core/settings-schema.d.ts.map +1 -0
  130. package/dist/core/settings-schema.js +294 -0
  131. package/dist/core/settings-schema.js.map +1 -0
  132. package/dist/core/tasks/session.d.ts +9 -0
  133. package/dist/core/tasks/session.d.ts.map +1 -1
  134. package/dist/core/tasks/session.js +21 -0
  135. package/dist/core/tasks/session.js.map +1 -1
  136. package/dist/core/tools/render-utils.d.ts +18 -0
  137. package/dist/core/tools/render-utils.d.ts.map +1 -1
  138. package/dist/core/tools/render-utils.js +46 -0
  139. package/dist/core/tools/render-utils.js.map +1 -1
  140. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  141. package/dist/core/tools/renderers/bash.js +21 -45
  142. package/dist/core/tools/renderers/bash.js.map +1 -1
  143. package/dist/core/tools/renderers/edit.js +1 -1
  144. package/dist/core/tools/renderers/edit.js.map +1 -1
  145. package/dist/extensions/btw/keybindings.d.ts +2 -2
  146. package/dist/extensions/btw/keybindings.d.ts.map +1 -1
  147. package/dist/extensions/btw/keybindings.js.map +1 -1
  148. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  149. package/dist/extensions/codemode/execute.js +115 -40
  150. package/dist/extensions/codemode/execute.js.map +1 -1
  151. package/dist/extensions/codemode/index.d.ts.map +1 -1
  152. package/dist/extensions/codemode/index.js +3 -7
  153. package/dist/extensions/codemode/index.js.map +1 -1
  154. package/dist/extensions/codemode/renderer.d.ts +2 -2
  155. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  156. package/dist/extensions/codemode/renderer.js +9 -3
  157. package/dist/extensions/codemode/renderer.js.map +1 -1
  158. package/dist/extensions/codemode/tool.d.ts +6 -12
  159. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  160. package/dist/extensions/codemode/tool.js +46 -34
  161. package/dist/extensions/codemode/tool.js.map +1 -1
  162. package/dist/extensions/index.js +2 -2
  163. package/dist/extensions/index.js.map +1 -1
  164. package/dist/extensions/list-keybindings.d.ts +2 -2
  165. package/dist/extensions/list-keybindings.d.ts.map +1 -1
  166. package/dist/extensions/list-keybindings.js.map +1 -1
  167. package/dist/extensions/llama/provider.d.ts.map +1 -1
  168. package/dist/extensions/llama/provider.js +34 -11
  169. package/dist/extensions/llama/provider.js.map +1 -1
  170. package/dist/extensions/mcp/cli.js +22 -31
  171. package/dist/extensions/mcp/cli.js.map +1 -1
  172. package/dist/extensions/mcp/index.d.ts.map +1 -1
  173. package/dist/extensions/mcp/index.js +187 -95
  174. package/dist/extensions/mcp/index.js.map +1 -1
  175. package/dist/extensions/mcp/oauth.d.ts +5 -3
  176. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  177. package/dist/extensions/mcp/oauth.js +36 -10
  178. package/dist/extensions/mcp/oauth.js.map +1 -1
  179. package/dist/extensions/mcp/resources.d.ts +0 -6
  180. package/dist/extensions/mcp/resources.d.ts.map +1 -1
  181. package/dist/extensions/mcp/resources.js +1 -1
  182. package/dist/extensions/mcp/resources.js.map +1 -1
  183. package/dist/extensions/mcp/runtime.d.ts +3 -6
  184. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  185. package/dist/extensions/mcp/runtime.js +4 -39
  186. package/dist/extensions/mcp/runtime.js.map +1 -1
  187. package/dist/extensions/mcp/tools.d.ts +2 -3
  188. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  189. package/dist/extensions/mcp/tools.js +62 -6
  190. package/dist/extensions/mcp/tools.js.map +1 -1
  191. package/dist/extensions/mcp/ui.d.ts +3 -3
  192. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  193. package/dist/extensions/mcp/ui.js +10 -2
  194. package/dist/extensions/mcp/ui.js.map +1 -1
  195. package/dist/extensions/provider/keybindings.d.ts +2 -2
  196. package/dist/extensions/provider/keybindings.d.ts.map +1 -1
  197. package/dist/extensions/provider/keybindings.js.map +1 -1
  198. package/dist/extensions/search/code-search.d.ts +27 -0
  199. package/dist/extensions/search/code-search.d.ts.map +1 -0
  200. package/dist/extensions/search/code-search.js +120 -0
  201. package/dist/extensions/search/code-search.js.map +1 -0
  202. package/dist/extensions/search/command.d.ts +5 -0
  203. package/dist/extensions/search/command.d.ts.map +1 -0
  204. package/dist/extensions/search/command.js +69 -0
  205. package/dist/extensions/search/command.js.map +1 -0
  206. package/dist/extensions/search/credential.d.ts +25 -0
  207. package/dist/extensions/search/credential.d.ts.map +1 -0
  208. package/dist/extensions/search/credential.js +117 -0
  209. package/dist/extensions/search/credential.js.map +1 -0
  210. package/dist/extensions/search/devin.d.ts +34 -0
  211. package/dist/extensions/search/devin.d.ts.map +1 -0
  212. package/dist/extensions/search/devin.js +210 -0
  213. package/dist/extensions/search/devin.js.map +1 -0
  214. package/dist/extensions/search/index.d.ts +5 -0
  215. package/dist/extensions/search/index.d.ts.map +1 -0
  216. package/dist/extensions/search/index.js +113 -0
  217. package/dist/extensions/search/index.js.map +1 -0
  218. package/dist/extensions/search/panel.d.ts +53 -0
  219. package/dist/extensions/search/panel.d.ts.map +1 -0
  220. package/dist/extensions/search/panel.js +157 -0
  221. package/dist/extensions/search/panel.js.map +1 -0
  222. package/dist/extensions/search/prompt.d.ts +14 -0
  223. package/dist/extensions/search/prompt.d.ts.map +1 -0
  224. package/dist/extensions/search/prompt.js +221 -0
  225. package/dist/extensions/search/prompt.js.map +1 -0
  226. package/dist/extensions/search/render.d.ts +28 -0
  227. package/dist/extensions/search/render.d.ts.map +1 -0
  228. package/dist/extensions/search/render.js +86 -0
  229. package/dist/extensions/search/render.js.map +1 -0
  230. package/dist/extensions/search/workspace.d.ts +39 -0
  231. package/dist/extensions/search/workspace.d.ts.map +1 -0
  232. package/dist/extensions/search/workspace.js +363 -0
  233. package/dist/extensions/search/workspace.js.map +1 -0
  234. package/dist/extensions/tool-search/index.d.ts.map +1 -1
  235. package/dist/extensions/tool-search/index.js +1 -6
  236. package/dist/extensions/tool-search/index.js.map +1 -1
  237. package/dist/extensions/tool-search/tool.d.ts +0 -2
  238. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  239. package/dist/extensions/tool-search/tool.js +2 -4
  240. package/dist/extensions/tool-search/tool.js.map +1 -1
  241. package/dist/index.d.ts +1 -1
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js.map +1 -1
  244. package/dist/main.js +3 -3
  245. package/dist/main.js.map +1 -1
  246. package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  247. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  248. package/dist/modes/interactive/components/bash-execution.js +14 -14
  249. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  250. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  251. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/branch-summary-message.js +5 -2
  253. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  254. package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
  255. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
  257. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  258. package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
  259. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/custom-entry.js +7 -2
  261. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  262. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  263. package/dist/modes/interactive/components/custom-message.js +1 -0
  264. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  265. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  266. package/dist/modes/interactive/components/settings-selector.js +4 -3
  267. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  268. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  269. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
  271. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  272. package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
  273. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/status-indicator.js +2 -2
  275. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  276. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  277. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  278. package/dist/modes/interactive/interactive-mode.js +63 -64
  279. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  280. package/dist/modes/interactive/program-status-reporter.d.ts +34 -0
  281. package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
  282. package/dist/modes/interactive/program-status-reporter.js +107 -0
  283. package/dist/modes/interactive/program-status-reporter.js.map +1 -0
  284. package/dist/modes/interactive/tasks/host-hooks.d.ts +14 -0
  285. package/dist/modes/interactive/tasks/host-hooks.d.ts.map +1 -0
  286. package/dist/modes/interactive/tasks/host-hooks.js +31 -0
  287. package/dist/modes/interactive/tasks/host-hooks.js.map +1 -0
  288. package/dist/modes/interactive/theme/dark.json +1 -1
  289. package/dist/modes/interactive/theme/light.json +1 -1
  290. package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
  291. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  292. package/dist/modes/interactive/theme/theme-schema.js +105 -0
  293. package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  294. package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
  295. package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
  296. package/dist/modes/interactive/theme/theme-tokens.js +94 -0
  297. package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
  298. package/dist/modes/interactive/theme/theme.d.ts +13 -16
  299. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  300. package/dist/modes/interactive/theme/theme.js +23 -31
  301. package/dist/modes/interactive/theme/theme.js.map +1 -1
  302. package/dist/modes/interactive/tool-view/tool-execution.d.ts +5 -0
  303. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
  304. package/dist/modes/interactive/tool-view/tool-execution.js +7 -0
  305. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
  306. package/dist/modes/print-mode.d.ts.map +1 -1
  307. package/dist/modes/print-mode.js +4 -0
  308. package/dist/modes/print-mode.js.map +1 -1
  309. package/dist/package-manager-cli.d.ts.map +1 -1
  310. package/dist/package-manager-cli.js +24 -0
  311. package/dist/package-manager-cli.js.map +1 -1
  312. package/dist/utils/ansi.d.ts +8 -0
  313. package/dist/utils/ansi.d.ts.map +1 -1
  314. package/dist/utils/ansi.js +30 -11
  315. package/dist/utils/ansi.js.map +1 -1
  316. package/dist/utils/clipboard.d.ts.map +1 -1
  317. package/dist/utils/clipboard.js +18 -12
  318. package/dist/utils/clipboard.js.map +1 -1
  319. package/dist/utils/image-resize-core.d.ts +12 -0
  320. package/dist/utils/image-resize-core.d.ts.map +1 -1
  321. package/dist/utils/image-resize-core.js +5 -0
  322. package/dist/utils/image-resize-core.js.map +1 -1
  323. package/dist/utils/image-resize-worker.js +3 -2
  324. package/dist/utils/image-resize-worker.js.map +1 -1
  325. package/dist/utils/image-resize.d.ts.map +1 -1
  326. package/dist/utils/image-resize.js +9 -10
  327. package/dist/utils/image-resize.js.map +1 -1
  328. package/docs/bundled/README.md +1 -1
  329. package/docs/bundled/extensions/provider.md +1 -1
  330. package/docs/bundled/extensions/question.md +1 -1
  331. package/docs/bundled/extensions/search.md +51 -0
  332. package/docs/bundled/extensions/statusline.md +15 -41
  333. package/docs/codemode.md +24 -4
  334. package/docs/compaction.md +2 -2
  335. package/docs/docs.json +0 -4
  336. package/docs/environment-variables.md +3 -1
  337. package/docs/extensions.md +15 -5
  338. package/docs/json.md +2 -2
  339. package/docs/keybindings.md +1 -0
  340. package/docs/llama-cpp.md +8 -1
  341. package/docs/mcp.md +1 -1
  342. package/docs/models.md +5 -1
  343. package/docs/providers.md +33 -0
  344. package/docs/rpc.md +6 -3
  345. package/docs/session-format.md +1 -0
  346. package/docs/settings.md +5 -5
  347. package/docs/terminal-setup.md +14 -0
  348. package/docs/themes.md +4 -2
  349. package/docs/tui.md +1 -1
  350. package/docs/usage.md +7 -3
  351. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  352. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  353. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  354. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  355. package/examples/extensions/gondolin/package-lock.json +2 -2
  356. package/examples/extensions/gondolin/package.json +1 -1
  357. package/examples/extensions/overlay-test.ts +2 -2
  358. package/examples/extensions/plan-mode/index.ts +6 -2
  359. package/examples/extensions/sandbox/package-lock.json +2 -2
  360. package/examples/extensions/sandbox/package.json +1 -1
  361. package/examples/extensions/with-deps/package-lock.json +2 -2
  362. package/examples/extensions/with-deps/package.json +1 -1
  363. package/npm-shrinkwrap.json +54 -102
  364. package/package.json +10 -20
  365. package/schemas/keybindings.schema.json +453 -0
  366. package/schemas/models.schema.json +1157 -0
  367. package/schemas/settings.schema.json +782 -0
  368. package/schemas/theme.schema.json +365 -0
  369. package/dist/bundle/chunks/anthropic-messages-YIOJIMVL.js +0 -6
  370. package/dist/bundle/chunks/chunk-57XI7YJH.js +0 -2
  371. package/dist/bundle/chunks/chunk-JI4WGISU.js +0 -2
  372. package/dist/bundle/chunks/chunk-TCQ4HHQD.js +0 -2
  373. package/dist/bundle/chunks/chunk-TXJO4AJ7.js +0 -11
  374. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-OWU5SM6J.js +0 -2
  375. package/dist/bundle/chunks/mistral-conversations-A2N5FSOV.js +0 -5
  376. package/dist/bundle/chunks/openai-codex-responses-Q6JHCWLE.js +0 -10
  377. package/dist/bundle/chunks/typesafe-system-one-KYKKNU3E.js +0 -2
  378. package/dist/extensions/web-search/auth.d.ts +0 -12
  379. package/dist/extensions/web-search/auth.d.ts.map +0 -1
  380. package/dist/extensions/web-search/auth.js +0 -90
  381. package/dist/extensions/web-search/auth.js.map +0 -1
  382. package/dist/extensions/web-search/constants.d.ts +0 -13
  383. package/dist/extensions/web-search/constants.d.ts.map +0 -1
  384. package/dist/extensions/web-search/constants.js +0 -26
  385. package/dist/extensions/web-search/constants.js.map +0 -1
  386. package/dist/extensions/web-search/execute.d.ts +0 -9
  387. package/dist/extensions/web-search/execute.d.ts.map +0 -1
  388. package/dist/extensions/web-search/execute.js +0 -96
  389. package/dist/extensions/web-search/execute.js.map +0 -1
  390. package/dist/extensions/web-search/format.d.ts +0 -21
  391. package/dist/extensions/web-search/format.d.ts.map +0 -1
  392. package/dist/extensions/web-search/format.js +0 -117
  393. package/dist/extensions/web-search/format.js.map +0 -1
  394. package/dist/extensions/web-search/index.d.ts +0 -6
  395. package/dist/extensions/web-search/index.d.ts.map +0 -1
  396. package/dist/extensions/web-search/index.js +0 -50
  397. package/dist/extensions/web-search/index.js.map +0 -1
  398. package/dist/extensions/web-search/providers/deepseek.d.ts +0 -13
  399. package/dist/extensions/web-search/providers/deepseek.d.ts.map +0 -1
  400. package/dist/extensions/web-search/providers/deepseek.js +0 -110
  401. package/dist/extensions/web-search/providers/deepseek.js.map +0 -1
  402. package/dist/extensions/web-search/providers/http.d.ts +0 -4
  403. package/dist/extensions/web-search/providers/http.d.ts.map +0 -1
  404. package/dist/extensions/web-search/providers/http.js +0 -42
  405. package/dist/extensions/web-search/providers/http.js.map +0 -1
  406. package/dist/extensions/web-search/providers/minimax.d.ts +0 -12
  407. package/dist/extensions/web-search/providers/minimax.d.ts.map +0 -1
  408. package/dist/extensions/web-search/providers/minimax.js +0 -61
  409. package/dist/extensions/web-search/providers/minimax.js.map +0 -1
  410. package/dist/extensions/web-search/render.d.ts +0 -15
  411. package/dist/extensions/web-search/render.d.ts.map +0 -1
  412. package/dist/extensions/web-search/render.js +0 -142
  413. package/dist/extensions/web-search/render.js.map +0 -1
  414. package/dist/extensions/web-search/results.d.ts +0 -35
  415. package/dist/extensions/web-search/results.d.ts.map +0 -1
  416. package/dist/extensions/web-search/results.js +0 -167
  417. package/dist/extensions/web-search/results.js.map +0 -1
  418. package/dist/extensions/web-search/schema.d.ts +0 -10
  419. package/dist/extensions/web-search/schema.d.ts.map +0 -1
  420. package/dist/extensions/web-search/schema.js +0 -36
  421. package/dist/extensions/web-search/schema.js.map +0 -1
  422. package/dist/extensions/web-search/types.d.ts +0 -51
  423. package/dist/extensions/web-search/types.d.ts.map +0 -1
  424. package/dist/extensions/web-search/types.js +0 -5
  425. package/dist/extensions/web-search/types.js.map +0 -1
  426. package/dist/modes/interactive/theme/theme-json.d.ts +0 -85
  427. package/dist/modes/interactive/theme/theme-json.d.ts.map +0 -1
  428. package/dist/modes/interactive/theme/theme-json.js +0 -132
  429. package/dist/modes/interactive/theme/theme-json.js.map +0 -1
  430. package/dist/modes/interactive/theme/theme-schema.json +0 -361
  431. package/docs/bundled/extensions/web-search.md +0 -46
  432. package/examples/plugins/pi-example-plugin/README.md +0 -38
  433. package/examples/plugins/pi-example-plugin/package.json +0 -10
  434. package/examples/plugins/pi-example-plugin/src/contract.ts +0 -13
  435. package/examples/plugins/pi-example-plugin/src/session.ts +0 -24
  436. package/examples/plugins/pi-example-plugin/src/tui.ts +0 -31
@@ -1,35 +0,0 @@
1
- /**
2
- * Result normalization, bounding, deduplication, and ranking for web_search providers.
3
- */
4
- import type { ProviderSearchResult, WebSearchHit } from "./types.ts";
5
- export declare const MAX_OUTPUT_HITS = 12;
6
- export declare const MAX_QUERY_LENGTH = 500;
7
- export declare const MAX_TITLE_LENGTH = 200;
8
- export declare const MAX_URL_LENGTH = 2048;
9
- export declare const MAX_SNIPPET_LENGTH = 200;
10
- export declare const MAX_DATE_LENGTH = 100;
11
- export declare const MAX_RELATED_SEARCHES = 8;
12
- export declare const MAX_RELATED_SEARCH_LENGTH = 200;
13
- export declare const MAX_SYNTHESIS_LENGTH = 6000;
14
- export declare const MAX_ERROR_MESSAGE_LENGTH = 500;
15
- /** Provider arrays are transport-bounded too, but avoid scanning an entire hostile payload. */
16
- export declare const MAX_PROVIDER_HIT_SCAN = 200;
17
- export declare const MAX_PROVIDER_RELATED_SCAN = 64;
18
- /** Historical session details predate the current bounds and may contain oversized arrays. */
19
- export declare const MAX_HISTORICAL_HIT_SCAN: number;
20
- export declare const MAX_HISTORICAL_SOURCE_SCAN = 32;
21
- export declare const MAX_HISTORICAL_RELATED_SCAN: number;
22
- export interface FusedSearchResults {
23
- hits: WebSearchHit[];
24
- relatedSearches?: string[];
25
- deepseekSynthesis?: string;
26
- }
27
- /** Normalize and bound a provider-controlled single-line text field. */
28
- export declare function boundSingleLineText(value: unknown, maxLength: number): string | undefined;
29
- /** Trim and bound provider-controlled text that intentionally preserves lines. */
30
- export declare function boundMultilineText(value: unknown, maxLength: number): string | undefined;
31
- /** Normalize a usable HTTP(S) source URL without changing non-tracking query values. */
32
- export declare function normalizeUrl(rawUrl: unknown): string | undefined;
33
- /** Bound provider results, deduplicate URLs, and rank them with reciprocal-rank fusion. */
34
- export declare function fuseSearchHits(results: ProviderSearchResult[]): FusedSearchResults;
35
- //# sourceMappingURL=results.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/results.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAqB,oBAAoB,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5G,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,+FAA+F;AAC/F,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,8FAA8F;AAC9F,eAAO,MAAM,uBAAuB,QAAuB,CAAC;AAC5D,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,2BAA2B,QAA2B,CAAC;AAqBpE,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAQD,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzF;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIxF;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAoBhE;AA6BD,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,kBAAkB,CA0DlF"}
@@ -1,167 +0,0 @@
1
- /**
2
- * Result normalization, bounding, deduplication, and ranking for web_search providers.
3
- */
4
- export const MAX_OUTPUT_HITS = 12;
5
- export const MAX_QUERY_LENGTH = 500;
6
- export const MAX_TITLE_LENGTH = 200;
7
- export const MAX_URL_LENGTH = 2048;
8
- export const MAX_SNIPPET_LENGTH = 200;
9
- export const MAX_DATE_LENGTH = 100;
10
- export const MAX_RELATED_SEARCHES = 8;
11
- export const MAX_RELATED_SEARCH_LENGTH = 200;
12
- export const MAX_SYNTHESIS_LENGTH = 6000;
13
- export const MAX_ERROR_MESSAGE_LENGTH = 500;
14
- /** Provider arrays are transport-bounded too, but avoid scanning an entire hostile payload. */
15
- export const MAX_PROVIDER_HIT_SCAN = 200;
16
- export const MAX_PROVIDER_RELATED_SCAN = 64;
17
- /** Historical session details predate the current bounds and may contain oversized arrays. */
18
- export const MAX_HISTORICAL_HIT_SCAN = MAX_OUTPUT_HITS * 20;
19
- export const MAX_HISTORICAL_SOURCE_SCAN = 32;
20
- export const MAX_HISTORICAL_RELATED_SCAN = MAX_RELATED_SEARCHES * 8;
21
- const RRF_K = 60;
22
- const TRACKING_PARAMS = new Set([
23
- "utm_source",
24
- "utm_medium",
25
- "utm_campaign",
26
- "utm_term",
27
- "utm_content",
28
- "ref",
29
- "fbclid",
30
- "gclid",
31
- "trk",
32
- "gi",
33
- ]);
34
- function truncateText(text, maxLength) {
35
- if (text.length <= maxLength)
36
- return text;
37
- if (maxLength <= 3)
38
- return text.slice(0, maxLength);
39
- return `${text.slice(0, maxLength - 3).trimEnd()}...`;
40
- }
41
- /** Normalize and bound a provider-controlled single-line text field. */
42
- export function boundSingleLineText(value, maxLength) {
43
- if (typeof value !== "string")
44
- return undefined;
45
- const normalized = value.replace(/\s+/g, " ").trim();
46
- return normalized ? truncateText(normalized, maxLength) : undefined;
47
- }
48
- /** Trim and bound provider-controlled text that intentionally preserves lines. */
49
- export function boundMultilineText(value, maxLength) {
50
- if (typeof value !== "string")
51
- return undefined;
52
- const normalized = value.trim();
53
- return normalized ? truncateText(normalized, maxLength) : undefined;
54
- }
55
- /** Normalize a usable HTTP(S) source URL without changing non-tracking query values. */
56
- export function normalizeUrl(rawUrl) {
57
- if (typeof rawUrl !== "string")
58
- return undefined;
59
- const trimmed = rawUrl.trim();
60
- if (!trimmed || trimmed.length > MAX_URL_LENGTH)
61
- return undefined;
62
- try {
63
- const url = new URL(trimmed);
64
- if (url.protocol !== "http:" && url.protocol !== "https:")
65
- return undefined;
66
- url.hash = "";
67
- for (const parameter of TRACKING_PARAMS) {
68
- if (url.searchParams.has(parameter))
69
- url.searchParams.delete(parameter);
70
- }
71
- if (url.pathname.length > 1 && url.pathname.endsWith("/")) {
72
- url.pathname = url.pathname.replace(/\/+$/, "");
73
- }
74
- const normalized = url.toString();
75
- return normalized.length <= MAX_URL_LENGTH ? normalized : undefined;
76
- }
77
- catch {
78
- return undefined;
79
- }
80
- }
81
- function normalizeHit(hit) {
82
- const url = normalizeUrl(hit.url);
83
- if (!url)
84
- return undefined;
85
- return {
86
- title: boundSingleLineText(hit.title, MAX_TITLE_LENGTH) ?? url,
87
- url,
88
- snippet: boundSingleLineText(hit.snippet, MAX_SNIPPET_LENGTH),
89
- date: boundSingleLineText(hit.date, MAX_DATE_LENGTH),
90
- };
91
- }
92
- function isUrlFallbackTitle(title, url) {
93
- const normalizedTitle = normalizeUrl(title);
94
- return normalizedTitle !== undefined && normalizedTitle === normalizeUrl(url);
95
- }
96
- function reciprocalRankScore(candidate) {
97
- let score = 0;
98
- for (const rank of candidate.ranks.values())
99
- score += 1 / (RRF_K + rank);
100
- return score;
101
- }
102
- function bestRank(candidate) {
103
- return Math.min(...candidate.ranks.values());
104
- }
105
- /** Bound provider results, deduplicate URLs, and rank them with reciprocal-rank fusion. */
106
- export function fuseSearchHits(results) {
107
- const candidates = new Map();
108
- const relatedSearches = new Set();
109
- let deepseekSynthesis;
110
- for (const result of results) {
111
- const providerRelated = Array.isArray(result.relatedSearches) ? result.relatedSearches : [];
112
- const relatedScanLimit = Math.min(providerRelated.length, MAX_PROVIDER_RELATED_SCAN);
113
- for (let index = 0; index < relatedScanLimit && relatedSearches.size < MAX_RELATED_SEARCHES; index++) {
114
- const normalized = boundSingleLineText(providerRelated[index], MAX_RELATED_SEARCH_LENGTH);
115
- if (normalized)
116
- relatedSearches.add(normalized);
117
- }
118
- const synthesis = boundMultilineText(result.synthesisText, MAX_SYNTHESIS_LENGTH);
119
- if (synthesis)
120
- deepseekSynthesis = synthesis;
121
- const providerHits = Array.isArray(result.hits) ? result.hits : [];
122
- const hitScanLimit = Math.min(providerHits.length, MAX_PROVIDER_HIT_SCAN);
123
- for (let index = 0; index < hitScanLimit; index++) {
124
- const rawHit = providerHits[index];
125
- if (!rawHit)
126
- continue;
127
- const hit = normalizeHit(rawHit);
128
- if (!hit)
129
- continue;
130
- const rank = index + 1;
131
- const existing = candidates.get(hit.url);
132
- if (!existing) {
133
- candidates.set(hit.url, { hit, ranks: new Map([[result.source, rank]]) });
134
- continue;
135
- }
136
- const previousRank = existing.ranks.get(result.source);
137
- if (previousRank === undefined || rank < previousRank)
138
- existing.ranks.set(result.source, rank);
139
- if (isUrlFallbackTitle(existing.hit.title, existing.hit.url) && !isUrlFallbackTitle(hit.title, hit.url)) {
140
- existing.hit.title = hit.title;
141
- }
142
- if ((!existing.hit.snippet || existing.hit.snippet.length < (hit.snippet?.length ?? 0)) && hit.snippet) {
143
- existing.hit.snippet = hit.snippet;
144
- }
145
- if (!existing.hit.date && hit.date)
146
- existing.hit.date = hit.date;
147
- }
148
- }
149
- const ranked = [...candidates.entries()]
150
- .sort(([leftUrl, left], [rightUrl, right]) => {
151
- const scoreDifference = reciprocalRankScore(right) - reciprocalRankScore(left);
152
- if (scoreDifference !== 0)
153
- return scoreDifference;
154
- const rankDifference = bestRank(left) - bestRank(right);
155
- if (rankDifference !== 0)
156
- return rankDifference;
157
- return leftUrl.localeCompare(rightUrl);
158
- })
159
- .map(([, candidate]) => ({ ...candidate.hit, sources: [...candidate.ranks.keys()] }))
160
- .slice(0, MAX_OUTPUT_HITS);
161
- return {
162
- hits: ranked,
163
- relatedSearches: relatedSearches.size > 0 ? [...relatedSearches] : undefined,
164
- deepseekSynthesis,
165
- };
166
- }
167
- //# sourceMappingURL=results.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/extensions/web-search/results.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Result normalization, bounding, deduplication, and ranking for web_search providers.\n */\n\nimport type { ProviderSearchHit, ProviderSearchResult, SearchEngineSource, WebSearchHit } from \"./types.ts\";\n\nexport const MAX_OUTPUT_HITS = 12;\nexport const MAX_QUERY_LENGTH = 500;\nexport const MAX_TITLE_LENGTH = 200;\nexport const MAX_URL_LENGTH = 2048;\nexport const MAX_SNIPPET_LENGTH = 200;\nexport const MAX_DATE_LENGTH = 100;\nexport const MAX_RELATED_SEARCHES = 8;\nexport const MAX_RELATED_SEARCH_LENGTH = 200;\nexport const MAX_SYNTHESIS_LENGTH = 6000;\nexport const MAX_ERROR_MESSAGE_LENGTH = 500;\n/** Provider arrays are transport-bounded too, but avoid scanning an entire hostile payload. */\nexport const MAX_PROVIDER_HIT_SCAN = 200;\nexport const MAX_PROVIDER_RELATED_SCAN = 64;\n/** Historical session details predate the current bounds and may contain oversized arrays. */\nexport const MAX_HISTORICAL_HIT_SCAN = MAX_OUTPUT_HITS * 20;\nexport const MAX_HISTORICAL_SOURCE_SCAN = 32;\nexport const MAX_HISTORICAL_RELATED_SCAN = MAX_RELATED_SEARCHES * 8;\n\nconst RRF_K = 60;\nconst TRACKING_PARAMS = new Set([\n\t\"utm_source\",\n\t\"utm_medium\",\n\t\"utm_campaign\",\n\t\"utm_term\",\n\t\"utm_content\",\n\t\"ref\",\n\t\"fbclid\",\n\t\"gclid\",\n\t\"trk\",\n\t\"gi\",\n]);\n\ninterface FusionCandidate {\n\thit: ProviderSearchHit;\n\tranks: Map<SearchEngineSource, number>;\n}\n\nexport interface FusedSearchResults {\n\thits: WebSearchHit[];\n\trelatedSearches?: string[];\n\tdeepseekSynthesis?: string;\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n\tif (text.length <= maxLength) return text;\n\tif (maxLength <= 3) return text.slice(0, maxLength);\n\treturn `${text.slice(0, maxLength - 3).trimEnd()}...`;\n}\n\n/** Normalize and bound a provider-controlled single-line text field. */\nexport function boundSingleLineText(value: unknown, maxLength: number): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\treturn normalized ? truncateText(normalized, maxLength) : undefined;\n}\n\n/** Trim and bound provider-controlled text that intentionally preserves lines. */\nexport function boundMultilineText(value: unknown, maxLength: number): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.trim();\n\treturn normalized ? truncateText(normalized, maxLength) : undefined;\n}\n\n/** Normalize a usable HTTP(S) source URL without changing non-tracking query values. */\nexport function normalizeUrl(rawUrl: unknown): string | undefined {\n\tif (typeof rawUrl !== \"string\") return undefined;\n\tconst trimmed = rawUrl.trim();\n\tif (!trimmed || trimmed.length > MAX_URL_LENGTH) return undefined;\n\n\ttry {\n\t\tconst url = new URL(trimmed);\n\t\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n\t\turl.hash = \"\";\n\t\tfor (const parameter of TRACKING_PARAMS) {\n\t\t\tif (url.searchParams.has(parameter)) url.searchParams.delete(parameter);\n\t\t}\n\t\tif (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) {\n\t\t\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\t\t}\n\t\tconst normalized = url.toString();\n\t\treturn normalized.length <= MAX_URL_LENGTH ? normalized : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction normalizeHit(hit: ProviderSearchHit): ProviderSearchHit | undefined {\n\tconst url = normalizeUrl(hit.url);\n\tif (!url) return undefined;\n\n\treturn {\n\t\ttitle: boundSingleLineText(hit.title, MAX_TITLE_LENGTH) ?? url,\n\t\turl,\n\t\tsnippet: boundSingleLineText(hit.snippet, MAX_SNIPPET_LENGTH),\n\t\tdate: boundSingleLineText(hit.date, MAX_DATE_LENGTH),\n\t};\n}\n\nfunction isUrlFallbackTitle(title: string, url: string): boolean {\n\tconst normalizedTitle = normalizeUrl(title);\n\treturn normalizedTitle !== undefined && normalizedTitle === normalizeUrl(url);\n}\n\nfunction reciprocalRankScore(candidate: FusionCandidate): number {\n\tlet score = 0;\n\tfor (const rank of candidate.ranks.values()) score += 1 / (RRF_K + rank);\n\treturn score;\n}\n\nfunction bestRank(candidate: FusionCandidate): number {\n\treturn Math.min(...candidate.ranks.values());\n}\n\n/** Bound provider results, deduplicate URLs, and rank them with reciprocal-rank fusion. */\nexport function fuseSearchHits(results: ProviderSearchResult[]): FusedSearchResults {\n\tconst candidates = new Map<string, FusionCandidate>();\n\tconst relatedSearches = new Set<string>();\n\tlet deepseekSynthesis: string | undefined;\n\n\tfor (const result of results) {\n\t\tconst providerRelated = Array.isArray(result.relatedSearches) ? result.relatedSearches : [];\n\t\tconst relatedScanLimit = Math.min(providerRelated.length, MAX_PROVIDER_RELATED_SCAN);\n\t\tfor (let index = 0; index < relatedScanLimit && relatedSearches.size < MAX_RELATED_SEARCHES; index++) {\n\t\t\tconst normalized = boundSingleLineText(providerRelated[index], MAX_RELATED_SEARCH_LENGTH);\n\t\t\tif (normalized) relatedSearches.add(normalized);\n\t\t}\n\t\tconst synthesis = boundMultilineText(result.synthesisText, MAX_SYNTHESIS_LENGTH);\n\t\tif (synthesis) deepseekSynthesis = synthesis;\n\n\t\tconst providerHits = Array.isArray(result.hits) ? result.hits : [];\n\t\tconst hitScanLimit = Math.min(providerHits.length, MAX_PROVIDER_HIT_SCAN);\n\t\tfor (let index = 0; index < hitScanLimit; index++) {\n\t\t\tconst rawHit = providerHits[index];\n\t\t\tif (!rawHit) continue;\n\t\t\tconst hit = normalizeHit(rawHit);\n\t\t\tif (!hit) continue;\n\t\t\tconst rank = index + 1;\n\t\t\tconst existing = candidates.get(hit.url);\n\n\t\t\tif (!existing) {\n\t\t\t\tcandidates.set(hit.url, { hit, ranks: new Map([[result.source, rank]]) });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst previousRank = existing.ranks.get(result.source);\n\t\t\tif (previousRank === undefined || rank < previousRank) existing.ranks.set(result.source, rank);\n\t\t\tif (isUrlFallbackTitle(existing.hit.title, existing.hit.url) && !isUrlFallbackTitle(hit.title, hit.url)) {\n\t\t\t\texisting.hit.title = hit.title;\n\t\t\t}\n\t\t\tif ((!existing.hit.snippet || existing.hit.snippet.length < (hit.snippet?.length ?? 0)) && hit.snippet) {\n\t\t\t\texisting.hit.snippet = hit.snippet;\n\t\t\t}\n\t\t\tif (!existing.hit.date && hit.date) existing.hit.date = hit.date;\n\t\t}\n\t}\n\n\tconst ranked = [...candidates.entries()]\n\t\t.sort(([leftUrl, left], [rightUrl, right]) => {\n\t\t\tconst scoreDifference = reciprocalRankScore(right) - reciprocalRankScore(left);\n\t\t\tif (scoreDifference !== 0) return scoreDifference;\n\t\t\tconst rankDifference = bestRank(left) - bestRank(right);\n\t\t\tif (rankDifference !== 0) return rankDifference;\n\t\t\treturn leftUrl.localeCompare(rightUrl);\n\t\t})\n\t\t.map(([, candidate]) => ({ ...candidate.hit, sources: [...candidate.ranks.keys()] }))\n\t\t.slice(0, MAX_OUTPUT_HITS);\n\n\treturn {\n\t\thits: ranked,\n\t\trelatedSearches: relatedSearches.size > 0 ? [...relatedSearches] : undefined,\n\t\tdeepseekSynthesis,\n\t};\n}\n"]}
@@ -1,10 +0,0 @@
1
- /**
2
- * schema.ts — TypeBox parameter schema and argument normalizer for web_search.
3
- */
4
- import { type Static, Type } from "typebox";
5
- export declare const WebSearchParamsSchema: Type.TObject<{
6
- query: Type.TString;
7
- }>;
8
- export type WebSearchParams = Static<typeof WebSearchParamsSchema>;
9
- export declare function normalizeWebSearchParams(raw: unknown): WebSearchParams;
10
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,eAAO,MAAM,qBAAqB;;EAMhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEnE,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CAuBtE"}
@@ -1,36 +0,0 @@
1
- /**
2
- * schema.ts — TypeBox parameter schema and argument normalizer for web_search.
3
- */
4
- import { Type } from "typebox";
5
- import { MAX_QUERY_LENGTH } from "./results.js";
6
- export const WebSearchParamsSchema = Type.Object({
7
- query: Type.String({
8
- minLength: 1,
9
- maxLength: MAX_QUERY_LENGTH,
10
- description: "The search query. Aim for 3-5 keywords; include a year when freshness matters.",
11
- }),
12
- });
13
- export function normalizeWebSearchParams(raw) {
14
- if (typeof raw === "string") {
15
- return { query: raw.trim() };
16
- }
17
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
18
- return { query: String(raw ?? "").trim() };
19
- }
20
- const record = raw;
21
- let query = "";
22
- if (typeof record.query === "string") {
23
- query = record.query.trim();
24
- }
25
- else if (typeof record.q === "string") {
26
- query = record.q.trim();
27
- }
28
- else if (typeof record.search_query === "string") {
29
- query = record.search_query.trim();
30
- }
31
- else if (typeof record.prompt === "string") {
32
- query = record.prompt.trim();
33
- }
34
- return { query };
35
- }
36
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/extensions/web-search/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,gBAAgB;QAC3B,WAAW,EAAE,gFAAgF;KAC7F,CAAC;CACF,CAAC,CAAC;AAIH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,MAAM,GAAG,GAA8B,CAAC;IAE9C,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;SAAM,IAAI,OAAO,MAAM,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACpD,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;SAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AAClB,CAAC","sourcesContent":["/**\n * schema.ts — TypeBox parameter schema and argument normalizer for web_search.\n */\n\nimport { type Static, Type } from \"typebox\";\nimport { MAX_QUERY_LENGTH } from \"./results.ts\";\n\nexport const WebSearchParamsSchema = Type.Object({\n\tquery: Type.String({\n\t\tminLength: 1,\n\t\tmaxLength: MAX_QUERY_LENGTH,\n\t\tdescription: \"The search query. Aim for 3-5 keywords; include a year when freshness matters.\",\n\t}),\n});\n\nexport type WebSearchParams = Static<typeof WebSearchParamsSchema>;\n\nexport function normalizeWebSearchParams(raw: unknown): WebSearchParams {\n\tif (typeof raw === \"string\") {\n\t\treturn { query: raw.trim() };\n\t}\n\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n\t\treturn { query: String(raw ?? \"\").trim() };\n\t}\n\n\tconst record = raw as Record<string, unknown>;\n\n\tlet query = \"\";\n\tif (typeof record.query === \"string\") {\n\t\tquery = record.query.trim();\n\t} else if (typeof record.q === \"string\") {\n\t\tquery = record.q.trim();\n\t} else if (typeof record.search_query === \"string\") {\n\t\tquery = record.search_query.trim();\n\t} else if (typeof record.prompt === \"string\") {\n\t\tquery = record.prompt.trim();\n\t}\n\n\treturn { query };\n}\n"]}
@@ -1,51 +0,0 @@
1
- /**
2
- * types.ts — Type definitions for web_search extension providers and fusion engine.
3
- */
4
- export type SearchEngineType = "minimax" | "deepseek" | "dual" | "none";
5
- export type SearchEngineSource = "MiniMax" | "DeepSeek";
6
- export interface ProviderSearchHit {
7
- title: string;
8
- url: string;
9
- snippet?: string;
10
- date?: string;
11
- }
12
- export interface WebSearchHit extends ProviderSearchHit {
13
- sources: SearchEngineSource[];
14
- }
15
- export interface WebSearchDetails {
16
- query: string;
17
- durationMs: number;
18
- status: "success" | "error" | "disabled";
19
- engine: SearchEngineType;
20
- totalHits: number;
21
- hits: WebSearchHit[];
22
- relatedSearches?: string[];
23
- deepseekSynthesis?: string;
24
- errorMessage?: string;
25
- }
26
- /**
27
- * MiniMax search credential. `host` is always present alongside `key` so
28
- * callers never guard the two separately.
29
- */
30
- export interface MiniMaxSearchCredential {
31
- key: string;
32
- host: string;
33
- }
34
- /**
35
- * Resolved credentials: presence of a group means that engine is configured,
36
- * so impossible states (mode without key, key without host) are unrepresentable.
37
- * Use `configuredEngine()` from auth.ts to derive the SearchEngineType label.
38
- */
39
- export interface ResolvedSearchCredentials {
40
- minimax?: MiniMaxSearchCredential;
41
- deepseek?: {
42
- key: string;
43
- };
44
- }
45
- export interface ProviderSearchResult {
46
- source: SearchEngineSource;
47
- hits: ProviderSearchHit[];
48
- relatedSearches?: string[];
49
- synthesisText?: string;
50
- }
51
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AACxE,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,UAAU,CAAC;AAExD,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACtD,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACzC,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACzC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -1,5 +0,0 @@
1
- /**
2
- * types.ts — Type definitions for web_search extension providers and fusion engine.
3
- */
4
- export {};
5
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/web-search/types.ts"],"names":[],"mappings":"AAAA;;GAEG","sourcesContent":["/**\n * types.ts — Type definitions for web_search extension providers and fusion engine.\n */\n\nexport type SearchEngineType = \"minimax\" | \"deepseek\" | \"dual\" | \"none\";\nexport type SearchEngineSource = \"MiniMax\" | \"DeepSeek\";\n\nexport interface ProviderSearchHit {\n\ttitle: string;\n\turl: string;\n\tsnippet?: string;\n\tdate?: string;\n}\n\nexport interface WebSearchHit extends ProviderSearchHit {\n\tsources: SearchEngineSource[];\n}\n\nexport interface WebSearchDetails {\n\tquery: string;\n\tdurationMs: number;\n\tstatus: \"success\" | \"error\" | \"disabled\";\n\tengine: SearchEngineType;\n\ttotalHits: number;\n\thits: WebSearchHit[];\n\trelatedSearches?: string[];\n\tdeepseekSynthesis?: string;\n\terrorMessage?: string;\n}\n\n/**\n * MiniMax search credential. `host` is always present alongside `key` so\n * callers never guard the two separately.\n */\nexport interface MiniMaxSearchCredential {\n\tkey: string;\n\thost: string;\n}\n\n/**\n * Resolved credentials: presence of a group means that engine is configured,\n * so impossible states (mode without key, key without host) are unrepresentable.\n * Use `configuredEngine()` from auth.ts to derive the SearchEngineType label.\n */\nexport interface ResolvedSearchCredentials {\n\tminimax?: MiniMaxSearchCredential;\n\tdeepseek?: { key: string };\n}\n\nexport interface ProviderSearchResult {\n\tsource: SearchEngineSource;\n\thits: ProviderSearchHit[];\n\trelatedSearches?: string[];\n\tsynthesisText?: string;\n}\n"]}
@@ -1,85 +0,0 @@
1
- /**
2
- * Theme JSON validation, kept out of `theme.ts` on purpose.
3
- *
4
- * Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.
5
- * Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.
6
- * `interactive-mode.ts` installs this validator; anything that does not simply skips validation, as
7
- * built-in themes already do.
8
- */
9
- import { type Static, Type } from "typebox";
10
- declare const ColorValueSchema: Type.TUnion<[Type.TString, Type.TInteger]>;
11
- declare const ThemeJsonSchema: Type.TObject<{
12
- $schema: Type.TOptional<Type.TString>;
13
- name: Type.TString;
14
- appearance: Type.TOptional<Type.TUnion<[Type.TLiteral<"dark">, Type.TLiteral<"light">]>>;
15
- vars: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TString, Type.TInteger]>>>;
16
- colors: Type.TObject<{
17
- accent: Type.TUnion<[Type.TString, Type.TInteger]>;
18
- border: Type.TUnion<[Type.TString, Type.TInteger]>;
19
- borderAccent: Type.TUnion<[Type.TString, Type.TInteger]>;
20
- borderMuted: Type.TUnion<[Type.TString, Type.TInteger]>;
21
- success: Type.TUnion<[Type.TString, Type.TInteger]>;
22
- error: Type.TUnion<[Type.TString, Type.TInteger]>;
23
- warning: Type.TUnion<[Type.TString, Type.TInteger]>;
24
- muted: Type.TUnion<[Type.TString, Type.TInteger]>;
25
- dim: Type.TUnion<[Type.TString, Type.TInteger]>;
26
- text: Type.TUnion<[Type.TString, Type.TInteger]>;
27
- thinkingText: Type.TUnion<[Type.TString, Type.TInteger]>;
28
- scrollbarTrack: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
29
- scrollbarThumb: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
30
- selectedBg: Type.TUnion<[Type.TString, Type.TInteger]>;
31
- searchMatchBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
32
- searchMatchText: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
33
- userMessageBg: Type.TUnion<[Type.TString, Type.TInteger]>;
34
- userMessageText: Type.TUnion<[Type.TString, Type.TInteger]>;
35
- customMessageBg: Type.TUnion<[Type.TString, Type.TInteger]>;
36
- customMessageText: Type.TUnion<[Type.TString, Type.TInteger]>;
37
- customMessageLabel: Type.TUnion<[Type.TString, Type.TInteger]>;
38
- toolPendingBg: Type.TUnion<[Type.TString, Type.TInteger]>;
39
- toolSuccessBg: Type.TUnion<[Type.TString, Type.TInteger]>;
40
- toolErrorBg: Type.TUnion<[Type.TString, Type.TInteger]>;
41
- toolTitle: Type.TUnion<[Type.TString, Type.TInteger]>;
42
- toolOutput: Type.TUnion<[Type.TString, Type.TInteger]>;
43
- mdHeading: Type.TUnion<[Type.TString, Type.TInteger]>;
44
- mdLink: Type.TUnion<[Type.TString, Type.TInteger]>;
45
- mdLinkUrl: Type.TUnion<[Type.TString, Type.TInteger]>;
46
- mdCode: Type.TUnion<[Type.TString, Type.TInteger]>;
47
- mdCodeBlock: Type.TUnion<[Type.TString, Type.TInteger]>;
48
- mdCodeBlockBorder: Type.TUnion<[Type.TString, Type.TInteger]>;
49
- mdQuote: Type.TUnion<[Type.TString, Type.TInteger]>;
50
- mdQuoteBorder: Type.TUnion<[Type.TString, Type.TInteger]>;
51
- mdHr: Type.TUnion<[Type.TString, Type.TInteger]>;
52
- mdListBullet: Type.TUnion<[Type.TString, Type.TInteger]>;
53
- toolDiffAdded: Type.TUnion<[Type.TString, Type.TInteger]>;
54
- toolDiffRemoved: Type.TUnion<[Type.TString, Type.TInteger]>;
55
- toolDiffContext: Type.TUnion<[Type.TString, Type.TInteger]>;
56
- syntaxComment: Type.TUnion<[Type.TString, Type.TInteger]>;
57
- syntaxKeyword: Type.TUnion<[Type.TString, Type.TInteger]>;
58
- syntaxFunction: Type.TUnion<[Type.TString, Type.TInteger]>;
59
- syntaxVariable: Type.TUnion<[Type.TString, Type.TInteger]>;
60
- syntaxString: Type.TUnion<[Type.TString, Type.TInteger]>;
61
- syntaxNumber: Type.TUnion<[Type.TString, Type.TInteger]>;
62
- syntaxType: Type.TUnion<[Type.TString, Type.TInteger]>;
63
- syntaxOperator: Type.TUnion<[Type.TString, Type.TInteger]>;
64
- syntaxPunctuation: Type.TUnion<[Type.TString, Type.TInteger]>;
65
- thinkingOff: Type.TUnion<[Type.TString, Type.TInteger]>;
66
- thinkingMinimal: Type.TUnion<[Type.TString, Type.TInteger]>;
67
- thinkingLow: Type.TUnion<[Type.TString, Type.TInteger]>;
68
- thinkingMedium: Type.TUnion<[Type.TString, Type.TInteger]>;
69
- thinkingHigh: Type.TUnion<[Type.TString, Type.TInteger]>;
70
- thinkingXhigh: Type.TUnion<[Type.TString, Type.TInteger]>;
71
- thinkingMax: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
72
- bashMode: Type.TUnion<[Type.TString, Type.TInteger]>;
73
- }>;
74
- export: Type.TOptional<Type.TObject<{
75
- pageBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
76
- cardBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
77
- infoBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
78
- }>>;
79
- }>;
80
- export type ThemeColorValue = Static<typeof ColorValueSchema>;
81
- export type ValidatedThemeJson = Static<typeof ThemeJsonSchema>;
82
- /** Validate one theme document, throwing a message that names the offending tokens. */
83
- export declare function validateThemeJson(label: string, json: unknown): ValidatedThemeJson;
84
- export {};
85
- //# sourceMappingURL=theme-json.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-json.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-json.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,QAAA,MAAM,gBAAgB,4CAGpB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EnB,CAAC;AAIH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhE,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,kBAAkB,CA2ClF"}
@@ -1,132 +0,0 @@
1
- /**
2
- * Theme JSON validation, kept out of `theme.ts` on purpose.
3
- *
4
- * Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.
5
- * Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.
6
- * `interactive-mode.ts` installs this validator; anything that does not simply skips validation, as
7
- * built-in themes already do.
8
- */
9
- import { Type } from "typebox";
10
- import { Compile } from "typebox/compile";
11
- const ColorValueSchema = Type.Union([
12
- Type.String(), // hex, OKLCH, OKHSL, var ref "primary", or empty ""
13
- Type.Integer({ minimum: 0, maximum: 255 }), // 256-color index
14
- ]);
15
- const ThemeJsonSchema = Type.Object({
16
- $schema: Type.Optional(Type.String()),
17
- name: Type.String(),
18
- // Background the theme is designed for. Detected from the theme colors when omitted.
19
- appearance: Type.Optional(Type.Union([Type.Literal("dark"), Type.Literal("light")])),
20
- vars: Type.Optional(Type.Record(Type.String(), ColorValueSchema)),
21
- colors: Type.Object({
22
- // Core UI (11 colors)
23
- accent: ColorValueSchema,
24
- border: ColorValueSchema,
25
- borderAccent: ColorValueSchema,
26
- borderMuted: ColorValueSchema,
27
- success: ColorValueSchema,
28
- error: ColorValueSchema,
29
- warning: ColorValueSchema,
30
- muted: ColorValueSchema,
31
- dim: ColorValueSchema,
32
- text: ColorValueSchema,
33
- thinkingText: ColorValueSchema,
34
- // Scrollbar (2 optional colors)
35
- scrollbarTrack: Type.Optional(ColorValueSchema),
36
- scrollbarThumb: Type.Optional(ColorValueSchema),
37
- // Backgrounds & Content Text (11 required, 2 optional)
38
- selectedBg: ColorValueSchema,
39
- searchMatchBg: Type.Optional(ColorValueSchema),
40
- searchMatchText: Type.Optional(ColorValueSchema),
41
- userMessageBg: ColorValueSchema,
42
- userMessageText: ColorValueSchema,
43
- customMessageBg: ColorValueSchema,
44
- customMessageText: ColorValueSchema,
45
- customMessageLabel: ColorValueSchema,
46
- toolPendingBg: ColorValueSchema,
47
- toolSuccessBg: ColorValueSchema,
48
- toolErrorBg: ColorValueSchema,
49
- toolTitle: ColorValueSchema,
50
- toolOutput: ColorValueSchema,
51
- // Markdown (10 colors)
52
- mdHeading: ColorValueSchema,
53
- mdLink: ColorValueSchema,
54
- mdLinkUrl: ColorValueSchema,
55
- mdCode: ColorValueSchema,
56
- mdCodeBlock: ColorValueSchema,
57
- mdCodeBlockBorder: ColorValueSchema,
58
- mdQuote: ColorValueSchema,
59
- mdQuoteBorder: ColorValueSchema,
60
- mdHr: ColorValueSchema,
61
- mdListBullet: ColorValueSchema,
62
- // Tool Diffs (3 colors)
63
- toolDiffAdded: ColorValueSchema,
64
- toolDiffRemoved: ColorValueSchema,
65
- toolDiffContext: ColorValueSchema,
66
- // Syntax Highlighting (9 colors)
67
- syntaxComment: ColorValueSchema,
68
- syntaxKeyword: ColorValueSchema,
69
- syntaxFunction: ColorValueSchema,
70
- syntaxVariable: ColorValueSchema,
71
- syntaxString: ColorValueSchema,
72
- syntaxNumber: ColorValueSchema,
73
- syntaxType: ColorValueSchema,
74
- syntaxOperator: ColorValueSchema,
75
- syntaxPunctuation: ColorValueSchema,
76
- // Thinking Level Borders (6 colors)
77
- thinkingOff: ColorValueSchema,
78
- thinkingMinimal: ColorValueSchema,
79
- thinkingLow: ColorValueSchema,
80
- thinkingMedium: ColorValueSchema,
81
- thinkingHigh: ColorValueSchema,
82
- thinkingXhigh: ColorValueSchema,
83
- thinkingMax: Type.Optional(ColorValueSchema),
84
- // Bash Mode (1 color)
85
- bashMode: ColorValueSchema,
86
- }),
87
- export: Type.Optional(Type.Object({
88
- pageBg: Type.Optional(ColorValueSchema),
89
- cardBg: Type.Optional(ColorValueSchema),
90
- infoBg: Type.Optional(ColorValueSchema),
91
- })),
92
- });
93
- const compiledThemeSchema = Compile(ThemeJsonSchema);
94
- /** Validate one theme document, throwing a message that names the offending tokens. */
95
- export function validateThemeJson(label, json) {
96
- if (!compiledThemeSchema.Check(json)) {
97
- const errors = Array.from(compiledThemeSchema.Errors(json));
98
- const missingColors = new Set();
99
- const otherErrors = [];
100
- for (const error of errors) {
101
- if (error.keyword === "required" && error.instancePath === "/colors") {
102
- const requiredProperties = error.params.requiredProperties;
103
- for (const requiredProperty of requiredProperties ?? []) {
104
- missingColors.add(requiredProperty);
105
- }
106
- continue;
107
- }
108
- const path = error.instancePath || "/";
109
- otherErrors.push(` - ${path}: ${error.message}`);
110
- }
111
- let errorMessage = `Invalid theme "${label}":\n`;
112
- if (missingColors.size > 0) {
113
- errorMessage += "\nMissing required color tokens:\n";
114
- errorMessage += Array.from(missingColors)
115
- .sort()
116
- .map((color) => ` - ${color}`)
117
- .join("\n");
118
- errorMessage += '\n\nPlease add these colors to your theme\'s "colors" object.';
119
- errorMessage += "\nSee the built-in themes (dark.json, light.json) for reference values.";
120
- }
121
- if (otherErrors.length > 0) {
122
- errorMessage += `\n\nOther errors:\n${otherErrors.join("\n")}`;
123
- }
124
- throw new Error(errorMessage);
125
- }
126
- const themeJson = json;
127
- if (themeJson.name.includes("/")) {
128
- throw new Error(`Invalid theme name "${themeJson.name}": theme names cannot contain "/" because it is reserved for automatic light/dark theme settings.`);
129
- }
130
- return themeJson;
131
- }
132
- //# sourceMappingURL=theme-json.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-json.js","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-json.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Theme JSON validation, kept out of `theme.ts` on purpose.\n *\n * Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.\n * Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.\n * `interactive-mode.ts` installs this validator; anything that does not simply skips validation, as\n * built-in themes already do.\n */\n\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\n\nconst ColorValueSchema = Type.Union([\n\tType.String(), // hex, OKLCH, OKHSL, var ref \"primary\", or empty \"\"\n\tType.Integer({ minimum: 0, maximum: 255 }), // 256-color index\n]);\n\nconst ThemeJsonSchema = Type.Object({\n\t$schema: Type.Optional(Type.String()),\n\tname: Type.String(),\n\t// Background the theme is designed for. Detected from the theme colors when omitted.\n\tappearance: Type.Optional(Type.Union([Type.Literal(\"dark\"), Type.Literal(\"light\")])),\n\tvars: Type.Optional(Type.Record(Type.String(), ColorValueSchema)),\n\tcolors: Type.Object({\n\t\t// Core UI (11 colors)\n\t\taccent: ColorValueSchema,\n\t\tborder: ColorValueSchema,\n\t\tborderAccent: ColorValueSchema,\n\t\tborderMuted: ColorValueSchema,\n\t\tsuccess: ColorValueSchema,\n\t\terror: ColorValueSchema,\n\t\twarning: ColorValueSchema,\n\t\tmuted: ColorValueSchema,\n\t\tdim: ColorValueSchema,\n\t\ttext: ColorValueSchema,\n\t\tthinkingText: ColorValueSchema,\n\t\t// Scrollbar (2 optional colors)\n\t\tscrollbarTrack: Type.Optional(ColorValueSchema),\n\t\tscrollbarThumb: Type.Optional(ColorValueSchema),\n\t\t// Backgrounds & Content Text (11 required, 2 optional)\n\t\tselectedBg: ColorValueSchema,\n\t\tsearchMatchBg: Type.Optional(ColorValueSchema),\n\t\tsearchMatchText: Type.Optional(ColorValueSchema),\n\t\tuserMessageBg: ColorValueSchema,\n\t\tuserMessageText: ColorValueSchema,\n\t\tcustomMessageBg: ColorValueSchema,\n\t\tcustomMessageText: ColorValueSchema,\n\t\tcustomMessageLabel: ColorValueSchema,\n\t\ttoolPendingBg: ColorValueSchema,\n\t\ttoolSuccessBg: ColorValueSchema,\n\t\ttoolErrorBg: ColorValueSchema,\n\t\ttoolTitle: ColorValueSchema,\n\t\ttoolOutput: ColorValueSchema,\n\t\t// Markdown (10 colors)\n\t\tmdHeading: ColorValueSchema,\n\t\tmdLink: ColorValueSchema,\n\t\tmdLinkUrl: ColorValueSchema,\n\t\tmdCode: ColorValueSchema,\n\t\tmdCodeBlock: ColorValueSchema,\n\t\tmdCodeBlockBorder: ColorValueSchema,\n\t\tmdQuote: ColorValueSchema,\n\t\tmdQuoteBorder: ColorValueSchema,\n\t\tmdHr: ColorValueSchema,\n\t\tmdListBullet: ColorValueSchema,\n\t\t// Tool Diffs (3 colors)\n\t\ttoolDiffAdded: ColorValueSchema,\n\t\ttoolDiffRemoved: ColorValueSchema,\n\t\ttoolDiffContext: ColorValueSchema,\n\t\t// Syntax Highlighting (9 colors)\n\t\tsyntaxComment: ColorValueSchema,\n\t\tsyntaxKeyword: ColorValueSchema,\n\t\tsyntaxFunction: ColorValueSchema,\n\t\tsyntaxVariable: ColorValueSchema,\n\t\tsyntaxString: ColorValueSchema,\n\t\tsyntaxNumber: ColorValueSchema,\n\t\tsyntaxType: ColorValueSchema,\n\t\tsyntaxOperator: ColorValueSchema,\n\t\tsyntaxPunctuation: ColorValueSchema,\n\t\t// Thinking Level Borders (6 colors)\n\t\tthinkingOff: ColorValueSchema,\n\t\tthinkingMinimal: ColorValueSchema,\n\t\tthinkingLow: ColorValueSchema,\n\t\tthinkingMedium: ColorValueSchema,\n\t\tthinkingHigh: ColorValueSchema,\n\t\tthinkingXhigh: ColorValueSchema,\n\t\tthinkingMax: Type.Optional(ColorValueSchema),\n\t\t// Bash Mode (1 color)\n\t\tbashMode: ColorValueSchema,\n\t}),\n\texport: Type.Optional(\n\t\tType.Object({\n\t\t\tpageBg: Type.Optional(ColorValueSchema),\n\t\t\tcardBg: Type.Optional(ColorValueSchema),\n\t\t\tinfoBg: Type.Optional(ColorValueSchema),\n\t\t}),\n\t),\n});\n\nconst compiledThemeSchema = Compile(ThemeJsonSchema);\n\nexport type ThemeColorValue = Static<typeof ColorValueSchema>;\nexport type ValidatedThemeJson = Static<typeof ThemeJsonSchema>;\n\n/** Validate one theme document, throwing a message that names the offending tokens. */\nexport function validateThemeJson(label: string, json: unknown): ValidatedThemeJson {\n\tif (!compiledThemeSchema.Check(json)) {\n\t\tconst errors = Array.from(compiledThemeSchema.Errors(json));\n\t\tconst missingColors = new Set<string>();\n\t\tconst otherErrors: string[] = [];\n\n\t\tfor (const error of errors) {\n\t\t\tif (error.keyword === \"required\" && error.instancePath === \"/colors\") {\n\t\t\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\t\t\tfor (const requiredProperty of requiredProperties ?? []) {\n\t\t\t\t\tmissingColors.add(requiredProperty);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst path = error.instancePath || \"/\";\n\t\t\totherErrors.push(` - ${path}: ${error.message}`);\n\t\t}\n\n\t\tlet errorMessage = `Invalid theme \"${label}\":\\n`;\n\t\tif (missingColors.size > 0) {\n\t\t\terrorMessage += \"\\nMissing required color tokens:\\n\";\n\t\t\terrorMessage += Array.from(missingColors)\n\t\t\t\t.sort()\n\t\t\t\t.map((color) => ` - ${color}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage += '\\n\\nPlease add these colors to your theme\\'s \"colors\" object.';\n\t\t\terrorMessage += \"\\nSee the built-in themes (dark.json, light.json) for reference values.\";\n\t\t}\n\t\tif (otherErrors.length > 0) {\n\t\t\terrorMessage += `\\n\\nOther errors:\\n${otherErrors.join(\"\\n\")}`;\n\t\t}\n\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tconst themeJson = json as ValidatedThemeJson;\n\tif (themeJson.name.includes(\"/\")) {\n\t\tthrow new Error(\n\t\t\t`Invalid theme name \"${themeJson.name}\": theme names cannot contain \"/\" because it is reserved for automatic light/dark theme settings.`,\n\t\t);\n\t}\n\treturn themeJson;\n}\n"]}