@astralyn/pi 0.85.1 → 0.85.2

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 (248) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cli.js +94 -91
  3. package/dist/core/agent-session.js +2 -2
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/background/history.d.ts.map +1 -1
  6. package/dist/core/background/history.js +6 -0
  7. package/dist/core/background/history.js.map +1 -1
  8. package/dist/core/background/presentation.d.ts.map +1 -1
  9. package/dist/core/background/presentation.js +41 -4
  10. package/dist/core/background/presentation.js.map +1 -1
  11. package/dist/core/background/service.d.ts +2 -2
  12. package/dist/core/background/service.d.ts.map +1 -1
  13. package/dist/core/background/service.js +38 -15
  14. package/dist/core/background/service.js.map +1 -1
  15. package/dist/core/background/types.d.ts +9 -0
  16. package/dist/core/background/types.d.ts.map +1 -1
  17. package/dist/core/background/types.js +4 -0
  18. package/dist/core/background/types.js.map +1 -1
  19. package/dist/core/compaction/compaction.d.ts +5 -12
  20. package/dist/core/compaction/compaction.d.ts.map +1 -1
  21. package/dist/core/compaction/compaction.js +11 -19
  22. package/dist/core/compaction/compaction.js.map +1 -1
  23. package/dist/core/compaction/settings.d.ts +27 -0
  24. package/dist/core/compaction/settings.d.ts.map +1 -0
  25. package/dist/core/compaction/settings.js +40 -0
  26. package/dist/core/compaction/settings.js.map +1 -0
  27. package/dist/core/keybindings.d.ts +15 -0
  28. package/dist/core/keybindings.d.ts.map +1 -1
  29. package/dist/core/keybindings.js +12 -0
  30. package/dist/core/keybindings.js.map +1 -1
  31. package/dist/core/model-config.d.ts +32 -10
  32. package/dist/core/model-config.d.ts.map +1 -1
  33. package/dist/core/model-config.js +38 -1
  34. package/dist/core/model-config.js.map +1 -1
  35. package/dist/core/model-runtime.d.ts +2 -0
  36. package/dist/core/model-runtime.d.ts.map +1 -1
  37. package/dist/core/model-runtime.js +4 -0
  38. package/dist/core/model-runtime.js.map +1 -1
  39. package/dist/core/settings-manager.d.ts +4 -7
  40. package/dist/core/settings-manager.d.ts.map +1 -1
  41. package/dist/core/settings-manager.js +7 -6
  42. package/dist/core/settings-manager.js.map +1 -1
  43. package/dist/core/tools/bash.js +1 -1
  44. package/dist/core/tools/bash.js.map +1 -1
  45. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  46. package/dist/core/tools/shell-execution.js +3 -1
  47. package/dist/core/tools/shell-execution.js.map +1 -1
  48. package/dist/extensions/background/manager.d.ts +8 -5
  49. package/dist/extensions/background/manager.d.ts.map +1 -1
  50. package/dist/extensions/background/manager.js +115 -39
  51. package/dist/extensions/background/manager.js.map +1 -1
  52. package/dist/extensions/background/task-view.d.ts +5 -0
  53. package/dist/extensions/background/task-view.d.ts.map +1 -1
  54. package/dist/extensions/background/task-view.js +4 -0
  55. package/dist/extensions/background/task-view.js.map +1 -1
  56. package/dist/extensions/btw/controller.d.ts +1 -1
  57. package/dist/extensions/btw/controller.d.ts.map +1 -1
  58. package/dist/extensions/btw/controller.js +4 -4
  59. package/dist/extensions/btw/controller.js.map +1 -1
  60. package/dist/extensions/btw/index.js +3 -3
  61. package/dist/extensions/btw/index.js.map +1 -1
  62. package/dist/extensions/index.js +2 -2
  63. package/dist/extensions/index.js.map +1 -1
  64. package/dist/extensions/provider/catalog.d.ts +57 -0
  65. package/dist/extensions/provider/catalog.d.ts.map +1 -0
  66. package/dist/extensions/provider/catalog.js +181 -0
  67. package/dist/extensions/provider/catalog.js.map +1 -0
  68. package/dist/extensions/provider/compat-fields.d.ts +25 -0
  69. package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
  70. package/dist/extensions/provider/compat-fields.js +148 -0
  71. package/dist/extensions/provider/compat-fields.js.map +1 -0
  72. package/dist/extensions/provider/configuration.d.ts +8 -0
  73. package/dist/extensions/provider/configuration.d.ts.map +1 -0
  74. package/dist/extensions/provider/configuration.js +21 -0
  75. package/dist/extensions/provider/configuration.js.map +1 -0
  76. package/dist/extensions/provider/connection.d.ts +14 -0
  77. package/dist/extensions/provider/connection.d.ts.map +1 -0
  78. package/dist/extensions/provider/connection.js +86 -0
  79. package/dist/extensions/provider/connection.js.map +1 -0
  80. package/dist/extensions/provider/constants.d.ts +38 -0
  81. package/dist/extensions/provider/constants.d.ts.map +1 -0
  82. package/dist/extensions/provider/constants.js +75 -0
  83. package/dist/extensions/provider/constants.js.map +1 -0
  84. package/dist/extensions/provider/index.d.ts +4 -0
  85. package/dist/extensions/provider/index.d.ts.map +1 -0
  86. package/dist/extensions/provider/index.js +65 -0
  87. package/dist/extensions/provider/index.js.map +1 -0
  88. package/dist/extensions/provider/probe.d.ts +34 -0
  89. package/dist/extensions/provider/probe.d.ts.map +1 -0
  90. package/dist/extensions/provider/probe.js +178 -0
  91. package/dist/extensions/provider/probe.js.map +1 -0
  92. package/dist/extensions/provider/refresh.d.ts +30 -0
  93. package/dist/extensions/provider/refresh.d.ts.map +1 -0
  94. package/dist/extensions/provider/refresh.js +66 -0
  95. package/dist/extensions/provider/refresh.js.map +1 -0
  96. package/dist/extensions/provider/store.d.ts +131 -0
  97. package/dist/extensions/provider/store.d.ts.map +1 -0
  98. package/dist/extensions/provider/store.js +503 -0
  99. package/dist/extensions/provider/store.js.map +1 -0
  100. package/dist/extensions/provider/ui/app.d.ts +25 -0
  101. package/dist/extensions/provider/ui/app.d.ts.map +1 -0
  102. package/dist/extensions/provider/ui/app.js +153 -0
  103. package/dist/extensions/provider/ui/app.js.map +1 -0
  104. package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
  105. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
  106. package/dist/extensions/provider/ui/builtin-data.js +315 -0
  107. package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
  108. package/dist/extensions/provider/ui/compat.d.ts +57 -0
  109. package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
  110. package/dist/extensions/provider/ui/compat.js +427 -0
  111. package/dist/extensions/provider/ui/compat.js.map +1 -0
  112. package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
  113. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
  114. package/dist/extensions/provider/ui/dialogs.js +89 -0
  115. package/dist/extensions/provider/ui/dialogs.js.map +1 -0
  116. package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
  117. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
  118. package/dist/extensions/provider/ui/dictionary.js +385 -0
  119. package/dist/extensions/provider/ui/dictionary.js.map +1 -0
  120. package/dist/extensions/provider/ui/editor.d.ts +91 -0
  121. package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
  122. package/dist/extensions/provider/ui/editor.js +667 -0
  123. package/dist/extensions/provider/ui/editor.js.map +1 -0
  124. package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
  125. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
  126. package/dist/extensions/provider/ui/fetch-models.js +320 -0
  127. package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
  128. package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
  129. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
  130. package/dist/extensions/provider/ui/model-fields.js +441 -0
  131. package/dist/extensions/provider/ui/model-fields.js.map +1 -0
  132. package/dist/extensions/provider/ui/model-options.d.ts +93 -0
  133. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
  134. package/dist/extensions/provider/ui/model-options.js +529 -0
  135. package/dist/extensions/provider/ui/model-options.js.map +1 -0
  136. package/dist/extensions/provider/ui/pane.d.ts +81 -0
  137. package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
  138. package/dist/extensions/provider/ui/pane.js +3 -0
  139. package/dist/extensions/provider/ui/pane.js.map +1 -0
  140. package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
  141. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
  142. package/dist/extensions/provider/ui/provider-fields.js +326 -0
  143. package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
  144. package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
  145. package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
  146. package/dist/extensions/provider/ui/provider-list.js +162 -0
  147. package/dist/extensions/provider/ui/provider-list.js.map +1 -0
  148. package/dist/extensions/provider/ui/session.d.ts +20 -0
  149. package/dist/extensions/provider/ui/session.d.ts.map +1 -0
  150. package/dist/extensions/provider/ui/session.js +52 -0
  151. package/dist/extensions/provider/ui/session.js.map +1 -0
  152. package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
  153. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
  154. package/dist/extensions/provider/ui/thinking-map.js +166 -0
  155. package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
  156. package/dist/extensions/provider/ui/value-row.d.ts +88 -0
  157. package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
  158. package/dist/extensions/provider/ui/value-row.js +158 -0
  159. package/dist/extensions/provider/ui/value-row.js.map +1 -0
  160. package/dist/extensions/statusline/index.js +2 -2
  161. package/dist/extensions/statusline/index.js.map +1 -1
  162. package/dist/extensions/subagent/index.d.ts.map +1 -1
  163. package/dist/extensions/subagent/index.js +4 -2
  164. package/dist/extensions/subagent/index.js.map +1 -1
  165. package/dist/extensions/subagent/resolve.d.ts +5 -0
  166. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  167. package/dist/extensions/subagent/resolve.js +15 -7
  168. package/dist/extensions/subagent/resolve.js.map +1 -1
  169. package/dist/extensions/subagent/schema.d.ts +2 -0
  170. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  171. package/dist/extensions/subagent/schema.js +1 -0
  172. package/dist/extensions/subagent/schema.js.map +1 -1
  173. package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
  174. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/tool-execution.js +20 -2
  176. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  177. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  178. package/dist/modes/interactive/interactive-mode.js +6 -1
  179. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  180. package/dist/rpc-entry.js +94 -91
  181. package/docs/bundled/README.md +1 -1
  182. package/docs/bundled/extensions/background.md +5 -5
  183. package/docs/bundled/extensions/provider.md +117 -0
  184. package/docs/bundled/extensions/statusline.md +1 -1
  185. package/docs/bundled/extensions/subagent.md +7 -3
  186. package/docs/compaction.md +16 -6
  187. package/docs/docs.json +2 -2
  188. package/docs/keybindings.md +3 -0
  189. package/docs/settings.md +11 -7
  190. package/npm-shrinkwrap.json +2 -2
  191. package/package.json +1 -1
  192. package/dist/extensions/router/constants.d.ts +0 -23
  193. package/dist/extensions/router/constants.d.ts.map +0 -1
  194. package/dist/extensions/router/constants.js +0 -30
  195. package/dist/extensions/router/constants.js.map +0 -1
  196. package/dist/extensions/router/dialog-host.d.ts +0 -60
  197. package/dist/extensions/router/dialog-host.d.ts.map +0 -1
  198. package/dist/extensions/router/dialog-host.js +0 -196
  199. package/dist/extensions/router/dialog-host.js.map +0 -1
  200. package/dist/extensions/router/dialog.d.ts +0 -45
  201. package/dist/extensions/router/dialog.d.ts.map +0 -1
  202. package/dist/extensions/router/dialog.js +0 -378
  203. package/dist/extensions/router/dialog.js.map +0 -1
  204. package/dist/extensions/router/identity.d.ts +0 -15
  205. package/dist/extensions/router/identity.d.ts.map +0 -1
  206. package/dist/extensions/router/identity.js +0 -173
  207. package/dist/extensions/router/identity.js.map +0 -1
  208. package/dist/extensions/router/index.d.ts +0 -15
  209. package/dist/extensions/router/index.d.ts.map +0 -1
  210. package/dist/extensions/router/index.js +0 -70
  211. package/dist/extensions/router/index.js.map +0 -1
  212. package/dist/extensions/router/presets.d.ts +0 -51
  213. package/dist/extensions/router/presets.d.ts.map +0 -1
  214. package/dist/extensions/router/presets.js +0 -108
  215. package/dist/extensions/router/presets.js.map +0 -1
  216. package/dist/extensions/router/probe.d.ts +0 -26
  217. package/dist/extensions/router/probe.d.ts.map +0 -1
  218. package/dist/extensions/router/probe.js +0 -216
  219. package/dist/extensions/router/probe.js.map +0 -1
  220. package/dist/extensions/router/register.d.ts +0 -12
  221. package/dist/extensions/router/register.d.ts.map +0 -1
  222. package/dist/extensions/router/register.js +0 -90
  223. package/dist/extensions/router/register.js.map +0 -1
  224. package/dist/extensions/router/state.d.ts +0 -20
  225. package/dist/extensions/router/state.d.ts.map +0 -1
  226. package/dist/extensions/router/state.js +0 -169
  227. package/dist/extensions/router/state.js.map +0 -1
  228. package/dist/extensions/router/store.d.ts +0 -12
  229. package/dist/extensions/router/store.d.ts.map +0 -1
  230. package/dist/extensions/router/store.js +0 -266
  231. package/dist/extensions/router/store.js.map +0 -1
  232. package/dist/extensions/router/stream.d.ts +0 -12
  233. package/dist/extensions/router/stream.d.ts.map +0 -1
  234. package/dist/extensions/router/stream.js +0 -233
  235. package/dist/extensions/router/stream.js.map +0 -1
  236. package/dist/extensions/router/transport.d.ts +0 -9
  237. package/dist/extensions/router/transport.d.ts.map +0 -1
  238. package/dist/extensions/router/transport.js +0 -81
  239. package/dist/extensions/router/transport.js.map +0 -1
  240. package/dist/extensions/router/types.d.ts +0 -39
  241. package/dist/extensions/router/types.d.ts.map +0 -1
  242. package/dist/extensions/router/types.js +0 -2
  243. package/dist/extensions/router/types.js.map +0 -1
  244. package/dist/extensions/router/ui.d.ts +0 -26
  245. package/dist/extensions/router/ui.d.ts.map +0 -1
  246. package/dist/extensions/router/ui.js +0 -897
  247. package/dist/extensions/router/ui.js.map +0 -1
  248. package/docs/bundled/extensions/router.md +0 -197
