@astralyn/pi 0.85.1 → 0.85.3

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 (316) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/bundle/chunks/anthropic-messages-IHRRITCV.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +75 -0
  4. package/dist/bundle/chunks/azure-openai-responses-QXBIDYXO.js +2 -0
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +78 -0
  6. package/dist/bundle/chunks/chunk-37ATLPRE.js +2 -0
  7. package/dist/bundle/chunks/chunk-4L3WN2XY.js +2 -0
  8. package/dist/bundle/chunks/chunk-5B3S5DVL.js +4 -0
  9. package/dist/bundle/chunks/chunk-5FDOJRDS.js +2 -0
  10. package/dist/bundle/chunks/chunk-6CYCI3EJ.js +12 -0
  11. package/dist/bundle/chunks/chunk-7LO5Z4WE.js +2 -0
  12. package/dist/bundle/chunks/chunk-APKJ4JGA.js +2 -0
  13. package/dist/bundle/chunks/chunk-EDBLK2JQ.js +2 -0
  14. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +2 -0
  15. package/dist/bundle/chunks/chunk-JEIV47WR.js +2 -0
  16. package/dist/bundle/chunks/chunk-JSJPY26N.js +2 -0
  17. package/dist/bundle/chunks/chunk-KI6LC764.js +42 -0
  18. package/dist/bundle/chunks/chunk-LB4P77SH.js +1688 -0
  19. package/dist/bundle/chunks/chunk-NUHFSC37.js +25 -0
  20. package/dist/bundle/chunks/chunk-O36ZMA3U.js +2 -0
  21. package/dist/bundle/chunks/chunk-OWESLY5T.js +11 -0
  22. package/dist/bundle/chunks/chunk-RRBI7OUG.js +50 -0
  23. package/dist/bundle/chunks/chunk-S2DJQQI2.js +2 -0
  24. package/dist/bundle/chunks/chunk-UP6RLTHQ.js +2 -0
  25. package/dist/bundle/chunks/chunk-UUSTLCVC.js +2 -0
  26. package/dist/bundle/chunks/chunk-WWBSZG5V.js +2 -0
  27. package/dist/bundle/chunks/chunk-YZJWMPUI.js +2 -0
  28. package/dist/bundle/chunks/github-copilot.js +2 -0
  29. package/dist/bundle/chunks/google-generative-ai-NBOR3IQR.js +2 -0
  30. package/dist/bundle/chunks/google-vertex-VTHX3SUB.js +2 -0
  31. package/dist/bundle/chunks/https-proxy-agent-2VXB7436.js +13 -0
  32. package/dist/bundle/chunks/image-resize-worker.js +2 -0
  33. package/dist/bundle/chunks/kimi-coding.js +2 -0
  34. package/dist/bundle/chunks/mistral-conversations-NO4ANAA5.js +5 -0
  35. package/dist/bundle/chunks/multipart-parser-SQ6GDJL7.js +3 -0
  36. package/dist/bundle/chunks/node-7L5OTM6S.js +2 -0
  37. package/dist/bundle/chunks/node-G4XOIDPH.js +16 -0
  38. package/dist/bundle/chunks/openai-codex-responses-5S3T3HMA.js +10 -0
  39. package/dist/bundle/chunks/openai-codex.js +75 -0
  40. package/dist/bundle/chunks/openai-completions-CXRRTRWE.js +7 -0
  41. package/dist/bundle/chunks/openai-responses-CV3MH6VP.js +2 -0
  42. package/dist/bundle/chunks/openrouter-images-6XDE2CEW.js +2 -0
  43. package/dist/bundle/chunks/openrouter.js +75 -0
  44. package/dist/bundle/chunks/pi-messages-PE6B42TG.js +8 -0
  45. package/dist/bundle/chunks/radius.js +75 -0
  46. package/dist/bundle/chunks/src-UK77SYZE.js +4 -0
  47. package/dist/bundle/chunks/xai.js +2 -0
  48. package/dist/bundle/cli.js +3 -0
  49. package/dist/bundle/index.js +2 -0
  50. package/dist/bundle/rpc-entry.js +3 -0
  51. package/dist/cli.js +5 -2469
  52. package/dist/core/agent-session.d.ts.map +1 -1
  53. package/dist/core/agent-session.js +2 -6
  54. package/dist/core/agent-session.js.map +1 -1
  55. package/dist/core/background/history.d.ts.map +1 -1
  56. package/dist/core/background/history.js +6 -0
  57. package/dist/core/background/history.js.map +1 -1
  58. package/dist/core/background/presentation.d.ts.map +1 -1
  59. package/dist/core/background/presentation.js +41 -4
  60. package/dist/core/background/presentation.js.map +1 -1
  61. package/dist/core/background/service.d.ts +2 -2
  62. package/dist/core/background/service.d.ts.map +1 -1
  63. package/dist/core/background/service.js +38 -15
  64. package/dist/core/background/service.js.map +1 -1
  65. package/dist/core/background/types.d.ts +9 -0
  66. package/dist/core/background/types.d.ts.map +1 -1
  67. package/dist/core/background/types.js +4 -0
  68. package/dist/core/background/types.js.map +1 -1
  69. package/dist/core/compaction/compaction.d.ts +5 -12
  70. package/dist/core/compaction/compaction.d.ts.map +1 -1
  71. package/dist/core/compaction/compaction.js +11 -19
  72. package/dist/core/compaction/compaction.js.map +1 -1
  73. package/dist/core/compaction/settings.d.ts +27 -0
  74. package/dist/core/compaction/settings.d.ts.map +1 -0
  75. package/dist/core/compaction/settings.js +40 -0
  76. package/dist/core/compaction/settings.js.map +1 -0
  77. package/dist/core/extensions/index.d.ts +1 -1
  78. package/dist/core/extensions/index.d.ts.map +1 -1
  79. package/dist/core/extensions/index.js.map +1 -1
  80. package/dist/core/extensions/runner.d.ts +0 -1
  81. package/dist/core/extensions/runner.d.ts.map +1 -1
  82. package/dist/core/extensions/runner.js +0 -6
  83. package/dist/core/extensions/runner.js.map +1 -1
  84. package/dist/core/extensions/types.d.ts +0 -11
  85. package/dist/core/extensions/types.d.ts.map +1 -1
  86. package/dist/core/extensions/types.js.map +1 -1
  87. package/dist/core/keybindings.d.ts +15 -0
  88. package/dist/core/keybindings.d.ts.map +1 -1
  89. package/dist/core/keybindings.js +12 -0
  90. package/dist/core/keybindings.js.map +1 -1
  91. package/dist/core/model-config.d.ts +32 -10
  92. package/dist/core/model-config.d.ts.map +1 -1
  93. package/dist/core/model-config.js +38 -1
  94. package/dist/core/model-config.js.map +1 -1
  95. package/dist/core/model-runtime.d.ts +2 -0
  96. package/dist/core/model-runtime.d.ts.map +1 -1
  97. package/dist/core/model-runtime.js +4 -0
  98. package/dist/core/model-runtime.js.map +1 -1
  99. package/dist/core/settings-manager.d.ts +4 -7
  100. package/dist/core/settings-manager.d.ts.map +1 -1
  101. package/dist/core/settings-manager.js +7 -6
  102. package/dist/core/settings-manager.js.map +1 -1
  103. package/dist/core/tools/bash.d.ts +3 -9
  104. package/dist/core/tools/bash.d.ts.map +1 -1
  105. package/dist/core/tools/bash.js +3 -8
  106. package/dist/core/tools/bash.js.map +1 -1
  107. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  108. package/dist/core/tools/shell-execution.js +3 -1
  109. package/dist/core/tools/shell-execution.js.map +1 -1
  110. package/dist/extensions/background/manager.d.ts +8 -5
  111. package/dist/extensions/background/manager.d.ts.map +1 -1
  112. package/dist/extensions/background/manager.js +115 -39
  113. package/dist/extensions/background/manager.js.map +1 -1
  114. package/dist/extensions/background/task-view.d.ts +5 -0
  115. package/dist/extensions/background/task-view.d.ts.map +1 -1
  116. package/dist/extensions/background/task-view.js +4 -0
  117. package/dist/extensions/background/task-view.js.map +1 -1
  118. package/dist/extensions/btw/controller.d.ts +1 -1
  119. package/dist/extensions/btw/controller.d.ts.map +1 -1
  120. package/dist/extensions/btw/controller.js +4 -4
  121. package/dist/extensions/btw/controller.js.map +1 -1
  122. package/dist/extensions/btw/index.js +3 -3
  123. package/dist/extensions/btw/index.js.map +1 -1
  124. package/dist/extensions/index.js +2 -2
  125. package/dist/extensions/index.js.map +1 -1
  126. package/dist/extensions/provider/catalog.d.ts +57 -0
  127. package/dist/extensions/provider/catalog.d.ts.map +1 -0
  128. package/dist/extensions/provider/catalog.js +181 -0
  129. package/dist/extensions/provider/catalog.js.map +1 -0
  130. package/dist/extensions/provider/compat-fields.d.ts +25 -0
  131. package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
  132. package/dist/extensions/provider/compat-fields.js +148 -0
  133. package/dist/extensions/provider/compat-fields.js.map +1 -0
  134. package/dist/extensions/provider/configuration.d.ts +8 -0
  135. package/dist/extensions/provider/configuration.d.ts.map +1 -0
  136. package/dist/extensions/provider/configuration.js +21 -0
  137. package/dist/extensions/provider/configuration.js.map +1 -0
  138. package/dist/extensions/provider/connection.d.ts +14 -0
  139. package/dist/extensions/provider/connection.d.ts.map +1 -0
  140. package/dist/extensions/provider/connection.js +86 -0
  141. package/dist/extensions/provider/connection.js.map +1 -0
  142. package/dist/extensions/provider/constants.d.ts +38 -0
  143. package/dist/extensions/provider/constants.d.ts.map +1 -0
  144. package/dist/extensions/provider/constants.js +75 -0
  145. package/dist/extensions/provider/constants.js.map +1 -0
  146. package/dist/extensions/provider/index.d.ts +4 -0
  147. package/dist/extensions/provider/index.d.ts.map +1 -0
  148. package/dist/extensions/provider/index.js +65 -0
  149. package/dist/extensions/provider/index.js.map +1 -0
  150. package/dist/extensions/provider/probe.d.ts +34 -0
  151. package/dist/extensions/provider/probe.d.ts.map +1 -0
  152. package/dist/extensions/provider/probe.js +178 -0
  153. package/dist/extensions/provider/probe.js.map +1 -0
  154. package/dist/extensions/provider/refresh.d.ts +30 -0
  155. package/dist/extensions/provider/refresh.d.ts.map +1 -0
  156. package/dist/extensions/provider/refresh.js +66 -0
  157. package/dist/extensions/provider/refresh.js.map +1 -0
  158. package/dist/extensions/provider/store.d.ts +131 -0
  159. package/dist/extensions/provider/store.d.ts.map +1 -0
  160. package/dist/extensions/provider/store.js +503 -0
  161. package/dist/extensions/provider/store.js.map +1 -0
  162. package/dist/extensions/provider/ui/app.d.ts +25 -0
  163. package/dist/extensions/provider/ui/app.d.ts.map +1 -0
  164. package/dist/extensions/provider/ui/app.js +153 -0
  165. package/dist/extensions/provider/ui/app.js.map +1 -0
  166. package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
  167. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
  168. package/dist/extensions/provider/ui/builtin-data.js +315 -0
  169. package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
  170. package/dist/extensions/provider/ui/compat.d.ts +57 -0
  171. package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
  172. package/dist/extensions/provider/ui/compat.js +427 -0
  173. package/dist/extensions/provider/ui/compat.js.map +1 -0
  174. package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
  175. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
  176. package/dist/extensions/provider/ui/dialogs.js +89 -0
  177. package/dist/extensions/provider/ui/dialogs.js.map +1 -0
  178. package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
  179. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
  180. package/dist/extensions/provider/ui/dictionary.js +385 -0
  181. package/dist/extensions/provider/ui/dictionary.js.map +1 -0
  182. package/dist/extensions/provider/ui/editor.d.ts +91 -0
  183. package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
  184. package/dist/extensions/provider/ui/editor.js +667 -0
  185. package/dist/extensions/provider/ui/editor.js.map +1 -0
  186. package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
  187. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
  188. package/dist/extensions/provider/ui/fetch-models.js +320 -0
  189. package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
  190. package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
  191. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
  192. package/dist/extensions/provider/ui/model-fields.js +441 -0
  193. package/dist/extensions/provider/ui/model-fields.js.map +1 -0
  194. package/dist/extensions/provider/ui/model-options.d.ts +93 -0
  195. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
  196. package/dist/extensions/provider/ui/model-options.js +529 -0
  197. package/dist/extensions/provider/ui/model-options.js.map +1 -0
  198. package/dist/extensions/provider/ui/pane.d.ts +81 -0
  199. package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
  200. package/dist/extensions/provider/ui/pane.js +3 -0
  201. package/dist/extensions/provider/ui/pane.js.map +1 -0
  202. package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
  203. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
  204. package/dist/extensions/provider/ui/provider-fields.js +326 -0
  205. package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
  206. package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
  207. package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
  208. package/dist/extensions/provider/ui/provider-list.js +162 -0
  209. package/dist/extensions/provider/ui/provider-list.js.map +1 -0
  210. package/dist/extensions/provider/ui/session.d.ts +20 -0
  211. package/dist/extensions/provider/ui/session.d.ts.map +1 -0
  212. package/dist/extensions/provider/ui/session.js +52 -0
  213. package/dist/extensions/provider/ui/session.js.map +1 -0
  214. package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
  215. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
  216. package/dist/extensions/provider/ui/thinking-map.js +166 -0
  217. package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
  218. package/dist/extensions/provider/ui/value-row.d.ts +88 -0
  219. package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
  220. package/dist/extensions/provider/ui/value-row.js +158 -0
  221. package/dist/extensions/provider/ui/value-row.js.map +1 -0
  222. package/dist/extensions/statusline/index.js +2 -2
  223. package/dist/extensions/statusline/index.js.map +1 -1
  224. package/dist/extensions/subagent/index.d.ts.map +1 -1
  225. package/dist/extensions/subagent/index.js +4 -2
  226. package/dist/extensions/subagent/index.js.map +1 -1
  227. package/dist/extensions/subagent/resolve.d.ts +5 -0
  228. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  229. package/dist/extensions/subagent/resolve.js +15 -7
  230. package/dist/extensions/subagent/resolve.js.map +1 -1
  231. package/dist/extensions/subagent/schema.d.ts +2 -0
  232. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  233. package/dist/extensions/subagent/schema.js +1 -0
  234. package/dist/extensions/subagent/schema.js.map +1 -1
  235. package/dist/index.d.ts +1 -1
  236. package/dist/index.d.ts.map +1 -1
  237. package/dist/index.js.map +1 -1
  238. package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
  239. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/tool-execution.js +20 -2
  241. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  242. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  243. package/dist/modes/interactive/interactive-mode.js +6 -1
  244. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  245. package/dist/rpc-entry.js +10 -2469
  246. package/docs/bundled/README.md +1 -1
  247. package/docs/bundled/extensions/background.md +5 -5
  248. package/docs/bundled/extensions/provider.md +117 -0
  249. package/docs/bundled/extensions/statusline.md +1 -1
  250. package/docs/bundled/extensions/subagent.md +7 -3
  251. package/docs/compaction.md +16 -6
  252. package/docs/development.md +1 -1
  253. package/docs/docs.json +2 -2
  254. package/docs/extensions.md +0 -13
  255. package/docs/keybindings.md +3 -0
  256. package/docs/settings.md +11 -7
  257. package/npm-shrinkwrap.json +4 -4
  258. package/package.json +6 -5
  259. package/dist/extensions/router/constants.d.ts +0 -23
  260. package/dist/extensions/router/constants.d.ts.map +0 -1
  261. package/dist/extensions/router/constants.js +0 -30
  262. package/dist/extensions/router/constants.js.map +0 -1
  263. package/dist/extensions/router/dialog-host.d.ts +0 -60
  264. package/dist/extensions/router/dialog-host.d.ts.map +0 -1
  265. package/dist/extensions/router/dialog-host.js +0 -196
  266. package/dist/extensions/router/dialog-host.js.map +0 -1
  267. package/dist/extensions/router/dialog.d.ts +0 -45
  268. package/dist/extensions/router/dialog.d.ts.map +0 -1
  269. package/dist/extensions/router/dialog.js +0 -378
  270. package/dist/extensions/router/dialog.js.map +0 -1
  271. package/dist/extensions/router/identity.d.ts +0 -15
  272. package/dist/extensions/router/identity.d.ts.map +0 -1
  273. package/dist/extensions/router/identity.js +0 -173
  274. package/dist/extensions/router/identity.js.map +0 -1
  275. package/dist/extensions/router/index.d.ts +0 -15
  276. package/dist/extensions/router/index.d.ts.map +0 -1
  277. package/dist/extensions/router/index.js +0 -70
  278. package/dist/extensions/router/index.js.map +0 -1
  279. package/dist/extensions/router/presets.d.ts +0 -51
  280. package/dist/extensions/router/presets.d.ts.map +0 -1
  281. package/dist/extensions/router/presets.js +0 -108
  282. package/dist/extensions/router/presets.js.map +0 -1
  283. package/dist/extensions/router/probe.d.ts +0 -26
  284. package/dist/extensions/router/probe.d.ts.map +0 -1
  285. package/dist/extensions/router/probe.js +0 -216
  286. package/dist/extensions/router/probe.js.map +0 -1
  287. package/dist/extensions/router/register.d.ts +0 -12
  288. package/dist/extensions/router/register.d.ts.map +0 -1
  289. package/dist/extensions/router/register.js +0 -90
  290. package/dist/extensions/router/register.js.map +0 -1
  291. package/dist/extensions/router/state.d.ts +0 -20
  292. package/dist/extensions/router/state.d.ts.map +0 -1
  293. package/dist/extensions/router/state.js +0 -169
  294. package/dist/extensions/router/state.js.map +0 -1
  295. package/dist/extensions/router/store.d.ts +0 -12
  296. package/dist/extensions/router/store.d.ts.map +0 -1
  297. package/dist/extensions/router/store.js +0 -266
  298. package/dist/extensions/router/store.js.map +0 -1
  299. package/dist/extensions/router/stream.d.ts +0 -12
  300. package/dist/extensions/router/stream.d.ts.map +0 -1
  301. package/dist/extensions/router/stream.js +0 -233
  302. package/dist/extensions/router/stream.js.map +0 -1
  303. package/dist/extensions/router/transport.d.ts +0 -9
  304. package/dist/extensions/router/transport.d.ts.map +0 -1
  305. package/dist/extensions/router/transport.js +0 -81
  306. package/dist/extensions/router/transport.js.map +0 -1
  307. package/dist/extensions/router/types.d.ts +0 -39
  308. package/dist/extensions/router/types.d.ts.map +0 -1
  309. package/dist/extensions/router/types.js +0 -2
  310. package/dist/extensions/router/types.js.map +0 -1
  311. package/dist/extensions/router/ui.d.ts +0 -26
  312. package/dist/extensions/router/ui.d.ts.map +0 -1
  313. package/dist/extensions/router/ui.js +0 -897
  314. package/dist/extensions/router/ui.js.map +0 -1
  315. package/dist/image-resize-worker.js +0 -2
  316. package/docs/bundled/extensions/router.md +0 -197
