anantham-v2 2.0.3 → 2.0.4

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 (31) hide show
  1. package/dist/bin/anantham.js +10 -1
  2. package/dist/bin/anantham.js.map +1 -1
  3. package/dist/cli/command-registry.d.ts.map +1 -1
  4. package/dist/cli/command-registry.js +118 -84
  5. package/dist/cli/command-registry.js.map +1 -1
  6. package/dist/persistence/model-catalog-cache.d.ts +86 -0
  7. package/dist/persistence/model-catalog-cache.d.ts.map +1 -0
  8. package/dist/persistence/model-catalog-cache.js +398 -0
  9. package/dist/persistence/model-catalog-cache.js.map +1 -0
  10. package/dist/persistence/user-config-manager.d.ts +4 -0
  11. package/dist/persistence/user-config-manager.d.ts.map +1 -1
  12. package/dist/persistence/user-config-manager.js +15 -0
  13. package/dist/persistence/user-config-manager.js.map +1 -1
  14. package/dist/tui/model-accordion-browser.d.ts +80 -0
  15. package/dist/tui/model-accordion-browser.d.ts.map +1 -0
  16. package/dist/tui/model-accordion-browser.js +487 -0
  17. package/dist/tui/model-accordion-browser.js.map +1 -0
  18. package/dist/tui/terminal-layout.js +1 -1
  19. package/dist/tui/terminal-logo-renderer.d.ts +63 -0
  20. package/dist/tui/terminal-logo-renderer.d.ts.map +1 -0
  21. package/dist/tui/terminal-logo-renderer.js +300 -0
  22. package/dist/tui/terminal-logo-renderer.js.map +1 -0
  23. package/dist/tui/tui-controller.d.ts +13 -0
  24. package/dist/tui/tui-controller.d.ts.map +1 -1
  25. package/dist/tui/tui-controller.js +101 -4
  26. package/dist/tui/tui-controller.js.map +1 -1
  27. package/dist/tui/tui-renderer.d.ts +3 -1
  28. package/dist/tui/tui-renderer.d.ts.map +1 -1
  29. package/dist/tui/tui-renderer.js +18 -3
  30. package/dist/tui/tui-renderer.js.map +1 -1
  31. package/package.json +1 -1
