@astralyn/pi 0.99.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/CHANGELOG.md +39 -3
  2. package/dist/bundle/chunks/anthropic-messages-CG2BSDQS.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +2 -2
  4. package/dist/bundle/chunks/{azure-openai-responses-RPBERDXD.js → azure-openai-responses-PBA4QKCM.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  6. package/dist/bundle/chunks/{chunk-ABVRAYXT.js → chunk-6UFFVA7M.js} +2 -2
  7. package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
  8. package/dist/bundle/chunks/{chunk-VW2P3X6P.js → chunk-HESRDUKO.js} +414 -666
  9. package/dist/bundle/chunks/{chunk-A576H74Y.js → chunk-PFZKRUMO.js} +1 -1
  10. package/dist/bundle/chunks/chunk-SGLYRVQL.js +2 -0
  11. package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
  12. package/dist/bundle/chunks/{chunk-DEWXBB6W.js → chunk-V66VGGOM.js} +1 -1
  13. package/dist/bundle/chunks/chunk-Z2RKSI3O.js +2 -0
  14. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-ZYSAFXXL.js → cloudflare-workers-ai-system-one-YB7XPPP4.js} +1 -1
  15. package/dist/bundle/chunks/codemode-worker.js +67 -8
  16. package/dist/bundle/chunks/github-copilot.js +1 -1
  17. package/dist/bundle/chunks/{google-generative-ai-SDNQVVXA.js → google-generative-ai-V5ZM5MCL.js} +1 -1
  18. package/dist/bundle/chunks/{google-vertex-LZXOLBIO.js → google-vertex-22THOFP5.js} +1 -1
  19. package/dist/bundle/chunks/{llama-cpp-classify-7IYGGPND.js → llama-cpp-classify-R7DQLTQN.js} +1 -1
  20. package/dist/bundle/chunks/{mistral-conversations-VYKPSSAM.js → mistral-conversations-WHSCJJWP.js} +1 -1
  21. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  22. package/dist/bundle/chunks/{openai-codex-responses-HZ4VUDXD.js → openai-codex-responses-N7GDPBPP.js} +1 -1
  23. package/dist/bundle/chunks/openai-codex.js +1 -1
  24. package/dist/bundle/chunks/{openai-completions-SKDGF6OE.js → openai-completions-RGGQK5UW.js} +1 -1
  25. package/dist/bundle/chunks/{openai-responses-FPML4SSG.js → openai-responses-3ZLD5JYI.js} +1 -1
  26. package/dist/bundle/chunks/{openrouter-images-5524IQHX.js → openrouter-images-YP3YVB54.js} +1 -1
  27. package/dist/bundle/chunks/openrouter.js +1 -1
  28. package/dist/bundle/chunks/radius.js +1 -1
  29. package/dist/bundle/chunks/{typesafe-system-one-Z2CDLKEY.js → typesafe-system-one-RREJAKWB.js} +1 -1
  30. package/dist/bundle/chunks/virtual-modules-4RQ2L6W4.js +2 -0
  31. package/dist/bundle/cli.js +1 -1
  32. package/dist/bundle/index.js +1 -1
  33. package/dist/bundle/rpc-entry.js +1 -1
  34. package/dist/cli/args.js +1 -1
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/config.d.ts +5 -8
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +16 -13
  39. package/dist/config.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +21 -1
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +64 -11
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/extensions/index.d.ts +1 -1
  45. package/dist/core/extensions/index.d.ts.map +1 -1
  46. package/dist/core/extensions/index.js.map +1 -1
  47. package/dist/core/extensions/loader.d.ts.map +1 -1
  48. package/dist/core/extensions/loader.js +13 -1
  49. package/dist/core/extensions/loader.js.map +1 -1
  50. package/dist/core/extensions/types.d.ts +6 -1
  51. package/dist/core/extensions/types.d.ts.map +1 -1
  52. package/dist/core/extensions/types.js.map +1 -1
  53. package/dist/core/keybindings.d.ts +51 -11
  54. package/dist/core/keybindings.d.ts.map +1 -1
  55. package/dist/core/keybindings.js +11 -3
  56. package/dist/core/keybindings.js.map +1 -1
  57. package/dist/core/mcp-servers.d.ts +34 -7
  58. package/dist/core/mcp-servers.d.ts.map +1 -1
  59. package/dist/core/mcp-servers.js +52 -11
  60. package/dist/core/mcp-servers.js.map +1 -1
  61. package/dist/core/model-registry.d.ts +3 -1
  62. package/dist/core/model-registry.d.ts.map +1 -1
  63. package/dist/core/model-registry.js +4 -0
  64. package/dist/core/model-registry.js.map +1 -1
  65. package/dist/core/model-runtime.d.ts +6 -0
  66. package/dist/core/model-runtime.d.ts.map +1 -1
  67. package/dist/core/model-runtime.js +22 -18
  68. package/dist/core/model-runtime.js.map +1 -1
  69. package/dist/core/radius.d.ts +2 -0
  70. package/dist/core/radius.d.ts.map +1 -1
  71. package/dist/core/radius.js +2 -0
  72. package/dist/core/radius.js.map +1 -1
  73. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  74. package/dist/core/remote-catalog-provider.js +4 -9
  75. package/dist/core/remote-catalog-provider.js.map +1 -1
  76. package/dist/core/sdk.d.ts.map +1 -1
  77. package/dist/core/sdk.js +1 -0
  78. package/dist/core/sdk.js.map +1 -1
  79. package/dist/core/settings-manager.d.ts +7 -5
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js +2 -1
  82. package/dist/core/settings-manager.js.map +1 -1
  83. package/dist/core/system-prompt.js +1 -1
  84. package/dist/core/system-prompt.js.map +1 -1
  85. package/dist/core/tasks/format.d.ts +7 -0
  86. package/dist/core/tasks/format.d.ts.map +1 -0
  87. package/dist/core/tasks/format.js +14 -0
  88. package/dist/core/tasks/format.js.map +1 -0
  89. package/dist/core/tasks/history.d.ts.map +1 -1
  90. package/dist/core/tasks/history.js +0 -19
  91. package/dist/core/tasks/history.js.map +1 -1
  92. package/dist/core/tasks/output.d.ts +8 -0
  93. package/dist/core/tasks/output.d.ts.map +1 -1
  94. package/dist/core/tasks/output.js +19 -0
  95. package/dist/core/tasks/output.js.map +1 -1
  96. package/dist/core/tasks/presentation.d.ts +1 -3
  97. package/dist/core/tasks/presentation.d.ts.map +1 -1
  98. package/dist/core/tasks/presentation.js +79 -166
  99. package/dist/core/tasks/presentation.js.map +1 -1
  100. package/dist/core/tasks/runtime.d.ts +16 -9
  101. package/dist/core/tasks/runtime.d.ts.map +1 -1
  102. package/dist/core/tasks/runtime.js +89 -106
  103. package/dist/core/tasks/runtime.js.map +1 -1
  104. package/dist/core/tasks/session.d.ts.map +1 -1
  105. package/dist/core/tasks/session.js +13 -4
  106. package/dist/core/tasks/session.js.map +1 -1
  107. package/dist/core/tasks/store.d.ts +20 -6
  108. package/dist/core/tasks/store.d.ts.map +1 -1
  109. package/dist/core/tasks/store.js +45 -18
  110. package/dist/core/tasks/store.js.map +1 -1
  111. package/dist/core/tasks/types.d.ts +14 -54
  112. package/dist/core/tasks/types.d.ts.map +1 -1
  113. package/dist/core/tasks/types.js +1 -5
  114. package/dist/core/tasks/types.js.map +1 -1
  115. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  116. package/dist/core/tools/renderers/bash.js +11 -34
  117. package/dist/core/tools/renderers/bash.js.map +1 -1
  118. package/dist/core/tools/shell-execution.d.ts +0 -1
  119. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  120. package/dist/core/tools/shell-execution.js +3 -10
  121. package/dist/core/tools/shell-execution.js.map +1 -1
  122. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  123. package/dist/core/tools/shell-tool.js +2 -4
  124. package/dist/core/tools/shell-tool.js.map +1 -1
  125. package/dist/core/tools/tasks/actions.d.ts +1 -1
  126. package/dist/core/tools/tasks/actions.d.ts.map +1 -1
  127. package/dist/core/tools/tasks/actions.js +26 -12
  128. package/dist/core/tools/tasks/actions.js.map +1 -1
  129. package/dist/core/tools/tasks/constants.d.ts +2 -6
  130. package/dist/core/tools/tasks/constants.d.ts.map +1 -1
  131. package/dist/core/tools/tasks/constants.js +2 -6
  132. package/dist/core/tools/tasks/constants.js.map +1 -1
  133. package/dist/core/tools/tasks/schema.d.ts +1 -1
  134. package/dist/core/tools/tasks/schema.d.ts.map +1 -1
  135. package/dist/core/tools/tasks/schema.js +8 -7
  136. package/dist/core/tools/tasks/schema.js.map +1 -1
  137. package/dist/core/tools/tasks/types.d.ts +8 -38
  138. package/dist/core/tools/tasks/types.d.ts.map +1 -1
  139. package/dist/core/tools/tasks/types.js +6 -11
  140. package/dist/core/tools/tasks/types.js.map +1 -1
  141. package/dist/core/virtual-models.d.ts +2 -0
  142. package/dist/core/virtual-models.d.ts.map +1 -1
  143. package/dist/core/virtual-models.js +19 -12
  144. package/dist/core/virtual-models.js.map +1 -1
  145. package/dist/extensions/btw/agent.d.ts +17 -8
  146. package/dist/extensions/btw/agent.d.ts.map +1 -1
  147. package/dist/extensions/btw/agent.js +74 -76
  148. package/dist/extensions/btw/agent.js.map +1 -1
  149. package/dist/extensions/btw/controller.d.ts +0 -1
  150. package/dist/extensions/btw/controller.d.ts.map +1 -1
  151. package/dist/extensions/btw/controller.js +26 -33
  152. package/dist/extensions/btw/controller.js.map +1 -1
  153. package/dist/extensions/btw/panel.d.ts +13 -14
  154. package/dist/extensions/btw/panel.d.ts.map +1 -1
  155. package/dist/extensions/btw/panel.js +38 -29
  156. package/dist/extensions/btw/panel.js.map +1 -1
  157. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  158. package/dist/extensions/codemode/execute.js +197 -51
  159. package/dist/extensions/codemode/execute.js.map +1 -1
  160. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  161. package/dist/extensions/codemode/renderer.js +43 -25
  162. package/dist/extensions/codemode/renderer.js.map +1 -1
  163. package/dist/extensions/codemode/tool.d.ts +12 -11
  164. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  165. package/dist/extensions/codemode/tool.js +73 -129
  166. package/dist/extensions/codemode/tool.js.map +1 -1
  167. package/dist/extensions/codemode/worker.d.ts +1 -1
  168. package/dist/extensions/codemode/worker.js +1 -1
  169. package/dist/extensions/codemode/worker.js.map +1 -1
  170. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  171. package/dist/extensions/index.d.ts.map +1 -1
  172. package/dist/extensions/index.js +0 -2
  173. package/dist/extensions/index.js.map +1 -1
  174. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  175. package/dist/extensions/mcp/cli.js +20 -5
  176. package/dist/extensions/mcp/cli.js.map +1 -1
  177. package/dist/extensions/mcp/config.d.ts +4 -2
  178. package/dist/extensions/mcp/config.d.ts.map +1 -1
  179. package/dist/extensions/mcp/config.js +14 -2
  180. package/dist/extensions/mcp/config.js.map +1 -1
  181. package/dist/extensions/mcp/index.d.ts +32 -8
  182. package/dist/extensions/mcp/index.d.ts.map +1 -1
  183. package/dist/extensions/mcp/index.js +235 -61
  184. package/dist/extensions/mcp/index.js.map +1 -1
  185. package/dist/extensions/mcp/oauth.d.ts +10 -7
  186. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  187. package/dist/extensions/mcp/oauth.js +56 -31
  188. package/dist/extensions/mcp/oauth.js.map +1 -1
  189. package/dist/extensions/mcp/runtime.d.ts +2 -0
  190. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  191. package/dist/extensions/mcp/runtime.js +16 -9
  192. package/dist/extensions/mcp/runtime.js.map +1 -1
  193. package/dist/extensions/mcp/tools.d.ts +5 -4
  194. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  195. package/dist/extensions/mcp/tools.js +33 -15
  196. package/dist/extensions/mcp/tools.js.map +1 -1
  197. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  198. package/dist/extensions/mcp/ui.js +4 -2
  199. package/dist/extensions/mcp/ui.js.map +1 -1
  200. package/dist/extensions/provider/catalog.d.ts +8 -1
  201. package/dist/extensions/provider/catalog.d.ts.map +1 -1
  202. package/dist/extensions/provider/catalog.js +31 -0
  203. package/dist/extensions/provider/catalog.js.map +1 -1
  204. package/dist/extensions/provider/connection.d.ts +4 -1
  205. package/dist/extensions/provider/connection.d.ts.map +1 -1
  206. package/dist/extensions/provider/connection.js +1 -5
  207. package/dist/extensions/provider/connection.js.map +1 -1
  208. package/dist/extensions/provider/editing.d.ts +36 -0
  209. package/dist/extensions/provider/editing.d.ts.map +1 -0
  210. package/dist/extensions/provider/editing.js +99 -0
  211. package/dist/extensions/provider/editing.js.map +1 -0
  212. package/dist/extensions/provider/json-fields.d.ts +5 -0
  213. package/dist/extensions/provider/json-fields.d.ts.map +1 -0
  214. package/dist/extensions/provider/json-fields.js +31 -0
  215. package/dist/extensions/provider/json-fields.js.map +1 -0
  216. package/dist/extensions/provider/store.d.ts +1 -4
  217. package/dist/extensions/provider/store.d.ts.map +1 -1
  218. package/dist/extensions/provider/store.js +2 -30
  219. package/dist/extensions/provider/store.js.map +1 -1
  220. package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
  221. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  222. package/dist/extensions/provider/ui/builtin-data.js +14 -79
  223. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  224. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  225. package/dist/extensions/provider/ui/compat.js +6 -9
  226. package/dist/extensions/provider/ui/compat.js.map +1 -1
  227. package/dist/extensions/provider/ui/controls.d.ts +48 -0
  228. package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
  229. package/dist/extensions/provider/ui/controls.js +108 -0
  230. package/dist/extensions/provider/ui/controls.js.map +1 -0
  231. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  232. package/dist/extensions/provider/ui/dictionary.js +6 -9
  233. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  234. package/dist/extensions/provider/ui/editor.d.ts +3 -3
  235. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  236. package/dist/extensions/provider/ui/editor.js +35 -140
  237. package/dist/extensions/provider/ui/editor.js.map +1 -1
  238. package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
  239. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  240. package/dist/extensions/provider/ui/fetch-models.js +49 -44
  241. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  242. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  243. package/dist/extensions/provider/ui/model-fields.js +11 -14
  244. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  245. package/dist/extensions/provider/ui/model-options.d.ts +4 -34
  246. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  247. package/dist/extensions/provider/ui/model-options.js +90 -271
  248. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  249. package/dist/extensions/provider/ui/pane.d.ts +4 -18
  250. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  251. package/dist/extensions/provider/ui/pane.js.map +1 -1
  252. package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
  253. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  254. package/dist/extensions/provider/ui/provider-fields.js +58 -171
  255. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  256. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  257. package/dist/extensions/provider/ui/thinking-map.js +6 -9
  258. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  259. package/dist/extensions/question/detail-pane.d.ts +7 -2
  260. package/dist/extensions/question/detail-pane.d.ts.map +1 -1
  261. package/dist/extensions/question/detail-pane.js +16 -5
  262. package/dist/extensions/question/detail-pane.js.map +1 -1
  263. package/dist/extensions/question/dialog-view.d.ts +41 -0
  264. package/dist/extensions/question/dialog-view.d.ts.map +1 -0
  265. package/dist/extensions/question/dialog-view.js +329 -0
  266. package/dist/extensions/question/dialog-view.js.map +1 -0
  267. package/dist/extensions/question/dialog.d.ts +3 -3
  268. package/dist/extensions/question/dialog.d.ts.map +1 -1
  269. package/dist/extensions/question/dialog.js +220 -634
  270. package/dist/extensions/question/dialog.js.map +1 -1
  271. package/dist/extensions/question/index.d.ts.map +1 -1
  272. package/dist/extensions/question/index.js +2 -3
  273. package/dist/extensions/question/index.js.map +1 -1
  274. package/dist/extensions/question/render.d.ts.map +1 -1
  275. package/dist/extensions/question/render.js +22 -32
  276. package/dist/extensions/question/render.js.map +1 -1
  277. package/dist/extensions/question/results.d.ts.map +1 -1
  278. package/dist/extensions/question/results.js +56 -12
  279. package/dist/extensions/question/results.js.map +1 -1
  280. package/dist/extensions/question/schema.d.ts +21 -6
  281. package/dist/extensions/question/schema.d.ts.map +1 -1
  282. package/dist/extensions/question/schema.js.map +1 -1
  283. package/dist/extensions/question/state.d.ts +9 -7
  284. package/dist/extensions/question/state.d.ts.map +1 -1
  285. package/dist/extensions/question/state.js +63 -54
  286. package/dist/extensions/question/state.js.map +1 -1
  287. package/dist/extensions/question/types.d.ts +41 -18
  288. package/dist/extensions/question/types.d.ts.map +1 -1
  289. package/dist/extensions/question/types.js.map +1 -1
  290. package/dist/extensions/statusline/index.d.ts +4 -0
  291. package/dist/extensions/statusline/index.d.ts.map +1 -1
  292. package/dist/extensions/statusline/index.js +18 -355
  293. package/dist/extensions/statusline/index.js.map +1 -1
  294. package/dist/extensions/statusline/render.d.ts +19 -0
  295. package/dist/extensions/statusline/render.d.ts.map +1 -0
  296. package/dist/extensions/statusline/render.js +163 -0
  297. package/dist/extensions/statusline/render.js.map +1 -0
  298. package/dist/extensions/statusline/usage.d.ts +12 -0
  299. package/dist/extensions/statusline/usage.d.ts.map +1 -0
  300. package/dist/extensions/statusline/usage.js +36 -0
  301. package/dist/extensions/statusline/usage.js.map +1 -0
  302. package/dist/extensions/tool-search/tool.d.ts +5 -4
  303. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  304. package/dist/extensions/tool-search/tool.js +7 -28
  305. package/dist/extensions/tool-search/tool.js.map +1 -1
  306. package/dist/extensions/web-search/execute.d.ts +1 -5
  307. package/dist/extensions/web-search/execute.d.ts.map +1 -1
  308. package/dist/extensions/web-search/execute.js +4 -9
  309. package/dist/extensions/web-search/execute.js.map +1 -1
  310. package/dist/extensions/web-search/format.d.ts +12 -3
  311. package/dist/extensions/web-search/format.d.ts.map +1 -1
  312. package/dist/extensions/web-search/format.js +33 -25
  313. package/dist/extensions/web-search/format.js.map +1 -1
  314. package/dist/extensions/web-search/index.d.ts.map +1 -1
  315. package/dist/extensions/web-search/index.js +6 -29
  316. package/dist/extensions/web-search/index.js.map +1 -1
  317. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
  318. package/dist/extensions/web-search/providers/deepseek.js +0 -1
  319. package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
  320. package/dist/extensions/web-search/providers/http.d.ts +1 -1
  321. package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
  322. package/dist/extensions/web-search/providers/http.js.map +1 -1
  323. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
  324. package/dist/extensions/web-search/providers/minimax.js +0 -1
  325. package/dist/extensions/web-search/providers/minimax.js.map +1 -1
  326. package/dist/extensions/web-search/render.d.ts +7 -2
  327. package/dist/extensions/web-search/render.d.ts.map +1 -1
  328. package/dist/extensions/web-search/render.js +32 -4
  329. package/dist/extensions/web-search/render.js.map +1 -1
  330. package/dist/extensions/web-search/results.d.ts.map +1 -1
  331. package/dist/extensions/web-search/results.js +3 -8
  332. package/dist/extensions/web-search/results.js.map +1 -1
  333. package/dist/extensions/web-search/types.d.ts +4 -2
  334. package/dist/extensions/web-search/types.d.ts.map +1 -1
  335. package/dist/extensions/web-search/types.js.map +1 -1
  336. package/dist/index.d.ts +2 -4
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +0 -1
  339. package/dist/index.js.map +1 -1
  340. package/dist/main.d.ts.map +1 -1
  341. package/dist/main.js +6 -0
  342. package/dist/main.js.map +1 -1
  343. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  344. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  345. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  346. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  347. package/dist/modes/interactive/components/pi-logo-animation.d.ts +68 -0
  348. package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +1 -0
  349. package/dist/modes/interactive/components/pi-logo-animation.js +1076 -0
  350. package/dist/modes/interactive/components/pi-logo-animation.js.map +1 -0
  351. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +7 -0
  352. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +1 -0
  353. package/dist/modes/interactive/components/pi-logo-animation.lazy.js +12 -0
  354. package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +1 -0
  355. package/dist/modes/interactive/components/pi-logo.d.ts +7 -0
  356. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -1
  357. package/dist/modes/interactive/components/pi-logo.js +13 -1
  358. package/dist/modes/interactive/components/pi-logo.js.map +1 -1
  359. package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
  360. package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
  361. package/dist/modes/interactive/components/radius-login-selector.js +83 -0
  362. package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
  363. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  364. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/settings-selector.js +5 -5
  366. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  367. package/dist/modes/interactive/components/status-marker.d.ts +0 -2
  368. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  369. package/dist/modes/interactive/components/status-marker.js +0 -4
  370. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  371. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  372. package/dist/modes/interactive/components/user-message.js +5 -4
  373. package/dist/modes/interactive/components/user-message.js.map +1 -1
  374. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  375. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/visual-truncate.js +36 -6
  377. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  378. package/dist/modes/interactive/interactive-mode.d.ts +10 -0
  379. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  380. package/dist/modes/interactive/interactive-mode.js +167 -40
  381. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  382. package/dist/modes/interactive/tasks/completion-render.d.ts +1 -1
  383. package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -1
  384. package/dist/modes/interactive/tasks/completion-render.js +28 -82
  385. package/dist/modes/interactive/tasks/completion-render.js.map +1 -1
  386. package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
  387. package/dist/modes/interactive/tasks/index.js +18 -13
  388. package/dist/modes/interactive/tasks/index.js.map +1 -1
  389. package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
  390. package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
  391. package/dist/modes/interactive/tasks/inspector.js +93 -0
  392. package/dist/modes/interactive/tasks/inspector.js.map +1 -0
  393. package/dist/modes/interactive/tasks/layout.d.ts +40 -0
  394. package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
  395. package/dist/modes/interactive/tasks/layout.js +212 -0
  396. package/dist/modes/interactive/tasks/layout.js.map +1 -0
  397. package/dist/modes/interactive/tasks/list.d.ts +21 -0
  398. package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
  399. package/dist/modes/interactive/tasks/list.js +96 -0
  400. package/dist/modes/interactive/tasks/list.js.map +1 -0
  401. package/dist/modes/interactive/tasks/manager.d.ts +29 -36
  402. package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
  403. package/dist/modes/interactive/tasks/manager.js +315 -315
  404. package/dist/modes/interactive/tasks/manager.js.map +1 -1
  405. package/dist/modes/interactive/tasks/model.d.ts +21 -0
  406. package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
  407. package/dist/modes/interactive/tasks/model.js +41 -0
  408. package/dist/modes/interactive/tasks/model.js.map +1 -0
  409. package/dist/modes/interactive/tasks/render.d.ts +5 -19
  410. package/dist/modes/interactive/tasks/render.d.ts.map +1 -1
  411. package/dist/modes/interactive/tasks/render.js +18 -102
  412. package/dist/modes/interactive/tasks/render.js.map +1 -1
  413. package/dist/modes/interactive/tasks/task-view.d.ts +8 -48
  414. package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -1
  415. package/dist/modes/interactive/tasks/task-view.js +11 -51
  416. package/dist/modes/interactive/tasks/task-view.js.map +1 -1
  417. package/dist/modes/interactive/tasks/text.d.ts +1 -7
  418. package/dist/modes/interactive/tasks/text.d.ts.map +1 -1
  419. package/dist/modes/interactive/tasks/text.js +6 -29
  420. package/dist/modes/interactive/tasks/text.js.map +1 -1
  421. package/dist/modes/interactive/tasks/viewport.d.ts +2 -0
  422. package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -1
  423. package/dist/modes/interactive/tasks/viewport.js +17 -7
  424. package/dist/modes/interactive/tasks/viewport.js.map +1 -1
  425. package/dist/modes/interactive/tasks/views.d.ts +9 -0
  426. package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
  427. package/dist/modes/interactive/tasks/views.js +42 -0
  428. package/dist/modes/interactive/tasks/views.js.map +1 -0
  429. package/dist/modes/interactive/theme/system-theme.d.ts +2 -1
  430. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
  431. package/dist/modes/interactive/theme/system-theme.js +16 -5
  432. package/dist/modes/interactive/theme/system-theme.js.map +1 -1
  433. package/docs/bundled/README.md +0 -1
  434. package/docs/bundled/extensions/question.md +2 -2
  435. package/docs/bundled/extensions/statusline.md +24 -15
  436. package/docs/bundled/tasks.md +34 -48
  437. package/docs/codemode.md +207 -0
  438. package/docs/docs.json +4 -4
  439. package/docs/environment-variables.md +1 -1
  440. package/docs/extensions.md +7 -9
  441. package/docs/keybindings.md +13 -6
  442. package/docs/mcp.md +142 -82
  443. package/docs/models.md +21 -0
  444. package/docs/providers.md +8 -0
  445. package/docs/sdk.md +2 -2
  446. package/docs/session-format.md +12 -22
  447. package/docs/settings.md +4 -2
  448. package/docs/tui.md +1 -1
  449. package/docs/usage.md +6 -16
  450. package/examples/README.md +1 -1
  451. package/examples/extensions/README.md +1 -2
  452. package/examples/extensions/built-in-tool-renderer.ts +16 -40
  453. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  454. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  455. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  456. package/examples/extensions/gondolin/package-lock.json +2 -2
  457. package/examples/extensions/gondolin/package.json +1 -1
  458. package/examples/extensions/minimal-mode.ts +24 -96
  459. package/examples/extensions/sandbox/package-lock.json +2 -2
  460. package/examples/extensions/sandbox/package.json +1 -1
  461. package/examples/extensions/with-deps/package-lock.json +2 -2
  462. package/examples/extensions/with-deps/package.json +1 -1
  463. package/examples/sdk/14-codemode-mcp.ts +2 -2
  464. package/npm-shrinkwrap.json +69 -58
  465. package/package.json +11 -10
  466. package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +0 -6
  467. package/dist/bundle/chunks/chunk-CLLDCO64.js +0 -2
  468. package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
  469. package/dist/bundle/chunks/chunk-VWCWZD6E.js +0 -2
  470. package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +0 -2
  471. package/dist/core/tasks/view-data.d.ts +0 -8
  472. package/dist/core/tasks/view-data.d.ts.map +0 -1
  473. package/dist/core/tasks/view-data.js +0 -61
  474. package/dist/core/tasks/view-data.js.map +0 -1
  475. package/dist/core/tasks/view.d.ts +0 -30
  476. package/dist/core/tasks/view.d.ts.map +0 -1
  477. package/dist/core/tasks/view.js +0 -50
  478. package/dist/core/tasks/view.js.map +0 -1
  479. package/dist/core/tools/renderers/shell-task.d.ts +0 -4
  480. package/dist/core/tools/renderers/shell-task.d.ts.map +0 -1
  481. package/dist/core/tools/renderers/shell-task.js +0 -35
  482. package/dist/core/tools/renderers/shell-task.js.map +0 -1
  483. package/dist/extensions/todo/constants.d.ts +0 -16
  484. package/dist/extensions/todo/constants.d.ts.map +0 -1
  485. package/dist/extensions/todo/constants.js +0 -30
  486. package/dist/extensions/todo/constants.js.map +0 -1
  487. package/dist/extensions/todo/index.d.ts +0 -3
  488. package/dist/extensions/todo/index.d.ts.map +0 -1
  489. package/dist/extensions/todo/index.js +0 -98
  490. package/dist/extensions/todo/index.js.map +0 -1
  491. package/dist/extensions/todo/schema.d.ts +0 -60
  492. package/dist/extensions/todo/schema.d.ts.map +0 -1
  493. package/dist/extensions/todo/schema.js +0 -56
  494. package/dist/extensions/todo/schema.js.map +0 -1
  495. package/dist/extensions/todo/state.d.ts +0 -34
  496. package/dist/extensions/todo/state.d.ts.map +0 -1
  497. package/dist/extensions/todo/state.js +0 -425
  498. package/dist/extensions/todo/state.js.map +0 -1
  499. package/dist/extensions/todo/view.d.ts +0 -36
  500. package/dist/extensions/todo/view.d.ts.map +0 -1
  501. package/dist/extensions/todo/view.js +0 -580
  502. package/dist/extensions/todo/view.js.map +0 -1
  503. package/dist/extensions/todo/widget.d.ts +0 -15
  504. package/dist/extensions/todo/widget.d.ts.map +0 -1
  505. package/dist/extensions/todo/widget.js +0 -50
  506. package/dist/extensions/todo/widget.js.map +0 -1
  507. package/dist/modes/interactive/tasks/fallback-view.d.ts +0 -4
  508. package/dist/modes/interactive/tasks/fallback-view.d.ts.map +0 -1
  509. package/dist/modes/interactive/tasks/fallback-view.js +0 -27
  510. package/dist/modes/interactive/tasks/fallback-view.js.map +0 -1
  511. package/docs/bundled/extensions/todo.md +0 -104
  512. package/examples/extensions/todo.ts +0 -297
