@astralyn/pi 0.87.6 → 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 (924) hide show
  1. package/CHANGELOG.md +69 -9
  2. package/README.md +3 -3
  3. package/dist/bun/runtime-setup.js +4 -1
  4. package/dist/bun/runtime-setup.js.map +1 -1
  5. package/dist/bundle/chunks/anthropic-messages-CG2BSDQS.js +6 -0
  6. package/dist/bundle/chunks/anthropic.js +2 -2
  7. package/dist/bundle/chunks/azure-openai-responses-PBA4QKCM.js +2 -0
  8. package/dist/bundle/chunks/bedrock-converse-stream.js +8 -8
  9. package/dist/bundle/chunks/{chunk-NW5FIDD7.js → chunk-6UFFVA7M.js} +3 -3
  10. package/dist/bundle/chunks/chunk-G4RY3GN7.js +11 -0
  11. package/dist/bundle/chunks/chunk-GCKVOFWP.js +2 -0
  12. package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
  13. package/dist/bundle/chunks/{chunk-4W4Q2H6W.js → chunk-HESRDUKO.js} +1000 -625
  14. package/dist/bundle/chunks/chunk-MPDALHNJ.js +2 -0
  15. package/dist/bundle/chunks/chunk-OO6DJ3CL.js +31 -0
  16. package/dist/bundle/chunks/{chunk-LPQCB2VJ.js → chunk-PFZKRUMO.js} +2 -2
  17. package/dist/bundle/chunks/chunk-SGLYRVQL.js +2 -0
  18. package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
  19. package/dist/bundle/chunks/chunk-V66VGGOM.js +2 -0
  20. package/dist/bundle/chunks/chunk-Z2RKSI3O.js +2 -0
  21. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-YB7XPPP4.js +2 -0
  22. package/dist/bundle/chunks/codemode-worker.js +354 -0
  23. package/dist/bundle/chunks/github-copilot.js +1 -1
  24. package/dist/bundle/chunks/google-generative-ai-V5ZM5MCL.js +2 -0
  25. package/dist/bundle/chunks/google-vertex-22THOFP5.js +2 -0
  26. package/dist/bundle/chunks/llama-cpp-classify-R7DQLTQN.js +22 -0
  27. package/dist/bundle/chunks/meta.js +2 -0
  28. package/dist/bundle/chunks/mistral-conversations-WHSCJJWP.js +5 -0
  29. package/dist/bundle/chunks/openai-chatgpt.js +75 -0
  30. package/dist/bundle/chunks/openai-codex-responses-N7GDPBPP.js +10 -0
  31. package/dist/bundle/chunks/openai-codex.js +2 -2
  32. package/dist/bundle/chunks/openai-completions-RGGQK5UW.js +7 -0
  33. package/dist/bundle/chunks/openai-responses-3ZLD5JYI.js +3 -0
  34. package/dist/bundle/chunks/{openrouter-images-6XDE2CEW.js → openrouter-images-YP3YVB54.js} +1 -1
  35. package/dist/bundle/chunks/openrouter.js +2 -2
  36. package/dist/bundle/chunks/{pi-messages-MQMPIPNC.js → pi-messages-HZZ7GEEW.js} +2 -2
  37. package/dist/bundle/chunks/radius.js +2 -2
  38. package/dist/bundle/chunks/typesafe-system-one-RREJAKWB.js +2 -0
  39. package/dist/bundle/chunks/virtual-modules-4RQ2L6W4.js +2 -0
  40. package/dist/bundle/cli.js +1 -1
  41. package/dist/bundle/index.js +1 -1
  42. package/dist/bundle/rpc-entry.js +1 -1
  43. package/dist/cli/args.d.ts.map +1 -1
  44. package/dist/cli/args.js +5 -4
  45. package/dist/cli/args.js.map +1 -1
  46. package/dist/cli/startup-ui.d.ts.map +1 -1
  47. package/dist/cli/startup-ui.js +38 -30
  48. package/dist/cli/startup-ui.js.map +1 -1
  49. package/dist/config.d.ts +15 -4
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +33 -4
  52. package/dist/config.js.map +1 -1
  53. package/dist/core/agent-session-runtime.d.ts +1 -1
  54. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  55. package/dist/core/agent-session-runtime.js +13 -13
  56. package/dist/core/agent-session-runtime.js.map +1 -1
  57. package/dist/core/agent-session-services.d.ts +2 -2
  58. package/dist/core/agent-session-services.d.ts.map +1 -1
  59. package/dist/core/agent-session-services.js +14 -1
  60. package/dist/core/agent-session-services.js.map +1 -1
  61. package/dist/core/agent-session.d.ts +121 -36
  62. package/dist/core/agent-session.d.ts.map +1 -1
  63. package/dist/core/agent-session.js +518 -203
  64. package/dist/core/agent-session.js.map +1 -1
  65. package/dist/core/bug-report.js +1 -1
  66. package/dist/core/bug-report.js.map +1 -1
  67. package/dist/core/compaction/compaction.d.ts.map +1 -1
  68. package/dist/core/compaction/compaction.js +1 -22
  69. package/dist/core/compaction/compaction.js.map +1 -1
  70. package/dist/core/compaction/utils.d.ts +2 -1
  71. package/dist/core/compaction/utils.d.ts.map +1 -1
  72. package/dist/core/compaction/utils.js +25 -18
  73. package/dist/core/compaction/utils.js.map +1 -1
  74. package/dist/core/crash-log.d.ts.map +1 -1
  75. package/dist/core/crash-log.js +2 -1
  76. package/dist/core/crash-log.js.map +1 -1
  77. package/dist/core/export-html/template.css +10 -0
  78. package/dist/core/export-html/template.js +66 -17
  79. package/dist/core/extensions/distribution-api.d.ts +1 -1
  80. package/dist/core/extensions/distribution-api.d.ts.map +1 -1
  81. package/dist/core/extensions/distribution-api.js.map +1 -1
  82. package/dist/core/extensions/index.d.ts +2 -2
  83. package/dist/core/extensions/index.d.ts.map +1 -1
  84. package/dist/core/extensions/index.js.map +1 -1
  85. package/dist/core/extensions/loader.d.ts.map +1 -1
  86. package/dist/core/extensions/loader.js +67 -5
  87. package/dist/core/extensions/loader.js.map +1 -1
  88. package/dist/core/extensions/runner.d.ts +22 -3
  89. package/dist/core/extensions/runner.d.ts.map +1 -1
  90. package/dist/core/extensions/runner.js +124 -8
  91. package/dist/core/extensions/runner.js.map +1 -1
  92. package/dist/core/extensions/types.d.ts +310 -25
  93. package/dist/core/extensions/types.d.ts.map +1 -1
  94. package/dist/core/extensions/types.js.map +1 -1
  95. package/dist/core/extensions/wrapper.d.ts +2 -2
  96. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  97. package/dist/core/extensions/wrapper.js +3 -3
  98. package/dist/core/extensions/wrapper.js.map +1 -1
  99. package/dist/core/keybindings.d.ts +70 -5
  100. package/dist/core/keybindings.d.ts.map +1 -1
  101. package/dist/core/keybindings.js +15 -1
  102. package/dist/core/keybindings.js.map +1 -1
  103. package/dist/core/mcp-servers.d.ts +125 -0
  104. package/dist/core/mcp-servers.d.ts.map +1 -0
  105. package/dist/core/mcp-servers.js +199 -0
  106. package/dist/core/mcp-servers.js.map +1 -0
  107. package/dist/core/model-registry.d.ts +15 -1
  108. package/dist/core/model-registry.d.ts.map +1 -1
  109. package/dist/core/model-registry.js +29 -0
  110. package/dist/core/model-registry.js.map +1 -1
  111. package/dist/core/model-resolver.d.ts +2 -2
  112. package/dist/core/model-resolver.d.ts.map +1 -1
  113. package/dist/core/model-resolver.js +5 -5
  114. package/dist/core/model-resolver.js.map +1 -1
  115. package/dist/core/model-runtime.d.ts +47 -3
  116. package/dist/core/model-runtime.d.ts.map +1 -1
  117. package/dist/core/model-runtime.js +189 -35
  118. package/dist/core/model-runtime.js.map +1 -1
  119. package/dist/core/nested-tool-calls.d.ts +102 -0
  120. package/dist/core/nested-tool-calls.d.ts.map +1 -0
  121. package/dist/core/nested-tool-calls.js +177 -0
  122. package/dist/core/nested-tool-calls.js.map +1 -0
  123. package/dist/core/package-manager.d.ts +4 -0
  124. package/dist/core/package-manager.d.ts.map +1 -1
  125. package/dist/core/package-manager.js +58 -12
  126. package/dist/core/package-manager.js.map +1 -1
  127. package/dist/core/provider-composer.d.ts +40 -21
  128. package/dist/core/provider-composer.d.ts.map +1 -1
  129. package/dist/core/provider-composer.js +92 -40
  130. package/dist/core/provider-composer.js.map +1 -1
  131. package/dist/core/radius.d.ts +2 -0
  132. package/dist/core/radius.d.ts.map +1 -1
  133. package/dist/core/radius.js +2 -0
  134. package/dist/core/radius.js.map +1 -1
  135. package/dist/core/remote-catalog-provider.d.ts +8 -1
  136. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  137. package/dist/core/remote-catalog-provider.js +21 -11
  138. package/dist/core/remote-catalog-provider.js.map +1 -1
  139. package/dist/core/resource-loader.d.ts +7 -1
  140. package/dist/core/resource-loader.d.ts.map +1 -1
  141. package/dist/core/resource-loader.js +160 -35
  142. package/dist/core/resource-loader.js.map +1 -1
  143. package/dist/core/sdk.d.ts +3 -3
  144. package/dist/core/sdk.d.ts.map +1 -1
  145. package/dist/core/sdk.js +26 -7
  146. package/dist/core/sdk.js.map +1 -1
  147. package/dist/core/session-manager.d.ts +9 -0
  148. package/dist/core/session-manager.d.ts.map +1 -1
  149. package/dist/core/session-manager.js +22 -22
  150. package/dist/core/session-manager.js.map +1 -1
  151. package/dist/core/settings-manager.d.ts +41 -4
  152. package/dist/core/settings-manager.d.ts.map +1 -1
  153. package/dist/core/settings-manager.js +110 -3
  154. package/dist/core/settings-manager.js.map +1 -1
  155. package/dist/core/slash-commands.d.ts.map +1 -1
  156. package/dist/core/slash-commands.js +1 -0
  157. package/dist/core/slash-commands.js.map +1 -1
  158. package/dist/core/source-info.d.ts +8 -0
  159. package/dist/core/source-info.d.ts.map +1 -1
  160. package/dist/core/source-info.js +16 -0
  161. package/dist/core/source-info.js.map +1 -1
  162. package/dist/core/system-prompt.js +1 -1
  163. package/dist/core/system-prompt.js.map +1 -1
  164. package/dist/core/tasks/delivery.d.ts +40 -0
  165. package/dist/core/tasks/delivery.d.ts.map +1 -0
  166. package/dist/core/tasks/delivery.js +157 -0
  167. package/dist/core/tasks/delivery.js.map +1 -0
  168. package/dist/core/tasks/format.d.ts +7 -0
  169. package/dist/core/tasks/format.d.ts.map +1 -0
  170. package/dist/core/tasks/format.js +14 -0
  171. package/dist/core/tasks/format.js.map +1 -0
  172. package/dist/core/tasks/history.d.ts +4 -0
  173. package/dist/core/tasks/history.d.ts.map +1 -0
  174. package/dist/core/{background → tasks}/history.js +8 -51
  175. package/dist/core/tasks/history.js.map +1 -0
  176. package/dist/core/{background → tasks}/output.d.ts +12 -4
  177. package/dist/core/tasks/output.d.ts.map +1 -0
  178. package/dist/core/{background → tasks}/output.js +30 -11
  179. package/dist/core/tasks/output.js.map +1 -0
  180. package/dist/core/tasks/presentation.d.ts +7 -0
  181. package/dist/core/tasks/presentation.d.ts.map +1 -0
  182. package/dist/core/tasks/presentation.js +226 -0
  183. package/dist/core/tasks/presentation.js.map +1 -0
  184. package/dist/core/tasks/runtime.d.ts +74 -0
  185. package/dist/core/tasks/runtime.d.ts.map +1 -0
  186. package/dist/core/tasks/runtime.js +580 -0
  187. package/dist/core/tasks/runtime.js.map +1 -0
  188. package/dist/core/tasks/session.d.ts +49 -0
  189. package/dist/core/tasks/session.d.ts.map +1 -0
  190. package/dist/core/tasks/session.js +138 -0
  191. package/dist/core/tasks/session.js.map +1 -0
  192. package/dist/core/tasks/store.d.ts +46 -0
  193. package/dist/core/tasks/store.d.ts.map +1 -0
  194. package/dist/core/tasks/store.js +162 -0
  195. package/dist/core/tasks/store.js.map +1 -0
  196. package/dist/core/{background → tasks}/types.d.ts +64 -86
  197. package/dist/core/tasks/types.d.ts.map +1 -0
  198. package/dist/core/tasks/types.js +27 -0
  199. package/dist/core/tasks/types.js.map +1 -0
  200. package/dist/core/tools/bash.d.ts +8 -93
  201. package/dist/core/tools/bash.d.ts.map +1 -1
  202. package/dist/core/tools/bash.js +8 -240
  203. package/dist/core/tools/bash.js.map +1 -1
  204. package/dist/core/tools/grep.d.ts +2 -0
  205. package/dist/core/tools/grep.d.ts.map +1 -1
  206. package/dist/core/tools/grep.js +2 -0
  207. package/dist/core/tools/grep.js.map +1 -1
  208. package/dist/core/tools/index.d.ts +2 -1
  209. package/dist/core/tools/index.d.ts.map +1 -1
  210. package/dist/core/tools/index.js +9 -0
  211. package/dist/core/tools/index.js.map +1 -1
  212. package/dist/core/tools/output-accumulator.d.ts +11 -0
  213. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  214. package/dist/core/tools/output-accumulator.js +36 -0
  215. package/dist/core/tools/output-accumulator.js.map +1 -1
  216. package/dist/core/tools/powershell.d.ts +6 -2
  217. package/dist/core/tools/powershell.d.ts.map +1 -1
  218. package/dist/core/tools/powershell.js +1 -1
  219. package/dist/core/tools/powershell.js.map +1 -1
  220. package/dist/core/tools/render-utils.d.ts +6 -0
  221. package/dist/core/tools/render-utils.d.ts.map +1 -1
  222. package/dist/core/tools/render-utils.js +26 -0
  223. package/dist/core/tools/render-utils.js.map +1 -1
  224. package/dist/core/tools/renderers/bash.d.ts +1 -1
  225. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  226. package/dist/core/tools/renderers/bash.js +11 -35
  227. package/dist/core/tools/renderers/bash.js.map +1 -1
  228. package/dist/core/tools/renderers/index.d.ts.map +1 -1
  229. package/dist/core/tools/renderers/index.js +5 -7
  230. package/dist/core/tools/renderers/index.js.map +1 -1
  231. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  232. package/dist/core/tools/renderers/read.js +3 -2
  233. package/dist/core/tools/renderers/read.js.map +1 -1
  234. package/dist/core/tools/shell-execution.d.ts +4 -6
  235. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  236. package/dist/core/tools/shell-execution.js +22 -13
  237. package/dist/core/tools/shell-execution.js.map +1 -1
  238. package/dist/core/tools/shell-tool.d.ts +93 -0
  239. package/dist/core/tools/shell-tool.d.ts.map +1 -0
  240. package/dist/core/tools/shell-tool.js +249 -0
  241. package/dist/core/tools/shell-tool.js.map +1 -0
  242. package/dist/core/tools/tasks/actions.d.ts +12 -0
  243. package/dist/core/tools/tasks/actions.d.ts.map +1 -0
  244. package/dist/{extensions/background → core/tools/tasks}/actions.js +44 -29
  245. package/dist/core/tools/tasks/actions.js.map +1 -0
  246. package/dist/core/tools/tasks/constants.d.ts +20 -0
  247. package/dist/core/tools/tasks/constants.d.ts.map +1 -0
  248. package/dist/core/tools/tasks/constants.js +20 -0
  249. package/dist/core/tools/tasks/constants.js.map +1 -0
  250. package/dist/{extensions/background → core/tools/tasks}/schema.d.ts +7 -7
  251. package/dist/core/tools/tasks/schema.d.ts.map +1 -0
  252. package/dist/{extensions/background → core/tools/tasks}/schema.js +21 -20
  253. package/dist/core/tools/tasks/schema.js.map +1 -0
  254. package/dist/core/tools/tasks/types.d.ts +53 -0
  255. package/dist/core/tools/tasks/types.d.ts.map +1 -0
  256. package/dist/core/tools/tasks/types.js +12 -0
  257. package/dist/core/tools/tasks/types.js.map +1 -0
  258. package/dist/core/tools/tasks.d.ts +14 -0
  259. package/dist/core/tools/tasks.d.ts.map +1 -0
  260. package/dist/core/tools/tasks.js +40 -0
  261. package/dist/core/tools/tasks.js.map +1 -0
  262. package/dist/core/tools/tool-definition-wrapper.d.ts +4 -3
  263. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  264. package/dist/core/tools/tool-definition-wrapper.js +4 -2
  265. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  266. package/dist/core/tools/truncate.d.ts +14 -0
  267. package/dist/core/tools/truncate.d.ts.map +1 -1
  268. package/dist/core/tools/truncate.js +29 -0
  269. package/dist/core/tools/truncate.js.map +1 -1
  270. package/dist/core/trust-manager.d.ts.map +1 -1
  271. package/dist/core/trust-manager.js +1 -0
  272. package/dist/core/trust-manager.js.map +1 -1
  273. package/dist/core/usage-totals.d.ts +5 -3
  274. package/dist/core/usage-totals.d.ts.map +1 -1
  275. package/dist/core/usage-totals.js +27 -4
  276. package/dist/core/usage-totals.js.map +1 -1
  277. package/dist/core/virtual-models.d.ts +117 -0
  278. package/dist/core/virtual-models.d.ts.map +1 -0
  279. package/dist/core/virtual-models.js +124 -0
  280. package/dist/core/virtual-models.js.map +1 -0
  281. package/dist/extensions/btw/agent.d.ts +17 -8
  282. package/dist/extensions/btw/agent.d.ts.map +1 -1
  283. package/dist/extensions/btw/agent.js +74 -76
  284. package/dist/extensions/btw/agent.js.map +1 -1
  285. package/dist/extensions/btw/controller.d.ts +0 -1
  286. package/dist/extensions/btw/controller.d.ts.map +1 -1
  287. package/dist/extensions/btw/controller.js +26 -33
  288. package/dist/extensions/btw/controller.js.map +1 -1
  289. package/dist/extensions/btw/panel.d.ts +13 -14
  290. package/dist/extensions/btw/panel.d.ts.map +1 -1
  291. package/dist/extensions/btw/panel.js +38 -29
  292. package/dist/extensions/btw/panel.js.map +1 -1
  293. package/dist/extensions/codemode/execute.d.ts +16 -0
  294. package/dist/extensions/codemode/execute.d.ts.map +1 -0
  295. package/dist/extensions/codemode/execute.js +536 -0
  296. package/dist/extensions/codemode/execute.js.map +1 -0
  297. package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
  298. package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
  299. package/dist/extensions/codemode/execute.lazy.js +3 -0
  300. package/dist/extensions/codemode/execute.lazy.js.map +1 -0
  301. package/dist/extensions/codemode/index.d.ts +21 -0
  302. package/dist/extensions/codemode/index.d.ts.map +1 -0
  303. package/dist/extensions/codemode/index.js +36 -0
  304. package/dist/extensions/codemode/index.js.map +1 -0
  305. package/dist/extensions/codemode/renderer.d.ts +12 -0
  306. package/dist/extensions/codemode/renderer.d.ts.map +1 -0
  307. package/dist/extensions/codemode/renderer.js +137 -0
  308. package/dist/extensions/codemode/renderer.js.map +1 -0
  309. package/dist/extensions/codemode/search.d.ts +33 -0
  310. package/dist/extensions/codemode/search.d.ts.map +1 -0
  311. package/dist/extensions/codemode/search.js +117 -0
  312. package/dist/extensions/codemode/search.js.map +1 -0
  313. package/dist/extensions/codemode/tool.d.ts +123 -0
  314. package/dist/extensions/codemode/tool.d.ts.map +1 -0
  315. package/dist/extensions/codemode/tool.js +268 -0
  316. package/dist/extensions/codemode/tool.js.map +1 -0
  317. package/dist/extensions/codemode/worker.d.ts +7 -0
  318. package/dist/extensions/codemode/worker.d.ts.map +1 -0
  319. package/dist/extensions/codemode/worker.js +7 -0
  320. package/dist/extensions/codemode/worker.js.map +1 -0
  321. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  322. package/dist/extensions/index.js +13 -13
  323. package/dist/extensions/index.js.map +1 -1
  324. package/dist/extensions/llama/provider.d.ts +1 -1
  325. package/dist/extensions/llama/provider.d.ts.map +1 -1
  326. package/dist/extensions/llama/provider.js +65 -13
  327. package/dist/extensions/llama/provider.js.map +1 -1
  328. package/dist/extensions/mcp/cli.d.ts +21 -0
  329. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  330. package/dist/extensions/mcp/cli.js +500 -0
  331. package/dist/extensions/mcp/cli.js.map +1 -0
  332. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  333. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  334. package/dist/extensions/mcp/cli.lazy.js +3 -0
  335. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  336. package/dist/extensions/mcp/config.d.ts +72 -0
  337. package/dist/extensions/mcp/config.d.ts.map +1 -0
  338. package/dist/extensions/mcp/config.js +158 -0
  339. package/dist/extensions/mcp/config.js.map +1 -0
  340. package/dist/extensions/mcp/index.d.ts +76 -0
  341. package/dist/extensions/mcp/index.d.ts.map +1 -0
  342. package/dist/extensions/mcp/index.js +1078 -0
  343. package/dist/extensions/mcp/index.js.map +1 -0
  344. package/dist/extensions/mcp/log.d.ts +16 -0
  345. package/dist/extensions/mcp/log.d.ts.map +1 -0
  346. package/dist/extensions/mcp/log.js +64 -0
  347. package/dist/extensions/mcp/log.js.map +1 -0
  348. package/dist/extensions/mcp/oauth.d.ts +97 -0
  349. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  350. package/dist/extensions/mcp/oauth.js +355 -0
  351. package/dist/extensions/mcp/oauth.js.map +1 -0
  352. package/dist/extensions/mcp/resources.d.ts +43 -0
  353. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  354. package/dist/extensions/mcp/resources.js +262 -0
  355. package/dist/extensions/mcp/resources.js.map +1 -0
  356. package/dist/extensions/mcp/runtime.d.ts +98 -0
  357. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  358. package/dist/extensions/mcp/runtime.js +379 -0
  359. package/dist/extensions/mcp/runtime.js.map +1 -0
  360. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  361. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  362. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  363. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  364. package/dist/extensions/mcp/tools.d.ts +84 -0
  365. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  366. package/dist/extensions/mcp/tools.js +251 -0
  367. package/dist/extensions/mcp/tools.js.map +1 -0
  368. package/dist/extensions/mcp/ui.d.ts +60 -0
  369. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  370. package/dist/extensions/mcp/ui.js +168 -0
  371. package/dist/extensions/mcp/ui.js.map +1 -0
  372. package/dist/extensions/provider/catalog.d.ts +8 -1
  373. package/dist/extensions/provider/catalog.d.ts.map +1 -1
  374. package/dist/extensions/provider/catalog.js +31 -0
  375. package/dist/extensions/provider/catalog.js.map +1 -1
  376. package/dist/extensions/provider/connection.d.ts +4 -1
  377. package/dist/extensions/provider/connection.d.ts.map +1 -1
  378. package/dist/extensions/provider/connection.js +1 -5
  379. package/dist/extensions/provider/connection.js.map +1 -1
  380. package/dist/extensions/provider/editing.d.ts +36 -0
  381. package/dist/extensions/provider/editing.d.ts.map +1 -0
  382. package/dist/extensions/provider/editing.js +99 -0
  383. package/dist/extensions/provider/editing.js.map +1 -0
  384. package/dist/extensions/provider/json-fields.d.ts +5 -0
  385. package/dist/extensions/provider/json-fields.d.ts.map +1 -0
  386. package/dist/extensions/provider/json-fields.js +31 -0
  387. package/dist/extensions/provider/json-fields.js.map +1 -0
  388. package/dist/extensions/provider/store.d.ts +1 -4
  389. package/dist/extensions/provider/store.d.ts.map +1 -1
  390. package/dist/extensions/provider/store.js +2 -30
  391. package/dist/extensions/provider/store.js.map +1 -1
  392. package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
  393. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  394. package/dist/extensions/provider/ui/builtin-data.js +14 -79
  395. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  396. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  397. package/dist/extensions/provider/ui/compat.js +6 -9
  398. package/dist/extensions/provider/ui/compat.js.map +1 -1
  399. package/dist/extensions/provider/ui/controls.d.ts +48 -0
  400. package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
  401. package/dist/extensions/provider/ui/controls.js +108 -0
  402. package/dist/extensions/provider/ui/controls.js.map +1 -0
  403. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  404. package/dist/extensions/provider/ui/dictionary.js +6 -9
  405. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  406. package/dist/extensions/provider/ui/editor.d.ts +3 -3
  407. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  408. package/dist/extensions/provider/ui/editor.js +35 -140
  409. package/dist/extensions/provider/ui/editor.js.map +1 -1
  410. package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
  411. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  412. package/dist/extensions/provider/ui/fetch-models.js +49 -44
  413. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  414. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  415. package/dist/extensions/provider/ui/model-fields.js +11 -14
  416. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  417. package/dist/extensions/provider/ui/model-options.d.ts +4 -34
  418. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  419. package/dist/extensions/provider/ui/model-options.js +90 -271
  420. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  421. package/dist/extensions/provider/ui/pane.d.ts +4 -18
  422. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  423. package/dist/extensions/provider/ui/pane.js.map +1 -1
  424. package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
  425. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  426. package/dist/extensions/provider/ui/provider-fields.js +58 -171
  427. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  428. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  429. package/dist/extensions/provider/ui/thinking-map.js +6 -9
  430. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  431. package/dist/extensions/question/detail-pane.d.ts +7 -2
  432. package/dist/extensions/question/detail-pane.d.ts.map +1 -1
  433. package/dist/extensions/question/detail-pane.js +16 -5
  434. package/dist/extensions/question/detail-pane.js.map +1 -1
  435. package/dist/extensions/question/dialog-view.d.ts +41 -0
  436. package/dist/extensions/question/dialog-view.d.ts.map +1 -0
  437. package/dist/extensions/question/dialog-view.js +329 -0
  438. package/dist/extensions/question/dialog-view.js.map +1 -0
  439. package/dist/extensions/question/dialog.d.ts +3 -3
  440. package/dist/extensions/question/dialog.d.ts.map +1 -1
  441. package/dist/extensions/question/dialog.js +220 -634
  442. package/dist/extensions/question/dialog.js.map +1 -1
  443. package/dist/extensions/question/index.d.ts.map +1 -1
  444. package/dist/extensions/question/index.js +2 -3
  445. package/dist/extensions/question/index.js.map +1 -1
  446. package/dist/extensions/question/render.d.ts.map +1 -1
  447. package/dist/extensions/question/render.js +22 -32
  448. package/dist/extensions/question/render.js.map +1 -1
  449. package/dist/extensions/question/results.d.ts.map +1 -1
  450. package/dist/extensions/question/results.js +56 -12
  451. package/dist/extensions/question/results.js.map +1 -1
  452. package/dist/extensions/question/schema.d.ts +21 -6
  453. package/dist/extensions/question/schema.d.ts.map +1 -1
  454. package/dist/extensions/question/schema.js.map +1 -1
  455. package/dist/extensions/question/state.d.ts +9 -7
  456. package/dist/extensions/question/state.d.ts.map +1 -1
  457. package/dist/extensions/question/state.js +63 -54
  458. package/dist/extensions/question/state.js.map +1 -1
  459. package/dist/extensions/question/types.d.ts +41 -18
  460. package/dist/extensions/question/types.d.ts.map +1 -1
  461. package/dist/extensions/question/types.js.map +1 -1
  462. package/dist/extensions/statusline/index.d.ts +4 -0
  463. package/dist/extensions/statusline/index.d.ts.map +1 -1
  464. package/dist/extensions/statusline/index.js +18 -355
  465. package/dist/extensions/statusline/index.js.map +1 -1
  466. package/dist/extensions/statusline/render.d.ts +19 -0
  467. package/dist/extensions/statusline/render.d.ts.map +1 -0
  468. package/dist/extensions/statusline/render.js +163 -0
  469. package/dist/extensions/statusline/render.js.map +1 -0
  470. package/dist/extensions/statusline/usage.d.ts +12 -0
  471. package/dist/extensions/statusline/usage.d.ts.map +1 -0
  472. package/dist/extensions/statusline/usage.js +36 -0
  473. package/dist/extensions/statusline/usage.js.map +1 -0
  474. package/dist/extensions/tool-search/index.d.ts +12 -0
  475. package/dist/extensions/tool-search/index.d.ts.map +1 -0
  476. package/dist/extensions/tool-search/index.js +20 -0
  477. package/dist/extensions/tool-search/index.js.map +1 -0
  478. package/dist/extensions/tool-search/tool.d.ts +73 -0
  479. package/dist/extensions/tool-search/tool.d.ts.map +1 -0
  480. package/dist/extensions/tool-search/tool.js +187 -0
  481. package/dist/extensions/tool-search/tool.js.map +1 -0
  482. package/dist/extensions/web-search/execute.d.ts +1 -5
  483. package/dist/extensions/web-search/execute.d.ts.map +1 -1
  484. package/dist/extensions/web-search/execute.js +4 -9
  485. package/dist/extensions/web-search/execute.js.map +1 -1
  486. package/dist/extensions/web-search/format.d.ts +12 -3
  487. package/dist/extensions/web-search/format.d.ts.map +1 -1
  488. package/dist/extensions/web-search/format.js +33 -25
  489. package/dist/extensions/web-search/format.js.map +1 -1
  490. package/dist/extensions/web-search/index.d.ts.map +1 -1
  491. package/dist/extensions/web-search/index.js +6 -29
  492. package/dist/extensions/web-search/index.js.map +1 -1
  493. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
  494. package/dist/extensions/web-search/providers/deepseek.js +0 -1
  495. package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
  496. package/dist/extensions/web-search/providers/http.d.ts +1 -1
  497. package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
  498. package/dist/extensions/web-search/providers/http.js.map +1 -1
  499. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
  500. package/dist/extensions/web-search/providers/minimax.js +0 -1
  501. package/dist/extensions/web-search/providers/minimax.js.map +1 -1
  502. package/dist/extensions/web-search/render.d.ts +7 -2
  503. package/dist/extensions/web-search/render.d.ts.map +1 -1
  504. package/dist/extensions/web-search/render.js +32 -4
  505. package/dist/extensions/web-search/render.js.map +1 -1
  506. package/dist/extensions/web-search/results.d.ts.map +1 -1
  507. package/dist/extensions/web-search/results.js +3 -8
  508. package/dist/extensions/web-search/results.js.map +1 -1
  509. package/dist/extensions/web-search/types.d.ts +4 -2
  510. package/dist/extensions/web-search/types.d.ts.map +1 -1
  511. package/dist/extensions/web-search/types.js.map +1 -1
  512. package/dist/index.d.ts +12 -5
  513. package/dist/index.d.ts.map +1 -1
  514. package/dist/index.js +6 -1
  515. package/dist/index.js.map +1 -1
  516. package/dist/main.d.ts.map +1 -1
  517. package/dist/main.js +16 -0
  518. package/dist/main.js.map +1 -1
  519. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/config-selector.js +13 -3
  521. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  522. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/custom-message.js +3 -1
  524. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  525. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  526. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  527. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  528. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  529. package/dist/modes/interactive/components/footer.d.ts +7 -0
  530. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  531. package/dist/modes/interactive/components/footer.js +42 -3
  532. package/dist/modes/interactive/components/footer.js.map +1 -1
  533. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  534. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  535. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  536. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  537. package/dist/modes/interactive/components/pi-logo-animation.d.ts +68 -0
  538. package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/pi-logo-animation.js +1076 -0
  540. package/dist/modes/interactive/components/pi-logo-animation.js.map +1 -0
  541. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +7 -0
  542. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/pi-logo-animation.lazy.js +12 -0
  544. package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +1 -0
  545. package/dist/modes/interactive/components/pi-logo.d.ts +19 -0
  546. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/pi-logo.js +37 -0
  548. package/dist/modes/interactive/components/pi-logo.js.map +1 -0
  549. package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
  550. package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
  551. package/dist/modes/interactive/components/radius-login-selector.js +83 -0
  552. package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
  553. package/dist/modes/interactive/components/settings-selector.d.ts +6 -4
  554. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  555. package/dist/modes/interactive/components/settings-selector.js +33 -11
  556. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  557. package/dist/modes/interactive/components/status-marker.d.ts +2 -4
  558. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  559. package/dist/modes/interactive/components/status-marker.js +2 -6
  560. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  561. package/dist/modes/interactive/components/themed-text.d.ts +17 -0
  562. package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
  563. package/dist/modes/interactive/components/themed-text.js +28 -0
  564. package/dist/modes/interactive/components/themed-text.js.map +1 -0
  565. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  566. package/dist/modes/interactive/components/user-message.js +5 -4
  567. package/dist/modes/interactive/components/user-message.js.map +1 -1
  568. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  569. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  570. package/dist/modes/interactive/components/visual-truncate.js +36 -6
  571. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  572. package/dist/modes/interactive/interactive-mode.d.ts +12 -4
  573. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  574. package/dist/modes/interactive/interactive-mode.js +377 -199
  575. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  576. package/dist/modes/interactive/tasks/completion-render.d.ts +8 -0
  577. package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -0
  578. package/dist/{extensions/background → modes/interactive/tasks}/completion-render.js +41 -91
  579. package/dist/modes/interactive/tasks/completion-render.js.map +1 -0
  580. package/dist/modes/interactive/tasks/index.d.ts +12 -0
  581. package/dist/modes/interactive/tasks/index.d.ts.map +1 -0
  582. package/dist/modes/interactive/tasks/index.js +102 -0
  583. package/dist/modes/interactive/tasks/index.js.map +1 -0
  584. package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
  585. package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
  586. package/dist/modes/interactive/tasks/inspector.js +93 -0
  587. package/dist/modes/interactive/tasks/inspector.js.map +1 -0
  588. package/dist/modes/interactive/tasks/layout.d.ts +40 -0
  589. package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
  590. package/dist/modes/interactive/tasks/layout.js +212 -0
  591. package/dist/modes/interactive/tasks/layout.js.map +1 -0
  592. package/dist/modes/interactive/tasks/list.d.ts +21 -0
  593. package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
  594. package/dist/modes/interactive/tasks/list.js +96 -0
  595. package/dist/modes/interactive/tasks/list.js.map +1 -0
  596. package/dist/modes/interactive/tasks/manager.d.ts +60 -0
  597. package/dist/modes/interactive/tasks/manager.d.ts.map +1 -0
  598. package/dist/modes/interactive/tasks/manager.js +380 -0
  599. package/dist/modes/interactive/tasks/manager.js.map +1 -0
  600. package/dist/modes/interactive/tasks/model.d.ts +21 -0
  601. package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
  602. package/dist/modes/interactive/tasks/model.js +41 -0
  603. package/dist/modes/interactive/tasks/model.js.map +1 -0
  604. package/dist/modes/interactive/tasks/render.d.ts +28 -0
  605. package/dist/modes/interactive/tasks/render.d.ts.map +1 -0
  606. package/dist/modes/interactive/tasks/render.js +141 -0
  607. package/dist/modes/interactive/tasks/render.js.map +1 -0
  608. package/dist/modes/interactive/tasks/task-view.d.ts +13 -0
  609. package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -0
  610. package/dist/modes/interactive/tasks/task-view.js +20 -0
  611. package/dist/modes/interactive/tasks/task-view.js.map +1 -0
  612. package/dist/modes/interactive/tasks/text.d.ts +6 -0
  613. package/dist/modes/interactive/tasks/text.d.ts.map +1 -0
  614. package/dist/modes/interactive/tasks/text.js +16 -0
  615. package/dist/modes/interactive/tasks/text.js.map +1 -0
  616. package/dist/modes/interactive/tasks/viewport.d.ts +17 -0
  617. package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -0
  618. package/dist/modes/interactive/tasks/viewport.js +59 -0
  619. package/dist/modes/interactive/tasks/viewport.js.map +1 -0
  620. package/dist/modes/interactive/tasks/views.d.ts +9 -0
  621. package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
  622. package/dist/modes/interactive/tasks/views.js +42 -0
  623. package/dist/modes/interactive/tasks/views.js.map +1 -0
  624. package/dist/modes/interactive/theme/dark.json +59 -72
  625. package/dist/modes/interactive/theme/light.json +57 -69
  626. package/dist/modes/interactive/theme/system-theme.d.ts +55 -0
  627. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
  628. package/dist/modes/interactive/theme/system-theme.js +546 -0
  629. package/dist/modes/interactive/theme/system-theme.js.map +1 -0
  630. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  631. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  632. package/dist/modes/interactive/theme/theme-controller.js +125 -47
  633. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  634. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  635. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -1
  636. package/dist/modes/interactive/theme/theme-json.js +3 -1
  637. package/dist/modes/interactive/theme/theme-json.js.map +1 -1
  638. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  639. package/dist/modes/interactive/theme/theme.d.ts +70 -39
  640. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  641. package/dist/modes/interactive/theme/theme.js +247 -313
  642. package/dist/modes/interactive/theme/theme.js.map +1 -1
  643. package/dist/modes/interactive/tool-view/fallback.d.ts +1 -1
  644. package/dist/modes/interactive/tool-view/fallback.d.ts.map +1 -1
  645. package/dist/modes/interactive/tool-view/fallback.js +4 -1
  646. package/dist/modes/interactive/tool-view/fallback.js.map +1 -1
  647. package/dist/modes/interactive/tool-view/tool-execution.js +2 -2
  648. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
  649. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  650. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
  651. package/dist/modes/interactive/tui-renderer.js +1 -0
  652. package/dist/modes/interactive/tui-renderer.js.map +1 -1
  653. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  654. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  655. package/dist/modes/rpc/rpc-client.js +12 -8
  656. package/dist/modes/rpc/rpc-client.js.map +1 -1
  657. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  658. package/dist/modes/rpc/rpc-mode.js +7 -9
  659. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  660. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  661. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  662. package/dist/modes/rpc/rpc-types.js.map +1 -1
  663. package/dist/package-manager-cli.d.ts.map +1 -1
  664. package/dist/package-manager-cli.js +6 -2
  665. package/dist/package-manager-cli.js.map +1 -1
  666. package/dist/utils/clipboard-image.d.ts.map +1 -1
  667. package/dist/utils/clipboard-image.js +14 -17
  668. package/dist/utils/clipboard-image.js.map +1 -1
  669. package/dist/utils/clipboard.d.ts +2 -0
  670. package/dist/utils/clipboard.d.ts.map +1 -1
  671. package/dist/utils/clipboard.js +5 -0
  672. package/dist/utils/clipboard.js.map +1 -1
  673. package/dist/utils/paths.d.ts +3 -3
  674. package/dist/utils/paths.d.ts.map +1 -1
  675. package/dist/utils/paths.js +5 -4
  676. package/dist/utils/paths.js.map +1 -1
  677. package/dist/utils/shell.d.ts +1 -3
  678. package/dist/utils/shell.d.ts.map +1 -1
  679. package/dist/utils/shell.js +3 -30
  680. package/dist/utils/shell.js.map +1 -1
  681. package/docs/bundled/README.md +22 -9
  682. package/docs/bundled/extensions/question.md +2 -2
  683. package/docs/bundled/extensions/statusline.md +26 -17
  684. package/docs/bundled/tasks.md +127 -0
  685. package/docs/bundled/tool-presentation.md +1 -1
  686. package/docs/codemode.md +207 -0
  687. package/docs/custom-provider.md +44 -0
  688. package/docs/docs.json +14 -10
  689. package/docs/environment-variables.md +1 -1
  690. package/docs/extensions.md +94 -93
  691. package/docs/index.md +2 -1
  692. package/docs/keybindings.md +17 -9
  693. package/docs/llama-cpp.md +12 -1
  694. package/docs/mcp.md +248 -0
  695. package/docs/models.md +56 -0
  696. package/docs/packages.md +4 -0
  697. package/docs/providers.md +14 -0
  698. package/docs/rpc.md +5 -3
  699. package/docs/sdk.md +26 -16
  700. package/docs/security.md +4 -0
  701. package/docs/session-format.md +20 -23
  702. package/docs/settings.md +29 -3
  703. package/docs/themes.md +27 -5
  704. package/docs/tui.md +21 -1
  705. package/docs/usage.md +52 -4
  706. package/docs/virtual-models.md +114 -0
  707. package/docs/windows.md +2 -0
  708. package/examples/README.md +2 -2
  709. package/examples/extensions/README.md +3 -2
  710. package/examples/extensions/built-in-tool-renderer.ts +16 -40
  711. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  712. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  713. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  714. package/examples/extensions/custom-provider-gitlab-duo/test.ts +4 -4
  715. package/examples/extensions/debug-provider.ts +90 -0
  716. package/examples/extensions/gondolin/package-lock.json +2 -2
  717. package/examples/extensions/gondolin/package.json +1 -1
  718. package/examples/extensions/jev-router.ts +113 -0
  719. package/examples/extensions/minimal-mode.ts +24 -96
  720. package/examples/extensions/sandbox/package-lock.json +2 -2
  721. package/examples/extensions/sandbox/package.json +1 -1
  722. package/examples/extensions/with-deps/package-lock.json +2 -2
  723. package/examples/extensions/with-deps/package.json +1 -1
  724. package/examples/rpc-client.ts +1 -1
  725. package/examples/rpc-extension-ui.ts +1 -1
  726. package/examples/sdk/14-codemode-mcp.ts +61 -0
  727. package/examples/sdk/README.md +1 -0
  728. package/npm-shrinkwrap.json +420 -423
  729. package/package.json +14 -10
  730. package/dist/bundle/chunks/anthropic-messages-XWFTZP2N.js +0 -6
  731. package/dist/bundle/chunks/azure-openai-responses-HS35BQV6.js +0 -2
  732. package/dist/bundle/chunks/chunk-2IO5GDBS.js +0 -11
  733. package/dist/bundle/chunks/chunk-EDBLK2JQ.js +0 -2
  734. package/dist/bundle/chunks/chunk-I5IVW2WS.js +0 -2
  735. package/dist/bundle/chunks/chunk-IORR2FW4.js +0 -2
  736. package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
  737. package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
  738. package/dist/bundle/chunks/google-generative-ai-NOVAJBFC.js +0 -2
  739. package/dist/bundle/chunks/google-vertex-4VHCZJV5.js +0 -2
  740. package/dist/bundle/chunks/mistral-conversations-WC6A2WCJ.js +0 -5
  741. package/dist/bundle/chunks/openai-codex-responses-XCDG75W2.js +0 -10
  742. package/dist/bundle/chunks/openai-completions-SHS3CAEL.js +0 -7
  743. package/dist/bundle/chunks/openai-responses-UT6XFKC7.js +0 -2
  744. package/dist/bundle/chunks/virtual-modules-KUEIEAZN.js +0 -2
  745. package/dist/core/background/history.d.ts +0 -4
  746. package/dist/core/background/history.d.ts.map +0 -1
  747. package/dist/core/background/history.js.map +0 -1
  748. package/dist/core/background/output.d.ts.map +0 -1
  749. package/dist/core/background/output.js.map +0 -1
  750. package/dist/core/background/presentation.d.ts +0 -9
  751. package/dist/core/background/presentation.d.ts.map +0 -1
  752. package/dist/core/background/presentation.js +0 -311
  753. package/dist/core/background/presentation.js.map +0 -1
  754. package/dist/core/background/service.d.ts +0 -68
  755. package/dist/core/background/service.d.ts.map +0 -1
  756. package/dist/core/background/service.js +0 -641
  757. package/dist/core/background/service.js.map +0 -1
  758. package/dist/core/background/session.d.ts +0 -67
  759. package/dist/core/background/session.d.ts.map +0 -1
  760. package/dist/core/background/session.js +0 -248
  761. package/dist/core/background/session.js.map +0 -1
  762. package/dist/core/background/types.d.ts.map +0 -1
  763. package/dist/core/background/types.js +0 -31
  764. package/dist/core/background/types.js.map +0 -1
  765. package/dist/extensions/background/actions.d.ts +0 -11
  766. package/dist/extensions/background/actions.d.ts.map +0 -1
  767. package/dist/extensions/background/actions.js.map +0 -1
  768. package/dist/extensions/background/completion-render.d.ts +0 -8
  769. package/dist/extensions/background/completion-render.d.ts.map +0 -1
  770. package/dist/extensions/background/completion-render.js.map +0 -1
  771. package/dist/extensions/background/constants.d.ts +0 -24
  772. package/dist/extensions/background/constants.d.ts.map +0 -1
  773. package/dist/extensions/background/constants.js +0 -24
  774. package/dist/extensions/background/constants.js.map +0 -1
  775. package/dist/extensions/background/index.d.ts +0 -7
  776. package/dist/extensions/background/index.d.ts.map +0 -1
  777. package/dist/extensions/background/index.js +0 -135
  778. package/dist/extensions/background/index.js.map +0 -1
  779. package/dist/extensions/background/keybindings.d.ts +0 -10
  780. package/dist/extensions/background/keybindings.d.ts.map +0 -1
  781. package/dist/extensions/background/keybindings.js +0 -14
  782. package/dist/extensions/background/keybindings.js.map +0 -1
  783. package/dist/extensions/background/manager.d.ts +0 -80
  784. package/dist/extensions/background/manager.d.ts.map +0 -1
  785. package/dist/extensions/background/manager.js +0 -673
  786. package/dist/extensions/background/manager.js.map +0 -1
  787. package/dist/extensions/background/render.d.ts +0 -42
  788. package/dist/extensions/background/render.d.ts.map +0 -1
  789. package/dist/extensions/background/render.js +0 -225
  790. package/dist/extensions/background/render.js.map +0 -1
  791. package/dist/extensions/background/schema.d.ts.map +0 -1
  792. package/dist/extensions/background/schema.js.map +0 -1
  793. package/dist/extensions/background/task-view.d.ts +0 -53
  794. package/dist/extensions/background/task-view.d.ts.map +0 -1
  795. package/dist/extensions/background/task-view.js +0 -60
  796. package/dist/extensions/background/task-view.js.map +0 -1
  797. package/dist/extensions/background/text.d.ts +0 -12
  798. package/dist/extensions/background/text.d.ts.map +0 -1
  799. package/dist/extensions/background/text.js +0 -39
  800. package/dist/extensions/background/text.js.map +0 -1
  801. package/dist/extensions/background/types.d.ts +0 -85
  802. package/dist/extensions/background/types.d.ts.map +0 -1
  803. package/dist/extensions/background/types.js +0 -17
  804. package/dist/extensions/background/types.js.map +0 -1
  805. package/dist/extensions/subagent/activity.d.ts +0 -34
  806. package/dist/extensions/subagent/activity.d.ts.map +0 -1
  807. package/dist/extensions/subagent/activity.js +0 -192
  808. package/dist/extensions/subagent/activity.js.map +0 -1
  809. package/dist/extensions/subagent/agents-command.d.ts +0 -4
  810. package/dist/extensions/subagent/agents-command.d.ts.map +0 -1
  811. package/dist/extensions/subagent/agents-command.js +0 -230
  812. package/dist/extensions/subagent/agents-command.js.map +0 -1
  813. package/dist/extensions/subagent/agents.d.ts +0 -6
  814. package/dist/extensions/subagent/agents.d.ts.map +0 -1
  815. package/dist/extensions/subagent/agents.js +0 -53
  816. package/dist/extensions/subagent/agents.js.map +0 -1
  817. package/dist/extensions/subagent/budget.d.ts +0 -15
  818. package/dist/extensions/subagent/budget.d.ts.map +0 -1
  819. package/dist/extensions/subagent/budget.js +0 -123
  820. package/dist/extensions/subagent/budget.js.map +0 -1
  821. package/dist/extensions/subagent/cancellation.d.ts +0 -29
  822. package/dist/extensions/subagent/cancellation.d.ts.map +0 -1
  823. package/dist/extensions/subagent/cancellation.js +0 -91
  824. package/dist/extensions/subagent/cancellation.js.map +0 -1
  825. package/dist/extensions/subagent/constants.d.ts +0 -25
  826. package/dist/extensions/subagent/constants.d.ts.map +0 -1
  827. package/dist/extensions/subagent/constants.js +0 -50
  828. package/dist/extensions/subagent/constants.js.map +0 -1
  829. package/dist/extensions/subagent/index.d.ts +0 -3
  830. package/dist/extensions/subagent/index.d.ts.map +0 -1
  831. package/dist/extensions/subagent/index.js +0 -151
  832. package/dist/extensions/subagent/index.js.map +0 -1
  833. package/dist/extensions/subagent/model-selection.d.ts +0 -16
  834. package/dist/extensions/subagent/model-selection.d.ts.map +0 -1
  835. package/dist/extensions/subagent/model-selection.js +0 -51
  836. package/dist/extensions/subagent/model-selection.js.map +0 -1
  837. package/dist/extensions/subagent/render.d.ts +0 -24
  838. package/dist/extensions/subagent/render.d.ts.map +0 -1
  839. package/dist/extensions/subagent/render.js +0 -336
  840. package/dist/extensions/subagent/render.js.map +0 -1
  841. package/dist/extensions/subagent/resolve.d.ts +0 -31
  842. package/dist/extensions/subagent/resolve.d.ts.map +0 -1
  843. package/dist/extensions/subagent/resolve.js +0 -111
  844. package/dist/extensions/subagent/resolve.js.map +0 -1
  845. package/dist/extensions/subagent/runner.d.ts +0 -35
  846. package/dist/extensions/subagent/runner.d.ts.map +0 -1
  847. package/dist/extensions/subagent/runner.js +0 -255
  848. package/dist/extensions/subagent/runner.js.map +0 -1
  849. package/dist/extensions/subagent/schema.d.ts +0 -28
  850. package/dist/extensions/subagent/schema.d.ts.map +0 -1
  851. package/dist/extensions/subagent/schema.js +0 -58
  852. package/dist/extensions/subagent/schema.js.map +0 -1
  853. package/dist/extensions/subagent/sdk-runner.d.ts +0 -33
  854. package/dist/extensions/subagent/sdk-runner.d.ts.map +0 -1
  855. package/dist/extensions/subagent/sdk-runner.js +0 -331
  856. package/dist/extensions/subagent/sdk-runner.js.map +0 -1
  857. package/dist/extensions/subagent/settings.d.ts +0 -8
  858. package/dist/extensions/subagent/settings.d.ts.map +0 -1
  859. package/dist/extensions/subagent/settings.js +0 -206
  860. package/dist/extensions/subagent/settings.js.map +0 -1
  861. package/dist/extensions/subagent/state.d.ts +0 -102
  862. package/dist/extensions/subagent/state.d.ts.map +0 -1
  863. package/dist/extensions/subagent/state.js +0 -383
  864. package/dist/extensions/subagent/state.js.map +0 -1
  865. package/dist/extensions/subagent/text.d.ts +0 -6
  866. package/dist/extensions/subagent/text.d.ts.map +0 -1
  867. package/dist/extensions/subagent/text.js +0 -66
  868. package/dist/extensions/subagent/text.js.map +0 -1
  869. package/dist/extensions/subagent/types.d.ts +0 -91
  870. package/dist/extensions/subagent/types.d.ts.map +0 -1
  871. package/dist/extensions/subagent/types.js +0 -2
  872. package/dist/extensions/subagent/types.js.map +0 -1
  873. package/dist/extensions/subagent/ui/agents-dialog.d.ts +0 -4
  874. package/dist/extensions/subagent/ui/agents-dialog.d.ts.map +0 -1
  875. package/dist/extensions/subagent/ui/agents-dialog.js +0 -84
  876. package/dist/extensions/subagent/ui/agents-dialog.js.map +0 -1
  877. package/dist/extensions/subagent/ui/choice-menu.d.ts +0 -39
  878. package/dist/extensions/subagent/ui/choice-menu.d.ts.map +0 -1
  879. package/dist/extensions/subagent/ui/choice-menu.js +0 -93
  880. package/dist/extensions/subagent/ui/choice-menu.js.map +0 -1
  881. package/dist/extensions/subagent/ui/choices.d.ts +0 -36
  882. package/dist/extensions/subagent/ui/choices.d.ts.map +0 -1
  883. package/dist/extensions/subagent/ui/choices.js +0 -54
  884. package/dist/extensions/subagent/ui/choices.js.map +0 -1
  885. package/dist/extensions/subagent/ui/model-list.d.ts +0 -66
  886. package/dist/extensions/subagent/ui/model-list.d.ts.map +0 -1
  887. package/dist/extensions/subagent/ui/model-list.js +0 -235
  888. package/dist/extensions/subagent/ui/model-list.js.map +0 -1
  889. package/dist/extensions/subagent/ui/model-picker.d.ts +0 -47
  890. package/dist/extensions/subagent/ui/model-picker.d.ts.map +0 -1
  891. package/dist/extensions/subagent/ui/model-picker.js +0 -143
  892. package/dist/extensions/subagent/ui/model-picker.js.map +0 -1
  893. package/dist/extensions/subagent/ui/profile-settings-menu.d.ts +0 -41
  894. package/dist/extensions/subagent/ui/profile-settings-menu.d.ts.map +0 -1
  895. package/dist/extensions/subagent/ui/profile-settings-menu.js +0 -98
  896. package/dist/extensions/subagent/ui/profile-settings-menu.js.map +0 -1
  897. package/dist/extensions/todo/constants.d.ts +0 -16
  898. package/dist/extensions/todo/constants.d.ts.map +0 -1
  899. package/dist/extensions/todo/constants.js +0 -30
  900. package/dist/extensions/todo/constants.js.map +0 -1
  901. package/dist/extensions/todo/index.d.ts +0 -3
  902. package/dist/extensions/todo/index.d.ts.map +0 -1
  903. package/dist/extensions/todo/index.js +0 -98
  904. package/dist/extensions/todo/index.js.map +0 -1
  905. package/dist/extensions/todo/schema.d.ts +0 -60
  906. package/dist/extensions/todo/schema.d.ts.map +0 -1
  907. package/dist/extensions/todo/schema.js +0 -56
  908. package/dist/extensions/todo/schema.js.map +0 -1
  909. package/dist/extensions/todo/state.d.ts +0 -34
  910. package/dist/extensions/todo/state.d.ts.map +0 -1
  911. package/dist/extensions/todo/state.js +0 -425
  912. package/dist/extensions/todo/state.js.map +0 -1
  913. package/dist/extensions/todo/view.d.ts +0 -36
  914. package/dist/extensions/todo/view.d.ts.map +0 -1
  915. package/dist/extensions/todo/view.js +0 -580
  916. package/dist/extensions/todo/view.js.map +0 -1
  917. package/dist/extensions/todo/widget.d.ts +0 -15
  918. package/dist/extensions/todo/widget.d.ts.map +0 -1
  919. package/dist/extensions/todo/widget.js +0 -50
  920. package/dist/extensions/todo/widget.js.map +0 -1
  921. package/docs/bundled/extensions/background.md +0 -132
  922. package/docs/bundled/extensions/subagent.md +0 -148
  923. package/docs/bundled/extensions/todo.md +0 -104
  924. package/examples/extensions/todo.ts +0 -297
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Op-based models.json editing store.\n *\n * Three states are tracked: `baseline` (last known disk content), pending\n * field-level ops, and `view` (baseline + ops, what the UI renders). Every\n * confirmed edit queues an op and schedules a save. A save re-reads the file\n * under a cross-process lock and applies the pending ops onto that freshest\n * content — unrelated external edits are preserved, a same-field race\n * resolves last-writer-wins, and ops targeting externally removed models\n * simply miss. The candidate is validated via ModelConfig on a temp file,\n * backed up once per session, and atomically renamed into place. Failed\n * saves keep the ops pending; closing offers retry or explicit discard.\n * Whole-snapshot blind overwrites are never performed.\n *\n * Comments and custom formatting are normalized to two-space JSON on save;\n * unknown fields anywhere in the document are preserved verbatim.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { ModelConfig, type ModelsJsonModel, type ModelsJsonProvider } from \"../../core/model-config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport { stripJsonComments } from \"../../utils/json.ts\";\nimport { normalizePath } from \"../../utils/paths.ts\";\nimport { stripBom } from \"../../utils/text.ts\";\nimport { hasProviderSettings } from \"./configuration.ts\";\nimport { formatError } from \"./constants.ts\";\n\n/** Sentinel op value removing the key at the op path. */\nexport const DELETE: unique symbol = Symbol(\"provider-store-delete\");\nexport type DeleteMarker = typeof DELETE;\n\nexport interface ModelsJsonDocument {\n\tproviders: Record<string, ModelsJsonProvider>;\n\t[key: string]: unknown;\n}\n\ninterface OpBase {\n\tseq: number;\n}\nexport interface SetFieldOp extends OpBase {\n\tkind: \"set\";\n\tproviderId: string;\n\t/** Undefined for provider-level fields. */\n\tmodelId?: string;\n\t/** Path within the provider/model object, e.g. [\"compat\", \"allowEmptySignature\"]. */\n\tpath: readonly string[];\n\tvalue: unknown;\n\tcreateProvider: boolean;\n}\nexport interface AddModelOp extends OpBase {\n\tkind: \"addModel\";\n\tproviderId: string;\n\tmodel: ModelsJsonModel;\n\tcreateProvider: boolean;\n}\nexport interface RemoveModelOp extends OpBase {\n\tkind: \"removeModel\";\n\tproviderId: string;\n\tmodelId: string;\n}\nexport interface RenameModelOp extends OpBase {\n\tkind: \"renameModel\";\n\tproviderId: string;\n\toldId: string;\n\tnewId: string;\n}\nexport interface RemoveProviderOp extends OpBase {\n\tkind: \"removeProvider\";\n\tproviderId: string;\n}\nexport type Op = SetFieldOp | AddModelOp | RemoveModelOp | RenameModelOp | RemoveProviderOp;\n\nexport type SaveResult =\n\t| { kind: \"clean\" }\n\t| { kind: \"saved\"; applied: number }\n\t| { kind: \"invalid\"; error: string }\n\t| { kind: \"error\"; error: string };\n\nexport type StoreLoad = { ok: true; store: ModelsJsonStore } | { ok: false; error: string };\n\ninterface DiskRead {\n\texists: boolean;\n\tdoc: ModelsJsonDocument;\n\trawText?: string;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Canonical comparison for JSON values, insensitive to object key order. */\nexport function jsonEquals(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) {\n\t\treturn a.length === b.length && a.every((entry, index) => jsonEquals(entry, b[index]));\n\t}\n\tif (isPlainObject(a) && isPlainObject(b)) {\n\t\tconst aKeys = Object.keys(a).sort();\n\t\tconst bKeys = Object.keys(b).sort();\n\t\treturn (\n\t\t\taKeys.length === bKeys.length &&\n\t\t\taKeys.every((key, index) => key === bKeys[index] && jsonEquals(a[key], b[key]))\n\t\t);\n\t}\n\treturn false;\n}\n\nfunction setPath(root: Record<string, unknown>, path: readonly string[], value: unknown): void {\n\tlet current = root;\n\tfor (const segment of path.slice(0, -1)) {\n\t\tconst next = Object.hasOwn(current, segment) ? current[segment] : undefined;\n\t\tif (isPlainObject(next)) current = next;\n\t\telse {\n\t\t\tconst created: Record<string, unknown> = {};\n\t\t\tObject.defineProperty(current, segment, {\n\t\t\t\tvalue: created,\n\t\t\t\twritable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t\tcurrent = created;\n\t\t}\n\t}\n\tconst leaf = path[path.length - 1]!;\n\tif (value === DELETE) delete current[leaf];\n\telse\n\t\tObject.defineProperty(current, leaf, {\n\t\t\tvalue: structuredClone(value),\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n}\n\nfunction cloneValue(value: unknown): unknown {\n\treturn value === DELETE ? value : structuredClone(value);\n}\n\nasync function readDocument(path: string): Promise<DiskRead> {\n\tlet rawText: string;\n\ttry {\n\t\trawText = await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { exists: false, doc: { providers: {} } };\n\t\tthrow error;\n\t}\n\tconst parsed: unknown = JSON.parse(stripJsonComments(stripBom(rawText)));\n\tif (!isPlainObject(parsed)) throw new Error(\"models.json root must be a JSON object.\");\n\tconst doc = parsed as ModelsJsonDocument;\n\tif (!isPlainObject(doc.providers)) throw new Error('models.json \"providers\" must be an object.');\n\treturn { exists: true, doc, rawText };\n}\n\nexport class ModelsJsonStore {\n\treadonly path: string;\n\tprivate baseline: ModelsJsonDocument;\n\tprivate ops: Op[] = [];\n\tprivate view: ModelsJsonDocument;\n\tprivate seq = 0;\n\tprivate backedUp = false;\n\tprivate batching = false;\n\tprivate saveChain: Promise<void> = Promise.resolve();\n\tprivate readonly drafts = new Set<string>();\n\tprivate lastSaveResult: SaveResult = { kind: \"clean\" };\n\t/** Called after each save settles (success, conflict, or failure). */\n\tonSaveResult: ((result: SaveResult) => void) | undefined;\n\n\tprivate constructor(path: string, baseline: ModelsJsonDocument) {\n\t\tthis.path = path;\n\t\tthis.baseline = baseline;\n\t\tthis.view = structuredClone(baseline);\n\t}\n\n\tstatic async load(path: string): Promise<StoreLoad> {\n\t\tlet normalized = normalizePath(path);\n\t\tlet disk: DiskRead;\n\t\ttry {\n\t\t\tnormalized = await realpath(normalized).catch((error: NodeJS.ErrnoException) => {\n\t\t\t\tif (error.code === \"ENOENT\") return normalized;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\tdisk = await readDocument(normalized);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `Failed to parse models.json: ${formatError(error)}\\n\\nFile: ${normalized}` };\n\t\t}\n\t\tif (disk.exists) {\n\t\t\t// Surface schema errors as a read-only state; never auto-overwrite an invalid file.\n\t\t\tconst check = await ModelConfig.load(normalized);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) return { ok: false, error: validationError };\n\t\t}\n\t\treturn { ok: true, store: new ModelsJsonStore(normalized, disk.doc) };\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View access (read-only for the UI; mutations go through the methods)\n\t// ---------------------------------------------------------------------\n\n\tgetDoc(): ModelsJsonDocument {\n\t\treturn this.view;\n\t}\n\n\tgetProviderIds(): string[] {\n\t\treturn [...new Set([...Object.keys(this.view.providers), ...this.ops.map((op) => op.providerId)])];\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn Object.hasOwn(this.view.providers, providerId) ? this.view.providers[providerId] : undefined;\n\t}\n\n\t/** Materialize a draft provider in the view without queueing an op (never written while empty). */\n\tensureProviderView(providerId: string): void {\n\t\tif (Object.hasOwn(this.view.providers, providerId)) return;\n\t\tthis.drafts.add(providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t/** Provider present in the view but not yet on disk. */\n\tisDraftProvider(providerId: string): boolean {\n\t\treturn !Object.hasOwn(this.baseline.providers, providerId) && Object.hasOwn(this.view.providers, providerId);\n\t}\n\n\tgetModels(providerId: string): ModelsJsonModel[] {\n\t\tconst provider = this.getProvider(providerId);\n\t\treturn Array.isArray(provider?.models) ? provider.models : [];\n\t}\n\n\tgetModel(providerId: string, modelId: string): ModelsJsonModel | undefined {\n\t\treturn this.getModels(providerId).find((model) => model.id === modelId);\n\t}\n\n\tget pendingCount(): number {\n\t\treturn this.ops.length;\n\t}\n\n\tgetPendingError(providerId?: string): string | undefined {\n\t\tconst pending = this.ops.filter((op) => providerId === undefined || op.providerId === providerId);\n\t\tif (pending.length === 0) return undefined;\n\t\tif (this.lastSaveResult.kind === \"error\" || this.lastSaveResult.kind === \"invalid\")\n\t\t\treturn this.lastSaveResult.error;\n\t\treturn `${pending.length} change(s) are not saved; retry or discard before continuing.`;\n\t}\n\n\tretrySave(): void {\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Used only after flush, when the user explicitly discards unsaved edits. */\n\tdiscardPending(): void {\n\t\tthis.ops = [];\n\t\tthis.drafts.clear();\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Mutations (queue an op, refresh the view, schedule a save)\n\t// ---------------------------------------------------------------------\n\n\tprivate enqueue(op: Op): void {\n\t\tthis.ops.push(op);\n\t\tthis.recomputeView();\n\t\tthis.scheduleSave();\n\t}\n\n\tprivate nextSeq(): number {\n\t\treturn ++this.seq;\n\t}\n\n\tsetProviderField(providerId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tsetModelField(providerId: string, modelId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\taddModel(providerId: string, model: ModelsJsonModel): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"addModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodel: structuredClone(model),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tremoveModel(providerId: string, modelId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t});\n\t}\n\n\tasync renameModel(providerId: string, oldId: string, newId: string): Promise<string | undefined> {\n\t\tawait this.flush();\n\t\tconst pendingError = this.getPendingError(providerId);\n\t\tif (pendingError) return pendingError;\n\t\tconst before = this.getModel(providerId, oldId);\n\t\tif (!before) return \"The model no longer exists.\";\n\t\tconst seq = this.nextSeq();\n\t\tthis.enqueue({\n\t\t\tkind: \"renameModel\",\n\t\t\tseq,\n\t\t\tproviderId,\n\t\t\toldId,\n\t\t\tnewId,\n\t\t});\n\t\tawait this.flush();\n\t\tif (this.ops.some((op) => op.seq === seq)) {\n\t\t\t// The save failed; drop the rename rather than surprising the user later.\n\t\t\tthis.ops = this.ops.filter((op) => op.seq !== seq);\n\t\t\tthis.recomputeView();\n\t\t\treturn this.getPendingError(providerId) ?? \"Failed to save models.json.\";\n\t\t}\n\t\t// A settled rename can still have missed when the model moved on disk; never\n\t\t// adopt an unrelated model that already uses the destination id.\n\t\tconst renamed = this.getModel(providerId, newId);\n\t\treturn renamed && jsonEquals(renamed, { ...before, id: newId })\n\t\t\t? undefined\n\t\t\t: \"The model changed on disk; reopen it before renaming.\";\n\t}\n\n\tremoveProvider(providerId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeProvider\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t});\n\t}\n\n\t/** Queue several ops but schedule a single save (batch import, built-in data apply). */\n\tbatch(mutate: () => void): void {\n\t\tthis.batching = true;\n\t\ttry {\n\t\t\tmutate();\n\t\t} finally {\n\t\t\tthis.batching = false;\n\t\t}\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Drop all pending ops targeting a draft provider (used when leaving its editor untouched). */\n\tdiscardProviderDraft(providerId: string): void {\n\t\tthis.drafts.delete(providerId);\n\t\tif (Object.hasOwn(this.baseline.providers, providerId)) return;\n\t\tthis.ops = this.ops.filter((op) => op.providerId !== providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View computation\n\t// ---------------------------------------------------------------------\n\n\tprivate recomputeView(): void {\n\t\tconst view = structuredClone(this.baseline);\n\t\tfor (const id of this.drafts) ensureProvider(view, id);\n\t\tfor (const op of this.ops) applyOp(view, op);\n\t\tthis.view = view;\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Saving\n\t// ---------------------------------------------------------------------\n\n\tprivate scheduleSave(): void {\n\t\tif (this.batching) return;\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => {})\n\t\t\t.then(async () => {\n\t\t\t\tconst result = await this.save();\n\t\t\t\tthis.lastSaveResult = result;\n\t\t\t\tif (result.kind !== \"clean\") this.onSaveResult?.(result);\n\t\t\t});\n\t}\n\n\t/** Wait for all scheduled saves; the settled result of the last save, if any. */\n\tasync flush(): Promise<void> {\n\t\tlet pending: Promise<void>;\n\t\tdo {\n\t\t\tpending = this.saveChain;\n\t\t\tawait pending;\n\t\t} while (pending !== this.saveChain);\n\t}\n\n\tprivate async save(): Promise<SaveResult> {\n\t\tif (this.ops.length === 0) return { kind: \"clean\" };\n\t\ttry {\n\t\t\treturn await withFileMutationQueue(this.path, async () => {\n\t\t\t\tawait mkdir(dirname(this.path), { recursive: true });\n\t\t\t\tlet compromised: Error | undefined;\n\t\t\t\tconst release = await lockfile.lock(this.path, {\n\t\t\t\t\trealpath: false,\n\t\t\t\t\tstale: 30_000,\n\t\t\t\t\tretries: { retries: 20, factor: 1.2, minTimeout: 50, maxTimeout: 250 },\n\t\t\t\t\tonCompromised: (error) => {\n\t\t\t\t\t\tcompromised = error;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tlet result: SaveResult;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await this.saveLocked(() => {\n\t\t\t\t\t\tif (compromised) throw compromised;\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresult = { kind: \"error\", error: `Failed to save models.json: ${formatError(error)}` };\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait release();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!compromised && result.kind !== \"error\" && result.kind !== \"invalid\") {\n\t\t\t\t\t\tresult = { kind: \"error\", error: `Could not release the models.json lock: ${formatError(error)}` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { kind: \"error\", error: `Failed to access models.json for saving: ${formatError(error)}` };\n\t\t}\n\t}\n\n\tprivate async saveLocked(assertLock: () => void): Promise<SaveResult> {\n\t\tconst tempPath = join(dirname(this.path), `.models.${randomUUID()}.tmp`);\n\t\ttry {\n\t\t\tassertLock();\n\t\t\tlet disk: DiskRead;\n\t\t\ttry {\n\t\t\t\tdisk = await readDocument(this.path);\n\t\t\t} catch (error) {\n\t\t\t\t// Never clobber a file we cannot parse.\n\t\t\t\treturn { kind: \"error\", error: `models.json changed on disk and is unreadable: ${formatError(error)}` };\n\t\t\t}\n\t\t\tconst working = structuredClone(disk.doc);\n\t\t\tconst batch = this.ops.filter((op) => {\n\t\t\t\tconst provider = this.getProvider(op.providerId);\n\t\t\t\treturn (\n\t\t\t\t\tObject.hasOwn(disk.doc.providers, op.providerId) ||\n\t\t\t\t\t!provider ||\n\t\t\t\t\tObject.keys(provider).length === 0 ||\n\t\t\t\t\thasProviderSettings(provider)\n\t\t\t\t);\n\t\t\t});\n\t\t\t// Apply blindly onto the freshest disk content: unrelated external\n\t\t\t// edits are preserved, a same-field race resolves last-writer-wins,\n\t\t\t// and ops targeting externally removed models simply miss.\n\t\t\tfor (const op of batch) applyOp(working, op);\n\t\t\tpruneEmptyNewProviders(working, disk.doc);\n\t\t\tconst settle = () => {\n\t\t\t\tconst settled = new Set(batch.map((op) => op.seq));\n\t\t\t\tthis.ops = this.ops.filter((op) => !settled.has(op.seq));\n\t\t\t\tthis.recomputeView();\n\t\t\t};\n\t\t\tif (jsonEquals(working, disk.doc)) {\n\t\t\t\t// Ops cancelled each other out or already matched disk; nothing to write.\n\t\t\t\tthis.baseline = disk.doc;\n\t\t\t\tsettle();\n\t\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t\t}\n\t\t\tconst candidate = `${JSON.stringify(working, null, 2)}\\n`;\n\t\t\tawait writeFile(tempPath, candidate, { encoding: \"utf8\", mode: 0o600 });\n\t\t\tconst check = await ModelConfig.load(tempPath);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) {\n\t\t\t\treturn { kind: \"invalid\", error: validationError };\n\t\t\t}\n\t\t\tconst latest = await readDocument(this.path);\n\t\t\tif (latest.exists !== disk.exists || latest.rawText !== disk.rawText) {\n\t\t\t\tthrow new Error(\"models.json changed while saving; the edits were kept for retry.\");\n\t\t\t}\n\t\t\tif (!this.backedUp && disk.exists && disk.rawText !== undefined) {\n\t\t\t\tawait writeFile(`${this.path}.bak`, disk.rawText, { encoding: \"utf8\", mode: 0o600 });\n\t\t\t\tthis.backedUp = true;\n\t\t\t}\n\t\t\tassertLock();\n\t\t\tawait rename(tempPath, this.path);\n\t\t\tthis.baseline = working;\n\t\t\tsettle();\n\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t} finally {\n\t\t\tawait rm(tempPath, { force: true }).catch(() => {});\n\t\t}\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Op application\n// -------------------------------------------------------------------------\n\nfunction ensureProvider(doc: ModelsJsonDocument, providerId: string): Record<string, unknown> {\n\tconst existing = Object.hasOwn(doc.providers, providerId) ? doc.providers[providerId] : undefined;\n\tif (existing) return existing;\n\tconst created: Record<string, unknown> = {};\n\tObject.defineProperty(doc.providers, providerId, {\n\t\tvalue: created,\n\t\twritable: true,\n\t\tenumerable: true,\n\t\tconfigurable: true,\n\t});\n\treturn created;\n}\n\nfunction applyOp(doc: ModelsJsonDocument, op: Op): void {\n\tswitch (op.kind) {\n\t\tcase \"set\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tif (op.modelId === undefined) {\n\t\t\t\tsetPath(provider, op.path, op.value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst model = models.find((entry) => entry.id === op.modelId);\n\t\t\tif (model) setPath(model, op.path, op.value);\n\t\t\treturn;\n\t\t}\n\t\tcase \"addModel\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst index = models.findIndex((entry) => entry.id === op.model.id);\n\t\t\tconst clone = structuredClone(op.model) as Record<string, unknown>;\n\t\t\tif (index >= 0) models[index] = clone;\n\t\t\telse models.push(clone);\n\t\t\tprovider.models = models;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!provider || !models) return;\n\t\t\tprovider.models = models.filter((entry) => entry.id !== op.modelId);\n\t\t\treturn;\n\t\t}\n\t\tcase \"renameModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!models) return;\n\t\t\tconst model = models.find((entry) => entry.id === op.oldId);\n\t\t\tif (model && !models.some((entry) => entry.id === op.newId)) model.id = op.newId;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeProvider\": {\n\t\t\tdelete doc.providers[op.providerId];\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** Remove providers the ops materialized but which ended up with no keys (self-cancelled drafts). */\nfunction pruneEmptyNewProviders(working: ModelsJsonDocument, disk: ModelsJsonDocument): void {\n\tfor (const [providerId, provider] of Object.entries(working.providers)) {\n\t\tif (Object.hasOwn(disk.providers, providerId)) continue;\n\t\tif (isPlainObject(provider) && Object.keys(provider).length === 0) delete working.providers[providerId];\n\t}\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/provider/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Op-based models.json editing store.\n *\n * Three states are tracked: `baseline` (last known disk content), pending\n * field-level ops, and `view` (baseline + ops, what the UI renders). Every\n * confirmed edit queues an op and schedules a save. A save re-reads the file\n * under a cross-process lock and applies the pending ops onto that freshest\n * content — unrelated external edits are preserved, a same-field race\n * resolves last-writer-wins, and ops targeting externally removed models\n * simply miss. The candidate is validated via ModelConfig on a temp file,\n * backed up once per session, and atomically renamed into place. Failed\n * saves keep the ops pending; closing offers retry or explicit discard.\n * Whole-snapshot blind overwrites are never performed.\n *\n * Comments and custom formatting are normalized to two-space JSON on save;\n * unknown fields anywhere in the document are preserved verbatim.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { ModelConfig, type ModelsJsonModel, type ModelsJsonProvider } from \"../../core/model-config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport { stripJsonComments } from \"../../utils/json.ts\";\nimport { normalizePath } from \"../../utils/paths.ts\";\nimport { stripBom } from \"../../utils/text.ts\";\nimport { hasProviderSettings } from \"./configuration.ts\";\nimport { formatError } from \"./constants.ts\";\nimport { DELETE, setPath } from \"./json-fields.ts\";\n\nexport { DELETE, type DeleteMarker } from \"./json-fields.ts\";\n\nexport interface ModelsJsonDocument {\n\tproviders: Record<string, ModelsJsonProvider>;\n\t[key: string]: unknown;\n}\n\ninterface OpBase {\n\tseq: number;\n}\nexport interface SetFieldOp extends OpBase {\n\tkind: \"set\";\n\tproviderId: string;\n\t/** Undefined for provider-level fields. */\n\tmodelId?: string;\n\t/** Path within the provider/model object, e.g. [\"compat\", \"allowEmptySignature\"]. */\n\tpath: readonly string[];\n\tvalue: unknown;\n\tcreateProvider: boolean;\n}\nexport interface AddModelOp extends OpBase {\n\tkind: \"addModel\";\n\tproviderId: string;\n\tmodel: ModelsJsonModel;\n\tcreateProvider: boolean;\n}\nexport interface RemoveModelOp extends OpBase {\n\tkind: \"removeModel\";\n\tproviderId: string;\n\tmodelId: string;\n}\nexport interface RenameModelOp extends OpBase {\n\tkind: \"renameModel\";\n\tproviderId: string;\n\toldId: string;\n\tnewId: string;\n}\nexport interface RemoveProviderOp extends OpBase {\n\tkind: \"removeProvider\";\n\tproviderId: string;\n}\nexport type Op = SetFieldOp | AddModelOp | RemoveModelOp | RenameModelOp | RemoveProviderOp;\n\nexport type SaveResult =\n\t| { kind: \"clean\" }\n\t| { kind: \"saved\"; applied: number }\n\t| { kind: \"invalid\"; error: string }\n\t| { kind: \"error\"; error: string };\n\nexport type StoreLoad = { ok: true; store: ModelsJsonStore } | { ok: false; error: string };\n\ninterface DiskRead {\n\texists: boolean;\n\tdoc: ModelsJsonDocument;\n\trawText?: string;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Canonical comparison for JSON values, insensitive to object key order. */\nexport function jsonEquals(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) {\n\t\treturn a.length === b.length && a.every((entry, index) => jsonEquals(entry, b[index]));\n\t}\n\tif (isPlainObject(a) && isPlainObject(b)) {\n\t\tconst aKeys = Object.keys(a).sort();\n\t\tconst bKeys = Object.keys(b).sort();\n\t\treturn (\n\t\t\taKeys.length === bKeys.length &&\n\t\t\taKeys.every((key, index) => key === bKeys[index] && jsonEquals(a[key], b[key]))\n\t\t);\n\t}\n\treturn false;\n}\n\nfunction cloneValue(value: unknown): unknown {\n\treturn value === DELETE ? value : structuredClone(value);\n}\n\nasync function readDocument(path: string): Promise<DiskRead> {\n\tlet rawText: string;\n\ttry {\n\t\trawText = await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { exists: false, doc: { providers: {} } };\n\t\tthrow error;\n\t}\n\tconst parsed: unknown = JSON.parse(stripJsonComments(stripBom(rawText)));\n\tif (!isPlainObject(parsed)) throw new Error(\"models.json root must be a JSON object.\");\n\tconst doc = parsed as ModelsJsonDocument;\n\tif (!isPlainObject(doc.providers)) throw new Error('models.json \"providers\" must be an object.');\n\treturn { exists: true, doc, rawText };\n}\n\nexport class ModelsJsonStore {\n\treadonly path: string;\n\tprivate baseline: ModelsJsonDocument;\n\tprivate ops: Op[] = [];\n\tprivate view: ModelsJsonDocument;\n\tprivate seq = 0;\n\tprivate backedUp = false;\n\tprivate batching = false;\n\tprivate saveChain: Promise<void> = Promise.resolve();\n\tprivate readonly drafts = new Set<string>();\n\tprivate lastSaveResult: SaveResult = { kind: \"clean\" };\n\t/** Called after each save settles (success, conflict, or failure). */\n\tonSaveResult: ((result: SaveResult) => void) | undefined;\n\n\tprivate constructor(path: string, baseline: ModelsJsonDocument) {\n\t\tthis.path = path;\n\t\tthis.baseline = baseline;\n\t\tthis.view = structuredClone(baseline);\n\t}\n\n\tstatic async load(path: string): Promise<StoreLoad> {\n\t\tlet normalized = normalizePath(path);\n\t\tlet disk: DiskRead;\n\t\ttry {\n\t\t\tnormalized = await realpath(normalized).catch((error: NodeJS.ErrnoException) => {\n\t\t\t\tif (error.code === \"ENOENT\") return normalized;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\tdisk = await readDocument(normalized);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `Failed to parse models.json: ${formatError(error)}\\n\\nFile: ${normalized}` };\n\t\t}\n\t\tif (disk.exists) {\n\t\t\t// Surface schema errors as a read-only state; never auto-overwrite an invalid file.\n\t\t\tconst check = await ModelConfig.load(normalized);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) return { ok: false, error: validationError };\n\t\t}\n\t\treturn { ok: true, store: new ModelsJsonStore(normalized, disk.doc) };\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View access (read-only for the UI; mutations go through the methods)\n\t// ---------------------------------------------------------------------\n\n\tgetDoc(): ModelsJsonDocument {\n\t\treturn this.view;\n\t}\n\n\tgetProviderIds(): string[] {\n\t\treturn [...new Set([...Object.keys(this.view.providers), ...this.ops.map((op) => op.providerId)])];\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn Object.hasOwn(this.view.providers, providerId) ? this.view.providers[providerId] : undefined;\n\t}\n\n\t/** Materialize a draft provider in the view without queueing an op (never written while empty). */\n\tensureProviderView(providerId: string): void {\n\t\tif (Object.hasOwn(this.view.providers, providerId)) return;\n\t\tthis.drafts.add(providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t/** Provider present in the view but not yet on disk. */\n\tisDraftProvider(providerId: string): boolean {\n\t\treturn !Object.hasOwn(this.baseline.providers, providerId) && Object.hasOwn(this.view.providers, providerId);\n\t}\n\n\tgetModels(providerId: string): ModelsJsonModel[] {\n\t\tconst provider = this.getProvider(providerId);\n\t\treturn Array.isArray(provider?.models) ? provider.models : [];\n\t}\n\n\tgetModel(providerId: string, modelId: string): ModelsJsonModel | undefined {\n\t\treturn this.getModels(providerId).find((model) => model.id === modelId);\n\t}\n\n\tget pendingCount(): number {\n\t\treturn this.ops.length;\n\t}\n\n\tgetPendingError(providerId?: string): string | undefined {\n\t\tconst pending = this.ops.filter((op) => providerId === undefined || op.providerId === providerId);\n\t\tif (pending.length === 0) return undefined;\n\t\tif (this.lastSaveResult.kind === \"error\" || this.lastSaveResult.kind === \"invalid\")\n\t\t\treturn this.lastSaveResult.error;\n\t\treturn `${pending.length} change(s) are not saved; retry or discard before continuing.`;\n\t}\n\n\tretrySave(): void {\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Used only after flush, when the user explicitly discards unsaved edits. */\n\tdiscardPending(): void {\n\t\tthis.ops = [];\n\t\tthis.drafts.clear();\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Mutations (queue an op, refresh the view, schedule a save)\n\t// ---------------------------------------------------------------------\n\n\tprivate enqueue(op: Op): void {\n\t\tthis.ops.push(op);\n\t\tthis.recomputeView();\n\t\tthis.scheduleSave();\n\t}\n\n\tprivate nextSeq(): number {\n\t\treturn ++this.seq;\n\t}\n\n\tsetProviderField(providerId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tsetModelField(providerId: string, modelId: string, path: readonly string[], value: unknown): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"set\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t\tpath,\n\t\t\tvalue: cloneValue(value),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\taddModel(providerId: string, model: ModelsJsonModel): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"addModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodel: structuredClone(model),\n\t\t\tcreateProvider: !Object.hasOwn(this.baseline.providers, providerId),\n\t\t});\n\t}\n\n\tremoveModel(providerId: string, modelId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeModel\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t\tmodelId,\n\t\t});\n\t}\n\n\tasync renameModel(providerId: string, oldId: string, newId: string): Promise<string | undefined> {\n\t\tawait this.flush();\n\t\tconst pendingError = this.getPendingError(providerId);\n\t\tif (pendingError) return pendingError;\n\t\tconst before = this.getModel(providerId, oldId);\n\t\tif (!before) return \"The model no longer exists.\";\n\t\tconst seq = this.nextSeq();\n\t\tthis.enqueue({\n\t\t\tkind: \"renameModel\",\n\t\t\tseq,\n\t\t\tproviderId,\n\t\t\toldId,\n\t\t\tnewId,\n\t\t});\n\t\tawait this.flush();\n\t\tif (this.ops.some((op) => op.seq === seq)) {\n\t\t\t// The save failed; drop the rename rather than surprising the user later.\n\t\t\tthis.ops = this.ops.filter((op) => op.seq !== seq);\n\t\t\tthis.recomputeView();\n\t\t\treturn this.getPendingError(providerId) ?? \"Failed to save models.json.\";\n\t\t}\n\t\t// A settled rename can still have missed when the model moved on disk; never\n\t\t// adopt an unrelated model that already uses the destination id.\n\t\tconst renamed = this.getModel(providerId, newId);\n\t\treturn renamed && jsonEquals(renamed, { ...before, id: newId })\n\t\t\t? undefined\n\t\t\t: \"The model changed on disk; reopen it before renaming.\";\n\t}\n\n\tremoveProvider(providerId: string): void {\n\t\tthis.enqueue({\n\t\t\tkind: \"removeProvider\",\n\t\t\tseq: this.nextSeq(),\n\t\t\tproviderId,\n\t\t});\n\t}\n\n\t/** Queue several ops but schedule a single save (batch import, built-in data apply). */\n\tbatch(mutate: () => void): void {\n\t\tthis.batching = true;\n\t\ttry {\n\t\t\tmutate();\n\t\t} finally {\n\t\t\tthis.batching = false;\n\t\t}\n\t\tif (this.ops.length > 0) this.scheduleSave();\n\t}\n\n\t/** Drop all pending ops targeting a draft provider (used when leaving its editor untouched). */\n\tdiscardProviderDraft(providerId: string): void {\n\t\tthis.drafts.delete(providerId);\n\t\tif (Object.hasOwn(this.baseline.providers, providerId)) return;\n\t\tthis.ops = this.ops.filter((op) => op.providerId !== providerId);\n\t\tthis.recomputeView();\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// View computation\n\t// ---------------------------------------------------------------------\n\n\tprivate recomputeView(): void {\n\t\tconst view = structuredClone(this.baseline);\n\t\tfor (const id of this.drafts) ensureProvider(view, id);\n\t\tfor (const op of this.ops) applyOp(view, op);\n\t\tthis.view = view;\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Saving\n\t// ---------------------------------------------------------------------\n\n\tprivate scheduleSave(): void {\n\t\tif (this.batching) return;\n\t\tthis.saveChain = this.saveChain\n\t\t\t.catch(() => {})\n\t\t\t.then(async () => {\n\t\t\t\tconst result = await this.save();\n\t\t\t\tthis.lastSaveResult = result;\n\t\t\t\tif (result.kind !== \"clean\") this.onSaveResult?.(result);\n\t\t\t});\n\t}\n\n\t/** Wait for all scheduled saves; the settled result of the last save, if any. */\n\tasync flush(): Promise<void> {\n\t\tlet pending: Promise<void>;\n\t\tdo {\n\t\t\tpending = this.saveChain;\n\t\t\tawait pending;\n\t\t} while (pending !== this.saveChain);\n\t}\n\n\tprivate async save(): Promise<SaveResult> {\n\t\tif (this.ops.length === 0) return { kind: \"clean\" };\n\t\ttry {\n\t\t\treturn await withFileMutationQueue(this.path, async () => {\n\t\t\t\tawait mkdir(dirname(this.path), { recursive: true });\n\t\t\t\tlet compromised: Error | undefined;\n\t\t\t\tconst release = await lockfile.lock(this.path, {\n\t\t\t\t\trealpath: false,\n\t\t\t\t\tstale: 30_000,\n\t\t\t\t\tretries: { retries: 20, factor: 1.2, minTimeout: 50, maxTimeout: 250 },\n\t\t\t\t\tonCompromised: (error) => {\n\t\t\t\t\t\tcompromised = error;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tlet result: SaveResult;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await this.saveLocked(() => {\n\t\t\t\t\t\tif (compromised) throw compromised;\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresult = { kind: \"error\", error: `Failed to save models.json: ${formatError(error)}` };\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait release();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!compromised && result.kind !== \"error\" && result.kind !== \"invalid\") {\n\t\t\t\t\t\tresult = { kind: \"error\", error: `Could not release the models.json lock: ${formatError(error)}` };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { kind: \"error\", error: `Failed to access models.json for saving: ${formatError(error)}` };\n\t\t}\n\t}\n\n\tprivate async saveLocked(assertLock: () => void): Promise<SaveResult> {\n\t\tconst tempPath = join(dirname(this.path), `.models.${randomUUID()}.tmp`);\n\t\ttry {\n\t\t\tassertLock();\n\t\t\tlet disk: DiskRead;\n\t\t\ttry {\n\t\t\t\tdisk = await readDocument(this.path);\n\t\t\t} catch (error) {\n\t\t\t\t// Never clobber a file we cannot parse.\n\t\t\t\treturn { kind: \"error\", error: `models.json changed on disk and is unreadable: ${formatError(error)}` };\n\t\t\t}\n\t\t\tconst working = structuredClone(disk.doc);\n\t\t\tconst batch = this.ops.filter((op) => {\n\t\t\t\tconst provider = this.getProvider(op.providerId);\n\t\t\t\treturn (\n\t\t\t\t\tObject.hasOwn(disk.doc.providers, op.providerId) ||\n\t\t\t\t\t!provider ||\n\t\t\t\t\tObject.keys(provider).length === 0 ||\n\t\t\t\t\thasProviderSettings(provider)\n\t\t\t\t);\n\t\t\t});\n\t\t\t// Apply blindly onto the freshest disk content: unrelated external\n\t\t\t// edits are preserved, a same-field race resolves last-writer-wins,\n\t\t\t// and ops targeting externally removed models simply miss.\n\t\t\tfor (const op of batch) applyOp(working, op);\n\t\t\tpruneEmptyNewProviders(working, disk.doc);\n\t\t\tconst settle = () => {\n\t\t\t\tconst settled = new Set(batch.map((op) => op.seq));\n\t\t\t\tthis.ops = this.ops.filter((op) => !settled.has(op.seq));\n\t\t\t\tthis.recomputeView();\n\t\t\t};\n\t\t\tif (jsonEquals(working, disk.doc)) {\n\t\t\t\t// Ops cancelled each other out or already matched disk; nothing to write.\n\t\t\t\tthis.baseline = disk.doc;\n\t\t\t\tsettle();\n\t\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t\t}\n\t\t\tconst candidate = `${JSON.stringify(working, null, 2)}\\n`;\n\t\t\tawait writeFile(tempPath, candidate, { encoding: \"utf8\", mode: 0o600 });\n\t\t\tconst check = await ModelConfig.load(tempPath);\n\t\t\tconst validationError = check.getError();\n\t\t\tif (validationError) {\n\t\t\t\treturn { kind: \"invalid\", error: validationError };\n\t\t\t}\n\t\t\tconst latest = await readDocument(this.path);\n\t\t\tif (latest.exists !== disk.exists || latest.rawText !== disk.rawText) {\n\t\t\t\tthrow new Error(\"models.json changed while saving; the edits were kept for retry.\");\n\t\t\t}\n\t\t\tif (!this.backedUp && disk.exists && disk.rawText !== undefined) {\n\t\t\t\tawait writeFile(`${this.path}.bak`, disk.rawText, { encoding: \"utf8\", mode: 0o600 });\n\t\t\t\tthis.backedUp = true;\n\t\t\t}\n\t\t\tassertLock();\n\t\t\tawait rename(tempPath, this.path);\n\t\t\tthis.baseline = working;\n\t\t\tsettle();\n\t\t\treturn { kind: \"saved\", applied: batch.length };\n\t\t} finally {\n\t\t\tawait rm(tempPath, { force: true }).catch(() => {});\n\t\t}\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Op application\n// -------------------------------------------------------------------------\n\nfunction ensureProvider(doc: ModelsJsonDocument, providerId: string): Record<string, unknown> {\n\tconst existing = Object.hasOwn(doc.providers, providerId) ? doc.providers[providerId] : undefined;\n\tif (existing) return existing;\n\tconst created: Record<string, unknown> = {};\n\tObject.defineProperty(doc.providers, providerId, {\n\t\tvalue: created,\n\t\twritable: true,\n\t\tenumerable: true,\n\t\tconfigurable: true,\n\t});\n\treturn created;\n}\n\nfunction applyOp(doc: ModelsJsonDocument, op: Op): void {\n\tswitch (op.kind) {\n\t\tcase \"set\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tif (op.modelId === undefined) {\n\t\t\t\tsetPath(provider, op.path, op.value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst model = models.find((entry) => entry.id === op.modelId);\n\t\t\tif (model) setPath(model, op.path, op.value);\n\t\t\treturn;\n\t\t}\n\t\tcase \"addModel\": {\n\t\t\tconst provider = ensureProvider(doc, op.providerId);\n\t\t\tconst models = Array.isArray(provider.models) ? (provider.models as Record<string, unknown>[]) : [];\n\t\t\tconst index = models.findIndex((entry) => entry.id === op.model.id);\n\t\t\tconst clone = structuredClone(op.model) as Record<string, unknown>;\n\t\t\tif (index >= 0) models[index] = clone;\n\t\t\telse models.push(clone);\n\t\t\tprovider.models = models;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!provider || !models) return;\n\t\t\tprovider.models = models.filter((entry) => entry.id !== op.modelId);\n\t\t\treturn;\n\t\t}\n\t\tcase \"renameModel\": {\n\t\t\tconst provider = doc.providers[op.providerId] as Record<string, unknown> | undefined;\n\t\t\tconst models = Array.isArray(provider?.models) ? (provider.models as Record<string, unknown>[]) : undefined;\n\t\t\tif (!models) return;\n\t\t\tconst model = models.find((entry) => entry.id === op.oldId);\n\t\t\tif (model && !models.some((entry) => entry.id === op.newId)) model.id = op.newId;\n\t\t\treturn;\n\t\t}\n\t\tcase \"removeProvider\": {\n\t\t\tdelete doc.providers[op.providerId];\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** Remove providers the ops materialized but which ended up with no keys (self-cancelled drafts). */\nfunction pruneEmptyNewProviders(working: ModelsJsonDocument, disk: ModelsJsonDocument): void {\n\tfor (const [providerId, provider] of Object.entries(working.providers)) {\n\t\tif (Object.hasOwn(disk.providers, providerId)) continue;\n\t\tif (isPlainObject(provider) && Object.keys(provider).length === 0) delete working.providers[providerId];\n\t}\n}\n"]}
@@ -19,7 +19,6 @@ export declare class BuiltinCandidatesPane implements EditorPane {
19
19
  private readonly model;
20
20
  constructor(host: EditorHost, model: ModelHandle);
21
21
  private candidates;
22
- private tiers;
23
22
  render(width: number): string[];
24
23
  scrollWindow(): ScrollWindowInfo;
25
24
  private pickCurrent;
@@ -47,7 +46,6 @@ export declare class BuiltinPreviewPane implements EditorPane {
47
46
  scrollWindow(): ScrollWindowInfo;
48
47
  handleInput(data: string): void;
49
48
  private apply;
50
- private applyChange;
51
49
  setFocused(focused: boolean): void;
52
50
  hints(): string;
53
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-data.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,YAAY,EAA6D,MAAM,eAAe,CAAC;AAG7G,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAmC,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAOrG,qBAAa,qBAAsB,YAAW,UAAU;IACvD,QAAQ,CAAC,KAAK,uBAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAYhD,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,KAAK;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4B/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAMnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA4B/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACpD,QAAQ,CAAC,KAAK,sCAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAC7B,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY;IAYzE,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAsC/B,YAAY,IAAI,gBAAgB;IAahC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA4C/B,OAAO,CAAC,KAAK;IA8Bb,OAAO,CAAC,WAAW;IAsDnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAOf"}
1
+ {"version":3,"file":"builtin-data.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,YAAY,EAA6D,MAAM,eAAe,CAAC;AAI7G,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAmC,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAOrG,qBAAa,qBAAsB,YAAW,UAAU;IACvD,QAAQ,CAAC,KAAK,uBAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAYhD,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4B/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAMnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwB/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACpD,QAAQ,CAAC,KAAK,sCAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAC7B,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY;IAYzE,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAsC/B,YAAY,IAAI,gBAAgB;IAahC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwC/B,OAAO,CAAC,KAAK;IA+Bb,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAOf"}
@@ -10,6 +10,7 @@ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybi
10
10
  import { computeFieldChanges, matchBuiltinModels } from "../catalog.js";
11
11
  import { truncate } from "../constants.js";
12
12
  import { jsonEquals } from "../store.js";
13
+ import { moveSelection } from "./controls.js";
13
14
  import { renderInfoLine, renderPlainLine, ValueEditor } from "./value-row.js";
14
15
  function formatContext(model) {
15
16
  const ctx = model.contextWindow >= 1000 ? `${Math.round(model.contextWindow / 1024)}k` : String(model.contextWindow);
@@ -30,15 +31,12 @@ export class BuiltinCandidatesPane {
30
31
  this.search.reset(this.query);
31
32
  }
32
33
  candidates() {
33
- return matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read())).map((match) => match.entry);
34
- }
35
- tiers() {
36
34
  return matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read()));
