@astralyn/pi 1.4.5 → 1.4.7

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 (324) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bundle/chunks/chunk-FODCTZXW.js +230 -0
  3. package/dist/bundle/chunks/{chunk-I5S7H7GA.js → chunk-FYKNSJG6.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
  7. package/dist/bundle/chunks/chunk-YJTSOLP2.js +1499 -0
  8. package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
  9. package/dist/bundle/chunks/{execute-GMFGC27P.js → execute-4CWRNHPO.js} +1 -1
  10. package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
  11. package/dist/bundle/chunks/{virtual-modules-6FUV7ZDV.js → virtual-modules-PKEOKGYI.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/index.js +1 -1
  14. package/dist/bundle/rpc-entry.js +1 -1
  15. package/dist/core/agent-session.d.ts +0 -3
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +0 -4
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/index.d.ts +1 -1
  20. package/dist/core/extensions/index.d.ts.map +1 -1
  21. package/dist/core/extensions/index.js.map +1 -1
  22. package/dist/core/isolated-session.d.ts +23 -0
  23. package/dist/core/isolated-session.d.ts.map +1 -0
  24. package/dist/core/isolated-session.js +55 -0
  25. package/dist/core/isolated-session.js.map +1 -0
  26. package/dist/core/package-manager.d.ts +7 -1
  27. package/dist/core/package-manager.d.ts.map +1 -1
  28. package/dist/core/package-manager.js +72 -1
  29. package/dist/core/package-manager.js.map +1 -1
  30. package/dist/core/resource-loader.d.ts +1 -0
  31. package/dist/core/resource-loader.d.ts.map +1 -1
  32. package/dist/core/resource-loader.js +23 -7
  33. package/dist/core/resource-loader.js.map +1 -1
  34. package/dist/core/settings-manager.d.ts +4 -2
  35. package/dist/core/settings-manager.d.ts.map +1 -1
  36. package/dist/core/settings-manager.js +11 -0
  37. package/dist/core/settings-manager.js.map +1 -1
  38. package/dist/core/settings-schema.d.ts +7 -0
  39. package/dist/core/settings-schema.d.ts.map +1 -1
  40. package/dist/core/settings-schema.js +6 -0
  41. package/dist/core/settings-schema.js.map +1 -1
  42. package/dist/core/skills.d.ts +10 -0
  43. package/dist/core/skills.d.ts.map +1 -1
  44. package/dist/core/skills.js +23 -0
  45. package/dist/core/skills.js.map +1 -1
  46. package/dist/core/tasks/codec.d.ts +12 -0
  47. package/dist/core/tasks/codec.d.ts.map +1 -0
  48. package/dist/core/tasks/codec.js +139 -0
  49. package/dist/core/tasks/codec.js.map +1 -0
  50. package/dist/core/tasks/delivery.d.ts +11 -4
  51. package/dist/core/tasks/delivery.d.ts.map +1 -1
  52. package/dist/core/tasks/delivery.js +9 -9
  53. package/dist/core/tasks/delivery.js.map +1 -1
  54. package/dist/core/tasks/execution.d.ts +71 -0
  55. package/dist/core/tasks/execution.d.ts.map +1 -0
  56. package/dist/core/tasks/execution.js +292 -0
  57. package/dist/core/tasks/execution.js.map +1 -0
  58. package/dist/core/tasks/format.d.ts +0 -2
  59. package/dist/core/tasks/format.d.ts.map +1 -1
  60. package/dist/core/tasks/format.js +1 -16
  61. package/dist/core/tasks/format.js.map +1 -1
  62. package/dist/core/tasks/limits.d.ts +12 -1
  63. package/dist/core/tasks/limits.d.ts.map +1 -1
  64. package/dist/core/tasks/limits.js +20 -1
  65. package/dist/core/tasks/limits.js.map +1 -1
  66. package/dist/core/tasks/output.d.ts +17 -17
  67. package/dist/core/tasks/output.d.ts.map +1 -1
  68. package/dist/core/tasks/output.js +72 -69
  69. package/dist/core/tasks/output.js.map +1 -1
  70. package/dist/core/tasks/presentation.d.ts +14 -5
  71. package/dist/core/tasks/presentation.d.ts.map +1 -1
  72. package/dist/core/tasks/presentation.js +56 -185
  73. package/dist/core/tasks/presentation.js.map +1 -1
  74. package/dist/core/tasks/record.d.ts +45 -0
  75. package/dist/core/tasks/record.d.ts.map +1 -0
  76. package/dist/core/tasks/record.js +80 -0
  77. package/dist/core/tasks/record.js.map +1 -0
  78. package/dist/core/tasks/runtime.d.ts +22 -22
  79. package/dist/core/tasks/runtime.d.ts.map +1 -1
  80. package/dist/core/tasks/runtime.js +170 -343
  81. package/dist/core/tasks/runtime.js.map +1 -1
  82. package/dist/core/tasks/scheduler.d.ts +16 -0
  83. package/dist/core/tasks/scheduler.d.ts.map +1 -0
  84. package/dist/core/tasks/scheduler.js +42 -0
  85. package/dist/core/tasks/scheduler.js.map +1 -0
  86. package/dist/core/tasks/session.d.ts +1 -1
  87. package/dist/core/tasks/session.d.ts.map +1 -1
  88. package/dist/core/tasks/session.js +22 -35
  89. package/dist/core/tasks/session.js.map +1 -1
  90. package/dist/core/tasks/store.d.ts +18 -25
  91. package/dist/core/tasks/store.d.ts.map +1 -1
  92. package/dist/core/tasks/store.js +45 -43
  93. package/dist/core/tasks/store.js.map +1 -1
  94. package/dist/core/tasks/types.d.ts +159 -70
  95. package/dist/core/tasks/types.d.ts.map +1 -1
  96. package/dist/core/tasks/types.js +3 -9
  97. package/dist/core/tasks/types.js.map +1 -1
  98. package/dist/core/tools/shell-execution.d.ts +8 -7
  99. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  100. package/dist/core/tools/shell-execution.js +19 -27
  101. package/dist/core/tools/shell-execution.js.map +1 -1
  102. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  103. package/dist/core/tools/shell-tool.js +42 -47
  104. package/dist/core/tools/shell-tool.js.map +1 -1
  105. package/dist/core/usage-totals.d.ts +4 -3
  106. package/dist/core/usage-totals.d.ts.map +1 -1
  107. package/dist/core/usage-totals.js +32 -8
  108. package/dist/core/usage-totals.js.map +1 -1
  109. package/dist/extensions/agent/activity.d.ts +4 -4
  110. package/dist/extensions/agent/activity.d.ts.map +1 -1
  111. package/dist/extensions/agent/activity.js +15 -24
  112. package/dist/extensions/agent/activity.js.map +1 -1
  113. package/dist/extensions/agent/index.d.ts +2 -11
  114. package/dist/extensions/agent/index.d.ts.map +1 -1
  115. package/dist/extensions/agent/index.js +3 -88
  116. package/dist/extensions/agent/index.js.map +1 -1
  117. package/dist/extensions/agent/progress.d.ts +31 -0
  118. package/dist/extensions/agent/progress.d.ts.map +1 -0
  119. package/dist/extensions/agent/progress.js +135 -0
  120. package/dist/extensions/agent/progress.js.map +1 -0
  121. package/dist/extensions/agent/render.d.ts.map +1 -1
  122. package/dist/extensions/agent/render.js +8 -17
  123. package/dist/extensions/agent/render.js.map +1 -1
  124. package/dist/extensions/agent/report.d.ts +9 -0
  125. package/dist/extensions/agent/report.d.ts.map +1 -0
  126. package/dist/extensions/agent/report.js +40 -0
  127. package/dist/extensions/agent/report.js.map +1 -0
  128. package/dist/extensions/agent/settings-panel.d.ts +43 -0
  129. package/dist/extensions/agent/settings-panel.d.ts.map +1 -0
  130. package/dist/extensions/agent/settings-panel.js +125 -0
  131. package/dist/extensions/agent/settings-panel.js.map +1 -0
  132. package/dist/extensions/agent/settings.d.ts +1 -1
  133. package/dist/extensions/agent/settings.d.ts.map +1 -1
  134. package/dist/extensions/agent/settings.js +101 -83
  135. package/dist/extensions/agent/settings.js.map +1 -1
  136. package/dist/extensions/agent/tool.d.ts +13 -0
  137. package/dist/extensions/agent/tool.d.ts.map +1 -0
  138. package/dist/extensions/agent/tool.js +88 -0
  139. package/dist/extensions/agent/tool.js.map +1 -0
  140. package/dist/extensions/agent/types.d.ts +19 -21
  141. package/dist/extensions/agent/types.d.ts.map +1 -1
  142. package/dist/extensions/agent/types.js +2 -10
  143. package/dist/extensions/agent/types.js.map +1 -1
  144. package/dist/extensions/agent/worker.d.ts +16 -0
  145. package/dist/extensions/agent/worker.d.ts.map +1 -0
  146. package/dist/extensions/agent/worker.js +66 -0
  147. package/dist/extensions/agent/worker.js.map +1 -0
  148. package/dist/extensions/btw/agent.d.ts +1 -1
  149. package/dist/extensions/btw/agent.d.ts.map +1 -1
  150. package/dist/extensions/btw/agent.js +3 -20
  151. package/dist/extensions/btw/agent.js.map +1 -1
  152. package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
  153. package/dist/extensions/cached-compaction/index.js +3 -22
  154. package/dist/extensions/cached-compaction/index.js.map +1 -1
  155. package/dist/extensions/cached-compaction/render.d.ts +1 -0
  156. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  157. package/dist/extensions/cached-compaction/render.js +42 -14
  158. package/dist/extensions/cached-compaction/render.js.map +1 -1
  159. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  160. package/dist/extensions/deepwiki/client.js +6 -78
  161. package/dist/extensions/deepwiki/client.js.map +1 -1
  162. package/dist/extensions/deepwiki/transport.d.ts +3 -0
  163. package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
  164. package/dist/extensions/deepwiki/transport.js +96 -0
  165. package/dist/extensions/deepwiki/transport.js.map +1 -0
  166. package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
  167. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  168. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  169. package/dist/extensions/provider/ui/compat.d.ts +3 -3
  170. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  171. package/dist/extensions/provider/ui/compat.js.map +1 -1
  172. package/dist/extensions/provider/ui/controls.d.ts +2 -2
  173. package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
  174. package/dist/extensions/provider/ui/controls.js.map +1 -1
  175. package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
  176. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
  177. package/dist/extensions/provider/ui/dialogs.js.map +1 -1
  178. package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
  179. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  180. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  181. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  182. package/dist/extensions/provider/ui/editor.js +1 -3
  183. package/dist/extensions/provider/ui/editor.js.map +1 -1
  184. package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
  185. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  186. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  187. package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
  188. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  189. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  190. package/dist/extensions/provider/ui/model-options.d.ts +6 -6
  191. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  192. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  193. package/dist/extensions/provider/ui/pane.d.ts +21 -12
  194. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  195. package/dist/extensions/provider/ui/pane.js.map +1 -1
  196. package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
  197. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  198. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  199. package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
  200. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  201. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  202. package/dist/extensions/run-summary/format.js +1 -1
  203. package/dist/extensions/run-summary/format.js.map +1 -1
  204. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  205. package/dist/extensions/statusline/usage.js +2 -6
  206. package/dist/extensions/statusline/usage.js.map +1 -1
  207. package/dist/extensions/tasks/tool/actions.d.ts +1 -1
  208. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  209. package/dist/extensions/tasks/tool/actions.js +50 -115
  210. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  211. package/dist/extensions/tasks/tool/constants.d.ts +1 -6
  212. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  213. package/dist/extensions/tasks/tool/constants.js +1 -6
  214. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  215. package/dist/extensions/tasks/tool/schema.d.ts +0 -3
  216. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  217. package/dist/extensions/tasks/tool/schema.js +5 -14
  218. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  219. package/dist/extensions/tasks/tool/types.d.ts +2 -8
  220. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  221. package/dist/extensions/tasks/tool/types.js +0 -2
  222. package/dist/extensions/tasks/tool/types.js.map +1 -1
  223. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  224. package/dist/extensions/tasks/tool.js +2 -2
  225. package/dist/extensions/tasks/tool.js.map +1 -1
  226. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  227. package/dist/extensions/tasks/ui/completion-render.js +46 -47
  228. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  229. package/dist/extensions/tasks/ui/inspector.d.ts +5 -3
  230. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  231. package/dist/extensions/tasks/ui/inspector.js +18 -6
  232. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  233. package/dist/extensions/tasks/ui/layout.d.ts +7 -7
  234. package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
  235. package/dist/extensions/tasks/ui/layout.js +118 -84
  236. package/dist/extensions/tasks/ui/layout.js.map +1 -1
  237. package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
  238. package/dist/extensions/tasks/ui/list.js +45 -31
  239. package/dist/extensions/tasks/ui/list.js.map +1 -1
  240. package/dist/extensions/tasks/ui/manager.d.ts +16 -7
  241. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  242. package/dist/extensions/tasks/ui/manager.js +167 -129
  243. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  244. package/dist/extensions/tasks/ui/model.d.ts +29 -0
  245. package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
  246. package/dist/extensions/tasks/ui/model.js +16 -1
  247. package/dist/extensions/tasks/ui/model.js.map +1 -1
  248. package/dist/extensions/tasks/ui/render.d.ts +1 -1
  249. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  250. package/dist/extensions/tasks/ui/render.js +12 -9
  251. package/dist/extensions/tasks/ui/render.js.map +1 -1
  252. package/dist/extensions/tasks/ui/status.d.ts +15 -0
  253. package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
  254. package/dist/extensions/tasks/ui/status.js +16 -0
  255. package/dist/extensions/tasks/ui/status.js.map +1 -0
  256. package/dist/extensions/tasks/ui/tree.js +1 -1
  257. package/dist/extensions/tasks/ui/tree.js.map +1 -1
  258. package/dist/extensions/tasks/ui/views.d.ts +10 -5
  259. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  260. package/dist/extensions/tasks/ui/views.js +61 -36
  261. package/dist/extensions/tasks/ui/views.js.map +1 -1
  262. package/dist/index.d.ts +2 -1
  263. package/dist/index.d.ts.map +1 -1
  264. package/dist/index.js.map +1 -1
  265. package/dist/modes/interactive/components/config-selector.d.ts +14 -1
  266. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  267. package/dist/modes/interactive/components/config-selector.js +258 -7
  268. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  269. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/keybinding-hints.js +2 -1
  271. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  272. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  273. package/dist/modes/interactive/components/model-selector.js +7 -4
  274. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  275. package/dist/modes/interactive/components/status-marker.d.ts +2 -1
  276. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/status-marker.js +0 -1
  278. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  279. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/thinking-selector.js +10 -3
  281. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  282. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  283. package/dist/modes/interactive/interactive-mode.js +7 -1
  284. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  285. package/dist/utils/duration.d.ts +3 -0
  286. package/dist/utils/duration.d.ts.map +1 -0
  287. package/dist/utils/duration.js +17 -0
  288. package/dist/utils/duration.js.map +1 -0
  289. package/dist/utils/number.d.ts +3 -0
  290. package/dist/utils/number.d.ts.map +1 -0
  291. package/dist/utils/number.js +5 -0
  292. package/dist/utils/number.js.map +1 -0
  293. package/docs/bundled/extensions/agent.md +14 -12
  294. package/docs/bundled/extensions/cached-compaction.md +13 -4
  295. package/docs/bundled/extensions/deepwiki.md +3 -1
  296. package/docs/bundled/extensions/statusline.md +1 -1
  297. package/docs/bundled/tasks.md +15 -14
  298. package/docs/extensions.md +26 -10
  299. package/docs/packages.md +5 -3
  300. package/docs/sdk.md +3 -3
  301. package/docs/session-format.md +28 -24
  302. package/docs/settings.md +11 -0
  303. package/docs/skills.md +23 -0
  304. package/npm-shrinkwrap.json +2 -2
  305. package/package.json +1 -1
  306. package/schemas/settings.schema.json +36 -0
  307. package/dist/bundle/chunks/chunk-FSJ45CRP.js +0 -229
  308. package/dist/bundle/chunks/chunk-W3FIUMGM.js +0 -1501
  309. package/dist/core/tasks/history.d.ts +0 -4
  310. package/dist/core/tasks/history.d.ts.map +0 -1
  311. package/dist/core/tasks/history.js +0 -131
  312. package/dist/core/tasks/history.js.map +0 -1
  313. package/dist/extensions/agent/runner.d.ts +0 -24
  314. package/dist/extensions/agent/runner.d.ts.map +0 -1
  315. package/dist/extensions/agent/runner.js +0 -274
  316. package/dist/extensions/agent/runner.js.map +0 -1
  317. package/dist/extensions/deepwiki/http.d.ts +0 -13
  318. package/dist/extensions/deepwiki/http.d.ts.map +0 -1
  319. package/dist/extensions/deepwiki/http.js +0 -88
  320. package/dist/extensions/deepwiki/http.js.map +0 -1
  321. package/dist/extensions/tasks/ui/task-view.d.ts +0 -13
  322. package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
  323. package/dist/extensions/tasks/ui/task-view.js +0 -20
  324. package/dist/extensions/tasks/ui/task-view.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/controls.ts"],"names":[],"mappings":"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","sourcesContent":["/** Small reusable controls for provider panes; field policy stays with the caller. */\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { EditorHost, EditorPane } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, ValueEditor } from \"./value-row.ts\";\n\n/** Returns the wrapped selection, or undefined when this was not a navigation key. */\nexport function moveSelection(\n\tkeys: KeybindingsManager,\n\tdata: string,\n\tindex: number,\n\tcount: number,\n): number | undefined {\n\tconst delta = keys.matches(data, \"tui.select.up\") ? -1 : keys.matches(data, \"tui.select.down\") ? 1 : undefined;\n\treturn delta === undefined ? undefined : count === 0 ? 0 : (index + delta + count) % count;\n}\n\nexport interface Choice<T> {\n\tlabel: string;\n\tvalue: T;\n\tdim?: boolean;\n}\n\ntype ControlHost = Pick<EditorHost, \"theme\" | \"keybindings\" | \"refresh\" | \"popPane\">;\ninterface ChoiceOptions<T> {\n\tchoices(): readonly Choice<T>[];\n\tcurrent(): T;\n\tchoose(value: T): string | undefined;\n}\n\nexport class ChoicePane<T> implements EditorPane {\n\treadonly crumb: string;\n\tprivate readonly host: ControlHost;\n\tprivate readonly options: ChoiceOptions<T>;\n\tprivate index: number;\n\tprivate focused = false;\n\tprivate error: string | undefined;\n\n\tconstructor(host: ControlHost, crumb: string, options: ChoiceOptions<T>) {\n\t\tthis.host = host;\n\t\tthis.crumb = crumb;\n\t\tthis.options = options;\n\t\tthis.index = Math.max(\n\t\t\t0,\n\t\t\toptions.choices().findIndex((choice) => choice.value === options.current()),\n\t\t);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst lines = this.options.choices().map((choice, index) =>\n\t\t\trenderPlainLine(this.host.theme, `${choice.value === this.options.current() ? \"●\" : \"○\"} ${choice.label}`, {\n\t\t\t\tactive: index === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\tdim: choice.dim,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(renderInfoLine(this.host.theme, this.error, width));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): { cursor: number; bottom: number } {\n\t\treturn { cursor: this.index, bottom: this.error ? 1 : 0 };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst choices = this.options.choices();\n\t\tconst next = moveSelection(this.host.keybindings, data, this.index, choices.length);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t} else if (this.host.keybindings.matches(data, \"tui.select.cancel\")) this.host.popPane();\n\t\telse if (\n\t\t\tthis.host.keybindings.matches(data, \"tui.select.confirm\") ||\n\t\t\tthis.host.keybindings.matches(data, \"app.list.toggle\")\n\t\t) {\n\t\t\tconst choice = choices[this.index];\n\t\t\tif (!choice) return;\n\t\t\tthis.error = this.options.choose(choice.value);\n\t\t\tif (this.error) this.host.refresh();\n\t\t\telse this.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"select\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n/** Owns an inline edit's identity, input focus, validation error, and cancellation. */\nexport class InlineEdit<Key> {\n\tprivate readonly refresh: () => void;\n\tprivate active: { key: Key; editor: ValueEditor } | undefined;\n\terror: string | undefined;\n\n\tconstructor(refresh: () => void) {\n\t\tthis.refresh = refresh;\n\t}\n\tget editing(): boolean {\n\t\treturn this.active !== undefined;\n\t}\n\teditor(key: Key): ValueEditor | undefined {\n\t\treturn this.active?.key === key ? this.active.editor : undefined;\n\t}\n\tsetFocused(focused: boolean): void {\n\t\tif (this.active) this.active.editor.focused = focused;\n\t}\n\n\tbegin(\n\t\tkey: Key,\n\t\tcurrent: string,\n\t\tmode: \"overwrite\" | \"tweak\",\n\t\tfocused: boolean,\n\t\tcommit: (value: string) => string | undefined,\n\t\tfirstData?: string,\n\t): void {\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => {\n\t\t\t\tthis.error = commit(value);\n\t\t\t\tif (!this.error) this.active = undefined;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.active = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.active = { key, editor };\n\t\teditor.focused = focused;\n\t\tif (mode === \"overwrite\") editor.beginOverwrite(firstData);\n\t\telse editor.beginTweak(current);\n\t\tthis.refresh();\n\t}\n\n\thandleInput(data: string, keys: KeybindingsManager): boolean {\n\t\tif (!this.active) return false;\n\t\tif (!keys.matches(data, \"tui.select.up\") && !keys.matches(data, \"tui.select.down\"))\n\t\t\tthis.active.editor.handleInput(data);\n\t\tthis.refresh();\n\t\treturn true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/controls.ts"],"names":[],"mappings":"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","sourcesContent":["/** Small reusable controls for provider panes; field policy stays with the caller. */\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { EditorPane, PaneHost } from \"./pane.ts\";\nimport { renderInfoLine, renderPlainLine, ValueEditor } from \"./value-row.ts\";\n\n/** Returns the wrapped selection, or undefined when this was not a navigation key. */\nexport function moveSelection(\n\tkeys: KeybindingsManager,\n\tdata: string,\n\tindex: number,\n\tcount: number,\n): number | undefined {\n\tconst delta = keys.matches(data, \"tui.select.up\") ? -1 : keys.matches(data, \"tui.select.down\") ? 1 : undefined;\n\treturn delta === undefined ? undefined : count === 0 ? 0 : (index + delta + count) % count;\n}\n\nexport interface Choice<T> {\n\tlabel: string;\n\tvalue: T;\n\tdim?: boolean;\n}\n\ntype ControlHost = Pick<PaneHost, \"theme\" | \"keybindings\" | \"refresh\" | \"popPane\">;\ninterface ChoiceOptions<T> {\n\tchoices(): readonly Choice<T>[];\n\tcurrent(): T;\n\tchoose(value: T): string | undefined;\n}\n\nexport class ChoicePane<T> implements EditorPane {\n\treadonly crumb: string;\n\tprivate readonly host: ControlHost;\n\tprivate readonly options: ChoiceOptions<T>;\n\tprivate index: number;\n\tprivate focused = false;\n\tprivate error: string | undefined;\n\n\tconstructor(host: ControlHost, crumb: string, options: ChoiceOptions<T>) {\n\t\tthis.host = host;\n\t\tthis.crumb = crumb;\n\t\tthis.options = options;\n\t\tthis.index = Math.max(\n\t\t\t0,\n\t\t\toptions.choices().findIndex((choice) => choice.value === options.current()),\n\t\t);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst lines = this.options.choices().map((choice, index) =>\n\t\t\trenderPlainLine(this.host.theme, `${choice.value === this.options.current() ? \"●\" : \"○\"} ${choice.label}`, {\n\t\t\t\tactive: index === this.index,\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\tdim: choice.dim,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(renderInfoLine(this.host.theme, this.error, width));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): { cursor: number; bottom: number } {\n\t\treturn { cursor: this.index, bottom: this.error ? 1 : 0 };\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst choices = this.options.choices();\n\t\tconst next = moveSelection(this.host.keybindings, data, this.index, choices.length);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t} else if (this.host.keybindings.matches(data, \"tui.select.cancel\")) this.host.popPane();\n\t\telse if (\n\t\t\tthis.host.keybindings.matches(data, \"tui.select.confirm\") ||\n\t\t\tthis.host.keybindings.matches(data, \"app.list.toggle\")\n\t\t) {\n\t\t\tconst choice = choices[this.index];\n\t\t\tif (!choice) return;\n\t\t\tthis.error = this.options.choose(choice.value);\n\t\t\tif (this.error) this.host.refresh();\n\t\t\telse this.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\thints(): string {\n\t\treturn [\n\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\tkeyHint(\"tui.select.confirm\", \"select\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t].join(\" \");\n\t}\n}\n\n/** Owns an inline edit's identity, input focus, validation error, and cancellation. */\nexport class InlineEdit<Key> {\n\tprivate readonly refresh: () => void;\n\tprivate active: { key: Key; editor: ValueEditor } | undefined;\n\terror: string | undefined;\n\n\tconstructor(refresh: () => void) {\n\t\tthis.refresh = refresh;\n\t}\n\tget editing(): boolean {\n\t\treturn this.active !== undefined;\n\t}\n\teditor(key: Key): ValueEditor | undefined {\n\t\treturn this.active?.key === key ? this.active.editor : undefined;\n\t}\n\tsetFocused(focused: boolean): void {\n\t\tif (this.active) this.active.editor.focused = focused;\n\t}\n\n\tbegin(\n\t\tkey: Key,\n\t\tcurrent: string,\n\t\tmode: \"overwrite\" | \"tweak\",\n\t\tfocused: boolean,\n\t\tcommit: (value: string) => string | undefined,\n\t\tfirstData?: string,\n\t): void {\n\t\tconst editor = new ValueEditor({\n\t\t\tonCommit: (value) => {\n\t\t\t\tthis.error = commit(value);\n\t\t\t\tif (!this.error) this.active = undefined;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.active = undefined;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.refresh();\n\t\t\t},\n\t\t});\n\t\tthis.active = { key, editor };\n\t\teditor.focused = focused;\n\t\tif (mode === \"overwrite\") editor.beginOverwrite(firstData);\n\t\telse editor.beginTweak(current);\n\t\tthis.refresh();\n\t}\n\n\thandleInput(data: string, keys: KeybindingsManager): boolean {\n\t\tif (!this.active) return false;\n\t\tif (!keys.matches(data, \"tui.select.up\") && !keys.matches(data, \"tui.select.down\"))\n\t\t\tthis.active.editor.handleInput(data);\n\t\tthis.refresh();\n\t\treturn true;\n\t}\n}\n"]}
@@ -1,12 +1,12 @@
1
1
  /** Confirmation and information panes owned by the provider editor. */
2
- import type { EditorHost, EditorPane } from "./pane.ts";
2
+ import type { EditorPane, PaneHost } from "./pane.ts";
3
3
  /** Static dim text lines (e.g. action-row explanations); optionally Enter-activatable. */
4
4
  export declare class InfoPane implements EditorPane {
5
5
  private readonly lines;
6
6
  private readonly onConfirm;
7
7
  private focused;
8
8
  private readonly host;
9
- constructor(host: EditorHost, lines: string[], onConfirm?: () => void);
9
+ constructor(host: PaneHost, lines: string[], onConfirm?: () => void);
10
10
  render(width: number): string[];
11
11
  handleInput(data: string): void;
12
12
  setFocused(focused: boolean): void;
@@ -21,7 +21,7 @@ export declare class ConfirmPane implements EditorPane {
21
21
  private readonly message;
22
22
  private readonly actionLabel;
23
23
  private readonly action;
24
- constructor(host: EditorHost, message: string, actionLabel: string, action: () => void);
24
+ constructor(host: PaneHost, message: string, actionLabel: string, action: () => void);
25
25
  render(width: number): string[];
26
26
  handleInput(data: string): void;
27
27
  setFocused(focused: boolean): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dialogs.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAIvE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGxD,0FAA0F;AAC1F,qBAAa,QAAS,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;gBACtB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI;IAMrE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAc/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAGlC,KAAK,IAAI,MAAM;CAMf;AAED,4EAA4E;AAC5E,qBAAa,WAAY,YAAW,UAAU;IAC7C,QAAQ,CAAC,KAAK,aAAa;IAC3B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI;IAOtF,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAS/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiB/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAGf"}
1
+ {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dialogs.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAIvE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGtD,0FAA0F;AAC1F,qBAAa,QAAS,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;gBACpB,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI;IAMnE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAc/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAGlC,KAAK,IAAI,MAAM;CAMf;AAED,4EAA4E;AAC5E,qBAAa,WAAY,YAAW,UAAU;IAC7C,QAAQ,CAAC,KAAK,aAAa;IAC3B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI;IAOpF,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAS/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiB/B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM;CAGf"}
@@ -1 +1 @@
1
- {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["/** Confirmation and information panes owned by the provider editor. */\n\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { keyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { EditorHost, EditorPane } from \"./pane.ts\";\nimport { CURSOR, renderInfoLine, renderPlainLine } from \"./value-row.ts\";\n\n/** Static dim text lines (e.g. action-row explanations); optionally Enter-activatable. */\nexport class InfoPane implements EditorPane {\n\tprivate readonly lines: string[];\n\tprivate readonly onConfirm: (() => void) | undefined;\n\tprivate focused = false;\n\tprivate readonly host: EditorHost;\n\tconstructor(host: EditorHost, lines: string[], onConfirm?: () => void) {\n\t\tthis.host = host;\n\n\t\tthis.lines = lines;\n\t\tthis.onConfirm = onConfirm;\n\t}\n\trender(width: number): string[] {\n\t\t// A confirmable InfoPane carries the pane's single focus marker; pure\n\t\t// guard text offers no action, so it stays an unmarked hint.\n\t\tif (this.focused && this.onConfirm) {\n\t\t\treturn this.lines.map((line, index) => {\n\t\t\t\tif (index > 0) return renderInfoLine(this.host.theme, line, width);\n\t\t\t\treturn truncateToWidth(\n\t\t\t\t\tthis.host.theme.fg(\"accent\", `${CURSOR} `) + this.host.theme.fg(\"text\", line),\n\t\t\t\t\twidth,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t\treturn this.lines.map((line) => renderInfoLine(this.host.theme, line, width));\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.host.keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\t// A focused InfoPane stands in for its left-column action row.\n\t\tif (this.onConfirm && this.host.keybindings.matches(data, \"tui.select.confirm\")) this.onConfirm();\n\t}\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\thints(): string {\n\t\tconst hints: string[] = [];\n\t\tif (this.onConfirm) hints.push(keyHint(\"tui.select.confirm\", \"proceed\"));\n\t\thints.push(keyHint(\"tui.select.cancel\", \"back\"));\n\t\treturn hints.join(\" \");\n\t}\n}\n\n/** Yes/No confirm for destructive actions, pushed into the right column. */\nexport class ConfirmPane implements EditorPane {\n\treadonly crumb = \"Confirm\";\n\tprivate index = 1; // default to Cancel\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly message: string;\n\tprivate readonly actionLabel: string;\n\tprivate readonly action: () => void;\n\n\tconstructor(host: EditorHost, message: string, actionLabel: string, action: () => void) {\n\t\tthis.host = host;\n\t\tthis.message = message;\n\t\tthis.actionLabel = actionLabel;\n\t\tthis.action = action;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\treturn [\n\t\t\ttruncateToWidth(theme.fg(\"warning\", this.message), width),\n\t\t\trenderPlainLine(theme, this.actionLabel, { active: this.index === 0, paneFocused: this.focused, width }),\n\t\t\trenderPlainLine(theme, \"Cancel\", { active: this.index === 1, paneFocused: this.focused, width }),\n\t\t];\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = this.index === 0 ? 1 : 0;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.index === 0) this.action();\n\t\t\telse this.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [keyHint(\"tui.select.confirm\", \"choose\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t}\n}\n"]}
1
+ {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["/** Confirmation and information panes owned by the provider editor. */\n\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { keyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport type { EditorPane, PaneHost } from \"./pane.ts\";\nimport { CURSOR, renderInfoLine, renderPlainLine } from \"./value-row.ts\";\n\n/** Static dim text lines (e.g. action-row explanations); optionally Enter-activatable. */\nexport class InfoPane implements EditorPane {\n\tprivate readonly lines: string[];\n\tprivate readonly onConfirm: (() => void) | undefined;\n\tprivate focused = false;\n\tprivate readonly host: PaneHost;\n\tconstructor(host: PaneHost, lines: string[], onConfirm?: () => void) {\n\t\tthis.host = host;\n\n\t\tthis.lines = lines;\n\t\tthis.onConfirm = onConfirm;\n\t}\n\trender(width: number): string[] {\n\t\t// A confirmable InfoPane carries the pane's single focus marker; pure\n\t\t// guard text offers no action, so it stays an unmarked hint.\n\t\tif (this.focused && this.onConfirm) {\n\t\t\treturn this.lines.map((line, index) => {\n\t\t\t\tif (index > 0) return renderInfoLine(this.host.theme, line, width);\n\t\t\t\treturn truncateToWidth(\n\t\t\t\t\tthis.host.theme.fg(\"accent\", `${CURSOR} `) + this.host.theme.fg(\"text\", line),\n\t\t\t\t\twidth,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t\treturn this.lines.map((line) => renderInfoLine(this.host.theme, line, width));\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.host.keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\t// A focused InfoPane stands in for its left-column action row.\n\t\tif (this.onConfirm && this.host.keybindings.matches(data, \"tui.select.confirm\")) this.onConfirm();\n\t}\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\thints(): string {\n\t\tconst hints: string[] = [];\n\t\tif (this.onConfirm) hints.push(keyHint(\"tui.select.confirm\", \"proceed\"));\n\t\thints.push(keyHint(\"tui.select.cancel\", \"back\"));\n\t\treturn hints.join(\" \");\n\t}\n}\n\n/** Yes/No confirm for destructive actions, pushed into the right column. */\nexport class ConfirmPane implements EditorPane {\n\treadonly crumb = \"Confirm\";\n\tprivate index = 1; // default to Cancel\n\tprivate focused = false;\n\n\tprivate readonly host: PaneHost;\n\tprivate readonly message: string;\n\tprivate readonly actionLabel: string;\n\tprivate readonly action: () => void;\n\n\tconstructor(host: PaneHost, message: string, actionLabel: string, action: () => void) {\n\t\tthis.host = host;\n\t\tthis.message = message;\n\t\tthis.actionLabel = actionLabel;\n\t\tthis.action = action;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\treturn [\n\t\t\ttruncateToWidth(theme.fg(\"warning\", this.message), width),\n\t\t\trenderPlainLine(theme, this.actionLabel, { active: this.index === 0, paneFocused: this.focused, width }),\n\t\t\trenderPlainLine(theme, \"Cancel\", { active: this.index === 1, paneFocused: this.focused, width }),\n\t\t];\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.index = this.index === 0 ? 1 : 0;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tif (this.index === 0) this.action();\n\t\t\telse this.host.popPane();\n\t\t}\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t}\n\n\thints(): string {\n\t\treturn [keyHint(\"tui.select.confirm\", \"choose\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t}\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  /** Open chat-template dictionaries, with typed value-entry states. */
2
2
  import "../keybindings.ts";
3
- import type { EditorHost, EditorPane, ModelHandle } from "./pane.ts";
3
+ import type { EditorPane, ModelHandle, PaneHost } from "./pane.ts";
4
4
  import { type ScrollWindowInfo } from "./value-row.ts";
5
5
  export declare class DictPane implements EditorPane {
6
6
  readonly crumb: string;
@@ -11,7 +11,7 @@ export declare class DictPane implements EditorPane {
11
11
  private readonly host;
12
12
  private readonly model;
13
13
  private readonly dictKey;
14
- constructor(host: EditorHost, model: ModelHandle, dictKey: string);
14
+ constructor(host: PaneHost, model: ModelHandle, dictKey: string);
15
15
  private dict;
16
16
  private entries;
17
17
  render(width: number): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dictionary.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AA4BxB,qBAAa,QAAS,YAAW,UAAU;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBACrB,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAQjE,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,OAAO;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAmC/B,YAAY,IAAI,gBAAgB;IAOhC,OAAO,CAAC,UAAU;IAmElB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8C/B,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,UAAU;IA2FlB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,UAAU;IAUlB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAmBf"}
1
+ {"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dictionary.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,gBAAgB,CAAC;AA4BxB,qBAAa,QAAS,YAAW,UAAU;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBACrB,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAQ/D,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,OAAO;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAmC/B,YAAY,IAAI,gBAAgB;IAOhC,OAAO,CAAC,UAAU;IAmElB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8C/B,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,UAAU;IA2FlB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,UAAU;IAUlB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,MAAM;CAmBf"}
@@ -1 +1 @@
1
- {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dictionary.ts"],"names":[],"mappings":"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","sourcesContent":["/** Open chat-template dictionaries, with typed value-entry states. */\n\nimport \"../keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { THINKING_VARIABLES, validateChatTemplateKwarg } from \"../compat-fields.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport type { EditorHost, EditorPane, ModelHandle } from \"./pane.ts\";\nimport {\n\trenderInfoLine,\n\trenderKeyValueLine,\n\trenderPlainLine,\n\ttype ScrollWindowInfo,\n\tValueEditor,\n} from \"./value-row.ts\";\n\nfunction compatObject(handle: ModelHandle): Record<string, unknown> {\n\tconst compat = handle.read().compat;\n\treturn typeof compat === \"object\" && compat !== null && !Array.isArray(compat)\n\t\t? (compat as Record<string, unknown>)\n\t\t: {};\n}\n\nfunction scalarText(value: unknown): string {\n\tif (value === null) return \"null\";\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n\treturn JSON.stringify(value) ?? String(value);\n}\n\ntype DictValueKind = \"string\" | \"number\" | \"boolean\" | \"null\" | \"$var\";\nconst DICT_VALUE_KINDS: readonly DictValueKind[] = [\"string\", \"number\", \"boolean\", \"null\", \"$var\"];\nconst VAR_OPTIONS = THINKING_VARIABLES;\n\ntype DictMode =\n\t| { type: \"list\" }\n\t| { type: \"keyEdit\"; editor: ValueEditor }\n\t| { type: \"kindPick\"; key: string; index: number }\n\t| { type: \"valueEdit\"; key: string; kind: \"string\" | \"number\"; editor: ValueEditor }\n\t| { type: \"boolPick\"; key: string; index: number }\n\t| { type: \"varPick\"; key: string; index: number }\n\t| { type: \"omitPick\"; key: string; $var: (typeof VAR_OPTIONS)[number]; index: number };\n\nexport class DictPane implements EditorPane {\n\treadonly crumb: string;\n\tprivate index = 0;\n\tprivate mode: DictMode = { type: \"list\" };\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: EditorHost;\n\tprivate readonly model: ModelHandle;\n\tprivate readonly dictKey: string;\n\tconstructor(host: EditorHost, model: ModelHandle, dictKey: string) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tthis.dictKey = dictKey;\n\n\t\tthis.crumb = `compat · ${dictKey}`;\n\t}\n\n\tprivate dict(): Record<string, unknown> {\n\t\tconst value = compatObject(this.model)[this.dictKey];\n\t\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t\t? (value as Record<string, unknown>)\n\t\t\t: {};\n\t}\n\n\tprivate entries(): [string, unknown][] {\n\t\treturn Object.entries(this.dict());\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, `free-form keys; values: string · number · boolean · null · $var`, width),\n\t\t];\n\t\tif (this.mode.type !== \"list\") {\n\t\t\tlines.push(...this.renderMode(width));\n\t\t\tif (this.error) lines.push(renderInfoLine(theme, this.error, width));\n\t\t\treturn lines;\n\t\t}\n\t\tconst entries = this.entries();\n\t\t// All entries render; the editor's fixed window scrolls around scrollWindow().\n\t\tfor (const [rowIndex, [key, value]] of entries.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: key,\n\t\t\t\t\tvalueText: scalarText(value),\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}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"+ Add Entry\", {\n\t\t\t\tactive: this.index === entries.length && this.mode.type === \"list\",\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The format header pins above; errors pin below. Entry flows are short\n\t\t// enough to fit, so only the list mode reports a meaningful cursor.\n\t\tif (this.mode.type !== \"list\") return { top: 1, bottom: this.error ? 1 : 0 };\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor: 1 + this.index };\n\t}\n\n\tprivate renderMode(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst mode = this.mode;\n\t\tswitch (mode.type) {\n\t\t\tcase \"keyEdit\":\n\t\t\t\treturn [renderInfoLine(theme, \"new key:\", width), mode.editor.renderLine(width)];\n\t\t\tcase \"kindPick\": {\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · value kind`, width),\n\t\t\t\t\t...DICT_VALUE_KINDS.map((kind, kindIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, kind, {\n\t\t\t\t\t\t\tactive: kindIndex === mode.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}\n\t\t\tcase \"valueEdit\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · ${mode.kind}`, width),\n\t\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\t\tkeyLabel: mode.key,\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\tediting: mode.editor,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\tcase \"boolPick\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · boolean`, width),\n\t\t\t\t\t...[\"true\", \"false\"].map((option, optionIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, option, {\n\t\t\t\t\t\t\tactive: optionIndex === mode.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\tcase \"varPick\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · $var`, width),\n\t\t\t\t\t...VAR_OPTIONS.map((option, optionIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, option, {\n\t\t\t\t\t\t\tactive: optionIndex === mode.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\tcase \"omitPick\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · omitWhenOff`, width),\n\t\t\t\t\t...[\"default\", \"true\", \"false\"].map((option, optionIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, option, {\n\t\t\t\t\t\t\tactive: optionIndex === mode.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\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst mode = this.mode;\n\t\tswitch (mode.type) {\n\t\t\tcase \"keyEdit\":\n\t\t\tcase \"valueEdit\":\n\t\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\t\tmode.editor.handleInput(data);\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"kindPick\":\n\t\t\t\tthis.handlePick(data, mode, DICT_VALUE_KINDS.length, (index) => {\n\t\t\t\t\tconst key = mode.key;\n\t\t\t\t\tconst kind = DICT_VALUE_KINDS[index]!;\n\t\t\t\t\tthis.startValueForKind(key, kind);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"boolPick\":\n\t\t\t\tthis.handlePick(data, mode, 2, (index) => {\n\t\t\t\t\tconst key = mode.key;\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.writeEntry(key, index === 0);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"varPick\":\n\t\t\t\tthis.handlePick(data, mode, VAR_OPTIONS.length, (index) => {\n\t\t\t\t\tconst key = mode.key;\n\t\t\t\t\tthis.mode = { type: \"omitPick\", key, $var: VAR_OPTIONS[index]!, index: 0 };\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"omitPick\":\n\t\t\t\tthis.handlePick(data, mode, 3, (index) => {\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.writeEntry(\n\t\t\t\t\t\tmode.key,\n\t\t\t\t\t\tindex === 0 ? { $var: mode.$var } : { $var: mode.$var, omitWhenOff: index === 1 },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"list\":\n\t\t\t\tthis.handleList(data);\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate handlePick(\n\t\tdata: string,\n\t\tmode: Extract<DictMode, { index: number }>,\n\t\tcount: number,\n\t\tchoose: (index: number) => void,\n\t): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst index = mode.index;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tmode.index = index === 0 ? count - 1 : 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\tmode.index = (index + 1) % count;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.mode = { type: \"list\" };\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) choose(index);\n\t}\n\n\tprivate handleList(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst rowCount = this.entries().length + 1;\n\t\tconst next = moveSelection(kb, data, this.index, rowCount);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.removeEntry\")) {\n\t\t\tconst entry = this.entries()[this.index];\n\t\t\tif (!entry) return;\n\t\t\tthis.model.setField([\"compat\", this.dictKey, entry[0]], DELETE);\n\t\t\tthis.index = Math.max(0, Math.min(this.index, this.entries().length - 1));\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst entry = this.entries()[this.index];\n\t\t\tif (!entry) {\n\t\t\t\t// + Add Entry: key first, then the value flow.\n\t\t\t\tconst editor = new ValueEditor({\n\t\t\t\t\tonCommit: (raw) => {\n\t\t\t\t\t\tconst key = raw.trim();\n\t\t\t\t\t\tif (!key) {\n\t\t\t\t\t\t\tthis.error = \"Key must be non-empty.\";\n\t\t\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Object.hasOwn(this.dict(), key)) {\n\t\t\t\t\t\t\tthis.error = `\"${key}\" already exists.`;\n\t\t\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\t\tthis.mode = { type: \"kindPick\", key, index: 0 };\n\t\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\teditor.focused = this.focused;\n\t\t\t\tthis.mode = { type: \"keyEdit\", editor };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst [key, value] = entry;\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\tthis.writeEntry(key, !value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === null) return; // null entries: remove + re-add to change\n\t\t\tif (typeof value === \"object\") {\n\t\t\t\tconst record = value as Record<string, unknown>;\n\t\t\t\tif (\n\t\t\t\t\trecord.$var === \"thinking.enabled\" ||\n\t\t\t\t\trecord.$var === \"thinking.effort\" ||\n\t\t\t\t\trecord.$var === \"thinking.budget\"\n\t\t\t\t) {\n\t\t\t\t\tthis.mode = {\n\t\t\t\t\t\ttype: \"omitPick\",\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t$var: record.$var,\n\t\t\t\t\t\tindex: record.omitWhenOff === undefined ? 0 : record.omitWhenOff ? 1 : 2,\n\t\t\t\t\t};\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn; // unexpected object: remove + re-add\n\t\t\t}\n\t\t\tconst kind: \"string\" | \"number\" = typeof value === \"number\" ? \"number\" : \"string\";\n\t\t\tconst editor = new ValueEditor({\n\t\t\t\tonCommit: (raw) => this.commitScalar(key, kind, raw),\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t},\n\t\t\t});\n\t\t\teditor.beginTweak(String(value));\n\t\t\teditor.focused = this.focused;\n\t\t\tthis.mode = { type: \"valueEdit\", key, kind, editor };\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate startValueForKind(key: string, kind: DictValueKind): void {\n\t\tswitch (kind) {\n\t\t\tcase \"string\":\n\t\t\tcase \"number\": {\n\t\t\t\tconst editor = new ValueEditor({\n\t\t\t\t\tonCommit: (raw) => this.commitScalar(key, kind, raw),\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\teditor.focused = this.focused;\n\t\t\t\tthis.mode = { type: \"valueEdit\", key, kind, editor };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"boolean\":\n\t\t\t\tthis.mode = { type: \"boolPick\", key, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"null\":\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeEntry(key, null);\n\t\t\t\treturn;\n\t\t\tcase \"$var\":\n\t\t\t\tthis.mode = { type: \"varPick\", key, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate commitScalar(key: string, kind: \"string\" | \"number\", raw: string): void {\n\t\tlet value: string | number = raw;\n\t\tif (kind === \"number\") {\n\t\t\tconst parsed = Number(raw.trim());\n\t\t\tif (!Number.isFinite(parsed)) {\n\t\t\t\tthis.error = `${key} must be a number.`;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvalue = parsed;\n\t\t}\n\t\tconst invalid = validateChatTemplateKwarg(value);\n\t\tif (invalid) {\n\t\t\tthis.error = invalid;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.error = undefined;\n\t\tthis.mode = { type: \"list\" };\n\t\tthis.writeEntry(key, value);\n\t}\n\n\tprivate writeEntry(key: string, value: unknown): void {\n\t\tconst invalid = validateChatTemplateKwarg(value);\n\t\tif (invalid) {\n\t\t\tthis.error = invalid;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.model.setField([\"compat\", this.dictKey, key], value);\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.mode.type === \"keyEdit\" || this.mode.type === \"valueEdit\") this.mode.editor.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.mode.type === \"keyEdit\" || this.mode.type === \"valueEdit\";\n\t}\n\n\thints(): string {\n\t\tswitch (this.mode.type) {\n\t\t\tcase \"keyEdit\":\n\t\t\tcase \"valueEdit\":\n\t\t\t\treturn [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\t\tcase \"list\":\n\t\t\t\treturn [\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"edit / add\"),\n\t\t\t\t\tkeyHint(\"app.provider.removeEntry\", \"remove\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t\t\t].join(\" \");\n\t\t\tdefault:\n\t\t\t\treturn [\n\t\t\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"choose\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t].join(\" \");\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/dictionary.ts"],"names":[],"mappings":"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","sourcesContent":["/** Open chat-template dictionaries, with typed value-entry states. */\n\nimport \"../keybindings.ts\";\nimport { keyHint, rawKeyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { THINKING_VARIABLES, validateChatTemplateKwarg } from \"../compat-fields.ts\";\nimport { truncate } from \"../constants.ts\";\nimport { DELETE } from \"../store.ts\";\nimport { moveSelection } from \"./controls.ts\";\nimport type { EditorPane, ModelHandle, PaneHost } from \"./pane.ts\";\nimport {\n\trenderInfoLine,\n\trenderKeyValueLine,\n\trenderPlainLine,\n\ttype ScrollWindowInfo,\n\tValueEditor,\n} from \"./value-row.ts\";\n\nfunction compatObject(handle: ModelHandle): Record<string, unknown> {\n\tconst compat = handle.read().compat;\n\treturn typeof compat === \"object\" && compat !== null && !Array.isArray(compat)\n\t\t? (compat as Record<string, unknown>)\n\t\t: {};\n}\n\nfunction scalarText(value: unknown): string {\n\tif (value === null) return \"null\";\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n\treturn JSON.stringify(value) ?? String(value);\n}\n\ntype DictValueKind = \"string\" | \"number\" | \"boolean\" | \"null\" | \"$var\";\nconst DICT_VALUE_KINDS: readonly DictValueKind[] = [\"string\", \"number\", \"boolean\", \"null\", \"$var\"];\nconst VAR_OPTIONS = THINKING_VARIABLES;\n\ntype DictMode =\n\t| { type: \"list\" }\n\t| { type: \"keyEdit\"; editor: ValueEditor }\n\t| { type: \"kindPick\"; key: string; index: number }\n\t| { type: \"valueEdit\"; key: string; kind: \"string\" | \"number\"; editor: ValueEditor }\n\t| { type: \"boolPick\"; key: string; index: number }\n\t| { type: \"varPick\"; key: string; index: number }\n\t| { type: \"omitPick\"; key: string; $var: (typeof VAR_OPTIONS)[number]; index: number };\n\nexport class DictPane implements EditorPane {\n\treadonly crumb: string;\n\tprivate index = 0;\n\tprivate mode: DictMode = { type: \"list\" };\n\tprivate error: string | undefined;\n\tprivate focused = false;\n\n\tprivate readonly host: PaneHost;\n\tprivate readonly model: ModelHandle;\n\tprivate readonly dictKey: string;\n\tconstructor(host: PaneHost, model: ModelHandle, dictKey: string) {\n\t\tthis.host = host;\n\t\tthis.model = model;\n\t\tthis.dictKey = dictKey;\n\n\t\tthis.crumb = `compat · ${dictKey}`;\n\t}\n\n\tprivate dict(): Record<string, unknown> {\n\t\tconst value = compatObject(this.model)[this.dictKey];\n\t\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t\t? (value as Record<string, unknown>)\n\t\t\t: {};\n\t}\n\n\tprivate entries(): [string, unknown][] {\n\t\treturn Object.entries(this.dict());\n\t}\n\n\trender(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst lines: string[] = [\n\t\t\trenderInfoLine(theme, `free-form keys; values: string · number · boolean · null · $var`, width),\n\t\t];\n\t\tif (this.mode.type !== \"list\") {\n\t\t\tlines.push(...this.renderMode(width));\n\t\t\tif (this.error) lines.push(renderInfoLine(theme, this.error, width));\n\t\t\treturn lines;\n\t\t}\n\t\tconst entries = this.entries();\n\t\t// All entries render; the editor's fixed window scrolls around scrollWindow().\n\t\tfor (const [rowIndex, [key, value]] of entries.entries()) {\n\t\t\tconst active = rowIndex === this.index;\n\t\t\tlines.push(\n\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\tkeyLabel: key,\n\t\t\t\t\tvalueText: scalarText(value),\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}\n\t\tlines.push(\n\t\t\trenderPlainLine(theme, \"+ Add Entry\", {\n\t\t\t\tactive: this.index === entries.length && this.mode.type === \"list\",\n\t\t\t\tpaneFocused: this.focused,\n\t\t\t\twidth,\n\t\t\t}),\n\t\t);\n\t\tif (this.error) lines.push(theme.fg(\"error\", truncate(this.error, Math.max(10, width - 2))));\n\t\treturn lines;\n\t}\n\n\tscrollWindow(): ScrollWindowInfo {\n\t\t// The format header pins above; errors pin below. Entry flows are short\n\t\t// enough to fit, so only the list mode reports a meaningful cursor.\n\t\tif (this.mode.type !== \"list\") return { top: 1, bottom: this.error ? 1 : 0 };\n\t\treturn { top: 1, bottom: this.error ? 1 : 0, cursor: 1 + this.index };\n\t}\n\n\tprivate renderMode(width: number): string[] {\n\t\tconst theme = this.host.theme;\n\t\tconst mode = this.mode;\n\t\tswitch (mode.type) {\n\t\t\tcase \"keyEdit\":\n\t\t\t\treturn [renderInfoLine(theme, \"new key:\", width), mode.editor.renderLine(width)];\n\t\t\tcase \"kindPick\": {\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · value kind`, width),\n\t\t\t\t\t...DICT_VALUE_KINDS.map((kind, kindIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, kind, {\n\t\t\t\t\t\t\tactive: kindIndex === mode.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}\n\t\t\tcase \"valueEdit\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · ${mode.kind}`, width),\n\t\t\t\t\trenderKeyValueLine(theme, {\n\t\t\t\t\t\tkeyLabel: mode.key,\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tpaneFocused: this.focused,\n\t\t\t\t\t\tediting: mode.editor,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\tcase \"boolPick\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · boolean`, width),\n\t\t\t\t\t...[\"true\", \"false\"].map((option, optionIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, option, {\n\t\t\t\t\t\t\tactive: optionIndex === mode.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\tcase \"varPick\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · $var`, width),\n\t\t\t\t\t...VAR_OPTIONS.map((option, optionIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, option, {\n\t\t\t\t\t\t\tactive: optionIndex === mode.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\tcase \"omitPick\":\n\t\t\t\treturn [\n\t\t\t\t\trenderInfoLine(theme, `${mode.key} · omitWhenOff`, width),\n\t\t\t\t\t...[\"default\", \"true\", \"false\"].map((option, optionIndex) =>\n\t\t\t\t\t\trenderPlainLine(theme, option, {\n\t\t\t\t\t\t\tactive: optionIndex === mode.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\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst mode = this.mode;\n\t\tswitch (mode.type) {\n\t\t\tcase \"keyEdit\":\n\t\t\tcase \"valueEdit\":\n\t\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) return;\n\t\t\t\tmode.editor.handleInput(data);\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"kindPick\":\n\t\t\t\tthis.handlePick(data, mode, DICT_VALUE_KINDS.length, (index) => {\n\t\t\t\t\tconst key = mode.key;\n\t\t\t\t\tconst kind = DICT_VALUE_KINDS[index]!;\n\t\t\t\t\tthis.startValueForKind(key, kind);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"boolPick\":\n\t\t\t\tthis.handlePick(data, mode, 2, (index) => {\n\t\t\t\t\tconst key = mode.key;\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.writeEntry(key, index === 0);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"varPick\":\n\t\t\t\tthis.handlePick(data, mode, VAR_OPTIONS.length, (index) => {\n\t\t\t\t\tconst key = mode.key;\n\t\t\t\t\tthis.mode = { type: \"omitPick\", key, $var: VAR_OPTIONS[index]!, index: 0 };\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"omitPick\":\n\t\t\t\tthis.handlePick(data, mode, 3, (index) => {\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.writeEntry(\n\t\t\t\t\t\tmode.key,\n\t\t\t\t\t\tindex === 0 ? { $var: mode.$var } : { $var: mode.$var, omitWhenOff: index === 1 },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\tcase \"list\":\n\t\t\t\tthis.handleList(data);\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate handlePick(\n\t\tdata: string,\n\t\tmode: Extract<DictMode, { index: number }>,\n\t\tcount: number,\n\t\tchoose: (index: number) => void,\n\t): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst index = mode.index;\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tmode.index = index === 0 ? count - 1 : 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\tmode.index = (index + 1) % count;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.mode = { type: \"list\" };\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\")) choose(index);\n\t}\n\n\tprivate handleList(data: string): void {\n\t\tconst kb = this.host.keybindings;\n\t\tconst rowCount = this.entries().length + 1;\n\t\tconst next = moveSelection(kb, data, this.index, rowCount);\n\t\tif (next !== undefined) {\n\t\t\tthis.index = next;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.host.popPane();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"app.provider.removeEntry\")) {\n\t\t\tconst entry = this.entries()[this.index];\n\t\t\tif (!entry) return;\n\t\t\tthis.model.setField([\"compat\", this.dictKey, entry[0]], DELETE);\n\t\t\tthis.index = Math.max(0, Math.min(this.index, this.entries().length - 1));\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || kb.matches(data, \"app.list.toggle\")) {\n\t\t\tconst entry = this.entries()[this.index];\n\t\t\tif (!entry) {\n\t\t\t\t// + Add Entry: key first, then the value flow.\n\t\t\t\tconst editor = new ValueEditor({\n\t\t\t\t\tonCommit: (raw) => {\n\t\t\t\t\t\tconst key = raw.trim();\n\t\t\t\t\t\tif (!key) {\n\t\t\t\t\t\t\tthis.error = \"Key must be non-empty.\";\n\t\t\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Object.hasOwn(this.dict(), key)) {\n\t\t\t\t\t\t\tthis.error = `\"${key}\" already exists.`;\n\t\t\t\t\t\t\treturn this.host.refresh();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\t\tthis.mode = { type: \"kindPick\", key, index: 0 };\n\t\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\teditor.focused = this.focused;\n\t\t\t\tthis.mode = { type: \"keyEdit\", editor };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst [key, value] = entry;\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\tthis.writeEntry(key, !value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === null) return; // null entries: remove + re-add to change\n\t\t\tif (typeof value === \"object\") {\n\t\t\t\tconst record = value as Record<string, unknown>;\n\t\t\t\tif (\n\t\t\t\t\trecord.$var === \"thinking.enabled\" ||\n\t\t\t\t\trecord.$var === \"thinking.effort\" ||\n\t\t\t\t\trecord.$var === \"thinking.budget\"\n\t\t\t\t) {\n\t\t\t\t\tthis.mode = {\n\t\t\t\t\t\ttype: \"omitPick\",\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t$var: record.$var,\n\t\t\t\t\t\tindex: record.omitWhenOff === undefined ? 0 : record.omitWhenOff ? 1 : 2,\n\t\t\t\t\t};\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn; // unexpected object: remove + re-add\n\t\t\t}\n\t\t\tconst kind: \"string\" | \"number\" = typeof value === \"number\" ? \"number\" : \"string\";\n\t\t\tconst editor = new ValueEditor({\n\t\t\t\tonCommit: (raw) => this.commitScalar(key, kind, raw),\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\tthis.host.refresh();\n\t\t\t\t},\n\t\t\t});\n\t\t\teditor.beginTweak(String(value));\n\t\t\teditor.focused = this.focused;\n\t\t\tthis.mode = { type: \"valueEdit\", key, kind, editor };\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate startValueForKind(key: string, kind: DictValueKind): void {\n\t\tswitch (kind) {\n\t\t\tcase \"string\":\n\t\t\tcase \"number\": {\n\t\t\t\tconst editor = new ValueEditor({\n\t\t\t\t\tonCommit: (raw) => this.commitScalar(key, kind, raw),\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\t\t\tthis.error = undefined;\n\t\t\t\t\t\tthis.host.refresh();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\teditor.focused = this.focused;\n\t\t\t\tthis.mode = { type: \"valueEdit\", key, kind, editor };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"boolean\":\n\t\t\t\tthis.mode = { type: \"boolPick\", key, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\tcase \"null\":\n\t\t\t\tthis.mode = { type: \"list\" };\n\t\t\t\tthis.writeEntry(key, null);\n\t\t\t\treturn;\n\t\t\tcase \"$var\":\n\t\t\t\tthis.mode = { type: \"varPick\", key, index: 0 };\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate commitScalar(key: string, kind: \"string\" | \"number\", raw: string): void {\n\t\tlet value: string | number = raw;\n\t\tif (kind === \"number\") {\n\t\t\tconst parsed = Number(raw.trim());\n\t\t\tif (!Number.isFinite(parsed)) {\n\t\t\t\tthis.error = `${key} must be a number.`;\n\t\t\t\tthis.host.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvalue = parsed;\n\t\t}\n\t\tconst invalid = validateChatTemplateKwarg(value);\n\t\tif (invalid) {\n\t\t\tthis.error = invalid;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.error = undefined;\n\t\tthis.mode = { type: \"list\" };\n\t\tthis.writeEntry(key, value);\n\t}\n\n\tprivate writeEntry(key: string, value: unknown): void {\n\t\tconst invalid = validateChatTemplateKwarg(value);\n\t\tif (invalid) {\n\t\t\tthis.error = invalid;\n\t\t\tthis.host.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.model.setField([\"compat\", this.dictKey, key], value);\n\t}\n\n\tsetFocused(focused: boolean): void {\n\t\tthis.focused = focused;\n\t\tif (this.mode.type === \"keyEdit\" || this.mode.type === \"valueEdit\") this.mode.editor.focused = focused;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.mode.type === \"keyEdit\" || this.mode.type === \"valueEdit\";\n\t}\n\n\thints(): string {\n\t\tswitch (this.mode.type) {\n\t\t\tcase \"keyEdit\":\n\t\t\tcase \"valueEdit\":\n\t\t\t\treturn [keyHint(\"tui.input.submit\", \"save\"), keyHint(\"tui.select.cancel\", \"cancel\")].join(\" \");\n\t\t\tcase \"list\":\n\t\t\t\treturn [\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"edit / add\"),\n\t\t\t\t\tkeyHint(\"app.provider.removeEntry\", \"remove\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t\t\t].join(\" \");\n\t\t\tdefault:\n\t\t\t\treturn [\n\t\t\t\t\trawKeyHint(\"↑↓\", \"move\"),\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"choose\"),\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t].join(\" \");\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/editor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/editor.ts"],"names":[],"mappings":"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"}
@@ -237,7 +237,7 @@ export class ProviderEditorScreen {
237
237
  this.refresh();
238
238
  return;
239
239
  }
240
- if (this.host.isCurrentProvider()) {
240
+ if (this.options.currentModel?.provider === this.options.providerId) {
241
241
  this.host.notify("The current model's provider cannot be deleted; switch models with /model first.", "error");
242
242
  return;
243
243
  }
@@ -404,7 +404,6 @@ export class ProviderEditorScreen {
404
404
  const store = this.options.store;
405
405
  const providerId = this.options.providerId;
406
406
  return {
407
- tui: this.tui,
408
407
  theme: this.theme,
409
408
  keybindings: this.keybindings,
410
409
  store,
@@ -423,7 +422,6 @@ export class ProviderEditorScreen {
423
422
  commitModelDraft: () => this.commitModelDraft(),
424
423
  discardModelDraft: () => this.discardModelDraft(),
425
424
  isCurrentModel: (modelId) => this.options.currentModel?.provider === providerId && this.options.currentModel.id === modelId,
426
- isCurrentProvider: () => this.options.currentModel?.provider === providerId,
427
425
  setFetchStatus: (status) => {
428
426
  this.fetchStatus = status;
429
427
  this.refresh();
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../../src/extensions/provider/ui/editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAA4C,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKjH,OAAO,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2DAA2D,CAAC;AAEhG,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAyB,aAAa,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAwBrE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,8FAA8F;AAC9F,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,SAAS,KAAK,CAAC,IAAY,EAAE,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,6FAA6F;AAC7F,SAAS,WAAW,CAAC,IAA0B;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,OAAO;YACX,OAAO,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,KAAK,SAAS;YACb,OAAO,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC;YACC,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;AACF,CAAC;AAED,MAAM,OAAO,oBAAoB;IAmBhC,YACC,GAAQ,EACR,KAAY,EACZ,WAA+B,EAC/B,IAA4C,EAC5C,OAA8B;QAhBvB,cAAS,GAAe,EAAE,CAAC;QAC3B,cAAS,GAAG,CAAC,CAAC;QACd,cAAS,GAAqB,MAAM,CAAC;QACrC,UAAK,GAAiB,EAAE,CAAC;QAIzB,aAAQ,GAAG,KAAK,CAAC;QACjB,aAAQ,GAAG,KAAK,CAAC;QAUxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3G,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,eAAe,EAAE,CAAC;IACxB,CAAC;IAED,qEAAqE;IACrE,wBAAwB;IACxB,qEAAqE;IAErE,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,UAAU;QACT,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,wEAAwE;QACxE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACnF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,6BAA6B,CAAC,EAAE,CAAC;gBAClG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAC5B,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,wEAAwE;IACxE,aAAa;QACZ,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;QACxF,IAAI,CAAC,SAAS;YACb,SAAS,IAAI,CAAC;gBACb,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,uEAAuE;QACvE,IAAI,SAAS,GAAG,CAAC,IAAI,QAAQ,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED,qEAAqE;IACrE,cAAc;IACd,qEAAqE;IAE7D,gBAAgB;QACvB,MAAM,KAAK,GAAe;YACzB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YACnC,EAAE,IAAI,EAAE,SAAS,EAAE;YACnB,EAAE,IAAI,EAAE,OAAO,EAAE;YACjB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;SACpC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACxB,CAAC;IAEO,eAAe,CAAC,KAAa;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC3F,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACzF,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS;aAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;aACvC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACnD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAE,CAAC;QACrF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,kFAAkF;QAClF,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,GAA2B;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC;YACf,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACX,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;gBACzB,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,KAAK,OAAO;gBACX,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;gBACzB,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC5B,IAAI,IAAI,YAAY,eAAe;wBAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnD,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,KAAK,UAAU,CAAC,CAAC,CAAC;gBACjB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;oBACzB,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzB,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC/E,IAAI,UAAU,IAAI,CAAC;oBAAE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;gBACjD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,IAAI,YAAY,eAAe,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE;oBAAE,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACvB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;oBACzB,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO;gBACR,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CACf,kFAAkF,EAClF,OAAO,CACP,CAAC;oBACF,OAAO;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,CAChB,oBAAoB,IAAI,CAAC,OAAO,CAAC,UAAU,qBAAqB;oBAC/D,CAAC,OAAO,CAAC,CAAC,CAAC,4DAA4D,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7E,4CAA4C,EAC7C,iBAAiB,EACjB,GAAG,EAAE;oBACJ,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,CAAC,CACD,CAAC;gBACF,OAAO;YACR,CAAC;YACD;gBACC,OAAO;QACT,CAAC;IACF,CAAC;IAEO,UAAU,CAAC,KAAa;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;QAC1C,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACP,0EAA0E;YAC1E,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;YAC3G,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACpF,MAAM,UAAU,GAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YACxF,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAE,CAAC,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,QAAQ,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,eAAe,CAAC,IAAc;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,IAAI,IAAY,CAAC;QACjB,IAAI,IAAwB,CAAC;QAC7B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS;gBACb,IAAI,GAAG,UAAU,CAAC;gBAClB,MAAM;YACP,KAAK,OAAO;gBACX,IAAI,GAAG,cAAc,CAAC;gBACtB,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;gBACxB,MAAM;YACP,KAAK,OAAO,CAAC,CAAC,CAAC;gBACd,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtD,MAAM;YACP,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACd,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,WAAW,CAAC;gBACvE,IAAI,GAAG,SAAS,CAAC;gBACjB,MAAM;YACP,CAAC;YACD,KAAK,UAAU;gBACd,IAAI,GAAG,aAAa,CAAC;gBACrB,MAAM;YACP,KAAK,gBAAgB;gBACpB,IAAI,GAAG,iBAAiB,CAAC;gBACzB,MAAM;YACP;gBACC,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC5B,CAAC;IAEO,cAAc,CAAC,IAAc,EAAE,MAAe,EAAE,OAAgB,EAAE,KAAa;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,oEAAoE;QACpE,+DAA+D;QAC/D,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,qFAAqF;QACrF,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,eAAe,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IAED,qEAAqE;IACrE,4BAA4B;IAC5B,qEAAqE;IAE7D,OAAO;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,QAAQ,CAAC,IAAgB;QAChC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,OAAO;QACd,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC5B,4DAA4D;YAC5D,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,eAAe;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;IACzE,CAAC;IAEO,cAAc,CAAC,IAA0B;QAChD,QAAQ,IAAI,EAAE,IAAI,EAAE,CAAC;YACpB,KAAK,SAAS;gBACb,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1D,KAAK,OAAO;gBACX,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,KAAK,OAAO;gBACX,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3E,KAAK,OAAO;gBACX,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAM,CAAC,CAAC;YACpD,KAAK,UAAU;gBACd,OAAO,IAAI,QAAQ,CAClB,IAAI,CAAC,IAAI,EACT;oBACC,gCAAgC;oBAChC,8EAA8E;iBAC9E,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CACvC,CAAC;YACH,KAAK,gBAAgB;gBACpB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,uDAAuD,CAAC,EAAE,GAAG,EAAE,CAC9F,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CACjC,CAAC;YACH;gBACC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAEO,eAAe,CAAC,OAAe;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,QAAQ,EAAE,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK;gBAAE,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;YACvF,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,4BAA4B;IAC5B,qEAAqE;IAE7D,UAAU;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3C,OAAO;YACN,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU;YACV,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YAC7B,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;YAC7D,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,OAAO,sBAAsB,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC;YACrF,CAAC;YACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC3B,OAAO,sBAAsB,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;YACzF,CAAC;YACD,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC/C,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,OAAO;YAC/F,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,KAAK,UAAU;YAC3E,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC1B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;gBAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;YAC/D,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACtC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACjG,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACd,CAAC;YACD,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YACxE,cAAc,EAAE,GAAG,EAAE;gBACpB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,2EAA2E;gBAC3E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrE,OAAO,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACjG,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;SACD,CAAC;IACH,CAAC;IAED,6FAA6F;IACrF,iBAAiB;QACxB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAC9E,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,gBAAgB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO,iBAAiB,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,EAAG,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;QAC/F,IAAI,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,kBAAkB;IAClB,qEAAqE;IAE7D,OAAO;QACd,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,KAAa;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC;QACvF,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACvB,OAAO;gBACN,MAAM;gBACN,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,6BAA6B,SAAS,UAAU,CAAC,EAAE,KAAK,CAAC;gBAC7F,MAAM;aACN,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,IAAc,CAAC;QACnB,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACP,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,GAAG,EAAE,CAAC;YACV,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;gBAChF,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;gBACjE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAEO,WAAW,CAAC,KAAa;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IACpD,CAAC;IAEO,eAAe,CAAC,KAAa;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,QAAQ,IAAI,EAAE,IAAI,EAAE,CAAC;YACpB,KAAK,SAAS;gBACb,IAAI,GAAG,YAAY,CAAC;gBACpB,MAAM;YACP,KAAK,OAAO;gBACX,IAAI,GAAG,iBAAiB,CAAC;gBACzB,MAAM;YACP,KAAK,OAAO,CAAC,CAAC,CAAC;gBACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjF,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtD,MAAM;YACP,CAAC;YACD,KAAK,OAAO;gBACX,IAAI,GAAG,WAAW,CAAC;gBACnB,MAAM;YACP,KAAK,UAAU;gBACd,IAAI,GAAG,WAAW,CAAC;gBACnB,MAAM;YACP,KAAK,gBAAgB;gBACpB,IAAI,GAAG,iBAAiB,CAAC;gBACzB,MAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,2GAA2G;IACnG,gBAAgB,CAAC,KAAa;QACrC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS;YACtC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEO,WAAW,CAAC,KAAa;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,MAAM,GACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QACxG,IAAI,CAAC,MAAM;YAAE,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK;YAAE,OAAO,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW,CAAC,GAAG,YAAY,CAAC;IACxD,CAAC;IAEO,YAAY,CAAC,KAAa;QACjC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAChD,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;gBACnC,sFAAsF;gBACtF,MAAM,SAAS,GAAG,OAAO,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,oFAAoF;YACpF,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3G,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,GAAG;YACb,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;YACxB,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvD,OAAO,CAAC,8BAA8B,EAAE,aAAa,CAAC;YACtD,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,mGAAmG;IAC3F,iBAAiB;QACxB,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;YAC9C,KAAK,OAAO;gBACX,OAAO,OAAO,CAAC;YAChB,KAAK,UAAU;gBACd,OAAO,QAAQ,CAAC;YACjB,KAAK,gBAAgB;gBACpB,OAAO,QAAQ,CAAC;YACjB;gBACC,OAAO,MAAM,CAAC;QAChB,CAAC;IACF,CAAC;CACD;AAED,SAAS,gBAAgB,CAAC,KAAsB;IAC/C,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["/**\n * Two-pane provider editor.\n *\n * Left column groups connection, models, and management actions. The right\n * column hosts the selected item's field pane and sub-pane stack. Both columns\n * scroll inside a fixed-height frame; below the wide-layout threshold, only\n * the focused column is shown. Typing on a value row overwrites, Enter tweaks\n * or enters, ←/→ switch panes, and Esc cancels/pops/backs out.\n */\n\nimport \"../keybindings.ts\";\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 DraftModelHandle, ProviderEdits } from \"../editing.ts\";\nimport type { RefreshCoordinator } from \"../refresh.ts\";\nimport 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: \"section\"; label: \"SETUP\" | \"MODELS\" | \"MANAGE\" }\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 DOUBLE_PANE_MIN_WIDTH = 72;\nconst MIN_WIDTH = 32;\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\tcase \"section\":\n\t\t\treturn `section:${item.label}`;\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: DraftModelHandle | undefined;\n\tprivate readonly edits: ProviderEdits;\n\tprivate fetchStatus: string | undefined;\n\tprivate disposed = 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.edits = new ProviderEdits(options.store, options.providerId, options.refresher, () => this.refresh());\n\t\tthis.host = this.createHost();\n\t\tthis.rebuildLeftItems();\n\t\tthis.leftIndex = this.selectableIndex(0);\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.edits.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 =\n\t\t\tnextIndex >= 0\n\t\t\t\t? nextIndex\n\t\t\t\t: this.selectableIndex(Math.min(this.leftIndex, Math.max(0, this.leftItems.length - 1)));\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[] = [\n\t\t\t{ kind: \"section\", label: \"SETUP\" },\n\t\t\t{ kind: \"apiAuth\" },\n\t\t\t{ kind: \"fetch\" },\n\t\t\t{ kind: \"section\", label: \"MODELS\" },\n\t\t];\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: \"section\", label: \"MANAGE\" }, { 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 !== \"section\");\n\t\treturn index >= 0 ? index : this.leftItems.findIndex((item) => item.kind !== \"section\");\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 !== \"section\");\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 = this.edits.draft();\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.read().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.edits.removeProvider();\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 === \"section\") {\n\t\t\t\treturn theme.fg(\"dim\", item.label);\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 !== \"section\");\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 leftItemContent(item: LeftItem): { text: string; note?: string; dim: boolean } {\n\t\tconst store = this.options.store;\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?.read().name ?? this.draft?.read().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?.read().name && !this.draft?.read().id;\n\t\treturn { text, note, dim };\n\t}\n\n\tprivate renderLeftItem(item: LeftItem, active: boolean, focused: boolean, width: number): string {\n\t\tconst theme = this.theme;\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\tconst { text: label, note, dim } = this.leftItemContent(item);\n\t\tlet text = label;\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.draft!);\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\treturn this.edits.model(modelId, (oldId, newId) => {\n\t\t\tconst selected = this.leftItems[this.leftIndex];\n\t\t\tif (selected?.kind === \"model\" && selected.modelId === oldId) selected.modelId = newId;\n\t\t\tthis.syncFromStore();\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\tedits: this.edits,\n\t\t\tproviderId,\n\t\t\tpushPane: (pane) => this.pushPane(pane),\n\t\t\tpopPane: () => this.popPane(),\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, edits: this.edits }, 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 section labels.\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 === \"section\") this.leftIndex--;\n\t\t\t\tif (this.leftItems[this.leftIndex]?.kind === \"section\") 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 error = this.edits.commitDraft(draft);\n\t\tif (error) return error;\n\t\tconst id = draft.read().id!.trim();\n\t\tthis.draft = undefined;\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 title = this.renderTitle(width);\n\t\tlet body: string[];\n\t\tif (width < DOUBLE_PANE_MIN_WIDTH) {\n\t\t\tbody = this.focusPane === \"left\" ? this.renderLeft(width) : this.renderRight(width);\n\t\t} else {\n\t\t\tconst leftWidth = this.computeLeftWidth(width);\n\t\t\tconst rightWidth = width - leftWidth - 3;\n\t\t\tconst separator = theme.fg(\"border\", \" │ \");\n\t\t\tconst leftLines = this.renderLeft(leftWidth);\n\t\t\tconst rightLines = this.renderRight(rightWidth);\n\t\t\tbody = [];\n\t\t\tfor (let row = 0; row < BODY_ROWS; row++) {\n\t\t\t\tconst left = padTo(truncateToWidth(leftLines[row] ?? \"\", leftWidth), leftWidth);\n\t\t\t\tconst right = truncateToWidth(rightLines[row] ?? \"\", rightWidth);\n\t\t\t\tbody.push(left + separator + right);\n\t\t\t}\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\tprivate renderRight(width: number): string[] {\n\t\tconst pane = this.topPane();\n\t\tconst paneLines = pane ? windowLines(this.theme, pane.render(width), BODY_ROWS - 1, pane.scrollWindow?.()) : [];\n\t\treturn [this.renderPaneTitle(width), ...paneLines];\n\t}\n\n\tprivate renderPaneTitle(width: number): string {\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tlet base = \"\";\n\t\tswitch (item?.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\tbase = \"Connection\";\n\t\t\t\tbreak;\n\t\t\tcase \"fetch\":\n\t\t\t\tbase = \"Discover models\";\n\t\t\t\tbreak;\n\t\t\tcase \"model\": {\n\t\t\t\tconst model = this.options.store.getModel(this.options.providerId, item.modelId);\n\t\t\t\tbase = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"draft\":\n\t\t\t\tbase = \"New model\";\n\t\t\t\tbreak;\n\t\t\tcase \"addModel\":\n\t\t\t\tbase = \"Add model\";\n\t\t\t\tbreak;\n\t\t\tcase \"deleteProvider\":\n\t\t\t\tbase = \"Delete provider\";\n\t\t\t\tbreak;\n\t\t}\n\t\tconst crumb = this.stack.length > 1 ? this.topPane()?.crumb : undefined;\n\t\tconst title = crumb ? [base, crumb].filter(Boolean).join(\" / \") : base;\n\t\treturn truncateToWidth(this.theme.fg(\"text\", this.theme.bold(title)), width);\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 === \"section\") continue;\n\t\t\tconst { text, note } = this.leftItemContent(item);\n\t\t\tconst label = text + (note ? ` ${note}` : \"\");\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\tconst title = theme.fg(\"accent\", theme.bold(` Providers / ${this.options.providerId}`));\n\t\tconst status =\n\t\t\tthis.options.store.pendingCount === 0 ? \"\" : this.options.store.saveFailed ? \"Save failed\" : \"Saving…\";\n\t\tif (!status) return truncateToWidth(title, width);\n\t\tconst styledStatus = theme.fg(this.options.store.saveFailed ? \"error\" : \"dim\", status);\n\t\tconst statusWidth = visibleWidth(status);\n\t\tif (statusWidth + 1 >= width) return truncateToWidth(styledStatus, width);\n\t\tconst left = truncateToWidth(title, width - statusWidth - 1);\n\t\treturn padTo(left, width - statusWidth) + styledStatus;\n\t}\n\n\tprivate renderFooter(width: number): string[] {\n\t\tif (this.focusPane === \"right\") {\n\t\t\tconst paneHints = this.topPane()?.hints() ?? \"\";\n\t\t\tif (width < DOUBLE_PANE_MIN_WIDTH) {\n\t\t\t\t// Esc already returns to navigation here; only add the arrow hint when it fits whole.\n\t\t\t\tconst arrowHint = keyHint(\"app.provider.switchPaneLeft\", \"nav\");\n\t\t\t\tconst combined = [paneHints, arrowHint].filter(Boolean).join(\" \");\n\t\t\t\treturn [truncateToWidth(visibleWidth(combined) <= width ? combined : paneHints, width)];\n\t\t\t}\n\t\t\t// The editor owns the way-back hint so every wide-layout pane footer is consistent.\n\t\t\tconst hints = [paneHints, keyHint(\"app.provider.switchPaneLeft\", \"focus left\")].filter(Boolean).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"]}
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 groups connection, models, and management actions. The right\n * column hosts the selected item's field pane and sub-pane stack. Both columns\n * scroll inside a fixed-height frame; below the wide-layout threshold, only\n * the focused column is shown. Typing on a value row overwrites, Enter tweaks\n * or enters, ←/→ switch panes, and Esc cancels/pops/backs out.\n */\n\nimport \"../keybindings.ts\";\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 DraftModelHandle, ProviderEdits } from \"../editing.ts\";\nimport type { RefreshCoordinator } from \"../refresh.ts\";\nimport 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: \"section\"; label: \"SETUP\" | \"MODELS\" | \"MANAGE\" }\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 DOUBLE_PANE_MIN_WIDTH = 72;\nconst MIN_WIDTH = 32;\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\tcase \"section\":\n\t\t\treturn `section:${item.label}`;\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: DraftModelHandle | undefined;\n\tprivate readonly edits: ProviderEdits;\n\tprivate fetchStatus: string | undefined;\n\tprivate disposed = 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.edits = new ProviderEdits(options.store, options.providerId, options.refresher, () => this.refresh());\n\t\tthis.host = this.createHost();\n\t\tthis.rebuildLeftItems();\n\t\tthis.leftIndex = this.selectableIndex(0);\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.edits.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 =\n\t\t\tnextIndex >= 0\n\t\t\t\t? nextIndex\n\t\t\t\t: this.selectableIndex(Math.min(this.leftIndex, Math.max(0, this.leftItems.length - 1)));\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[] = [\n\t\t\t{ kind: \"section\", label: \"SETUP\" },\n\t\t\t{ kind: \"apiAuth\" },\n\t\t\t{ kind: \"fetch\" },\n\t\t\t{ kind: \"section\", label: \"MODELS\" },\n\t\t];\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: \"section\", label: \"MANAGE\" }, { 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 !== \"section\");\n\t\treturn index >= 0 ? index : this.leftItems.findIndex((item) => item.kind !== \"section\");\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 !== \"section\");\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 = this.edits.draft();\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.read().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.options.currentModel?.provider === this.options.providerId) {\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.edits.removeProvider();\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 === \"section\") {\n\t\t\t\treturn theme.fg(\"dim\", item.label);\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 !== \"section\");\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 leftItemContent(item: LeftItem): { text: string; note?: string; dim: boolean } {\n\t\tconst store = this.options.store;\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?.read().name ?? this.draft?.read().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?.read().name && !this.draft?.read().id;\n\t\treturn { text, note, dim };\n\t}\n\n\tprivate renderLeftItem(item: LeftItem, active: boolean, focused: boolean, width: number): string {\n\t\tconst theme = this.theme;\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\tconst { text: label, note, dim } = this.leftItemContent(item);\n\t\tlet text = label;\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.draft!);\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\treturn this.edits.model(modelId, (oldId, newId) => {\n\t\t\tconst selected = this.leftItems[this.leftIndex];\n\t\t\tif (selected?.kind === \"model\" && selected.modelId === oldId) selected.modelId = newId;\n\t\t\tthis.syncFromStore();\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\ttheme: this.theme,\n\t\t\tkeybindings: this.keybindings,\n\t\t\tstore,\n\t\t\tedits: this.edits,\n\t\t\tproviderId,\n\t\t\tpushPane: (pane) => this.pushPane(pane),\n\t\t\tpopPane: () => this.popPane(),\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\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, edits: this.edits }, 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 section labels.\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 === \"section\") this.leftIndex--;\n\t\t\t\tif (this.leftItems[this.leftIndex]?.kind === \"section\") 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 error = this.edits.commitDraft(draft);\n\t\tif (error) return error;\n\t\tconst id = draft.read().id!.trim();\n\t\tthis.draft = undefined;\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 title = this.renderTitle(width);\n\t\tlet body: string[];\n\t\tif (width < DOUBLE_PANE_MIN_WIDTH) {\n\t\t\tbody = this.focusPane === \"left\" ? this.renderLeft(width) : this.renderRight(width);\n\t\t} else {\n\t\t\tconst leftWidth = this.computeLeftWidth(width);\n\t\t\tconst rightWidth = width - leftWidth - 3;\n\t\t\tconst separator = theme.fg(\"border\", \" │ \");\n\t\t\tconst leftLines = this.renderLeft(leftWidth);\n\t\t\tconst rightLines = this.renderRight(rightWidth);\n\t\t\tbody = [];\n\t\t\tfor (let row = 0; row < BODY_ROWS; row++) {\n\t\t\t\tconst left = padTo(truncateToWidth(leftLines[row] ?? \"\", leftWidth), leftWidth);\n\t\t\t\tconst right = truncateToWidth(rightLines[row] ?? \"\", rightWidth);\n\t\t\t\tbody.push(left + separator + right);\n\t\t\t}\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\tprivate renderRight(width: number): string[] {\n\t\tconst pane = this.topPane();\n\t\tconst paneLines = pane ? windowLines(this.theme, pane.render(width), BODY_ROWS - 1, pane.scrollWindow?.()) : [];\n\t\treturn [this.renderPaneTitle(width), ...paneLines];\n\t}\n\n\tprivate renderPaneTitle(width: number): string {\n\t\tconst item = this.leftItems[this.leftIndex];\n\t\tlet base = \"\";\n\t\tswitch (item?.kind) {\n\t\t\tcase \"apiAuth\":\n\t\t\t\tbase = \"Connection\";\n\t\t\t\tbreak;\n\t\t\tcase \"fetch\":\n\t\t\t\tbase = \"Discover models\";\n\t\t\t\tbreak;\n\t\t\tcase \"model\": {\n\t\t\t\tconst model = this.options.store.getModel(this.options.providerId, item.modelId);\n\t\t\t\tbase = model ? modelDisplayName(model) : item.modelId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"draft\":\n\t\t\t\tbase = \"New model\";\n\t\t\t\tbreak;\n\t\t\tcase \"addModel\":\n\t\t\t\tbase = \"Add model\";\n\t\t\t\tbreak;\n\t\t\tcase \"deleteProvider\":\n\t\t\t\tbase = \"Delete provider\";\n\t\t\t\tbreak;\n\t\t}\n\t\tconst crumb = this.stack.length > 1 ? this.topPane()?.crumb : undefined;\n\t\tconst title = crumb ? [base, crumb].filter(Boolean).join(\" / \") : base;\n\t\treturn truncateToWidth(this.theme.fg(\"text\", this.theme.bold(title)), width);\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 === \"section\") continue;\n\t\t\tconst { text, note } = this.leftItemContent(item);\n\t\t\tconst label = text + (note ? ` ${note}` : \"\");\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\tconst title = theme.fg(\"accent\", theme.bold(` Providers / ${this.options.providerId}`));\n\t\tconst status =\n\t\t\tthis.options.store.pendingCount === 0 ? \"\" : this.options.store.saveFailed ? \"Save failed\" : \"Saving…\";\n\t\tif (!status) return truncateToWidth(title, width);\n\t\tconst styledStatus = theme.fg(this.options.store.saveFailed ? \"error\" : \"dim\", status);\n\t\tconst statusWidth = visibleWidth(status);\n\t\tif (statusWidth + 1 >= width) return truncateToWidth(styledStatus, width);\n\t\tconst left = truncateToWidth(title, width - statusWidth - 1);\n\t\treturn padTo(left, width - statusWidth) + styledStatus;\n\t}\n\n\tprivate renderFooter(width: number): string[] {\n\t\tif (this.focusPane === \"right\") {\n\t\t\tconst paneHints = this.topPane()?.hints() ?? \"\";\n\t\t\tif (width < DOUBLE_PANE_MIN_WIDTH) {\n\t\t\t\t// Esc already returns to navigation here; only add the arrow hint when it fits whole.\n\t\t\t\tconst arrowHint = keyHint(\"app.provider.switchPaneLeft\", \"nav\");\n\t\t\t\tconst combined = [paneHints, arrowHint].filter(Boolean).join(\" \");\n\t\t\t\treturn [truncateToWidth(visibleWidth(combined) <= width ? combined : paneHints, width)];\n\t\t\t}\n\t\t\t// The editor owns the way-back hint so every wide-layout pane footer is consistent.\n\t\t\tconst hints = [paneHints, keyHint(\"app.provider.switchPaneLeft\", \"focus left\")].filter(Boolean).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"]}