anantham-v2 2.0.3 → 2.0.5

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 (66) 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 +178 -99
  5. package/dist/cli/command-registry.js.map +1 -1
  6. package/dist/domain/tui.d.ts +1 -1
  7. package/dist/domain/tui.d.ts.map +1 -1
  8. package/dist/domain/tui.js +1 -0
  9. package/dist/domain/tui.js.map +1 -1
  10. package/dist/persistence/index.d.ts +2 -0
  11. package/dist/persistence/index.d.ts.map +1 -1
  12. package/dist/persistence/index.js +2 -0
  13. package/dist/persistence/index.js.map +1 -1
  14. package/dist/persistence/model-catalog-cache.d.ts +92 -0
  15. package/dist/persistence/model-catalog-cache.d.ts.map +1 -0
  16. package/dist/persistence/model-catalog-cache.js +430 -0
  17. package/dist/persistence/model-catalog-cache.js.map +1 -0
  18. package/dist/persistence/openrouter-key-validator.d.ts +40 -0
  19. package/dist/persistence/openrouter-key-validator.d.ts.map +1 -0
  20. package/dist/persistence/openrouter-key-validator.js +183 -0
  21. package/dist/persistence/openrouter-key-validator.js.map +1 -0
  22. package/dist/persistence/token-metrics-manager.d.ts +8 -2
  23. package/dist/persistence/token-metrics-manager.d.ts.map +1 -1
  24. package/dist/persistence/token-metrics-manager.js +60 -7
  25. package/dist/persistence/token-metrics-manager.js.map +1 -1
  26. package/dist/persistence/user-config-manager.d.ts +33 -9
  27. package/dist/persistence/user-config-manager.d.ts.map +1 -1
  28. package/dist/persistence/user-config-manager.js +133 -11
  29. package/dist/persistence/user-config-manager.js.map +1 -1
  30. package/dist/tui/index.d.ts +1 -0
  31. package/dist/tui/index.d.ts.map +1 -1
  32. package/dist/tui/index.js +1 -0
  33. package/dist/tui/index.js.map +1 -1
  34. package/dist/tui/model-accordion-browser.d.ts +80 -0
  35. package/dist/tui/model-accordion-browser.d.ts.map +1 -0
  36. package/dist/tui/model-accordion-browser.js +487 -0
  37. package/dist/tui/model-accordion-browser.js.map +1 -0
  38. package/dist/tui/model-catalog-cache.d.ts +7 -0
  39. package/dist/tui/model-catalog-cache.d.ts.map +1 -0
  40. package/dist/tui/model-catalog-cache.js +7 -0
  41. package/dist/tui/model-catalog-cache.js.map +1 -0
  42. package/dist/tui/teamwork-preview-canvas.d.ts +63 -0
  43. package/dist/tui/teamwork-preview-canvas.d.ts.map +1 -0
  44. package/dist/tui/teamwork-preview-canvas.js +294 -0
  45. package/dist/tui/teamwork-preview-canvas.js.map +1 -0
  46. package/dist/tui/terminal-layout.d.ts +56 -2
  47. package/dist/tui/terminal-layout.d.ts.map +1 -1
  48. package/dist/tui/terminal-layout.js +258 -22
  49. package/dist/tui/terminal-layout.js.map +1 -1
  50. package/dist/tui/terminal-logo-renderer.d.ts +63 -0
  51. package/dist/tui/terminal-logo-renderer.d.ts.map +1 -0
  52. package/dist/tui/terminal-logo-renderer.js +304 -0
  53. package/dist/tui/terminal-logo-renderer.js.map +1 -0
  54. package/dist/tui/token-usage-tracker.d.ts +8 -0
  55. package/dist/tui/token-usage-tracker.d.ts.map +1 -0
  56. package/dist/tui/token-usage-tracker.js +8 -0
  57. package/dist/tui/token-usage-tracker.js.map +1 -0
  58. package/dist/tui/tui-controller.d.ts +13 -0
  59. package/dist/tui/tui-controller.d.ts.map +1 -1
  60. package/dist/tui/tui-controller.js +116 -6
  61. package/dist/tui/tui-controller.js.map +1 -1
  62. package/dist/tui/tui-renderer.d.ts +3 -1
  63. package/dist/tui/tui-renderer.d.ts.map +1 -1
  64. package/dist/tui/tui-renderer.js +31 -41
  65. package/dist/tui/tui-renderer.js.map +1 -1
  66. package/package.json +1 -1