37
35
  }
38
36
  render(width) {
39
37
  const theme = this.host.theme;
40
38
  const lines = [this.search.renderLine(width)];
41
- const matches = this.tiers();
39
+ const matches = this.candidates();
42
40
  if (matches.length === 0) {
43
41
  lines.push(renderInfoLine(theme, "No builtin candidates — keep configuring manually.", width));
44
42
  }
@@ -62,7 +60,7 @@ export class BuiltinCandidatesPane {
62
60
  return { top: 1, bottom: 1, cursor: 1 + this.index };
63
61
  }
64
62
  pickCurrent() {
65
- const entry = this.candidates()[this.index];
63
+ const entry = this.candidates()[this.index]?.entry;
66
64
  if (!entry)
67
65
  return;
68
66
  this.host.pushPane(new BuiltinPreviewPane(this.host, this.model, entry));
@@ -70,15 +68,9 @@ export class BuiltinCandidatesPane {
70
68
  handleInput(data) {
71
69
  const kb = this.host.keybindings;
72
70
  const count = this.candidates().length;
73
- if (kb.matches(data, "tui.select.up")) {
74
- if (count > 0)
75
- this.index = this.index === 0 ? count - 1 : this.index - 1;
76
- this.host.refresh();
77
- return;
78
- }
79
- if (kb.matches(data, "tui.select.down")) {
80
- if (count > 0)
81
- this.index = (this.index + 1) % count;
71
+ const next = moveSelection(kb, data, this.index, count);
72
+ if (next !== undefined) {
73
+ this.index = next;
82
74
  this.host.refresh();
83
75
  return;
84
76
  }
@@ -178,13 +170,9 @@ export class BuiltinPreviewPane {
178
170
  }
179
171
  handleInput(data) {
180
172
  const kb = this.host.keybindings;
181
- if (kb.matches(data, "tui.select.up")) {
182
- this.index = this.index === 0 ? this.rowCount() - 1 : this.index - 1;
183
- this.host.refresh();
184
- return;
185
- }
186
- if (kb.matches(data, "tui.select.down")) {
187
- this.index = (this.index + 1) % this.rowCount();
173
+ const next = moveSelection(kb, data, this.index, this.rowCount());
174
+ if (next !== undefined) {
175
+ this.index = next;
188
176
  this.host.refresh();
189
177
  return;
190
178
  }
@@ -239,69 +227,16 @@ export class BuiltinPreviewPane {
239
227
  this.host.popPane();
240
228
  return;
241
229
  }
242
- this.host.store.batch(() => {
243
- for (const change of chosen)
244
- this.applyChange(change.field);
230
+ this.host.edits.batch(() => {
231
+ for (const change of chosen) {
232
+ for (const patch of change.patches)
233
+ this.model.setField(patch.path, patch.value);
234
+ }
245
235
  });
246
- this.host.refresher.touch(this.host.providerId);
247
236
  this.host.notify(`Applied ${chosen.length} field${chosen.length === 1 ? "" : "s"} from ${this.reference.providerId} / ${this.reference.model.id}.`, "info");
248
237
  this.host.popPane(); // preview
249
238
  this.host.popPane(); // candidates → back to the model fields
250
239
  }
251
- applyChange(field) {
252
- const reference = this.reference.model;
253
- const current = this.model.read();
254
- switch (field) {
255
- case "name":
256
- this.model.setField(["name"], reference.name);
257
- return;
258
- case "reasoning":
259
- this.model.setField(["reasoning"], reference.reasoning);
260
- return;
261
- case "input":
262
- this.model.setField(["input"], [...reference.input]);
263
- return;
264
- case "contextWindow":
265
- this.model.setField(["contextWindow"], reference.contextWindow);
266
- return;
267
- case "maxTokens":
268
- this.model.setField(["maxTokens"], reference.maxTokens);
269
- return;
270
- case "thinkingLevelMap":
271
- for (const [level, target] of Object.entries(reference.thinkingLevelMap ?? {})) {
272
- this.model.setField(["thinkingLevelMap", level], target);
273
- }
274
- return;
275
- case "compat":
276
- for (const [key, value] of Object.entries(reference.compat ?? {})) {
277
- if (["chatTemplateKwargs", "chatTemplateArgs", "openRouterRouting", "vercelGatewayRouting"].includes(key) &&
278
- value !== null &&
279
- typeof value === "object" &&
280
- !Array.isArray(value)) {
281
- for (const [entryKey, entryValue] of Object.entries(value))
282
- this.model.setField(["compat", key, entryKey], structuredClone(entryValue));
283
- }
284
- else
285
- this.model.setField(["compat", key], structuredClone(value));
286
- }
287
- return;
288
- case "cost": {
289
- const rates = {
290
- input: reference.cost.input,
291
- output: reference.cost.output,
292
- cacheRead: reference.cost.cacheRead,
293
- cacheWrite: reference.cost.cacheWrite,
294
- };
295
- if (current.cost) {
296
- for (const [rate, value] of Object.entries(rates))
297
- this.model.setField(["cost", rate], value);
298
- }
299
- else
300
- this.model.setField(["cost"], rates);
301
- return;
302
- }
303
- }
304
- }
305
240
  setFocused(focused) {
306
241
  this.focused = focused;
307
242
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-data.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Use Built-in Data: pick a Pi builtin catalog entry as a reference for the\n * current model, preview per-field changes (\"current → reference\"), check the\n * fields to copy, and apply once. Selection and preview are temporary state;\n * Esc applies nothing. Identity/connection fields (provider, id, api,\n * baseUrl, keys) are never touched.\n */\n\nimport \"../keybindings.ts\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { type CatalogEntry, computeFieldChanges, type FieldChange, matchBuiltinModels } from \"../catalog.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { jsonEquals } from \"../store.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, ValueEditor } from \"./value-row.ts\";\n\nfunction formatContext(model: Model<Api>): string {\n\tconst ctx = model.contextWindow >= 1000 ? `${Math.round(model.contextWindow / 1024)}k` : String(model.contextWindow);\n\treturn `${model.api} · ${ctx} ctx${model.reasoning ? \" · reasoning\" : \"\"}`;\n}\n\nexport class BuiltinCandidatesPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data\";\n\tprivate readonly search: ValueEditor;\n\tprivate query: string;\n\tprivate index = 0;\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\tthis.query = this.model.read().id ?? \"\";\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.pickCurrent(),\n\t\t\tonCancel: () => this.host.popPane(),\n\t\t});\n\t\tthis.search.reset(this.query);\n\t}\n\n\tprivate candidates(): CatalogEntry[] {\n\t\treturn matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read())).map((match) => match.entry);\n\t}\n\n\tprivate tiers(): ReturnType<typeof matchBuiltinModels> {\n\t\treturn matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read()));\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [this.search.renderLine(width)];\n\t\tconst matches = this.tiers();\n\t\tif (matches.length === 0) {\n\t\t\tlines.push(renderInfoLine(theme, \"No builtin candidates — keep configuring manually.\", width));\n\t\t}\n\t\tfor (const [rowIndex, match] of matches.entries()) {\n\t\t\tconst { providerId, model } = match.entry;\n\t\t\tconst label = `${providerId} / ${model.id}`;\n\t\t\tconst note =\n\t\t\t\t(match.tier === \"exact\" ? \"exact · \" : \"\") +\n\t\t\t\t`${model.name !== model.id ? `${model.name} · ` : \"\"}${formatContext(model)}`;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, label, {\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlines.push(\n\t\t\trenderInfoLine(theme, \"Candidates are a reference only; the configured id is never rewritten.\", width),\n\t\t);\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The filter input pins above, the reference disclaimer below.\n\t\treturn { top: 1, bottom: 1, cursor: 1 + this.index };\n\t}\n\n\tprivate pickCurrent(): void {\n\t\tconst entry = this.candidates()[this.index];\n\t\tif (!entry) return;\n\t\tthis.host.pushPane(new BuiltinPreviewPane(this.host, this.model, entry));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst count = this.candidates().length;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (count > 0) this.index = this.index === 0 ? count - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (count > 0) this.index = (this.index + 1) % count;\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.pickCurrent();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn true; // the candidate filter always owns ←/→\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"preview\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\nexport class BuiltinPreviewPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data · preview\";\n\tprivate readonly changes: FieldChange[];\n\tprivate readonly checked: boolean[];\n\tprivate readonly snapshot: Partial<ModelsJsonModel> & { id?: string };\n\tprivate readonly snapshotApi: string | undefined;\n\tprivate index = 0;\n\tprivate expanded: number | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tprivate readonly reference: CatalogEntry;\n\tconstructor(host: EditorHost, model: ModelHandle, reference: CatalogEntry) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tthis.reference = reference;\n\n\t\tconst current = model.read();\n\t\tthis.snapshot = structuredClone(current);\n\t\tthis.snapshotApi = host.effectiveApi(current);\n\t\tthis.changes = computeFieldChanges(current, reference.model, host.effectiveApi(current));\n\t\tthis.checked = this.changes.map((change) => change.checked && change.applicable);\n\t}\n\n\tprivate rowCount(): number {\n\t\treturn this.changes.length + 1; // + Apply row\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, `reference: ${this.reference.providerId} / ${this.reference.model.id}`, width),\n\t\t];\n\t\tfor (const [rowIndex, change] of this.changes.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst expandable = change.referenceDetails !== undefined;\n\t\t\tconst note = !change.applicable ? \"· view only\" : undefined;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, `${change.field}: ${change.currentText} → ${change.referenceText}`, {\n\t\t\t\t\tchecked: change.applicable ? this.checked[rowIndex] : undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (this.expanded === rowIndex && expandable) {\n\t\t\t\tfor (const detail of change.referenceDetails!) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, ` ${detail}`, width));\n\t\t\t\t}\n\t\t\t\tif (change.referenceHasTiers) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, \" reference has cost tiers — tiers are never imported.\", width));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"Apply Selected Fields\", {\n\t\t\t\tactive: this.index === this.changes.length,\n\t\t\t\tpaneFocused: this.focused,\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\tscrollWindow(): ScrollWindowInfo {\n\t\t// The reference header pins above; errors pin below. Expanded detail\n\t\t// lines shift the cursor row when they sit above it.\n\t\tlet cursor = 1 + this.index;\n\t\tif (this.expanded !== undefined && this.expanded < this.index) {\n\t\t\tconst change = this.changes[this.expanded]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tcursor += change.referenceDetails.length + (change.referenceHasTiers ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor };\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 ? this.rowCount() - 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.rowCount();\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, \"app.list.toggle\")) {\n\t\t\tconst change = this.changes[this.index];\n\t\t\tif (!change) return;\n\t\t\tif (!change.applicable) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.index === this.changes.length) {\n\t\t\t\tthis.apply();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = this.changes[this.index]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t} else if (change.applicable) {\n\t\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\t}\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate apply(): void {\n\t\t// Re-validate against the live model: a stale preview must not write to a changed model.\n\t\tconst current = this.model.read();\n\t\tif (this.host.effectiveApi(current) !== this.snapshotApi) {\n\t\t\tthis.error = \"The API changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!current.id || !jsonEquals(current, this.snapshot)) {\n\t\t\tthis.error = \"The model changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst chosen = this.changes.filter((_, rowIndex) => this.checked[rowIndex] && this.changes[rowIndex]!.applicable);\n\t\tif (chosen.length === 0) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tthis.host.store.batch(() => {\n\t\t\tfor (const change of chosen) this.applyChange(change.field);\n\t\t});\n\t\tthis.host.refresher.touch(this.host.providerId);\n\t\tthis.host.notify(\n\t\t\t`Applied ${chosen.length} field${chosen.length === 1 ? \"\" : \"s\"} from ${this.reference.providerId} / ${this.reference.model.id}.`,\n\t\t\t\"info\",\n\t\t);\n\t\tthis.host.popPane(); // preview\n\t\tthis.host.popPane(); // candidates → back to the model fields\n\t}\n\n\tprivate applyChange(field: FieldChange[\"field\"]): void {\n\t\tconst reference = this.reference.model;\n\t\tconst current = this.model.read();\n\t\tswitch (field) {\n\t\t\tcase \"name\":\n\t\t\t\tthis.model.setField([\"name\"], reference.name);\n\t\t\t\treturn;\n\t\t\tcase \"reasoning\":\n\t\t\t\tthis.model.setField([\"reasoning\"], reference.reasoning);\n\t\t\t\treturn;\n\t\t\tcase \"input\":\n\t\t\t\tthis.model.setField([\"input\"], [...reference.input]);\n\t\t\t\treturn;\n\t\t\tcase \"contextWindow\":\n\t\t\t\tthis.model.setField([\"contextWindow\"], reference.contextWindow);\n\t\t\t\treturn;\n\t\t\tcase \"maxTokens\":\n\t\t\t\tthis.model.setField([\"maxTokens\"], reference.maxTokens);\n\t\t\t\treturn;\n\t\t\tcase \"thinkingLevelMap\":\n\t\t\t\tfor (const [level, target] of Object.entries(reference.thinkingLevelMap ?? {})) {\n\t\t\t\t\tthis.model.setField([\"thinkingLevelMap\", level], target);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"compat\":\n\t\t\t\tfor (const [key, value] of Object.entries(reference.compat ?? {})) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t[\"chatTemplateKwargs\", \"chatTemplateArgs\", \"openRouterRouting\", \"vercelGatewayRouting\"].includes(\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t) &&\n\t\t\t\t\t\tvalue !== null &&\n\t\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(value)\n\t\t\t\t\t) {\n\t\t\t\t\t\tfor (const [entryKey, entryValue] of Object.entries(value))\n\t\t\t\t\t\t\tthis.model.setField([\"compat\", key, entryKey], structuredClone(entryValue));\n\t\t\t\t\t} else this.model.setField([\"compat\", key], structuredClone(value));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"cost\": {\n\t\t\t\tconst rates = {\n\t\t\t\t\tinput: reference.cost.input,\n\t\t\t\t\toutput: reference.cost.output,\n\t\t\t\t\tcacheRead: reference.cost.cacheRead,\n\t\t\t\t\tcacheWrite: reference.cost.cacheWrite,\n\t\t\t\t};\n\t\t\t\tif (current.cost) {\n\t\t\t\t\tfor (const [rate, value] of Object.entries(rates)) this.model.setField([\"cost\", rate], value);\n\t\t\t\t} else this.model.setField([\"cost\"], rates);\n\t\t\t\treturn;\n\t\t\t}\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\", \"check\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"details / apply\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
1
+ {"version":3,"file":"builtin-data.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/builtin-data.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Use Built-in Data: pick a Pi builtin catalog entry as a reference for the\n * current model, preview per-field changes (\"current → reference\"), check the\n * fields to copy, and apply once. Selection and preview are temporary state;\n * Esc applies nothing. Identity/connection fields (provider, id, api,\n * baseUrl, keys) are never touched.\n */\n\nimport \"../keybindings.ts\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { type CatalogEntry, computeFieldChanges, type FieldChange, matchBuiltinModels } from \"../catalog.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { jsonEquals } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, ValueEditor } from \"./value-row.ts\";\n\nfunction formatContext(model: Model<Api>): string {\n\tconst ctx = model.contextWindow >= 1000 ? `${Math.round(model.contextWindow / 1024)}k` : String(model.contextWindow);\n\treturn `${model.api} · ${ctx} ctx${model.reasoning ? \" · reasoning\" : \"\"}`;\n}\n\nexport class BuiltinCandidatesPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data\";\n\tprivate readonly search: ValueEditor;\n\tprivate query: string;\n\tprivate index = 0;\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\tthis.query = this.model.read().id ?? \"\";\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.pickCurrent(),\n\t\t\tonCancel: () => this.host.popPane(),\n\t\t});\n\t\tthis.search.reset(this.query);\n\t}\n\n\tprivate candidates(): ReturnType<typeof matchBuiltinModels> {\n\t\treturn matchBuiltinModels(this.query, this.host.effectiveApi(this.model.read()));\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [this.search.renderLine(width)];\n\t\tconst matches = this.candidates();\n\t\tif (matches.length === 0) {\n\t\t\tlines.push(renderInfoLine(theme, \"No builtin candidates — keep configuring manually.\", width));\n\t\t}\n\t\tfor (const [rowIndex, match] of matches.entries()) {\n\t\t\tconst { providerId, model } = match.entry;\n\t\t\tconst label = `${providerId} / ${model.id}`;\n\t\t\tconst note =\n\t\t\t\t(match.tier === \"exact\" ? \"exact · \" : \"\") +\n\t\t\t\t`${model.name !== model.id ? `${model.name} · ` : \"\"}${formatContext(model)}`;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, label, {\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlines.push(\n\t\t\trenderInfoLine(theme, \"Candidates are a reference only; the configured id is never rewritten.\", width),\n\t\t);\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The filter input pins above, the reference disclaimer below.\n\t\treturn { top: 1, bottom: 1, cursor: 1 + this.index };\n\t}\n\n\tprivate pickCurrent(): void {\n\t\tconst entry = this.candidates()[this.index]?.entry;\n\t\tif (!entry) return;\n\t\tthis.host.pushPane(new BuiltinPreviewPane(this.host, this.model, entry));\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst count = this.candidates().length;\n\t\tconst next = moveSelection(kb, data, this.index, count);\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.pickCurrent();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn true; // the candidate filter always owns ←/→\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"preview\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\nexport class BuiltinPreviewPane implements EditorPane {\n\treadonly crumb = \"Use Built-in Data · preview\";\n\tprivate readonly changes: FieldChange[];\n\tprivate readonly checked: boolean[];\n\tprivate readonly snapshot: Partial<ModelsJsonModel> & { id?: string };\n\tprivate readonly snapshotApi: string | undefined;\n\tprivate index = 0;\n\tprivate expanded: number | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tprivate readonly reference: CatalogEntry;\n\tconstructor(host: EditorHost, model: ModelHandle, reference: CatalogEntry) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tthis.reference = reference;\n\n\t\tconst current = model.read();\n\t\tthis.snapshot = structuredClone(current);\n\t\tthis.snapshotApi = host.effectiveApi(current);\n\t\tthis.changes = computeFieldChanges(current, reference.model, host.effectiveApi(current));\n\t\tthis.checked = this.changes.map((change) => change.checked && change.applicable);\n\t}\n\n\tprivate rowCount(): number {\n\t\treturn this.changes.length + 1; // + Apply row\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, `reference: ${this.reference.providerId} / ${this.reference.model.id}`, width),\n\t\t];\n\t\tfor (const [rowIndex, change] of this.changes.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tconst expandable = change.referenceDetails !== undefined;\n\t\t\tconst note = !change.applicable ? \"· view only\" : undefined;\n\t\t\tlines.push(\n\t\t\t\trenderPlainLine(theme, `${change.field}: ${change.currentText} → ${change.referenceText}`, {\n\t\t\t\t\tchecked: change.applicable ? this.checked[rowIndex] : undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (this.expanded === rowIndex && expandable) {\n\t\t\t\tfor (const detail of change.referenceDetails!) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, ` ${detail}`, width));\n\t\t\t\t}\n\t\t\t\tif (change.referenceHasTiers) {\n\t\t\t\t\tlines.push(renderInfoLine(theme, \" reference has cost tiers — tiers are never imported.\", width));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"Apply Selected Fields\", {\n\t\t\t\tactive: this.index === this.changes.length,\n\t\t\t\tpaneFocused: this.focused,\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\tscrollWindow(): ScrollWindowInfo {\n\t\t// The reference header pins above; errors pin below. Expanded detail\n\t\t// lines shift the cursor row when they sit above it.\n\t\tlet cursor = 1 + this.index;\n\t\tif (this.expanded !== undefined && this.expanded < this.index) {\n\t\t\tconst change = this.changes[this.expanded]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tcursor += change.referenceDetails.length + (change.referenceHasTiers ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst next = moveSelection(kb, data, this.index, this.rowCount());\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, \"app.list.toggle\")) {\n\t\t\tconst change = this.changes[this.index];\n\t\t\tif (!change) return;\n\t\t\tif (!change.applicable) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.index === this.changes.length) {\n\t\t\t\tthis.apply();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = this.changes[this.index]!;\n\t\t\tif (change.referenceDetails) {\n\t\t\t\tthis.expanded = this.expanded === this.index ? undefined : this.index;\n\t\t\t} else if (change.applicable) {\n\t\t\t\tthis.checked[this.index] = !this.checked[this.index];\n\t\t\t}\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate apply(): void {\n\t\t// Re-validate against the live model: a stale preview must not write to a changed model.\n\t\tconst current = this.model.read();\n\t\tif (this.host.effectiveApi(current) !== this.snapshotApi) {\n\t\t\tthis.error = \"The API changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!current.id || !jsonEquals(current, this.snapshot)) {\n\t\t\tthis.error = \"The model changed since this preview opened; reopen to continue.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst chosen = this.changes.filter((_, rowIndex) => this.checked[rowIndex] && this.changes[rowIndex]!.applicable);\n\t\tif (chosen.length === 0) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tthis.host.edits.batch(() => {\n\t\t\tfor (const change of chosen) {\n\t\t\t\tfor (const patch of change.patches) this.model.setField(patch.path, patch.value);\n\t\t\t}\n\t\t});\n\t\tthis.host.notify(\n\t\t\t`Applied ${chosen.length} field${chosen.length === 1 ? \"\" : \"s\"} from ${this.reference.providerId} / ${this.reference.model.id}.`,\n\t\t\t\"info\",\n\t\t);\n\t\tthis.host.popPane(); // preview\n\t\tthis.host.popPane(); // candidates → back to the model fields\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\", \"check\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"details / apply\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/compat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,mBAAmB,CAAC;AAO3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAoBxB,qBAAa,UAAW,YAAW,UAAU;IAC5C,QAAQ,CAAC,KAAK,YAAY;IAC1B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAKhD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAIpB,yDAAyD;IACzD,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6D/B,YAAY,IAAI,gBAAgB;IAMhC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6D/B,OAAO,CAAC,WAAW;IA4CnB,4EAA4E;IAC5E,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,IAAI;IAKZ,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAgBf;AAMD,qBAAa,mBAAoB,YAAW,UAAU;IACrD,QAAQ,CAAC,KAAK,6BAAwB;IACtC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;gBAEnC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAYpG,OAAO,CAAC,UAAU;IAMlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAmB/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAOnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6B/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf"}
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/compat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,mBAAmB,CAAC;AAQ3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAoBxB,qBAAa,UAAW,YAAW,UAAU;IAC5C,QAAQ,CAAC,KAAK,YAAY;IAC1B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAKhD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAIpB,yDAAyD;IACzD,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6D/B,YAAY,IAAI,gBAAgB;IAMhC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAyD/B,OAAO,CAAC,WAAW;IA4CnB,4EAA4E;IAC5E,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,IAAI;IAKZ,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAgBf;AAMD,qBAAa,mBAAoB,YAAW,UAAU;IACrD,QAAQ,CAAC,KAAK,6BAAwB;IACtC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;gBAEnC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAYpG,OAAO,CAAC,UAAU;IAMlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAmB/B,YAAY,IAAI,gBAAgB;IAKhC,OAAO,CAAC,WAAW;IAOnB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6B/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAQf"}
@@ -10,6 +10,7 @@ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybi
10
10
  import { compatFieldFor, compatFieldsForApi, validateJsonCompatValue } from "../compat-fields.js";
11
11
  import { truncate } from "../constants.js";
12
12
  import { DELETE } from "../store.js";
13
+ import { moveSelection } from "./controls.js";
13
14
  import { DictPane } from "./dictionary.js";
14
15
  import { renderInfoLine, renderKeyValueLine, renderPlainLine, ValueEditor, } from "./value-row.js";
15
16
  function compatObject(handle) {
@@ -137,13 +138,9 @@ export class CompatPane {
137
138
  return;
138
139
  }
139
140
  // list mode
140
- if (kb.matches(data, "tui.select.up")) {
141
- this.index = this.index === 0 ? this.rowCount() - 1 : this.index - 1;
142
- this.host.refresh();
143
- return;
144
- }
145
- if (kb.matches(data, "tui.select.down")) {
146
- this.index = (this.index + 1) % this.rowCount();
141
+ const next = moveSelection(kb, data, this.index, this.rowCount());
142
+ if (next !== undefined) {
143
+ this.index = next;
147
144
  this.host.refresh();
148
145
  return;
149
146
  }
@@ -156,7 +153,7 @@ export class CompatPane {
156
153
  if (!entry)
157
154
  return;
158
155
  const [key] = entry;
159
- this.host.mutate(() => this.model.setField(["compat", key], DELETE));
156
+ this.model.setField(["compat", key], DELETE);
160
157
  this.index = Math.min(this.index, this.rowCount() - 2 < 0 ? 0 : this.rowCount() - 2);
161
158
  return;
162
159
  }
@@ -296,7 +293,7 @@ export class CompatPane {
296
293
  return option;
297
294
  }
298
295
  writeValue(key, value) {
299
- this.host.mutate(() => this.model.setField(["compat", key], value));
296
+ this.model.setField(["compat", key], value);
300
297
  }
301
298
  fail(message) {
302
299
  this.error = message;