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.
- 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 +118 -84
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/persistence/model-catalog-cache.d.ts +86 -0
- package/dist/persistence/model-catalog-cache.d.ts.map +1 -0
- package/dist/persistence/model-catalog-cache.js +398 -0
- package/dist/persistence/model-catalog-cache.js.map +1 -0
- package/dist/persistence/user-config-manager.d.ts +4 -0
- package/dist/persistence/user-config-manager.d.ts.map +1 -1
- package/dist/persistence/user-config-manager.js +15 -0
- package/dist/persistence/user-config-manager.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/terminal-layout.js +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 +300 -0
- package/dist/tui/terminal-logo-renderer.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 +101 -4
- 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 +18 -3
- package/dist/tui/tui-renderer.js.map +1 -1
- 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":"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"}
|
|
@@ -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;
|
|
@@ -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" ||
|
|
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.";
|