@astralyn/pi 0.99.0 → 1.0.1

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 (569) hide show
  1. package/CHANGELOG.md +58 -3
  2. package/dist/bundle/chunks/anthropic-messages-YET4T7BO.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +2 -2
  4. package/dist/bundle/chunks/azure-openai-responses-SBLL5YN3.js +2 -0
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +3 -3
  6. package/dist/bundle/chunks/chunk-4TT2QGFL.js +2 -0
  7. package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
  8. package/dist/bundle/chunks/{chunk-VW2P3X6P.js → chunk-H2N2THAO.js} +436 -668
  9. package/dist/bundle/chunks/{chunk-A576H74Y.js → chunk-IZ3S3GDX.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-ABVRAYXT.js → chunk-NY3CWK44.js} +2 -2
  11. package/dist/bundle/chunks/chunk-SVJ7OGEB.js +2 -0
  12. package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
  13. package/dist/bundle/chunks/{chunk-DEWXBB6W.js → chunk-V66VGGOM.js} +1 -1
  14. package/dist/bundle/chunks/chunk-XDYM2567.js +20 -0
  15. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-ZYSAFXXL.js → cloudflare-workers-ai-system-one-QI46LUZ6.js} +1 -1
  16. package/dist/bundle/chunks/codemode-worker.js +90 -10
  17. package/dist/bundle/chunks/github-copilot.js +1 -1
  18. package/dist/bundle/chunks/{google-generative-ai-SDNQVVXA.js → google-generative-ai-YTZCSHQN.js} +1 -1
  19. package/dist/bundle/chunks/{google-vertex-LZXOLBIO.js → google-vertex-OTFZJJXQ.js} +1 -1
  20. package/dist/bundle/chunks/{llama-cpp-classify-7IYGGPND.js → llama-cpp-classify-R7DQLTQN.js} +1 -1
  21. package/dist/bundle/chunks/{mistral-conversations-VYKPSSAM.js → mistral-conversations-ELH4V4TY.js} +1 -1
  22. package/dist/bundle/chunks/node-USQQ7C6M.js +16 -0
  23. package/dist/bundle/chunks/openai-chatgpt.js +2 -2
  24. package/dist/bundle/chunks/{openai-codex-responses-HZ4VUDXD.js → openai-codex-responses-OLVTU4UA.js} +1 -1
  25. package/dist/bundle/chunks/openai-codex.js +1 -1
  26. package/dist/bundle/chunks/openai-completions-53M2KJ67.js +7 -0
  27. package/dist/bundle/chunks/openai-responses-4ABDEL4Z.js +3 -0
  28. package/dist/bundle/chunks/{openrouter-images-5524IQHX.js → openrouter-images-YP3YVB54.js} +1 -1
  29. package/dist/bundle/chunks/openrouter.js +1 -1
  30. package/dist/bundle/chunks/radius.js +1 -1
  31. package/dist/bundle/chunks/{typesafe-system-one-Z2CDLKEY.js → typesafe-system-one-RREJAKWB.js} +1 -1
  32. package/dist/bundle/chunks/virtual-modules-YFKU7JZF.js +2 -0
  33. package/dist/bundle/cli.js +1 -1
  34. package/dist/bundle/index.js +1 -1
  35. package/dist/bundle/rpc-entry.js +1 -1
  36. package/dist/cli/args.d.ts.map +1 -1
  37. package/dist/cli/args.js +5 -2
  38. package/dist/cli/args.js.map +1 -1
  39. package/dist/config.d.ts +5 -8
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +19 -13
  42. package/dist/config.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +21 -1
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +65 -12
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/export-html/tool-renderer.d.ts +3 -3
  48. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  49. package/dist/core/export-html/tool-renderer.js +3 -3
  50. package/dist/core/export-html/tool-renderer.js.map +1 -1
  51. package/dist/core/extensions/index.d.ts +2 -2
  52. package/dist/core/extensions/index.d.ts.map +1 -1
  53. package/dist/core/extensions/index.js.map +1 -1
  54. package/dist/core/extensions/loader.d.ts.map +1 -1
  55. package/dist/core/extensions/loader.js +18 -1
  56. package/dist/core/extensions/loader.js.map +1 -1
  57. package/dist/core/extensions/runner.d.ts +3 -1
  58. package/dist/core/extensions/runner.d.ts.map +1 -1
  59. package/dist/core/extensions/runner.js +6 -0
  60. package/dist/core/extensions/runner.js.map +1 -1
  61. package/dist/core/extensions/types.d.ts +15 -1
  62. package/dist/core/extensions/types.d.ts.map +1 -1
  63. package/dist/core/extensions/types.js.map +1 -1
  64. package/dist/core/keybindings.d.ts +51 -11
  65. package/dist/core/keybindings.d.ts.map +1 -1
  66. package/dist/core/keybindings.js +11 -3
  67. package/dist/core/keybindings.js.map +1 -1
  68. package/dist/core/mcp-servers.d.ts +40 -7
  69. package/dist/core/mcp-servers.d.ts.map +1 -1
  70. package/dist/core/mcp-servers.js +63 -11
  71. package/dist/core/mcp-servers.js.map +1 -1
  72. package/dist/core/model-config.d.ts +36 -0
  73. package/dist/core/model-config.d.ts.map +1 -1
  74. package/dist/core/model-config.js +14 -2
  75. package/dist/core/model-config.js.map +1 -1
  76. package/dist/core/model-registry.d.ts +3 -1
  77. package/dist/core/model-registry.d.ts.map +1 -1
  78. package/dist/core/model-registry.js +4 -0
  79. package/dist/core/model-registry.js.map +1 -1
  80. package/dist/core/model-resolver.js +1 -1
  81. package/dist/core/model-resolver.js.map +1 -1
  82. package/dist/core/model-runtime.d.ts +6 -0
  83. package/dist/core/model-runtime.d.ts.map +1 -1
  84. package/dist/core/model-runtime.js +22 -18
  85. package/dist/core/model-runtime.js.map +1 -1
  86. package/dist/core/provider-composer.d.ts +2 -1
  87. package/dist/core/provider-composer.d.ts.map +1 -1
  88. package/dist/core/provider-composer.js +13 -0
  89. package/dist/core/provider-composer.js.map +1 -1
  90. package/dist/core/radius.d.ts +2 -0
  91. package/dist/core/radius.d.ts.map +1 -1
  92. package/dist/core/radius.js +2 -0
  93. package/dist/core/radius.js.map +1 -1
  94. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  95. package/dist/core/remote-catalog-provider.js +4 -9
  96. package/dist/core/remote-catalog-provider.js.map +1 -1
  97. package/dist/core/sdk.d.ts.map +1 -1
  98. package/dist/core/sdk.js +1 -0
  99. package/dist/core/sdk.js.map +1 -1
  100. package/dist/core/settings-manager.d.ts +7 -5
  101. package/dist/core/settings-manager.d.ts.map +1 -1
  102. package/dist/core/settings-manager.js +2 -1
  103. package/dist/core/settings-manager.js.map +1 -1
  104. package/dist/core/system-prompt.js +1 -1
  105. package/dist/core/system-prompt.js.map +1 -1
  106. package/dist/core/tasks/format.d.ts +7 -0
  107. package/dist/core/tasks/format.d.ts.map +1 -0
  108. package/dist/core/tasks/format.js +14 -0
  109. package/dist/core/tasks/format.js.map +1 -0
  110. package/dist/core/tasks/history.d.ts.map +1 -1
  111. package/dist/core/tasks/history.js +0 -19
  112. package/dist/core/tasks/history.js.map +1 -1
  113. package/dist/core/tasks/output.d.ts +8 -0
  114. package/dist/core/tasks/output.d.ts.map +1 -1
  115. package/dist/core/tasks/output.js +19 -0
  116. package/dist/core/tasks/output.js.map +1 -1
  117. package/dist/core/tasks/presentation.d.ts +1 -3
  118. package/dist/core/tasks/presentation.d.ts.map +1 -1
  119. package/dist/core/tasks/presentation.js +79 -166
  120. package/dist/core/tasks/presentation.js.map +1 -1
  121. package/dist/core/tasks/runtime.d.ts +16 -9
  122. package/dist/core/tasks/runtime.d.ts.map +1 -1
  123. package/dist/core/tasks/runtime.js +89 -106
  124. package/dist/core/tasks/runtime.js.map +1 -1
  125. package/dist/core/tasks/session.d.ts.map +1 -1
  126. package/dist/core/tasks/session.js +13 -4
  127. package/dist/core/tasks/session.js.map +1 -1
  128. package/dist/core/tasks/store.d.ts +20 -6
  129. package/dist/core/tasks/store.d.ts.map +1 -1
  130. package/dist/core/tasks/store.js +45 -18
  131. package/dist/core/tasks/store.js.map +1 -1
  132. package/dist/core/tasks/types.d.ts +14 -54
  133. package/dist/core/tasks/types.d.ts.map +1 -1
  134. package/dist/core/tasks/types.js +1 -5
  135. package/dist/core/tasks/types.js.map +1 -1
  136. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  137. package/dist/core/tools/renderers/bash.js +11 -34
  138. package/dist/core/tools/renderers/bash.js.map +1 -1
  139. package/dist/core/tools/renderers/index.d.ts +2 -2
  140. package/dist/core/tools/renderers/index.d.ts.map +1 -1
  141. package/dist/core/tools/renderers/index.js.map +1 -1
  142. package/dist/core/tools/shell-execution.d.ts +0 -1
  143. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  144. package/dist/core/tools/shell-execution.js +3 -10
  145. package/dist/core/tools/shell-execution.js.map +1 -1
  146. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  147. package/dist/core/tools/shell-tool.js +2 -4
  148. package/dist/core/tools/shell-tool.js.map +1 -1
  149. package/dist/core/tools/tasks/actions.d.ts +1 -1
  150. package/dist/core/tools/tasks/actions.d.ts.map +1 -1
  151. package/dist/core/tools/tasks/actions.js +26 -12
  152. package/dist/core/tools/tasks/actions.js.map +1 -1
  153. package/dist/core/tools/tasks/constants.d.ts +2 -6
  154. package/dist/core/tools/tasks/constants.d.ts.map +1 -1
  155. package/dist/core/tools/tasks/constants.js +2 -6
  156. package/dist/core/tools/tasks/constants.js.map +1 -1
  157. package/dist/core/tools/tasks/schema.d.ts +1 -1
  158. package/dist/core/tools/tasks/schema.d.ts.map +1 -1
  159. package/dist/core/tools/tasks/schema.js +8 -7
  160. package/dist/core/tools/tasks/schema.js.map +1 -1
  161. package/dist/core/tools/tasks/types.d.ts +8 -38
  162. package/dist/core/tools/tasks/types.d.ts.map +1 -1
  163. package/dist/core/tools/tasks/types.js +6 -11
  164. package/dist/core/tools/tasks/types.js.map +1 -1
  165. package/dist/core/virtual-models.d.ts +2 -0
  166. package/dist/core/virtual-models.d.ts.map +1 -1
  167. package/dist/core/virtual-models.js +19 -12
  168. package/dist/core/virtual-models.js.map +1 -1
  169. package/dist/extensions/btw/agent.d.ts +17 -8
  170. package/dist/extensions/btw/agent.d.ts.map +1 -1
  171. package/dist/extensions/btw/agent.js +74 -76
  172. package/dist/extensions/btw/agent.js.map +1 -1
  173. package/dist/extensions/btw/controller.d.ts +0 -1
  174. package/dist/extensions/btw/controller.d.ts.map +1 -1
  175. package/dist/extensions/btw/controller.js +26 -33
  176. package/dist/extensions/btw/controller.js.map +1 -1
  177. package/dist/extensions/btw/panel.d.ts +13 -14
  178. package/dist/extensions/btw/panel.d.ts.map +1 -1
  179. package/dist/extensions/btw/panel.js +38 -29
  180. package/dist/extensions/btw/panel.js.map +1 -1
  181. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  182. package/dist/extensions/codemode/execute.js +197 -51
  183. package/dist/extensions/codemode/execute.js.map +1 -1
  184. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  185. package/dist/extensions/codemode/renderer.js +43 -25
  186. package/dist/extensions/codemode/renderer.js.map +1 -1
  187. package/dist/extensions/codemode/tool.d.ts +12 -11
  188. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  189. package/dist/extensions/codemode/tool.js +73 -129
  190. package/dist/extensions/codemode/tool.js.map +1 -1
  191. package/dist/extensions/codemode/worker.d.ts +1 -1
  192. package/dist/extensions/codemode/worker.js +1 -1
  193. package/dist/extensions/codemode/worker.js.map +1 -1
  194. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  195. package/dist/extensions/index.d.ts.map +1 -1
  196. package/dist/extensions/index.js +0 -2
  197. package/dist/extensions/index.js.map +1 -1
  198. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  199. package/dist/extensions/mcp/cli.js +23 -5
  200. package/dist/extensions/mcp/cli.js.map +1 -1
  201. package/dist/extensions/mcp/config.d.ts +19 -5
  202. package/dist/extensions/mcp/config.d.ts.map +1 -1
  203. package/dist/extensions/mcp/config.js +60 -12
  204. package/dist/extensions/mcp/config.js.map +1 -1
  205. package/dist/extensions/mcp/index.d.ts +36 -9
  206. package/dist/extensions/mcp/index.d.ts.map +1 -1
  207. package/dist/extensions/mcp/index.js +309 -100
  208. package/dist/extensions/mcp/index.js.map +1 -1
  209. package/dist/extensions/mcp/oauth.d.ts +14 -8
  210. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  211. package/dist/extensions/mcp/oauth.js +105 -36
  212. package/dist/extensions/mcp/oauth.js.map +1 -1
  213. package/dist/extensions/mcp/runtime.d.ts +2 -0
  214. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  215. package/dist/extensions/mcp/runtime.js +17 -9
  216. package/dist/extensions/mcp/runtime.js.map +1 -1
  217. package/dist/extensions/mcp/tools.d.ts +8 -5
  218. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  219. package/dist/extensions/mcp/tools.js +50 -26
  220. package/dist/extensions/mcp/tools.js.map +1 -1
  221. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  222. package/dist/extensions/mcp/ui.js +7 -1
  223. package/dist/extensions/mcp/ui.js.map +1 -1
  224. package/dist/extensions/provider/catalog.d.ts +8 -1
  225. package/dist/extensions/provider/catalog.d.ts.map +1 -1
  226. package/dist/extensions/provider/catalog.js +31 -0
  227. package/dist/extensions/provider/catalog.js.map +1 -1
  228. package/dist/extensions/provider/connection.d.ts +4 -1
  229. package/dist/extensions/provider/connection.d.ts.map +1 -1
  230. package/dist/extensions/provider/connection.js +1 -5
  231. package/dist/extensions/provider/connection.js.map +1 -1
  232. package/dist/extensions/provider/editing.d.ts +36 -0
  233. package/dist/extensions/provider/editing.d.ts.map +1 -0
  234. package/dist/extensions/provider/editing.js +99 -0
  235. package/dist/extensions/provider/editing.js.map +1 -0
  236. package/dist/extensions/provider/json-fields.d.ts +5 -0
  237. package/dist/extensions/provider/json-fields.d.ts.map +1 -0
  238. package/dist/extensions/provider/json-fields.js +31 -0
  239. package/dist/extensions/provider/json-fields.js.map +1 -0
  240. package/dist/extensions/provider/store.d.ts +1 -4
  241. package/dist/extensions/provider/store.d.ts.map +1 -1
  242. package/dist/extensions/provider/store.js +2 -30
  243. package/dist/extensions/provider/store.js.map +1 -1
  244. package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
  245. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  246. package/dist/extensions/provider/ui/builtin-data.js +14 -79
  247. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  248. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  249. package/dist/extensions/provider/ui/compat.js +6 -9
  250. package/dist/extensions/provider/ui/compat.js.map +1 -1
  251. package/dist/extensions/provider/ui/controls.d.ts +48 -0
  252. package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
  253. package/dist/extensions/provider/ui/controls.js +108 -0
  254. package/dist/extensions/provider/ui/controls.js.map +1 -0
  255. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  256. package/dist/extensions/provider/ui/dictionary.js +6 -9
  257. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  258. package/dist/extensions/provider/ui/editor.d.ts +3 -3
  259. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  260. package/dist/extensions/provider/ui/editor.js +35 -140
  261. package/dist/extensions/provider/ui/editor.js.map +1 -1
  262. package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
  263. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  264. package/dist/extensions/provider/ui/fetch-models.js +49 -44
  265. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  266. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  267. package/dist/extensions/provider/ui/model-fields.js +11 -14
  268. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  269. package/dist/extensions/provider/ui/model-options.d.ts +4 -34
  270. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  271. package/dist/extensions/provider/ui/model-options.js +90 -271
  272. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  273. package/dist/extensions/provider/ui/pane.d.ts +4 -18
  274. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  275. package/dist/extensions/provider/ui/pane.js.map +1 -1
  276. package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
  277. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  278. package/dist/extensions/provider/ui/provider-fields.js +58 -171
  279. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  280. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  281. package/dist/extensions/provider/ui/thinking-map.js +6 -9
  282. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  283. package/dist/extensions/question/detail-pane.d.ts +7 -2
  284. package/dist/extensions/question/detail-pane.d.ts.map +1 -1
  285. package/dist/extensions/question/detail-pane.js +16 -5
  286. package/dist/extensions/question/detail-pane.js.map +1 -1
  287. package/dist/extensions/question/dialog-view.d.ts +41 -0
  288. package/dist/extensions/question/dialog-view.d.ts.map +1 -0
  289. package/dist/extensions/question/dialog-view.js +329 -0
  290. package/dist/extensions/question/dialog-view.js.map +1 -0
  291. package/dist/extensions/question/dialog.d.ts +3 -3
  292. package/dist/extensions/question/dialog.d.ts.map +1 -1
  293. package/dist/extensions/question/dialog.js +220 -634
  294. package/dist/extensions/question/dialog.js.map +1 -1
  295. package/dist/extensions/question/index.d.ts.map +1 -1
  296. package/dist/extensions/question/index.js +2 -3
  297. package/dist/extensions/question/index.js.map +1 -1
  298. package/dist/extensions/question/render.d.ts.map +1 -1
  299. package/dist/extensions/question/render.js +22 -32
  300. package/dist/extensions/question/render.js.map +1 -1
  301. package/dist/extensions/question/results.d.ts.map +1 -1
  302. package/dist/extensions/question/results.js +56 -12
  303. package/dist/extensions/question/results.js.map +1 -1
  304. package/dist/extensions/question/schema.d.ts +21 -6
  305. package/dist/extensions/question/schema.d.ts.map +1 -1
  306. package/dist/extensions/question/schema.js.map +1 -1
  307. package/dist/extensions/question/state.d.ts +9 -7
  308. package/dist/extensions/question/state.d.ts.map +1 -1
  309. package/dist/extensions/question/state.js +63 -54
  310. package/dist/extensions/question/state.js.map +1 -1
  311. package/dist/extensions/question/types.d.ts +41 -18
  312. package/dist/extensions/question/types.d.ts.map +1 -1
  313. package/dist/extensions/question/types.js.map +1 -1
  314. package/dist/extensions/statusline/index.d.ts +4 -0
  315. package/dist/extensions/statusline/index.d.ts.map +1 -1
  316. package/dist/extensions/statusline/index.js +18 -355
  317. package/dist/extensions/statusline/index.js.map +1 -1
  318. package/dist/extensions/statusline/render.d.ts +19 -0
  319. package/dist/extensions/statusline/render.d.ts.map +1 -0
  320. package/dist/extensions/statusline/render.js +163 -0
  321. package/dist/extensions/statusline/render.js.map +1 -0
  322. package/dist/extensions/statusline/usage.d.ts +12 -0
  323. package/dist/extensions/statusline/usage.d.ts.map +1 -0
  324. package/dist/extensions/statusline/usage.js +36 -0
  325. package/dist/extensions/statusline/usage.js.map +1 -0
  326. package/dist/extensions/tool-search/tool.d.ts +5 -4
  327. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  328. package/dist/extensions/tool-search/tool.js +7 -28
  329. package/dist/extensions/tool-search/tool.js.map +1 -1
  330. package/dist/extensions/web-search/execute.d.ts +1 -5
  331. package/dist/extensions/web-search/execute.d.ts.map +1 -1
  332. package/dist/extensions/web-search/execute.js +4 -9
  333. package/dist/extensions/web-search/execute.js.map +1 -1
  334. package/dist/extensions/web-search/format.d.ts +12 -3
  335. package/dist/extensions/web-search/format.d.ts.map +1 -1
  336. package/dist/extensions/web-search/format.js +33 -25
  337. package/dist/extensions/web-search/format.js.map +1 -1
  338. package/dist/extensions/web-search/index.d.ts.map +1 -1
  339. package/dist/extensions/web-search/index.js +6 -29
  340. package/dist/extensions/web-search/index.js.map +1 -1
  341. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
  342. package/dist/extensions/web-search/providers/deepseek.js +0 -1
  343. package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
  344. package/dist/extensions/web-search/providers/http.d.ts +1 -1
  345. package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
  346. package/dist/extensions/web-search/providers/http.js.map +1 -1
  347. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
  348. package/dist/extensions/web-search/providers/minimax.js +0 -1
  349. package/dist/extensions/web-search/providers/minimax.js.map +1 -1
  350. package/dist/extensions/web-search/render.d.ts +7 -2
  351. package/dist/extensions/web-search/render.d.ts.map +1 -1
  352. package/dist/extensions/web-search/render.js +32 -4
  353. package/dist/extensions/web-search/render.js.map +1 -1
  354. package/dist/extensions/web-search/results.d.ts.map +1 -1
  355. package/dist/extensions/web-search/results.js +3 -8
  356. package/dist/extensions/web-search/results.js.map +1 -1
  357. package/dist/extensions/web-search/types.d.ts +4 -2
  358. package/dist/extensions/web-search/types.d.ts.map +1 -1
  359. package/dist/extensions/web-search/types.js.map +1 -1
  360. package/dist/index.d.ts +3 -5
  361. package/dist/index.d.ts.map +1 -1
  362. package/dist/index.js +0 -1
  363. package/dist/index.js.map +1 -1
  364. package/dist/main.d.ts.map +1 -1
  365. package/dist/main.js +6 -0
  366. package/dist/main.js.map +1 -1
  367. package/dist/modes/interactive/components/armin.d.ts +3 -0
  368. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  369. package/dist/modes/interactive/components/armin.js +7 -5
  370. package/dist/modes/interactive/components/armin.js.map +1 -1
  371. package/dist/modes/interactive/components/auth-url.d.ts +14 -0
  372. package/dist/modes/interactive/components/auth-url.d.ts.map +1 -0
  373. package/dist/modes/interactive/components/auth-url.js +34 -0
  374. package/dist/modes/interactive/components/auth-url.js.map +1 -0
  375. package/dist/modes/interactive/components/easter-egg-3d.d.ts +104 -0
  376. package/dist/modes/interactive/components/easter-egg-3d.d.ts.map +1 -0
  377. package/dist/modes/interactive/components/easter-egg-3d.js +1123 -0
  378. package/dist/modes/interactive/components/easter-egg-3d.js.map +1 -0
  379. package/dist/modes/interactive/components/easter-egg-3d.lazy.d.ts +6 -0
  380. package/dist/modes/interactive/components/easter-egg-3d.lazy.d.ts.map +1 -0
  381. package/dist/modes/interactive/components/easter-egg-3d.lazy.js +24 -0
  382. package/dist/modes/interactive/components/easter-egg-3d.lazy.js.map +1 -0
  383. package/dist/modes/interactive/components/index.d.ts +0 -1
  384. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  385. package/dist/modes/interactive/components/index.js +0 -1
  386. package/dist/modes/interactive/components/index.js.map +1 -1
  387. package/dist/modes/interactive/components/login-dialog.d.ts +2 -0
  388. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/login-dialog.js +9 -5
  390. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  391. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  392. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  393. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  394. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  395. package/dist/modes/interactive/components/pi-logo.d.ts +7 -0
  396. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -1
  397. package/dist/modes/interactive/components/pi-logo.js +13 -1
  398. package/dist/modes/interactive/components/pi-logo.js.map +1 -1
  399. package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
  400. package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
  401. package/dist/modes/interactive/components/radius-login-selector.js +83 -0
  402. package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
  403. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  404. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  405. package/dist/modes/interactive/components/settings-selector.js +5 -5
  406. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  407. package/dist/modes/interactive/components/status-marker.d.ts +0 -2
  408. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  409. package/dist/modes/interactive/components/status-marker.js +0 -4
  410. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  411. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  412. package/dist/modes/interactive/components/user-message.js +5 -4
  413. package/dist/modes/interactive/components/user-message.js.map +1 -1
  414. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  415. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  416. package/dist/modes/interactive/components/visual-truncate.js +36 -6
  417. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  418. package/dist/modes/interactive/interactive-mode.d.ts +12 -2
  419. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  420. package/dist/modes/interactive/interactive-mode.js +180 -55
  421. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  422. package/dist/modes/interactive/tasks/completion-render.d.ts +1 -1
  423. package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -1
  424. package/dist/modes/interactive/tasks/completion-render.js +28 -82
  425. package/dist/modes/interactive/tasks/completion-render.js.map +1 -1
  426. package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
  427. package/dist/modes/interactive/tasks/index.js +18 -13
  428. package/dist/modes/interactive/tasks/index.js.map +1 -1
  429. package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
  430. package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
  431. package/dist/modes/interactive/tasks/inspector.js +93 -0
  432. package/dist/modes/interactive/tasks/inspector.js.map +1 -0
  433. package/dist/modes/interactive/tasks/layout.d.ts +40 -0
  434. package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
  435. package/dist/modes/interactive/tasks/layout.js +212 -0
  436. package/dist/modes/interactive/tasks/layout.js.map +1 -0
  437. package/dist/modes/interactive/tasks/list.d.ts +21 -0
  438. package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
  439. package/dist/modes/interactive/tasks/list.js +96 -0
  440. package/dist/modes/interactive/tasks/list.js.map +1 -0
  441. package/dist/modes/interactive/tasks/manager.d.ts +29 -36
  442. package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
  443. package/dist/modes/interactive/tasks/manager.js +315 -315
  444. package/dist/modes/interactive/tasks/manager.js.map +1 -1
  445. package/dist/modes/interactive/tasks/model.d.ts +21 -0
  446. package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
  447. package/dist/modes/interactive/tasks/model.js +41 -0
  448. package/dist/modes/interactive/tasks/model.js.map +1 -0
  449. package/dist/modes/interactive/tasks/render.d.ts +5 -19
  450. package/dist/modes/interactive/tasks/render.d.ts.map +1 -1
  451. package/dist/modes/interactive/tasks/render.js +18 -102
  452. package/dist/modes/interactive/tasks/render.js.map +1 -1
  453. package/dist/modes/interactive/tasks/task-view.d.ts +8 -48
  454. package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -1
  455. package/dist/modes/interactive/tasks/task-view.js +11 -51
  456. package/dist/modes/interactive/tasks/task-view.js.map +1 -1
  457. package/dist/modes/interactive/tasks/text.d.ts +1 -7
  458. package/dist/modes/interactive/tasks/text.d.ts.map +1 -1
  459. package/dist/modes/interactive/tasks/text.js +6 -29
  460. package/dist/modes/interactive/tasks/text.js.map +1 -1
  461. package/dist/modes/interactive/tasks/viewport.d.ts +2 -0
  462. package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -1
  463. package/dist/modes/interactive/tasks/viewport.js +17 -7
  464. package/dist/modes/interactive/tasks/viewport.js.map +1 -1
  465. package/dist/modes/interactive/tasks/views.d.ts +9 -0
  466. package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
  467. package/dist/modes/interactive/tasks/views.js +42 -0
  468. package/dist/modes/interactive/tasks/views.js.map +1 -0
  469. package/dist/modes/interactive/theme/system-theme.d.ts +2 -1
  470. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
  471. package/dist/modes/interactive/theme/system-theme.js +16 -5
  472. package/dist/modes/interactive/theme/system-theme.js.map +1 -1
  473. package/dist/modes/interactive/tool-view/tool-execution.d.ts +4 -19
  474. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
  475. package/dist/modes/interactive/tool-view/tool-execution.js +23 -67
  476. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
  477. package/dist/utils/image-convert.d.ts +12 -0
  478. package/dist/utils/image-convert.d.ts.map +1 -1
  479. package/dist/utils/image-convert.js +45 -6
  480. package/dist/utils/image-convert.js.map +1 -1
  481. package/docs/bundled/README.md +0 -1
  482. package/docs/bundled/extensions/question.md +2 -2
  483. package/docs/bundled/extensions/statusline.md +24 -15
  484. package/docs/bundled/tasks.md +34 -48
  485. package/docs/codemode.md +207 -0
  486. package/docs/docs.json +4 -4
  487. package/docs/environment-variables.md +1 -1
  488. package/docs/extensions.md +11 -9
  489. package/docs/keybindings.md +14 -7
  490. package/docs/mcp.md +164 -82
  491. package/docs/models.md +51 -3
  492. package/docs/providers.md +8 -0
  493. package/docs/sdk.md +2 -2
  494. package/docs/session-format.md +12 -22
  495. package/docs/settings.md +4 -2
  496. package/docs/tui.md +1 -1
  497. package/docs/usage.md +6 -16
  498. package/examples/README.md +1 -1
  499. package/examples/extensions/README.md +1 -2
  500. package/examples/extensions/built-in-tool-renderer.ts +16 -40
  501. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  502. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  503. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  504. package/examples/extensions/gondolin/package-lock.json +2 -2
  505. package/examples/extensions/gondolin/package.json +1 -1
  506. package/examples/extensions/minimal-mode.ts +24 -96
  507. package/examples/extensions/sandbox/package-lock.json +2 -2
  508. package/examples/extensions/sandbox/package.json +1 -1
  509. package/examples/extensions/with-deps/package-lock.json +2 -2
  510. package/examples/extensions/with-deps/package.json +1 -1
  511. package/examples/sdk/14-codemode-mcp.ts +2 -2
  512. package/npm-shrinkwrap.json +73 -62
  513. package/package.json +11 -10
  514. package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +0 -6
  515. package/dist/bundle/chunks/azure-openai-responses-RPBERDXD.js +0 -2
  516. package/dist/bundle/chunks/chunk-CLLDCO64.js +0 -2
  517. package/dist/bundle/chunks/chunk-PJVFYVHE.js +0 -42
  518. package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
  519. package/dist/bundle/chunks/chunk-VWCWZD6E.js +0 -2
  520. package/dist/bundle/chunks/node-CXWYTK2I.js +0 -16
  521. package/dist/bundle/chunks/openai-completions-SKDGF6OE.js +0 -7
  522. package/dist/bundle/chunks/openai-responses-FPML4SSG.js +0 -3
  523. package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +0 -2
  524. package/dist/core/tasks/view-data.d.ts +0 -8
  525. package/dist/core/tasks/view-data.d.ts.map +0 -1
  526. package/dist/core/tasks/view-data.js +0 -61
  527. package/dist/core/tasks/view-data.js.map +0 -1
  528. package/dist/core/tasks/view.d.ts +0 -30
  529. package/dist/core/tasks/view.d.ts.map +0 -1
  530. package/dist/core/tasks/view.js +0 -50
  531. package/dist/core/tasks/view.js.map +0 -1
  532. package/dist/core/tools/renderers/shell-task.d.ts +0 -4
  533. package/dist/core/tools/renderers/shell-task.d.ts.map +0 -1
  534. package/dist/core/tools/renderers/shell-task.js +0 -35
  535. package/dist/core/tools/renderers/shell-task.js.map +0 -1
  536. package/dist/extensions/todo/constants.d.ts +0 -16
  537. package/dist/extensions/todo/constants.d.ts.map +0 -1
  538. package/dist/extensions/todo/constants.js +0 -30
  539. package/dist/extensions/todo/constants.js.map +0 -1
  540. package/dist/extensions/todo/index.d.ts +0 -3
  541. package/dist/extensions/todo/index.d.ts.map +0 -1
  542. package/dist/extensions/todo/index.js +0 -98
  543. package/dist/extensions/todo/index.js.map +0 -1
  544. package/dist/extensions/todo/schema.d.ts +0 -60
  545. package/dist/extensions/todo/schema.d.ts.map +0 -1
  546. package/dist/extensions/todo/schema.js +0 -56
  547. package/dist/extensions/todo/schema.js.map +0 -1
  548. package/dist/extensions/todo/state.d.ts +0 -34
  549. package/dist/extensions/todo/state.d.ts.map +0 -1
  550. package/dist/extensions/todo/state.js +0 -425
  551. package/dist/extensions/todo/state.js.map +0 -1
  552. package/dist/extensions/todo/view.d.ts +0 -36
  553. package/dist/extensions/todo/view.d.ts.map +0 -1
  554. package/dist/extensions/todo/view.js +0 -580
  555. package/dist/extensions/todo/view.js.map +0 -1
  556. package/dist/extensions/todo/widget.d.ts +0 -15
  557. package/dist/extensions/todo/widget.d.ts.map +0 -1
  558. package/dist/extensions/todo/widget.js +0 -50
  559. package/dist/extensions/todo/widget.js.map +0 -1
  560. package/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  561. package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  562. package/dist/modes/interactive/components/daxnuts.js +0 -138
  563. package/dist/modes/interactive/components/daxnuts.js.map +0 -1
  564. package/dist/modes/interactive/tasks/fallback-view.d.ts +0 -4
  565. package/dist/modes/interactive/tasks/fallback-view.d.ts.map +0 -1
  566. package/dist/modes/interactive/tasks/fallback-view.js +0 -27
  567. package/dist/modes/interactive/tasks/fallback-view.js.map +0 -1
  568. package/docs/bundled/extensions/todo.md +0 -104
  569. package/examples/extensions/todo.ts +0 -297