@@ -0,0 +1,529 @@
1
+ /** Scalar model settings: reasoning, input modalities, cost rates, and the model-specific API override. */
2
+ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybinding-hints.js";
3
+ import { builtinDefaults } from "../catalog.js";
4
+ import { API_TYPES, INPUT_TYPES, truncate } from "../constants.js";
5
+ import { DELETE } from "../store.js";
6
+ import { baseUrlHint, validateBaseUrlValue } from "./provider-fields.js";
7
+ import { isPrintableInput, renderInfoLine, renderKeyValueLine, renderPlainLine, ValueEditor } from "./value-row.js";
8
+ // -------------------------------------------------------------------------
9
+ // reasoning
10
+ // -------------------------------------------------------------------------
11
+ const REASONING_OPTIONS = [
12
+ { label: "true", value: true },
13
+ { label: "false", value: false },
14
+ { label: "default (false)", value: undefined },
15
+ ];
16
+ /** Radio sub-page for reasoning — consistent with the other nested model settings. */
17
+ export class ReasoningPane {
18
+ constructor(host, model) {
19
+ this.crumb = "reasoning";
20
+ this.index = 0;
21
+ this.focused = false;
22
+ this.host = host;
23
+ this.model = model;
24
+ const current = model.read().reasoning;
25
+ this.index = current === true ? 0 : current === false ? 1 : 2;
26
+ }
27
+ render(width) {
28
+ const theme = this.host.theme;
29
+ const current = this.model.read().reasoning;
30
+ return REASONING_OPTIONS.map((option, optionIndex) => {
31
+ const selected = option.value === undefined ? current === undefined : current === option.value;
32
+ return renderPlainLine(theme, `${selected ? "●" : "○"} ${option.label}`, {
33
+ active: optionIndex === this.index,
34
+ paneFocused: this.focused,
35
+ dim: option.value === undefined,
36
+ width,
37
+ });
38
+ });
39
+ }
40
+ handleInput(data) {
41
+ const kb = this.host.keybindings;
42
+ if (kb.matches(data, "tui.select.up")) {
43
+ this.index = this.index === 0 ? REASONING_OPTIONS.length - 1 : this.index - 1;
44
+ this.host.refresh();
45
+ return;
46
+ }
47
+ if (kb.matches(data, "tui.select.down")) {
48
+ this.index = (this.index + 1) % REASONING_OPTIONS.length;
49
+ this.host.refresh();
50
+ return;
51
+ }
52
+ if (kb.matches(data, "tui.select.cancel")) {
53
+ this.host.popPane();
54
+ return;
55
+ }
56
+ if (kb.matches(data, "tui.select.confirm") || kb.matches(data, "app.list.toggle")) {
57
+ const option = REASONING_OPTIONS[this.index];
58
+ this.host.mutate(() => this.model.setField(["reasoning"], option.value === undefined ? DELETE : option.value));
59
+ this.host.popPane();
60
+ }
61
+ }
62
+ setFocused(focused) {
63
+ this.focused = focused;
64
+ }
65
+ hints() {
66
+ return [
67
+ rawKeyHint("↑↓", "move"),
68
+ keyHint("tui.select.confirm", "set"),
69
+ keyHint("tui.select.cancel", "back"),
70
+ ].join(" ");
71
+ }
72
+ }
73
+ // -------------------------------------------------------------------------
74
+ // input modalities
75
+ // -------------------------------------------------------------------------
76
+ export class InputTypesPane {
77
+ constructor(host, model) {
78
+ this.crumb = "input";
79
+ this.index = 0;
80
+ this.focused = false;
81
+ this.host = host;
82
+ this.model = model;
83
+ }
84
+ selected() {
85
+ return new Set(this.model.read().input ?? ["text"]);
86
+ }
87
+ render(width) {
88
+ const theme = this.host.theme;
89
+ const selected = this.selected();
90
+ const lines = INPUT_TYPES.map((type, rowIndex) => renderPlainLine(theme, type, {
91
+ checked: selected.has(type),
92
+ active: rowIndex === this.index,
93
+ paneFocused: this.focused,
94
+ width,
95
+ }));
96
+ if (this.model.read().input === undefined) {
97
+ lines.push(renderInfoLine(theme, "Not set — the runtime default is [text].", width));
98
+ }
99
+ if (this.error)
100
+ lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
101
+ return lines;
102
+ }
103
+ handleInput(data) {
104
+ const kb = this.host.keybindings;
105
+ if (kb.matches(data, "tui.select.up")) {
106
+ this.index = this.index === 0 ? INPUT_TYPES.length - 1 : this.index - 1;
107
+ this.host.refresh();
108
+ return;
109
+ }
110
+ if (kb.matches(data, "tui.select.down")) {
111
+ this.index = (this.index + 1) % INPUT_TYPES.length;
112
+ this.host.refresh();
113
+ return;
114
+ }
115
+ if (kb.matches(data, "app.list.toggle")) {
116
+ const type = INPUT_TYPES[this.index];
117
+ const selected = this.selected();
118
+ if (selected.has(type)) {
119
+ if (selected.size === 1) {
120
+ this.error = "At least one input type must stay selected.";
121
+ this.host.refresh();
122
+ return;
123
+ }
124
+ selected.delete(type);
125
+ }
126
+ else {
127
+ selected.add(type);
128
+ }
129
+ this.error = undefined;
130
+ const next = INPUT_TYPES.filter((entry) => selected.has(entry));
131
+ this.host.mutate(() => this.model.setField(["input"], [...next]));
132
+ return;
133
+ }
134
+ if (kb.matches(data, "tui.select.confirm") || kb.matches(data, "tui.select.cancel")) {
135
+ this.host.popPane();
136
+ return;
137
+ }
138
+ }
139
+ setFocused(focused) {
140
+ this.focused = focused;
141
+ }
142
+ hints() {
143
+ return [
144
+ keyHint("app.list.toggle", "toggle"),
145
+ keyHint("tui.select.confirm", "done"),
146
+ keyHint("tui.select.cancel", "back"),
147
+ ].join(" ");
148
+ }
149
+ }
150
+ // -------------------------------------------------------------------------
151
+ // cost
152
+ // -------------------------------------------------------------------------
153
+ const COST_RATES = ["input", "output", "cacheRead", "cacheWrite"];
154
+ export class CostPane {
155
+ constructor(host, model) {
156
+ this.crumb = "cost";
157
+ this.index = 0;
158
+ this.focused = false;
159
+ this.host = host;
160
+ this.model = model;
161
+ }
162
+ cost() {
163
+ const cost = this.model.read().cost;
164
+ if (!cost)
165
+ return undefined;
166
+ return { input: cost.input, output: cost.output, cacheRead: cost.cacheRead, cacheWrite: cost.cacheWrite };
167
+ }
168
+ render(width) {
169
+ const theme = this.host.theme;
170
+ const cost = this.cost();
171
+ const lines = [];
172
+ for (const [rowIndex, rate] of COST_RATES.entries()) {
173
+ const value = cost?.[rate];
174
+ lines.push(renderKeyValueLine(theme, {
175
+ keyLabel: rate,
176
+ valueText: value === undefined ? "0 (default)" : `$${value} / M tokens`,
177
+ unset: value === undefined,
178
+ active: rowIndex === this.index,
179
+ paneFocused: this.focused,
180
+ editing: this.editingRate === rate ? this.editing : undefined,
181
+ width,
182
+ }));
183
+ }
184
+ const tiers = this.model.read().cost?.tiers;
185
+ if (tiers && tiers.length > 0) {
186
+ lines.push(renderInfoLine(theme, `tiers: ${tiers.length} (read-only; kept as-is)`, width));
187
+ }
188
+ if (this.error)
189
+ lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
190
+ return lines;
191
+ }
192
+ handleInput(data) {
193
+ const kb = this.host.keybindings;
194
+ if (this.editing) {
195
+ if (kb.matches(data, "tui.select.up") || kb.matches(data, "tui.select.down"))
196
+ return;
197
+ this.editing.handleInput(data);
198
+ this.host.refresh();
199
+ return;
200
+ }
201
+ if (kb.matches(data, "tui.select.up")) {
202
+ this.index = this.index === 0 ? COST_RATES.length - 1 : this.index - 1;
203
+ this.host.refresh();
204
+ return;
205
+ }
206
+ if (kb.matches(data, "tui.select.down")) {
207
+ this.index = (this.index + 1) % COST_RATES.length;
208
+ this.host.refresh();
209
+ return;
210
+ }
211
+ if (kb.matches(data, "tui.select.cancel")) {
212
+ this.host.popPane();
213
+ return;
214
+ }
215
+ if (kb.matches(data, "tui.select.confirm")) {
216
+ this.beginEdit("tweak");
217
+ return;
218
+ }
219
+ if (isPrintableInput(data)) {
220
+ this.beginEdit("overwrite", data);
221
+ return;
222
+ }
223
+ }
224
+ beginEdit(mode, firstData) {
225
+ const rate = COST_RATES[this.index];
226
+ const current = this.cost()?.[rate];
227
+ const editor = new ValueEditor({
228
+ onCommit: (value) => this.commit(rate, value),
229
+ onCancel: () => {
230
+ this.editing = undefined;
231
+ this.editingRate = undefined;
232
+ this.error = undefined;
233
+ this.host.refresh();
234
+ },
235
+ });
236
+ this.editing = editor;
237
+ this.editingRate = rate;
238
+ editor.focused = this.focused;
239
+ if (mode === "overwrite")
240
+ editor.beginOverwrite(firstData);
241
+ else
242
+ editor.beginTweak(current === undefined ? "" : String(current));
243
+ this.host.refresh();
244
+ }
245
+ commit(rate, raw) {
246
+ const value = raw.trim();
247
+ const parsed = value === "" ? 0 : Number(value);
248
+ if (!Number.isFinite(parsed) || parsed < 0) {
249
+ this.error = "cost rates must be finite non-negative numbers.";
250
+ this.host.refresh();
251
+ return;
252
+ }
253
+ this.error = undefined;
254
+ this.editing = undefined;
255
+ this.editingRate = undefined;
256
+ // A cost object must stay complete: first edit materializes the other rates as 0; tiers are preserved.
257
+ this.host.mutate(() => {
258
+ if (this.model.read().cost)
259
+ this.model.setField(["cost", rate], parsed);
260
+ else
261
+ this.model.setField(["cost"], { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, [rate]: parsed });
262
+ });
263
+ }
264
+ setFocused(focused) {
265
+ this.focused = focused;
266
+ if (this.editing)
267
+ this.editing.focused = focused;
268
+ }
269
+ isEditing() {
270
+ return this.editing !== undefined;
271
+ }
272
+ hints() {
273
+ if (this.editing)
274
+ return [keyHint("tui.input.submit", "save"), keyHint("tui.select.cancel", "cancel")].join(" ");
275
+ return [
276
+ rawKeyHint("type", "overwrite"),
277
+ keyHint("tui.select.confirm", "edit"),
278
+ keyHint("tui.select.cancel", "back"),
279
+ ].join(" ");
280
+ }
281
+ }
282
+ // -------------------------------------------------------------------------
283
+ // Model-Specific API
284
+ // -------------------------------------------------------------------------
285
+ /**
286
+ * Model-level baseUrl / API Type overrides. Unset rows show the inherited
287
+ * provider or built-in value dimmed; typing on a row (or editing the shown
288
+ * value) writes an override, clearing it returns to inheritance.
289
+ */
290
+ export class ModelSpecificApiPane {
291
+ constructor(host, model) {
292
+ this.crumb = "Model-Specific API";
293
+ this.rows = ["baseUrl", "apiType"];
294
+ this.index = 0;
295
+ this.focused = false;
296
+ this.host = host;
297
+ this.model = model;
298
+ }
299
+ /** Where an unset model field resolves from; undefined when nothing resolves it. */
300
+ inherited(key) {
301
+ const provider = this.host.store.getProvider(this.host.providerId);
302
+ const providerValue = key === "api" ? provider?.api : provider?.baseUrl;
303
+ if (providerValue)
304
+ return { value: providerValue, via: "provider" };
305
+ const current = this.model.read();
306
+ const effective = key === "api" ? this.host.effectiveApi(current) : this.host.effectiveBaseUrl(current);
307
+ return effective ? { value: effective, via: "built-in" } : undefined;
308
+ }
309
+ render(width) {
310
+ const theme = this.host.theme;
311
+ const current = this.model.read();
312
+ const lines = [];
313
+ for (const [rowIndex, row] of this.rows.entries()) {
314
+ const active = rowIndex === this.index;
315
+ if (row === "baseUrl") {
316
+ const override = current.baseUrl;
317
+ const inherited = override ? undefined : this.inherited("baseUrl");
318
+ lines.push(renderKeyValueLine(theme, {
319
+ keyLabel: "baseUrl",
320
+ valueText: override ?? inherited?.value ?? "not set",
321
+ unset: !override,
322
+ note: inherited ? `· ${inherited.via}` : undefined,
323
+ active,
324
+ paneFocused: this.focused,
325
+ editing: this.editing,
326
+ width,
327
+ }));
328
+ }
329
+ else {
330
+ const override = current.api;
331
+ const inherited = override ? undefined : this.inherited("api");
332
+ lines.push(renderKeyValueLine(theme, {
333
+ keyLabel: "API Type",
334
+ valueText: override ?? inherited?.value ?? "not set",
335
+ unset: !override,
336
+ note: inherited ? `· ${inherited.via}` : undefined,
337
+ active,
338
+ paneFocused: this.focused,
339
+ width,
340
+ }));
341
+ }
342
+ }
343
+ if (this.error)
344
+ lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
345
+ const hint = baseUrlHint(this.host.effectiveApi(current));
346
+ if (hint)
347
+ lines.push(renderInfoLine(theme, hint, width));
348
+ return lines;
349
+ }
350
+ handleInput(data) {
351
+ const kb = this.host.keybindings;
352
+ if (this.editing) {
353
+ if (kb.matches(data, "tui.select.up") || kb.matches(data, "tui.select.down"))
354
+ return;
355
+ this.editing.handleInput(data);
356
+ this.host.refresh();
357
+ return;
358
+ }
359
+ if (kb.matches(data, "tui.select.up")) {
360
+ this.index = this.index === 0 ? this.rows.length - 1 : this.index - 1;
361
+ this.host.refresh();
362
+ return;
363
+ }
364
+ if (kb.matches(data, "tui.select.down")) {
365
+ this.index = (this.index + 1) % this.rows.length;
366
+ this.host.refresh();
367
+ return;
368
+ }
369
+ if (kb.matches(data, "tui.select.cancel")) {
370
+ this.host.popPane();
371
+ return;
372
+ }
373
+ if (kb.matches(data, "tui.select.confirm")) {
374
+ if (this.rows[this.index] === "apiType")
375
+ this.host.pushPane(new ModelApiTypePane(this.host, this.model));
376
+ else
377
+ this.beginEdit("tweak");
378
+ return;
379
+ }
380
+ if (isPrintableInput(data)) {
381
+ if (this.rows[this.index] === "apiType")
382
+ return;
383
+ this.beginEdit("overwrite", data);
384
+ return;
385
+ }
386
+ }
387
+ /** Tweak starts from the inherited value, so adjusting it writes the override directly. */
388
+ beginEdit(mode, firstData) {
389
+ const current = this.model.read();
390
+ const base = current.baseUrl ?? this.inherited("baseUrl")?.value ?? "";
391
+ const editor = new ValueEditor({
392
+ onCommit: (value) => this.commit(value),
393
+ onCancel: () => {
394
+ this.editing = undefined;
395
+ this.error = undefined;
396
+ this.host.refresh();
397
+ },
398
+ });
399
+ this.editing = editor;
400
+ editor.focused = this.focused;
401
+ if (mode === "overwrite")
402
+ editor.beginOverwrite(firstData);
403
+ else
404
+ editor.beginTweak(base);
405
+ this.host.refresh();
406
+ }
407
+ commit(raw) {
408
+ const value = raw.trim();
409
+ if (value) {
410
+ const invalid = validateBaseUrlValue(value);
411
+ if (invalid) {
412
+ this.error = invalid;
413
+ this.host.refresh();
414
+ return;
415
+ }
416
+ }
417
+ this.error = undefined;
418
+ this.editing = undefined;
419
+ this.host.mutate(() => this.model.setField(["baseUrl"], value === "" ? DELETE : value));
420
+ }
421
+ setFocused(focused) {
422
+ this.focused = focused;
423
+ if (this.editing)
424
+ this.editing.focused = focused;
425
+ }
426
+ isEditing() {
427
+ return this.editing !== undefined;
428
+ }
429
+ hints() {
430
+ if (this.editing)
431
+ return [keyHint("tui.input.submit", "save"), keyHint("tui.select.cancel", "cancel")].join(" ");
432
+ return [
433
+ rawKeyHint("type", "overwrite"),
434
+ keyHint("tui.select.confirm", "edit / open"),
435
+ keyHint("tui.select.cancel", "back"),
436
+ ].join(" ");
437
+ }
438
+ }
439
+ /** Single-select model api: the inherited default plus every known API tag. Enter applies and returns. */
440
+ export class ModelApiTypePane {
441
+ constructor(host, model) {
442
+ this.crumb = "API Type";
443
+ this.index = 0;
444
+ this.focused = false;
445
+ this.host = host;
446
+ this.model = model;
447
+ const current = model.read().api;
448
+ const options = this.options();
449
+ this.index = Math.max(0, options.findIndex((option) => option.value === current));
450
+ }
451
+ /** The api this model inherits when it defines none — provider first, then the built-in catalog. */
452
+ fallback() {
453
+ const provider = this.host.store.getProvider(this.host.providerId);
454
+ return provider?.api ?? builtinDefaults(this.host.providerId, this.model.read().id, provider?.api).api;
455
+ }
456
+ /** value undefined = inherit; a custom api already stored is preserved and appended. */
457
+ options() {
458
+ const current = this.model.read().api;
459
+ const providerApi = this.host.store.getProvider(this.host.providerId)?.api;
460
+ const fallback = this.fallback();
461
+ const inheritedLabel = providerApi
462
+ ? `provider: ${providerApi}`
463
+ : fallback
464
+ ? `built-in: ${fallback}`
465
+ : "no provider or built-in API";
466
+ const options = [{ label: inheritedLabel, value: undefined }];
467
+ for (const api of API_TYPES)
468
+ options.push({ label: api, value: api });
469
+ if (current && !API_TYPES.includes(current))
470
+ options.push({ label: current, value: current });
471
+ return options;
472
+ }
473
+ render(width) {
474
+ const theme = this.host.theme;
475
+ const current = this.model.read().api;
476
+ const lines = this.options().map((option, rowIndex) => {
477
+ const selected = option.value === current;
478
+ return renderPlainLine(theme, `${selected ? "●" : "○"} ${option.label}`, {
479
+ active: rowIndex === this.index,
480
+ paneFocused: this.focused,
481
+ dim: option.value === undefined,
482
+ width,
483
+ });
484
+ });
485
+ if (this.error)
486
+ lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
487
+ return lines;
488
+ }
489
+ handleInput(data) {
490
+ const kb = this.host.keybindings;
491
+ const options = this.options();
492
+ if (kb.matches(data, "tui.select.up")) {
493
+ this.index = this.index === 0 ? options.length - 1 : this.index - 1;
494
+ this.host.refresh();
495
+ return;
496
+ }
497
+ if (kb.matches(data, "tui.select.down")) {
498
+ this.index = (this.index + 1) % options.length;
499
+ this.host.refresh();
500
+ return;
501
+ }
502
+ if (kb.matches(data, "tui.select.cancel")) {
503
+ this.host.popPane();
504
+ return;
505
+ }
506
+ if (kb.matches(data, "tui.select.confirm") || kb.matches(data, "app.list.toggle")) {
507
+ const option = options[this.index];
508
+ if (option.value === undefined && !this.fallback()) {
509
+ this.error = "Nothing to inherit — pick an API.";
510
+ this.host.refresh();
511
+ return;
512
+ }
513
+ this.error = undefined;
514
+ this.host.mutate(() => this.model.setField(["api"], option.value ?? DELETE));
515
+ this.host.popPane();
516
+ }
517
+ }
518
+ setFocused(focused) {
519
+ this.focused = focused;
520
+ }
521
+ hints() {
522
+ return [
523
+ rawKeyHint("↑↓", "move"),
524
+ keyHint("tui.select.confirm", "select"),
525
+ keyHint("tui.select.cancel", "back"),
526
+ ].join(" ");
527
+ }
528
+ }
529
+ //# sourceMappingURL=model-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-options.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-options.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAE3G,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2DAA2D,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAkB,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpH,4EAA4E;AAC5E,YAAY;AACZ,4EAA4E;AAE5E,MAAM,iBAAiB,GAAG;IACzB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;IAC9B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IAChC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE;CACrC,CAAC;AAEX,sFAAsF;AACtF,MAAM,OAAO,aAAa;IAOzB,YAAY,IAAgB,EAAE,KAAkB;QANvC,UAAK,GAAG,WAAW,CAAC;QACrB,UAAK,GAAG,CAAC,CAAC;QACV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QAC5C,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;YAC/F,OAAO,eAAe,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE;gBACxE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,KAAK;gBAClC,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,GAAG,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS;gBAC/B,KAAK;aACL,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/G,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACF,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK;QACJ,OAAO;YACN,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;YACxB,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC;YACpC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,4EAA4E;AAC5E,mBAAmB;AACnB,4EAA4E;AAE5E,MAAM,OAAO,cAAc;IAQ1B,YAAY,IAAgB,EAAE,KAAkB;QAPvC,UAAK,GAAG,OAAO,CAAC;QACjB,UAAK,GAAG,CAAC,CAAC;QAEV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAEO,QAAQ;QACf,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAChD,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE;YAC5B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;YAC/B,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,KAAK;SACL,CAAC,CACF,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAc,WAAW,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,GAAG,6CAA6C,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO;gBACR,CAAC;gBACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClE,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;IACF,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK;QACJ,OAAO;YACN,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;YACpC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;YACrC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,4EAA4E;AAC5E,OAAO;AACP,4EAA4E;AAE5E,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAG3E,MAAM,OAAO,QAAQ;IAUpB,YAAY,IAAgB,EAAE,KAAkB;QATvC,UAAK,GAAG,MAAM,CAAC;QAChB,UAAK,GAAG,CAAC,CAAC;QAIV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAEO,IAAI;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3G,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CACT,kBAAkB,CAAC,KAAK,EAAE;gBACzB,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa;gBACvE,KAAK,EAAE,KAAK,KAAK,SAAS;gBAC1B,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;gBAC/B,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,OAAO,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBAC7D,KAAK;aACL,CAAC,CACF,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,MAAM,0BAA0B,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAAE,OAAO;YACrF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;IACF,CAAC;IAEO,SAAS,CAAC,IAA2B,EAAE,SAAkB;QAChE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;YAC7C,QAAQ,EAAE,GAAG,EAAE;gBACd,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;SACD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,IAAI,IAAI,KAAK,WAAW;YAAE,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;;YACtD,MAAM,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,IAAc,EAAE,GAAW;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,GAAG,iDAAiD,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,uGAAuG;QACvG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACrB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;;gBACnE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1G,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAClD,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACnC,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClH,OAAO;YACN,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/B,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;YACrC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,4EAA4E;AAC5E,qBAAqB;AACrB,4EAA4E;AAE5E;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAUhC,YAAY,IAAgB,EAAE,KAAkB;QATvC,UAAK,GAAG,oBAAoB,CAAC;QACrB,SAAI,GAAG,CAAC,SAAS,EAAE,SAAS,CAAU,CAAC;QAChD,UAAK,GAAG,CAAC,CAAC;QAGV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,oFAAoF;IAC5E,SAAS,CAAC,GAAsB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC;QACxE,IAAI,aAAa;YAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACxG,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC;YACvC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;gBACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACnE,KAAK,CAAC,IAAI,CACT,kBAAkB,CAAC,KAAK,EAAE;oBACzB,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,QAAQ,IAAI,SAAS,EAAE,KAAK,IAAI,SAAS;oBACpD,KAAK,EAAE,CAAC,QAAQ;oBAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;oBAClD,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK;iBACL,CAAC,CACF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;gBAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC/D,KAAK,CAAC,IAAI,CACT,kBAAkB,CAAC,KAAK,EAAE;oBACzB,QAAQ,EAAE,UAAU;oBACpB,SAAS,EAAE,QAAQ,IAAI,SAAS,EAAE,KAAK,IAAI,SAAS;oBACpD,KAAK,EAAE,CAAC,QAAQ;oBAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;oBAClD,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,KAAK;iBACL,CAAC,CACF,CAAC;YACH,CAAC;QACF,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAAE,OAAO;YACrF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;;gBACpG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO;QACR,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,OAAO;YAChD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;IACF,CAAC;IAED,2FAA2F;IACnF,SAAS,CAAC,IAA2B,EAAE,SAAkB;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC,QAAQ,EAAE,GAAG,EAAE;gBACd,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;SACD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,IAAI,IAAI,KAAK,WAAW;YAAE,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;;YACtD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,GAAW;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;YACR,CAAC;QACF,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAClD,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACnC,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClH,OAAO;YACN,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/B,OAAO,CAAC,oBAAoB,EAAE,aAAa,CAAC;YAC5C,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD;AAED,0GAA0G;AAC1G,MAAM,OAAO,gBAAgB;IAQ5B,YAAY,IAAgB,EAAE,KAAkB;QAPvC,UAAK,GAAG,UAAU,CAAC;QACpB,UAAK,GAAG,CAAC,CAAC;QAEV,YAAO,GAAG,KAAK,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CACvD,CAAC;IACH,CAAC;IAED,oGAAoG;IAC5F,QAAQ;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,OAAO,QAAQ,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;IACxG,CAAC;IAED,wFAAwF;IAChF,OAAO;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;QAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,WAAW;YACjC,CAAC,CAAC,aAAa,WAAW,EAAE;YAC5B,CAAC,CAAC,QAAQ;gBACT,CAAC,CAAC,aAAa,QAAQ,EAAE;gBACzB,CAAC,CAAC,6BAA6B,CAAC;QAClC,MAAM,OAAO,GAAmD,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9G,KAAK,MAAM,GAAG,IAAI,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtE,IAAI,OAAO,IAAI,CAAE,SAA+B,CAAC,QAAQ,CAAC,OAAO,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC;YAC1C,OAAO,eAAe,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE;gBACxE,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;gBAC/B,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,GAAG,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS;gBAC/B,KAAK;aACL,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YACpC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpD,IAAI,CAAC,KAAK,GAAG,mCAAmC,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACF,CAAC;IAED,UAAU,CAAC,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK;QACJ,OAAO;YACN,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;YACxB,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC;YACvC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD","sourcesContent":["/** Scalar model settings: reasoning, input modalities, cost rates, and the model-specific API override. */\n\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { builtinDefaults } from \"../catalog.ts\";\nimport { API_TYPES, INPUT_TYPES, type InputType, truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { baseUrlHint, validateBaseUrlValue } from \"./provider-fields.ts\";\nimport { isPrintableInput, renderInfoLine, renderKeyValueLine, renderPlainLine, ValueEditor } from \"./value-row.ts\";\n\n// -------------------------------------------------------------------------\n// reasoning\n// -------------------------------------------------------------------------\n\nconst REASONING_OPTIONS = [\n\t{ label: \"true\", value: true },\n\t{ label: \"false\", value: false },\n\t{ label: \"default (false)\", value: undefined },\n] as const;\n\n/** Radio sub-page for reasoning — consistent with the other nested model settings. */\nexport class ReasoningPane implements EditorPane {\n\treadonly crumb = \"reasoning\";\n\tprivate index = 0;\n\tprivate focused = false;\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tconst current = model.read().reasoning;\n\t\tthis.index = current === true ? 0 : current === false ? 1 : 2;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read().reasoning;\n\t\treturn REASONING_OPTIONS.map((option, optionIndex) => {\n\t\t\tconst selected = option.value === undefined ? current === undefined : current === option.value;\n\t\t\treturn renderPlainLine(theme, `${selected ? \"●\" : \"○\"} ${option.label}`, {\n\t\t\t\tactive: optionIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\tdim: option.value === undefined,\n\t\t\t\twidth,\n\t\t\t});\n\t\t});\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? REASONING_OPTIONS.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = (this.index + 1) % REASONING_OPTIONS.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst option = REASONING_OPTIONS[this.index]!;\n\t\t\tthis.host.mutate(() => this.model.setField([\"reasoning\"], option.value === undefined ? DELETE : option.value));\n\t\t\tthis.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"set\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// input modalities\n// -------------------------------------------------------------------------\n\nexport class InputTypesPane implements EditorPane {\n\treadonly crumb = \"input\";\n\tprivate index = 0;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate selected(): Set<string> {\n\t\treturn new Set(this.model.read().input ?? [\"text\"]);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst selected = this.selected();\n\t\tconst lines = INPUT_TYPES.map((type, rowIndex) =>\n\t\t\trenderPlainLine(theme, type, {\n\t\t\t\tchecked: selected.has(type),\n\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.model.read().input === undefined) {\n\t\t\tlines.push(renderInfoLine(theme, \"Not set — the runtime default is [text].\", width));\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? INPUT_TYPES.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = (this.index + 1) % INPUT_TYPES.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst type: InputType = INPUT_TYPES[this.index]!;\n\t\t\tconst selected = this.selected();\n\t\t\tif (selected.has(type)) {\n\t\t\t\tif (selected.size === 1) {\n\t\t\t\t\tthis.error = \"At least one input type must stay selected.\";\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tselected.delete(type);\n\t\t\t} else {\n\t\t\t\tselected.add(type);\n\t\t\t}\n\t\t\tthis.error = undefined;\n\t\t\tconst next = INPUT_TYPES.filter((entry) => selected.has(entry));\n\t\t\tthis.host.mutate(() => this.model.setField([\"input\"], [...next]));\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\tkeyHint(\"app.list.toggle\", \"toggle\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"done\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// cost\n// -------------------------------------------------------------------------\n\nconst COST_RATES = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const;\ntype CostRate = (typeof COST_RATES)[number];\n\nexport class CostPane implements EditorPane {\n\treadonly crumb = \"cost\";\n\tprivate index = 0;\n\tprivate editing: ValueEditor | undefined;\n\tprivate editingRate: CostRate | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\tprivate cost(): Record<CostRate, number> | undefined {\n\t\tconst cost = this.model.read().cost;\n\t\tif (!cost) return undefined;\n\t\treturn { input: cost.input, output: cost.output, cacheRead: cost.cacheRead, cacheWrite: cost.cacheWrite };\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst cost = this.cost();\n\t\tconst lines: string[] = [];\n\t\tfor (const [rowIndex, rate] of COST_RATES.entries()) {\n\t\t\tconst value = cost?.[rate];\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: rate,\n\t\t\t\t\tvalueText: value === undefined ? \"0 (default)\" : `$${value} / M tokens`,\n\t\t\t\t\tunset: value === undefined,\n\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting: this.editingRate === rate ? this.editing : undefined,\n\t\t\t\t\twidth,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst tiers = this.model.read().cost?.tiers;\n\t\tif (tiers && tiers.length > 0) {\n\t\t\tlines.push(renderInfoLine(theme, `tiers: ${tiers.length} (read-only; kept as-is)`, width));\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.editing) {\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\tthis.editing.handleInput(data);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? COST_RATES.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = (this.index + 1) % COST_RATES.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.beginEdit(\"tweak\");\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tthis.beginEdit(\"overwrite\", data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate beginEdit(mode: \"overwrite\" | \"tweak\", firstData?: string): void {\n\t\tconst rate = COST_RATES[this.index]!;\n\t\tconst current = this.cost()?.[rate];\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => this.commit(rate, value),\n\t\t\tonCancel: () => {\n\t\t\t\tthis.editing = undefined;\n\t\t\t\tthis.editingRate = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.editing = editor;\n\t\tthis.editingRate = rate;\n\t\teditor.focused = this.focused;\n\t\tif (mode === \"overwrite\") editor.beginOverwrite(firstData);\n\t\telse editor.beginTweak(current === undefined ? \"\" : String(current));\n\t\tthis.host.refresh();\n\t}\n\n\tprivate commit(rate: CostRate, raw: string): void {\n\t\tconst value = raw.trim();\n\t\tconst parsed = value === \"\" ? 0 : Number(value);\n\t\tif (!Number.isFinite(parsed) || parsed < 0) {\n\t\t\tthis.error = \"cost rates must be finite non-negative numbers.\";\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.error = undefined;\n\t\tthis.editing = undefined;\n\t\tthis.editingRate = undefined;\n\t\t// A cost object must stay complete: first edit materializes the other rates as 0; tiers are preserved.\n\t\tthis.host.mutate(() => {\n\t\t\tif (this.model.read().cost) this.model.setField([\"cost\", rate], parsed);\n\t\t\telse this.model.setField([\"cost\"], { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, [rate]: parsed });\n\t\t});\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.editing) this.editing.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.editing !== undefined;\n\t}\n\n\thints(): string {\n\t\tif (this.editing) return [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"overwrite\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n// -------------------------------------------------------------------------\n// Model-Specific API\n// -------------------------------------------------------------------------\n\n/**\n * Model-level baseUrl / API Type overrides. Unset rows show the inherited\n * provider or built-in value dimmed; typing on a row (or editing the shown\n * value) writes an override, clearing it returns to inheritance.\n */\nexport class ModelSpecificApiPane implements EditorPane {\n\treadonly crumb = \"Model-Specific API\";\n\tprivate readonly rows = [\"baseUrl\", \"apiType\"] as const;\n\tprivate index = 0;\n\tprivate editing: ValueEditor | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t}\n\n\t/** Where an unset model field resolves from; undefined when nothing resolves it. */\n\tprivate inherited(key: \"api\" | \"baseUrl\"): { value: string; via: \"provider\" | \"built-in\" } | undefined {\n\t\tconst provider = this.host.store.getProvider(this.host.providerId);\n\t\tconst providerValue = key === \"api\" ? provider?.api : provider?.baseUrl;\n\t\tif (providerValue) return { value: providerValue, via: \"provider\" };\n\t\tconst current = this.model.read();\n\t\tconst effective = key === \"api\" ? this.host.effectiveApi(current) : this.host.effectiveBaseUrl(current);\n\t\treturn effective ? { value: effective, via: \"built-in\" } : undefined;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read();\n\t\tconst lines: string[] = [];\n\t\tfor (const [rowIndex, row] of this.rows.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tif (row === \"baseUrl\") {\n\t\t\t\tconst override = current.baseUrl;\n\t\t\t\tconst inherited = override ? undefined : this.inherited(\"baseUrl\");\n\t\t\t\tlines.push(\n\t\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\t\tkeyLabel: \"baseUrl\",\n\t\t\t\t\t\tvalueText: override ?? inherited?.value ?? \"not set\",\n\t\t\t\t\t\tunset: !override,\n\t\t\t\t\t\tnote: inherited ? `· ${inherited.via}` : undefined,\n\t\t\t\t\t\tactive,\n\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\tediting: this.editing,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst override = current.api;\n\t\t\t\tconst inherited = override ? undefined : this.inherited(\"api\");\n\t\t\t\tlines.push(\n\t\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\t\tkeyLabel: \"API Type\",\n\t\t\t\t\t\tvalueText: override ?? inherited?.value ?? \"not set\",\n\t\t\t\t\t\tunset: !override,\n\t\t\t\t\t\tnote: inherited ? `· ${inherited.via}` : undefined,\n\t\t\t\t\t\tactive,\n\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\tconst hint = baseUrlHint(this.host.effectiveApi(current));\n\t\tif (hint) lines.push(renderInfoLine(theme, hint, width));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (this.editing) {\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\tthis.editing.handleInput(data);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? this.rows.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = (this.index + 1) % this.rows.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.rows[this.index] === \"apiType\") this.host.pushPane(new ModelApiTypePane(this.host, this.model));\n\t\t\telse this.beginEdit(\"tweak\");\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tif (this.rows[this.index] === \"apiType\") return;\n\t\t\tthis.beginEdit(\"overwrite\", data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/** Tweak starts from the inherited value, so adjusting it writes the override directly. */\n\tprivate beginEdit(mode: \"overwrite\" | \"tweak\", firstData?: string): void {\n\t\tconst current = this.model.read();\n\t\tconst base = current.baseUrl ?? this.inherited(\"baseUrl\")?.value ?? \"\";\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => this.commit(value),\n\t\t\tonCancel: () => {\n\t\t\t\tthis.editing = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.editing = editor;\n\t\teditor.focused = this.focused;\n\t\tif (mode === \"overwrite\") editor.beginOverwrite(firstData);\n\t\telse editor.beginTweak(base);\n\t\tthis.host.refresh();\n\t}\n\n\tprivate commit(raw: string): void {\n\t\tconst value = raw.trim();\n\t\tif (value) {\n\t\t\tconst invalid = validateBaseUrlValue(value);\n\t\t\tif (invalid) {\n\t\t\t\tthis.error = invalid;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.error = undefined;\n\t\tthis.editing = undefined;\n\t\tthis.host.mutate(() => this.model.setField([\"baseUrl\"], value === \"\" ? DELETE : value));\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.editing) this.editing.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.editing !== undefined;\n\t}\n\n\thints(): string {\n\t\tif (this.editing) return [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\treturn [\n\t\t\trawKeyHint(\"type\", \"overwrite\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"edit / open\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n/** Single-select model api: the inherited default plus every known API tag. Enter applies and returns. */\nexport class ModelApiTypePane implements EditorPane {\n\treadonly crumb = \"API Type\";\n\tprivate index = 0;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tconstructor(host: EditorHost, model: ModelHandle) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\n\t\tconst current = model.read().api;\n\t\tconst options = this.options();\n\t\tthis.index = Math.max(\n\t\t\t0,\n\t\t\toptions.findIndex((option) => option.value === current),\n\t\t);\n\t}\n\n\t/** The api this model inherits when it defines none — provider first, then the built-in catalog. */\n\tprivate fallback(): string | undefined {\n\t\tconst provider = this.host.store.getProvider(this.host.providerId);\n\t\treturn provider?.api ?? builtinDefaults(this.host.providerId, this.model.read().id, provider?.api).api;\n\t}\n\n\t/** value undefined = inherit; a custom api already stored is preserved and appended. */\n\tprivate options(): { label: string; value: string | undefined }[] {\n\t\tconst current = this.model.read().api;\n\t\tconst providerApi = this.host.store.getProvider(this.host.providerId)?.api;\n\t\tconst fallback = this.fallback();\n\t\tconst inheritedLabel = providerApi\n\t\t\t? `provider: ${providerApi}`\n\t\t\t: fallback\n\t\t\t\t? `built-in: ${fallback}`\n\t\t\t\t: \"no provider or built-in API\";\n\t\tconst options: { label: string; value: string | undefined }[] = [{ label: inheritedLabel, value: undefined }];\n\t\tfor (const api of API_TYPES) options.push({ label: api, value: api });\n\t\tif (current && !(API_TYPES as readonly string[]).includes(current))\n\t\t\toptions.push({ label: current, value: current });\n\t\treturn options;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst current = this.model.read().api;\n\t\tconst lines = this.options().map((option, rowIndex) => {\n\t\t\tconst selected = option.value === current;\n\t\t\treturn renderPlainLine(theme, `${selected ? \"●\" : \"○\"} ${option.label}`, {\n\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\tdim: option.value === undefined,\n\t\t\t\twidth,\n\t\t\t});\n\t\t});\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst options = this.options();\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.index = this.index === 0 ? options.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = (this.index + 1) % options.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst option = options[this.index]!;\n\t\t\tif (option.value === undefined && !this.fallback()) {\n\t\t\t\tthis.error = \"Nothing to inherit — pick an API.\";\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.error = undefined;\n\t\t\tthis.host.mutate(() => this.model.setField([\"api\"], option.value ?? DELETE));\n\t\t\tthis.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"select\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}