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.
- package/dist/bin/anantham.js +10 -1
- package/dist/bin/anantham.js.map +1 -1
- package/dist/cli/command-registry.d.ts.map +1 -1
- package/dist/cli/command-registry.js +178 -99
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/domain/tui.d.ts +1 -1
- package/dist/domain/tui.d.ts.map +1 -1
- package/dist/domain/tui.js +1 -0
- package/dist/domain/tui.js.map +1 -1
- package/dist/persistence/index.d.ts +2 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +2 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/model-catalog-cache.d.ts +92 -0
- package/dist/persistence/model-catalog-cache.d.ts.map +1 -0
- package/dist/persistence/model-catalog-cache.js +430 -0
- package/dist/persistence/model-catalog-cache.js.map +1 -0
- package/dist/persistence/openrouter-key-validator.d.ts +40 -0
- package/dist/persistence/openrouter-key-validator.d.ts.map +1 -0
- package/dist/persistence/openrouter-key-validator.js +183 -0
- package/dist/persistence/openrouter-key-validator.js.map +1 -0
- package/dist/persistence/token-metrics-manager.d.ts +8 -2
- package/dist/persistence/token-metrics-manager.d.ts.map +1 -1
- package/dist/persistence/token-metrics-manager.js +60 -7
- package/dist/persistence/token-metrics-manager.js.map +1 -1
- package/dist/persistence/user-config-manager.d.ts +33 -9
- package/dist/persistence/user-config-manager.d.ts.map +1 -1
- package/dist/persistence/user-config-manager.js +133 -11
- package/dist/persistence/user-config-manager.js.map +1 -1
- package/dist/tui/index.d.ts +1 -0
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +1 -0
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/model-accordion-browser.d.ts +80 -0
- package/dist/tui/model-accordion-browser.d.ts.map +1 -0
- package/dist/tui/model-accordion-browser.js +487 -0
- package/dist/tui/model-accordion-browser.js.map +1 -0
- package/dist/tui/model-catalog-cache.d.ts +7 -0
- package/dist/tui/model-catalog-cache.d.ts.map +1 -0
- package/dist/tui/model-catalog-cache.js +7 -0
- package/dist/tui/model-catalog-cache.js.map +1 -0
- package/dist/tui/teamwork-preview-canvas.d.ts +63 -0
- package/dist/tui/teamwork-preview-canvas.d.ts.map +1 -0
- package/dist/tui/teamwork-preview-canvas.js +294 -0
- package/dist/tui/teamwork-preview-canvas.js.map +1 -0
- package/dist/tui/terminal-layout.d.ts +56 -2
- package/dist/tui/terminal-layout.d.ts.map +1 -1
- package/dist/tui/terminal-layout.js +258 -22
- package/dist/tui/terminal-layout.js.map +1 -1
- package/dist/tui/terminal-logo-renderer.d.ts +63 -0
- package/dist/tui/terminal-logo-renderer.d.ts.map +1 -0
- package/dist/tui/terminal-logo-renderer.js +304 -0
- package/dist/tui/terminal-logo-renderer.js.map +1 -0
- package/dist/tui/token-usage-tracker.d.ts +8 -0
- package/dist/tui/token-usage-tracker.d.ts.map +1 -0
- package/dist/tui/token-usage-tracker.js +8 -0
- package/dist/tui/token-usage-tracker.js.map +1 -0
- package/dist/tui/tui-controller.d.ts +13 -0
- package/dist/tui/tui-controller.d.ts.map +1 -1
- package/dist/tui/tui-controller.js +116 -6
- package/dist/tui/tui-controller.js.map +1 -1
- package/dist/tui/tui-renderer.d.ts +3 -1
- package/dist/tui/tui-renderer.d.ts.map +1 -1
- package/dist/tui/tui-renderer.js +31 -41
- package/dist/tui/tui-renderer.js.map +1 -1
- 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":"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;
|
|
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 (
|
|
525
|
+
if (this.commandBuffer.startsWith("/")) {
|
|
443
526
|
const filtered = CommandPalette.filterCommands(this.commandBuffer);
|
|
444
527
|
if (filtered.length > 0) {
|
|
445
|
-
|
|
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" ||
|
|
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()}`,
|