@@ -0,0 +1,304 @@
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 stat = fs.statSync(resolvedPath);
275
+ if (!stat.isFile()) {
276
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
277
+ }
278
+ const graphicSequence = TerminalLogoRenderer.renderGraphicProtocol(effectiveProtocol, resolvedPath);
279
+ return [graphicSequence];
280
+ }
281
+ catch {
282
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
283
+ }
284
+ }
285
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
286
+ }
287
+ // Instance method delegates
288
+ detectProtocol() {
289
+ return TerminalLogoRenderer.detectProtocol();
290
+ }
291
+ resolveLogoPath(cliPath) {
292
+ return TerminalLogoRenderer.resolveLogoPath(cliPath);
293
+ }
294
+ renderHalfBlockLogo(width) {
295
+ return TerminalLogoRenderer.renderHalfBlockLogo(width);
296
+ }
297
+ renderGraphicProtocol(protocol, filePath) {
298
+ return TerminalLogoRenderer.renderGraphicProtocol(protocol, filePath);
299
+ }
300
+ renderHeaderLogo(optionsOrProtocol, cliPath) {
301
+ return TerminalLogoRenderer.renderHeaderLogo(optionsOrProtocol, cliPath);
302
+ }
303
+ }
304
+ //# 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":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Architectural facade re-export for TokenMetricsManager / TokenUsageTracker.
3
+ * Provides backward-compatible import location under src/tui/
4
+ */
5
+ export * from "../persistence/token-metrics-manager.js";
6
+ export { TokenMetricsManager as TokenUsageTracker } from "../persistence/token-metrics-manager.js";
7
+ export { TokenMetricsManager as default } from "../persistence/token-metrics-manager.js";
8
+ //# sourceMappingURL=token-usage-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage-tracker.d.ts","sourceRoot":"","sources":["../../src/tui/token-usage-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,MAAM,yCAAyC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Architectural facade re-export for TokenMetricsManager / TokenUsageTracker.
3
+ * Provides backward-compatible import location under src/tui/
4
+ */
5
+ export * from "../persistence/token-metrics-manager.js";
6
+ export { TokenMetricsManager as TokenUsageTracker } from "../persistence/token-metrics-manager.js";
7
+ export { TokenMetricsManager as default } from "../persistence/token-metrics-manager.js";
8
+ //# sourceMappingURL=token-usage-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage-tracker.js","sourceRoot":"","sources":["../../src/tui/token-usage-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,MAAM,yCAAyC,CAAC"}
@@ -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":"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"}
@@ -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;
@@ -439,10 +522,13 @@ export class TuiController {
439
522
  // 3. Submit command (Enter)
440
523
  if (token === "\r" || token === "\n") {
441
524
  let toExec = this.commandBuffer.trim();
442
- if (toExec === "/" && this.commandBuffer.startsWith("/")) {
525
+ if (this.commandBuffer.startsWith("/")) {
443
526
  const filtered = CommandPalette.filterCommands(this.commandBuffer);
444
527
  if (filtered.length > 0) {
445
- toExec = filtered[this.paletteSelectedIndex]?.command ?? toExec;
528
+ const selected = filtered[this.paletteSelectedIndex];
529
+ if (toExec === "/" || (!toExec.includes(" ") && selected)) {
530
+ toExec = selected?.command ?? toExec;
531
+ }
446
532
  }
447
533
  }
448
534
  this.isCommandMode = false;
@@ -462,8 +548,8 @@ export class TuiController {
462
548
  return true;
463
549
  }
464
550
  // 4. Cancel command mode
465
- // ESC (\u001B): preserves draft for rapid mode toggle (: -> ESC -> :)
466
- if (token === "\u001B") {
551
+ // ESC (\u001B / \x1b): preserves draft for rapid mode toggle (: -> ESC -> :)
552
+ if (token === "\u001B" || token === "\x1b" || token.toLowerCase() === "escape") {
467
553
  const draftToSave = this.historyIndex !== -1 ? this.historyDraft : this.commandBuffer;
468
554
  this.savedDraft = draftToSave;
469
555
  this.isCommandMode = false;
@@ -558,7 +644,13 @@ export class TuiController {
558
644
  }
559
645
  // 2. Normal mode actions
560
646
  if (this.commandOutput) {
561
- if (token === "c" || token === "C" || token === "\x1b" || token === "\r" || token === "\n") {
647
+ if (token === "c" ||
648
+ token === "C" ||
649
+ token === "\x1b" ||
650
+ token === "\u001B" ||
651
+ token.toLowerCase() === "escape" ||
652
+ token === "\r" ||
653
+ token === "\n") {
562
654
  this.commandOutput = null;
563
655
  this.requestRender();
564
656
  return true;
@@ -596,6 +688,10 @@ export class TuiController {
596
688
  case "U":
597
689
  this.setView("usage");
598
690
  return true;
691
+ case "t":
692
+ case "T":
693
+ this.setView("teamwork");
694
+ return true;
599
695
  case "?":
600
696
  case "h":
601
697
  this.setView("help");
@@ -624,6 +720,8 @@ export class TuiController {
624
720
  return true;
625
721
  case "q":
626
722
  case "\u001B":
723
+ case "escape":
724
+ case "Escape":
627
725
  case "\u0003": // Ctrl+C terminates normal mode
628
726
  case "\u0004": // Ctrl+D (EOF) terminates normal mode
629
727
  this.stop();
@@ -677,6 +775,12 @@ export class TuiController {
677
775
  }
678
776
  try {
679
777
  const parsed = this.commandParser.parse(trimmed.startsWith("/") || trimmed.startsWith(":") ? trimmed : `/${trimmed}`);
778
+ const nameLower = parsed.name.toLowerCase();
779
+ // Intercept /models, /model, /m without arguments in interactive TUI mode to launch ModelAccordionBrowser modal
780
+ if ((nameLower === "models" || nameLower === "model" || nameLower === "m") && parsed.args.length === 0) {
781
+ await this.openModelBrowserModal();
782
+ return;
783
+ }
680
784
  const result = await this.commandRegistry.execute(parsed);
681
785
  if (!result.success) {
682
786
  let errStr = result.error ?? "Command failed.";
@@ -701,6 +805,12 @@ export class TuiController {
701
805
  this.requestRender();
702
806
  return;
703
807
  }
808
+ else if (nameLower === "teamwork-preview" || nameLower === "teamwork" || nameLower === "preview") {
809
+ this.setView("teamwork");
810
+ this.commandOutput = null;
811
+ this.requestRender();
812
+ return;
813
+ }
704
814
  if (result.message) {
705
815
  this.commandOutput = {
706
816
  title: `COMMAND RESULT: /${parsed.name.toUpperCase()}`,