@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 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/editor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Two-pane provider editor.\n *\n * Left column: API Auth / Fetch Models, the provider's\n * models (name → id → \"New Model\" fallback, one draft at a time), then\n * + Add Model and Delete Provider. Right column hosts the selected item's\n * field pane and sub-pane stack; both columns keep their own selection and\n * scroll position. The frame height is fixed: each column scrolls inside a\n * fixed window with a (n/N) position indicator instead of resizing, and the\n * selected row stays accent in both panes while the unfocused pane's other\n * rows dim back. Typing on a value row overwrites, Enter tweaks or enters,\n * ←/→ switch panes, Esc cancels/pops/backs out.\n */\n\nimport { type Component, type Focusable, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { ModelsJsonModel } from \"../../../core/model-config.ts\";\nimport type { ModelRegistry } from \"../../../core/model-registry.ts\";\nimport type { ModelRuntime } from \"../../../core/model-runtime.ts\";\nimport { DynamicBorder } from \"../../../modes/interactive/components/dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { isBuiltinProviderId } from \"../catalog.ts\";\nimport { effectiveModelSettings, hasProviderSettings } from \"../configuration.ts\";\nimport { fetchProviderModels, importProviderModels } from \"../connection.ts\";\nimport type { RefreshCoordinator } from \"../refresh.ts\";\nimport { DELETE, type ModelsJsonStore } from \"../store.ts\";\nimport { ConfirmPane, InfoPane } from \"./dialogs.ts\";\nimport { FetchModelsPane } from \"./fetch-models.ts\";\nimport { ModelFieldsPane } from \"./model-fields.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport { ApiAuthPane } from \"./provider-fields.ts\";\nimport { CURSOR, truncateMiddle, windowLines } from \"./value-row.ts\";\n\nexport interface ProviderEditorOptions {\n\tstore: ModelsJsonStore;\n\trefresher: RefreshCoordinator;\n\tproviderId: string;\n\t/** Session model at /provider open time; protects it and its provider from delete/rename. */\n\tcurrentModel?: { provider: string; id: string };\n\tregistry: Pick<ModelRegistry, \"getProviderAuthStatus\">;\n\truntime: Pick<ModelRuntime, \"getAuth\" | \"getProviderAuthStatus\">;\n\tnotify: (message: string, type: \"info\" | \"warning\" | \"error\") => void;\n}\n\nexport type ProviderEditorResult = \"back\" | \"deleted\";\n\ntype LeftItem =\n\t| { kind: \"apiAuth\" }\n\t| { kind: \"fetch\" }\n\t| { kind: \"separator\" }\n\t| { kind: \"model\"; modelId: string }\n\t| { kind: \"draft\" }\n\t| { kind: \"addModel\" }\n\t| { kind: \"deleteProvider\" };\n\nconst LEFT_WIDTH_MIN = 16;\nconst LEFT_WIDTH_MAX = 40;\n/** Fixed editor body height: both columns scroll inside it rather than resizing the frame. */\nconst BODY_ROWS = 14;\nconst MIN_WIDTH = 56;\n\ninterface ModelDraft {\n\tfields: Partial<ModelsJsonModel>;\n}\n\nfunction padTo(line: string, width: number): string {\n\tconst missing = width - visibleWidth(line);\n\treturn missing > 0 ? line + \" \".repeat(missing) : line;\n}\n\n/** Stable identity across left-list rebuilds (a rename keeps the selection on the model). */\nfunction leftItemKey(item: LeftItem | undefined): string {\n\tif (!item) return \"\";\n\tswitch (item.kind) {\n\t\tcase \"model\":\n\t\t\treturn `model:${item.modelId}`;\n\t\tdefault:\n\t\t\treturn item.kind;\n\t}\n}\n\nexport class ProviderEditorScreen implements Component, Focusable {\n\tprivate readonly tui: TUI;\n\tprivate readonly theme: Theme;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly done: (result: ProviderEditorResult) => void;\n\tprivate readonly options: ProviderEditorOptions;\n\tprivate readonly host: EditorHost;\n\n\tprivate leftItems: LeftItem[] = [];\n\tprivate leftIndex = 0;\n\tprivate focusPane: \"left\" | \"right\" = \"left\";\n\tprivate stack: EditorPane[] = [];\n\tprivate draft: ModelDraft | undefined;\n\tprivate fetchStatus: string | undefined;\n\tprivate disposed = false;\n\tprivate renaming = false;\n\tprivate _focused = false;\n\tprivate cache: { width: number; lines: string[] } | undefined;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\ttheme: Theme,\n\t\tkeybindings: KeybindingsManager,\n\t\tdone: (result: ProviderEditorResult) => void,\n\t\toptions: ProviderEditorOptions,\n\t) {\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.keybindings = keybindings;\n\t\tthis.done = done;\n\t\tthis.options = options;\n\t\tthis.host = this.createHost();\n\t\tthis.rebuildLeftItems();\n\t\tthis.resetRightStack();\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Component / Focusable\n\t// ------------------------------------------------------------------\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.topPane()?.setFocused(value && this.focusPane === \"right\");\n\t}\n\n\tinvalidate(): void {\n\t\tthis.cache = undefined;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (const pane of this.stack) pane.dispose?.();\n\t\tthis.stack = [];\n\t\t// An unsubmitted draft never reaches disk; leaving the editor drops it.\n\t\tif (!hasProviderSettings(this.options.store.getProvider(this.options.providerId))) {\n\t\t\tthis.options.store.discardProviderDraft(this.options.providerId);\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tif (this.cache && this.cache.width === width) return this.cache.lines;\n\t\tconst lines = this.renderFrame(width);\n\t\tthis.cache = { width, lines };\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.focusPane === \"right\") {\n\t\t\tconst pane = this.topPane();\n\t\t\tif (pane && !pane.isEditing?.() && this.keybindings.matches(data, \"app.provider.switchPaneLeft\")) {\n\t\t\t\tpane.setFocused(false);\n\t\t\t\tthis.focusPane = \"left\";\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpane?.handleInput(data);\n\t\t\treturn;\n\t\t}\n\t\tconst kb = this.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.moveLeft(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.moveLeft(1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.switchPaneRight\")) {\n\t\t\tthis.activateLeftItem(\"inspect\");\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.activateLeftItem(\"activate\");\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.done(\"back\");\n\t}\n\n\t/** Rebuild from the store view after a save merged external changes. */\n\tsyncFromStore(): void {\n\t\tif (this.disposed || this.renaming) return;\n\t\tconst selected = this.leftItems[this.leftIndex];\n\t\tconst selectedKey = leftItemKey(selected);\n\t\tthis.rebuildLeftItems();\n\t\tconst nextIndex = this.leftItems.findIndex((item) => leftItemKey(item) === selectedKey);\n\t\tthis.leftIndex = nextIndex >= 0 ? nextIndex : Math.min(this.leftIndex, this.selectableIndex(0));\n\t\t// If the selected model vanished externally, rebuild the right column.\n\t\tif (nextIndex < 0 && selected?.kind === \"model\") {\n\t\t\tthis.resetRightStack();\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Left column\n\t// ------------------------------------------------------------------\n\n\tprivate rebuildLeftItems(): void {\n\t\tconst items: LeftItem[] = [{ kind: \"apiAuth\" }, { kind: \"fetch\" }, { kind: \"separator\" }];\n\t\tfor (const model of this.options.store.getModels(this.options.providerId)) {\n\t\t\titems.push({ kind: \"model\", modelId: model.id });\n\t\t}\n\t\tif (this.draft) items.push({ kind: \"draft\" });\n\t\titems.push({ kind: \"separator\" }, { kind: \"addModel\" }, { kind: \"deleteProvider\" });\n\t\tthis.leftItems = items;\n\t}\n\n\tprivate selectableIndex(start: number): number {\n\t\tconst index = this.leftItems.findIndex((item, i) => i >= start && item.kind !== \"separator\");\n\t\treturn index >= 0 ? index : 0;\n\t}\n\n\tprivate moveLeft(delta: number): void {\n\t\tconst selectable = this.leftItems\n\t\t\t.map((item, index) => ({ item, index }))\n\t\t\t.filter((entry) => entry.item.kind !== \"separator\");\n\t\tif (selectable.length === 0) return;\n\t\tconst position = selectable.findIndex((entry) => entry.index === this.leftIndex);\n\t\tconst next = selectable[(position + delta + selectable.length) % selectable.length]!;\n\t\tif (next.index === this.leftIndex) return;\n\t\tthis.leftIndex = next.index;\n\t\t// Moving the left selection replaces the right column (cancels fetch/edit state).\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t}\n\n\t/**\n\t * Enter activates the row; → only focuses its pane. Action rows therefore\n\t * never fire from a focus move, matching their InfoPane's \"Press Enter\".\n\t */\n\tprivate activateLeftItem(via: \"activate\" | \"inspect\"): void {\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tif (!item) return;\n\t\tswitch (item.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\tcase \"model\":\n\t\t\tcase \"draft\":\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"fetch\":\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tif (via === \"activate\") {\n\t\t\t\t\tconst pane = this.topPane();\n\t\t\t\t\tif (pane instanceof FetchModelsPane) pane.start();\n\t\t\t\t}\n\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"addModel\": {\n\t\t\t\tif (via === \"inspect\") {\n\t\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this.draft) {\n\t\t\t\t\tthis.draft = { fields: {} };\n\t\t\t\t\tthis.rebuildLeftItems();\n\t\t\t\t}\n\t\t\t\tconst draftIndex = this.leftItems.findIndex((entry) => entry.kind === \"draft\");\n\t\t\t\tif (draftIndex >= 0) this.leftIndex = draftIndex;\n\t\t\t\tthis.resetRightStack();\n\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\tconst pane = this.topPane();\n\t\t\t\tpane?.setFocused(this._focused);\n\t\t\t\tif (pane instanceof ModelFieldsPane && !this.draft.fields.id) pane.startEditingId();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"deleteProvider\": {\n\t\t\t\tif (via === \"inspect\") {\n\t\t\t\t\tthis.focusPane = \"right\";\n\t\t\t\t\tthis.topPane()?.setFocused(this._focused);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.host.isCurrentProvider()) {\n\t\t\t\t\tthis.host.notify(\n\t\t\t\t\t\t\"The current model's provider cannot be deleted; switch models with /model first.\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst builtin = isBuiltinProviderId(this.options.providerId);\n\t\t\t\tthis.host.confirm(\n\t\t\t\t\t`Delete provider \"${this.options.providerId}\" from models.json?` +\n\t\t\t\t\t\t(builtin ? \" The built-in catalog remains and its models may reappear.\" : \"\") +\n\t\t\t\t\t\t\" Stored credentials in auth.json are kept.\",\n\t\t\t\t\t\"Delete Provider\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.options.store.removeProvider(this.options.providerId);\n\t\t\t\t\t\tthis.options.refresher.touch(this.options.providerId);\n\t\t\t\t\t\tthis.done(\"deleted\");\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate renderLeft(width: number): string[] {\n\t\tconst theme = this.theme;\n\t\tconst focused = this.focusPane === \"left\";\n\t\tconst rows: string[] = [];\n\t\tconst renderRow = (index: number): string => {\n\t\t\tconst item = this.leftItems[index]!;\n\t\t\tif (item.kind === \"separator\") {\n\t\t\t\treturn theme.fg(\"borderMuted\", ` ${\"─\".repeat(Math.max(1, width - 4))}`);\n\t\t\t}\n\t\t\treturn this.renderLeftItem(item, index === this.leftIndex, focused, width);\n\t\t};\n\t\tif (this.leftItems.length <= BODY_ROWS) {\n\t\t\tfor (let index = 0; index < this.leftItems.length; index++) rows.push(renderRow(index));\n\t\t} else {\n\t\t\t// One row carries the (n/N) position indicator, like the /model selector.\n\t\t\tconst slots = BODY_ROWS - 1;\n\t\t\tconst start = Math.max(0, Math.min(this.leftIndex - Math.floor(slots / 2), this.leftItems.length - slots));\n\t\t\tfor (let index = start; index < start + slots; index++) rows.push(renderRow(index));\n\t\t\tconst selectable: LeftItem[] = this.leftItems.filter((item) => item.kind !== \"separator\");\n\t\t\tconst position = selectable.indexOf(this.leftItems[this.leftIndex]!);\n\t\t\trows.push(theme.fg(\"dim\", ` (${position + 1}/${selectable.length})`));\n\t\t}\n\t\twhile (rows.length < BODY_ROWS) rows.push(\"\");\n\t\treturn rows;\n\t}\n\n\tprivate renderLeftItem(item: LeftItem, active: boolean, focused: boolean, width: number): string {\n\t\tconst theme = this.theme;\n\t\tconst store = this.options.store;\n\t\t// Single-accent focus rule: the marker and accent exist only in the\n\t\t// focused column; an unfocused column keeps its content plain.\n\t\tconst lit = active && focused;\n\t\tconst marker = lit ? theme.fg(\"accent\", `${CURSOR} `) : \" \";\n\t\tconst style = (text: string, dim = false) => theme.fg(lit ? \"accent\" : dim ? \"dim\" : \"text\", text);\n\t\tlet text: string;\n\t\tlet note: string | undefined;\n\t\tswitch (item.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\ttext = \"API Auth\";\n\t\t\t\tbreak;\n\t\t\tcase \"fetch\":\n\t\t\t\ttext = \"Fetch Models\";\n\t\t\t\tnote = this.fetchStatus;\n\t\t\t\tbreak;\n\t\t\tcase \"model\": {\n\t\t\t\tconst model = store.getModel(this.options.providerId, item.modelId);\n\t\t\t\ttext = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"draft\": {\n\t\t\t\ttext = this.draft?.fields.name ?? this.draft?.fields.id ?? \"New Model\";\n\t\t\t\tnote = \"· draft\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"addModel\":\n\t\t\t\ttext = \"+ Add Model\";\n\t\t\t\tbreak;\n\t\t\tcase \"deleteProvider\":\n\t\t\t\ttext = \"Delete Provider\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttext = \"\";\n\t\t}\n\t\tconst dim = item.kind === \"draft\" && !this.draft?.fields.name && !this.draft?.fields.id;\n\t\t// Long model names keep head and tail (the distinctive parts) instead of a hard cut.\n\t\tif (item.kind === \"model\" || item.kind === \"draft\") {\n\t\t\tconst budget = Math.max(8, width - 2 - (note ? visibleWidth(note) + 1 : 0));\n\t\t\ttext = truncateMiddle(text, budget);\n\t\t}\n\t\tconst noteText = note ? theme.fg(\"dim\", ` ${note}`) : \"\";\n\t\treturn truncateToWidth(marker + style(text, dim) + noteText, width);\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Right column (pane stack)\n\t// ------------------------------------------------------------------\n\n\tprivate topPane(): EditorPane | undefined {\n\t\treturn this.stack[this.stack.length - 1];\n\t}\n\n\tprivate pushPane(pane: EditorPane): void {\n\t\tthis.topPane()?.setFocused(false);\n\t\tthis.focusPane = \"right\";\n\t\tthis.stack.push(pane);\n\t\tpane.setFocused(this._focused && this.focusPane === \"right\");\n\t\tthis.refresh();\n\t}\n\n\tprivate popPane(): void {\n\t\tif (this.stack.length <= 1) {\n\t\t\t// Esc on the base pane moves focus back to the left column.\n\t\t\tthis.topPane()?.setFocused(false);\n\t\t\tthis.focusPane = \"left\";\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst pane = this.stack.pop();\n\t\tpane?.setFocused(false);\n\t\tpane?.dispose?.();\n\t\tthis.topPane()?.setFocused(this._focused && this.focusPane === \"right\");\n\t\tthis.refresh();\n\t}\n\n\tprivate resetRightStack(): void {\n\t\tfor (const pane of this.stack) pane.dispose?.();\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tthis.stack = [this.createBasePane(item)];\n\t\tthis.topPane()?.setFocused(this._focused && this.focusPane === \"right\");\n\t}\n\n\tprivate createBasePane(item: LeftItem | undefined): EditorPane {\n\t\tswitch (item?.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\treturn new ApiAuthPane(this.host, this.options.registry);\n\t\t\tcase \"fetch\":\n\t\t\t\treturn new FetchModelsPane(this.host);\n\t\t\tcase \"model\":\n\t\t\t\treturn new ModelFieldsPane(this.host, this.persistedHandle(item.modelId));\n\t\t\tcase \"draft\":\n\t\t\t\treturn new ModelFieldsPane(this.host, this.draftHandle());\n\t\t\tcase \"addModel\":\n\t\t\t\treturn new InfoPane(\n\t\t\t\t\tthis.host,\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Press Enter to create a model.\",\n\t\t\t\t\t\t\"A draft is kept in memory until its id is set; Esc on the draft discards it.\",\n\t\t\t\t\t],\n\t\t\t\t\t() => this.activateLeftItem(\"activate\"),\n\t\t\t\t);\n\t\t\tcase \"deleteProvider\":\n\t\t\t\treturn new InfoPane(this.host, [\"Press Enter to delete this provider from models.json.\"], () =>\n\t\t\t\t\tthis.activateLeftItem(\"activate\"),\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn new InfoPane(this.host, []);\n\t\t}\n\t}\n\n\tprivate persistedHandle(modelId: string): ModelHandle {\n\t\tconst store = this.options.store;\n\t\tconst providerId = this.options.providerId;\n\t\tconst ref = { id: modelId };\n\t\tlet renamingSnapshot: ModelsJsonModel | undefined;\n\t\treturn {\n\t\t\tisDraft: false,\n\t\t\tread: () => renamingSnapshot ?? store.getModel(providerId, ref.id) ?? { id: ref.id },\n\t\t\tsetField: (path, value) => {\n\t\t\t\tstore.setModelField(providerId, ref.id, path, value);\n\t\t\t},\n\t\t\trename: async (newId) => {\n\t\t\t\tconst oldId = ref.id;\n\t\t\t\trenamingSnapshot = store.getModel(providerId, oldId);\n\t\t\t\tthis.renaming = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst error = await store.renameModel(providerId, oldId, newId);\n\t\t\t\t\tif (error) return error;\n\t\t\t\t\tref.id = newId;\n\t\t\t\t\tconst selected = this.leftItems[this.leftIndex];\n\t\t\t\t\tif (selected?.kind === \"model\" && selected.modelId === oldId) selected.modelId = newId;\n\t\t\t\t\tthis.options.refresher.touch(providerId);\n\t\t\t\t\treturn undefined;\n\t\t\t\t} finally {\n\t\t\t\t\trenamingSnapshot = undefined;\n\t\t\t\t\tthis.renaming = false;\n\t\t\t\t\tthis.syncFromStore();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate draftHandle(): ModelHandle {\n\t\tconst draft = this.draft;\n\t\tif (!draft) throw new Error(\"No model draft\");\n\t\treturn {\n\t\t\tisDraft: true,\n\t\t\trename: async () => \"Commit the model draft before renaming it.\",\n\t\t\tread: () => draft.fields,\n\t\t\tsetField: (path, value) => {\n\t\t\t\tif (path.length === 1) {\n\t\t\t\t\tconst key = path[0]! as keyof ModelsJsonModel;\n\t\t\t\t\tif (value === DELETE) delete draft.fields[key];\n\t\t\t\t\telse (draft.fields as Record<string, unknown>)[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\t// Nested draft fields (thinkingLevelMap.medium, compat.x, cost.input…)\n\t\t\t\t\tconst [head, ...rest] = path as [keyof ModelsJsonModel, ...string[]];\n\t\t\t\t\tconst container: Record<string, unknown> = { ...((draft.fields[head] as object) ?? {}) } as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\tlet current = container;\n\t\t\t\t\tfor (const segment of rest.slice(0, -1)) {\n\t\t\t\t\t\tconst next = current[segment];\n\t\t\t\t\t\tif (typeof next === \"object\" && next !== null && !Array.isArray(next)) {\n\t\t\t\t\t\t\tcurrent = next as Record<string, unknown>;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst created: Record<string, unknown> = {};\n\t\t\t\t\t\t\tcurrent[segment] = created;\n\t\t\t\t\t\t\tcurrent = created;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst leaf = rest[rest.length - 1]!;\n\t\t\t\t\tif (value === DELETE) delete current[leaf];\n\t\t\t\t\telse current[leaf] = value;\n\t\t\t\t\t(draft.fields as Record<string, unknown>)[head] = container;\n\t\t\t\t}\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\t// ------------------------------------------------------------------\n\t// EditorHost implementation\n\t// ------------------------------------------------------------------\n\n\tprivate createHost(): EditorHost {\n\t\tconst store = this.options.store;\n\t\tconst providerId = this.options.providerId;\n\t\treturn {\n\t\t\ttui: this.tui,\n\t\t\ttheme: this.theme,\n\t\t\tkeybindings: this.keybindings,\n\t\t\tstore,\n\t\t\trefresher: this.options.refresher,\n\t\t\tproviderId,\n\t\t\tpushPane: (pane) => this.pushPane(pane),\n\t\t\tpopPane: () => this.popPane(),\n\t\t\tmutate: (apply) => {\n\t\t\t\tconst before = store.pendingCount;\n\t\t\t\tapply();\n\t\t\t\tif (\n\t\t\t\t\tstore.pendingCount !== before &&\n\t\t\t\t\t(!store.isDraftProvider(providerId) || hasProviderSettings(store.getProvider(providerId)))\n\t\t\t\t) {\n\t\t\t\t\tthis.options.refresher.touch(providerId);\n\t\t\t\t}\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\trefresh: () => this.refresh(),\n\t\t\tnotify: (message, type) => this.options.notify(message, type),\n\t\t\teffectiveApi: (model) => {\n\t\t\t\treturn effectiveModelSettings(providerId, store.getProvider(providerId), model).api;\n\t\t\t},\n\t\t\teffectiveBaseUrl: (model) => {\n\t\t\t\treturn effectiveModelSettings(providerId, store.getProvider(providerId), model).baseUrl;\n\t\t\t},\n\t\t\tcommitModelDraft: () => this.commitModelDraft(),\n\t\t\tdiscardModelDraft: () => this.discardModelDraft(),\n\t\t\tisCurrentModel: (modelId) =>\n\t\t\t\tthis.options.currentModel?.provider === providerId && this.options.currentModel.id === modelId,\n\t\t\tisCurrentProvider: () => this.options.currentModel?.provider === providerId,\n\t\t\tsetFetchStatus: (status) => {\n\t\t\t\tthis.fetchStatus = status;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\trunFetch: (signal) => fetchProviderModels(this.options, signal),\n\t\t\timportModels: async (models, signal) => {\n\t\t\t\tconst error = await importProviderModels(this.options, models, signal);\n\t\t\t\tif (!this.disposed) this.syncFromStore();\n\t\t\t\treturn error;\n\t\t\t},\n\t\t\tconfirm: (message, actionLabel, action) =>\n\t\t\t\tthis.pushPane(new ConfirmPane(this.host, message, actionLabel, action)),\n\t\t\tonModelRemoved: () => {\n\t\t\t\tthis.rebuildLeftItems();\n\t\t\t\t// Land on the next row where the model was; walk back over separators.\n\t\t\t\tthis.leftIndex = Math.min(this.leftIndex, this.leftItems.length - 1);\n\t\t\t\twhile (this.leftIndex > 0 && this.leftItems[this.leftIndex]?.kind === \"separator\") this.leftIndex--;\n\t\t\t\tif (this.leftItems[this.leftIndex]?.kind === \"separator\") this.leftIndex = this.selectableIndex(0);\n\t\t\t\tthis.focusPane = \"left\";\n\t\t\t\tthis.resetRightStack();\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Drop the in-memory draft: the selection returns to + Add Model with focus on the left. */\n\tprivate discardModelDraft(): void {\n\t\tif (!this.draft) return;\n\t\tthis.draft = undefined;\n\t\tthis.rebuildLeftItems();\n\t\tconst addIndex = this.leftItems.findIndex((item) => item.kind === \"addModel\");\n\t\tthis.leftIndex = addIndex >= 0 ? addIndex : this.selectableIndex(0);\n\t\tthis.focusPane = \"left\";\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t}\n\n\tprivate commitModelDraft(): string | undefined {\n\t\tconst draft = this.draft;\n\t\tif (!draft) return \"No model draft.\";\n\t\tconst id = (draft.fields.id ?? \"\").trim();\n\t\tif (!id) return \"Model id is required.\";\n\t\tif (this.options.store.getModel(this.options.providerId, id)) return `Model \"${id}\" already exists.`;\n\t\tif (!this.host.effectiveApi(draft.fields)) {\n\t\t\treturn \"Cannot resolve an api — set one under Model-Specific API or the provider's API Auth.\";\n\t\t}\n\t\tif (!this.host.effectiveBaseUrl(draft.fields)) {\n\t\t\treturn \"Cannot resolve a baseUrl — set one under Model-Specific API or the provider's API Auth.\";\n\t\t}\n\t\tconst fields = { ...draft.fields };\n\t\tconst model: ModelsJsonModel = { ...fields, id };\n\t\tthis.draft = undefined;\n\t\tthis.host.mutate(() => this.options.store.addModel(this.options.providerId, model));\n\t\tthis.rebuildLeftItems();\n\t\tconst index = this.leftItems.findIndex((item) => item.kind === \"model\" && item.modelId === id);\n\t\tif (index >= 0) this.leftIndex = index;\n\t\tthis.resetRightStack();\n\t\tthis.refresh();\n\t\treturn undefined;\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Frame rendering\n\t// ------------------------------------------------------------------\n\n\tprivate refresh(): void {\n\t\tthis.invalidate();\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate renderFrame(width: number): string[] {\n\t\tconst theme = this.theme;\n\t\tconst border = new DynamicBorder((text) => theme.fg(\"border\", text)).render(width)[0]!;\n\t\tif (width < MIN_WIDTH) {\n\t\t\treturn [\n\t\t\t\tborder,\n\t\t\t\ttruncateToWidth(theme.fg(\"warning\", ` /provider needs at least ${MIN_WIDTH} columns`), width),\n\t\t\t\tborder,\n\t\t\t];\n\t\t}\n\t\tconst leftWidth = this.computeLeftWidth(width);\n\t\tconst rightWidth = width - leftWidth - 3;\n\t\tconst separator = theme.fg(\"border\", \" │ \");\n\n\t\tconst title = this.renderTitle(width);\n\t\t// The crumb marks drill-down depth only; base rows are already named by the left selection.\n\t\tconst crumb = truncateToWidth(this.theme.fg(\"muted\", this.topPane()?.crumb ?? \"\"), rightWidth);\n\t\tconst leftLines = this.renderLeft(leftWidth);\n\t\tconst pane = this.topPane();\n\t\tconst paneLines = pane ? windowLines(theme, pane.render(rightWidth), BODY_ROWS - 1, pane.scrollWindow?.()) : [];\n\t\tconst rightLines = [crumb, ...paneLines];\n\t\tconst body: string[] = [];\n\t\tfor (let row = 0; row < BODY_ROWS; row++) {\n\t\t\tconst left = padTo(truncateToWidth(leftLines[row] ?? \"\", leftWidth), leftWidth);\n\t\t\tconst right = truncateToWidth(rightLines[row] ?? \"\", rightWidth);\n\t\t\tbody.push(left + separator + right);\n\t\t}\n\n\t\tconst footerLines = this.renderFooter(width);\n\t\treturn [border, title, border, ...body, border, ...footerLines, border];\n\t}\n\n\t/** Content-driven left width: fits the longest visible label, clamped to 16–40 and 45% of the terminal. */\n\tprivate computeLeftWidth(width: number): number {\n\t\tlet longest = 12;\n\t\tfor (const item of this.leftItems) {\n\t\t\tif (item.kind === \"separator\") continue;\n\t\t\tlet label = \"\";\n\t\t\tswitch (item.kind) {\n\t\t\t\tcase \"apiAuth\":\n\t\t\t\t\tlabel = \"API Auth\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"fetch\":\n\t\t\t\t\tlabel = `Fetch Models${this.fetchStatus ? ` ${this.fetchStatus}` : \"\"}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"model\": {\n\t\t\t\t\tconst model = this.options.store.getModel(this.options.providerId, item.modelId);\n\t\t\t\t\tlabel = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"draft\":\n\t\t\t\t\tlabel = `${this.draft?.fields.name ?? this.draft?.fields.id ?? \"New Model\"} · draft`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"addModel\":\n\t\t\t\t\tlabel = \"+ Add Model\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"deleteProvider\":\n\t\t\t\t\tlabel = \"Delete Provider\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlongest = Math.max(longest, visibleWidth(label));\n\t\t}\n\t\tconst fit = Math.max(LEFT_WIDTH_MIN, Math.min(LEFT_WIDTH_MAX, longest + 2));\n\t\treturn Math.min(fit, Math.max(LEFT_WIDTH_MIN, Math.floor(width * 0.45)));\n\t}\n\n\tprivate renderTitle(width: number): string {\n\t\tconst theme = this.theme;\n\t\tlet title = ` /provider · ${this.options.providerId}`;\n\t\tif (isBuiltinProviderId(this.options.providerId)) title += \" · overlays built-in catalog\";\n\t\treturn truncateToWidth(theme.fg(\"accent\", theme.bold(title)), width);\n\t}\n\n\tprivate renderFooter(width: number): string[] {\n\t\tif (this.focusPane === \"right\") {\n\t\t\t// The editor owns the way-back hint so every pane's footer is consistent.\n\t\t\tconst hints = [this.topPane()?.hints() ?? \"\", keyHint(\"app.provider.switchPaneLeft\", \"focus left\")]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \");\n\t\t\treturn [truncateToWidth(hints, width)];\n\t\t}\n\t\tconst hints = [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", this.leftActivateLabel()),\n\t\t\tkeyHint(\"app.provider.switchPaneRight\", \"focus right\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t\treturn [truncateToWidth(hints, width)];\n\t}\n\n\t/** What Enter does to the selected left-column row, so the footer never lies about action rows. */\n\tprivate leftActivateLabel(): string {\n\t\tswitch (this.leftItems[this.leftIndex]?.kind) {\n\t\t\tcase \"fetch\":\n\t\t\t\treturn \"fetch\";\n\t\t\tcase \"addModel\":\n\t\t\t\treturn \"create\";\n\t\t\tcase \"deleteProvider\":\n\t\t\t\treturn \"delete\";\n\t\t\tdefault:\n\t\t\t\treturn \"open\";\n\t\t}\n\t}\n}\n\nfunction modelDisplayName(model: ModelsJsonModel): string {\n\treturn model.name ?? model.id;\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Fetch Models pane: idle intro → cancellable loading → error / searchable
3
+ * checklist of the remote catalog. Already-configured ids are marked "Added"
4
+ * and cannot be checked; importing appends new {id, name?} entries, saves
5
+ * once, and refreshes the provider immediately.
6
+ */
7
+ import type { EditorHost, EditorPane } from "./pane.ts";
8
+ import { type ScrollWindowInfo } from "./value-row.ts";
9
+ export declare class FetchModelsPane implements EditorPane {
10
+ private state;
11
+ private controller;
12
+ private search;
13
+ private query;
14
+ private index;
15
+ private checked;
16
+ private importing;
17
+ private error;
18
+ private focused;
19
+ private disposed;
20
+ private readonly host;
21
+ constructor(host: EditorHost);
22
+ /** Enter pressed on the left-column row (or on the idle pane): start the request. */
23
+ start(): void;
24
+ private existingIds;
25
+ /** URL the catalog would be fetched from; undefined while no baseUrl is configured. */
26
+ private catalogUrl;
27
+ private rows;
28
+ render(width: number): string[];
29
+ scrollWindow(): ScrollWindowInfo;
30
+ handleInput(data: string): void;
31
+ private handleResultsInput;
32
+ private importChecked;
33
+ private exitResults;
34
+ setFocused(focused: boolean): void;
35
+ isEditing(): boolean;
36
+ dispose(): void;
37
+ hints(): string;
38
+ }
39
+ //# sourceMappingURL=fetch-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-models.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/fetch-models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAmC,KAAK,gBAAgB,EAA+B,MAAM,gBAAgB,CAAC;AAQrH,qBAAa,eAAgB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;gBACtB,IAAI,EAAE,UAAU;IAS5B,qFAAqF;IACrF,KAAK,IAAI,IAAI;IAmCb,OAAO,CAAC,WAAW;IAInB,uFAAuF;IACvF,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,IAAI;IAWZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA0E/B,YAAY,IAAI,gBAAgB;IAShC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqC/B,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,WAAW;IAQnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAKf,KAAK,IAAI,MAAM;CAmBf"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Fetch Models pane: idle intro → cancellable loading → error / searchable
3
+ * checklist of the remote catalog. Already-configured ids are marked "Added"
4
+ * and cannot be checked; importing appends new {id, name?} entries, saves
5
+ * once, and refreshes the provider immediately.
6
+ */
7
+ import { keyHint, rawKeyHint } from "../../../modes/interactive/components/keybinding-hints.js";
8
+ import { truncate } from "../constants.js";
9
+ import { modelCatalogUrl } from "../probe.js";
10
+ import { renderInfoLine, renderPlainLine, truncateMiddle, ValueEditor } from "./value-row.js";
11
+ export class FetchModelsPane {
12
+ constructor(host) {
13
+ this.state = { type: "idle" };
14
+ this.query = "";
15
+ this.index = 0;
16
+ this.checked = new Set();
17
+ this.importing = false;
18
+ this.focused = false;
19
+ this.disposed = false;
20
+ this.host = host;
21
+ this.search = new ValueEditor({
22
+ onCommit: () => this.importChecked(),
23
+ onCancel: () => this.exitResults(),
24
+ });
25
+ }
26
+ /** Enter pressed on the left-column row (or on the idle pane): start the request. */
27
+ start() {
28
+ if (this.disposed || this.state.type === "loading" || this.importing)
29
+ return;
30
+ if (!this.catalogUrl())
31
+ return; // the idle pane explains what to configure first
32
+ const controller = new AbortController();
33
+ this.controller = controller;
34
+ this.state = { type: "loading" };
35
+ this.error = undefined;
36
+ this.host.refresh();
37
+ void this.host
38
+ .runFetch(controller.signal)
39
+ .then((result) => {
40
+ if (this.disposed || controller.signal.aborted || this.controller !== controller)
41
+ return;
42
+ if (!result.ok) {
43
+ if (result.error === "Cancelled.")
44
+ return;
45
+ this.state = { type: "error", message: result.error };
46
+ this.host.setFetchStatus("· failed");
47
+ }
48
+ else {
49
+ this.state = { type: "results", models: result.models, truncated: result.truncated };
50
+ this.checked = new Set();
51
+ this.query = "";
52
+ this.search.reset("");
53
+ this.index = 0;
54
+ this.search.focused = this.focused;
55
+ this.host.setFetchStatus(`· ${result.models.length} models`);
56
+ }
57
+ this.host.refresh();
58
+ })
59
+ .catch((error) => {
60
+ if (controller.signal.aborted)
61
+ return;
62
+ this.state = { type: "error", message: error instanceof Error ? error.message : String(error) };
63
+ this.host.setFetchStatus("· failed");
64
+ this.host.refresh();
65
+ });
66
+ }
67
+ existingIds() {
68
+ return new Set(this.host.store.getModels(this.host.providerId).map((model) => model.id));
69
+ }
70
+ /** URL the catalog would be fetched from; undefined while no baseUrl is configured. */
71
+ catalogUrl() {
72
+ const baseUrl = this.host.store.getProvider(this.host.providerId)?.baseUrl;
73
+ try {
74
+ return baseUrl ? modelCatalogUrl(new URL(baseUrl), this.host.effectiveApi()).href : undefined;
75
+ }
76
+ catch {
77
+ return undefined; // validated before fetching
78
+ }
79
+ }
80
+ rows() {
81
+ if (this.state.type !== "results")
82
+ return [];
83
+ const existing = this.existingIds();
84
+ const rows = this.state.models.map((model) => ({ model, added: existing.has(model.id) }));
85
+ const query = this.query.trim().toLowerCase();
86
+ if (!query)
87
+ return rows;
88
+ return rows.filter((row) => row.model.id.toLowerCase().includes(query) || row.model.name?.toLowerCase().includes(query));
89
+ }
90
+ render(width) {
91
+ const theme = this.host.theme;
92
+ const catalogUrl = this.catalogUrl();
93
+ switch (this.state.type) {
94
+ case "idle":
95
+ // A real action row, so → moving focus here has a visible effect.
96
+ return catalogUrl
97
+ ? [
98
+ renderPlainLine(theme, "Fetch Models", {
99
+ active: true,
100
+ paneFocused: this.focused,
101
+ note: `· from ${truncateMiddle(catalogUrl, Math.max(10, width - 22))}`,
102
+ width,
103
+ }),
104
+ ]
105
+ : [renderInfoLine(theme, "Set a baseUrl under API Auth first.", width)];
106
+ case "loading":
107
+ return [
108
+ renderInfoLine(theme, `Fetching ${catalogUrl ?? ""} …`, width),
109
+ renderInfoLine(theme, "Esc cancels the request.", width),
110
+ ];
111
+ case "error":
112
+ return [
113
+ theme.fg("error", truncate(this.state.message, Math.max(10, width - 2))),
114
+ renderInfoLine(theme, "Enter retries; Esc goes back.", width),
115
+ ];
116
+ case "results": {
117
+ const lines = [];
118
+ if (this.state.truncated) {
119
+ lines.push(renderInfoLine(theme, "The catalog was truncated; refine manually if a model is missing.", width));
120
+ }
121
+ lines.push(this.search.renderLine(width));
122
+ // All rows render; the editor's fixed window scrolls around scrollWindow().
123
+ const rows = this.rows();
124
+ for (const [rowIndex, row] of rows.entries()) {
125
+ if (row.added) {
126
+ lines.push(renderPlainLine(theme, row.model.id, {
127
+ active: rowIndex === this.index,
128
+ paneFocused: this.focused,
129
+ dim: true,
130
+ note: "· Added",
131
+ width,
132
+ }));
133
+ continue;
134
+ }
135
+ lines.push(renderPlainLine(theme, row.model.name ? `${row.model.id} · ${row.model.name}` : row.model.id, {
136
+ checked: this.checked.has(row.model.id),
137
+ active: rowIndex === this.index,
138
+ paneFocused: this.focused,
139
+ width,
140
+ }));
141
+ }
142
+ if (rows.length === 0)
143
+ lines.push(renderInfoLine(theme, "No matching models.", width));
144
+ const addedCount = rows.filter((row) => row.added).length;
145
+ lines.push(renderInfoLine(theme, `${this.checked.size} selected · ${rows.length} shown${addedCount ? ` · ${addedCount} already added` : ""}`, width));
146
+ if (this.importing)
147
+ lines.push(renderInfoLine(theme, "Importing…", width));
148
+ if (this.error)
149
+ lines.push(theme.fg("error", truncate(this.error, Math.max(10, width - 2))));
150
+ return lines;
151
+ }
152
+ }
153
+ }
154
+ scrollWindow() {
155
+ if (this.state.type !== "results")
156
+ return {};
157
+ // The truncation notice and the filter input pin above the checklist;
158
+ // the selection summary (and import progress/error) pin below.
159
+ const top = (this.state.truncated ? 1 : 0) + 1;
160
+ const bottom = 1 + (this.importing ? 1 : 0) + (this.error ? 1 : 0);
161
+ return { top, bottom, cursor: top + this.index };
162
+ }
163
+ handleInput(data) {
164
+ const kb = this.host.keybindings;
165
+ switch (this.state.type) {
166
+ case "idle":
167
+ if (kb.matches(data, "tui.select.confirm")) {
168
+ this.start(); // guarded internally
169
+ return;
170
+ }
171
+ if (kb.matches(data, "tui.select.cancel")) {
172
+ this.host.popPane();
173
+ return;
174
+ }
175
+ return;
176
+ case "loading":
177
+ if (kb.matches(data, "tui.select.cancel")) {
178
+ this.controller?.abort();
179
+ this.state = { type: "idle" };
180
+ this.host.refresh();
181
+ return;
182
+ }
183
+ return;
184
+ case "error":
185
+ if (kb.matches(data, "tui.select.confirm")) {
186
+ this.start();
187
+ return;
188
+ }
189
+ if (kb.matches(data, "tui.select.cancel")) {
190
+ this.host.popPane();
191
+ return;
192
+ }
193
+ return;
194
+ case "results":
195
+ this.handleResultsInput(data);
196
+ return;
197
+ }
198
+ }
199
+ handleResultsInput(data) {
200
+ const kb = this.host.keybindings;
201
+ const rows = this.rows();
202
+ if (kb.matches(data, "tui.select.up")) {
203
+ if (rows.length > 0)
204
+ this.index = this.index === 0 ? rows.length - 1 : this.index - 1;
205
+ this.host.refresh();
206
+ return;
207
+ }
208
+ if (kb.matches(data, "tui.select.down")) {
209
+ if (rows.length > 0)
210
+ this.index = (this.index + 1) % rows.length;
211
+ this.host.refresh();
212
+ return;
213
+ }
214
+ if (kb.matches(data, "app.list.toggle")) {
215
+ const row = rows[this.index];
216
+ if (!row || row.added || this.importing)
217
+ return;
218
+ if (this.checked.has(row.model.id))
219
+ this.checked.delete(row.model.id);
220
+ else
221
+ this.checked.add(row.model.id);
222
+ this.host.refresh();
223
+ return;
224
+ }
225
+ if (kb.matches(data, "tui.select.cancel")) {
226
+ this.exitResults();
227
+ return;
228
+ }
229
+ if (kb.matches(data, "tui.select.confirm")) {
230
+ this.importChecked();
231
+ return;
232
+ }
233
+ const before = this.query;
234
+ this.search.handleInput(data);
235
+ this.query = this.search.value;
236
+ if (this.query !== before)
237
+ this.index = 0;
238
+ this.host.refresh();
239
+ }
240
+ importChecked() {
241
+ if (this.state.type !== "results" || this.importing)
242
+ return;
243
+ // Nothing checked: import the highlighted row, like a fuzzy picker. Only Esc discards.
244
+ let chosen;
245
+ if (this.checked.size === 0) {
246
+ const row = this.rows()[this.index];
247
+ if (!row || row.added)
248
+ return;
249
+ chosen = [row.model];
250
+ }
251
+ else {
252
+ chosen = this.state.models.filter((model) => this.checked.has(model.id));
253
+ }
254
+ const controller = new AbortController();
255
+ this.controller = controller;
256
+ this.importing = true;
257
+ this.error = undefined;
258
+ this.host.refresh();
259
+ void this.host
260
+ .importModels(chosen, controller.signal)
261
+ .then((error) => {
262
+ if (this.disposed || controller.signal.aborted || this.controller !== controller)
263
+ return;
264
+ this.importing = false;
265
+ if (error) {
266
+ this.error = error;
267
+ this.host.setFetchStatus("· import failed");
268
+ return this.host.refresh();
269
+ }
270
+ this.host.setFetchStatus(`· ${this.host.store.getModels(this.host.providerId).length} models`);
271
+ this.state = { type: "idle" };
272
+ this.host.popPane(); // back to the left column with the new models visible
273
+ })
274
+ .catch((error) => {
275
+ if (this.disposed || controller.signal.aborted || this.controller !== controller)
276
+ return;
277
+ this.importing = false;
278
+ this.error = error instanceof Error ? error.message : String(error);
279
+ this.host.refresh();
280
+ });
281
+ }
282
+ exitResults() {
283
+ this.controller?.abort();
284
+ this.importing = false;
285
+ this.state = { type: "idle" };
286
+ this.checked = new Set();
287
+ this.host.popPane();
288
+ }
289
+ setFocused(focused) {
290
+ this.focused = focused;
291
+ this.search.focused = focused && this.state.type === "results";
292
+ }
293
+ isEditing() {
294
+ return this.state.type === "results"; // the filter input owns ←/→
295
+ }
296
+ dispose() {
297
+ this.disposed = true;
298
+ this.controller?.abort();
299
+ }
300
+ hints() {
301
+ switch (this.state.type) {
302
+ case "loading":
303
+ return keyHint("tui.select.cancel", "cancel request");
304
+ case "results":
305
+ return [
306
+ rawKeyHint("type", "filter"),
307
+ keyHint("app.list.toggle", "check"),
308
+ keyHint("tui.select.confirm", "import"),
309
+ keyHint("tui.select.cancel", "discard"),
310
+ ].join(" ");
311
+ case "error":
312
+ return [keyHint("tui.select.confirm", "retry"), keyHint("tui.select.cancel", "back")].join(" ");
313
+ default:
314
+ return this.catalogUrl()
315
+ ? [keyHint("tui.select.confirm", "fetch"), keyHint("tui.select.cancel", "back")].join(" ")
316
+ : keyHint("tui.select.cancel", "back");
317
+ }
318
+ }
319
+ }
320
+ //# sourceMappingURL=fetch-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-models.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/fetch-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Fetch Models pane: idle intro → cancellable loading → error / searchable\n * checklist of the remote catalog. Already-configured ids are marked \"Added\"\n * and cannot be checked; importing appends new {id, name?} entries, saves\n * once, and refreshes the provider immediately.\n */\n\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { modelCatalogUrl, type ProbeModel } from \"../probe.ts\";\nimport type { EditorHost, EditorPane } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, type ScrollWindowInfo, truncateMiddle, ValueEditor } from \"./value-row.ts\";\n\ntype FetchState =\n\t| { type: \"idle\" }\n\t| { type: \"loading\" }\n\t| { type: \"error\"; message: string }\n\t| { type: \"results\"; models: ProbeModel[]; truncated: boolean };\n\nexport class FetchModelsPane implements EditorPane {\n\tprivate state: FetchState = { type: \"idle\" };\n\tprivate controller: AbortController | undefined;\n\tprivate search: ValueEditor;\n\tprivate query = \"\";\n\tprivate index = 0;\n\tprivate checked = new Set<string>();\n\tprivate importing = false;\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\tprivate disposed = false;\n\n\tprivate readonly host: EditorHost;\n\tconstructor(host: EditorHost) {\n\t\tthis.host = host;\n\n\t\tthis.search = new ValueEditor({\n\t\t\tonCommit: () => this.importChecked(),\n\t\t\tonCancel: () => this.exitResults(),\n\t\t});\n\t}\n\n\t/** Enter pressed on the left-column row (or on the idle pane): start the request. */\n\tstart(): void {\n\t\tif (this.disposed || this.state.type === \"loading\" || this.importing) return;\n\t\tif (!this.catalogUrl()) return; // the idle pane explains what to configure first\n\t\tconst controller = new AbortController();\n\t\tthis.controller = controller;\n\t\tthis.state = { type: \"loading\" };\n\t\tthis.error = undefined;\n\t\tthis.host.refresh();\n\t\tvoid this.host\n\t\t\t.runFetch(controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (this.disposed || controller.signal.aborted || this.controller !== controller) return;\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tif (result.error === \"Cancelled.\") return;\n\t\t\t\t\tthis.state = { type: \"error\", message: result.error };\n\t\t\t\t\tthis.host.setFetchStatus(\"· failed\");\n\t\t\t\t} else {\n\t\t\t\t\tthis.state = { type: \"results\", models: result.models, truncated: result.truncated };\n\t\t\t\t\tthis.checked = new Set();\n\t\t\t\t\tthis.query = \"\";\n\t\t\t\t\tthis.search.reset(\"\");\n\t\t\t\t\tthis.index = 0;\n\t\t\t\t\tthis.search.focused = this.focused;\n\t\t\t\t\tthis.host.setFetchStatus(`· ${result.models.length} models`);\n\t\t\t\t}\n\t\t\t\tthis.host.refresh();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tthis.state = { type: \"error\", message: error instanceof Error ? error.message : String(error) };\n\t\t\t\tthis.host.setFetchStatus(\"· failed\");\n\t\t\t\tthis.host.refresh();\n\t\t\t});\n\t}\n\n\tprivate existingIds(): Set<string> {\n\t\treturn new Set(this.host.store.getModels(this.host.providerId).map((model) => model.id));\n\t}\n\n\t/** URL the catalog would be fetched from; undefined while no baseUrl is configured. */\n\tprivate catalogUrl(): string | undefined {\n\t\tconst baseUrl = this.host.store.getProvider(this.host.providerId)?.baseUrl;\n\t\ttry {\n\t\t\treturn baseUrl ? modelCatalogUrl(new URL(baseUrl), this.host.effectiveApi()).href : undefined;\n\t\t} catch {\n\t\t\treturn undefined; // validated before fetching\n\t\t}\n\t}\n\n\tprivate rows(): { model: ProbeModel; added: boolean }[] {\n\t\tif (this.state.type !== \"results\") return [];\n\t\tconst existing = this.existingIds();\n\t\tconst rows = this.state.models.map((model) => ({ model, added: existing.has(model.id) }));\n\t\tconst query = this.query.trim().toLowerCase();\n\t\tif (!query) return rows;\n\t\treturn rows.filter(\n\t\t\t(row) => row.model.id.toLowerCase().includes(query) || row.model.name?.toLowerCase().includes(query),\n\t\t);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst catalogUrl = this.catalogUrl();\n\t\tswitch (this.state.type) {\n\t\t\tcase \"idle\":\n\t\t\t\t// A real action row, so → moving focus here has a visible effect.\n\t\t\t\treturn catalogUrl\n\t\t\t\t\t? [\n\t\t\t\t\t\t\trenderPlainLine(theme, \"Fetch Models\", {\n\t\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\t\tnote: `· from ${truncateMiddle(catalogUrl, Math.max(10, width - 22))}`,\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]\n\t\t\t\t\t: [renderInfoLine(theme, \"Set a baseUrl under API Auth first.\", width)];\n\t\t\tcase \"loading\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `Fetching ${catalogUrl ?? \"\"} …`, width),\n\t\t\t\t\trenderInfoLine(theme, \"Esc cancels the request.\", width),\n\t\t\t\t];\n\t\t\tcase \"error\":\n\t\t\t\treturn [\n\t\t\t\t\ttheme.fg(\"error\", truncate(this.state.message, Math.max(10, width - 2))),\n\t\t\t\t\trenderInfoLine(theme, \"Enter retries; Esc goes back.\", width),\n\t\t\t\t];\n\t\t\tcase \"results\": {\n\t\t\t\tconst lines: string[] = [];\n\t\t\t\tif (this.state.truncated) {\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\trenderInfoLine(theme, \"The catalog was truncated; refine manually if a model is missing.\", width),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlines.push(this.search.renderLine(width));\n\t\t\t\t// All rows render; the editor's fixed window scrolls around scrollWindow().\n\t\t\t\tconst rows = this.rows();\n\t\t\t\tfor (const [rowIndex, row] of rows.entries()) {\n\t\t\t\t\tif (row.added) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\trenderPlainLine(theme, row.model.id, {\n\t\t\t\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\t\tdim: true,\n\t\t\t\t\t\t\t\tnote: \"· Added\",\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\trenderPlainLine(theme, row.model.name ? `${row.model.id} · ${row.model.name}` : row.model.id, {\n\t\t\t\t\t\t\tchecked: this.checked.has(row.model.id),\n\t\t\t\t\t\t\tactive: rowIndex === this.index,\n\t\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (rows.length === 0) lines.push(renderInfoLine(theme, \"No matching models.\", width));\n\t\t\t\tconst addedCount = rows.filter((row) => row.added).length;\n\t\t\t\tlines.push(\n\t\t\t\t\trenderInfoLine(\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t\t`${this.checked.size} selected · ${rows.length} shown${addedCount ? ` · ${addedCount} already added` : \"\"}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (this.importing) lines.push(renderInfoLine(theme, \"Importing…\", width));\n\t\t\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\t\t\treturn lines;\n\t\t\t}\n\t\t}\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\tif (this.state.type !== \"results\") return {};\n\t\t// The truncation notice and the filter input pin above the checklist;\n\t\t// the selection summary (and import progress/error) pin below.\n\t\tconst top = (this.state.truncated ? 1 : 0) + 1;\n\t\tconst bottom = 1 + (this.importing ? 1 : 0) + (this.error ? 1 : 0);\n\t\treturn { top, bottom, cursor: top + this.index };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tswitch (this.state.type) {\n\t\t\tcase \"idle\":\n\t\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.start(); // guarded internally\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.host.popPane();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"loading\":\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.controller?.abort();\n\t\t\t\t\tthis.state = { type: \"idle\" };\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"error\":\n\t\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.start();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tthis.host.popPane();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"results\":\n\t\t\t\tthis.handleResultsInput(data);\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate handleResultsInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst rows = this.rows();\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (rows.length > 0) this.index = this.index === 0 ? rows.length - 1 : this.index - 1;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (rows.length > 0) this.index = (this.index + 1) % rows.length;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst row = rows[this.index];\n\t\t\tif (!row || row.added || this.importing) return;\n\t\t\tif (this.checked.has(row.model.id)) this.checked.delete(row.model.id);\n\t\t\telse this.checked.add(row.model.id);\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.exitResults();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.importChecked();\n\t\t\treturn;\n\t\t}\n\t\tconst before = this.query;\n\t\tthis.search.handleInput(data);\n\t\tthis.query = this.search.value;\n\t\tif (this.query !== before) this.index = 0;\n\t\tthis.host.refresh();\n\t}\n\n\tprivate importChecked(): void {\n\t\tif (this.state.type !== \"results\" || this.importing) return;\n\t\t// Nothing checked: import the highlighted row, like a fuzzy picker. Only Esc discards.\n\t\tlet chosen: ProbeModel[];\n\t\tif (this.checked.size === 0) {\n\t\t\tconst row = this.rows()[this.index];\n\t\t\tif (!row || row.added) return;\n\t\t\tchosen = [row.model];\n\t\t} else {\n\t\t\tchosen = this.state.models.filter((model) => this.checked.has(model.id));\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tthis.controller = controller;\n\t\tthis.importing = true;\n\t\tthis.error = undefined;\n\t\tthis.host.refresh();\n\t\tvoid this.host\n\t\t\t.importModels(chosen, controller.signal)\n\t\t\t.then((error) => {\n\t\t\t\tif (this.disposed || controller.signal.aborted || this.controller !== controller) return;\n\t\t\t\tthis.importing = false;\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.error = error;\n\t\t\t\t\tthis.host.setFetchStatus(\"· import failed\");\n\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t}\n\t\t\t\tthis.host.setFetchStatus(`· ${this.host.store.getModels(this.host.providerId).length} models`);\n\t\t\t\tthis.state = { type: \"idle\" };\n\t\t\t\tthis.host.popPane(); // back to the left column with the new models visible\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (this.disposed || controller.signal.aborted || this.controller !== controller) return;\n\t\t\t\tthis.importing = false;\n\t\t\t\tthis.error = error instanceof Error ? error.message : String(error);\n\t\t\t\tthis.host.refresh();\n\t\t\t});\n\t}\n\n\tprivate exitResults(): void {\n\t\tthis.controller?.abort();\n\t\tthis.importing = false;\n\t\tthis.state = { type: \"idle\" };\n\t\tthis.checked = new Set();\n\t\tthis.host.popPane();\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tthis.search.focused = focused && this.state.type === \"results\";\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.state.type === \"results\"; // the filter input owns ←/→\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.controller?.abort();\n\t}\n\n\thints(): string {\n\t\tswitch (this.state.type) {\n\t\t\tcase \"loading\":\n\t\t\t\treturn keyHint(\"tui.select.cancel\", \"cancel request\");\n\t\t\tcase \"results\":\n\t\t\t\treturn [\n\t\t\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\t\t\tkeyHint(\"app.list.toggle\", \"check\"),\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"import\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"discard\"),\n\t\t\t\t].join(\" \");\n\t\t\tcase \"error\":\n\t\t\t\treturn [keyHint(\"tui.select.confirm\", \"retry\"), keyHint(\"tui.select.cancel\", \"back\")].join(\" \");\n\t\t\tdefault:\n\t\t\t\treturn this.catalogUrl()\n\t\t\t\t\t? [keyHint(\"tui.select.confirm\", \"fetch\"), keyHint(\"tui.select.cancel\", \"back\")].join(\" \")\n\t\t\t\t\t: keyHint(\"tui.select.cancel\", \"back\");\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,43 @@
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 type { EditorHost, EditorPane, ModelHandle } from "./pane.ts";
8
+ import { type ScrollWindowInfo } from "./value-row.ts";
9
+ export declare class ModelFieldsPane implements EditorPane {
10
+ private readonly rows;
11
+ private index;
12
+ private editing;
13
+ private editingRow;
14
+ private error;
15
+ private focused;
16
+ private renaming;
17
+ private disposed;
18
+ private readonly host;
19
+ private readonly model;
20
+ constructor(host: EditorHost, model: ModelHandle);
21
+ /** Enter id editing immediately (used right after + Add Model). */
22
+ startEditingId(): void;
23
+ /** A draft with no fields set is safe to abandon without asking. */
24
+ private draftEmpty;
25
+ render(width: number): string[];
26
+ scrollWindow(): ScrollWindowInfo;
27
+ private renderRow;
28
+ /** Which connection fields this model overrides, or where they come from when it overrides nothing. */
29
+ private modelApiSummary;
30
+ private subpageSummary;
31
+ handleInput(data: string): void;
32
+ private toggleRow;
33
+ private enterRow;
34
+ private overwriteRow;
35
+ private beginEdit;
36
+ private commitText;
37
+ private pushSubpage;
38
+ setFocused(focused: boolean): void;
39
+ isEditing(): boolean;
40
+ dispose(): void;
41
+ hints(): string;
42
+ }
43
+ //# sourceMappingURL=model-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fields.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/model-fields.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AAcxB,qBAAa,eAAgB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBACxB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IAoBhD,mEAAmE;IACnE,cAAc,IAAI,IAAI;IAKtB,oEAAoE;IACpE,OAAO,CAAC,UAAU;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB/B,YAAY,IAAI,gBAAgB;IAShC,OAAO,CAAC,SAAS;IAsFjB,uGAAuG;IACvG,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IAkCtB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiD/B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;IAyChB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,UAAU;IA0ElB,OAAO,CAAC,WAAW;IAiBnB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAIf,KAAK,IAAI,MAAM;CASf"}