@@ -0,0 +1,300 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { UserConfigManager } from "../persistence/user-config-manager.js";
4
+ export const ANTIGRAVITY_PALETTE = {
5
+ darkOnyx: [10, 10, 12], // #0A0A0C
6
+ neonCyan: [0, 242, 254], // #00F2FE
7
+ electricBlue: [67, 97, 238], // #4361EE
8
+ neonViolet: [114, 9, 183], // #7209B7
9
+ magenta: [247, 37, 133], // #F72585
10
+ neonEmerald: [0, 242, 152], // #00F298
11
+ purpleGlow: [142, 45, 226], // #8E2DE2
12
+ };
13
+ /**
14
+ * Procedural 16x8 pixel matrix representing the Anantham infinite gateway / Möbius emblem.
15
+ * Rendered using 24-bit TrueColor half-blocks (16x4 character grid).
16
+ */
17
+ const DEFAULT_EMBLEM_MATRIX = [
18
+ // Row 0: Top loop arcs
19
+ [
20
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
21
+ ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan,
22
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
23
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta,
24
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
25
+ ANTIGRAVITY_PALETTE.darkOnyx,
26
+ ],
27
+ // Row 1: Outer curves & initial crossover angle
28
+ [
29
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan,
30
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.electricBlue,
31
+ ANTIGRAVITY_PALETTE.electricBlue, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
32
+ ANTIGRAVITY_PALETTE.purpleGlow, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
33
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx,
34
+ ANTIGRAVITY_PALETTE.darkOnyx,
35
+ ],
36
+ // Row 2: Nexus center crossover
37
+ [
38
+ ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.darkOnyx,
39
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.electricBlue, ANTIGRAVITY_PALETTE.electricBlue,
40
+ ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.purpleGlow,
41
+ ANTIGRAVITY_PALETTE.purpleGlow, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
42
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx,
43
+ ANTIGRAVITY_PALETTE.darkOnyx,
44
+ ],
45
+ // Row 3: Mid waist nexus
46
+ [
47
+ ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.darkOnyx,
48
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.neonViolet,
49
+ ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.neonViolet,
50
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
51
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx,
52
+ ANTIGRAVITY_PALETTE.darkOnyx,
53
+ ],
54
+ // Row 4: Mid waist nexus reverse
55
+ [
56
+ ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.darkOnyx,
57
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.neonViolet,
58
+ ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.neonViolet,
59
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
60
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx,
61
+ ANTIGRAVITY_PALETTE.darkOnyx,
62
+ ],
63
+ // Row 5: Lower crossover
64
+ [
65
+ ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.darkOnyx,
66
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.electricBlue, ANTIGRAVITY_PALETTE.electricBlue,
67
+ ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.neonViolet, ANTIGRAVITY_PALETTE.purpleGlow,
68
+ ANTIGRAVITY_PALETTE.purpleGlow, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
69
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx,
70
+ ANTIGRAVITY_PALETTE.darkOnyx,
71
+ ],
72
+ // Row 6: Lower curves
73
+ [
74
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan,
75
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.electricBlue,
76
+ ANTIGRAVITY_PALETTE.electricBlue, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
77
+ ANTIGRAVITY_PALETTE.purpleGlow, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
78
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx,
79
+ ANTIGRAVITY_PALETTE.darkOnyx,
80
+ ],
81
+ // Row 7: Bottom loop arcs
82
+ [
83
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
84
+ ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan, ANTIGRAVITY_PALETTE.neonCyan,
85
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
86
+ ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.magenta,
87
+ ANTIGRAVITY_PALETTE.magenta, ANTIGRAVITY_PALETTE.darkOnyx, ANTIGRAVITY_PALETTE.darkOnyx,
88
+ ANTIGRAVITY_PALETTE.darkOnyx,
89
+ ],
90
+ ];
91
+ /**
92
+ * TerminalLogoRenderer provides high-performance terminal logo rendering
93
+ * across Kitty, iTerm2, Sixel graphics protocols with graceful fallback
94
+ * to 24-bit TrueColor ANSI half-blocks (\u2580).
95
+ */
96
+ export class TerminalLogoRenderer {
97
+ /**
98
+ * Detects the graphical capability of the current terminal session.
99
+ */
100
+ static detectProtocol() {
101
+ // 1. Kitty Graphics Protocol
102
+ if (process.env.KITTY_WINDOW_ID || process.env.TERM?.includes("kitty")) {
103
+ return "kitty";
104
+ }
105
+ // 2. iTerm2 Inline Images Protocol
106
+ if (process.env.TERM_PROGRAM === "iTerm.app" || process.env.LC_TERMINAL === "iTerm2") {
107
+ return "iterm2";
108
+ }
109
+ // 3. Sixel Protocol
110
+ if (process.env.TERM?.includes("sixel") || process.env.COLORTERM === "sixel") {
111
+ return "sixel";
112
+ }
113
+ // 4. Default fallback to 24-bit TrueColor half-blocks
114
+ return "halfblock";
115
+ }
116
+ /**
117
+ * Resolves the custom logo path based on authoritative precedence:
118
+ * 1. cliPath
119
+ * 2. process.env.ANANTHAM_LOGO_PATH
120
+ * 3. UserConfigManager.getInstance().getLogoPath()
121
+ * 4. ./assets/logo.png (if exists)
122
+ * 5. null
123
+ */
124
+ static resolveLogoPath(cliPath) {
125
+ if (cliPath && typeof cliPath === "string" && cliPath.trim().length > 0) {
126
+ return cliPath.trim();
127
+ }
128
+ if (process.env.ANANTHAM_LOGO_PATH && process.env.ANANTHAM_LOGO_PATH.trim().length > 0) {
129
+ return process.env.ANANTHAM_LOGO_PATH.trim();
130
+ }
131
+ try {
132
+ const configLogo = UserConfigManager.getInstance().getLogoPath();
133
+ if (configLogo && configLogo.trim().length > 0) {
134
+ return configLogo.trim();
135
+ }
136
+ }
137
+ catch {
138
+ // Ignore user config read errors
139
+ }
140
+ const defaultAssets = [
141
+ path.resolve(process.cwd(), "assets", "logo.png"),
142
+ path.join(process.cwd(), "assets", "logo.png"),
143
+ "./assets/logo.png",
144
+ ];
145
+ for (const assetPath of defaultAssets) {
146
+ try {
147
+ if (fs.existsSync(assetPath)) {
148
+ return assetPath;
149
+ }
150
+ }
151
+ catch {
152
+ // Continue fallback
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ /**
158
+ * Renders a 2D pixel matrix of RGB tuples into 24-bit TrueColor half-block lines.
159
+ * Uses '\u2580' ('▀') where top pixel is foreground color and bottom pixel is background color.
160
+ */
161
+ static renderMatrixToHalfBlocks(matrix) {
162
+ const lines = [];
163
+ const height = matrix.length;
164
+ if (height === 0)
165
+ return lines;
166
+ const width = matrix[0]?.length ?? 0;
167
+ for (let y = 0; y < height; y += 2) {
168
+ const topRow = matrix[y] ?? [];
169
+ const bottomRow = matrix[y + 1] ?? [];
170
+ let line = "";
171
+ for (let x = 0; x < width; x++) {
172
+ const topPixel = topRow[x] ?? ANTIGRAVITY_PALETTE.darkOnyx;
173
+ const bottomPixel = bottomRow[x] ?? ANTIGRAVITY_PALETTE.darkOnyx;
174
+ const fg = `\x1b[38;2;${topPixel[0]};${topPixel[1]};${topPixel[2]}m`;
175
+ const bg = `\x1b[48;2;${bottomPixel[0]};${bottomPixel[1]};${bottomPixel[2]}m`;
176
+ line += `${fg}${bg}\u2580`;
177
+ }
178
+ line += "\x1b[0m";
179
+ lines.push(line);
180
+ }
181
+ return lines;
182
+ }
183
+ /**
184
+ * Renders procedural cybernetic Anantham infinite emblem in 24-bit TrueColor half-blocks.
185
+ * If width is specified, formats or crops/pads the emblem to fit.
186
+ */
187
+ static renderHalfBlockLogo(width) {
188
+ let matrix = DEFAULT_EMBLEM_MATRIX;
189
+ if (width && width > 0 && width !== 16) {
190
+ if (width < 16) {
191
+ // Symmetrically crop horizontal columns
192
+ const startX = Math.max(0, Math.floor((16 - width) / 2));
193
+ matrix = DEFAULT_EMBLEM_MATRIX.map((row) => row.slice(startX, startX + width));
194
+ }
195
+ else {
196
+ // Pad with dark onyx
197
+ const padLeft = Math.floor((width - 16) / 2);
198
+ const padRight = width - 16 - padLeft;
199
+ const leftPadding = Array.from({ length: padLeft }, () => ANTIGRAVITY_PALETTE.darkOnyx);
200
+ const rightPadding = Array.from({ length: padRight }, () => ANTIGRAVITY_PALETTE.darkOnyx);
201
+ matrix = DEFAULT_EMBLEM_MATRIX.map((row) => [...leftPadding, ...row, ...rightPadding]);
202
+ }
203
+ }
204
+ return TerminalLogoRenderer.renderMatrixToHalfBlocks(matrix);
205
+ }
206
+ /**
207
+ * Emits terminal graphics protocol escape sequences for Kitty, iTerm2, or Sixel.
208
+ */
209
+ static renderGraphicProtocol(protocol, filePath) {
210
+ if (!fs.existsSync(filePath)) {
211
+ throw new Error(`Logo file does not exist: ${filePath}`);
212
+ }
213
+ const buffer = fs.readFileSync(filePath);
214
+ if (protocol === "kitty") {
215
+ let w = 64;
216
+ let h = 64;
217
+ // Read PNG dimension headers if available (offset 16: width, offset 20: height)
218
+ if (buffer.length >= 24 &&
219
+ buffer[0] === 0x89 &&
220
+ buffer[1] === 0x50 &&
221
+ buffer[2] === 0x4e &&
222
+ buffer[3] === 0x47) {
223
+ w = buffer.readUInt32BE(16);
224
+ h = buffer.readUInt32BE(20);
225
+ }
226
+ const base64 = buffer.toString("base64");
227
+ return `\x1b_Ga=T,f=100,t=d,s=${w},v=${h};${base64}\x1b\\`;
228
+ }
229
+ if (protocol === "iterm2") {
230
+ const base64 = buffer.toString("base64");
231
+ return `\x1b]1337;File=inline=1;width=auto;height=auto:${base64}\x07`;
232
+ }
233
+ if (protocol === "sixel") {
234
+ const rawString = buffer.toString("utf-8");
235
+ if (rawString.startsWith("\x1bP") && rawString.includes("\x1b\\")) {
236
+ return rawString;
237
+ }
238
+ // Emit valid Sixel DCS sequence representing the emblem
239
+ const sixelColorDef = "#0;2;4;4;5#1;2;0;95;100#2;2;26;38;93#3;2;45;4;72#4;2;97;15;52";
240
+ const sixelRaster = `"1;1;16;8`;
241
+ const sixelData = "#1~?~?#2??~~#3~~??#4~?~?";
242
+ return `\x1bPq${sixelRaster}${sixelColorDef}${sixelData}\x1b\\`;
243
+ }
244
+ throw new Error(`Unsupported graphic protocol: ${protocol}`);
245
+ }
246
+ /**
247
+ * Orchestrates logo rendering across graphics protocols and TrueColor half-blocks.
248
+ * Supports both overload styles:
249
+ * - renderHeaderLogo(protocol?: GraphicProtocol, cliPath?: string)
250
+ * - renderHeaderLogo(options?: HeaderLogoOptions)
251
+ */
252
+ static renderHeaderLogo(optionsOrProtocol, cliPath) {
253
+ let protocol;
254
+ let logoPath;
255
+ let width;
256
+ if (typeof optionsOrProtocol === "string") {
257
+ protocol = optionsOrProtocol;
258
+ logoPath = cliPath;
259
+ }
260
+ else if (optionsOrProtocol && typeof optionsOrProtocol === "object") {
261
+ protocol = optionsOrProtocol.protocol;
262
+ logoPath = optionsOrProtocol.logoPath;
263
+ width = optionsOrProtocol.width;
264
+ }
265
+ else {
266
+ logoPath = cliPath;
267
+ }
268
+ const effectiveProtocol = protocol ?? TerminalLogoRenderer.detectProtocol();
269
+ const resolvedPath = TerminalLogoRenderer.resolveLogoPath(logoPath);
270
+ if (effectiveProtocol !== "halfblock" &&
271
+ resolvedPath &&
272
+ fs.existsSync(resolvedPath)) {
273
+ try {
274
+ const graphicSequence = TerminalLogoRenderer.renderGraphicProtocol(effectiveProtocol, resolvedPath);
275
+ return [graphicSequence];
276
+ }
277
+ catch {
278
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
279
+ }
280
+ }
281
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
282
+ }
283
+ // Instance method delegates
284
+ detectProtocol() {
285
+ return TerminalLogoRenderer.detectProtocol();
286
+ }
287
+ resolveLogoPath(cliPath) {
288
+ return TerminalLogoRenderer.resolveLogoPath(cliPath);
289
+ }
290
+ renderHalfBlockLogo(width) {
291
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
292
+ }
293
+ renderGraphicProtocol(protocol, filePath) {
294
+ return TerminalLogoRenderer.renderGraphicProtocol(protocol, filePath);
295
+ }
296
+ renderHeaderLogo(optionsOrProtocol, cliPath) {
297
+ return TerminalLogoRenderer.renderHeaderLogo(optionsOrProtocol, cliPath);
298
+ }
299
+ }
300
+ //# sourceMappingURL=terminal-logo-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-logo-renderer.js","sourceRoot":"","sources":["../../src/tui/terminal-logo-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAY1E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAQ,EAAE,UAAU;IACzC,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAQ,EAAE,UAAU;IAC1C,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAQ,EAAE,UAAU;IAC9C,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAQ,EAAE,UAAU;IAC5C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAQ,EAAE,UAAU;IAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAQ,EAAE,UAAU;IAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAQ,EAAE,UAAU;CAC9C,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAAY;IACrC,uBAAuB;IACvB;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO;QACtF,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACvF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,gDAAgD;IAChD;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,YAAY;QAC5F,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QAC5F,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QAC1F,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ;QACtF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,gCAAgC;IAChC;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,YAAY;QAChG,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU;QAC9F,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QAC1F,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ;QACtF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,yBAAyB;IACzB;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU;QAC1F,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU;QAC9F,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ;QACtF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,iCAAiC;IACjC;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU;QAC1F,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU;QAC9F,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ;QACtF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,yBAAyB;IACzB;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,YAAY;QAChG,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU;QAC9F,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QAC1F,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ;QACtF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,sBAAsB;IACtB;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,YAAY;QAC5F,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QAC5F,mBAAmB,CAAC,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QAC1F,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ;QACtF,mBAAmB,CAAC,QAAQ;KAC7B;IACD,0BAA0B;IAC1B;QACE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACxF,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO;QACtF,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;QACvF,mBAAmB,CAAC,QAAQ;KAC7B;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAC/B;;OAEG;IACI,MAAM,CAAC,cAAc;QAC1B,6BAA6B;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,mCAAmC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACrF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,oBAAoB;QACpB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAC7E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,sDAAsD;QACtD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,eAAe,CAAC,OAAgB;QAC5C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvF,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;YACjE,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC;YAC9C,mBAAmB;SACpB,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,wBAAwB,CAAC,MAAe;QACpD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,GAAG,EAAE,CAAC;YAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC;gBAC3D,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC;gBAEjE,MAAM,EAAE,GAAG,aAAa,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;gBACrE,MAAM,EAAE,GAAG,aAAa,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC9E,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC;YAC7B,CAAC;YAED,IAAI,IAAI,SAAS,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,KAAc;QAC9C,IAAI,MAAM,GAAG,qBAAqB,CAAC;QAEnC,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACvC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;gBACf,wCAAwC;gBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC;gBACtC,MAAM,WAAW,GAAU,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC/F,MAAM,YAAY,GAAU,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAEjG,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,OAAO,oBAAoB,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,qBAAqB,CACjC,QAAsC,EACtC,QAAgB;QAEhB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,gFAAgF;YAChF,IACE,MAAM,CAAC,MAAM,IAAI,EAAE;gBACnB,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;gBAClB,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;gBAClB,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;gBAClB,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAClB,CAAC;gBACD,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,yBAAyB,CAAC,MAAM,CAAC,IAAI,MAAM,QAAQ,CAAC;QAC7D,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,kDAAkD,MAAM,MAAM,CAAC;QACxE,CAAC;QAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClE,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,wDAAwD;YACxD,MAAM,aAAa,GACjB,+DAA+D,CAAC;YAClE,MAAM,WAAW,GAAG,WAAW,CAAC;YAChC,MAAM,SAAS,GAAG,0BAA0B,CAAC;YAC7C,OAAO,SAAS,WAAW,GAAG,aAAa,GAAG,SAAS,QAAQ,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,gBAAgB,CAC5B,iBAAuD,EACvD,OAAgB;QAEhB,IAAI,QAAqC,CAAC;QAC1C,IAAI,QAA4B,CAAC;QACjC,IAAI,KAAyB,CAAC;QAE9B,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YAC1C,QAAQ,GAAG,iBAAiB,CAAC;YAC7B,QAAQ,GAAG,OAAO,CAAC;QACrB,CAAC;aAAM,IAAI,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YACtE,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACtC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACtC,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,OAAO,CAAC;QACrB,CAAC;QAED,MAAM,iBAAiB,GAAG,QAAQ,IAAI,oBAAoB,CAAC,cAAc,EAAE,CAAC;QAC5E,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEpE,IACE,iBAAiB,KAAK,WAAW;YACjC,YAAY;YACZ,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAC3B,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,oBAAoB,CAAC,qBAAqB,CAChE,iBAAiB,EACjB,YAAY,CACb,CAAC;gBACF,OAAO,CAAC,eAAe,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,4BAA4B;IACrB,cAAc;QACnB,OAAO,oBAAoB,CAAC,cAAc,EAAE,CAAC;IAC/C,CAAC;IAEM,eAAe,CAAC,OAAgB;QACrC,OAAO,oBAAoB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAEM,mBAAmB,CAAC,KAAc;QACvC,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAEM,qBAAqB,CAC1B,QAAsC,EACtC,QAAgB;QAEhB,OAAO,oBAAoB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAEM,gBAAgB,CACrB,iBAAuD,EACvD,OAAgB;QAEhB,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;CACF"}
@@ -5,6 +5,7 @@ import { type TuiRenderer } from "./tui-renderer.js";
5
5
  import { type CommandRegistry } from "../cli/command-registry.js";
6
6
  import { type CommandParser } from "../cli/command-parser.js";
7
7
  import { type CliErrorHandler } from "../cli/error-handler.js";
8
+ import { ModelAccordionBrowser } from "./model-accordion-browser.js";
8
9
  export interface TuiControllerOptions {
9
10
  stateAdapter: TuiStateAdapter;
10
11
  renderer: TuiRenderer;
@@ -43,10 +44,22 @@ export declare class TuiController {
43
44
  private cursorPosition;
44
45
  private isBracketedPaste;
45
46
  private paletteSelectedIndex;
47
+ private modelBrowserModal;
46
48
  constructor(options: TuiControllerOptions);
47
49
  private attachStateListener;
48
50
  getCurrentView(): TuiViewMode;
49
51
  setView(view: TuiViewMode): void;
52
+ getModelBrowserModal(): ModelAccordionBrowser | null;
53
+ setModelBrowserModal(modal: ModelAccordionBrowser | null): void;
54
+ getCommandOutput(): {
55
+ title: string;
56
+ lines: string[];
57
+ } | null;
58
+ setCommandOutput(output: {
59
+ title: string;
60
+ lines: string[];
61
+ } | null): void;
62
+ openModelBrowserModal(): Promise<void>;
50
63
  setDimensions(dims: TuiDimensions): void;
51
64
  getCursorPosition(): number;
52
65
  getSavedDraft(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"tui-controller.d.ts","sourceRoot":"","sources":["../../src/tui/tui-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui-controller.d.ts","sourceRoot":"","sources":["../../src/tui/tui-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAkB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAE7C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,aAAa,CAAmD;IACxE,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,iBAAiB,CAAsC;gBAEnD,OAAO,EAAE,oBAAoB;IAazC,OAAO,CAAC,mBAAmB;IAMpB,cAAc,IAAI,WAAW;IAI7B,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAOhC,oBAAoB,IAAI,qBAAqB,GAAG,IAAI;IAIpD,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI;IAK/D,gBAAgB,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAI7D,gBAAgB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,GAAG,IAAI;IAKnE,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB5C,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKxC,iBAAiB,IAAI,MAAM;IAI3B,aAAa,IAAI,MAAM;IAIvB,eAAe,IAAI,IAAI;IAIvB,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAuBnB;;OAEG;IACI,aAAa,IAAI,IAAI;IAW5B;;OAEG;IACI,SAAS,IAAI,IAAI;IAkCxB;;OAEG;WACW,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI/C;;OAEG;WACW,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjD;;OAEG;WACW,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjD;;OAEG;WACW,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIlD;;OAEG;WACW,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI5C;;OAEG;WACW,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;OAEG;WACW,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;WACW,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;WACW,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;WACW,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAInD;;OAEG;WACW,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItD;;OAEG;WACW,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAuFtG;;OAEG;IACU,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAezD;;OAEG;YACW,iBAAiB;IAmZ/B,OAAO,CAAC,oBAAoB;IAarB,iBAAiB,IAAI,MAAM,EAAE;IAI7B,mBAAmB,IAAI,IAAI;IAQ3B,eAAe,IAAI,OAAO;IAI1B,gBAAgB,IAAI,MAAM;IAI1B,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,OAAO;IAI9B;;OAEG;IACU,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsE/D"}
@@ -1,5 +1,7 @@
1
1
  import { CommandPalette } from "./command-palette.js";
2
2
  import { UserConfigManager } from "../persistence/user-config-manager.js";
3
+ import { ModelAccordionBrowser } from "./model-accordion-browser.js";
4
+ import { ModelCatalogCache } from "../persistence/model-catalog-cache.js";
3
5
  /**
4
6
  * TUI Controller: Manages navigation, keyboard input, command execution, and render coalescing.
5
7
  * PRD Part 2 Section 188–195.
@@ -28,6 +30,7 @@ export class TuiController {
28
30
  cursorPosition = 0;
29
31
  isBracketedPaste = false;
30
32
  paletteSelectedIndex = 0;
33
+ modelBrowserModal = null;
31
34
  constructor(options) {
32
35
  this.stateAdapter = options.stateAdapter;
33
36
  this.renderer = options.renderer;
@@ -50,6 +53,45 @@ export class TuiController {
50
53
  setView(view) {
51
54
  this.currentView = view;
52
55
  this.commandOutput = null;
56
+ this.modelBrowserModal = null;
57
+ this.requestRender();
58
+ }
59
+ getModelBrowserModal() {
60
+ return this.modelBrowserModal;
61
+ }
62
+ setModelBrowserModal(modal) {
63
+ this.modelBrowserModal = modal;
64
+ this.requestRender();
65
+ }
66
+ getCommandOutput() {
67
+ return this.commandOutput;
68
+ }
69
+ setCommandOutput(output) {
70
+ this.commandOutput = output;
71
+ this.requestRender();
72
+ }
73
+ async openModelBrowserModal() {
74
+ const cache = ModelCatalogCache.getInstance();
75
+ let models = cache.getCachedModels();
76
+ if (!models || models.length === 0) {
77
+ try {
78
+ models = await cache.getModels();
79
+ }
80
+ catch {
81
+ models = cache.getCachedModels() || [];
82
+ }
83
+ }
84
+ let activeModelId;
85
+ try {
86
+ activeModelId = UserConfigManager.getInstance().getDefaultModel();
87
+ }
88
+ catch {
89
+ // Fallback
90
+ }
91
+ this.modelBrowserModal = new ModelAccordionBrowser(models ?? [], activeModelId);
92
+ this.commandOutput = null;
93
+ this.isCommandMode = false;
94
+ this.commandBuffer = "";
53
95
  this.requestRender();
54
96
  }
55
97
  setDimensions(dims) {
@@ -73,6 +115,7 @@ export class TuiController {
73
115
  }
74
116
  stop() {
75
117
  this.isRunning = false;
118
+ this.modelBrowserModal = null;
76
119
  if (this.renderTimeout) {
77
120
  clearTimeout(this.renderTimeout);
78
121
  this.renderTimeout = undefined;
@@ -83,6 +126,14 @@ export class TuiController {
83
126
  }
84
127
  // Restore normal screen buffer and restore cursor
85
128
  this.output.write("\x1b[?1049l\x1b[?25h");
129
+ if (process.stdin.isTTY && typeof process.stdin.setRawMode === "function") {
130
+ try {
131
+ process.stdin.setRawMode(false);
132
+ }
133
+ catch {
134
+ // Safe fallback in test/mock environments
135
+ }
136
+ }
86
137
  }
87
138
  /**
88
139
  * Request a coalesced render frame to prevent event storms.
@@ -116,7 +167,7 @@ export class TuiController {
116
167
  catch {
117
168
  // Fallback
118
169
  }
119
- const rendered = this.renderer.render(this.currentView, this.stateAdapter, this.isCommandMode ? this.commandBuffer : "", this.errorMessage, this.isCommandMode, this.isCommandMode ? this.cursorPosition : undefined, this.commandOutput ?? undefined, paletteOverlay, activeModel);
170
+ const rendered = this.renderer.render(this.currentView, this.stateAdapter, this.isCommandMode ? this.commandBuffer : "", this.errorMessage, this.isCommandMode, this.isCommandMode ? this.cursorPosition : undefined, this.commandOutput ?? undefined, paletteOverlay, activeModel, this.modelBrowserModal);
120
171
  // In alternate buffer, position at home (1,1) and write frame WITHOUT trailing newline!
121
172
  this.output.write("\x1b[H" + rendered);
122
173
  }
@@ -297,6 +348,38 @@ export class TuiController {
297
348
  * Process a single decoded token or key sequence.
298
349
  */
299
350
  async handleSingleToken(token) {
351
+ // 0. Model Accordion Browser modal key routing
352
+ if (this.modelBrowserModal) {
353
+ const result = this.modelBrowserModal.handleKey(token);
354
+ if (result.action === "close") {
355
+ this.modelBrowserModal = null;
356
+ this.requestRender();
357
+ return true;
358
+ }
359
+ if (result.action === "select") {
360
+ const selectedId = result.selectedModelId;
361
+ this.modelBrowserModal = null;
362
+ if (selectedId) {
363
+ try {
364
+ UserConfigManager.getInstance().setDefaultModel(selectedId);
365
+ if (this.commandRegistry && this.commandParser) {
366
+ await this.commandRegistry.execute(this.commandParser.parse(`/model ${selectedId}`));
367
+ }
368
+ }
369
+ catch {
370
+ // Safe fallback
371
+ }
372
+ }
373
+ this.errorMessage = "";
374
+ this.requestRender();
375
+ return true;
376
+ }
377
+ if (result.action === "render") {
378
+ this.requestRender();
379
+ return true;
380
+ }
381
+ return true;
382
+ }
300
383
  // Bracketed paste markers (200~ start, 201~ end)
301
384
  if (token === "\x1b[200~") {
302
385
  this.isBracketedPaste = true;
@@ -462,8 +545,8 @@ export class TuiController {
462
545
  return true;
463
546
  }
464
547
  // 4. Cancel command mode
465
- // ESC (\u001B): preserves draft for rapid mode toggle (: -> ESC -> :)
466
- if (token === "\u001B") {
548
+ // ESC (\u001B / \x1b): preserves draft for rapid mode toggle (: -> ESC -> :)
549
+ if (token === "\u001B" || token === "\x1b" || token.toLowerCase() === "escape") {
467
550
  const draftToSave = this.historyIndex !== -1 ? this.historyDraft : this.commandBuffer;
468
551
  this.savedDraft = draftToSave;
469
552
  this.isCommandMode = false;
@@ -558,7 +641,13 @@ export class TuiController {
558
641
  }
559
642
  // 2. Normal mode actions
560
643
  if (this.commandOutput) {
561
- if (token === "c" || token === "C" || token === "\x1b" || token === "\r" || token === "\n") {
644
+ if (token === "c" ||
645
+ token === "C" ||
646
+ token === "\x1b" ||
647
+ token === "\u001B" ||
648
+ token.toLowerCase() === "escape" ||
649
+ token === "\r" ||
650
+ token === "\n") {
562
651
  this.commandOutput = null;
563
652
  this.requestRender();
564
653
  return true;
@@ -624,6 +713,8 @@ export class TuiController {
624
713
  return true;
625
714
  case "q":
626
715
  case "\u001B":
716
+ case "escape":
717
+ case "Escape":
627
718
  case "\u0003": // Ctrl+C terminates normal mode
628
719
  case "\u0004": // Ctrl+D (EOF) terminates normal mode
629
720
  this.stop();
@@ -677,6 +768,12 @@ export class TuiController {
677
768
  }
678
769
  try {
679
770
  const parsed = this.commandParser.parse(trimmed.startsWith("/") || trimmed.startsWith(":") ? trimmed : `/${trimmed}`);
771
+ const nameLower = parsed.name.toLowerCase();
772
+ // Intercept /models, /model, /m without arguments in interactive TUI mode to launch ModelAccordionBrowser modal
773
+ if ((nameLower === "models" || nameLower === "model" || nameLower === "m") && parsed.args.length === 0) {
774
+ await this.openModelBrowserModal();
775
+ return;
776
+ }
680
777
  const result = await this.commandRegistry.execute(parsed);
681
778
  if (!result.success) {
682
779
  let errStr = result.error ?? "Command failed.";