@@ -9,6 +9,7 @@ import "../keybindings.js";
9
9
  import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybinding-hints.js";
10
10
  import { truncate } from "../constants.js";
11
11
  import { modelCatalogUrl } from "../probe.js";
12
+ import { moveSelection } from "./controls.js";
12
13
  import { renderInfoLine, renderPlainLine, truncateMiddle, ValueEditor } from "./value-row.js";
13
14
  /** Compact token count for the row note, e.g. `1.0M`; the thresholds match the footer's usage stats. */
14
15
  function formatTokens(count) {
@@ -38,7 +39,6 @@ export class FetchModelsPane {
38
39
  this.query = "";
39
40
  this.index = 0;
40
41
  this.checked = new Set();
41
- this.importing = false;
42
42
  this.focused = false;
43
43
  this.disposed = false;
44
44
  this.host = host;
@@ -49,19 +49,20 @@ export class FetchModelsPane {
49
49
  }
50
50
  /** Enter pressed on the left-column row (or on the idle pane): start the request. */
51
51
  start() {
52
- if (this.disposed || this.state.type === "loading" || this.importing)
52
+ if (this.disposed || this.state.type === "loading" || this.state.type === "importing")
53
53
  return;
54
54
  if (!this.catalogUrl())
55
55
  return; // the idle pane explains what to configure first
56
56
  const controller = new AbortController();
57
- this.controller = controller;
58
- this.state = { type: "loading" };
59
- this.error = undefined;
57
+ this.state = { type: "loading", controller };
60
58
  this.host.refresh();
61
59
  void this.host
62
60
  .runFetch(controller.signal)
63
61
  .then((result) => {
64
- if (this.disposed || controller.signal.aborted || this.controller !== controller)
62
+ if (this.disposed ||
63
+ controller.signal.aborted ||
64
+ this.state.type !== "loading" ||
65
+ this.state.controller !== controller)
65
66
  return;
66
67
  if (!result.ok) {
67
68
  if (result.error === "Cancelled.")
@@ -70,7 +71,7 @@ export class FetchModelsPane {
70
71
  this.host.setFetchStatus("· failed");
71
72
  }
72
73
  else {
73
- this.state = { type: "results", models: result.models, truncated: result.truncated };
74
+ this.state = { type: "results", catalog: result };
74
75
  this.checked = new Set();
75
76
  this.query = "";
76
77
  this.search.reset("");
@@ -81,7 +82,10 @@ export class FetchModelsPane {
81
82
  this.host.refresh();
82
83
  })
83
84
  .catch((error) => {
84
- if (controller.signal.aborted)
85
+ if (this.disposed ||
86
+ controller.signal.aborted ||
87
+ this.state.type !== "loading" ||
88
+ this.state.controller !== controller)
85
89
  return;
86
90
  this.state = { type: "error", message: error instanceof Error ? error.message : String(error) };
87
91
  this.host.setFetchStatus("· failed");
@@ -102,10 +106,10 @@ export class FetchModelsPane {
102
106
  }
103
107
  }
104
108
  rows() {
105
- if (this.state.type !== "results")
109
+ if (this.state.type !== "results" && this.state.type !== "importing")
106
110
  return [];
107
111
  const existing = this.existingIds();
108
- const rows = this.state.models.map((model) => ({ model, added: existing.has(model.id) }));
112
+ const rows = this.state.catalog.models.map((model) => ({ model, added: existing.has(model.id) }));
109
113
  const query = this.query.trim().toLowerCase();
110
114
  if (!query)
111
115
  return rows;
@@ -137,9 +141,10 @@ export class FetchModelsPane {
137
141
  theme.fg("error", truncate(this.state.message, Math.max(10, width - 2))),
138
142
  renderInfoLine(theme, "Enter retries; Esc goes back.", width),
139
143
  ];
144
+ case "importing":
140
145
  case "results": {
141
146
  const lines = [];
142
- if (this.state.truncated) {
147
+ if (this.state.catalog.truncated) {
143
148
  lines.push(renderInfoLine(theme, "The catalog was truncated; refine manually if a model is missing.", width));
144
149
  }
145
150
  lines.push(this.search.renderLine(width));
@@ -168,21 +173,21 @@ export class FetchModelsPane {
168
173
  lines.push(renderInfoLine(theme, "No matching models.", width));
169
174
  const addedCount = rows.filter((row) => row.added).length;
170
175
  lines.push(renderInfoLine(theme, `${this.checked.size} selected · ${rows.length} shown${addedCount ? ` · ${addedCount} already added` : ""}`, width));
171
- if (this.importing)
176
+ if (this.state.type === "importing")
172
177
  lines.push(renderInfoLine(theme, "Importing…", width));
173
- if (this.error)
174
- lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
178
+ if (this.state.type === "results" && this.state.error)
179
+ lines.push(theme.fg("error", truncate(this.state.error, Math.max(10, width - 2))));
175
180
  return lines;
176
181
  }
177
182
  }
178
183
  }
179
184
  scrollWindow() {
180
- if (this.state.type !== "results")
185
+ if (this.state.type !== "results" && this.state.type !== "importing")
181
186
  return {};
182
187
  // The truncation notice and the filter input pin above the checklist;
183
188
  // the selection summary (and import progress/error) pin below.
184
- const top = (this.state.truncated ? 1 : 0) + 1;
185
- const bottom = 1 + (this.importing ? 1 : 0) + (this.error ? 1 : 0);
189
+ const top = (this.state.catalog.truncated ? 1 : 0) + 1;
190
+ const bottom = 1 + (this.state.type === "importing" || this.state.error ? 1 : 0);
186
191
  return { top, bottom, cursor: top + this.index };
187
192
  }
188
193
  handleInput(data) {
@@ -200,7 +205,7 @@ export class FetchModelsPane {
200
205
  return;
201
206
  case "loading":
202
207
  if (kb.matches(data, "tui.select.cancel")) {
203
- this.controller?.abort();
208
+ this.state.controller.abort();
204
209
  this.state = { type: "idle" };
205
210
  this.host.refresh();
206
211
  return;
@@ -216,6 +221,7 @@ export class FetchModelsPane {
216
221
  return;
217
222
  }
218
223
  return;
224
+ case "importing":
219
225
  case "results":
220
226
  this.handleResultsInput(data);
221
227
  return;
@@ -224,21 +230,15 @@ export class FetchModelsPane {
224
230
  handleResultsInput(data) {
225
231
  const kb = this.host.keybindings;
226
232
  const rows = this.rows();
227
- if (kb.matches(data, "tui.select.up")) {
228
- if (rows.length > 0)
229
- this.index = this.index === 0 ? rows.length - 1 : this.index - 1;
230
- this.host.refresh();
231
- return;
232
- }
233
- if (kb.matches(data, "tui.select.down")) {
234
- if (rows.length > 0)
235
- this.index = (this.index + 1) % rows.length;
233
+ const next = moveSelection(kb, data, this.index, rows.length);
234
+ if (next !== undefined) {
235
+ this.index = next;
236
236
  this.host.refresh();
237
237
  return;
238
238
  }
239
239
  if (kb.matches(data, "app.list.toggle")) {
240
240
  const row = rows[this.index];
241
- if (!row || row.added || this.importing)
241
+ if (!row || row.added || this.state.type === "importing")
242
242
  return;
243
243
  if (this.checked.has(row.model.id))
244
244
  this.checked.delete(row.model.id);
@@ -263,7 +263,7 @@ export class FetchModelsPane {
263
263
  this.host.refresh();
264
264
  }
265
265
  importChecked() {
266
- if (this.state.type !== "results" || this.importing)
266
+ if (this.state.type !== "results")
267
267
  return;
268
268
  // Nothing checked: import the highlighted row, like a fuzzy picker. Only Esc discards.
269
269
  let chosen;
@@ -274,21 +274,22 @@ export class FetchModelsPane {
274
274
  chosen = [row.model];
275
275
  }
276
276
  else {
277
- chosen = this.state.models.filter((model) => this.checked.has(model.id));
277
+ chosen = this.state.catalog.models.filter((model) => this.checked.has(model.id));
278
278
  }
279
279
  const controller = new AbortController();
280
- this.controller = controller;
281
- this.importing = true;
282
- this.error = undefined;
280
+ const catalog = this.state.catalog;
281
+ this.state = { type: "importing", catalog, controller };
283
282
  this.host.refresh();
284
283
  void this.host
285
284
  .importModels(chosen, controller.signal)
286
285
  .then((error) => {
287
- if (this.disposed || controller.signal.aborted || this.controller !== controller)
286
+ if (this.disposed ||
287
+ controller.signal.aborted ||
288
+ this.state.type !== "importing" ||
289
+ this.state.controller !== controller)
288
290
  return;
289
- this.importing = false;
290
291
  if (error) {
291
- this.error = error;
292
+ this.state = { type: "results", catalog, error };
292
293
  this.host.setFetchStatus("· import failed");
293
294
  return this.host.refresh();
294
295
  }
@@ -297,35 +298,39 @@ export class FetchModelsPane {
297
298
  this.host.popPane(); // back to the left column with the new models visible
298
299
  })
299
300
  .catch((error) => {
300
- if (this.disposed || controller.signal.aborted || this.controller !== controller)
301
+ if (this.disposed ||
302
+ controller.signal.aborted ||
303
+ this.state.type !== "importing" ||
304
+ this.state.controller !== controller)
301
305
  return;
302
- this.importing = false;
303
- this.error = error instanceof Error ? error.message : String(error);
306
+ this.state = { type: "results", catalog, error: error instanceof Error ? error.message : String(error) };
304
307
  this.host.refresh();
305
308
  });
306
309
  }
307
310
  exitResults() {
308
- this.controller?.abort();
309
- this.importing = false;
311
+ if (this.state.type === "loading" || this.state.type === "importing")
312
+ this.state.controller.abort();
310
313
  this.state = { type: "idle" };
311
314
  this.checked = new Set();
312
315
  this.host.popPane();
313
316
  }
314
317
  setFocused(focused) {
315
318
  this.focused = focused;
316
- this.search.focused = focused && this.state.type === "results";
319
+ this.search.focused = focused && (this.state.type === "results" || this.state.type === "importing");
317
320
  }
318
321
  isEditing() {
319
- return this.state.type === "results"; // the filter input owns ←/→
322
+ return this.state.type === "results" || this.state.type === "importing"; // the filter input owns ←/→
320
323
  }
321
324
  dispose() {
322
325
  this.disposed = true;
323
- this.controller?.abort();
326
+ if (this.state.type === "loading" || this.state.type === "importing")
327
+ this.state.controller.abort();
324
328
  }
325
329
  hints() {
326
330
  switch (this.state.type) {
327
331
  case "loading":
328
332
  return keyHint("tui.select.cancel", "cancel request");
333
+ case "importing":
329
334
  case "results":
330
335
  return [
331
336
  rawKeyHint("type", "filter"),
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-models.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/fetch-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Fetch Models pane: idle intro → cancellable loading → error / searchable\n * checklist of the remote catalog. Rows summarize the metadata each entry\n * declared; already-configured ids are marked \"Added\" and cannot be checked.\n * Importing appends the new entries with that metadata, saves once, and\n * refreshes the provider immediately.\n */\n\nimport \"../keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { modelCatalogUrl, type ProbeModel } from \"../probe.ts\";\nimport type { EditorHost, EditorPane } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, truncateMiddle, ValueEditor } from \"./value-row.ts\";\n\ntype FetchState =\n\t| { type: \"idle\" }\n\t| { type: \"loading\" }\n\t| { type: \"error\"; message: string }\n\t| { type: \"results\"; models: ProbeModel[]; truncated: boolean };\n\n/** Compact token count for the row note, e.g. `1.0M`; the thresholds match the footer's usage stats. */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/** Dim row note for the declared metadata, e.g. `· 1.0M ctx · 393k out · img · think`. */\nfunction metadataNote(model: ProbeModel): string | undefined {\n\tconst parts = [\n\t\tmodel.contextWindow ? `${formatTokens(model.contextWindow)} ctx` : \"\",\n\t\tmodel.maxTokens ? `${formatTokens(model.maxTokens)} out` : \"\",\n\t\tmodel.input?.includes(\"image\") ? \"img\" : \"\",\n\t\tmodel.reasoning ? \"think\" : \"\",\n\t].filter(Boolean);\n\treturn parts.length > 0 ? `· ${parts.join(\" · \")}` : undefined;\n}\n\nexport class FetchModelsPane implements EditorPane {\n\tprivate state: FetchState = { type: \"idle\" };\n\tprivate controller: AbortController | undefined;\n\tprivate search: ValueEditor;\n\tprivate query = \"\";\n\tprivate index = 0;\n\tprivate checked = new Set<string>();\n\tprivate importing = false;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\tprivate disposed = false;\n\n\tprivate readonly host: EditorHost;\n\tconstructor(host: EditorHost) {\n\t\tthis.host = host;\n\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.importChecked(),\n\t\t\tonCancel: () => this.exitResults(),\n\t\t});\n\t}\n\n\t/** Enter pressed on the left-column row (or on the idle pane): start the request. */\n\tstart(): void {\n\t\tif (this.disposed || this.state.type === \"loading\" || this.importing) return;\n\t\tif (!this.catalogUrl()) return; // the idle pane explains what to configure first\n\t\tconst controller = new AbortController();\n\t\tthis.controller = controller;\n\t\tthis.state = { type: \"loading\" };\n\t\tthis.error = undefined;\n\t\tthis.host.refresh();\n\t\tvoid this.host\n\t\t\t.runFetch(controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (this.disposed || controller.signal.aborted || this.controller !== controller) return;\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tif (result.error === \"Cancelled.\") return;\n\t\t\t\t\tthis.state = { type: \"error\", message: result.error };\n\t\t\t\t\tthis.host.setFetchStatus(\"· failed\");\n\t\t\t\t} else {\n\t\t\t\t\tthis.state = { type: \"results\", models: result.models, truncated: result.truncated };\n\t\t\t\t\tthis.checked = new Set();\n\t\t\t\t\tthis.query = \"\";\n\t\t\t\t\tthis.search.reset(\"\");\n\t\t\t\t\tthis.index = 0;\n\t\t\t\t\tthis.search.focused = this.focused;\n\t\t\t\t\tthis.host.setFetchStatus(`· ${result.models.length} models`);\n\t\t\t\t}\n\t\t\t\tthis.host.refresh();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tthis.state = { type: \"error\", message: error instanceof Error ? error.message : String(error) };\n\t\t\t\tthis.host.setFetchStatus(\"· failed\");\n\t\t\t\tthis.host.refresh();\n\t\t\t});\n\t}\n\n\tprivate existingIds(): Set<string> {\n\t\treturn new Set(this.host.store.getModels(this.host.providerId).map((model) => model.id));\n\t}\n\n\t/** URL the catalog would be fetched from; undefined while no baseUrl is configured. */\n\tprivate catalogUrl(): string | undefined {\n\t\tconst baseUrl = this.host.store.getProvider(this.host.providerId)?.baseUrl;\n\t\ttry {\n\t\t\treturn baseUrl ? modelCatalogUrl(new URL(baseUrl), this.host.effectiveApi()).href : undefined;\n\t\t} catch {\n\t\t\treturn undefined; // validated before fetching\n\t\t}\n\t}\n\n\tprivate rows(): { model: ProbeModel; added: boolean }[] {\n\t\tif (this.state.type !== \"results\") return [];\n\t\tconst existing = this.existingIds();\n\t\tconst rows = this.state.models.map((model) => ({ model, added: existing.has(model.id) }));\n\t\tconst query = this.query.trim().toLowerCase();\n\t\tif (!query) return rows;\n\t\treturn rows.filter(\n\t\t\t(row) => row.model.id.toLowerCase().includes(query) || row.model.name?.toLowerCase().includes(query),\n\t\t);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst catalogUrl = this.catalogUrl();\n\t\tswitch (this.state.type) {\n\t\t\tcase \"idle\":\n\t\t\t\t// A real action row, so → moving focus here has a visible effect.\n\t\t\t\treturn catalogUrl\n\t\t\t\t\t? [\n\t\t\t\t\t\t\trenderPlainLine(theme, \"Fetch Models\", {\n\t\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\t\tnote: `· from ${truncateMiddle(catalogUrl, Math.max(10, width - 22))}`,\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]\n\t\t\t\t\t: [renderInfoLine(theme, \"Set a baseUrl under API Auth first.\", width)];\n\t\t\tcase \"loading\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `Fetching ${catalogUrl ?? \"\"} …`, width),\n\t\t\t\t\trenderInfoLine(theme, \"Esc cancels the request.\", width),\n\t\t\t\t];\n\t\t\tcase \"error\":\n\t\t\t\treturn [\n\t\t\t\t\ttheme.fg(\"error\", truncate(this.state.message, Math.max(10, width - 2))),\n\t\t\t\t\trenderInfoLine(theme, \"Enter retries; Esc goes back.\", width),\n\t\t\t\t];\n\t\t\tcase \"results\": {\n\t\t\t\tconst lines: string[] = [];\n\t\t\t\tif (this.state.truncated) {\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\trenderInfoLine(theme, \"The catalog was truncated; refine manually if a model is missing.\", width),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlines.push(this.search.renderLine(width));\n\t\t\t\t// All rows render; the editor's fixed window scrolls around scrollWindow().\n\t\t\t\tconst rows = this.rows();\n\t\t\t\tfor (const [rowIndex, row] of rows.entries()) {\n\t\t\t\t\tif (row.added) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\trenderPlainLine(theme, row.model.id, {\n\t\t\t\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\t\tdim: true,\n\t\t\t\t\t\t\t\tnote: \"· Added\",\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\trenderPlainLine(theme, row.model.name ? `${row.model.id} · ${row.model.name}` : row.model.id, {\n\t\t\t\t\t\t\tchecked: this.checked.has(row.model.id),\n\t\t\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\tnote: metadataNote(row.model),\n\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (rows.length === 0) lines.push(renderInfoLine(theme, \"No matching models.\", width));\n\t\t\t\tconst addedCount = rows.filter((row) => row.added).length;\n\t\t\t\tlines.push(\n\t\t\t\t\trenderInfoLine(\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t\t`${this.checked.size} selected · ${rows.length} shown${addedCount ? ` · ${addedCount} already added` : \"\"}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (this.importing) lines.push(renderInfoLine(theme, \"Importing…\", width));\n\t\t\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\t\t\treturn lines;\n\t\t\t}\n\t\t}\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\tif (this.state.type !== \"results\") return {};\n\t\t// The truncation notice and the filter input pin above the checklist;\n\t\t// the selection summary (and import progress/error) pin below.\n\t\tconst top = (this.state.truncated ? 1 : 0) + 1;\n\t\tconst bottom = 1 + (this.importing ? 1 : 0) + (this.error ? 1 : 0);\n\t\treturn { top, bottom, cursor: top + this.index };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tswitch (this.state.type) {\n\t\t\tcase \"idle\":\n\t\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.start(); // guarded internally\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.host.popPane();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"loading\":\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.controller?.abort();\n\t\t\t\t\tthis.state = { type: \"idle\" };\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"error\":\n\t\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.start();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.host.popPane();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"results\":\n\t\t\t\tthis.handleResultsInput(data);\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate handleResultsInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst rows = this.rows();\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (rows.length > 0) this.index = this.index === 0 ? rows.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (rows.length > 0) this.index = (this.index + 1) % rows.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst row = rows[this.index];\n\t\t\tif (!row || row.added || this.importing) return;\n\t\t\tif (this.checked.has(row.model.id)) this.checked.delete(row.model.id);\n\t\t\telse this.checked.add(row.model.id);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.exitResults();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.importChecked();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tprivate importChecked(): void {\n\t\tif (this.state.type !== \"results\" || this.importing) return;\n\t\t// Nothing checked: import the highlighted row, like a fuzzy picker. Only Esc discards.\n\t\tlet chosen: ProbeModel[];\n\t\tif (this.checked.size === 0) {\n\t\t\tconst row = this.rows()[this.index];\n\t\t\tif (!row || row.added) return;\n\t\t\tchosen = [row.model];\n\t\t} else {\n\t\t\tchosen = this.state.models.filter((model) => this.checked.has(model.id));\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tthis.controller = controller;\n\t\tthis.importing = true;\n\t\tthis.error = undefined;\n\t\tthis.host.refresh();\n\t\tvoid this.host\n\t\t\t.importModels(chosen, controller.signal)\n\t\t\t.then((error) => {\n\t\t\t\tif (this.disposed || controller.signal.aborted || this.controller !== controller) return;\n\t\t\t\tthis.importing = false;\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.error = error;\n\t\t\t\t\tthis.host.setFetchStatus(\"· import failed\");\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.host.setFetchStatus(`· ${this.host.store.getModels(this.host.providerId).length} models`);\n\t\t\t\tthis.state = { type: \"idle\" };\n\t\t\t\tthis.host.popPane(); // back to the left column with the new models visible\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (this.disposed || controller.signal.aborted || this.controller !== controller) return;\n\t\t\t\tthis.importing = false;\n\t\t\t\tthis.error = error instanceof Error ? error.message : String(error);\n\t\t\t\tthis.host.refresh();\n\t\t\t});\n\t}\n\n\tprivate exitResults(): void {\n\t\tthis.controller?.abort();\n\t\tthis.importing = false;\n\t\tthis.state = { type: \"idle\" };\n\t\tthis.checked = new Set();\n\t\tthis.host.popPane();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused && this.state.type === \"results\";\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.state.type === \"results\"; // the filter input owns ←/→\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.controller?.abort();\n\t}\n\n\thints(): string {\n\t\tswitch (this.state.type) {\n\t\t\tcase \"loading\":\n\t\t\t\treturn keyHint(\"tui.select.cancel\", \"cancel request\");\n\t\t\tcase \"results\":\n\t\t\t\treturn [\n\t\t\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\t\t\tkeyHint(\"app.list.toggle\", \"check\"),\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"import\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"discard\"),\n\t\t\t\t].join(\" \");\n\t\t\tcase \"error\":\n\t\t\t\treturn [keyHint(\"tui.select.confirm\", \"retry\"), keyHint(\"tui.select.cancel\", \"back\")].join(\" \");\n\t\t\tdefault:\n\t\t\t\treturn this.catalogUrl()\n\t\t\t\t\t? [keyHint(\"tui.select.confirm\", \"fetch\"), keyHint(\"tui.select.cancel\", \"back\")].join(\" \")\n\t\t\t\t\t: keyHint(\"tui.select.cancel\", \"back\");\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"fetch-models.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/fetch-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Fetch Models pane: idle intro → cancellable loading → error / searchable\n * checklist of the remote catalog. Rows summarize the metadata each entry\n * declared; already-configured ids are marked \"Added\" and cannot be checked.\n * Importing appends the new entries with that metadata, saves once, and\n * refreshes the provider immediately.\n */\n\nimport \"../keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { modelCatalogUrl, type ProbeModel } from \"../probe.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport type { EditorHost, EditorPane } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, truncateMiddle, ValueEditor } from \"./value-row.ts\";\n\ninterface CatalogResults {\n\tmodels: ProbeModel[];\n\ttruncated: boolean;\n}\n\ntype FetchState =\n\t| { type: \"idle\" }\n\t| { type: \"loading\"; controller: AbortController }\n\t| { type: \"error\"; message: string }\n\t| { type: \"results\"; catalog: CatalogResults; error?: string }\n\t| { type: \"importing\"; catalog: CatalogResults; controller: AbortController };\n\n/** Compact token count for the row note, e.g. `1.0M`; the thresholds match the footer's usage stats. */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/** Dim row note for the declared metadata, e.g. `· 1.0M ctx · 393k out · img · think`. */\nfunction metadataNote(model: ProbeModel): string | undefined {\n\tconst parts = [\n\t\tmodel.contextWindow ? `${formatTokens(model.contextWindow)} ctx` : \"\",\n\t\tmodel.maxTokens ? `${formatTokens(model.maxTokens)} out` : \"\",\n\t\tmodel.input?.includes(\"image\") ? \"img\" : \"\",\n\t\tmodel.reasoning ? \"think\" : \"\",\n\t].filter(Boolean);\n\treturn parts.length > 0 ? `· ${parts.join(\" · \")}` : undefined;\n}\n\nexport class FetchModelsPane implements EditorPane {\n\tprivate state: FetchState = { type: \"idle\" };\n\tprivate search: ValueEditor;\n\tprivate query = \"\";\n\tprivate index = 0;\n\tprivate checked = new Set<string>();\n\tprivate focused = false;\n\tprivate disposed = false;\n\n\tprivate readonly host: EditorHost;\n\tconstructor(host: EditorHost) {\n\t\tthis.host = host;\n\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.importChecked(),\n\t\t\tonCancel: () => this.exitResults(),\n\t\t});\n\t}\n\n\t/** Enter pressed on the left-column row (or on the idle pane): start the request. */\n\tstart(): void {\n\t\tif (this.disposed || this.state.type === \"loading\" || this.state.type === \"importing\") return;\n\t\tif (!this.catalogUrl()) return; // the idle pane explains what to configure first\n\t\tconst controller = new AbortController();\n\t\tthis.state = { type: \"loading\", controller };\n\t\tthis.host.refresh();\n\t\tvoid this.host\n\t\t\t.runFetch(controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tcontroller.signal.aborted ||\n\t\t\t\t\tthis.state.type !== \"loading\" ||\n\t\t\t\t\tthis.state.controller !== controller\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tif (result.error === \"Cancelled.\") return;\n\t\t\t\t\tthis.state = { type: \"error\", message: result.error };\n\t\t\t\t\tthis.host.setFetchStatus(\"· failed\");\n\t\t\t\t} else {\n\t\t\t\t\tthis.state = { type: \"results\", catalog: result };\n\t\t\t\t\tthis.checked = new Set();\n\t\t\t\t\tthis.query = \"\";\n\t\t\t\t\tthis.search.reset(\"\");\n\t\t\t\t\tthis.index = 0;\n\t\t\t\t\tthis.search.focused = this.focused;\n\t\t\t\t\tthis.host.setFetchStatus(`· ${result.models.length} models`);\n\t\t\t\t}\n\t\t\t\tthis.host.refresh();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tcontroller.signal.aborted ||\n\t\t\t\t\tthis.state.type !== \"loading\" ||\n\t\t\t\t\tthis.state.controller !== controller\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tthis.state = { type: \"error\", message: error instanceof Error ? error.message : String(error) };\n\t\t\t\tthis.host.setFetchStatus(\"· failed\");\n\t\t\t\tthis.host.refresh();\n\t\t\t});\n\t}\n\n\tprivate existingIds(): Set<string> {\n\t\treturn new Set(this.host.store.getModels(this.host.providerId).map((model) => model.id));\n\t}\n\n\t/** URL the catalog would be fetched from; undefined while no baseUrl is configured. */\n\tprivate catalogUrl(): string | undefined {\n\t\tconst baseUrl = this.host.store.getProvider(this.host.providerId)?.baseUrl;\n\t\ttry {\n\t\t\treturn baseUrl ? modelCatalogUrl(new URL(baseUrl), this.host.effectiveApi()).href : undefined;\n\t\t} catch {\n\t\t\treturn undefined; // validated before fetching\n\t\t}\n\t}\n\n\tprivate rows(): { model: ProbeModel; added: boolean }[] {\n\t\tif (this.state.type !== \"results\" && this.state.type !== \"importing\") return [];\n\t\tconst existing = this.existingIds();\n\t\tconst rows = this.state.catalog.models.map((model) => ({ model, added: existing.has(model.id) }));\n\t\tconst query = this.query.trim().toLowerCase();\n\t\tif (!query) return rows;\n\t\treturn rows.filter(\n\t\t\t(row) => row.model.id.toLowerCase().includes(query) || row.model.name?.toLowerCase().includes(query),\n\t\t);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst catalogUrl = this.catalogUrl();\n\t\tswitch (this.state.type) {\n\t\t\tcase \"idle\":\n\t\t\t\t// A real action row, so → moving focus here has a visible effect.\n\t\t\t\treturn catalogUrl\n\t\t\t\t\t? [\n\t\t\t\t\t\t\trenderPlainLine(theme, \"Fetch Models\", {\n\t\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\t\tnote: `· from ${truncateMiddle(catalogUrl, Math.max(10, width - 22))}`,\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]\n\t\t\t\t\t: [renderInfoLine(theme, \"Set a baseUrl under API Auth first.\", width)];\n\t\t\tcase \"loading\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `Fetching ${catalogUrl ?? \"\"} …`, width),\n\t\t\t\t\trenderInfoLine(theme, \"Esc cancels the request.\", width),\n\t\t\t\t];\n\t\t\tcase \"error\":\n\t\t\t\treturn [\n\t\t\t\t\ttheme.fg(\"error\", truncate(this.state.message, Math.max(10, width - 2))),\n\t\t\t\t\trenderInfoLine(theme, \"Enter retries; Esc goes back.\", width),\n\t\t\t\t];\n\t\t\tcase \"importing\":\n\t\t\tcase \"results\": {\n\t\t\t\tconst lines: string[] = [];\n\t\t\t\tif (this.state.catalog.truncated) {\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\trenderInfoLine(theme, \"The catalog was truncated; refine manually if a model is missing.\", width),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlines.push(this.search.renderLine(width));\n\t\t\t\t// All rows render; the editor's fixed window scrolls around scrollWindow().\n\t\t\t\tconst rows = this.rows();\n\t\t\t\tfor (const [rowIndex, row] of rows.entries()) {\n\t\t\t\t\tif (row.added) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\trenderPlainLine(theme, row.model.id, {\n\t\t\t\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\t\tdim: true,\n\t\t\t\t\t\t\t\tnote: \"· Added\",\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\trenderPlainLine(theme, row.model.name ? `${row.model.id} · ${row.model.name}` : row.model.id, {\n\t\t\t\t\t\t\tchecked: this.checked.has(row.model.id),\n\t\t\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\tnote: metadataNote(row.model),\n\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (rows.length === 0) lines.push(renderInfoLine(theme, \"No matching models.\", width));\n\t\t\t\tconst addedCount = rows.filter((row) => row.added).length;\n\t\t\t\tlines.push(\n\t\t\t\t\trenderInfoLine(\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t\t`${this.checked.size} selected · ${rows.length} shown${addedCount ? ` · ${addedCount} already added` : \"\"}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (this.state.type === \"importing\") lines.push(renderInfoLine(theme, \"Importing…\", width));\n\t\t\t\tif (this.state.type === \"results\" && this.state.error)\n\t\t\t\t\tlines.push(theme.fg(\"error\", truncate(this.state.error, Math.max(10, width - 2))));\n\t\t\t\treturn lines;\n\t\t\t}\n\t\t}\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\tif (this.state.type !== \"results\" && this.state.type !== \"importing\") return {};\n\t\t// The truncation notice and the filter input pin above the checklist;\n\t\t// the selection summary (and import progress/error) pin below.\n\t\tconst top = (this.state.catalog.truncated ? 1 : 0) + 1;\n\t\tconst bottom = 1 + (this.state.type === \"importing\" || this.state.error ? 1 : 0);\n\t\treturn { top, bottom, cursor: top + this.index };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tswitch (this.state.type) {\n\t\t\tcase \"idle\":\n\t\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.start(); // guarded internally\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.host.popPane();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"loading\":\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.state.controller.abort();\n\t\t\t\t\tthis.state = { type: \"idle\" };\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"error\":\n\t\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.start();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.host.popPane();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"importing\":\n\t\t\tcase \"results\":\n\t\t\t\tthis.handleResultsInput(data);\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate handleResultsInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst rows = this.rows();\n\t\tconst next = moveSelection(kb, data, this.index, rows.length);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst row = rows[this.index];\n\t\t\tif (!row || row.added || this.state.type === \"importing\") return;\n\t\t\tif (this.checked.has(row.model.id)) this.checked.delete(row.model.id);\n\t\t\telse this.checked.add(row.model.id);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.exitResults();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.importChecked();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tprivate importChecked(): void {\n\t\tif (this.state.type !== \"results\") return;\n\t\t// Nothing checked: import the highlighted row, like a fuzzy picker. Only Esc discards.\n\t\tlet chosen: ProbeModel[];\n\t\tif (this.checked.size === 0) {\n\t\t\tconst row = this.rows()[this.index];\n\t\t\tif (!row || row.added) return;\n\t\t\tchosen = [row.model];\n\t\t} else {\n\t\t\tchosen = this.state.catalog.models.filter((model) => this.checked.has(model.id));\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tconst catalog = this.state.catalog;\n\t\tthis.state = { type: \"importing\", catalog, controller };\n\t\tthis.host.refresh();\n\t\tvoid this.host\n\t\t\t.importModels(chosen, controller.signal)\n\t\t\t.then((error) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tcontroller.signal.aborted ||\n\t\t\t\t\tthis.state.type !== \"importing\" ||\n\t\t\t\t\tthis.state.controller !== controller\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.state = { type: \"results\", catalog, error };\n\t\t\t\t\tthis.host.setFetchStatus(\"· import failed\");\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.host.setFetchStatus(`· ${this.host.store.getModels(this.host.providerId).length} models`);\n\t\t\t\tthis.state = { type: \"idle\" };\n\t\t\t\tthis.host.popPane(); // back to the left column with the new models visible\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tcontroller.signal.aborted ||\n\t\t\t\t\tthis.state.type !== \"importing\" ||\n\t\t\t\t\tthis.state.controller !== controller\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tthis.state = { type: \"results\", catalog, error: error instanceof Error ? error.message : String(error) };\n\t\t\t\tthis.host.refresh();\n\t\t\t});\n\t}\n\n\tprivate exitResults(): void {\n\t\tif (this.state.type === \"loading\" || this.state.type === \"importing\") this.state.controller.abort();\n\t\tthis.state = { type: \"idle\" };\n\t\tthis.checked = new Set();\n\t\tthis.host.popPane();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused && (this.state.type === \"results\" || this.state.type === \"importing\");\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.state.type === \"results\" || this.state.type === \"importing\"; // the filter input owns ←/→\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tif (this.state.type === \"loading\" || this.state.type === \"importing\") this.state.controller.abort();\n\t}\n\n\thints(): string {\n\t\tswitch (this.state.type) {\n\t\t\tcase \"loading\":\n\t\t\t\treturn keyHint(\"tui.select.cancel\", \"cancel request\");\n\t\t\tcase \"importing\":\n\t\t\tcase \"results\":\n\t\t\t\treturn [\n\t\t\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\t\t\tkeyHint(\"app.list.toggle\", \"check\"),\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"import\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"discard\"),\n\t\t\t\t].join(\" \");\n\t\t\tcase \"error\":\n\t\t\t\treturn [keyHint(\"tui.select.confirm\", \"retry\"), keyHint(\"tui.select.cancel\", \"back\")].join(\" \");\n\t\t\tdefault:\n\t\t\t\treturn this.catalogUrl()\n\t\t\t\t\t? [keyHint(\"tui.select.confirm\", \"fetch\"), keyHint(\"tui.select.cancel\", \"back\")].join(\" \")\n\t\t\t\t\t: keyHint(\"tui.select.cancel\", \"back\");\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-fields.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-fields.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,mBAAmB,CAAC;AAS3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAcxB,qBAAa,eAAgB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAoBhD,mEAAmE;IACnE,cAAc,IAAI,IAAI;IAKtB,oEAAoE;IACpE,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB/B,YAAY,IAAI,gBAAgB;IAShC,OAAO,CAAC,SAAS;IAsFjB,uGAAuG;IACvG,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IAkCtB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiD/B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;IAyChB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,UAAU;IA0ElB,OAAO,CAAC,WAAW;IAiBnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAIf,KAAK,IAAI,MAAM;CASf"}
1
+ {"version":3,"file":"model-fields.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-fields.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,mBAAmB,CAAC;AAU3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAcxB,qBAAa,eAAgB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAoBhD,mEAAmE;IACnE,cAAc,IAAI,IAAI;IAKtB,oEAAoE;IACpE,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB/B,YAAY,IAAI,gBAAgB;IAShC,OAAO,CAAC,SAAS;IAsFjB,uGAAuG;IACvG,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IAkCtB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6C/B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;IAyChB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,UAAU;IA0ElB,OAAO,CAAC,WAAW;IAiBnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAIf,KAAK,IAAI,MAAM;CASf"}
@@ -11,7 +11,8 @@ import { plural, truncate } from "../constants.js";
11
11
  import { DELETE } from "../store.js";
12
12
  import { BuiltinCandidatesPane } from "./builtin-data.js";
13
13
  import { CompatPane } from "./compat.js";
14
- import { CostPane, InputTypesPane, ModelSpecificApiPane, ReasoningPane } from "./model-options.js";
14
+ import { moveSelection } from "./controls.js";
15
+ import { CostPane, createReasoningPane, InputTypesPane, ModelSpecificApiPane } from "./model-options.js";
15
16
  import { ThinkingMapPane } from "./thinking-map.js";
16
17
  import { isPrintableInput, renderInfoLine, renderKeyValueLine, ValueEditor, } from "./value-row.js";
17
18
  const DEFAULT_CONTEXT_WINDOW = 128000;
@@ -209,13 +210,9 @@ export class ModelFieldsPane {
209
210
  this.host.refresh();
210
211
  return;
211
212
  }
212
- if (kb.matches(data, "tui.select.up")) {
213
- this.index = this.index === 0 ? this.rows.length - 1 : this.index - 1;
214
- this.host.refresh();
215
- return;
216
- }
217
- if (kb.matches(data, "tui.select.down")) {
218
- this.index = (this.index + 1) % this.rows.length;
213
+ const next = moveSelection(kb, data, this.index, this.rows.length);
214
+ if (next !== undefined) {
215
+ this.index = next;
219
216
  this.host.refresh();
220
217
  return;
221
218
  }
@@ -251,7 +248,7 @@ export class ModelFieldsPane {
251
248
  if (row.kind !== "reasoning")
252
249
  return; // Space on other rows falls to overwrite handling below
253
250
  const current = this.model.read().reasoning;
254
- this.host.mutate(() => this.model.setField(["reasoning"], current !== true));
251
+ this.model.setField(["reasoning"], current !== true);
255
252
  }
256
253
  enterRow() {
257
254
  const row = this.rows[this.index];
@@ -261,7 +258,7 @@ export class ModelFieldsPane {
261
258
  this.beginEdit("tweak");
262
259
  return;
263
260
  case "reasoning":
264
- this.host.pushPane(new ReasoningPane(this.host, this.model));
261
+ this.host.pushPane(createReasoningPane(this.host, this.model));
265
262
  return;
266
263
  case "subpage":
267
264
  this.pushSubpage(row.key);
@@ -287,7 +284,7 @@ export class ModelFieldsPane {
287
284
  return;
288
285
  }
289
286
  this.host.confirm(`Delete model "${id}" from ${this.host.providerId}?`, "Delete Model", () => {
290
- this.host.mutate(() => this.host.store.removeModel(this.host.providerId, id));
287
+ this.host.edits.removeModel(id);
291
288
  this.host.onModelRemoved(id);
292
289
  });
293
290
  return;
@@ -382,13 +379,13 @@ export class ModelFieldsPane {
382
379
  return;
383
380
  }
384
381
  if (row.key === "name") {
385
- this.host.mutate(() => this.model.setField(["name"], value === "" ? DELETE : value));
382
+ this.model.setField(["name"], value === "" ? DELETE : value);
386
383
  finish();
387
384
  return;
388
385
  }
389
386
  // Numeric rows: empty clears the override; otherwise a finite positive integer.
390
387
  if (value === "") {
391
- this.host.mutate(() => this.model.setField([row.key], DELETE));
388
+ this.model.setField([row.key], DELETE);
392
389
  finish();
393
390
  return;
394
391
  }
@@ -397,7 +394,7 @@ export class ModelFieldsPane {
397
394
  finish(`${row.key} must be a positive integer.`);
398
395
  return;
399
396
  }
400
- this.host.mutate(() => this.model.setField([row.key], parsed));
397
+ this.model.setField([row.key], parsed);
401
398
  finish();
402
399
  return;
403
400
  }