@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
@@ -18,7 +18,7 @@ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybi
18
18
  import { isBuiltinProviderId } from "../catalog.js";
19
19
  import { effectiveModelSettings, hasProviderSettings } from "../configuration.js";
20
20
  import { fetchProviderModels, importProviderModels } from "../connection.js";
21
- import { DELETE } from "../store.js";
21
+ import { ProviderEdits } from "../editing.js";
22
22
  import { ConfirmPane, InfoPane } from "./dialogs.js";
23
23
  import { FetchModelsPane } from "./fetch-models.js";
24
24
  import { ModelFieldsPane } from "./model-fields.js";
@@ -51,13 +51,13 @@ export class ProviderEditorScreen {
51
51
  this.focusPane = "left";
52
52
  this.stack = [];
53
53
  this.disposed = false;
54
- this.renaming = false;
55
54
  this._focused = false;
56
55
  this.tui = tui;
57
56
  this.theme = theme;
58
57
  this.keybindings = keybindings;
59
58
  this.done = done;
60
59
  this.options = options;
60
+ this.edits = new ProviderEdits(options.store, options.providerId, options.refresher, () => this.refresh());
61
61
  this.host = this.createHost();
62
62
  this.rebuildLeftItems();
63
63
  this.resetRightStack();
@@ -128,7 +128,7 @@ export class ProviderEditorScreen {
128
128
  }
129
129
  /** Rebuild from the store view after a save merged external changes. */
130
130
  syncFromStore() {
131
- if (this.disposed || this.renaming)
131
+ if (this.disposed || this.edits.renaming)
132
132
  return;
133
133
  const selected = this.leftItems[this.leftIndex];
134
134
  const selectedKey = leftItemKey(selected);
@@ -207,7 +207,7 @@ export class ProviderEditorScreen {
207
207
  return;
208
208
  }
209
209
  if (!this.draft) {
210
- this.draft = { fields: {} };
210
+ this.draft = this.edits.draft();
211
211
  this.rebuildLeftItems();
212
212
  }
213
213
  const draftIndex = this.leftItems.findIndex((entry) => entry.kind === "draft");
@@ -217,7 +217,7 @@ export class ProviderEditorScreen {
217
217
  this.focusPane = "right";
218
218
  const pane = this.topPane();
219
219
  pane?.setFocused(this._focused);
220
- if (pane instanceof ModelFieldsPane && !this.draft.fields.id)
220
+ if (pane instanceof ModelFieldsPane && !this.draft.read().id)
221
221
  pane.startEditingId();
222
222
  this.refresh();
223
223
  return;
@@ -237,8 +237,7 @@ export class ProviderEditorScreen {
237
237
  this.host.confirm(`Delete provider "${this.options.providerId}" from models.json?` +
238
238
  (builtin ? " The built-in catalog remains and its models may reappear." : "") +
239
239
  " Stored credentials in auth.json are kept.", "Delete Provider", () => {
240
- this.options.store.removeProvider(this.options.providerId);
241
- this.options.refresher.touch(this.options.providerId);
240
+ this.edits.removeProvider();
242
241
  this.done("deleted");
243
242
  });
244
243
  return;
@@ -276,14 +275,8 @@ export class ProviderEditorScreen {
276
275
  rows.push("");
277
276
  return rows;
278
277
  }
279
- renderLeftItem(item, active, focused, width) {
280
- const theme = this.theme;
278
+ leftItemContent(item) {
281
279
  const store = this.options.store;
282
- // Single-accent focus rule: the marker and accent exist only in the
283
- // focused column; an unfocused column keeps its content plain.
284
- const lit = active && focused;
285
- const marker = lit ? theme.fg("accent", `${CURSOR} `) : " ";
286
- const style = (text, dim = false) => theme.fg(lit ? "accent" : dim ? "dim" : "text", text);
287
280
  let text;
288
281
  let note;
289
282
  switch (item.kind) {
@@ -300,7 +293,7 @@ export class ProviderEditorScreen {
300
293
  break;
301
294
  }
302
295
  case "draft": {
303
- text = this.draft?.fields.name ?? this.draft?.fields.id ?? "New Model";
296
+ text = this.draft?.read().name ?? this.draft?.read().id ?? "New Model";
304
297
  note = "· draft";
305
298
  break;
306
299
  }
@@ -313,7 +306,18 @@ export class ProviderEditorScreen {
313
306
  default:
314
307
  text = "";
315
308
  }
316
- const dim = item.kind === "draft" && !this.draft?.fields.name && !this.draft?.fields.id;
309
+ const dim = item.kind === "draft" && !this.draft?.read().name && !this.draft?.read().id;
310
+ return { text, note, dim };
311
+ }
312
+ renderLeftItem(item, active, focused, width) {
313
+ const theme = this.theme;
314
+ // Single-accent focus rule: the marker and accent exist only in the
315
+ // focused column; an unfocused column keeps its content plain.
316
+ const lit = active && focused;
317
+ const marker = lit ? theme.fg("accent", `${CURSOR} `) : " ";
318
+ const style = (text, dim = false) => theme.fg(lit ? "accent" : dim ? "dim" : "text", text);
319
+ const { text: label, note, dim } = this.leftItemContent(item);
320
+ let text = label;
317
321
  // Long model names keep head and tail (the distinctive parts) instead of a hard cut.
318
322
  if (item.kind === "model" || item.kind === "draft") {
319
323
  const budget = Math.max(8, width - 2 - (note ? visibleWidth(note) + 1 : 0));
@@ -365,7 +369,7 @@ export class ProviderEditorScreen {
365
369
  case "model":
366
370
  return new ModelFieldsPane(this.host, this.persistedHandle(item.modelId));
367
371
  case "draft":
368
- return new ModelFieldsPane(this.host, this.draftHandle());
372
+ return new ModelFieldsPane(this.host, this.draft);
369
373
  case "addModel":
370
374
  return new InfoPane(this.host, [
371
375
  "Press Enter to create a model.",
@@ -378,81 +382,12 @@ export class ProviderEditorScreen {
378
382
  }
379
383
  }
380
384
  persistedHandle(modelId) {
381
- const store = this.options.store;
382
- const providerId = this.options.providerId;
383
- const ref = { id: modelId };
384
- let renamingSnapshot;
385
- return {
386
- isDraft: false,
387
- read: () => renamingSnapshot ?? store.getModel(providerId, ref.id) ?? { id: ref.id },
388
- setField: (path, value) => {
389
- store.setModelField(providerId, ref.id, path, value);
390
- },
391
- rename: async (newId) => {
392
- const oldId = ref.id;
393
- renamingSnapshot = store.getModel(providerId, oldId);
394
- this.renaming = true;
395
- try {
396
- const error = await store.renameModel(providerId, oldId, newId);
397
- if (error)
398
- return error;
399
- ref.id = newId;
400
- const selected = this.leftItems[this.leftIndex];
401
- if (selected?.kind === "model" && selected.modelId === oldId)
402
- selected.modelId = newId;
403
- this.options.refresher.touch(providerId);
404
- return undefined;
405
- }
406
- finally {
407
- renamingSnapshot = undefined;
408
- this.renaming = false;
409
- this.syncFromStore();
410
- }
411
- },
412
- };
413
- }
414
- draftHandle() {
415
- const draft = this.draft;
416
- if (!draft)
417
- throw new Error("No model draft");
418
- return {
419
- isDraft: true,
420
- rename: async () => "Commit the model draft before renaming it.",
421
- read: () => draft.fields,
422
- setField: (path, value) => {
423
- if (path.length === 1) {
424
- const key = path[0];
425
- if (value === DELETE)
426
- delete draft.fields[key];
427
- else
428
- draft.fields[key] = value;
429
- }
430
- else {
431
- // Nested draft fields (thinkingLevelMap.medium, compat.x, cost.input…)
432
- const [head, ...rest] = path;
433
- const container = { ...(draft.fields[head] ?? {}) };
434
- let current = container;
435
- for (const segment of rest.slice(0, -1)) {
436
- const next = current[segment];
437
- if (typeof next === "object" && next !== null && !Array.isArray(next)) {
438
- current = next;
439
- }
440
- else {
441
- const created = {};
442
- current[segment] = created;
443
- current = created;
444
- }
445
- }
446
- const leaf = rest[rest.length - 1];
447
- if (value === DELETE)
448
- delete current[leaf];
449
- else
450
- current[leaf] = value;
451
- draft.fields[head] = container;
452
- }
453
- this.refresh();
454
- },
455
- };
385
+ return this.edits.model(modelId, (oldId, newId) => {
386
+ const selected = this.leftItems[this.leftIndex];
387
+ if (selected?.kind === "model" && selected.modelId === oldId)
388
+ selected.modelId = newId;
389
+ this.syncFromStore();
390
+ });
456
391
  }
457
392
  // ------------------------------------------------------------------
458
393
  // EditorHost implementation
@@ -465,19 +400,10 @@ export class ProviderEditorScreen {
465
400
  theme: this.theme,
466
401
  keybindings: this.keybindings,
467
402
  store,
468
- refresher: this.options.refresher,
403
+ edits: this.edits,
469
404
  providerId,
470
405
  pushPane: (pane) => this.pushPane(pane),
471
406
  popPane: () => this.popPane(),
472
- mutate: (apply) => {
473
- const before = store.pendingCount;
474
- apply();
475
- if (store.pendingCount !== before &&
476
- (!store.isDraftProvider(providerId) || hasProviderSettings(store.getProvider(providerId)))) {
477
- this.options.refresher.touch(providerId);
478
- }
479
- this.refresh();
480
- },
481
407
  refresh: () => this.refresh(),
482
408
  notify: (message, type) => this.options.notify(message, type),
483
409
  effectiveApi: (model) => {
@@ -496,7 +422,7 @@ export class ProviderEditorScreen {
496
422
  },
497
423
  runFetch: (signal) => fetchProviderModels(this.options, signal),
498
424
  importModels: async (models, signal) => {
499
- const error = await importProviderModels(this.options, models, signal);
425
+ const error = await importProviderModels({ ...this.options, edits: this.edits }, models, signal);
500
426
  if (!this.disposed)
501
427
  this.syncFromStore();
502
428
  return error;
@@ -532,21 +458,11 @@ export class ProviderEditorScreen {
532
458
  const draft = this.draft;
533
459
  if (!draft)
534
460
  return "No model draft.";
535
- const id = (draft.fields.id ?? "").trim();
536
- if (!id)
537
- return "Model id is required.";
538
- if (this.options.store.getModel(this.options.providerId, id))
539
- return `Model "${id}" already exists.`;
540
- if (!this.host.effectiveApi(draft.fields)) {
541
- return "Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.";
542
- }
543
- if (!this.host.effectiveBaseUrl(draft.fields)) {
544
- return "Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.";
545
- }
546
- const fields = { ...draft.fields };
547
- const model = { ...fields, id };
461
+ const error = this.edits.commitDraft(draft);
462
+ if (error)
463
+ return error;
464
+ const id = draft.read().id.trim();
548
465
  this.draft = undefined;
549
- this.host.mutate(() => this.options.store.addModel(this.options.providerId, model));
550
466
  this.rebuildLeftItems();
551
467
  const index = this.leftItems.findIndex((item) => item.kind === "model" && item.modelId === id);
552
468
  if (index >= 0)
@@ -597,29 +513,8 @@ export class ProviderEditorScreen {
597
513
  for (const item of this.leftItems) {
598
514
  if (item.kind === "separator")
599
515
  continue;
600
- let label = "";
601
- switch (item.kind) {
602
- case "apiAuth":
603
- label = "API Auth";
604
- break;
605
- case "fetch":
606
- label = `Fetch Models${this.fetchStatus ? ` ${this.fetchStatus}` : ""}`;
607
- break;
608
- case "model": {
609
- const model = this.options.store.getModel(this.options.providerId, item.modelId);
610
- label = model ? modelDisplayName(model) : item.modelId;
611
- break;
612
- }
613
- case "draft":
614
- label = `${this.draft?.fields.name ?? this.draft?.fields.id ?? "New Model"} · draft`;
615
- break;
616
- case "addModel":
617
- label = "+ Add Model";
618
- break;
619
- case "deleteProvider":
620
- label = "Delete Provider";
621
- break;
622
- }
516
+ const { text, note } = this.leftItemContent(item);
517
+ const label = text + (note ? ` ${note}` : "");
623
518
  longest = Math.max(longest, visibleWidth(label));
624
519
  }
625
520
  const fit = Math.max(LEFT_WIDTH_MIN, Math.min(LEFT_WIDTH_MAX, longest + 2));
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/editor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Two-pane provider editor.\n *\n * Left column: API Auth / Fetch Models, the provider's\n * models (name → id → \"New Model\" fallback, one draft at a time), then\n * + Add Model and Delete Provider. Right column hosts the selected item's\n * field pane and sub-pane stack; both columns keep their own selection and\n * scroll position. The frame height is fixed: each column scrolls inside a\n * fixed window with a (n/N) position indicator instead of resizing, and the\n * selected row stays accent in both panes while the unfocused pane's other\n * rows dim back. Typing on a value row overwrites, Enter tweaks or enters,\n * ←/→ switch panes, Esc cancels/pops/backs out.\n */\n\nimport \"../keybindings.ts\";\nimport { type Component, type Focusable, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport type { ModelRegistry } from \"../../../core/model-registry.ts\";\nimport type { ModelRuntime } from \"../../../core/model-runtime.ts\";\nimport { DynamicBorder } from \"../../../modes/interactive/components/dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { isBuiltinProviderId } from \"../catalog.ts\";\nimport { effectiveModelSettings, hasProviderSettings } from \"../configuration.ts\";\nimport { fetchProviderModels, importProviderModels } from \"../connection.ts\";\nimport type { RefreshCoordinator } from \"../refresh.ts\";\nimport { DELETE, type ModelsJsonStore } from \"../store.ts\";\nimport { ConfirmPane, InfoPane } from \"./dialogs.ts\";\nimport { FetchModelsPane } from \"./fetch-models.ts\";\nimport { ModelFieldsPane } from \"./model-fields.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { ApiAuthPane } from \"./provider-fields.ts\";\nimport { CURSOR, truncateMiddle, windowLines } from \"./value-row.ts\";\n\nexport interface ProviderEditorOptions {\n\tstore: ModelsJsonStore;\n\trefresher: RefreshCoordinator;\n\tproviderId: string;\n\t/** Session model at /provider open time; protects it and its provider from delete/rename. */\n\tcurrentModel?: { provider: string; id: string };\n\tregistry: Pick<ModelRegistry, \"getProviderAuthStatus\">;\n\truntime: Pick<ModelRuntime, \"getAuth\" | \"getProviderAuthStatus\">;\n\tnotify: (message: string, type: \"info\" | \"warning\" | \"error\") => void;\n}\n\nexport type ProviderEditorResult = \"back\" | \"deleted\";\n\ntype LeftItem =\n\t| { kind: \"apiAuth\" }\n\t| { kind: \"fetch\" }\n\t| { kind: \"separator\" }\n\t| { kind: \"model\"; modelId: string }\n\t| { kind: \"draft\" }\n\t| { kind: \"addModel\" }\n\t| { kind: \"deleteProvider\" };\n\nconst LEFT_WIDTH_MIN = 16;\nconst LEFT_WIDTH_MAX = 40;\n/** Fixed editor body height: both columns scroll inside it rather than resizing the frame. */\nconst BODY_ROWS = 14;\nconst MIN_WIDTH = 56;\n\ninterface ModelDraft {\n\tfields: Partial<ModelsJsonModel>;\n}\n\nfunction padTo(line: string, width: number): string {\n\tconst missing = width - visibleWidth(line);\n\treturn missing > 0 ? line + \" \".repeat(missing) : line;\n}\n\n/** Stable identity across left-list rebuilds (a rename keeps the selection on the model). */\nfunction leftItemKey(item: LeftItem | undefined): string {\n\tif (!item) return \"\";\n\tswitch (item.kind) {\n\t\tcase \"model\":\n\t\t\treturn `model:${item.modelId}`;\n\t\tdefault:\n\t\t\treturn item.kind;\n\t}\n}\n\nexport class ProviderEditorScreen implements Component, Focusable {\n\tprivate readonly tui: TUI;\n\tprivate readonly theme: Theme;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly done: (result: ProviderEditorResult) => void;\n\tprivate readonly options: ProviderEditorOptions;\n\tprivate readonly host: EditorHost;\n\n\tprivate leftItems: LeftItem[] = [];\n\tprivate leftIndex = 0;\n\tprivate focusPane: \"left\" | \"right\" = \"left\";\n\tprivate stack: EditorPane[] = [];\n\tprivate draft: ModelDraft | undefined;\n\tprivate fetchStatus: string | undefined;\n\tprivate disposed = false;\n\tprivate renaming = false;\n\tprivate _focused = false;\n\tprivate cache: { width: number; lines: string[] } | undefined;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\ttheme: Theme,\n\t\tkeybindings: KeybindingsManager,\n\t\tdone: (result: ProviderEditorResult) => void,\n\t\toptions: ProviderEditorOptions,\n\t) {\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.keybindings = keybindings;\n\t\tthis.done = done;\n\t\tthis.options = options;\n\t\tthis.host = this.createHost();\n\t\tthis.rebuildLeftItems();\n\t\tthis.resetRightStack();\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Component / Focusable\n\t// ------------------------------------------------------------------\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.topPane()?.setFocused(value && this.focusPane === \"right\");\n\t}\n\n\tinvalidate(): void {\n\t\tthis.cache = undefined;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (const pane of this.stack) pane.dispose?.();\n\t\tthis.stack = [];\n\t\t// An unsubmitted draft never reaches disk; leaving the editor drops it.\n\t\tif (!hasProviderSettings(this.options.store.getProvider(this.options.providerId))) {\n\t\t\tthis.options.store.discardProviderDraft(this.options.providerId);\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tif (this.cache && this.cache.width === width) return this.cache.lines;\n\t\tconst lines = this.renderFrame(width);\n\t\tthis.cache = { width, lines };\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.focusPane === \"right\") {\n\t\t\tconst pane = this.topPane();\n\t\t\tif (pane && !pane.isEditing?.() && this.keybindings.matches(data, \"app.provider.switchPaneLeft\")) {\n\t\t\t\tpane.setFocused(false);\n\t\t\t\tthis.focusPane = \"left\";\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpane?.handleInput(data);\n\t\t\treturn;\n\t\t}\n\t\tconst kb = this.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.moveLeft(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.moveLeft(1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.switchPaneRight\")) {\n\t\t\tthis.activateLeftItem(\"inspect\");\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.activateLeftItem(\"activate\");\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.done(\"back\");\n\t}\n\n\t/** Rebuild from the store view after a save merged external changes. */\n\tsyncFromStore(): void {\n\t\tif (this.disposed || this.renaming) return;\n\t\tconst selected = this.leftItems[this.leftIndex];\n\t\tconst selectedKey = leftItemKey(selected);\n\t\tthis.rebuildLeftItems();\n\t\tconst nextIndex = this.leftItems.findIndex((item) => leftItemKey(item) === selectedKey);\n\t\tthis.leftIndex = nextIndex >= 0 ? nextIndex : Math.min(this.leftIndex, this.selectableIndex(0));\n\t\t// If the selected model vanished externally, rebuild the right column.\n\t\tif (nextIndex < 0 && selected?.kind === \"model\") {\n\t\t\tthis.resetRightStack();\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Left column\n\t// ------------------------------------------------------------------\n\n\tprivate rebuildLeftItems(): void {\n\t\tconst items: LeftItem[] = [{ kind: \"apiAuth\" }, { kind: \"fetch\" }, { kind: \"separator\" }];\n\t\tfor (const model of this.options.store.getModels(this.options.providerId)) {\n\t\t\titems.push({ kind: \"model\", modelId: model.id });\n\t\t}\n\t\tif (this.draft) items.push({ kind: \"draft\" });\n\t\titems.push({ kind: \"separator\" }, { kind: \"addModel\" }, { kind: \"deleteProvider\" });\n\t\tthis.leftItems = items;\n\t}\n\n\tprivate selectableIndex(start: number): number {\n\t\tconst index = this.leftItems.findIndex((item, i) => i >= start && item.kind !== \"separator\");\n\t\treturn index >= 0 ? index : 0;\n\t}\n\n\tprivate moveLeft(delta: number): void {\n\t\tconst selectable = this.leftItems\n\t\t\t.map((item, index) => ({ item, index }))\n\t\t\t.filter((entry) => entry.item.kind !== \"separator\");\n\t\tif (selectable.length === 0) return;\n\t\tconst position = selectable.findIndex((entry) => entry.index === this.leftIndex);\n\t\tconst next = selectable[(position + delta + selectable.length) % selectable.length]!;\n\t\tif (next.index === this.leftIndex) return;\n\t\tthis.leftIndex = next.index;\n\t\t// Moving the left selection replaces the right column (cancels fetch/edit state).\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t}\n\n\t/**\n\t * Enter activates the row; → only focuses its pane. Action rows therefore\n\t * never fire from a focus move, matching their InfoPane's \"Press Enter\".\n\t */\n\tprivate activateLeftItem(via: \"activate\" | \"inspect\"): void {\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tif (!item) return;\n\t\tswitch (item.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\tcase \"model\":\n\t\t\tcase \"draft\":\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"fetch\":\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tif (via === \"activate\") {\n\t\t\t\t\tconst pane = this.topPane();\n\t\t\t\t\tif (pane instanceof FetchModelsPane) pane.start();\n\t\t\t\t}\n\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"addModel\": {\n\t\t\t\tif (via === \"inspect\") {\n\t\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this.draft) {\n\t\t\t\t\tthis.draft = { fields: {} };\n\t\t\t\t\tthis.rebuildLeftItems();\n\t\t\t\t}\n\t\t\t\tconst draftIndex = this.leftItems.findIndex((entry) => entry.kind === \"draft\");\n\t\t\t\tif (draftIndex >= 0) this.leftIndex = draftIndex;\n\t\t\t\tthis.resetRightStack();\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tconst pane = this.topPane();\n\t\t\t\tpane?.setFocused(this._focused);\n\t\t\t\tif (pane instanceof ModelFieldsPane && !this.draft.fields.id) pane.startEditingId();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"deleteProvider\": {\n\t\t\t\tif (via === \"inspect\") {\n\t\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.host.isCurrentProvider()) {\n\t\t\t\t\tthis.host.notify(\n\t\t\t\t\t\t\"The current model's provider cannot be deleted; switch models with /model first.\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst builtin = isBuiltinProviderId(this.options.providerId);\n\t\t\t\tthis.host.confirm(\n\t\t\t\t\t`Delete provider \"${this.options.providerId}\" from models.json?` +\n\t\t\t\t\t\t(builtin ? \" The built-in catalog remains and its models may reappear.\" : \"\") +\n\t\t\t\t\t\t\" Stored credentials in auth.json are kept.\",\n\t\t\t\t\t\"Delete Provider\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.options.store.removeProvider(this.options.providerId);\n\t\t\t\t\t\tthis.options.refresher.touch(this.options.providerId);\n\t\t\t\t\t\tthis.done(\"deleted\");\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate renderLeft(width: number): string[] {\n\t\tconst theme = this.theme;\n\t\tconst focused = this.focusPane === \"left\";\n\t\tconst rows: string[] = [];\n\t\tconst renderRow = (index: number): string => {\n\t\t\tconst item = this.leftItems[index]!;\n\t\t\tif (item.kind === \"separator\") {\n\t\t\t\treturn theme.fg(\"borderMuted\", ` ${\"─\".repeat(Math.max(1, width - 4))}`);\n\t\t\t}\n\t\t\treturn this.renderLeftItem(item, index === this.leftIndex, focused, width);\n\t\t};\n\t\tif (this.leftItems.length <= BODY_ROWS) {\n\t\t\tfor (let index = 0; index < this.leftItems.length; index++) rows.push(renderRow(index));\n\t\t} else {\n\t\t\t// One row carries the (n/N) position indicator, like the /model selector.\n\t\t\tconst slots = BODY_ROWS - 1;\n\t\t\tconst start = Math.max(0, Math.min(this.leftIndex - Math.floor(slots / 2), this.leftItems.length - slots));\n\t\t\tfor (let index = start; index < start + slots; index++) rows.push(renderRow(index));\n\t\t\tconst selectable: LeftItem[] = this.leftItems.filter((item) => item.kind !== \"separator\");\n\t\t\tconst position = selectable.indexOf(this.leftItems[this.leftIndex]!);\n\t\t\trows.push(theme.fg(\"dim\", ` (${position + 1}/${selectable.length})`));\n\t\t}\n\t\twhile (rows.length < BODY_ROWS) rows.push(\"\");\n\t\treturn rows;\n\t}\n\n\tprivate renderLeftItem(item: LeftItem, active: boolean, focused: boolean, width: number): string {\n\t\tconst theme = this.theme;\n\t\tconst store = this.options.store;\n\t\t// Single-accent focus rule: the marker and accent exist only in the\n\t\t// focused column; an unfocused column keeps its content plain.\n\t\tconst lit = active && focused;\n\t\tconst marker = lit ? theme.fg(\"accent\", `${CURSOR} `) : \" \";\n\t\tconst style = (text: string, dim = false) => theme.fg(lit ? \"accent\" : dim ? \"dim\" : \"text\", text);\n\t\tlet text: string;\n\t\tlet note: string | undefined;\n\t\tswitch (item.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\ttext = \"API Auth\";\n\t\t\t\tbreak;\n\t\t\tcase \"fetch\":\n\t\t\t\ttext = \"Fetch Models\";\n\t\t\t\tnote = this.fetchStatus;\n\t\t\t\tbreak;\n\t\t\tcase \"model\": {\n\t\t\t\tconst model = store.getModel(this.options.providerId, item.modelId);\n\t\t\t\ttext = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"draft\": {\n\t\t\t\ttext = this.draft?.fields.name ?? this.draft?.fields.id ?? \"New Model\";\n\t\t\t\tnote = \"· draft\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"addModel\":\n\t\t\t\ttext = \"+ Add Model\";\n\t\t\t\tbreak;\n\t\t\tcase \"deleteProvider\":\n\t\t\t\ttext = \"Delete Provider\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttext = \"\";\n\t\t}\n\t\tconst dim = item.kind === \"draft\" && !this.draft?.fields.name && !this.draft?.fields.id;\n\t\t// Long model names keep head and tail (the distinctive parts) instead of a hard cut.\n\t\tif (item.kind === \"model\" || item.kind === \"draft\") {\n\t\t\tconst budget = Math.max(8, width - 2 - (note ? visibleWidth(note) + 1 : 0));\n\t\t\ttext = truncateMiddle(text, budget);\n\t\t}\n\t\tconst noteText = note ? theme.fg(\"dim\", ` ${note}`) : \"\";\n\t\treturn truncateToWidth(marker + style(text, dim) + noteText, width);\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Right column (pane stack)\n\t// ------------------------------------------------------------------\n\n\tprivate topPane(): EditorPane | undefined {\n\t\treturn this.stack[this.stack.length - 1];\n\t}\n\n\tprivate pushPane(pane: EditorPane): void {\n\t\tthis.topPane()?.setFocused(false);\n\t\tthis.focusPane = \"right\";\n\t\tthis.stack.push(pane);\n\t\tpane.setFocused(this._focused && this.focusPane === \"right\");\n\t\tthis.refresh();\n\t}\n\n\tprivate popPane(): void {\n\t\tif (this.stack.length <= 1) {\n\t\t\t// Esc on the base pane moves focus back to the left column.\n\t\t\tthis.topPane()?.setFocused(false);\n\t\t\tthis.focusPane = \"left\";\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst pane = this.stack.pop();\n\t\tpane?.setFocused(false);\n\t\tpane?.dispose?.();\n\t\tthis.topPane()?.setFocused(this._focused && this.focusPane === \"right\");\n\t\tthis.refresh();\n\t}\n\n\tprivate resetRightStack(): void {\n\t\tfor (const pane of this.stack) pane.dispose?.();\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tthis.stack = [this.createBasePane(item)];\n\t\tthis.topPane()?.setFocused(this._focused && this.focusPane === \"right\");\n\t}\n\n\tprivate createBasePane(item: LeftItem | undefined): EditorPane {\n\t\tswitch (item?.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\treturn new ApiAuthPane(this.host, this.options.registry);\n\t\t\tcase \"fetch\":\n\t\t\t\treturn new FetchModelsPane(this.host);\n\t\t\tcase \"model\":\n\t\t\t\treturn new ModelFieldsPane(this.host, this.persistedHandle(item.modelId));\n\t\t\tcase \"draft\":\n\t\t\t\treturn new ModelFieldsPane(this.host, this.draftHandle());\n\t\t\tcase \"addModel\":\n\t\t\t\treturn new InfoPane(\n\t\t\t\t\tthis.host,\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Press Enter to create a model.\",\n\t\t\t\t\t\t\"A draft is kept in memory until its id is set; Esc on the draft discards it.\",\n\t\t\t\t\t],\n\t\t\t\t\t() => this.activateLeftItem(\"activate\"),\n\t\t\t\t);\n\t\t\tcase \"deleteProvider\":\n\t\t\t\treturn new InfoPane(this.host, [\"Press Enter to delete this provider from models.json.\"], () =>\n\t\t\t\t\tthis.activateLeftItem(\"activate\"),\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn new InfoPane(this.host, []);\n\t\t}\n\t}\n\n\tprivate persistedHandle(modelId: string): ModelHandle {\n\t\tconst store = this.options.store;\n\t\tconst providerId = this.options.providerId;\n\t\tconst ref = { id: modelId };\n\t\tlet renamingSnapshot: ModelsJsonModel | undefined;\n\t\treturn {\n\t\t\tisDraft: false,\n\t\t\tread: () => renamingSnapshot ?? store.getModel(providerId, ref.id) ?? { id: ref.id },\n\t\t\tsetField: (path, value) => {\n\t\t\t\tstore.setModelField(providerId, ref.id, path, value);\n\t\t\t},\n\t\t\trename: async (newId) => {\n\t\t\t\tconst oldId = ref.id;\n\t\t\t\trenamingSnapshot = store.getModel(providerId, oldId);\n\t\t\t\tthis.renaming = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst error = await store.renameModel(providerId, oldId, newId);\n\t\t\t\t\tif (error) return error;\n\t\t\t\t\tref.id = newId;\n\t\t\t\t\tconst selected = this.leftItems[this.leftIndex];\n\t\t\t\t\tif (selected?.kind === \"model\" && selected.modelId === oldId) selected.modelId = newId;\n\t\t\t\t\tthis.options.refresher.touch(providerId);\n\t\t\t\t\treturn undefined;\n\t\t\t\t} finally {\n\t\t\t\t\trenamingSnapshot = undefined;\n\t\t\t\t\tthis.renaming = false;\n\t\t\t\t\tthis.syncFromStore();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate draftHandle(): ModelHandle {\n\t\tconst draft = this.draft;\n\t\tif (!draft) throw new Error(\"No model draft\");\n\t\treturn {\n\t\t\tisDraft: true,\n\t\t\trename: async () => \"Commit the model draft before renaming it.\",\n\t\t\tread: () => draft.fields,\n\t\t\tsetField: (path, value) => {\n\t\t\t\tif (path.length === 1) {\n\t\t\t\t\tconst key = path[0]! as keyof ModelsJsonModel;\n\t\t\t\t\tif (value === DELETE) delete draft.fields[key];\n\t\t\t\t\telse (draft.fields as Record<string, unknown>)[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\t// Nested draft fields (thinkingLevelMap.medium, compat.x, cost.input…)\n\t\t\t\t\tconst [head, ...rest] = path as [keyof ModelsJsonModel, ...string[]];\n\t\t\t\t\tconst container: Record<string, unknown> = { ...((draft.fields[head] as object) ?? {}) } as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\tlet current = container;\n\t\t\t\t\tfor (const segment of rest.slice(0, -1)) {\n\t\t\t\t\t\tconst next = current[segment];\n\t\t\t\t\t\tif (typeof next === \"object\" && next !== null && !Array.isArray(next)) {\n\t\t\t\t\t\t\tcurrent = next as Record<string, unknown>;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst created: Record<string, unknown> = {};\n\t\t\t\t\t\t\tcurrent[segment] = created;\n\t\t\t\t\t\t\tcurrent = created;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst leaf = rest[rest.length - 1]!;\n\t\t\t\t\tif (value === DELETE) delete current[leaf];\n\t\t\t\t\telse current[leaf] = value;\n\t\t\t\t\t(draft.fields as Record<string, unknown>)[head] = container;\n\t\t\t\t}\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\t// ------------------------------------------------------------------\n\t// EditorHost implementation\n\t// ------------------------------------------------------------------\n\n\tprivate createHost(): EditorHost {\n\t\tconst store = this.options.store;\n\t\tconst providerId = this.options.providerId;\n\t\treturn {\n\t\t\ttui: this.tui,\n\t\t\ttheme: this.theme,\n\t\t\tkeybindings: this.keybindings,\n\t\t\tstore,\n\t\t\trefresher: this.options.refresher,\n\t\t\tproviderId,\n\t\t\tpushPane: (pane) => this.pushPane(pane),\n\t\t\tpopPane: () => this.popPane(),\n\t\t\tmutate: (apply) => {\n\t\t\t\tconst before = store.pendingCount;\n\t\t\t\tapply();\n\t\t\t\tif (\n\t\t\t\t\tstore.pendingCount !== before &&\n\t\t\t\t\t(!store.isDraftProvider(providerId) || hasProviderSettings(store.getProvider(providerId)))\n\t\t\t\t) {\n\t\t\t\t\tthis.options.refresher.touch(providerId);\n\t\t\t\t}\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\trefresh: () => this.refresh(),\n\t\t\tnotify: (message, type) => this.options.notify(message, type),\n\t\t\teffectiveApi: (model) => {\n\t\t\t\treturn effectiveModelSettings(providerId, store.getProvider(providerId), model).api;\n\t\t\t},\n\t\t\teffectiveBaseUrl: (model) => {\n\t\t\t\treturn effectiveModelSettings(providerId, store.getProvider(providerId), model).baseUrl;\n\t\t\t},\n\t\t\tcommitModelDraft: () => this.commitModelDraft(),\n\t\t\tdiscardModelDraft: () => this.discardModelDraft(),\n\t\t\tisCurrentModel: (modelId) =>\n\t\t\t\tthis.options.currentModel?.provider === providerId && this.options.currentModel.id === modelId,\n\t\t\tisCurrentProvider: () => this.options.currentModel?.provider === providerId,\n\t\t\tsetFetchStatus: (status) => {\n\t\t\t\tthis.fetchStatus = status;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\trunFetch: (signal) => fetchProviderModels(this.options, signal),\n\t\t\timportModels: async (models, signal) => {\n\t\t\t\tconst error = await importProviderModels(this.options, models, signal);\n\t\t\t\tif (!this.disposed) this.syncFromStore();\n\t\t\t\treturn error;\n\t\t\t},\n\t\t\tconfirm: (message, actionLabel, action) =>\n\t\t\t\tthis.pushPane(new ConfirmPane(this.host, message, actionLabel, action)),\n\t\t\tonModelRemoved: () => {\n\t\t\t\tthis.rebuildLeftItems();\n\t\t\t\t// Land on the next row where the model was; walk back over separators.\n\t\t\t\tthis.leftIndex = Math.min(this.leftIndex, this.leftItems.length - 1);\n\t\t\t\twhile (this.leftIndex > 0 && this.leftItems[this.leftIndex]?.kind === \"separator\") this.leftIndex--;\n\t\t\t\tif (this.leftItems[this.leftIndex]?.kind === \"separator\") this.leftIndex = this.selectableIndex(0);\n\t\t\t\tthis.focusPane = \"left\";\n\t\t\t\tthis.resetRightStack();\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Drop the in-memory draft: the selection returns to + Add Model with focus on the left. */\n\tprivate discardModelDraft(): void {\n\t\tif (!this.draft) return;\n\t\tthis.draft = undefined;\n\t\tthis.rebuildLeftItems();\n\t\tconst addIndex = this.leftItems.findIndex((item) => item.kind === \"addModel\");\n\t\tthis.leftIndex = addIndex >= 0 ? addIndex : this.selectableIndex(0);\n\t\tthis.focusPane = \"left\";\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t}\n\n\tprivate commitModelDraft(): string | undefined {\n\t\tconst draft = this.draft;\n\t\tif (!draft) return \"No model draft.\";\n\t\tconst id = (draft.fields.id ?? \"\").trim();\n\t\tif (!id) return \"Model id is required.\";\n\t\tif (this.options.store.getModel(this.options.providerId, id)) return `Model \"${id}\" already exists.`;\n\t\tif (!this.host.effectiveApi(draft.fields)) {\n\t\t\treturn \"Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.\";\n\t\t}\n\t\tif (!this.host.effectiveBaseUrl(draft.fields)) {\n\t\t\treturn \"Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.\";\n\t\t}\n\t\tconst fields = { ...draft.fields };\n\t\tconst model: ModelsJsonModel = { ...fields, id };\n\t\tthis.draft = undefined;\n\t\tthis.host.mutate(() => this.options.store.addModel(this.options.providerId, model));\n\t\tthis.rebuildLeftItems();\n\t\tconst index = this.leftItems.findIndex((item) => item.kind === \"model\" && item.modelId === id);\n\t\tif (index >= 0) this.leftIndex = index;\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t\treturn undefined;\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Frame rendering\n\t// ------------------------------------------------------------------\n\n\tprivate refresh(): void {\n\t\tthis.invalidate();\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate renderFrame(width: number): string[] {\n\t\tconst theme = this.theme;\n\t\tconst border = new DynamicBorder((text) => theme.fg(\"border\", text)).render(width)[0]!;\n\t\tif (width < MIN_WIDTH) {\n\t\t\treturn [\n\t\t\t\tborder,\n\t\t\t\ttruncateToWidth(theme.fg(\"warning\", ` /provider needs at least ${MIN_WIDTH} columns`), width),\n\t\t\t\tborder,\n\t\t\t];\n\t\t}\n\t\tconst leftWidth = this.computeLeftWidth(width);\n\t\tconst rightWidth = width - leftWidth - 3;\n\t\tconst separator = theme.fg(\"border\", \" │ \");\n\n\t\tconst title = this.renderTitle(width);\n\t\t// The crumb marks drill-down depth only; base rows are already named by the left selection.\n\t\tconst crumb = truncateToWidth(this.theme.fg(\"muted\", this.topPane()?.crumb ?? \"\"), rightWidth);\n\t\tconst leftLines = this.renderLeft(leftWidth);\n\t\tconst pane = this.topPane();\n\t\tconst paneLines = pane ? windowLines(theme, pane.render(rightWidth), BODY_ROWS - 1, pane.scrollWindow?.()) : [];\n\t\tconst rightLines = [crumb, ...paneLines];\n\t\tconst body: string[] = [];\n\t\tfor (let row = 0; row < BODY_ROWS; row++) {\n\t\t\tconst left = padTo(truncateToWidth(leftLines[row] ?? \"\", leftWidth), leftWidth);\n\t\t\tconst right = truncateToWidth(rightLines[row] ?? \"\", rightWidth);\n\t\t\tbody.push(left + separator + right);\n\t\t}\n\n\t\tconst footerLines = this.renderFooter(width);\n\t\treturn [border, title, border, ...body, border, ...footerLines, border];\n\t}\n\n\t/** Content-driven left width: fits the longest visible label, clamped to 16–40 and 45% of the terminal. */\n\tprivate computeLeftWidth(width: number): number {\n\t\tlet longest = 12;\n\t\tfor (const item of this.leftItems) {\n\t\t\tif (item.kind === \"separator\") continue;\n\t\t\tlet label = \"\";\n\t\t\tswitch (item.kind) {\n\t\t\t\tcase \"apiAuth\":\n\t\t\t\t\tlabel = \"API Auth\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"fetch\":\n\t\t\t\t\tlabel = `Fetch Models${this.fetchStatus ? ` ${this.fetchStatus}` : \"\"}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"model\": {\n\t\t\t\t\tconst model = this.options.store.getModel(this.options.providerId, item.modelId);\n\t\t\t\t\tlabel = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"draft\":\n\t\t\t\t\tlabel = `${this.draft?.fields.name ?? this.draft?.fields.id ?? \"New Model\"} · draft`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"addModel\":\n\t\t\t\t\tlabel = \"+ Add Model\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"deleteProvider\":\n\t\t\t\t\tlabel = \"Delete Provider\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlongest = Math.max(longest, visibleWidth(label));\n\t\t}\n\t\tconst fit = Math.max(LEFT_WIDTH_MIN, Math.min(LEFT_WIDTH_MAX, longest + 2));\n\t\treturn Math.min(fit, Math.max(LEFT_WIDTH_MIN, Math.floor(width * 0.45)));\n\t}\n\n\tprivate renderTitle(width: number): string {\n\t\tconst theme = this.theme;\n\t\tlet title = ` /provider · ${this.options.providerId}`;\n\t\tif (isBuiltinProviderId(this.options.providerId)) title += \" · overlays built-in catalog\";\n\t\treturn truncateToWidth(theme.fg(\"accent\", theme.bold(title)), width);\n\t}\n\n\tprivate renderFooter(width: number): string[] {\n\t\tif (this.focusPane === \"right\") {\n\t\t\t// The editor owns the way-back hint so every pane's footer is consistent.\n\t\t\tconst hints = [this.topPane()?.hints() ?? \"\", keyHint(\"app.provider.switchPaneLeft\", \"focus left\")]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \");\n\t\t\treturn [truncateToWidth(hints, width)];\n\t\t}\n\t\tconst hints = [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", this.leftActivateLabel()),\n\t\t\tkeyHint(\"app.provider.switchPaneRight\", \"focus right\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t\treturn [truncateToWidth(hints, width)];\n\t}\n\n\t/** What Enter does to the selected left-column row, so the footer never lies about action rows. */\n\tprivate leftActivateLabel(): string {\n\t\tswitch (this.leftItems[this.leftIndex]?.kind) {\n\t\t\tcase \"fetch\":\n\t\t\t\treturn \"fetch\";\n\t\t\tcase \"addModel\":\n\t\t\t\treturn \"create\";\n\t\t\tcase \"deleteProvider\":\n\t\t\t\treturn \"delete\";\n\t\t\tdefault:\n\t\t\t\treturn \"open\";\n\t\t}\n\t}\n}\n\nfunction modelDisplayName(model: ModelsJsonModel): string {\n\treturn model.name ?? model.id;\n}\n"]}
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/editor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Two-pane provider editor.\n *\n * Left column: API Auth / Fetch Models, the provider's\n * models (name → id → \"New Model\" fallback, one draft at a time), then\n * + Add Model and Delete Provider. Right column hosts the selected item's\n * field pane and sub-pane stack; both columns keep their own selection and\n * scroll position. The frame height is fixed: each column scrolls inside a\n * fixed window with a (n/N) position indicator instead of resizing, and the\n * selected row stays accent in both panes while the unfocused pane's other\n * rows dim back. Typing on a value row overwrites, Enter tweaks or enters,\n * ←/→ switch panes, Esc cancels/pops/backs out.\n */\n\nimport \"../keybindings.ts\";\nimport { type Component, type Focusable, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport type { ModelRegistry } from \"../../../core/model-registry.ts\";\nimport type { ModelRuntime } from \"../../../core/model-runtime.ts\";\nimport { DynamicBorder } from \"../../../modes/interactive/components/dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { isBuiltinProviderId } from \"../catalog.ts\";\nimport { effectiveModelSettings, hasProviderSettings } from \"../configuration.ts\";\nimport { fetchProviderModels, importProviderModels } from \"../connection.ts\";\nimport { type DraftModelHandle, ProviderEdits } from \"../editing.ts\";\nimport type { RefreshCoordinator } from \"../refresh.ts\";\nimport type { ModelsJsonStore } from \"../store.ts\";\nimport { ConfirmPane, InfoPane } from \"./dialogs.ts\";\nimport { FetchModelsPane } from \"./fetch-models.ts\";\nimport { ModelFieldsPane } from \"./model-fields.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { ApiAuthPane } from \"./provider-fields.ts\";\nimport { CURSOR, truncateMiddle, windowLines } from \"./value-row.ts\";\n\nexport interface ProviderEditorOptions {\n\tstore: ModelsJsonStore;\n\trefresher: RefreshCoordinator;\n\tproviderId: string;\n\t/** Session model at /provider open time; protects it and its provider from delete/rename. */\n\tcurrentModel?: { provider: string; id: string };\n\tregistry: Pick<ModelRegistry, \"getProviderAuthStatus\">;\n\truntime: Pick<ModelRuntime, \"getAuth\" | \"getProviderAuthStatus\">;\n\tnotify: (message: string, type: \"info\" | \"warning\" | \"error\") => void;\n}\n\nexport type ProviderEditorResult = \"back\" | \"deleted\";\n\ntype LeftItem =\n\t| { kind: \"apiAuth\" }\n\t| { kind: \"fetch\" }\n\t| { kind: \"separator\" }\n\t| { kind: \"model\"; modelId: string }\n\t| { kind: \"draft\" }\n\t| { kind: \"addModel\" }\n\t| { kind: \"deleteProvider\" };\n\nconst LEFT_WIDTH_MIN = 16;\nconst LEFT_WIDTH_MAX = 40;\n/** Fixed editor body height: both columns scroll inside it rather than resizing the frame. */\nconst BODY_ROWS = 14;\nconst MIN_WIDTH = 56;\n\nfunction padTo(line: string, width: number): string {\n\tconst missing = width - visibleWidth(line);\n\treturn missing > 0 ? line + \" \".repeat(missing) : line;\n}\n\n/** Stable identity across left-list rebuilds (a rename keeps the selection on the model). */\nfunction leftItemKey(item: LeftItem | undefined): string {\n\tif (!item) return \"\";\n\tswitch (item.kind) {\n\t\tcase \"model\":\n\t\t\treturn `model:${item.modelId}`;\n\t\tdefault:\n\t\t\treturn item.kind;\n\t}\n}\n\nexport class ProviderEditorScreen implements Component, Focusable {\n\tprivate readonly tui: TUI;\n\tprivate readonly theme: Theme;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly done: (result: ProviderEditorResult) => void;\n\tprivate readonly options: ProviderEditorOptions;\n\tprivate readonly host: EditorHost;\n\n\tprivate leftItems: LeftItem[] = [];\n\tprivate leftIndex = 0;\n\tprivate focusPane: \"left\" | \"right\" = \"left\";\n\tprivate stack: EditorPane[] = [];\n\tprivate draft: DraftModelHandle | undefined;\n\tprivate readonly edits: ProviderEdits;\n\tprivate fetchStatus: string | undefined;\n\tprivate disposed = false;\n\tprivate _focused = false;\n\tprivate cache: { width: number; lines: string[] } | undefined;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\ttheme: Theme,\n\t\tkeybindings: KeybindingsManager,\n\t\tdone: (result: ProviderEditorResult) => void,\n\t\toptions: ProviderEditorOptions,\n\t) {\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.keybindings = keybindings;\n\t\tthis.done = done;\n\t\tthis.options = options;\n\t\tthis.edits = new ProviderEdits(options.store, options.providerId, options.refresher, () => this.refresh());\n\t\tthis.host = this.createHost();\n\t\tthis.rebuildLeftItems();\n\t\tthis.resetRightStack();\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Component / Focusable\n\t// ------------------------------------------------------------------\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.topPane()?.setFocused(value && this.focusPane === \"right\");\n\t}\n\n\tinvalidate(): void {\n\t\tthis.cache = undefined;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (const pane of this.stack) pane.dispose?.();\n\t\tthis.stack = [];\n\t\t// An unsubmitted draft never reaches disk; leaving the editor drops it.\n\t\tif (!hasProviderSettings(this.options.store.getProvider(this.options.providerId))) {\n\t\t\tthis.options.store.discardProviderDraft(this.options.providerId);\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tif (this.cache && this.cache.width === width) return this.cache.lines;\n\t\tconst lines = this.renderFrame(width);\n\t\tthis.cache = { width, lines };\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.focusPane === \"right\") {\n\t\t\tconst pane = this.topPane();\n\t\t\tif (pane && !pane.isEditing?.() && this.keybindings.matches(data, \"app.provider.switchPaneLeft\")) {\n\t\t\t\tpane.setFocused(false);\n\t\t\t\tthis.focusPane = \"left\";\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpane?.handleInput(data);\n\t\t\treturn;\n\t\t}\n\t\tconst kb = this.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.moveLeft(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.moveLeft(1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.switchPaneRight\")) {\n\t\t\tthis.activateLeftItem(\"inspect\");\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.activateLeftItem(\"activate\");\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.done(\"back\");\n\t}\n\n\t/** Rebuild from the store view after a save merged external changes. */\n\tsyncFromStore(): void {\n\t\tif (this.disposed || this.edits.renaming) return;\n\t\tconst selected = this.leftItems[this.leftIndex];\n\t\tconst selectedKey = leftItemKey(selected);\n\t\tthis.rebuildLeftItems();\n\t\tconst nextIndex = this.leftItems.findIndex((item) => leftItemKey(item) === selectedKey);\n\t\tthis.leftIndex = nextIndex >= 0 ? nextIndex : Math.min(this.leftIndex, this.selectableIndex(0));\n\t\t// If the selected model vanished externally, rebuild the right column.\n\t\tif (nextIndex < 0 && selected?.kind === \"model\") {\n\t\t\tthis.resetRightStack();\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Left column\n\t// ------------------------------------------------------------------\n\n\tprivate rebuildLeftItems(): void {\n\t\tconst items: LeftItem[] = [{ kind: \"apiAuth\" }, { kind: \"fetch\" }, { kind: \"separator\" }];\n\t\tfor (const model of this.options.store.getModels(this.options.providerId)) {\n\t\t\titems.push({ kind: \"model\", modelId: model.id });\n\t\t}\n\t\tif (this.draft) items.push({ kind: \"draft\" });\n\t\titems.push({ kind: \"separator\" }, { kind: \"addModel\" }, { kind: \"deleteProvider\" });\n\t\tthis.leftItems = items;\n\t}\n\n\tprivate selectableIndex(start: number): number {\n\t\tconst index = this.leftItems.findIndex((item, i) => i >= start && item.kind !== \"separator\");\n\t\treturn index >= 0 ? index : 0;\n\t}\n\n\tprivate moveLeft(delta: number): void {\n\t\tconst selectable = this.leftItems\n\t\t\t.map((item, index) => ({ item, index }))\n\t\t\t.filter((entry) => entry.item.kind !== \"separator\");\n\t\tif (selectable.length === 0) return;\n\t\tconst position = selectable.findIndex((entry) => entry.index === this.leftIndex);\n\t\tconst next = selectable[(position + delta + selectable.length) % selectable.length]!;\n\t\tif (next.index === this.leftIndex) return;\n\t\tthis.leftIndex = next.index;\n\t\t// Moving the left selection replaces the right column (cancels fetch/edit state).\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t}\n\n\t/**\n\t * Enter activates the row; → only focuses its pane. Action rows therefore\n\t * never fire from a focus move, matching their InfoPane's \"Press Enter\".\n\t */\n\tprivate activateLeftItem(via: \"activate\" | \"inspect\"): void {\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tif (!item) return;\n\t\tswitch (item.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\tcase \"model\":\n\t\t\tcase \"draft\":\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"fetch\":\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tif (via === \"activate\") {\n\t\t\t\t\tconst pane = this.topPane();\n\t\t\t\t\tif (pane instanceof FetchModelsPane) pane.start();\n\t\t\t\t}\n\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"addModel\": {\n\t\t\t\tif (via === \"inspect\") {\n\t\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this.draft) {\n\t\t\t\t\tthis.draft = this.edits.draft();\n\t\t\t\t\tthis.rebuildLeftItems();\n\t\t\t\t}\n\t\t\t\tconst draftIndex = this.leftItems.findIndex((entry) => entry.kind === \"draft\");\n\t\t\t\tif (draftIndex >= 0) this.leftIndex = draftIndex;\n\t\t\t\tthis.resetRightStack();\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tconst pane = this.topPane();\n\t\t\t\tpane?.setFocused(this._focused);\n\t\t\t\tif (pane instanceof ModelFieldsPane && !this.draft.read().id) pane.startEditingId();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"deleteProvider\": {\n\t\t\t\tif (via === \"inspect\") {\n\t\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.host.isCurrentProvider()) {\n\t\t\t\t\tthis.host.notify(\n\t\t\t\t\t\t\"The current model's provider cannot be deleted; switch models with /model first.\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst builtin = isBuiltinProviderId(this.options.providerId);\n\t\t\t\tthis.host.confirm(\n\t\t\t\t\t`Delete provider \"${this.options.providerId}\" from models.json?` +\n\t\t\t\t\t\t(builtin ? \" The built-in catalog remains and its models may reappear.\" : \"\") +\n\t\t\t\t\t\t\" Stored credentials in auth.json are kept.\",\n\t\t\t\t\t\"Delete Provider\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.edits.removeProvider();\n\t\t\t\t\t\tthis.done(\"deleted\");\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate renderLeft(width: number): string[] {\n\t\tconst theme = this.theme;\n\t\tconst focused = this.focusPane === \"left\";\n\t\tconst rows: string[] = [];\n\t\tconst renderRow = (index: number): string => {\n\t\t\tconst item = this.leftItems[index]!;\n\t\t\tif (item.kind === \"separator\") {\n\t\t\t\treturn theme.fg(\"borderMuted\", ` ${\"─\".repeat(Math.max(1, width - 4))}`);\n\t\t\t}\n\t\t\treturn this.renderLeftItem(item, index === this.leftIndex, focused, width);\n\t\t};\n\t\tif (this.leftItems.length <= BODY_ROWS) {\n\t\t\tfor (let index = 0; index < this.leftItems.length; index++) rows.push(renderRow(index));\n\t\t} else {\n\t\t\t// One row carries the (n/N) position indicator, like the /model selector.\n\t\t\tconst slots = BODY_ROWS - 1;\n\t\t\tconst start = Math.max(0, Math.min(this.leftIndex - Math.floor(slots / 2), this.leftItems.length - slots));\n\t\t\tfor (let index = start; index < start + slots; index++) rows.push(renderRow(index));\n\t\t\tconst selectable: LeftItem[] = this.leftItems.filter((item) => item.kind !== \"separator\");\n\t\t\tconst position = selectable.indexOf(this.leftItems[this.leftIndex]!);\n\t\t\trows.push(theme.fg(\"dim\", ` (${position + 1}/${selectable.length})`));\n\t\t}\n\t\twhile (rows.length < BODY_ROWS) rows.push(\"\");\n\t\treturn rows;\n\t}\n\n\tprivate leftItemContent(item: LeftItem): { text: string; note?: string; dim: boolean } {\n\t\tconst store = this.options.store;\n\t\tlet text: string;\n\t\tlet note: string | undefined;\n\t\tswitch (item.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\ttext = \"API Auth\";\n\t\t\t\tbreak;\n\t\t\tcase \"fetch\":\n\t\t\t\ttext = \"Fetch Models\";\n\t\t\t\tnote = this.fetchStatus;\n\t\t\t\tbreak;\n\t\t\tcase \"model\": {\n\t\t\t\tconst model = store.getModel(this.options.providerId, item.modelId);\n\t\t\t\ttext = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"draft\": {\n\t\t\t\ttext = this.draft?.read().name ?? this.draft?.read().id ?? \"New Model\";\n\t\t\t\tnote = \"· draft\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"addModel\":\n\t\t\t\ttext = \"+ Add Model\";\n\t\t\t\tbreak;\n\t\t\tcase \"deleteProvider\":\n\t\t\t\ttext = \"Delete Provider\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttext = \"\";\n\t\t}\n\t\tconst dim = item.kind === \"draft\" && !this.draft?.read().name && !this.draft?.read().id;\n\t\treturn { text, note, dim };\n\t}\n\n\tprivate renderLeftItem(item: LeftItem, active: boolean, focused: boolean, width: number): string {\n\t\tconst theme = this.theme;\n\t\t// Single-accent focus rule: the marker and accent exist only in the\n\t\t// focused column; an unfocused column keeps its content plain.\n\t\tconst lit = active && focused;\n\t\tconst marker = lit ? theme.fg(\"accent\", `${CURSOR} `) : \" \";\n\t\tconst style = (text: string, dim = false) => theme.fg(lit ? \"accent\" : dim ? \"dim\" : \"text\", text);\n\t\tconst { text: label, note, dim } = this.leftItemContent(item);\n\t\tlet text = label;\n\t\t// Long model names keep head and tail (the distinctive parts) instead of a hard cut.\n\t\tif (item.kind === \"model\" || item.kind === \"draft\") {\n\t\t\tconst budget = Math.max(8, width - 2 - (note ? visibleWidth(note) + 1 : 0));\n\t\t\ttext = truncateMiddle(text, budget);\n\t\t}\n\t\tconst noteText = note ? theme.fg(\"dim\", ` ${note}`) : \"\";\n\t\treturn truncateToWidth(marker + style(text, dim) + noteText, width);\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Right column (pane stack)\n\t// ------------------------------------------------------------------\n\n\tprivate topPane(): EditorPane | undefined {\n\t\treturn this.stack[this.stack.length - 1];\n\t}\n\n\tprivate pushPane(pane: EditorPane): void {\n\t\tthis.topPane()?.setFocused(false);\n\t\tthis.focusPane = \"right\";\n\t\tthis.stack.push(pane);\n\t\tpane.setFocused(this._focused && this.focusPane === \"right\");\n\t\tthis.refresh();\n\t}\n\n\tprivate popPane(): void {\n\t\tif (this.stack.length <= 1) {\n\t\t\t// Esc on the base pane moves focus back to the left column.\n\t\t\tthis.topPane()?.setFocused(false);\n\t\t\tthis.focusPane = \"left\";\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst pane = this.stack.pop();\n\t\tpane?.setFocused(false);\n\t\tpane?.dispose?.();\n\t\tthis.topPane()?.setFocused(this._focused && this.focusPane === \"right\");\n\t\tthis.refresh();\n\t}\n\n\tprivate resetRightStack(): void {\n\t\tfor (const pane of this.stack) pane.dispose?.();\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tthis.stack = [this.createBasePane(item)];\n\t\tthis.topPane()?.setFocused(this._focused && this.focusPane === \"right\");\n\t}\n\n\tprivate createBasePane(item: LeftItem | undefined): EditorPane {\n\t\tswitch (item?.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\treturn new ApiAuthPane(this.host, this.options.registry);\n\t\t\tcase \"fetch\":\n\t\t\t\treturn new FetchModelsPane(this.host);\n\t\t\tcase \"model\":\n\t\t\t\treturn new ModelFieldsPane(this.host, this.persistedHandle(item.modelId));\n\t\t\tcase \"draft\":\n\t\t\t\treturn new ModelFieldsPane(this.host, this.draft!);\n\t\t\tcase \"addModel\":\n\t\t\t\treturn new InfoPane(\n\t\t\t\t\tthis.host,\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Press Enter to create a model.\",\n\t\t\t\t\t\t\"A draft is kept in memory until its id is set; Esc on the draft discards it.\",\n\t\t\t\t\t],\n\t\t\t\t\t() => this.activateLeftItem(\"activate\"),\n\t\t\t\t);\n\t\t\tcase \"deleteProvider\":\n\t\t\t\treturn new InfoPane(this.host, [\"Press Enter to delete this provider from models.json.\"], () =>\n\t\t\t\t\tthis.activateLeftItem(\"activate\"),\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn new InfoPane(this.host, []);\n\t\t}\n\t}\n\n\tprivate persistedHandle(modelId: string): ModelHandle {\n\t\treturn this.edits.model(modelId, (oldId, newId) => {\n\t\t\tconst selected = this.leftItems[this.leftIndex];\n\t\t\tif (selected?.kind === \"model\" && selected.modelId === oldId) selected.modelId = newId;\n\t\t\tthis.syncFromStore();\n\t\t});\n\t}\n\n\t// ------------------------------------------------------------------\n\t// EditorHost implementation\n\t// ------------------------------------------------------------------\n\n\tprivate createHost(): EditorHost {\n\t\tconst store = this.options.store;\n\t\tconst providerId = this.options.providerId;\n\t\treturn {\n\t\t\ttui: this.tui,\n\t\t\ttheme: this.theme,\n\t\t\tkeybindings: this.keybindings,\n\t\t\tstore,\n\t\t\tedits: this.edits,\n\t\t\tproviderId,\n\t\t\tpushPane: (pane) => this.pushPane(pane),\n\t\t\tpopPane: () => this.popPane(),\n\t\t\trefresh: () => this.refresh(),\n\t\t\tnotify: (message, type) => this.options.notify(message, type),\n\t\t\teffectiveApi: (model) => {\n\t\t\t\treturn effectiveModelSettings(providerId, store.getProvider(providerId), model).api;\n\t\t\t},\n\t\t\teffectiveBaseUrl: (model) => {\n\t\t\t\treturn effectiveModelSettings(providerId, store.getProvider(providerId), model).baseUrl;\n\t\t\t},\n\t\t\tcommitModelDraft: () => this.commitModelDraft(),\n\t\t\tdiscardModelDraft: () => this.discardModelDraft(),\n\t\t\tisCurrentModel: (modelId) =>\n\t\t\t\tthis.options.currentModel?.provider === providerId && this.options.currentModel.id === modelId,\n\t\t\tisCurrentProvider: () => this.options.currentModel?.provider === providerId,\n\t\t\tsetFetchStatus: (status) => {\n\t\t\t\tthis.fetchStatus = status;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\trunFetch: (signal) => fetchProviderModels(this.options, signal),\n\t\t\timportModels: async (models, signal) => {\n\t\t\t\tconst error = await importProviderModels({ ...this.options, edits: this.edits }, models, signal);\n\t\t\t\tif (!this.disposed) this.syncFromStore();\n\t\t\t\treturn error;\n\t\t\t},\n\t\t\tconfirm: (message, actionLabel, action) =>\n\t\t\t\tthis.pushPane(new ConfirmPane(this.host, message, actionLabel, action)),\n\t\t\tonModelRemoved: () => {\n\t\t\t\tthis.rebuildLeftItems();\n\t\t\t\t// Land on the next row where the model was; walk back over separators.\n\t\t\t\tthis.leftIndex = Math.min(this.leftIndex, this.leftItems.length - 1);\n\t\t\t\twhile (this.leftIndex > 0 && this.leftItems[this.leftIndex]?.kind === \"separator\") this.leftIndex--;\n\t\t\t\tif (this.leftItems[this.leftIndex]?.kind === \"separator\") this.leftIndex = this.selectableIndex(0);\n\t\t\t\tthis.focusPane = \"left\";\n\t\t\t\tthis.resetRightStack();\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Drop the in-memory draft: the selection returns to + Add Model with focus on the left. */\n\tprivate discardModelDraft(): void {\n\t\tif (!this.draft) return;\n\t\tthis.draft = undefined;\n\t\tthis.rebuildLeftItems();\n\t\tconst addIndex = this.leftItems.findIndex((item) => item.kind === \"addModel\");\n\t\tthis.leftIndex = addIndex >= 0 ? addIndex : this.selectableIndex(0);\n\t\tthis.focusPane = \"left\";\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t}\n\n\tprivate commitModelDraft(): string | undefined {\n\t\tconst draft = this.draft;\n\t\tif (!draft) return \"No model draft.\";\n\t\tconst error = this.edits.commitDraft(draft);\n\t\tif (error) return error;\n\t\tconst id = draft.read().id!.trim();\n\t\tthis.draft = undefined;\n\t\tthis.rebuildLeftItems();\n\t\tconst index = this.leftItems.findIndex((item) => item.kind === \"model\" && item.modelId === id);\n\t\tif (index >= 0) this.leftIndex = index;\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t\treturn undefined;\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Frame rendering\n\t// ------------------------------------------------------------------\n\n\tprivate refresh(): void {\n\t\tthis.invalidate();\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate renderFrame(width: number): string[] {\n\t\tconst theme = this.theme;\n\t\tconst border = new DynamicBorder((text) => theme.fg(\"border\", text)).render(width)[0]!;\n\t\tif (width < MIN_WIDTH) {\n\t\t\treturn [\n\t\t\t\tborder,\n\t\t\t\ttruncateToWidth(theme.fg(\"warning\", ` /provider needs at least ${MIN_WIDTH} columns`), width),\n\t\t\t\tborder,\n\t\t\t];\n\t\t}\n\t\tconst leftWidth = this.computeLeftWidth(width);\n\t\tconst rightWidth = width - leftWidth - 3;\n\t\tconst separator = theme.fg(\"border\", \" │ \");\n\n\t\tconst title = this.renderTitle(width);\n\t\t// The crumb marks drill-down depth only; base rows are already named by the left selection.\n\t\tconst crumb = truncateToWidth(this.theme.fg(\"muted\", this.topPane()?.crumb ?? \"\"), rightWidth);\n\t\tconst leftLines = this.renderLeft(leftWidth);\n\t\tconst pane = this.topPane();\n\t\tconst paneLines = pane ? windowLines(theme, pane.render(rightWidth), BODY_ROWS - 1, pane.scrollWindow?.()) : [];\n\t\tconst rightLines = [crumb, ...paneLines];\n\t\tconst body: string[] = [];\n\t\tfor (let row = 0; row < BODY_ROWS; row++) {\n\t\t\tconst left = padTo(truncateToWidth(leftLines[row] ?? \"\", leftWidth), leftWidth);\n\t\t\tconst right = truncateToWidth(rightLines[row] ?? \"\", rightWidth);\n\t\t\tbody.push(left + separator + right);\n\t\t}\n\n\t\tconst footerLines = this.renderFooter(width);\n\t\treturn [border, title, border, ...body, border, ...footerLines, border];\n\t}\n\n\t/** Content-driven left width: fits the longest visible label, clamped to 16–40 and 45% of the terminal. */\n\tprivate computeLeftWidth(width: number): number {\n\t\tlet longest = 12;\n\t\tfor (const item of this.leftItems) {\n\t\t\tif (item.kind === \"separator\") continue;\n\t\t\tconst { text, note } = this.leftItemContent(item);\n\t\t\tconst label = text + (note ? ` ${note}` : \"\");\n\t\t\tlongest = Math.max(longest, visibleWidth(label));\n\t\t}\n\t\tconst fit = Math.max(LEFT_WIDTH_MIN, Math.min(LEFT_WIDTH_MAX, longest + 2));\n\t\treturn Math.min(fit, Math.max(LEFT_WIDTH_MIN, Math.floor(width * 0.45)));\n\t}\n\n\tprivate renderTitle(width: number): string {\n\t\tconst theme = this.theme;\n\t\tlet title = ` /provider · ${this.options.providerId}`;\n\t\tif (isBuiltinProviderId(this.options.providerId)) title += \" · overlays built-in catalog\";\n\t\treturn truncateToWidth(theme.fg(\"accent\", theme.bold(title)), width);\n\t}\n\n\tprivate renderFooter(width: number): string[] {\n\t\tif (this.focusPane === \"right\") {\n\t\t\t// The editor owns the way-back hint so every pane's footer is consistent.\n\t\t\tconst hints = [this.topPane()?.hints() ?? \"\", keyHint(\"app.provider.switchPaneLeft\", \"focus left\")]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \");\n\t\t\treturn [truncateToWidth(hints, width)];\n\t\t}\n\t\tconst hints = [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", this.leftActivateLabel()),\n\t\t\tkeyHint(\"app.provider.switchPaneRight\", \"focus right\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t\treturn [truncateToWidth(hints, width)];\n\t}\n\n\t/** What Enter does to the selected left-column row, so the footer never lies about action rows. */\n\tprivate leftActivateLabel(): string {\n\t\tswitch (this.leftItems[this.leftIndex]?.kind) {\n\t\t\tcase \"fetch\":\n\t\t\t\treturn \"fetch\";\n\t\t\tcase \"addModel\":\n\t\t\t\treturn \"create\";\n\t\t\tcase \"deleteProvider\":\n\t\t\t\treturn \"delete\";\n\t\t\tdefault:\n\t\t\t\treturn \"open\";\n\t\t}\n\t}\n}\n\nfunction modelDisplayName(model: ModelsJsonModel): string {\n\treturn model.name ?? model.id;\n}\n"]}
@@ -10,13 +10,10 @@ import type { EditorHost, EditorPane } from "./pane.ts";
10
10
  import { type ScrollWindowInfo } from "./value-row.ts";
11
11
  export declare class FetchModelsPane implements EditorPane {
12
12
  private state;
13
- private controller;
14
13
  private search;
15
14
  private query;
16
15
  private index;
17
16
  private checked;
18
- private importing;
19
- private error;
20
17
  private focused;
21
18
  private disposed;
22
19
  private readonly host;
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-models.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/fetch-models.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAmC,KAAK,gBAAgB,EAA+B,MAAM,gBAAgB,CAAC;AA4BrH,qBAAa,eAAgB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;gBACtB,IAAI,EAAE,UAAU;IAS5B,qFAAqF;IACrF,KAAK,IAAI,IAAI;IAmCb,OAAO,CAAC,WAAW;IAInB,uFAAuF;IACvF,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,IAAI;IAWZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA2E/B,YAAY,IAAI,gBAAgB;IAShC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqC/B,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,WAAW;IAQnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAKf,KAAK,IAAI,MAAM;CAmBf"}
1
+ {"version":3,"file":"fetch-models.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/fetch-models.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAmC,KAAK,gBAAgB,EAA+B,MAAM,gBAAgB,CAAC;AAkCrH,qBAAa,eAAgB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;gBACtB,IAAI,EAAE,UAAU;IAS5B,qFAAqF;IACrF,KAAK,IAAI,IAAI;IA6Cb,OAAO,CAAC,WAAW;IAInB,uFAAuF;IACvF,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,IAAI;IAWZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6E/B,YAAY,IAAI,gBAAgB;IAShC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAsC/B,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,aAAa;IA+CrB,OAAO,CAAC,WAAW;IAOnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAKf,KAAK,IAAI,MAAM;CAoBf"}