@@ -0,0 +1,441 @@
1
+ /**
2
+ * Model field pane (right column for a selected model) plus its nested
3
+ * sub-panes: thinkingLevelMap, input modalities, and cost. All edits flow
4
+ * through the ModelHandle — drafts mutate memory, persisted models queue
5
+ * store ops that save immediately.
6
+ */
7
+ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybinding-hints.js";
8
+ import { matchBuiltinModels } from "../catalog.js";
9
+ import { plural, truncate } from "../constants.js";
10
+ import { DELETE } from "../store.js";
11
+ import { BuiltinCandidatesPane } from "./builtin-data.js";
12
+ import { CompatPane } from "./compat.js";
13
+ import { CostPane, InputTypesPane, ModelSpecificApiPane, ReasoningPane } from "./model-options.js";
14
+ import { ThinkingMapPane } from "./thinking-map.js";
15
+ import { isPrintableInput, renderInfoLine, renderKeyValueLine, ValueEditor, } from "./value-row.js";
16
+ const DEFAULT_CONTEXT_WINDOW = 128000;
17
+ const DEFAULT_MAX_TOKENS = 16384;
18
+ export class ModelFieldsPane {
19
+ constructor(host, model) {
20
+ this.index = 0;
21
+ this.focused = false;
22
+ this.renaming = false;
23
+ this.disposed = false;
24
+ this.host = host;
25
+ this.model = model;
26
+ const rows = [
27
+ { kind: "text", key: "id" },
28
+ { kind: "text", key: "name" },
29
+ { kind: "reasoning" },
30
+ { kind: "subpage", key: "thinkingLevelMap" },
31
+ { kind: "subpage", key: "input" },
32
+ { kind: "subpage", key: "cost" },
33
+ { kind: "number", key: "contextWindow" },
34
+ { kind: "number", key: "maxTokens" },
35
+ { kind: "subpage", key: "compat" },
36
+ ];
37
+ if (model.isDraft)
38
+ rows.push({ kind: "modelApi" });
39
+ else
40
+ rows.push({ kind: "builtin" }, { kind: "modelApi" }, { kind: "deleteModel" });
41
+ this.rows = rows;
42
+ }
43
+ /** Enter id editing immediately (used right after + Add Model). */
44
+ startEditingId() {
45
+ this.index = 0;
46
+ this.beginEdit("overwrite");
47
+ }
48
+ /** A draft with no fields set is safe to abandon without asking. */
49
+ draftEmpty() {
50
+ return this.model.isDraft && Object.keys(this.model.read()).length === 0;
51
+ }
52
+ render(width) {
53
+ const theme = this.host.theme;
54
+ const current = this.model.read();
55
+ const lines = [];
56
+ const api = this.host.effectiveApi(current);
57
+ lines.push(renderInfoLine(theme, api ? `api: ${api}${current.api ? " (model)" : ""}` : "api: none resolved — see Model-Specific API below", width));
58
+ for (const [rowIndex, row] of this.rows.entries()) {
59
+ const active = rowIndex === this.index;
60
+ lines.push(this.renderRow(row, current, active, width));
61
+ }
62
+ if (this.error)
63
+ lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
64
+ if (this.renaming)
65
+ lines.push(renderInfoLine(theme, "Saving model id…", width));
66
+ return lines;
67
+ }
68
+ scrollWindow() {
69
+ // The effective-api header stays pinned above, errors/progress below.
70
+ return {
71
+ top: 1,
72
+ bottom: (this.error ? 1 : 0) + (this.renaming ? 1 : 0),
73
+ cursor: 1 + this.index,
74
+ };
75
+ }
76
+ renderRow(row, current, active, width) {
77
+ const theme = this.host.theme;
78
+ const editing = this.editingRow === row ? this.editing : undefined;
79
+ switch (row.kind) {
80
+ case "text": {
81
+ const value = current[row.key];
82
+ const unsetText = row.key === "id" ? "required" : `falls back to id`;
83
+ return renderKeyValueLine(theme, {
84
+ keyLabel: row.key,
85
+ valueText: value ?? `not set (${unsetText})`,
86
+ unset: !value,
87
+ active,
88
+ paneFocused: this.focused,
89
+ editing,
90
+ width,
91
+ });
92
+ }
93
+ case "reasoning": {
94
+ const value = current.reasoning;
95
+ return renderKeyValueLine(theme, {
96
+ keyLabel: "reasoning",
97
+ valueText: value === undefined ? "false (default)" : String(value),
98
+ unset: value === undefined,
99
+ active,
100
+ paneFocused: this.focused,
101
+ width,
102
+ });
103
+ }
104
+ case "subpage": {
105
+ const summary = this.subpageSummary(row.key, current);
106
+ return renderKeyValueLine(theme, {
107
+ keyLabel: row.key,
108
+ valueText: summary.text,
109
+ unset: summary.unset,
110
+ active,
111
+ paneFocused: this.focused,
112
+ width,
113
+ });
114
+ }
115
+ case "number": {
116
+ const value = current[row.key];
117
+ const fallback = row.key === "contextWindow" ? DEFAULT_CONTEXT_WINDOW : DEFAULT_MAX_TOKENS;
118
+ return renderKeyValueLine(theme, {
119
+ keyLabel: row.key,
120
+ valueText: value === undefined ? `${fallback} (default)` : String(value),
121
+ unset: value === undefined,
122
+ active,
123
+ paneFocused: this.focused,
124
+ editing,
125
+ width,
126
+ });
127
+ }
128
+ case "builtin": {
129
+ const id = current.id;
130
+ const count = id ? matchBuiltinModels(id, this.host.effectiveApi(current)).length : 0;
131
+ return renderKeyValueLine(theme, {
132
+ valueText: "Use Built-in Data",
133
+ active,
134
+ paneFocused: this.focused,
135
+ note: id ? `· ${count} ${plural(count, "candidate")}` : "· set id first",
136
+ width,
137
+ });
138
+ }
139
+ case "modelApi":
140
+ return renderKeyValueLine(theme, {
141
+ valueText: "Model-Specific API",
142
+ active,
143
+ paneFocused: this.focused,
144
+ note: `· ${this.modelApiSummary(current)}`,
145
+ width,
146
+ });
147
+ case "deleteModel":
148
+ return renderKeyValueLine(theme, {
149
+ valueText: "Delete Model",
150
+ active,
151
+ paneFocused: this.focused,
152
+ width,
153
+ });
154
+ }
155
+ }
156
+ /** Which connection fields this model overrides, or where they come from when it overrides nothing. */
157
+ modelApiSummary(current) {
158
+ const overrides = [current.baseUrl ? "baseUrl" : "", current.api ? "API Type" : ""].filter(Boolean);
159
+ if (overrides.length > 0)
160
+ return overrides.join(" + ");
161
+ const provider = this.host.store.getProvider(this.host.providerId);
162
+ if (provider?.api || provider?.baseUrl)
163
+ return "provider defaults";
164
+ if (this.host.effectiveApi(current) || this.host.effectiveBaseUrl(current))
165
+ return "built-in defaults";
166
+ return "not set";
167
+ }
168
+ subpageSummary(key, current) {
169
+ switch (key) {
170
+ case "thinkingLevelMap": {
171
+ const map = current.thinkingLevelMap;
172
+ const count = map ? Object.keys(map).length : 0;
173
+ return count > 0
174
+ ? { text: `${count} ${plural(count, "mapping")}`, unset: false }
175
+ : { text: "default", unset: true };
176
+ }
177
+ case "input":
178
+ return current.input
179
+ ? { text: `[${current.input.join(", ")}]`, unset: false }
180
+ : { text: "[text] (default)", unset: true };
181
+ case "cost": {
182
+ const cost = current.cost;
183
+ if (!cost)
184
+ return { text: "all 0 (default)", unset: true };
185
+ return { text: `$${cost.input} / $${cost.output} in/out`, unset: false };
186
+ }
187
+ case "compat": {
188
+ const compat = current.compat;
189
+ const count = compat ? Object.keys(compat).length : 0;
190
+ if (count > 0)
191
+ return { text: `${count} ${count === 1 ? "entry" : "entries"}`, unset: false };
192
+ const inherited = this.host.store.getProvider(this.host.providerId)?.compat;
193
+ const inheritedCount = inherited ? Object.keys(inherited).length : 0;
194
+ return inheritedCount > 0
195
+ ? { text: `${inheritedCount} from provider`, unset: true }
196
+ : { text: "none", unset: true };
197
+ }
198
+ }
199
+ }
200
+ handleInput(data) {
201
+ if (this.renaming || this.disposed)
202
+ return;
203
+ const kb = this.host.keybindings;
204
+ if (this.editing) {
205
+ if (kb.matches(data, "tui.select.up") || kb.matches(data, "tui.select.down"))
206
+ return;
207
+ this.editing.handleInput(data);
208
+ this.host.refresh();
209
+ return;
210
+ }
211
+ if (kb.matches(data, "tui.select.up")) {
212
+ this.index = this.index === 0 ? this.rows.length - 1 : this.index - 1;
213
+ this.host.refresh();
214
+ return;
215
+ }
216
+ if (kb.matches(data, "tui.select.down")) {
217
+ this.index = (this.index + 1) % this.rows.length;
218
+ this.host.refresh();
219
+ return;
220
+ }
221
+ if (kb.matches(data, "tui.select.cancel")) {
222
+ if (!this.model.isDraft) {
223
+ this.host.popPane();
224
+ return;
225
+ }
226
+ // Esc on a draft abandons it; a draft with fields asks first.
227
+ if (this.draftEmpty()) {
228
+ this.host.discardModelDraft();
229
+ return;
230
+ }
231
+ const label = this.model.read().name ?? this.model.read().id ?? "New Model";
232
+ this.host.confirm(`Discard the new model "${label}"? Its fields are not saved.`, "Discard Model", () => this.host.discardModelDraft());
233
+ return;
234
+ }
235
+ if (kb.matches(data, "app.list.toggle")) {
236
+ this.toggleRow();
237
+ return;
238
+ }
239
+ if (kb.matches(data, "tui.select.confirm")) {
240
+ this.enterRow();
241
+ return;
242
+ }
243
+ if (isPrintableInput(data)) {
244
+ this.overwriteRow(data);
245
+ return;
246
+ }
247
+ }
248
+ toggleRow() {
249
+ const row = this.rows[this.index];
250
+ if (row.kind !== "reasoning")
251
+ return; // Space on other rows falls to overwrite handling below
252
+ const current = this.model.read().reasoning;
253
+ this.host.mutate(() => this.model.setField(["reasoning"], current !== true));
254
+ }
255
+ enterRow() {
256
+ const row = this.rows[this.index];
257
+ switch (row.kind) {
258
+ case "text":
259
+ case "number":
260
+ this.beginEdit("tweak");
261
+ return;
262
+ case "reasoning":
263
+ this.host.pushPane(new ReasoningPane(this.host, this.model));
264
+ return;
265
+ case "subpage":
266
+ this.pushSubpage(row.key);
267
+ return;
268
+ case "modelApi":
269
+ this.host.pushPane(new ModelSpecificApiPane(this.host, this.model));
270
+ return;
271
+ case "builtin": {
272
+ const id = this.model.read().id;
273
+ if (!id) {
274
+ this.host.notify("Set the model id first.", "warning");
275
+ return;
276
+ }
277
+ this.host.pushPane(new BuiltinCandidatesPane(this.host, this.model));
278
+ return;
279
+ }
280
+ case "deleteModel": {
281
+ const id = this.model.read().id;
282
+ if (!id)
283
+ return;
284
+ if (this.host.isCurrentModel(id)) {
285
+ this.host.notify("The current model cannot be deleted; switch models with /model first.", "error");
286
+ return;
287
+ }
288
+ this.host.confirm(`Delete model "${id}" from ${this.host.providerId}?`, "Delete Model", () => {
289
+ this.host.mutate(() => this.host.store.removeModel(this.host.providerId, id));
290
+ this.host.onModelRemoved(id);
291
+ });
292
+ return;
293
+ }
294
+ }
295
+ }
296
+ overwriteRow(data) {
297
+ const row = this.rows[this.index];
298
+ if (row.kind === "text" || row.kind === "number") {
299
+ this.beginEdit("overwrite", data);
300
+ return;
301
+ }
302
+ }
303
+ beginEdit(mode, firstData) {
304
+ const row = this.rows[this.index];
305
+ if (row.kind !== "text" && row.kind !== "number")
306
+ return;
307
+ const current = this.model.read()[row.key];
308
+ const editor = new ValueEditor({
309
+ onCommit: (value) => this.commitText(row, value),
310
+ onCancel: () => {
311
+ this.editing = undefined;
312
+ this.editingRow = undefined;
313
+ this.error = undefined;
314
+ // Cancelling the edit of an untouched draft abandons the draft outright.
315
+ if (this.draftEmpty()) {
316
+ this.host.discardModelDraft();
317
+ return;
318
+ }
319
+ this.host.refresh();
320
+ },
321
+ });
322
+ this.editing = editor;
323
+ this.editingRow = row;
324
+ editor.focused = this.focused;
325
+ if (mode === "overwrite")
326
+ editor.beginOverwrite(firstData);
327
+ else
328
+ editor.beginTweak(current === undefined ? "" : String(current));
329
+ this.host.refresh();
330
+ }
331
+ commitText(row, raw) {
332
+ const value = raw.trim();
333
+ const finish = (error) => {
334
+ this.error = error;
335
+ if (error) {
336
+ this.host.refresh();
337
+ return;
338
+ }
339
+ this.editing = undefined;
340
+ this.editingRow = undefined;
341
+ this.host.refresh();
342
+ };
343
+ if (row.key === "id") {
344
+ if (!value) {
345
+ finish("id is required and cannot be empty.");
346
+ return;
347
+ }
348
+ if (this.model.isDraft) {
349
+ this.model.setField(["id"], value);
350
+ finish(this.host.commitModelDraft());
351
+ return;
352
+ }
353
+ const current = this.model.read().id;
354
+ if (!current) {
355
+ finish("Missing current id.");
356
+ return;
357
+ }
358
+ if (value === current) {
359
+ finish();
360
+ return;
361
+ }
362
+ if (this.host.isCurrentModel(current)) {
363
+ finish("The current model's id cannot be renamed; switch models with /model first.");
364
+ return;
365
+ }
366
+ if (this.host.store.getModel(this.host.providerId, value)) {
367
+ finish(`Model "${value}" already exists.`);
368
+ return;
369
+ }
370
+ this.renaming = true;
371
+ this.host.refresh();
372
+ void this.model.rename(value).then((error) => {
373
+ this.renaming = false;
374
+ if (!this.disposed)
375
+ finish(error);
376
+ }, (error) => {
377
+ this.renaming = false;
378
+ if (!this.disposed)
379
+ finish(error instanceof Error ? error.message : String(error));
380
+ });
381
+ return;
382
+ }
383
+ if (row.key === "name") {
384
+ this.host.mutate(() => this.model.setField(["name"], value === "" ? DELETE : value));
385
+ finish();
386
+ return;
387
+ }
388
+ // Numeric rows: empty clears the override; otherwise a finite positive integer.
389
+ if (value === "") {
390
+ this.host.mutate(() => this.model.setField([row.key], DELETE));
391
+ finish();
392
+ return;
393
+ }
394
+ const parsed = Number(value);
395
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
396
+ finish(`${row.key} must be a positive integer.`);
397
+ return;
398
+ }
399
+ this.host.mutate(() => this.model.setField([row.key], parsed));
400
+ finish();
401
+ return;
402
+ }
403
+ pushSubpage(key) {
404
+ switch (key) {
405
+ case "thinkingLevelMap":
406
+ this.host.pushPane(new ThinkingMapPane(this.host, this.model));
407
+ return;
408
+ case "input":
409
+ this.host.pushPane(new InputTypesPane(this.host, this.model));
410
+ return;
411
+ case "cost":
412
+ this.host.pushPane(new CostPane(this.host, this.model));
413
+ return;
414
+ case "compat":
415
+ this.host.pushPane(new CompatPane(this.host, this.model));
416
+ return;
417
+ }
418
+ }
419
+ setFocused(focused) {
420
+ this.focused = focused;
421
+ if (this.editing)
422
+ this.editing.focused = focused;
423
+ }
424
+ isEditing() {
425
+ return this.editing !== undefined || this.renaming;
426
+ }
427
+ dispose() {
428
+ this.disposed = true;
429
+ }
430
+ hints() {
431
+ if (this.editing)
432
+ return [keyHint("tui.input.submit", "save"), keyHint("tui.select.cancel", "cancel")].join(" ");
433
+ return [
434
+ rawKeyHint("type", "overwrite"),
435
+ keyHint("tui.select.confirm", "edit / open"),
436
+ keyHint("app.list.toggle", "toggle"),
437
+ keyHint("tui.select.cancel", this.model.isDraft ? "discard" : "back"),
438
+ ].join(" ");
439
+ }
440
+ }
441
+ //# sourceMappingURL=model-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fields.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-fields.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2DAA2D,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACN,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAElB,WAAW,GACX,MAAM,gBAAgB,CAAC;AAExB,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAWjC,MAAM,OAAO,eAAe;IAY3B,YAAY,IAAgB,EAAE,KAAkB;QAVxC,UAAK,GAAG,CAAC,CAAC;QAIV,YAAO,GAAG,KAAK,CAAC;QAChB,aAAQ,GAAG,KAAK,CAAC;QACjB,aAAQ,GAAG,KAAK,CAAC;QAKxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,MAAM,IAAI,GAAe;YACxB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;YAC3B,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;YAC7B,EAAE,IAAI,EAAE,WAAW,EAAE;YACrB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,EAAE;YAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE;YACjC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE;YAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE;YACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE;YACpC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,IAAI,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;;YAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,mEAAmE;IACnE,cAAc;QACb,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,oEAAoE;IAC5D,UAAU;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC1E,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,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CACT,cAAc,CACb,KAAK,EACL,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mDAAmD,EACzG,KAAK,CACL,CACD,CAAC;QACF,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,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,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,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,YAAY;QACX,sEAAsE;QACtE,OAAO;YACN,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK;SACtB,CAAC;IACH,CAAC;IAEO,SAAS,CAChB,GAAa,EACb,OAAmD,EACnD,MAAe,EACf,KAAa;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC;gBACrE,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,QAAQ,EAAE,GAAG,CAAC,GAAG;oBACjB,SAAS,EAAE,KAAK,IAAI,YAAY,SAAS,GAAG;oBAC5C,KAAK,EAAE,CAAC,KAAK;oBACb,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,OAAO;oBACP,KAAK;iBACL,CAAC,CAAC;YACJ,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;gBAChC,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,QAAQ,EAAE,WAAW;oBACrB,SAAS,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAClE,KAAK,EAAE,KAAK,KAAK,SAAS;oBAC1B,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,KAAK;iBACL,CAAC,CAAC;YACJ,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBAChB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACtD,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,QAAQ,EAAE,GAAG,CAAC,GAAG;oBACjB,SAAS,EAAE,OAAO,CAAC,IAAI;oBACvB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,KAAK;iBACL,CAAC,CAAC;YACJ,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACf,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,kBAAkB,CAAC;gBAC3F,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,QAAQ,EAAE,GAAG,CAAC,GAAG;oBACjB,SAAS,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBACxE,KAAK,EAAE,KAAK,KAAK,SAAS;oBAC1B,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,OAAO;oBACP,KAAK;iBACL,CAAC,CAAC;YACJ,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtF,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,SAAS,EAAE,mBAAmB;oBAC9B,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB;oBACxE,KAAK;iBACL,CAAC,CAAC;YACJ,CAAC;YACD,KAAK,UAAU;gBACd,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,SAAS,EAAE,oBAAoB;oBAC/B,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,IAAI,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;oBAC1C,KAAK;iBACL,CAAC,CAAC;YACJ,KAAK,aAAa;gBACjB,OAAO,kBAAkB,CAAC,KAAK,EAAE;oBAChC,SAAS,EAAE,cAAc;oBACzB,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,OAAO;oBACzB,KAAK;iBACL,CAAC,CAAC;QACL,CAAC;IACF,CAAC;IAED,uGAAuG;IAC/F,eAAe,CAAC,OAAmD;QAC1E,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpG,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,IAAI,QAAQ,EAAE,GAAG,IAAI,QAAQ,EAAE,OAAO;YAAE,OAAO,mBAAmB,CAAC;QACnE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAE,OAAO,mBAAmB,CAAC;QACvG,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,cAAc,CACrB,GAAqD,EACrD,OAAiC;QAEjC,QAAQ,GAAG,EAAE,CAAC;YACb,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACzB,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBACrC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,OAAO,KAAK,GAAG,CAAC;oBACf,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;oBAChE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACrC,CAAC;YACD,KAAK,OAAO;gBACX,OAAO,OAAO,CAAC,KAAK;oBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;oBACzD,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC1B,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC1E,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAI,KAAK,GAAG,CAAC;oBAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAC9F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAC5E,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,OAAO,cAAc,GAAG,CAAC;oBACxB,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC1D,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3C,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,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;YACR,CAAC;YACD,8DAA8D;YAC9D,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,OAAO;YACR,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,WAAW,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,KAAK,8BAA8B,EAAE,eAAe,EAAE,GAAG,EAAE,CACtG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAC7B,CAAC;YACF,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACR,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;IACF,CAAC;IAEO,SAAS;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACnC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,CAAC,wDAAwD;QAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,QAAQ;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACnC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ;gBACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO;YACR,KAAK,WAAW;gBACf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7D,OAAO;YACR,KAAK,SAAS;gBACb,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1B,OAAO;YACR,KAAK,UAAU;gBACd,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpE,OAAO;YACR,KAAK,SAAS,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;oBACvD,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrE,OAAO;YACR,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACpB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,EAAE;oBAAE,OAAO;gBAChB,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uEAAuE,EAAE,OAAO,CAAC,CAAC;oBACnG,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE;oBAC5F,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC9E,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC,CAAC,CAAC;gBACH,OAAO;YACR,CAAC;QACF,CAAC;IACF,CAAC;IAEO,YAAY,CAAC,IAAY;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACnC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;IACF,CAAC;IAEO,SAAS,CAAC,IAA2B,EAAE,SAAkB;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACnC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;YAChD,QAAQ,EAAE,GAAG,EAAE;gBACd,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;gBACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;gBACvB,yEAAyE;gBACzE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC9B,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;SACD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,GAAG,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,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,UAAU,CAAC,GAA2C,EAAE,GAAW;QAC1E,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAM,CAAC,qCAAqC,CAAC,CAAC;gBAC9C,OAAO;YACR,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACrC,OAAO;YACR,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBAC9B,OAAO;YACR,CAAC;YACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,EAAE,CAAC;gBACT,OAAO;YACR,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,4EAA4E,CAAC,CAAC;gBACrF,OAAO;YACR,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,CAAC,UAAU,KAAK,mBAAmB,CAAC,CAAC;gBAC3C,OAAO;YACR,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CACjC,CAAC,KAAK,EAAE,EAAE;gBACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;gBAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpF,CAAC,CACD,CAAC;YACF,OAAO;QACR,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACrF,MAAM,EAAE,CAAC;YACT,OAAO;QACR,CAAC;QACD,gFAAgF;QAChF,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,MAAM,EAAE,CAAC;YACT,OAAO;QACR,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,8BAA8B,CAAC,CAAC;YACjD,OAAO;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,MAAM,EAAE,CAAC;QACT,OAAO;IACR,CAAC;IAEO,WAAW,CAAC,GAAqD;QACxE,QAAQ,GAAG,EAAE,CAAC;YACb,KAAK,kBAAkB;gBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/D,OAAO;YACR,KAAK,OAAO;gBACX,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9D,OAAO;YACR,KAAK,MAAM;gBACV,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,OAAO;YACR,KAAK,QAAQ;gBACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1D,OAAO;QACT,CAAC;IACF,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,IAAI,IAAI,CAAC,QAAQ,CAAC;IACpD,CAAC;IAED,OAAO;QACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,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,iBAAiB,EAAE,QAAQ,CAAC;YACpC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;SACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACD","sourcesContent":["/**\n * Model field pane (right column for a selected model) plus its nested\n * sub-panes: thinkingLevelMap, input modalities, and cost. All edits flow\n * through the ModelHandle — drafts mutate memory, persisted models queue\n * store ops that save immediately.\n */\n\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { matchBuiltinModels } from \"../catalog.ts\";\nimport { plural, truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport { BuiltinCandidatesPane } from \"./builtin-data.ts\";\nimport { CompatPane } from \"./compat.ts\";\nimport { CostPane, InputTypesPane, ModelSpecificApiPane, ReasoningPane } from \"./model-options.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { ThinkingMapPane } from \"./thinking-map.ts\";\nimport {\n\tisPrintableInput,\n\trenderInfoLine,\n\trenderKeyValueLine,\n\ttype ScrollWindowInfo,\n\tValueEditor,\n} from \"./value-row.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ntype FieldRow =\n\t| { kind: \"text\"; key: \"id\" | \"name\" }\n\t| { kind: \"reasoning\" }\n\t| { kind: \"subpage\"; key: \"thinkingLevelMap\" | \"input\" | \"cost\" | \"compat\" }\n\t| { kind: \"number\"; key: \"contextWindow\" | \"maxTokens\" }\n\t| { kind: \"builtin\" }\n\t| { kind: \"modelApi\" }\n\t| { kind: \"deleteModel\" };\n\nexport class ModelFieldsPane implements EditorPane {\n\tprivate readonly rows: FieldRow[];\n\tprivate index = 0;\n\tprivate editing: ValueEditor | undefined;\n\tprivate editingRow: FieldRow | undefined;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\tprivate renaming = false;\n\tprivate disposed = 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 rows: FieldRow[] = [\n\t\t\t{ kind: \"text\", key: \"id\" },\n\t\t\t{ kind: \"text\", key: \"name\" },\n\t\t\t{ kind: \"reasoning\" },\n\t\t\t{ kind: \"subpage\", key: \"thinkingLevelMap\" },\n\t\t\t{ kind: \"subpage\", key: \"input\" },\n\t\t\t{ kind: \"subpage\", key: \"cost\" },\n\t\t\t{ kind: \"number\", key: \"contextWindow\" },\n\t\t\t{ kind: \"number\", key: \"maxTokens\" },\n\t\t\t{ kind: \"subpage\", key: \"compat\" },\n\t\t];\n\t\tif (model.isDraft) rows.push({ kind: \"modelApi\" });\n\t\telse rows.push({ kind: \"builtin\" }, { kind: \"modelApi\" }, { kind: \"deleteModel\" });\n\t\tthis.rows = rows;\n\t}\n\n\t/** Enter id editing immediately (used right after + Add Model). */\n\tstartEditingId(): void {\n\t\tthis.index = 0;\n\t\tthis.beginEdit(\"overwrite\");\n\t}\n\n\t/** A draft with no fields set is safe to abandon without asking. */\n\tprivate draftEmpty(): boolean {\n\t\treturn this.model.isDraft && Object.keys(this.model.read()).length === 0;\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\tconst api = this.host.effectiveApi(current);\n\t\tlines.push(\n\t\t\trenderInfoLine(\n\t\t\t\ttheme,\n\t\t\t\tapi ? `api: ${api}${current.api ? \" (model)\" : \"\"}` : \"api: none resolved — see Model-Specific API below\",\n\t\t\t\twidth,\n\t\t\t),\n\t\t);\n\t\tfor (const [rowIndex, row] of this.rows.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tlines.push(this.renderRow(row, current, active, width));\n\t\t}\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\tif (this.renaming) lines.push(renderInfoLine(theme, \"Saving model id…\", width));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The effective-api header stays pinned above, errors/progress below.\n\t\treturn {\n\t\t\ttop: 1,\n\t\t\tbottom: (this.error ? 1 : 0) + (this.renaming ? 1 : 0),\n\t\t\tcursor: 1 + this.index,\n\t\t};\n\t}\n\n\tprivate renderRow(\n\t\trow: FieldRow,\n\t\tcurrent: Partial<ModelsJsonModel> & { id?: string },\n\t\tactive: boolean,\n\t\twidth: number,\n\t): string {\n\t\tconst theme = this.host.theme;\n\t\tconst editing = this.editingRow === row ? this.editing : undefined;\n\t\tswitch (row.kind) {\n\t\t\tcase \"text\": {\n\t\t\t\tconst value = current[row.key];\n\t\t\t\tconst unsetText = row.key === \"id\" ? \"required\" : `falls back to id`;\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: row.key,\n\t\t\t\t\tvalueText: value ?? `not set (${unsetText})`,\n\t\t\t\t\tunset: !value,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting,\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase \"reasoning\": {\n\t\t\t\tconst value = current.reasoning;\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: \"reasoning\",\n\t\t\t\t\tvalueText: value === undefined ? \"false (default)\" : String(value),\n\t\t\t\t\tunset: value === undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase \"subpage\": {\n\t\t\t\tconst summary = this.subpageSummary(row.key, current);\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: row.key,\n\t\t\t\t\tvalueText: summary.text,\n\t\t\t\t\tunset: summary.unset,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase \"number\": {\n\t\t\t\tconst value = current[row.key];\n\t\t\t\tconst fallback = row.key === \"contextWindow\" ? DEFAULT_CONTEXT_WINDOW : DEFAULT_MAX_TOKENS;\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: row.key,\n\t\t\t\t\tvalueText: value === undefined ? `${fallback} (default)` : String(value),\n\t\t\t\t\tunset: value === undefined,\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tediting,\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase \"builtin\": {\n\t\t\t\tconst id = current.id;\n\t\t\t\tconst count = id ? matchBuiltinModels(id, this.host.effectiveApi(current)).length : 0;\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tvalueText: \"Use Built-in Data\",\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote: id ? `· ${count} ${plural(count, \"candidate\")}` : \"· set id first\",\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase \"modelApi\":\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tvalueText: \"Model-Specific API\",\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\tnote: `· ${this.modelApiSummary(current)}`,\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\tcase \"deleteModel\":\n\t\t\t\treturn renderKeyValueLine(theme, {\n\t\t\t\t\tvalueText: \"Delete Model\",\n\t\t\t\t\tactive,\n\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/** Which connection fields this model overrides, or where they come from when it overrides nothing. */\n\tprivate modelApiSummary(current: Partial<ModelsJsonModel> & { id?: string }): string {\n\t\tconst overrides = [current.baseUrl ? \"baseUrl\" : \"\", current.api ? \"API Type\" : \"\"].filter(Boolean);\n\t\tif (overrides.length > 0) return overrides.join(\" + \");\n\t\tconst provider = this.host.store.getProvider(this.host.providerId);\n\t\tif (provider?.api || provider?.baseUrl) return \"provider defaults\";\n\t\tif (this.host.effectiveApi(current) || this.host.effectiveBaseUrl(current)) return \"built-in defaults\";\n\t\treturn \"not set\";\n\t}\n\n\tprivate subpageSummary(\n\t\tkey: \"thinkingLevelMap\" | \"input\" | \"cost\" | \"compat\",\n\t\tcurrent: Partial<ModelsJsonModel>,\n\t): { text: string; unset: boolean } {\n\t\tswitch (key) {\n\t\t\tcase \"thinkingLevelMap\": {\n\t\t\t\tconst map = current.thinkingLevelMap;\n\t\t\t\tconst count = map ? Object.keys(map).length : 0;\n\t\t\t\treturn count > 0\n\t\t\t\t\t? { text: `${count} ${plural(count, \"mapping\")}`, unset: false }\n\t\t\t\t\t: { text: \"default\", unset: true };\n\t\t\t}\n\t\t\tcase \"input\":\n\t\t\t\treturn current.input\n\t\t\t\t\t? { text: `[${current.input.join(\", \")}]`, unset: false }\n\t\t\t\t\t: { text: \"[text] (default)\", unset: true };\n\t\t\tcase \"cost\": {\n\t\t\t\tconst cost = current.cost;\n\t\t\t\tif (!cost) return { text: \"all 0 (default)\", unset: true };\n\t\t\t\treturn { text: `$${cost.input} / $${cost.output} in/out`, unset: false };\n\t\t\t}\n\t\t\tcase \"compat\": {\n\t\t\t\tconst compat = current.compat;\n\t\t\t\tconst count = compat ? Object.keys(compat).length : 0;\n\t\t\t\tif (count > 0) return { text: `${count} ${count === 1 ? \"entry\" : \"entries\"}`, unset: false };\n\t\t\t\tconst inherited = this.host.store.getProvider(this.host.providerId)?.compat;\n\t\t\t\tconst inheritedCount = inherited ? Object.keys(inherited).length : 0;\n\t\t\t\treturn inheritedCount > 0\n\t\t\t\t\t? { text: `${inheritedCount} from provider`, unset: true }\n\t\t\t\t\t: { text: \"none\", unset: true };\n\t\t\t}\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.renaming || this.disposed) return;\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\tif (!this.model.isDraft) {\n\t\t\t\tthis.host.popPane();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Esc on a draft abandons it; a draft with fields asks first.\n\t\t\tif (this.draftEmpty()) {\n\t\t\t\tthis.host.discardModelDraft();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst label = this.model.read().name ?? this.model.read().id ?? \"New Model\";\n\t\t\tthis.host.confirm(`Discard the new model \"${label}\"? Its fields are not saved.`, \"Discard Model\", () =>\n\t\t\t\tthis.host.discardModelDraft(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tthis.toggleRow();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.enterRow();\n\t\t\treturn;\n\t\t}\n\t\tif (isPrintableInput(data)) {\n\t\t\tthis.overwriteRow(data);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate toggleRow(): void {\n\t\tconst row = this.rows[this.index]!;\n\t\tif (row.kind !== \"reasoning\") return; // Space on other rows falls to overwrite handling below\n\t\tconst current = this.model.read().reasoning;\n\t\tthis.host.mutate(() => this.model.setField([\"reasoning\"], current !== true));\n\t}\n\n\tprivate enterRow(): void {\n\t\tconst row = this.rows[this.index]!;\n\t\tswitch (row.kind) {\n\t\t\tcase \"text\":\n\t\t\tcase \"number\":\n\t\t\t\tthis.beginEdit(\"tweak\");\n\t\t\t\treturn;\n\t\t\tcase \"reasoning\":\n\t\t\t\tthis.host.pushPane(new ReasoningPane(this.host, this.model));\n\t\t\t\treturn;\n\t\t\tcase \"subpage\":\n\t\t\t\tthis.pushSubpage(row.key);\n\t\t\t\treturn;\n\t\t\tcase \"modelApi\":\n\t\t\t\tthis.host.pushPane(new ModelSpecificApiPane(this.host, this.model));\n\t\t\t\treturn;\n\t\t\tcase \"builtin\": {\n\t\t\t\tconst id = this.model.read().id;\n\t\t\t\tif (!id) {\n\t\t\t\t\tthis.host.notify(\"Set the model id first.\", \"warning\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.host.pushPane(new BuiltinCandidatesPane(this.host, this.model));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"deleteModel\": {\n\t\t\t\tconst id = this.model.read().id;\n\t\t\t\tif (!id) return;\n\t\t\t\tif (this.host.isCurrentModel(id)) {\n\t\t\t\t\tthis.host.notify(\"The current model cannot be deleted; switch models with /model first.\", \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.host.confirm(`Delete model \"${id}\" from ${this.host.providerId}?`, \"Delete Model\", () => {\n\t\t\t\t\tthis.host.mutate(() => this.host.store.removeModel(this.host.providerId, id));\n\t\t\t\t\tthis.host.onModelRemoved(id);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate overwriteRow(data: string): void {\n\t\tconst row = this.rows[this.index]!;\n\t\tif (row.kind === \"text\" || row.kind === \"number\") {\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 row = this.rows[this.index]!;\n\t\tif (row.kind !== \"text\" && row.kind !== \"number\") return;\n\t\tconst current = this.model.read()[row.key];\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => this.commitText(row, value),\n\t\t\tonCancel: () => {\n\t\t\t\tthis.editing = undefined;\n\t\t\t\tthis.editingRow = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\t// Cancelling the edit of an untouched draft abandons the draft outright.\n\t\t\t\tif (this.draftEmpty()) {\n\t\t\t\t\tthis.host.discardModelDraft();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.host.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.editing = editor;\n\t\tthis.editingRow = row;\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 commitText(row: FieldRow & { kind: \"text\" | \"number\" }, raw: string): void {\n\t\tconst value = raw.trim();\n\t\tconst finish = (error?: string) => {\n\t\t\tthis.error = error;\n\t\t\tif (error) {\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.editing = undefined;\n\t\t\tthis.editingRow = undefined;\n\t\t\tthis.host.refresh();\n\t\t};\n\t\tif (row.key === \"id\") {\n\t\t\tif (!value) {\n\t\t\t\tfinish(\"id is required and cannot be empty.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.model.isDraft) {\n\t\t\t\tthis.model.setField([\"id\"], value);\n\t\t\t\tfinish(this.host.commitModelDraft());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst current = this.model.read().id;\n\t\t\tif (!current) {\n\t\t\t\tfinish(\"Missing current id.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === current) {\n\t\t\t\tfinish();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.host.isCurrentModel(current)) {\n\t\t\t\tfinish(\"The current model's id cannot be renamed; switch models with /model first.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.host.store.getModel(this.host.providerId, value)) {\n\t\t\t\tfinish(`Model \"${value}\" already exists.`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.renaming = true;\n\t\t\tthis.host.refresh();\n\t\t\tvoid this.model.rename(value).then(\n\t\t\t\t(error) => {\n\t\t\t\t\tthis.renaming = false;\n\t\t\t\t\tif (!this.disposed) finish(error);\n\t\t\t\t},\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tthis.renaming = false;\n\t\t\t\t\tif (!this.disposed) finish(error instanceof Error ? error.message : String(error));\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (row.key === \"name\") {\n\t\t\tthis.host.mutate(() => this.model.setField([\"name\"], value === \"\" ? DELETE : value));\n\t\t\tfinish();\n\t\t\treturn;\n\t\t}\n\t\t// Numeric rows: empty clears the override; otherwise a finite positive integer.\n\t\tif (value === \"\") {\n\t\t\tthis.host.mutate(() => this.model.setField([row.key], DELETE));\n\t\t\tfinish();\n\t\t\treturn;\n\t\t}\n\t\tconst parsed = Number(value);\n\t\tif (!Number.isSafeInteger(parsed) || parsed <= 0) {\n\t\t\tfinish(`${row.key} must be a positive integer.`);\n\t\t\treturn;\n\t\t}\n\t\tthis.host.mutate(() => this.model.setField([row.key], parsed));\n\t\tfinish();\n\t\treturn;\n\t}\n\n\tprivate pushSubpage(key: \"thinkingLevelMap\" | \"input\" | \"cost\" | \"compat\"): void {\n\t\tswitch (key) {\n\t\t\tcase \"thinkingLevelMap\":\n\t\t\t\tthis.host.pushPane(new ThinkingMapPane(this.host, this.model));\n\t\t\t\treturn;\n\t\t\tcase \"input\":\n\t\t\t\tthis.host.pushPane(new InputTypesPane(this.host, this.model));\n\t\t\t\treturn;\n\t\t\tcase \"cost\":\n\t\t\t\tthis.host.pushPane(new CostPane(this.host, this.model));\n\t\t\t\treturn;\n\t\t\tcase \"compat\":\n\t\t\t\tthis.host.pushPane(new CompatPane(this.host, this.model));\n\t\t\t\treturn;\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 || this.renaming;\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\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(\"app.list.toggle\", \"toggle\"),\n\t\t\tkeyHint(\"tui.select.cancel\", this.model.isDraft ? \"discard\" : \"back\"),\n\t\t].join(\" \");\n\t}\n}\n"]}
@@ -0,0 +1,93 @@
1
+ /** Scalar model settings: reasoning, input modalities, cost rates, and the model-specific API override. */
2
+ import type { EditorHost, EditorPane, ModelHandle } from "./pane.ts";
3
+ /** Radio sub-page for reasoning — consistent with the other nested model settings. */
4
+ export declare class ReasoningPane implements EditorPane {
5
+ readonly crumb = "reasoning";
6
+ private index;
7
+ private focused;
8
+ private readonly host;
9
+ private readonly model;
10
+ constructor(host: EditorHost, model: ModelHandle);
11
+ render(width: number): string[];
12
+ handleInput(data: string): void;
13
+ setFocused(focused: boolean): void;
14
+ hints(): string;
15
+ }
16
+ export declare class InputTypesPane implements EditorPane {
17
+ readonly crumb = "input";
18
+ private index;
19
+ private error;
20
+ private focused;
21
+ private readonly host;
22
+ private readonly model;
23
+ constructor(host: EditorHost, model: ModelHandle);
24
+ private selected;
25
+ render(width: number): string[];
26
+ handleInput(data: string): void;
27
+ setFocused(focused: boolean): void;
28
+ hints(): string;
29
+ }
30
+ export declare class CostPane implements EditorPane {
31
+ readonly crumb = "cost";
32
+ private index;
33
+ private editing;
34
+ private editingRate;
35
+ private error;
36
+ private focused;
37
+ private readonly host;
38
+ private readonly model;
39
+ constructor(host: EditorHost, model: ModelHandle);
40
+ private cost;
41
+ render(width: number): string[];
42
+ handleInput(data: string): void;
43
+ private beginEdit;
44
+ private commit;
45
+ setFocused(focused: boolean): void;
46
+ isEditing(): boolean;
47
+ hints(): string;
48
+ }
49
+ /**
50
+ * Model-level baseUrl / API Type overrides. Unset rows show the inherited
51
+ * provider or built-in value dimmed; typing on a row (or editing the shown
52
+ * value) writes an override, clearing it returns to inheritance.
53
+ */
54
+ export declare class ModelSpecificApiPane implements EditorPane {
55
+ readonly crumb = "Model-Specific API";
56
+ private readonly rows;
57
+ private index;
58
+ private editing;
59
+ private error;
60
+ private focused;
61
+ private readonly host;
62
+ private readonly model;
63
+ constructor(host: EditorHost, model: ModelHandle);
64
+ /** Where an unset model field resolves from; undefined when nothing resolves it. */
65
+ private inherited;
66
+ render(width: number): string[];
67
+ handleInput(data: string): void;
68
+ /** Tweak starts from the inherited value, so adjusting it writes the override directly. */
69
+ private beginEdit;
70
+ private commit;
71
+ setFocused(focused: boolean): void;
72
+ isEditing(): boolean;
73
+ hints(): string;
74
+ }
75
+ /** Single-select model api: the inherited default plus every known API tag. Enter applies and returns. */
76
+ export declare class ModelApiTypePane implements EditorPane {
77
+ readonly crumb = "API Type";
78
+ private index;
79
+ private error;
80
+ private focused;
81
+ private readonly host;
82
+ private readonly model;
83
+ constructor(host: EditorHost, model: ModelHandle);
84
+ /** The api this model inherits when it defines none — provider first, then the built-in catalog. */
85
+ private fallback;
86
+ /** value undefined = inherit; a custom api already stored is preserved and appended. */
87
+ private options;
88
+ render(width: number): string[];
89
+ handleInput(data: string): void;
90
+ setFocused(focused: boolean): void;
91
+ hints(): string;
92
+ }
93
+ //# sourceMappingURL=model-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-options.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-options.ts"],"names":[],"mappings":"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"}