@@ -6,6 +6,7 @@
6
6
  * exact id, normalized id, then fuzzy match; ties prefer the current API.
7
7
  */
8
8
  import type { Api, Model } from "@earendil-works/pi-ai";
9
+ import { type BuiltinProvider } from "@earendil-works/pi-ai/providers/all";
9
10
  import type { ModelsJsonModel } from "../../core/model-config.ts";
10
11
  export interface CatalogEntry {
11
12
  providerId: string;
@@ -13,7 +14,7 @@ export interface CatalogEntry {
13
14
  }
14
15
  export declare function builtinCatalogIndex(): readonly CatalogEntry[];
15
16
  /** True when models.json with this provider id overlays a built-in catalog. */
16
- export declare function isBuiltinProviderId(providerId: string): boolean;
17
+ export declare function isBuiltinProviderId(providerId: string): providerId is BuiltinProvider;
17
18
  /**
18
19
  * Builtin fallback api/baseUrl for a custom model, mirroring the runtime's
19
20
  * findModelDefaults order: same id, then same api, then any openai-completions
@@ -31,7 +32,13 @@ export interface CatalogMatch {
31
32
  /** Grouped reference candidates for a query id; at most `max` entries, best first. */
32
33
  export declare function matchBuiltinModels(query: string, preferredApi?: string, max?: number): CatalogMatch[];
33
34
  export type ReferenceField = "name" | "reasoning" | "input" | "contextWindow" | "maxTokens" | "thinkingLevelMap" | "compat" | "cost";
35
+ export interface FieldPatch {
36
+ path: readonly string[];
37
+ value: unknown;
38
+ }
34
39
  export interface FieldChange {
40
+ /** Exact writes represented by this preview; empty for view-only fields. */
41
+ patches: readonly FieldPatch[];
35
42
  field: ReferenceField;
36
43
  /** Pre-selected per the completion rules (unset scalar fields are checked; map/compat/cost never are). */
37
44
  checked: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CAClB;AAID,wBAAgB,mBAAmB,IAAI,SAAS,YAAY,EAAE,CAQ7D;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,GACV;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAUpC;AAWD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CAChB;AAaD,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAuB,GAAG,YAAY,EAAE,CA2BrH;AAED,MAAM,MAAM,cAAc,GACvB,MAAM,GACN,WAAW,GACX,OAAO,GACP,eAAe,GACf,WAAW,GACX,kBAAkB,GAClB,QAAQ,GACR,MAAM,CAAC;AAEV,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,0GAA0G;IAC1G,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oGAAoG;IACpG,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AASD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EACrB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC9B,WAAW,EAAE,CAwFf"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,KAAK,eAAe,EAAyC,MAAM,qCAAqC,CAAC;AAElH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CAClB;AAID,wBAAgB,mBAAmB,IAAI,SAAS,YAAY,EAAE,CAQ7D;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,IAAI,eAAe,CAErF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,GACV;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAUpC;AAWD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CAChB;AAaD,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAuB,GAAG,YAAY,EAAE,CA2BrH;AAED,MAAM,MAAM,cAAc,GACvB,MAAM,GACN,WAAW,GACX,OAAO,GACP,eAAe,GACf,WAAW,GACX,kBAAkB,GAClB,QAAQ,GACR,MAAM,CAAC;AAEV,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC3B,4EAA4E;IAC5E,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,0GAA0G;IAC1G,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oGAAoG;IACpG,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AASD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EACrB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC9B,WAAW,EAAE,CAuHf"}
@@ -99,6 +99,7 @@ export function computeFieldChanges(current, reference, effectiveApi) {
99
99
  const unset = (key) => current[key] === undefined;
100
100
  changes.push({
101
101
  field: "name",
102
+ patches: [{ path: ["name"], value: reference.name }],
102
103
  checked: unset("name") && reference.name !== reference.id,
103
104
  applicable: true,
104
105
  currentText: current.name ?? `not set (falls back to id${current.id ? ` "${current.id}"` : ""})`,
@@ -106,6 +107,7 @@ export function computeFieldChanges(current, reference, effectiveApi) {
106
107
  });
107
108
  changes.push({
108
109
  field: "reasoning",
110
+ patches: [{ path: ["reasoning"], value: reference.reasoning }],
109
111
  checked: unset("reasoning") && reference.reasoning === true,
110
112
  applicable: true,
111
113
  currentText: current.reasoning === undefined ? "false (default)" : String(current.reasoning),
@@ -113,6 +115,7 @@ export function computeFieldChanges(current, reference, effectiveApi) {
113
115
  });
114
116
  changes.push({
115
117
  field: "input",
118
+ patches: [{ path: ["input"], value: reference.input }],
116
119
  checked: unset("input"),
117
120
  applicable: true,
118
121
  currentText: current.input ? current.input.join(", ") : "text (default)",
@@ -120,6 +123,7 @@ export function computeFieldChanges(current, reference, effectiveApi) {
120
123
  });
121
124
  changes.push({
122
125
  field: "contextWindow",
126
+ patches: [{ path: ["contextWindow"], value: reference.contextWindow }],
123
127
  checked: unset("contextWindow"),
124
128
  applicable: true,
125
129
  currentText: current.contextWindow === undefined ? `${DEFAULT_CONTEXT_WINDOW} (default)` : String(current.contextWindow),
@@ -127,6 +131,7 @@ export function computeFieldChanges(current, reference, effectiveApi) {
127
131
  });
128
132
  changes.push({
129
133
  field: "maxTokens",
134
+ patches: [{ path: ["maxTokens"], value: reference.maxTokens }],
130
135
  checked: unset("maxTokens"),
131
136
  applicable: true,
132
137
  currentText: current.maxTokens === undefined ? `${DEFAULT_MAX_TOKENS} (default)` : String(current.maxTokens),
@@ -137,6 +142,12 @@ export function computeFieldChanges(current, reference, effectiveApi) {
137
142
  const details = Object.entries(reference.thinkingLevelMap).map(([level, target]) => `${level}: ${target === null ? "null (hidden)" : target}`);
138
143
  changes.push({
139
144
  field: "thinkingLevelMap",
145
+ patches: sameApi
146
+ ? Object.entries(reference.thinkingLevelMap).map(([level, value]) => ({
147
+ path: ["thinkingLevelMap", level],
148
+ value,
149
+ }))
150
+ : [],
140
151
  checked: false,
141
152
  applicable: sameApi,
142
153
  currentText: current.thinkingLevelMap
@@ -148,9 +159,24 @@ export function computeFieldChanges(current, reference, effectiveApi) {
148
159
  });
149
160
  }
150
161
  if (reference.compat && Object.keys(reference.compat).length > 0) {
162
+ const patches = [];
163
+ if (sameApi) {
164
+ for (const [key, value] of Object.entries(reference.compat)) {
165
+ if (["chatTemplateKwargs", "chatTemplateArgs", "openRouterRouting", "vercelGatewayRouting"].includes(key) &&
166
+ value !== null &&
167
+ typeof value === "object" &&
168
+ !Array.isArray(value)) {
169
+ for (const [entry, item] of Object.entries(value))
170
+ patches.push({ path: ["compat", key, entry], value: item });
171
+ }
172
+ else
173
+ patches.push({ path: ["compat", key], value });
174
+ }
175
+ }
151
176
  const details = Object.entries(reference.compat).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);
152
177
  changes.push({
153
178
  field: "compat",
179
+ patches,
154
180
  checked: false,
155
181
  applicable: sameApi,
156
182
  currentText: current.compat
@@ -161,8 +187,13 @@ export function computeFieldChanges(current, reference, effectiveApi) {
161
187
  });
162
188
  }
163
189
  if (reference.cost) {
190
+ const { input, output, cacheRead, cacheWrite } = reference.cost;
191
+ const rates = { input, output, cacheRead, cacheWrite };
164
192
  changes.push({
165
193
  field: "cost",
194
+ patches: current.cost
195
+ ? Object.entries(rates).map(([rate, value]) => ({ path: ["cost", rate], value }))
196
+ : [{ path: ["cost"], value: rates }],
166
197
  checked: false,
167
198
  applicable: true,
168
199
  currentText: current.cost ? formatCostRates(current.cost) : "all 0 (default)",
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/extensions/provider/catalog.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Built-in model catalog index and reference matching for Use Built-in Data.\n *\n * The index is built lazily on first use from pi-ai's raw builtin catalog\n * (never from the runtime's user-modified getAll()). Matching is grouped by\n * exact id, normalized id, then fuzzy match; ties prefer the current API.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getBuiltinModels, getBuiltinProviders } from \"@earendil-works/pi-ai/providers/all\";\nimport { fuzzyFilter } from \"@earendil-works/pi-tui\";\nimport type { ModelsJsonModel } from \"../../core/model-config.ts\";\nimport { MAX_CANDIDATES, plural } from \"./constants.ts\";\n\nexport interface CatalogEntry {\n\tproviderId: string;\n\tmodel: Model<Api>;\n}\n\nlet indexCache: readonly CatalogEntry[] | undefined;\n\nexport function builtinCatalogIndex(): readonly CatalogEntry[] {\n\tif (indexCache) return indexCache;\n\tconst entries: CatalogEntry[] = [];\n\tfor (const providerId of getBuiltinProviders()) {\n\t\tfor (const model of getBuiltinModels(providerId)) entries.push({ providerId, model });\n\t}\n\tindexCache = entries;\n\treturn entries;\n}\n\n/** True when models.json with this provider id overlays a built-in catalog. */\nexport function isBuiltinProviderId(providerId: string): boolean {\n\treturn (getBuiltinProviders() as readonly string[]).includes(providerId);\n}\n\n/**\n * Builtin fallback api/baseUrl for a custom model, mirroring the runtime's\n * findModelDefaults order: same id, then same api, then any openai-completions\n * model, then the first catalog entry.\n */\nexport function builtinDefaults(\n\tproviderId: string,\n\tmodelId?: string,\n\tapi?: string,\n): { api?: string; baseUrl?: string } {\n\tif (!isBuiltinProviderId(providerId)) return {};\n\tconst models = getBuiltinModels(providerId as never) as readonly Model<Api>[];\n\tif (models.length === 0) return {};\n\tconst found =\n\t\t(modelId ? models.find((model) => model.id === modelId) : undefined) ??\n\t\t(api ? models.find((model) => model.api === api) : undefined) ??\n\t\tmodels.find((model) => model.api === \"openai-completions\") ??\n\t\tmodels[0];\n\treturn { api: found.api, baseUrl: found.baseUrl };\n}\n\n/** Case-insensitive, separator-tolerant comparison key; keeps version/date/thinking variants. */\nfunction normalizeId(id: string): string {\n\tconst basename = id.includes(\"/\") ? id.slice(id.lastIndexOf(\"/\") + 1) : id;\n\treturn basename\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n}\n\nexport type MatchTier = \"exact\" | \"normalized\" | \"fuzzy\";\n\nexport interface CatalogMatch {\n\tentry: CatalogEntry;\n\ttier: MatchTier;\n}\n\nfunction sortTier(matches: CatalogMatch[], preferredApi: string | undefined): CatalogMatch[] {\n\treturn matches.sort((a, b) => {\n\t\tif (preferredApi) {\n\t\t\tconst aPreferred = a.entry.model.api === preferredApi ? 0 : 1;\n\t\t\tconst bPreferred = b.entry.model.api === preferredApi ? 0 : 1;\n\t\t\tif (aPreferred !== bPreferred) return aPreferred - bPreferred;\n\t\t}\n\t\treturn a.entry.model.id.localeCompare(b.entry.model.id);\n\t});\n}\n\n/** Grouped reference candidates for a query id; at most `max` entries, best first. */\nexport function matchBuiltinModels(query: string, preferredApi?: string, max: number = MAX_CANDIDATES): CatalogMatch[] {\n\tconst trimmed = query.trim();\n\tif (!trimmed) return [];\n\tconst index = builtinCatalogIndex();\n\tconst normalizedQuery = normalizeId(trimmed);\n\tconst exact: CatalogMatch[] = [];\n\tconst normalized: CatalogMatch[] = [];\n\tconst consumed = new Set<CatalogEntry>();\n\tfor (const entry of index) {\n\t\tif (entry.model.id === trimmed) {\n\t\t\texact.push({ entry, tier: \"exact\" });\n\t\t\tconsumed.add(entry);\n\t\t} else if (normalizeId(entry.model.id) === normalizedQuery) {\n\t\t\tnormalized.push({ entry, tier: \"normalized\" });\n\t\t\tconsumed.add(entry);\n\t\t}\n\t}\n\tconst remaining = sortTier(\n\t\tindex.filter((entry) => !consumed.has(entry)).map((entry) => ({ entry, tier: \"fuzzy\" })),\n\t\tpreferredApi,\n\t);\n\tconst fuzzy: CatalogMatch[] = fuzzyFilter(\n\t\tremaining,\n\t\ttrimmed,\n\t\t({ entry }) => `${entry.model.id} ${entry.model.name} ${entry.providerId}`,\n\t);\n\treturn [...sortTier(exact, preferredApi), ...sortTier(normalized, preferredApi), ...fuzzy].slice(0, max);\n}\n\nexport type ReferenceField =\n\t| \"name\"\n\t| \"reasoning\"\n\t| \"input\"\n\t| \"contextWindow\"\n\t| \"maxTokens\"\n\t| \"thinkingLevelMap\"\n\t| \"compat\"\n\t| \"cost\";\n\nexport interface FieldChange {\n\tfield: ReferenceField;\n\t/** Pre-selected per the completion rules (unset scalar fields are checked; map/compat/cost never are). */\n\tchecked: boolean;\n\t/** False = cross-API map/compat: view-only, cannot be applied. */\n\tapplicable: boolean;\n\t/** Left side of the preview, e.g. `not set (falls back to id)`. */\n\tcurrentText: string;\n\t/** Right side of the preview, e.g. the reference value. */\n\treferenceText: string;\n\t/** Extra detail lines for the expandable view (thinking map entries, compat keys, cost rates). */\n\treferenceDetails?: string[];\n\t/** Reference carries tiers; applying cost keeps current tiers and never imports reference tiers. */\n\treferenceHasTiers?: boolean;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\nfunction formatCostRates(cost: { input: number; output: number; cacheRead: number; cacheWrite: number }): string {\n\treturn `$${cost.input} / $${cost.output} in/out (cache $${cost.cacheRead} / $${cost.cacheWrite})`;\n}\n\n/**\n * Compute the per-field change list for applying `reference` onto `current`.\n * Only fields the reference actually has appear; an absent map/compat on the\n * reference never implies clearing the current value.\n */\nexport function computeFieldChanges(\n\tcurrent: Partial<ModelsJsonModel> & { id?: string },\n\treference: Model<Api>,\n\teffectiveApi: string | undefined,\n): FieldChange[] {\n\tconst changes: FieldChange[] = [];\n\tconst unset = (key: keyof ModelsJsonModel) => current[key] === undefined;\n\n\tchanges.push({\n\t\tfield: \"name\",\n\t\tchecked: unset(\"name\") && reference.name !== reference.id,\n\t\tapplicable: true,\n\t\tcurrentText: current.name ?? `not set (falls back to id${current.id ? ` \"${current.id}\"` : \"\"})`,\n\t\treferenceText: reference.name,\n\t});\n\tchanges.push({\n\t\tfield: \"reasoning\",\n\t\tchecked: unset(\"reasoning\") && reference.reasoning === true,\n\t\tapplicable: true,\n\t\tcurrentText: current.reasoning === undefined ? \"false (default)\" : String(current.reasoning),\n\t\treferenceText: String(reference.reasoning),\n\t});\n\tchanges.push({\n\t\tfield: \"input\",\n\t\tchecked: unset(\"input\"),\n\t\tapplicable: true,\n\t\tcurrentText: current.input ? current.input.join(\", \") : \"text (default)\",\n\t\treferenceText: reference.input.join(\", \"),\n\t});\n\tchanges.push({\n\t\tfield: \"contextWindow\",\n\t\tchecked: unset(\"contextWindow\"),\n\t\tapplicable: true,\n\t\tcurrentText:\n\t\t\tcurrent.contextWindow === undefined ? `${DEFAULT_CONTEXT_WINDOW} (default)` : String(current.contextWindow),\n\t\treferenceText: String(reference.contextWindow),\n\t});\n\tchanges.push({\n\t\tfield: \"maxTokens\",\n\t\tchecked: unset(\"maxTokens\"),\n\t\tapplicable: true,\n\t\tcurrentText: current.maxTokens === undefined ? `${DEFAULT_MAX_TOKENS} (default)` : String(current.maxTokens),\n\t\treferenceText: String(reference.maxTokens),\n\t});\n\n\tconst sameApi = effectiveApi !== undefined && reference.api === effectiveApi;\n\tif (reference.thinkingLevelMap && Object.keys(reference.thinkingLevelMap).length > 0) {\n\t\tconst details = Object.entries(reference.thinkingLevelMap).map(\n\t\t\t([level, target]) => `${level}: ${target === null ? \"null (hidden)\" : target}`,\n\t\t);\n\t\tchanges.push({\n\t\t\tfield: \"thinkingLevelMap\",\n\t\t\tchecked: false,\n\t\t\tapplicable: sameApi,\n\t\t\tcurrentText: current.thinkingLevelMap\n\t\t\t\t? `${Object.keys(current.thinkingLevelMap).length} ${plural(Object.keys(current.thinkingLevelMap).length, \"mapping\")}`\n\t\t\t\t: \"not set\",\n\t\t\t// Cross-api maps are view-only; the preview pane annotates that.\n\t\t\treferenceText: `${details.length} ${plural(details.length, \"mapping\")}`,\n\t\t\treferenceDetails: details,\n\t\t});\n\t}\n\tif (reference.compat && Object.keys(reference.compat).length > 0) {\n\t\tconst details = Object.entries(reference.compat).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);\n\t\tchanges.push({\n\t\t\tfield: \"compat\",\n\t\t\tchecked: false,\n\t\t\tapplicable: sameApi,\n\t\t\tcurrentText: current.compat\n\t\t\t\t? `${Object.keys(current.compat).length} ${plural(Object.keys(current.compat).length, \"entry\")}`\n\t\t\t\t: \"not set\",\n\t\t\treferenceText: `${details.length} ${plural(details.length, \"entry\")}`,\n\t\t\treferenceDetails: details,\n\t\t});\n\t}\n\tif (reference.cost) {\n\t\tchanges.push({\n\t\t\tfield: \"cost\",\n\t\t\tchecked: false,\n\t\t\tapplicable: true,\n\t\t\tcurrentText: current.cost ? formatCostRates(current.cost) : \"all 0 (default)\",\n\t\t\treferenceText: formatCostRates(reference.cost),\n\t\t\treferenceDetails: [\n\t\t\t\t`input: $${reference.cost.input} / M tokens`,\n\t\t\t\t`output: $${reference.cost.output} / M tokens`,\n\t\t\t\t`cacheRead: $${reference.cost.cacheRead} / M tokens`,\n\t\t\t\t`cacheWrite: $${reference.cost.cacheWrite} / M tokens`,\n\t\t\t],\n\t\t\treferenceHasTiers: Array.isArray(reference.cost.tiers) && reference.cost.tiers.length > 0,\n\t\t});\n\t}\n\treturn changes;\n}\n"]}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/extensions/provider/catalog.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Built-in model catalog index and reference matching for Use Built-in Data.\n *\n * The index is built lazily on first use from pi-ai's raw builtin catalog\n * (never from the runtime's user-modified getAll()). Matching is grouped by\n * exact id, normalized id, then fuzzy match; ties prefer the current API.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { type BuiltinProvider, getBuiltinModels, getBuiltinProviders } from \"@earendil-works/pi-ai/providers/all\";\nimport { fuzzyFilter } from \"@earendil-works/pi-tui\";\nimport type { ModelsJsonModel } from \"../../core/model-config.ts\";\nimport { MAX_CANDIDATES, plural } from \"./constants.ts\";\n\nexport interface CatalogEntry {\n\tproviderId: string;\n\tmodel: Model<Api>;\n}\n\nlet indexCache: readonly CatalogEntry[] | undefined;\n\nexport function builtinCatalogIndex(): readonly CatalogEntry[] {\n\tif (indexCache) return indexCache;\n\tconst entries: CatalogEntry[] = [];\n\tfor (const providerId of getBuiltinProviders()) {\n\t\tfor (const model of getBuiltinModels(providerId)) entries.push({ providerId, model });\n\t}\n\tindexCache = entries;\n\treturn entries;\n}\n\n/** True when models.json with this provider id overlays a built-in catalog. */\nexport function isBuiltinProviderId(providerId: string): providerId is BuiltinProvider {\n\treturn (getBuiltinProviders() as readonly string[]).includes(providerId);\n}\n\n/**\n * Builtin fallback api/baseUrl for a custom model, mirroring the runtime's\n * findModelDefaults order: same id, then same api, then any openai-completions\n * model, then the first catalog entry.\n */\nexport function builtinDefaults(\n\tproviderId: string,\n\tmodelId?: string,\n\tapi?: string,\n): { api?: string; baseUrl?: string } {\n\tif (!isBuiltinProviderId(providerId)) return {};\n\tconst models = getBuiltinModels(providerId);\n\tif (models.length === 0) return {};\n\tconst found =\n\t\t(modelId ? models.find((model) => model.id === modelId) : undefined) ??\n\t\t(api ? models.find((model) => model.api === api) : undefined) ??\n\t\tmodels.find((model) => model.api === \"openai-completions\") ??\n\t\tmodels[0];\n\treturn { api: found.api, baseUrl: found.baseUrl };\n}\n\n/** Case-insensitive, separator-tolerant comparison key; keeps version/date/thinking variants. */\nfunction normalizeId(id: string): string {\n\tconst basename = id.includes(\"/\") ? id.slice(id.lastIndexOf(\"/\") + 1) : id;\n\treturn basename\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n}\n\nexport type MatchTier = \"exact\" | \"normalized\" | \"fuzzy\";\n\nexport interface CatalogMatch {\n\tentry: CatalogEntry;\n\ttier: MatchTier;\n}\n\nfunction sortTier(matches: CatalogMatch[], preferredApi: string | undefined): CatalogMatch[] {\n\treturn matches.sort((a, b) => {\n\t\tif (preferredApi) {\n\t\t\tconst aPreferred = a.entry.model.api === preferredApi ? 0 : 1;\n\t\t\tconst bPreferred = b.entry.model.api === preferredApi ? 0 : 1;\n\t\t\tif (aPreferred !== bPreferred) return aPreferred - bPreferred;\n\t\t}\n\t\treturn a.entry.model.id.localeCompare(b.entry.model.id);\n\t});\n}\n\n/** Grouped reference candidates for a query id; at most `max` entries, best first. */\nexport function matchBuiltinModels(query: string, preferredApi?: string, max: number = MAX_CANDIDATES): CatalogMatch[] {\n\tconst trimmed = query.trim();\n\tif (!trimmed) return [];\n\tconst index = builtinCatalogIndex();\n\tconst normalizedQuery = normalizeId(trimmed);\n\tconst exact: CatalogMatch[] = [];\n\tconst normalized: CatalogMatch[] = [];\n\tconst consumed = new Set<CatalogEntry>();\n\tfor (const entry of index) {\n\t\tif (entry.model.id === trimmed) {\n\t\t\texact.push({ entry, tier: \"exact\" });\n\t\t\tconsumed.add(entry);\n\t\t} else if (normalizeId(entry.model.id) === normalizedQuery) {\n\t\t\tnormalized.push({ entry, tier: \"normalized\" });\n\t\t\tconsumed.add(entry);\n\t\t}\n\t}\n\tconst remaining = sortTier(\n\t\tindex.filter((entry) => !consumed.has(entry)).map((entry) => ({ entry, tier: \"fuzzy\" })),\n\t\tpreferredApi,\n\t);\n\tconst fuzzy: CatalogMatch[] = fuzzyFilter(\n\t\tremaining,\n\t\ttrimmed,\n\t\t({ entry }) => `${entry.model.id} ${entry.model.name} ${entry.providerId}`,\n\t);\n\treturn [...sortTier(exact, preferredApi), ...sortTier(normalized, preferredApi), ...fuzzy].slice(0, max);\n}\n\nexport type ReferenceField =\n\t| \"name\"\n\t| \"reasoning\"\n\t| \"input\"\n\t| \"contextWindow\"\n\t| \"maxTokens\"\n\t| \"thinkingLevelMap\"\n\t| \"compat\"\n\t| \"cost\";\n\nexport interface FieldPatch {\n\tpath: readonly string[];\n\tvalue: unknown;\n}\n\nexport interface FieldChange {\n\t/** Exact writes represented by this preview; empty for view-only fields. */\n\tpatches: readonly FieldPatch[];\n\tfield: ReferenceField;\n\t/** Pre-selected per the completion rules (unset scalar fields are checked; map/compat/cost never are). */\n\tchecked: boolean;\n\t/** False = cross-API map/compat: view-only, cannot be applied. */\n\tapplicable: boolean;\n\t/** Left side of the preview, e.g. `not set (falls back to id)`. */\n\tcurrentText: string;\n\t/** Right side of the preview, e.g. the reference value. */\n\treferenceText: string;\n\t/** Extra detail lines for the expandable view (thinking map entries, compat keys, cost rates). */\n\treferenceDetails?: string[];\n\t/** Reference carries tiers; applying cost keeps current tiers and never imports reference tiers. */\n\treferenceHasTiers?: boolean;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\nfunction formatCostRates(cost: { input: number; output: number; cacheRead: number; cacheWrite: number }): string {\n\treturn `$${cost.input} / $${cost.output} in/out (cache $${cost.cacheRead} / $${cost.cacheWrite})`;\n}\n\n/**\n * Compute the per-field change list for applying `reference` onto `current`.\n * Only fields the reference actually has appear; an absent map/compat on the\n * reference never implies clearing the current value.\n */\nexport function computeFieldChanges(\n\tcurrent: Partial<ModelsJsonModel> & { id?: string },\n\treference: Model<Api>,\n\teffectiveApi: string | undefined,\n): FieldChange[] {\n\tconst changes: FieldChange[] = [];\n\tconst unset = (key: keyof ModelsJsonModel) => current[key] === undefined;\n\n\tchanges.push({\n\t\tfield: \"name\",\n\t\tpatches: [{ path: [\"name\"], value: reference.name }],\n\t\tchecked: unset(\"name\") && reference.name !== reference.id,\n\t\tapplicable: true,\n\t\tcurrentText: current.name ?? `not set (falls back to id${current.id ? ` \"${current.id}\"` : \"\"})`,\n\t\treferenceText: reference.name,\n\t});\n\tchanges.push({\n\t\tfield: \"reasoning\",\n\t\tpatches: [{ path: [\"reasoning\"], value: reference.reasoning }],\n\t\tchecked: unset(\"reasoning\") && reference.reasoning === true,\n\t\tapplicable: true,\n\t\tcurrentText: current.reasoning === undefined ? \"false (default)\" : String(current.reasoning),\n\t\treferenceText: String(reference.reasoning),\n\t});\n\tchanges.push({\n\t\tfield: \"input\",\n\t\tpatches: [{ path: [\"input\"], value: reference.input }],\n\t\tchecked: unset(\"input\"),\n\t\tapplicable: true,\n\t\tcurrentText: current.input ? current.input.join(\", \") : \"text (default)\",\n\t\treferenceText: reference.input.join(\", \"),\n\t});\n\tchanges.push({\n\t\tfield: \"contextWindow\",\n\t\tpatches: [{ path: [\"contextWindow\"], value: reference.contextWindow }],\n\t\tchecked: unset(\"contextWindow\"),\n\t\tapplicable: true,\n\t\tcurrentText:\n\t\t\tcurrent.contextWindow === undefined ? `${DEFAULT_CONTEXT_WINDOW} (default)` : String(current.contextWindow),\n\t\treferenceText: String(reference.contextWindow),\n\t});\n\tchanges.push({\n\t\tfield: \"maxTokens\",\n\t\tpatches: [{ path: [\"maxTokens\"], value: reference.maxTokens }],\n\t\tchecked: unset(\"maxTokens\"),\n\t\tapplicable: true,\n\t\tcurrentText: current.maxTokens === undefined ? `${DEFAULT_MAX_TOKENS} (default)` : String(current.maxTokens),\n\t\treferenceText: String(reference.maxTokens),\n\t});\n\n\tconst sameApi = effectiveApi !== undefined && reference.api === effectiveApi;\n\tif (reference.thinkingLevelMap && Object.keys(reference.thinkingLevelMap).length > 0) {\n\t\tconst details = Object.entries(reference.thinkingLevelMap).map(\n\t\t\t([level, target]) => `${level}: ${target === null ? \"null (hidden)\" : target}`,\n\t\t);\n\t\tchanges.push({\n\t\t\tfield: \"thinkingLevelMap\",\n\t\t\tpatches: sameApi\n\t\t\t\t? Object.entries(reference.thinkingLevelMap).map(([level, value]) => ({\n\t\t\t\t\t\tpath: [\"thinkingLevelMap\", level],\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t}))\n\t\t\t\t: [],\n\t\t\tchecked: false,\n\t\t\tapplicable: sameApi,\n\t\t\tcurrentText: current.thinkingLevelMap\n\t\t\t\t? `${Object.keys(current.thinkingLevelMap).length} ${plural(Object.keys(current.thinkingLevelMap).length, \"mapping\")}`\n\t\t\t\t: \"not set\",\n\t\t\t// Cross-api maps are view-only; the preview pane annotates that.\n\t\t\treferenceText: `${details.length} ${plural(details.length, \"mapping\")}`,\n\t\t\treferenceDetails: details,\n\t\t});\n\t}\n\tif (reference.compat && Object.keys(reference.compat).length > 0) {\n\t\tconst patches: FieldPatch[] = [];\n\t\tif (sameApi) {\n\t\t\tfor (const [key, value] of Object.entries(reference.compat)) {\n\t\t\t\tif (\n\t\t\t\t\t[\"chatTemplateKwargs\", \"chatTemplateArgs\", \"openRouterRouting\", \"vercelGatewayRouting\"].includes(key) &&\n\t\t\t\t\tvalue !== null &&\n\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\t!Array.isArray(value)\n\t\t\t\t) {\n\t\t\t\t\tfor (const [entry, item] of Object.entries(value))\n\t\t\t\t\t\tpatches.push({ path: [\"compat\", key, entry], value: item });\n\t\t\t\t} else patches.push({ path: [\"compat\", key], value });\n\t\t\t}\n\t\t}\n\t\tconst details = Object.entries(reference.compat).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);\n\t\tchanges.push({\n\t\t\tfield: \"compat\",\n\t\t\tpatches,\n\t\t\tchecked: false,\n\t\t\tapplicable: sameApi,\n\t\t\tcurrentText: current.compat\n\t\t\t\t? `${Object.keys(current.compat).length} ${plural(Object.keys(current.compat).length, \"entry\")}`\n\t\t\t\t: \"not set\",\n\t\t\treferenceText: `${details.length} ${plural(details.length, \"entry\")}`,\n\t\t\treferenceDetails: details,\n\t\t});\n\t}\n\tif (reference.cost) {\n\t\tconst { input, output, cacheRead, cacheWrite } = reference.cost;\n\t\tconst rates = { input, output, cacheRead, cacheWrite };\n\t\tchanges.push({\n\t\t\tfield: \"cost\",\n\t\t\tpatches: current.cost\n\t\t\t\t? Object.entries(rates).map(([rate, value]) => ({ path: [\"cost\", rate], value }))\n\t\t\t\t: [{ path: [\"cost\"], value: rates }],\n\t\t\tchecked: false,\n\t\t\tapplicable: true,\n\t\t\tcurrentText: current.cost ? formatCostRates(current.cost) : \"all 0 (default)\",\n\t\t\treferenceText: formatCostRates(reference.cost),\n\t\t\treferenceDetails: [\n\t\t\t\t`input: $${reference.cost.input} / M tokens`,\n\t\t\t\t`output: $${reference.cost.output} / M tokens`,\n\t\t\t\t`cacheRead: $${reference.cost.cacheRead} / M tokens`,\n\t\t\t\t`cacheWrite: $${reference.cost.cacheWrite} / M tokens`,\n\t\t\t],\n\t\t\treferenceHasTiers: Array.isArray(reference.cost.tiers) && reference.cost.tiers.length > 0,\n\t\t});\n\t}\n\treturn changes;\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  /** Saved provider configuration, canonical authentication, and catalog import operations. */
2
2
  import type { ModelRuntime } from "../../core/model-runtime.ts";
3
+ import type { ProviderEdits } from "./editing.ts";
3
4
  import { type ProbeModel, type ProbeResult } from "./probe.ts";
4
5
  import type { RefreshCoordinator } from "./refresh.ts";
5
6
  import type { ModelsJsonStore } from "./store.ts";
@@ -10,5 +11,7 @@ export interface ProviderConnectionOptions {
10
11
  runtime: Pick<ModelRuntime, "getAuth" | "getProviderAuthStatus">;
11
12
  }
12
13
  export declare function fetchProviderModels(options: ProviderConnectionOptions, signal: AbortSignal): Promise<ProbeResult>;
13
- export declare function importProviderModels(options: ProviderConnectionOptions, models: readonly ProbeModel[], signal: AbortSignal): Promise<string | undefined>;
14
+ export declare function importProviderModels(options: ProviderConnectionOptions & {
15
+ edits: Pick<ProviderEdits, "addModels">;
16
+ }, models: readonly ProbeModel[], signal: AbortSignal): Promise<string | undefined>;
14
17
  //# sourceMappingURL=connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAuB,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;CACjE;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0B7B"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAuB,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;CACjE;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,yBAAyB,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;CAAE,EAChF,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuB7B"}
@@ -68,11 +68,7 @@ export async function importProviderModels(options, models, signal) {
68
68
  if (fresh.length === 0)
69
69
  return undefined;
70
70
  signal.throwIfAborted();
71
- store.batch(() => {
72
- for (const model of fresh)
73
- store.addModel(providerId, model);
74
- });
75
- refresher.touch(providerId);
71
+ options.edits.addModels(fresh);
76
72
  // These edits were confirmed. Finish the write even if the originating pane closes.
77
73
  await store.flush();
78
74
  const saveError = store.getPendingError(providerId);
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"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","sourcesContent":["/** Saved provider configuration, canonical authentication, and catalog import operations. */\n\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { raceWithAbortSignal } from \"../../utils/abort.ts\";\nimport { effectiveModelSettings } from \"./configuration.ts\";\nimport { formatError, PROBE_LIMITS } from \"./constants.ts\";\nimport { type ProbeModel, type ProbeResult, probeProviderModels } from \"./probe.ts\";\nimport type { RefreshCoordinator } from \"./refresh.ts\";\nimport type { ModelsJsonStore } from \"./store.ts\";\n\nexport interface ProviderConnectionOptions {\n\tstore: ModelsJsonStore;\n\trefresher: RefreshCoordinator;\n\tproviderId: string;\n\truntime: Pick<ModelRuntime, \"getAuth\" | \"getProviderAuthStatus\">;\n}\n\nexport async function fetchProviderModels(\n\toptions: ProviderConnectionOptions,\n\tsignal: AbortSignal,\n): Promise<ProbeResult> {\n\tconst { store, refresher, runtime, providerId } = options;\n\tconst deadline = AbortSignal.any([signal, AbortSignal.timeout(PROBE_LIMITS.timeoutMs)]);\n\ttry {\n\t\tawait raceWithAbortSignal(store.flush(), deadline);\n\t\tconst unsaved = store.getPendingError(providerId);\n\t\tif (unsaved) return { ok: false, error: `Save the provider changes before fetching: ${unsaved}` };\n\t\tconst provider = store.getProvider(providerId);\n\t\tconst settings = effectiveModelSettings(providerId, provider);\n\t\tif (!settings.baseUrl) return { ok: false, error: \"Set a baseUrl under API Auth first.\" };\n\t\tconst sync = await refresher.refreshNow(providerId, deadline);\n\t\tdeadline.throwIfAborted();\n\t\tif (!sync.ok) return { ok: false, error: `The provider did not reload: ${sync.errors.join(\"; \")}` };\n\t\tconst resolved = await raceWithAbortSignal(runtime.getAuth(providerId, { signal: deadline }), deadline);\n\t\tconst configured =\n\t\t\tprovider?.apiKey !== undefined ||\n\t\t\tprovider?.authHeader === true ||\n\t\t\tObject.keys(provider?.headers ?? {}).length > 0 ||\n\t\t\truntime.getProviderAuthStatus(providerId).configured;\n\t\tif (!resolved && configured) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"Configured credentials or headers did not resolve; check the provider authentication.\",\n\t\t\t};\n\t\t}\n\t\tconst result = await probeProviderModels({\n\t\t\tbaseUrl: resolved?.auth.baseUrl ?? settings.baseUrl,\n\t\t\tauth: resolved?.auth,\n\t\t\tapi: settings.api,\n\t\t\tsignal: deadline,\n\t\t});\n\t\tdeadline.throwIfAborted();\n\t\treturn result;\n\t} catch (error) {\n\t\tif (deadline.aborted) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: signal.aborted ? \"Cancelled.\" : \"Timed out while preparing or fetching the model catalog.\",\n\t\t\t};\n\t\t}\n\t\treturn { ok: false, error: formatError(error) };\n\t}\n}\n\nexport async function importProviderModels(\n\toptions: ProviderConnectionOptions,\n\tmodels: readonly ProbeModel[],\n\tsignal: AbortSignal,\n): Promise<string | undefined> {\n\tconst { store, refresher, providerId } = options;\n\tawait raceWithAbortSignal(store.flush(), signal);\n\tconst unsaved = store.getPendingError(providerId);\n\tif (unsaved) return unsaved;\n\tconst settings = effectiveModelSettings(providerId, store.getProvider(providerId));\n\tif (!settings.api || !settings.baseUrl) return \"Set baseUrl and API Type under API Auth before importing models.\";\n\tconst existing = new Set(store.getModels(providerId).map((model) => model.id));\n\tconst fresh = models.filter((model) => {\n\t\tif (existing.has(model.id)) return false;\n\t\texisting.add(model.id);\n\t\treturn true;\n\t});\n\tif (fresh.length === 0) return undefined;\n\tsignal.throwIfAborted();\n\tstore.batch(() => {\n\t\tfor (const model of fresh) store.addModel(providerId, model);\n\t});\n\trefresher.touch(providerId);\n\t// These edits were confirmed. Finish the write even if the originating pane closes.\n\tawait store.flush();\n\tconst saveError = store.getPendingError(providerId);\n\tif (saveError) return saveError;\n\tconst outcome = await refresher.refreshNow(providerId, signal);\n\tif (!outcome.ok) return `Models were saved, but refresh failed: ${outcome.errors.join(\"; \")}`;\n\treturn undefined;\n}\n"]}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"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","sourcesContent":["/** Saved provider configuration, canonical authentication, and catalog import operations. */\n\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { raceWithAbortSignal } from \"../../utils/abort.ts\";\nimport { effectiveModelSettings } from \"./configuration.ts\";\nimport { formatError, PROBE_LIMITS } from \"./constants.ts\";\nimport type { ProviderEdits } from \"./editing.ts\";\nimport { type ProbeModel, type ProbeResult, probeProviderModels } from \"./probe.ts\";\nimport type { RefreshCoordinator } from \"./refresh.ts\";\nimport type { ModelsJsonStore } from \"./store.ts\";\n\nexport interface ProviderConnectionOptions {\n\tstore: ModelsJsonStore;\n\trefresher: RefreshCoordinator;\n\tproviderId: string;\n\truntime: Pick<ModelRuntime, \"getAuth\" | \"getProviderAuthStatus\">;\n}\n\nexport async function fetchProviderModels(\n\toptions: ProviderConnectionOptions,\n\tsignal: AbortSignal,\n): Promise<ProbeResult> {\n\tconst { store, refresher, runtime, providerId } = options;\n\tconst deadline = AbortSignal.any([signal, AbortSignal.timeout(PROBE_LIMITS.timeoutMs)]);\n\ttry {\n\t\tawait raceWithAbortSignal(store.flush(), deadline);\n\t\tconst unsaved = store.getPendingError(providerId);\n\t\tif (unsaved) return { ok: false, error: `Save the provider changes before fetching: ${unsaved}` };\n\t\tconst provider = store.getProvider(providerId);\n\t\tconst settings = effectiveModelSettings(providerId, provider);\n\t\tif (!settings.baseUrl) return { ok: false, error: \"Set a baseUrl under API Auth first.\" };\n\t\tconst sync = await refresher.refreshNow(providerId, deadline);\n\t\tdeadline.throwIfAborted();\n\t\tif (!sync.ok) return { ok: false, error: `The provider did not reload: ${sync.errors.join(\"; \")}` };\n\t\tconst resolved = await raceWithAbortSignal(runtime.getAuth(providerId, { signal: deadline }), deadline);\n\t\tconst configured =\n\t\t\tprovider?.apiKey !== undefined ||\n\t\t\tprovider?.authHeader === true ||\n\t\t\tObject.keys(provider?.headers ?? {}).length > 0 ||\n\t\t\truntime.getProviderAuthStatus(providerId).configured;\n\t\tif (!resolved && configured) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"Configured credentials or headers did not resolve; check the provider authentication.\",\n\t\t\t};\n\t\t}\n\t\tconst result = await probeProviderModels({\n\t\t\tbaseUrl: resolved?.auth.baseUrl ?? settings.baseUrl,\n\t\t\tauth: resolved?.auth,\n\t\t\tapi: settings.api,\n\t\t\tsignal: deadline,\n\t\t});\n\t\tdeadline.throwIfAborted();\n\t\treturn result;\n\t} catch (error) {\n\t\tif (deadline.aborted) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: signal.aborted ? \"Cancelled.\" : \"Timed out while preparing or fetching the model catalog.\",\n\t\t\t};\n\t\t}\n\t\treturn { ok: false, error: formatError(error) };\n\t}\n}\n\nexport async function importProviderModels(\n\toptions: ProviderConnectionOptions & { edits: Pick<ProviderEdits, \"addModels\"> },\n\tmodels: readonly ProbeModel[],\n\tsignal: AbortSignal,\n): Promise<string | undefined> {\n\tconst { store, refresher, providerId } = options;\n\tawait raceWithAbortSignal(store.flush(), signal);\n\tconst unsaved = store.getPendingError(providerId);\n\tif (unsaved) return unsaved;\n\tconst settings = effectiveModelSettings(providerId, store.getProvider(providerId));\n\tif (!settings.api || !settings.baseUrl) return \"Set baseUrl and API Type under API Auth before importing models.\";\n\tconst existing = new Set(store.getModels(providerId).map((model) => model.id));\n\tconst fresh = models.filter((model) => {\n\t\tif (existing.has(model.id)) return false;\n\t\texisting.add(model.id);\n\t\treturn true;\n\t});\n\tif (fresh.length === 0) return undefined;\n\tsignal.throwIfAborted();\n\toptions.edits.addModels(fresh);\n\t// These edits were confirmed. Finish the write even if the originating pane closes.\n\tawait store.flush();\n\tconst saveError = store.getPendingError(providerId);\n\tif (saveError) return saveError;\n\tconst outcome = await refresher.refreshNow(providerId, signal);\n\tif (!outcome.ok) return `Models were saved, but refresh failed: ${outcome.errors.join(\"; \")}`;\n\treturn undefined;\n}\n"]}
@@ -0,0 +1,36 @@
1
+ /** Owns edits and refresh tracking; model handles keep persistence out of panes. */
2
+ import type { ModelsJsonModel } from "../../core/model-config.ts";
3
+ import type { RefreshCoordinator } from "./refresh.ts";
4
+ import type { ModelsJsonStore } from "./store.ts";
5
+ interface ModelFields {
6
+ read(): Partial<ModelsJsonModel>;
7
+ setField(path: readonly string[], value: unknown): void;
8
+ }
9
+ export interface DraftModelHandle extends ModelFields {
10
+ readonly isDraft: true;
11
+ }
12
+ export interface PersistedModelHandle extends ModelFields {
13
+ readonly isDraft: false;
14
+ rename(newId: string): Promise<string | undefined>;
15
+ }
16
+ export type ModelHandle = DraftModelHandle | PersistedModelHandle;
17
+ export type ProviderView = Pick<ModelsJsonStore, "getProvider" | "getModels" | "getModel">;
18
+ export declare class ProviderEdits {
19
+ private readonly store;
20
+ private readonly providerId;
21
+ private readonly refresher;
22
+ private readonly refresh;
23
+ renaming: boolean;
24
+ constructor(store: ModelsJsonStore, providerId: string, refresher: RefreshCoordinator, refresh: () => void);
25
+ private changed;
26
+ setProviderField(path: readonly string[], value: unknown): void;
27
+ removeProvider(): void;
28
+ removeModel(modelId: string): void;
29
+ batch(apply: () => void): void;
30
+ addModels(models: readonly ModelsJsonModel[]): void;
31
+ draft(): DraftModelHandle;
32
+ commitDraft(draft: DraftModelHandle): string | undefined;
33
+ model(modelId: string, onRename: (oldId: string, newId: string) => void): PersistedModelHandle;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=editing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editing.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/editing.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,UAAU,WAAW;IACpB,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACpD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACxD,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC;AAE3F,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,QAAQ,UAAS;gBAEL,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,IAAI;IAO1G,OAAO,CAAC,OAAO;IAUf,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/D,cAAc,IAAI,IAAI;IAKtB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAI9B,SAAS,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI;IAOnD,KAAK,IAAI,gBAAgB;IAYzB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS;IAcxD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,oBAAoB;CA4B9F"}
@@ -0,0 +1,99 @@
1
+ import { effectiveModelSettings, hasProviderSettings } from "./configuration.js";
2
+ import { setPath } from "./json-fields.js";
3
+ export class ProviderEdits {
4
+ constructor(store, providerId, refresher, refresh) {
5
+ this.renaming = false;
6
+ this.store = store;
7
+ this.providerId = providerId;
8
+ this.refresher = refresher;
9
+ this.refresh = refresh;
10
+ }
11
+ changed() {
12
+ if (!this.store.isDraftProvider(this.providerId) ||
13
+ hasProviderSettings(this.store.getProvider(this.providerId))) {
14
+ this.refresher.touch(this.providerId);
15
+ }
16
+ this.refresh();
17
+ }
18
+ setProviderField(path, value) {
19
+ this.store.setProviderField(this.providerId, path, value);
20
+ this.changed();
21
+ }
22
+ removeProvider() {
23
+ this.store.removeProvider(this.providerId);
24
+ this.changed();
25
+ }
26
+ removeModel(modelId) {
27
+ this.store.removeModel(this.providerId, modelId);
28
+ this.changed();
29
+ }
30
+ batch(apply) {
31
+ this.store.batch(apply);
32
+ }
33
+ addModels(models) {
34
+ this.store.batch(() => {
35
+ for (const model of models)
36
+ this.store.addModel(this.providerId, model);
37
+ });
38
+ if (models.length > 0)
39
+ this.changed();
40
+ }
41
+ draft() {
42
+ const fields = {};
43
+ return {
44
+ isDraft: true,
45
+ read: () => fields,
46
+ setField: (path, value) => {
47
+ setPath(fields, path, value);
48
+ this.refresh();
49
+ },
50
+ };
51
+ }
52
+ commitDraft(draft) {
53
+ const fields = draft.read();
54
+ const id = (fields.id ?? "").trim();
55
+ if (!id)
56
+ return "Model id is required.";
57
+ if (this.store.getModel(this.providerId, id))
58
+ return `Model "${id}" already exists.`;
59
+ const settings = effectiveModelSettings(this.providerId, this.store.getProvider(this.providerId), fields);
60
+ if (!settings.api)
61
+ return "Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.";
62
+ if (!settings.baseUrl)
63
+ return "Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.";
64
+ this.store.addModel(this.providerId, { ...fields, id });
65
+ this.changed();
66
+ return undefined;
67
+ }
68
+ model(modelId, onRename) {
69
+ let id = modelId;
70
+ let snapshot;
71
+ return {
72
+ isDraft: false,
73
+ read: () => snapshot ?? this.store.getModel(this.providerId, id) ?? { id },
74
+ setField: (path, value) => {
75
+ this.store.setModelField(this.providerId, id, path, value);
76
+ this.changed();
77
+ },
78
+ rename: async (newId) => {
79
+ const oldId = id;
80
+ snapshot = this.store.getModel(this.providerId, id);
81
+ this.renaming = true;
82
+ try {
83
+ const error = await this.store.renameModel(this.providerId, id, newId);
84
+ if (error)
85
+ return error;
86
+ id = newId;
87
+ this.changed();
88
+ return undefined;
89
+ }
90
+ finally {
91
+ snapshot = undefined;
92
+ this.renaming = false;
93
+ onRename(oldId, id);
94
+ }
95
+ },
96
+ };
97
+ }
98
+ }
99
+ //# sourceMappingURL=editing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editing.js","sourceRoot":"","sources":["../../../src/extensions/provider/editing.ts"],"names":[],"mappings":"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","sourcesContent":["/** Owns edits and refresh tracking; model handles keep persistence out of panes. */\nimport type { ModelsJsonModel } from \"../../core/model-config.ts\";\nimport { effectiveModelSettings, hasProviderSettings } from \"./configuration.ts\";\nimport { setPath } from \"./json-fields.ts\";\nimport type { RefreshCoordinator } from \"./refresh.ts\";\nimport type { ModelsJsonStore } from \"./store.ts\";\n\ninterface ModelFields {\n\tread(): Partial<ModelsJsonModel>;\n\tsetField(path: readonly string[], value: unknown): void;\n}\n\nexport interface DraftModelHandle extends ModelFields {\n\treadonly isDraft: true;\n}\n\nexport interface PersistedModelHandle extends ModelFields {\n\treadonly isDraft: false;\n\trename(newId: string): Promise<string | undefined>;\n}\n\nexport type ModelHandle = DraftModelHandle | PersistedModelHandle;\nexport type ProviderView = Pick<ModelsJsonStore, \"getProvider\" | \"getModels\" | \"getModel\">;\n\nexport class ProviderEdits {\n\tprivate readonly store: ModelsJsonStore;\n\tprivate readonly providerId: string;\n\tprivate readonly refresher: RefreshCoordinator;\n\tprivate readonly refresh: () => void;\n\trenaming = false;\n\n\tconstructor(store: ModelsJsonStore, providerId: string, refresher: RefreshCoordinator, refresh: () => void) {\n\t\tthis.store = store;\n\t\tthis.providerId = providerId;\n\t\tthis.refresher = refresher;\n\t\tthis.refresh = refresh;\n\t}\n\n\tprivate changed(): void {\n\t\tif (\n\t\t\t!this.store.isDraftProvider(this.providerId) ||\n\t\t\thasProviderSettings(this.store.getProvider(this.providerId))\n\t\t) {\n\t\t\tthis.refresher.touch(this.providerId);\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tsetProviderField(path: readonly string[], value: unknown): void {\n\t\tthis.store.setProviderField(this.providerId, path, value);\n\t\tthis.changed();\n\t}\n\n\tremoveProvider(): void {\n\t\tthis.store.removeProvider(this.providerId);\n\t\tthis.changed();\n\t}\n\n\tremoveModel(modelId: string): void {\n\t\tthis.store.removeModel(this.providerId, modelId);\n\t\tthis.changed();\n\t}\n\n\tbatch(apply: () => void): void {\n\t\tthis.store.batch(apply);\n\t}\n\n\taddModels(models: readonly ModelsJsonModel[]): void {\n\t\tthis.store.batch(() => {\n\t\t\tfor (const model of models) this.store.addModel(this.providerId, model);\n\t\t});\n\t\tif (models.length > 0) this.changed();\n\t}\n\n\tdraft(): DraftModelHandle {\n\t\tconst fields: Partial<ModelsJsonModel> = {};\n\t\treturn {\n\t\t\tisDraft: true,\n\t\t\tread: () => fields,\n\t\t\tsetField: (path, value) => {\n\t\t\t\tsetPath(fields, path, value);\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\tcommitDraft(draft: DraftModelHandle): string | undefined {\n\t\tconst fields = draft.read();\n\t\tconst id = (fields.id ?? \"\").trim();\n\t\tif (!id) return \"Model id is required.\";\n\t\tif (this.store.getModel(this.providerId, id)) return `Model \"${id}\" already exists.`;\n\t\tconst settings = effectiveModelSettings(this.providerId, this.store.getProvider(this.providerId), fields);\n\t\tif (!settings.api) return \"Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.\";\n\t\tif (!settings.baseUrl)\n\t\t\treturn \"Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.\";\n\t\tthis.store.addModel(this.providerId, { ...fields, id });\n\t\tthis.changed();\n\t\treturn undefined;\n\t}\n\n\tmodel(modelId: string, onRename: (oldId: string, newId: string) => void): PersistedModelHandle {\n\t\tlet id = modelId;\n\t\tlet snapshot: ModelsJsonModel | undefined;\n\t\treturn {\n\t\t\tisDraft: false,\n\t\t\tread: () => snapshot ?? this.store.getModel(this.providerId, id) ?? { id },\n\t\t\tsetField: (path, value) => {\n\t\t\t\tthis.store.setModelField(this.providerId, id, path, value);\n\t\t\t\tthis.changed();\n\t\t\t},\n\t\t\trename: async (newId) => {\n\t\t\t\tconst oldId = id;\n\t\t\t\tsnapshot = this.store.getModel(this.providerId, id);\n\t\t\t\tthis.renaming = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst error = await this.store.renameModel(this.providerId, id, newId);\n\t\t\t\t\tif (error) return error;\n\t\t\t\t\tid = newId;\n\t\t\t\t\tthis.changed();\n\t\t\t\t\treturn undefined;\n\t\t\t\t} finally {\n\t\t\t\t\tsnapshot = undefined;\n\t\t\t\t\tthis.renaming = false;\n\t\t\t\t\tonRename(oldId, id);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
@@ -0,0 +1,5 @@
1
+ /** JSON field updates shared by drafts and queued store operations. */
2
+ export declare const DELETE: unique symbol;
3
+ export type DeleteMarker = typeof DELETE;
4
+ export declare function setPath(root: Record<string, unknown>, path: readonly string[], value: unknown): void;
5
+ //# sourceMappingURL=json-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fields.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/json-fields.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,MAAM,EAAE,OAAO,MAAwC,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC;AAEzC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBpG"}
@@ -0,0 +1,31 @@
1
+ /** JSON field updates shared by drafts and queued store operations. */
2
+ export const DELETE = Symbol("provider-store-delete");
3
+ export function setPath(root, path, value) {
4
+ let current = root;
5
+ for (const segment of path.slice(0, -1)) {
6
+ const next = Object.hasOwn(current, segment) ? current[segment] : undefined;
7
+ if (typeof next === "object" && next !== null && !Array.isArray(next))
8
+ current = next;
9
+ else {
10
+ const created = {};
11
+ Object.defineProperty(current, segment, {
12
+ value: created,
13
+ writable: true,
14
+ enumerable: true,
15
+ configurable: true,
16
+ });
17
+ current = created;
18
+ }
19
+ }
20
+ const leaf = path[path.length - 1];
21
+ if (value === DELETE)
22
+ delete current[leaf];
23
+ else
24
+ Object.defineProperty(current, leaf, {
25
+ value: structuredClone(value),
26
+ writable: true,
27
+ enumerable: true,
28
+ configurable: true,
29
+ });
30
+ }
31
+ //# sourceMappingURL=json-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-fields.js","sourceRoot":"","sources":["../../../src/extensions/provider/json-fields.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,MAAM,GAAkB,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAGrE,MAAM,UAAU,OAAO,CAAC,IAA6B,EAAE,IAAuB,EAAE,KAAc;IAC7F,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,IAA+B,CAAC;aAC5G,CAAC;YACL,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE;gBACvC,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,OAAO,GAAG,OAAO,CAAC;QACnB,CAAC;IACF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACpC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;;QAE1C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE;YACpC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;YAC7B,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** JSON field updates shared by drafts and queued store operations. */\nexport const DELETE: unique symbol = Symbol(\"provider-store-delete\");\nexport type DeleteMarker = typeof DELETE;\n\nexport function setPath(root: Record<string, unknown>, path: readonly string[], value: unknown): void {\n\tlet current = root;\n\tfor (const segment of path.slice(0, -1)) {\n\t\tconst next = Object.hasOwn(current, segment) ? current[segment] : undefined;\n\t\tif (typeof next === \"object\" && next !== null && !Array.isArray(next)) current = next as Record<string, unknown>;\n\t\telse {\n\t\t\tconst created: Record<string, unknown> = {};\n\t\t\tObject.defineProperty(current, segment, {\n\t\t\t\tvalue: created,\n\t\t\t\twritable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t\tcurrent = created;\n\t\t}\n\t}\n\tconst leaf = path[path.length - 1]!;\n\tif (value === DELETE) delete current[leaf];\n\telse\n\t\tObject.defineProperty(current, leaf, {\n\t\t\tvalue: structuredClone(value),\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n}\n"]}
@@ -16,9 +16,7 @@
16
16
  * unknown fields anywhere in the document are preserved verbatim.
17
17
  */
18
18
  import { type ModelsJsonModel, type ModelsJsonProvider } from "../../core/model-config.ts";
19
- /** Sentinel op value removing the key at the op path. */
20
- export declare const DELETE: unique symbol;
21
- export type DeleteMarker = typeof DELETE;
19
+ export { DELETE, type DeleteMarker } from "./json-fields.ts";
22
20
  export interface ModelsJsonDocument {
23
21
  providers: Record<string, ModelsJsonProvider>;
24
22
  [key: string]: unknown;
@@ -127,5 +125,4 @@ export declare class ModelsJsonStore {
127
125
  private save;
128
126
  private saveLocked;
129
127
  }
130
- export {};
131
128
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,8 @@ import { normalizePath } from "../../utils/paths.js";
26
26
  import { stripBom } from "../../utils/text.js";
27
27
  import { hasProviderSettings } from "./configuration.js";
28
28
  import { formatError } from "./constants.js";
29
- /** Sentinel op value removing the key at the op path. */
30
- export const DELETE = Symbol("provider-store-delete");
29
+ import { DELETE, setPath } from "./json-fields.js";
30
+ export { DELETE } from "./json-fields.js";
31
31
  function isPlainObject(value) {
32
32
  return typeof value === "object" && value !== null && !Array.isArray(value);
33
33
  }
@@ -46,34 +46,6 @@ export function jsonEquals(a, b) {
46
46
  }
47
47
  return false;
48
48
  }
49
- function setPath(root, path, value) {
50
- let current = root;
51
- for (const segment of path.slice(0, -1)) {
52
- const next = Object.hasOwn(current, segment) ? current[segment] : undefined;
53
- if (isPlainObject(next))
54
- current = next;
55
- else {
56
- const created = {};
57
- Object.defineProperty(current, segment, {
58
- value: created,
59
- writable: true,
60
- enumerable: true,
61
- configurable: true,
62
- });
63
- current = created;
64
- }
65
- }
66
- const leaf = path[path.length - 1];
67
- if (value === DELETE)
68
- delete current[leaf];
69
- else
70
- Object.defineProperty(current, leaf, {
71
- value: structuredClone(value),
72
- writable: true,
73
- enumerable: true,
74
- configurable: true,
75
- });
76
- }
77
49
  function cloneValue(value) {
78
50
  return value === DELETE ? value : structuredClone(value);
79
51
  }