@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
@@ -1 +1 @@
1
- {"version":3,"file":"model-options.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-options.ts"],"names":[],"mappings":"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","sourcesContent":["/** Scalar model settings: reasoning, input modalities, cost rates, and the model-specific API override. */\n\nimport \"../keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { builtinDefaults } from \"../catalog.ts\";\nimport { API_TYPES, INPUT_TYPES, type InputType, truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { baseUrlHint, validateBaseUrlValue } from \"./provider-fields.ts\";\nimport { isPrintableInput, renderInfoLine, renderKeyValueLine, renderPlainLine, ValueEditor } from \"./value-row.ts\";\n\n// -------------------------------------------------------------------------\n// reasoning\n// -------------------------------------------------------------------------\n\nconst REASONING_OPTIONS = [\n\t{ label: \"true\", value: true },\n\t{ label: \"false\", value: false },\n\t{ label: \"default (false)\", value: undefined },\n] as const;\n\n/** Radio sub-page for reasoning — consistent with the other nested model settings. */\nexport class ReasoningPane implements EditorPane {\n\treadonly crumb = \"reasoning\";\n\tprivate index = 0;\n\tprivate focused = false;\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tconst current = model.read().reasoning;\n\t\tthis.index = current === true ? 0 : current === false ? 1 : 2;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read().reasoning;\n\t\treturn REASONING_OPTIONS.map((option, optionIndex) => {\n\t\t\tconst selected = option.value === undefined ? current === undefined : current === option.value;\n\t\t\treturn renderPlainLine(theme, `${selected ? \"●\" : \"○\"} ${option.label}`, {\n\t\t\t\tactive: optionIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\tdim: option.value === undefined,\n\t\t\t\twidth,\n\t\t\t});\n\t\t});\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? REASONING_OPTIONS.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\tthis.index = (this.index + 1) % REASONING_OPTIONS.length;\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.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst option = REASONING_OPTIONS[this.index]!;\n\t\t\tthis.host.mutate(() => this.model.setField([\"reasoning\"], option.value === undefined ? DELETE : option.value));\n\t\t\tthis.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"set\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// input modalities\n// -------------------------------------------------------------------------\n\nexport class InputTypesPane implements EditorPane {\n\treadonly crumb = \"input\";\n\tprivate index = 0;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate selected(): Set<string> {\n\t\treturn new Set(this.model.read().input ?? [\"text\"]);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst selected = this.selected();\n\t\tconst lines = INPUT_TYPES.map((type, rowIndex) =>\n\t\t\trenderPlainLine(theme, type, {\n\t\t\t\tchecked: selected.has(type),\n\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.model.read().input === undefined) {\n\t\t\tlines.push(renderInfoLine(theme, \"Not set — the runtime default is [text].\", width));\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? INPUT_TYPES.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\tthis.index = (this.index + 1) % INPUT_TYPES.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 type: InputType = INPUT_TYPES[this.index]!;\n\t\t\tconst selected = this.selected();\n\t\t\tif (selected.has(type)) {\n\t\t\t\tif (selected.size === 1) {\n\t\t\t\t\tthis.error = \"At least one input type must stay selected.\";\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tselected.delete(type);\n\t\t\t} else {\n\t\t\t\tselected.add(type);\n\t\t\t}\n\t\t\tthis.error = undefined;\n\t\t\tconst next = INPUT_TYPES.filter((entry) => selected.has(entry));\n\t\t\tthis.host.mutate(() => this.model.setField([\"input\"], [...next]));\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\tkeyHint(\"app.list.toggle\", \"toggle\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"done\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// cost\n// -------------------------------------------------------------------------\n\nconst COST_RATES = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const;\ntype CostRate = (typeof COST_RATES)[number];\n\nexport class CostPane implements EditorPane {\n\treadonly crumb = \"cost\";\n\tprivate index = 0;\n\tprivate editing: ValueEditor | undefined;\n\tprivate editingRate: CostRate | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate cost(): Record<CostRate, number> | undefined {\n\t\tconst cost = this.model.read().cost;\n\t\tif (!cost) return undefined;\n\t\treturn { input: cost.input, output: cost.output, cacheRead: cost.cacheRead, cacheWrite: cost.cacheWrite };\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst cost = this.cost();\n\t\tconst lines: string[] = [];\n\t\tfor (const [rowIndex, rate] of COST_RATES.entries()) {\n\t\t\tconst value = cost?.[rate];\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: rate,\n\t\t\t\t\tvalueText: value === undefined ? \"0 (default)\" : `$${value} / M tokens`,\n\t\t\t\t\tunset: value === undefined,\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting: this.editingRate === rate ? this.editing : undefined,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst tiers = this.model.read().cost?.tiers;\n\t\tif (tiers && tiers.length > 0) {\n\t\t\tlines.push(renderInfoLine(theme, `tiers: ${tiers.length} (read-only; kept as-is)`, width));\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.editing) {\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\tthis.editing.handleInput(data);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? COST_RATES.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\tthis.index = (this.index + 1) % COST_RATES.length;\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.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.beginEdit(\"tweak\");\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tthis.beginEdit(\"overwrite\", data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate beginEdit(mode: \"overwrite\" | \"tweak\", firstData?: string): void {\n\t\tconst rate = COST_RATES[this.index]!;\n\t\tconst current = this.cost()?.[rate];\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => this.commit(rate, value),\n\t\t\tonCancel: () => {\n\t\t\t\tthis.editing = undefined;\n\t\t\t\tthis.editingRate = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.editing = editor;\n\t\tthis.editingRate = rate;\n\t\teditor.focused = this.focused;\n\t\tif (mode === \"overwrite\") editor.beginOverwrite(firstData);\n\t\telse editor.beginTweak(current === undefined ? \"\" : String(current));\n\t\tthis.host.refresh();\n\t}\n\n\tprivate commit(rate: CostRate, raw: string): void {\n\t\tconst value = raw.trim();\n\t\tconst parsed = value === \"\" ? 0 : Number(value);\n\t\tif (!Number.isFinite(parsed) || parsed < 0) {\n\t\t\tthis.error = \"cost rates must be finite non-negative numbers.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.error = undefined;\n\t\tthis.editing = undefined;\n\t\tthis.editingRate = undefined;\n\t\t// A cost object must stay complete: first edit materializes the other rates as 0; tiers are preserved.\n\t\tthis.host.mutate(() => {\n\t\t\tif (this.model.read().cost) this.model.setField([\"cost\", rate], parsed);\n\t\t\telse this.model.setField([\"cost\"], { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, [rate]: parsed });\n\t\t});\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.editing) this.editing.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.editing !== undefined;\n\t}\n\n\thints(): string {\n\t\tif (this.editing) return [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"overwrite\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Model-Specific API\n// -------------------------------------------------------------------------\n\n/**\n * Model-level baseUrl / API Type overrides. Unset rows show the inherited\n * provider or built-in value dimmed; typing on a row (or editing the shown\n * value) writes an override, clearing it returns to inheritance.\n */\nexport class ModelSpecificApiPane implements EditorPane {\n\treadonly crumb = \"Model-Specific API\";\n\tprivate readonly rows = [\"baseUrl\", \"apiType\"] as const;\n\tprivate index = 0;\n\tprivate editing: ValueEditor | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\t/** Where an unset model field resolves from; undefined when nothing resolves it. */\n\tprivate inherited(key: \"api\" | \"baseUrl\"): { value: string; via: \"provider\" | \"built-in\" } | undefined {\n\t\tconst provider = this.host.store.getProvider(this.host.providerId);\n\t\tconst providerValue = key === \"api\" ? provider?.api : provider?.baseUrl;\n\t\tif (providerValue) return { value: providerValue, via: \"provider\" };\n\t\tconst current = this.model.read();\n\t\tconst effective = key === \"api\" ? this.host.effectiveApi(current) : this.host.effectiveBaseUrl(current);\n\t\treturn effective ? { value: effective, via: \"built-in\" } : undefined;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read();\n\t\tconst lines: string[] = [];\n\t\tfor (const [rowIndex, row] of this.rows.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tif (row === \"baseUrl\") {\n\t\t\t\tconst override = current.baseUrl;\n\t\t\t\tconst inherited = override ? undefined : this.inherited(\"baseUrl\");\n\t\t\t\tlines.push(\n\t\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\t\tkeyLabel: \"baseUrl\",\n\t\t\t\t\t\tvalueText: override ?? inherited?.value ?? \"not set\",\n\t\t\t\t\t\tunset: !override,\n\t\t\t\t\t\tnote: inherited ? `· ${inherited.via}` : undefined,\n\t\t\t\t\t\tactive,\n\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\tediting: this.editing,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst override = current.api;\n\t\t\t\tconst inherited = override ? undefined : this.inherited(\"api\");\n\t\t\t\tlines.push(\n\t\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\t\tkeyLabel: \"API Type\",\n\t\t\t\t\t\tvalueText: override ?? inherited?.value ?? \"not set\",\n\t\t\t\t\t\tunset: !override,\n\t\t\t\t\t\tnote: inherited ? `· ${inherited.via}` : undefined,\n\t\t\t\t\t\tactive,\n\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\tconst hint = baseUrlHint(this.host.effectiveApi(current));\n\t\tif (hint) lines.push(renderInfoLine(theme, hint, width));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.editing) {\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\tthis.editing.handleInput(data);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? this.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\tthis.index = (this.index + 1) % this.rows.length;\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.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.rows[this.index] === \"apiType\") this.host.pushPane(new ModelApiTypePane(this.host, this.model));\n\t\t\telse this.beginEdit(\"tweak\");\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tif (this.rows[this.index] === \"apiType\") return;\n\t\t\tthis.beginEdit(\"overwrite\", data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/** Tweak starts from the inherited value, so adjusting it writes the override directly. */\n\tprivate beginEdit(mode: \"overwrite\" | \"tweak\", firstData?: string): void {\n\t\tconst current = this.model.read();\n\t\tconst base = current.baseUrl ?? this.inherited(\"baseUrl\")?.value ?? \"\";\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => this.commit(value),\n\t\t\tonCancel: () => {\n\t\t\t\tthis.editing = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.editing = editor;\n\t\teditor.focused = this.focused;\n\t\tif (mode === \"overwrite\") editor.beginOverwrite(firstData);\n\t\telse editor.beginTweak(base);\n\t\tthis.host.refresh();\n\t}\n\n\tprivate commit(raw: string): void {\n\t\tconst value = raw.trim();\n\t\tif (value) {\n\t\t\tconst invalid = validateBaseUrlValue(value);\n\t\t\tif (invalid) {\n\t\t\t\tthis.error = invalid;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.error = undefined;\n\t\tthis.editing = undefined;\n\t\tthis.host.mutate(() => this.model.setField([\"baseUrl\"], value === \"\" ? DELETE : value));\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.editing) this.editing.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.editing !== undefined;\n\t}\n\n\thints(): string {\n\t\tif (this.editing) return [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"overwrite\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit / open\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n/** Single-select model api: the inherited default plus every known API tag. Enter applies and returns. */\nexport class ModelApiTypePane implements EditorPane {\n\treadonly crumb = \"API Type\";\n\tprivate index = 0;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\n\t\tconst current = model.read().api;\n\t\tconst options = this.options();\n\t\tthis.index = Math.max(\n\t\t\t0,\n\t\t\toptions.findIndex((option) => option.value === current),\n\t\t);\n\t}\n\n\t/** The api this model inherits when it defines none — provider first, then the built-in catalog. */\n\tprivate fallback(): string | undefined {\n\t\tconst provider = this.host.store.getProvider(this.host.providerId);\n\t\treturn provider?.api ?? builtinDefaults(this.host.providerId, this.model.read().id, provider?.api).api;\n\t}\n\n\t/** value undefined = inherit; a custom api already stored is preserved and appended. */\n\tprivate options(): { label: string; value: string | undefined }[] {\n\t\tconst current = this.model.read().api;\n\t\tconst providerApi = this.host.store.getProvider(this.host.providerId)?.api;\n\t\tconst fallback = this.fallback();\n\t\tconst inheritedLabel = providerApi\n\t\t\t? `provider: ${providerApi}`\n\t\t\t: fallback\n\t\t\t\t? `built-in: ${fallback}`\n\t\t\t\t: \"no provider or built-in API\";\n\t\tconst options: { label: string; value: string | undefined }[] = [{ label: inheritedLabel, value: undefined }];\n\t\tfor (const api of API_TYPES) options.push({ label: api, value: api });\n\t\tif (current && !(API_TYPES as readonly string[]).includes(current))\n\t\t\toptions.push({ label: current, value: current });\n\t\treturn options;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read().api;\n\t\tconst lines = this.options().map((option, rowIndex) => {\n\t\t\tconst selected = option.value === current;\n\t\t\treturn renderPlainLine(theme, `${selected ? \"●\" : \"○\"} ${option.label}`, {\n\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\tdim: option.value === undefined,\n\t\t\t\twidth,\n\t\t\t});\n\t\t});\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst options = this.options();\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? options.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\tthis.index = (this.index + 1) % options.length;\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.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst option = options[this.index]!;\n\t\t\tif (option.value === undefined && !this.fallback()) {\n\t\t\t\tthis.error = \"Nothing to inherit — pick an API.\";\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.error = undefined;\n\t\t\tthis.host.mutate(() => this.model.setField([\"api\"], option.value ?? DELETE));\n\t\t\tthis.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"select\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
1
+ {"version":3,"file":"model-options.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-options.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAE3G,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2DAA2D,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAkB,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvG,4EAA4E;AAC5E,YAAY;AACZ,4EAA4E;AAE5E,MAAM,iBAAiB,GAAG;IACzB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;IAC9B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IAChC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE;CACrC,CAAC;AAEX,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,IAAgB,EAAE,KAAkB;IACvE,OAAO,IAAI,UAAU,CAAsB,IAAI,EAAE,WAAW,EAAE;QAC7D,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS;QACrC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;QAClG,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpE,OAAO,SAAS,CAAC;QAClB,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,mBAAmB;AACnB,4EAA4E;AAE5E,MAAM,OAAO,cAAc;IAQ1B,YAAY,IAAgB,EAAE,KAAkB;QAPvC,UAAK,GAAG,OAAO,CAAC;QACjB,UAAK,GAAG,CAAC,CAAC;QAEV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAEO,QAAQ;QACf,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAChD,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE;YAC5B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;YAC/B,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,KAAK;SACL,CAAC,CACF,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAc,WAAW,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,GAAG,6CAA6C,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO;gBACR,CAAC;gBACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;IACF,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK;QACJ,OAAO;YACN,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;YACpC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;YACrC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,4EAA4E;AAC5E,OAAO;AACP,4EAA4E;AAE5E,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAG3E,MAAM,OAAO,QAAQ;IAQpB,YAAY,IAAgB,EAAE,KAAkB;QAPvC,UAAK,GAAG,MAAM,CAAC;QAChB,UAAK,GAAG,CAAC,CAAC;QAEV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAEO,IAAI;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3G,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CACT,kBAAkB,CAAC,KAAK,EAAE;gBACzB,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa;gBACvE,KAAK,EAAE,KAAK,KAAK,SAAS;gBAC1B,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;gBAC/B,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC/B,KAAK;aACL,CAAC,CACF,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,MAAM,0BAA0B,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvG,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,OAAO;QAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;IACF,CAAC;IAEO,SAAS,CAAC,IAA2B,EAAE,SAAkB;QAChE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CACd,IAAI,EACJ,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAC5C,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EACnC,SAAS,CACT,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,IAAc,EAAE,GAAW;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,iDAAiD,CAAC;QAC1D,CAAC;QACD,uGAAuG;QACvG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;;YACnE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACzG,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YACpB,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,OAAO;YACN,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/B,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;YACrC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,4EAA4E;AAC5E,qBAAqB;AACrB,4EAA4E;AAE5E;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAShC,YAAY,IAAgB,EAAE,KAAkB;QARvC,UAAK,GAAG,oBAAoB,CAAC;QACrB,SAAI,GAAG,CAAC,SAAS,EAAE,SAAS,CAAU,CAAC;QAChD,UAAK,GAAG,CAAC,CAAC;QAEV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,oFAAoF;IAC5E,SAAS,CAAC,GAAsB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC;QACxE,IAAI,aAAa;YAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACxG,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC;YACvC,MAAM,GAAG,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7D,KAAK,CAAC,IAAI,CACT,kBAAkB,CAAC,KAAK,EAAE;gBACzB,QAAQ,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;gBAC9C,SAAS,EAAE,QAAQ,IAAI,SAAS,EAAE,KAAK,IAAI,SAAS;gBACpD,KAAK,EAAE,CAAC,QAAQ;gBAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;gBAClD,MAAM;gBACN,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,OAAO,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9D,KAAK;aACL,CAAC,CACF,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvG,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,OAAO;QAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;;gBAClG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO;QACR,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,OAAO;YAChD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;IACF,CAAC;IAED,2FAA2F;IACnF,SAAS,CAAC,IAA2B,EAAE,SAAkB;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACjF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAChG,CAAC;IAEO,MAAM,CAAC,GAAW;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,OAAO,EAAE,CAAC;gBACb,OAAO,OAAO,CAAC;YAChB,CAAC;QACF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YACpB,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,OAAO;YACN,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/B,OAAO,CAAC,oBAAoB,EAAE,aAAa,CAAC;YAC5C,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,0GAA0G;AAC1G,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,KAAkB;IACtE,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO,QAAQ,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;IAC9F,CAAC,CAAC;IACF,OAAO,IAAI,UAAU,CAAqB,IAAI,EAAE,UAAU,EAAE;QAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG;QAC/B,OAAO,EAAE,GAAG,EAAE;YACb,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;YACjE,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,WAAW;gBACxB,CAAC,CAAC,aAAa,WAAW,EAAE;gBAC5B,CAAC,CAAC,SAAS;oBACV,CAAC,CAAC,aAAa,SAAS,EAAE;oBAC1B,CAAC,CAAC,6BAA6B,CAAC;YAClC,MAAM,MAAM,GAA2B,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;YACjC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,GAAG,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE;gBAAE,OAAO,mCAAmC,CAAC;YACnF,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;QAClB,CAAC;KACD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/** Scalar model settings: reasoning, input modalities, cost rates, and the model-specific API override. */\n\nimport \"../keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { builtinDefaults } from \"../catalog.ts\";\nimport { API_TYPES, INPUT_TYPES, type InputType, truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport { ChoicePane, InlineEdit, moveSelection } from \"./controls.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { baseUrlHint, validateBaseUrlValue } from \"./provider-fields.ts\";\nimport { isPrintableInput, renderInfoLine, renderKeyValueLine, renderPlainLine } from \"./value-row.ts\";\n\n// -------------------------------------------------------------------------\n// reasoning\n// -------------------------------------------------------------------------\n\nconst REASONING_OPTIONS = [\n\t{ label: \"true\", value: true },\n\t{ label: \"false\", value: false },\n\t{ label: \"default (false)\", value: undefined },\n] as const;\n\n/** Radio sub-page for reasoning — consistent with the other nested model settings. */\nexport function createReasoningPane(host: EditorHost, model: ModelHandle): EditorPane {\n\treturn new ChoicePane<boolean | undefined>(host, \"reasoning\", {\n\t\tcurrent: () => model.read().reasoning,\n\t\tchoices: () => REASONING_OPTIONS.map((option) => ({ ...option, dim: option.value === undefined })),\n\t\tchoose: (value) => {\n\t\t\tmodel.setField([\"reasoning\"], value === undefined ? DELETE : value);\n\t\t\treturn undefined;\n\t\t},\n\t});\n}\n\n// -------------------------------------------------------------------------\n// input modalities\n// -------------------------------------------------------------------------\n\nexport class InputTypesPane implements EditorPane {\n\treadonly crumb = \"input\";\n\tprivate index = 0;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate selected(): Set<string> {\n\t\treturn new Set(this.model.read().input ?? [\"text\"]);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst selected = this.selected();\n\t\tconst lines = INPUT_TYPES.map((type, rowIndex) =>\n\t\t\trenderPlainLine(theme, type, {\n\t\t\t\tchecked: selected.has(type),\n\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.model.read().input === undefined) {\n\t\t\tlines.push(renderInfoLine(theme, \"Not set — the runtime default is [text].\", width));\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst next = moveSelection(kb, data, this.index, INPUT_TYPES.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 type: InputType = INPUT_TYPES[this.index]!;\n\t\t\tconst selected = this.selected();\n\t\t\tif (selected.has(type)) {\n\t\t\t\tif (selected.size === 1) {\n\t\t\t\t\tthis.error = \"At least one input type must stay selected.\";\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tselected.delete(type);\n\t\t\t} else {\n\t\t\t\tselected.add(type);\n\t\t\t}\n\t\t\tthis.error = undefined;\n\t\t\tconst next = INPUT_TYPES.filter((entry) => selected.has(entry));\n\t\t\tthis.model.setField([\"input\"], [...next]);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\tkeyHint(\"app.list.toggle\", \"toggle\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"done\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// cost\n// -------------------------------------------------------------------------\n\nconst COST_RATES = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const;\ntype CostRate = (typeof COST_RATES)[number];\n\nexport class CostPane implements EditorPane {\n\treadonly crumb = \"cost\";\n\tprivate index = 0;\n\tprivate readonly edit: InlineEdit<CostRate>;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.edit = new InlineEdit(() => host.refresh());\n\t\tthis.model = model;\n\t}\n\n\tprivate cost(): Record<CostRate, number> | undefined {\n\t\tconst cost = this.model.read().cost;\n\t\tif (!cost) return undefined;\n\t\treturn { input: cost.input, output: cost.output, cacheRead: cost.cacheRead, cacheWrite: cost.cacheWrite };\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst cost = this.cost();\n\t\tconst lines: string[] = [];\n\t\tfor (const [rowIndex, rate] of COST_RATES.entries()) {\n\t\t\tconst value = cost?.[rate];\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: rate,\n\t\t\t\t\tvalueText: value === undefined ? \"0 (default)\" : `$${value} / M tokens`,\n\t\t\t\t\tunset: value === undefined,\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting: this.edit.editor(rate),\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst tiers = this.model.read().cost?.tiers;\n\t\tif (tiers && tiers.length > 0) {\n\t\t\tlines.push(renderInfoLine(theme, `tiers: ${tiers.length} (read-only; kept as-is)`, width));\n\t\t}\n\t\tif (this.edit.error) lines.push(theme.fg(\"error\", truncate(this.edit.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.edit.handleInput(data, kb)) return;\n\t\tconst next = moveSelection(kb, data, this.index, COST_RATES.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, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.beginEdit(\"tweak\");\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tthis.beginEdit(\"overwrite\", data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate beginEdit(mode: \"overwrite\" | \"tweak\", firstData?: string): void {\n\t\tconst rate = COST_RATES[this.index]!;\n\t\tconst current = this.cost()?.[rate];\n\t\tthis.edit.begin(\n\t\t\trate,\n\t\t\tcurrent === undefined ? \"\" : String(current),\n\t\t\tmode,\n\t\t\tthis.focused,\n\t\t\t(value) => this.commit(rate, value),\n\t\t\tfirstData,\n\t\t);\n\t}\n\n\tprivate commit(rate: CostRate, raw: string): string | undefined {\n\t\tconst value = raw.trim();\n\t\tconst parsed = value === \"\" ? 0 : Number(value);\n\t\tif (!Number.isFinite(parsed) || parsed < 0) {\n\t\t\treturn \"cost rates must be finite non-negative numbers.\";\n\t\t}\n\t\t// A cost object must stay complete: first edit materializes the other rates as 0; tiers are preserved.\n\t\tif (this.model.read().cost) this.model.setField([\"cost\", rate], parsed);\n\t\telse this.model.setField([\"cost\"], { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, [rate]: parsed });\n\t\treturn undefined;\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.edit.setFocused(focused);\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.edit.editing;\n\t}\n\n\thints(): string {\n\t\tif (this.edit.editing)\n\t\t\treturn [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"overwrite\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Model-Specific API\n// -------------------------------------------------------------------------\n\n/**\n * Model-level baseUrl / API Type overrides. Unset rows show the inherited\n * provider or built-in value dimmed; typing on a row (or editing the shown\n * value) writes an override, clearing it returns to inheritance.\n */\nexport class ModelSpecificApiPane implements EditorPane {\n\treadonly crumb = \"Model-Specific API\";\n\tprivate readonly rows = [\"baseUrl\", \"apiType\"] as const;\n\tprivate index = 0;\n\tprivate readonly edit: InlineEdit<\"baseUrl\">;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.edit = new InlineEdit(() => host.refresh());\n\t\tthis.model = model;\n\t}\n\n\t/** Where an unset model field resolves from; undefined when nothing resolves it. */\n\tprivate inherited(key: \"api\" | \"baseUrl\"): { value: string; via: \"provider\" | \"built-in\" } | undefined {\n\t\tconst provider = this.host.store.getProvider(this.host.providerId);\n\t\tconst providerValue = key === \"api\" ? provider?.api : provider?.baseUrl;\n\t\tif (providerValue) return { value: providerValue, via: \"provider\" };\n\t\tconst current = this.model.read();\n\t\tconst effective = key === \"api\" ? this.host.effectiveApi(current) : this.host.effectiveBaseUrl(current);\n\t\treturn effective ? { value: effective, via: \"built-in\" } : undefined;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read();\n\t\tconst lines: string[] = [];\n\t\tfor (const [rowIndex, row] of this.rows.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst key = row === \"apiType\" ? \"api\" : row;\n\t\t\tconst override = current[key];\n\t\t\tconst inherited = override ? undefined : this.inherited(key);\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: row === \"apiType\" ? \"API Type\" : row,\n\t\t\t\t\tvalueText: override ?? inherited?.value ?? \"not set\",\n\t\t\t\t\tunset: !override,\n\t\t\t\t\tnote: inherited ? `· ${inherited.via}` : undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting: row === \"baseUrl\" ? this.edit.editor(row) : undefined,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.edit.error) lines.push(theme.fg(\"error\", truncate(this.edit.error, Math.max(10, width - 2))));\n\t\tconst hint = baseUrlHint(this.host.effectiveApi(current));\n\t\tif (hint) lines.push(renderInfoLine(theme, hint, width));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.edit.handleInput(data, kb)) return;\n\t\tconst next = moveSelection(kb, data, this.index, this.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, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.rows[this.index] === \"apiType\") this.host.pushPane(createModelApiPane(this.host, this.model));\n\t\t\telse this.beginEdit(\"tweak\");\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tif (this.rows[this.index] === \"apiType\") return;\n\t\t\tthis.beginEdit(\"overwrite\", data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/** Tweak starts from the inherited value, so adjusting it writes the override directly. */\n\tprivate beginEdit(mode: \"overwrite\" | \"tweak\", firstData?: string): void {\n\t\tconst base = this.model.read().baseUrl ?? this.inherited(\"baseUrl\")?.value ?? \"\";\n\t\tthis.edit.begin(\"baseUrl\", base, mode, this.focused, (value) => this.commit(value), firstData);\n\t}\n\n\tprivate commit(raw: string): string | undefined {\n\t\tconst value = raw.trim();\n\t\tif (value) {\n\t\t\tconst invalid = validateBaseUrlValue(value);\n\t\t\tif (invalid) {\n\t\t\t\treturn invalid;\n\t\t\t}\n\t\t}\n\t\tthis.model.setField([\"baseUrl\"], value === \"\" ? DELETE : value);\n\t\treturn undefined;\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.edit.setFocused(focused);\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.edit.editing;\n\t}\n\n\thints(): string {\n\t\tif (this.edit.editing)\n\t\t\treturn [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"overwrite\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit / open\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n/** Single-select model api: the inherited default plus every known API tag. Enter applies and returns. */\nexport function createModelApiPane(host: EditorHost, model: ModelHandle): EditorPane {\n\tconst fallback = () => {\n\t\tconst provider = host.store.getProvider(host.providerId);\n\t\treturn provider?.api ?? builtinDefaults(host.providerId, model.read().id, provider?.api).api;\n\t};\n\treturn new ChoicePane<string | undefined>(host, \"API Type\", {\n\t\tcurrent: () => model.read().api,\n\t\tchoices: () => {\n\t\t\tconst providerApi = host.store.getProvider(host.providerId)?.api;\n\t\t\tconst inherited = fallback();\n\t\t\tconst label = providerApi\n\t\t\t\t? `provider: ${providerApi}`\n\t\t\t\t: inherited\n\t\t\t\t\t? `built-in: ${inherited}`\n\t\t\t\t\t: \"no provider or built-in API\";\n\t\t\tconst values: (string | undefined)[] = [undefined, ...API_TYPES];\n\t\t\tconst current = model.read().api;\n\t\t\tif (current && !values.includes(current)) values.push(current);\n\t\t\treturn values.map((value) => ({ value, label: value ?? label, dim: value === undefined }));\n\t\t},\n\t\tchoose: (value) => {\n\t\t\tif (value === undefined && !fallback()) return \"Nothing to inherit — pick an API.\";\n\t\t\tmodel.setField([\"api\"], value ?? DELETE);\n\t\t\treturn undefined;\n\t\t},\n\t});\n}\n"]}
@@ -3,9 +3,9 @@ import type { TUI } from "@earendil-works/pi-tui";
3
3
  import type { KeybindingsManager } from "../../../core/keybindings.ts";
4
4
  import type { ModelsJsonModel } from "../../../core/model-config.ts";
5
5
  import type { Theme } from "../../../modes/interactive/theme/theme.ts";
6
+ import type { ProviderEdits, ProviderView } from "../editing.ts";
6
7
  import type { ProbeModel, ProbeResult } from "../probe.ts";
7
- import type { RefreshCoordinator } from "../refresh.ts";
8
- import type { ModelsJsonStore } from "../store.ts";
8
+ export type { ModelHandle } from "../editing.ts";
9
9
  export interface EditorPane {
10
10
  /** Drill-down label shown at the top of the right column while this sub-pane is open, e.g. "cost". */
11
11
  readonly crumb?: string;
@@ -32,29 +32,15 @@ export interface EditorPane {
32
32
  hints(): string;
33
33
  dispose?(): void;
34
34
  }
35
- /** Read/write access to the model under edit, draft or persisted. */
36
- export interface ModelHandle {
37
- readonly isDraft: boolean;
38
- /** Current values; drafts carry the unsubmitted partial object. */
39
- read(): Partial<ModelsJsonModel> & {
40
- id?: string;
41
- };
42
- /** Drafts mutate memory; persisted models queue a store op and schedule a save. */
43
- setField(path: readonly string[], value: unknown): void;
44
- /** Renaming an identity waits for storage before the UI starts using the new id. */
45
- rename(newId: string): Promise<string | undefined>;
46
- }
47
35
  export interface EditorHost {
48
36
  readonly tui: TUI;
49
37
  readonly theme: Theme;
50
38
  readonly keybindings: KeybindingsManager;
51
- readonly store: ModelsJsonStore;
52
- readonly refresher: RefreshCoordinator;
39
+ readonly store: ProviderView;
40
+ readonly edits: Pick<ProviderEdits, "setProviderField" | "removeModel" | "batch">;
53
41
  readonly providerId: string;
54
42
  pushPane(pane: EditorPane): void;
55
43
  popPane(): void;
56
- /** Queue a mutation op, mark the provider touched, and repaint. */
57
- mutate(apply: () => void): void;
58
44
  refresh(): void;
59
45
  notify(message: string, type: "info" | "warning" | "error"): void;
60
46
  /** Effective api/baseUrl after provider-level and builtin-overlay fallbacks. */
@@ -1 +1 @@
1
- {"version":3,"file":"pane.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/pane.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pane.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/pane.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pane.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/pane.ts"],"names":[],"mappings":"AAAA,sEAAsE","sourcesContent":["/** Pane contract for the /provider two-pane editor's right column. */\n\nimport type { TUI } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { ProbeModel, ProbeResult } from \"../probe.ts\";\nimport type { RefreshCoordinator } from \"../refresh.ts\";\nimport type { ModelsJsonStore } from \"../store.ts\";\n\nexport interface EditorPane {\n\t/** Drill-down label shown at the top of the right column while this sub-pane is open, e.g. \"cost\". */\n\treadonly crumb?: string;\n\t/**\n\t * Scroll position for the editor's fixed-height right column. `top` and\n\t * `bottom` count pinned render() lines that never scroll (filter inputs,\n\t * status/error lines); `cursor` is the render() line index the window\n\t * keeps visible. Omitted: no scrolling, content is expected to fit.\n\t */\n\tscrollWindow?(): { top?: number; bottom?: number; cursor?: number };\n\t/** Body lines for the right column. */\n\trender(width: number): string[];\n\t/** Input while the right column is focused. */\n\thandleInput(data: string): void;\n\t/** True while a text editor inside the pane owns ←/→ (cursor movement beats pane switching). */\n\tisEditing?(): boolean;\n\t/** Focus propagation for embedded Input components (IME cursor placement). */\n\tsetFocused(focused: boolean): void;\n\t/** Contextual footer hint line. */\n\thints(): string;\n\tdispose?(): void;\n}\n\n/** Read/write access to the model under edit, draft or persisted. */\nexport interface ModelHandle {\n\treadonly isDraft: boolean;\n\t/** Current values; drafts carry the unsubmitted partial object. */\n\tread(): Partial<ModelsJsonModel> & { id?: string };\n\t/** Drafts mutate memory; persisted models queue a store op and schedule a save. */\n\tsetField(path: readonly string[], value: unknown): void;\n\t/** Renaming an identity waits for storage before the UI starts using the new id. */\n\trename(newId: string): Promise<string | undefined>;\n}\n\nexport interface EditorHost {\n\treadonly tui: TUI;\n\treadonly theme: Theme;\n\treadonly keybindings: KeybindingsManager;\n\treadonly store: ModelsJsonStore;\n\treadonly refresher: RefreshCoordinator;\n\treadonly providerId: string;\n\tpushPane(pane: EditorPane): void;\n\tpopPane(): void;\n\t/** Queue a mutation op, mark the provider touched, and repaint. */\n\tmutate(apply: () => void): void;\n\trefresh(): void;\n\tnotify(message: string, type: \"info\" | \"warning\" | \"error\"): void;\n\t/** Effective api/baseUrl after provider-level and builtin-overlay fallbacks. */\n\teffectiveApi(model?: Partial<ModelsJsonModel>): string | undefined;\n\teffectiveBaseUrl(model?: Partial<ModelsJsonModel>): string | undefined;\n\t/** Commit the pending model draft (id validation + addModel op); returns an error or undefined. */\n\tcommitModelDraft(): string | undefined;\n\t/** Drop the in-memory model draft; the left column returns to + Add Model. */\n\tdiscardModelDraft(): void;\n\t/** Current session model protection (§4.3): no delete/rename of the active model or its provider. */\n\tisCurrentModel(modelId: string): boolean;\n\tisCurrentProvider(): boolean;\n\t/** Last Fetch Models outcome shown next to the left-column action row. */\n\tsetFetchStatus(status: string | undefined): void;\n\t/** Refresh the provider, resolve auth canonically, and GET {baseUrl}/models. */\n\trunFetch(signal: AbortSignal): Promise<ProbeResult>;\n\t/** Validate + batch-add imported models, save once, refresh; returns an error or undefined. */\n\timportModels(models: readonly ProbeModel[], signal: AbortSignal): Promise<string | undefined>;\n\t/** Push an in-editor Yes/No confirm into the right column. */\n\tconfirm(message: string, actionLabel: string, action: () => void): void;\n\t/** A model was just removed: rebuild the left column and reset the right stack. */\n\tonModelRemoved(modelId: string): void;\n}\n"]}
1
+ {"version":3,"file":"pane.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/pane.ts"],"names":[],"mappings":"AAAA,sEAAsE","sourcesContent":["/** Pane contract for the /provider two-pane editor's right column. */\n\nimport type { TUI } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { ProviderEdits, ProviderView } from \"../editing.ts\";\nimport type { ProbeModel, ProbeResult } from \"../probe.ts\";\n\nexport type { ModelHandle } from \"../editing.ts\";\n\nexport interface EditorPane {\n\t/** Drill-down label shown at the top of the right column while this sub-pane is open, e.g. \"cost\". */\n\treadonly crumb?: string;\n\t/**\n\t * Scroll position for the editor's fixed-height right column. `top` and\n\t * `bottom` count pinned render() lines that never scroll (filter inputs,\n\t * status/error lines); `cursor` is the render() line index the window\n\t * keeps visible. Omitted: no scrolling, content is expected to fit.\n\t */\n\tscrollWindow?(): { top?: number; bottom?: number; cursor?: number };\n\t/** Body lines for the right column. */\n\trender(width: number): string[];\n\t/** Input while the right column is focused. */\n\thandleInput(data: string): void;\n\t/** True while a text editor inside the pane owns ←/→ (cursor movement beats pane switching). */\n\tisEditing?(): boolean;\n\t/** Focus propagation for embedded Input components (IME cursor placement). */\n\tsetFocused(focused: boolean): void;\n\t/** Contextual footer hint line. */\n\thints(): string;\n\tdispose?(): void;\n}\n\nexport interface EditorHost {\n\treadonly tui: TUI;\n\treadonly theme: Theme;\n\treadonly keybindings: KeybindingsManager;\n\treadonly store: ProviderView;\n\treadonly edits: Pick<ProviderEdits, \"setProviderField\" | \"removeModel\" | \"batch\">;\n\treadonly providerId: string;\n\tpushPane(pane: EditorPane): void;\n\tpopPane(): void;\n\trefresh(): void;\n\tnotify(message: string, type: \"info\" | \"warning\" | \"error\"): void;\n\t/** Effective api/baseUrl after provider-level and builtin-overlay fallbacks. */\n\teffectiveApi(model?: Partial<ModelsJsonModel>): string | undefined;\n\teffectiveBaseUrl(model?: Partial<ModelsJsonModel>): string | undefined;\n\t/** Commit the pending model draft (id validation + addModel op); returns an error or undefined. */\n\tcommitModelDraft(): string | undefined;\n\t/** Drop the in-memory model draft; the left column returns to + Add Model. */\n\tdiscardModelDraft(): void;\n\t/** Current session model protection (§4.3): no delete/rename of the active model or its provider. */\n\tisCurrentModel(modelId: string): boolean;\n\tisCurrentProvider(): boolean;\n\t/** Last Fetch Models outcome shown next to the left-column action row. */\n\tsetFetchStatus(status: string | undefined): void;\n\t/** Refresh the provider, resolve auth canonically, and GET {baseUrl}/models. */\n\trunFetch(signal: AbortSignal): Promise<ProbeResult>;\n\t/** Validate + batch-add imported models, save once, refresh; returns an error or undefined. */\n\timportModels(models: readonly ProbeModel[], signal: AbortSignal): Promise<string | undefined>;\n\t/** Push an in-editor Yes/No confirm into the right column. */\n\tconfirm(message: string, actionLabel: string, action: () => void): void;\n\t/** A model was just removed: rebuild the left column and reset the right stack. */\n\tonModelRemoved(modelId: string): void;\n}\n"]}
@@ -19,9 +19,7 @@ export declare function validateBaseUrlValue(value: string): string | undefined;
19
19
  export declare class ApiAuthPane implements EditorPane {
20
20
  private readonly rows;
21
21
  private index;
22
- private editing;
23
- private editingRow;
24
- private error;
22
+ private readonly edit;
25
23
  private focused;
26
24
  private readonly host;
27
25
  private readonly registry;
@@ -42,20 +40,5 @@ export declare class ApiAuthPane implements EditorPane {
42
40
  * returns. Clearing is refused while any model still resolves its api from
43
41
  * the provider — set a model-level API under Model-Specific API first.
44
42
  */
45
- export declare class ApiTypePane implements EditorPane {
46
- readonly crumb = "API Type";
47
- private index;
48
- private focused;
49
- private error;
50
- private readonly host;
51
- constructor(host: EditorHost);
52
- /** undefined first = not set; a custom api already stored is preserved and appended. */
53
- private options;
54
- private unsetLabel;
55
- render(width: number): string[];
56
- scrollWindow(): ScrollWindowInfo;
57
- handleInput(data: string): void;
58
- setFocused(focused: boolean): void;
59
- hints(): string;
60
- }
43
+ export declare function createProviderApiPane(host: EditorHost): EditorPane;
61
44
  //# sourceMappingURL=provider-fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-fields.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/provider-fields.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,OAAO,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAKrE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAKN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAevE;AAED,2GAA2G;AAC3G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CActE;AAED;;;;GAIG;AACH,qBAAa,WAAY,YAAW,UAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;IAClE,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+C;gBAC5D,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAKpF,OAAO,CAAC,QAAQ;IAIhB,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,eAAe;IAMvB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAqE/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoC/B,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,MAAM;IA8Bd,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAUf;AAED;;;;GAIG;AACH,qBAAa,WAAY,YAAW,UAAU;IAC7C,QAAQ,CAAC,KAAK,cAAc;IAC5B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAqB;IAElC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;gBACtB,IAAI,EAAE,UAAU;IAQ5B,wFAAwF;IACxF,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,UAAU;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAa/B,YAAY,IAAI,gBAAgB;IAIhC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAsC/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAOf"}
1
+ {"version":3,"file":"provider-fields.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/provider-fields.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,OAAO,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAMrE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAwD,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE7G;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAevE;AAED,2GAA2G;AAC3G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CActE;AAED;;;;GAIG;AACH,qBAAa,WAAY,YAAW,UAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;IAClE,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IACxD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+C;gBAC5D,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAMpF,OAAO,CAAC,QAAQ;IAIhB,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,eAAe;IAMvB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4C/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA2B/B,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,MAAM;IAsBd,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAUf;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CA0BlE"}
@@ -4,7 +4,8 @@ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybi
4
4
  import { builtinDefaults } from "../catalog.js";
5
5
  import { API_TYPES, maskApiKey, plural, truncate } from "../constants.js";
6
6
  import { DELETE } from "../store.js";
7
- import { isPrintableInput, renderInfoLine, renderKeyValueLine, renderPlainLine, ValueEditor, } from "./value-row.js";
7
+ import { ChoicePane, InlineEdit, moveSelection } from "./controls.js";
8
+ import { isPrintableInput, renderInfoLine, renderKeyValueLine } from "./value-row.js";
8
9
  /**
9
10
  * One-line guidance on the baseUrl shape an API tag expects: pi-ai delegates
10
11
  * URL assembly to the vendor SDKs, so OpenAI-style tags need the version path
@@ -54,6 +55,7 @@ export class ApiAuthPane {
54
55
  this.index = 0;
55
56
  this.focused = false;
56
57
  this.host = host;
58
+ this.edit = new InlineEdit(() => host.refresh());
57
59
  this.registry = registry;
58
60
  }
59
61
  provider() {
@@ -66,7 +68,7 @@ export class ApiAuthPane {
66
68
  bottomNoteCount() {
67
69
  const status = this.registry.getProviderAuthStatus(this.host.providerId);
68
70
  const hint = baseUrlHint(this.provider()?.api);
69
- return (this.error ? 1 : 0) + (status.configured ? 1 : 0) + 1 + (hint ? 1 : 0);
71
+ return (this.edit.error ? 1 : 0) + (status.configured ? 1 : 0) + 1 + (hint ? 1 : 0);
70
72
  }
71
73
  render(width) {
72
74
  const theme = this.host.theme;
@@ -74,44 +76,20 @@ export class ApiAuthPane {
74
76
  const lines = [];
75
77
  for (const [rowIndex, row] of this.rows.entries()) {
76
78
  const active = rowIndex === this.index;
77
- if (row === "baseUrl") {
78
- const value = provider?.baseUrl;
79
- lines.push(renderKeyValueLine(theme, {
80
- keyLabel: "baseUrl",
81
- valueText: value ?? "not set",
82
- unset: !value,
83
- active,
84
- paneFocused: this.focused,
85
- editing: this.editingRow === "baseUrl" ? this.editing : undefined,
86
- width,
87
- }));
88
- }
89
- else if (row === "apiKey") {
90
- const value = provider?.apiKey;
91
- lines.push(renderKeyValueLine(theme, {
92
- keyLabel: "apiKey",
93
- valueText: value ? maskApiKey(value) : "not set",
94
- unset: !value,
95
- active,
96
- paneFocused: this.focused,
97
- editing: this.editingRow === "apiKey" ? this.editing : undefined,
98
- width,
99
- }));
100
- }
101
- else {
102
- const value = provider?.api;
103
- lines.push(renderKeyValueLine(theme, {
104
- keyLabel: "API Type",
105
- valueText: value ?? "not set",
106
- unset: !value,
107
- active,
108
- paneFocused: this.focused,
109
- width,
110
- }));
111
- }
112
- }
113
- if (this.error)
114
- lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
79
+ const key = row === "apiType" ? "api" : row;
80
+ const value = provider?.[key];
81
+ lines.push(renderKeyValueLine(theme, {
82
+ keyLabel: row === "apiType" ? "API Type" : row,
83
+ valueText: value ? (row === "apiKey" ? maskApiKey(value) : value) : "not set",
84
+ unset: !value,
85
+ active,
86
+ paneFocused: this.focused,
87
+ editing: row === "apiType" ? undefined : this.edit.editor(row),
88
+ width,
89
+ }));
90
+ }
91
+ if (this.edit.error)
92
+ lines.push(theme.fg("error", truncate(this.edit.error, Math.max(10, width - 2))));
115
93
  const status = this.registry.getProviderAuthStatus(this.host.providerId);
116
94
  if (status.configured && status.source === "stored") {
117
95
  lines.push(renderInfoLine(theme, "A stored credential (auth.json) takes precedence over the apiKey here.", width));
@@ -127,20 +105,11 @@ export class ApiAuthPane {
127
105
  }
128
106
  handleInput(data) {
129
107
  const kb = this.host.keybindings;
130
- if (this.editing) {
131
- if (kb.matches(data, "tui.select.up") || kb.matches(data, "tui.select.down"))
132
- return; // stay while editing
133
- this.editing.handleInput(data);
134
- this.host.refresh();
135
- return;
136
- }
137
- if (kb.matches(data, "tui.select.up")) {
138
- this.index = this.index === 0 ? this.rows.length - 1 : this.index - 1;
139
- this.host.refresh();
108
+ if (this.edit.handleInput(data, kb))
140
109
  return;
141
- }
142
- if (kb.matches(data, "tui.select.down")) {
143
- this.index = (this.index + 1) % this.rows.length;
110
+ const next = moveSelection(kb, data, this.index, this.rows.length);
111
+ if (next !== undefined) {
112
+ this.index = next;
144
113
  this.host.refresh();
145
114
  return;
146
115
  }
@@ -151,7 +120,7 @@ export class ApiAuthPane {
151
120
  if (kb.matches(data, "tui.select.confirm")) {
152
121
  const row = this.rows[this.index];
153
122
  if (row === "apiType")
154
- this.host.pushPane(new ApiTypePane(this.host));
123
+ this.host.pushPane(createProviderApiPane(this.host));
155
124
  else
156
125
  this.beginEdit("tweak");
157
126
  return;
@@ -166,35 +135,16 @@ export class ApiAuthPane {
166
135
  }
167
136
  beginEdit(mode, firstData) {
168
137
  const row = this.rows[this.index];
169
- if (row !== "baseUrl" && row !== "apiKey")
138
+ if (row === "apiType")
170
139
  return;
171
- const current = row === "baseUrl" ? (this.provider()?.baseUrl ?? "") : (this.provider()?.apiKey ?? "");
172
- const editor = new ValueEditor({
173
- onCommit: (value) => this.commit(row, value),
174
- onCancel: () => {
175
- this.editing = undefined;
176
- this.editingRow = undefined;
177
- this.error = undefined;
178
- this.host.refresh();
179
- },
180
- });
181
- this.editing = editor;
182
- this.editingRow = row;
183
- editor.focused = this.focused;
184
- if (mode === "overwrite")
185
- editor.beginOverwrite(firstData);
186
- else
187
- editor.beginTweak(current);
188
- this.host.refresh();
140
+ this.edit.begin(row, this.provider()?.[row] ?? "", mode, this.focused, (value) => this.commit(row, value), firstData);
189
141
  }
190
142
  commit(row, raw) {
191
143
  const value = raw.trim();
192
144
  if (row === "baseUrl" && value) {
193
145
  const invalid = validateBaseUrlValue(value);
194
146
  if (invalid) {
195
- this.error = invalid;
196
- this.host.refresh();
197
- return;
147
+ return invalid;
198
148
  }
199
149
  }
200
150
  if (row === "baseUrl" && !value) {
@@ -204,26 +154,21 @@ export class ApiAuthPane {
204
154
  .getModels(this.host.providerId)
205
155
  .every((model) => model.baseUrl !== undefined);
206
156
  if (!builtin && !modelsCovered && this.host.store.getModels(this.host.providerId).length > 0) {
207
- this.error = "baseUrl cannot be removed while models rely on it.";
208
- this.host.refresh();
209
- return;
157
+ return "baseUrl cannot be removed while models rely on it.";
210
158
  }
211
159
  }
212
- this.error = undefined;
213
- this.editing = undefined;
214
- this.editingRow = undefined;
215
- this.host.mutate(() => this.host.store.setProviderField(this.host.providerId, [row], value === "" ? DELETE : value));
160
+ this.host.edits.setProviderField([row], value === "" ? DELETE : value);
161
+ return undefined;
216
162
  }
217
163
  setFocused(focused) {
218
164
  this.focused = focused;
219
- if (this.editing)
220
- this.editing.focused = focused;
165
+ this.edit.setFocused(focused);
221
166
  }
222
167
  isEditing() {
223
- return this.editing !== undefined;
168
+ return this.edit.editing;
224
169
  }
225
170
  hints() {
226
- if (this.editing) {
171
+ if (this.edit.editing) {
227
172
  return [keyHint("tui.input.submit", "save"), keyHint("tui.select.cancel", "cancel")].join(" ");
228
173
  }
229
174
  return [
@@ -238,90 +183,32 @@ export class ApiAuthPane {
238
183
  * returns. Clearing is refused while any model still resolves its api from
239
184
  * the provider — set a model-level API under Model-Specific API first.
240
185
  */
241
- export class ApiTypePane {
242
- constructor(host) {
243
- this.crumb = "API Type";
244
- this.index = 0;
245
- this.focused = false;
246
- this.host = host;
247
- const current = this.host.store.getProvider(this.host.providerId)?.api;
248
- const options = this.options();
249
- this.index = Math.max(0, options.indexOf(current));
250
- }
251
- /** undefined first = not set; a custom api already stored is preserved and appended. */
252
- options() {
253
- const current = this.host.store.getProvider(this.host.providerId)?.api;
254
- const base = [undefined, ...API_TYPES];
255
- if (current && !API_TYPES.includes(current))
256
- base.push(current);
257
- return base;
258
- }
259
- unsetLabel() {
260
- const fallback = builtinDefaults(this.host.providerId).api;
261
- return fallback ? `not set (built-in default: ${fallback})` : "not set (models define their own)";
262
- }
263
- render(width) {
264
- const theme = this.host.theme;
265
- const current = this.host.store.getProvider(this.host.providerId)?.api;
266
- const lines = this.options().map((option, rowIndex) => {
267
- const active = rowIndex === this.index;
268
- const selected = option === current;
269
- const label = `${selected ? "●" : "○"} ${option ?? this.unsetLabel()}`;
270
- return renderPlainLine(theme, label, { active, paneFocused: this.focused, dim: option === undefined, width });
271
- });
272
- if (this.error)
273
- lines.push(renderInfoLine(theme, this.error, width));
274
- return lines;
275
- }
276
- scrollWindow() {
277
- return { cursor: this.index, bottom: this.error ? 1 : 0 };
278
- }
279
- handleInput(data) {
280
- const kb = this.host.keybindings;
281
- const options = this.options();
282
- if (kb.matches(data, "tui.select.up")) {
283
- this.index = this.index === 0 ? options.length - 1 : this.index - 1;
284
- this.host.refresh();
285
- return;
286
- }
287
- if (kb.matches(data, "tui.select.down")) {
288
- this.index = (this.index + 1) % options.length;
289
- this.host.refresh();
290
- return;
291
- }
292
- if (kb.matches(data, "tui.select.cancel")) {
293
- this.host.popPane();
294
- return;
295
- }
296
- if (kb.matches(data, "tui.select.confirm") || kb.matches(data, "app.list.toggle")) {
297
- const option = options[this.index];
298
- if (option === undefined) {
299
- const uncovered = this.host.store
300
- .getModels(this.host.providerId)
301
- .filter((model) => !model.api && !builtinDefaults(this.host.providerId, model.id).api);
302
- if (uncovered.length > 0) {
303
- this.error =
304
- uncovered.length === 1
305
- ? `Model "${uncovered[0].id}" resolves its API from here — give it a model-level API first.`
306
- : `${uncovered.length} ${plural(uncovered.length, "model")} resolve their API from here — give them model-level APIs first.`;
307
- this.host.refresh();
308
- return;
309
- }
186
+ export function createProviderApiPane(host) {
187
+ const current = () => host.store.getProvider(host.providerId)?.api;
188
+ return new ChoicePane(host, "API Type", {
189
+ current,
190
+ choices: () => {
191
+ const fallback = builtinDefaults(host.providerId).api;
192
+ const label = fallback ? `not set (built-in default: ${fallback})` : "not set (models define their own)";
193
+ const values = [undefined, ...API_TYPES];
194
+ const value = current();
195
+ if (value && !values.includes(value))
196
+ values.push(value);
197
+ return values.map((value) => ({ value, label: value ?? label, dim: value === undefined }));
198
+ },
199
+ choose: (api) => {
200
+ if (api === undefined) {
201
+ const uncovered = host.store
202
+ .getModels(host.providerId)
203
+ .filter((model) => !model.api && !builtinDefaults(host.providerId, model.id).api);
204
+ if (uncovered.length)
205
+ return uncovered.length === 1
206
+ ? `Model "${uncovered[0].id}" resolves its API from here — give it a model-level API first.`
207
+ : `${uncovered.length} ${plural(uncovered.length, "model")} resolve their API from here — give them model-level APIs first.`;
310
208
  }
311
- this.error = undefined;
312
- this.host.mutate(() => this.host.store.setProviderField(this.host.providerId, ["api"], option ?? DELETE));
313
- this.host.popPane();
314
- }
315
- }
316
- setFocused(focused) {
317
- this.focused = focused;
318
- }
319
- hints() {
320
- return [
321
- rawKeyHint("↑↓", "move"),
322
- keyHint("tui.select.confirm", "select"),
323
- keyHint("tui.select.cancel", "back"),
324
- ].join(" ");
325
- }
209
+ host.edits.setProviderField(["api"], api ?? DELETE);
210
+ return undefined;
211
+ },
212
+ });
326
213
  }
327
214
  //# sourceMappingURL=provider-fields.js.map