@mariozechner/pi-tui 0.5.0

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.
@@ -0,0 +1,454 @@
1
+ import { readdirSync, statSync } from "fs";
2
+ import mimeTypes from "mime-types";
3
+ import { homedir } from "os";
4
+ import { basename, dirname, extname, join } from "path";
5
+ import { logger } from "./logger.js";
6
+ function isAttachableFile(filePath) {
7
+ const mimeType = mimeTypes.lookup(filePath);
8
+ // Check file extension for common text files that might be misidentified
9
+ const textExtensions = [
10
+ ".txt",
11
+ ".md",
12
+ ".markdown",
13
+ ".js",
14
+ ".ts",
15
+ ".tsx",
16
+ ".jsx",
17
+ ".py",
18
+ ".java",
19
+ ".c",
20
+ ".cpp",
21
+ ".h",
22
+ ".hpp",
23
+ ".cs",
24
+ ".php",
25
+ ".rb",
26
+ ".go",
27
+ ".rs",
28
+ ".swift",
29
+ ".kt",
30
+ ".scala",
31
+ ".sh",
32
+ ".bash",
33
+ ".zsh",
34
+ ".fish",
35
+ ".html",
36
+ ".htm",
37
+ ".css",
38
+ ".scss",
39
+ ".sass",
40
+ ".less",
41
+ ".xml",
42
+ ".json",
43
+ ".yaml",
44
+ ".yml",
45
+ ".toml",
46
+ ".ini",
47
+ ".cfg",
48
+ ".conf",
49
+ ".log",
50
+ ".sql",
51
+ ".r",
52
+ ".R",
53
+ ".m",
54
+ ".pl",
55
+ ".lua",
56
+ ".vim",
57
+ ".dockerfile",
58
+ ".makefile",
59
+ ".cmake",
60
+ ".gradle",
61
+ ".maven",
62
+ ".properties",
63
+ ".env",
64
+ ];
65
+ const ext = extname(filePath).toLowerCase();
66
+ if (textExtensions.includes(ext))
67
+ return true;
68
+ if (!mimeType)
69
+ return false;
70
+ if (mimeType.startsWith("image/"))
71
+ return true;
72
+ if (mimeType.startsWith("text/"))
73
+ return true;
74
+ // Special cases for common text files that might not be detected as text/
75
+ const commonTextTypes = [
76
+ "application/json",
77
+ "application/javascript",
78
+ "application/typescript",
79
+ "application/xml",
80
+ "application/yaml",
81
+ "application/x-yaml",
82
+ ];
83
+ return commonTextTypes.includes(mimeType);
84
+ }
85
+ // Combined provider that handles both slash commands and file paths
86
+ export class CombinedAutocompleteProvider {
87
+ commands;
88
+ basePath;
89
+ constructor(commands = [], basePath = process.cwd()) {
90
+ this.commands = commands;
91
+ this.basePath = basePath;
92
+ }
93
+ getSuggestions(lines, cursorLine, cursorCol) {
94
+ logger.debug("CombinedAutocompleteProvider", "getSuggestions called", {
95
+ lines,
96
+ cursorLine,
97
+ cursorCol,
98
+ });
99
+ const currentLine = lines[cursorLine] || "";
100
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
101
+ // Check for slash commands
102
+ if (textBeforeCursor.startsWith("/")) {
103
+ const spaceIndex = textBeforeCursor.indexOf(" ");
104
+ if (spaceIndex === -1) {
105
+ // No space yet - complete command names
106
+ const prefix = textBeforeCursor.slice(1); // Remove the "/"
107
+ const filtered = this.commands
108
+ .filter((cmd) => {
109
+ const name = "name" in cmd ? cmd.name : cmd.value; // Check if SlashCommand or AutocompleteItem
110
+ return name?.toLowerCase().startsWith(prefix.toLowerCase());
111
+ })
112
+ .map((cmd) => ({
113
+ value: "name" in cmd ? cmd.name : cmd.value,
114
+ label: "name" in cmd ? cmd.name : cmd.label,
115
+ ...(cmd.description && { description: cmd.description }),
116
+ }));
117
+ if (filtered.length === 0)
118
+ return null;
119
+ return {
120
+ items: filtered,
121
+ prefix: textBeforeCursor,
122
+ };
123
+ }
124
+ else {
125
+ // Space found - complete command arguments
126
+ const commandName = textBeforeCursor.slice(1, spaceIndex); // Command without "/"
127
+ const argumentText = textBeforeCursor.slice(spaceIndex + 1); // Text after space
128
+ const command = this.commands.find((cmd) => {
129
+ const name = "name" in cmd ? cmd.name : cmd.value;
130
+ return name === commandName;
131
+ });
132
+ if (!command || !("getArgumentCompletions" in command) || !command.getArgumentCompletions) {
133
+ return null; // No argument completion for this command
134
+ }
135
+ const argumentSuggestions = command.getArgumentCompletions(argumentText);
136
+ if (!argumentSuggestions || argumentSuggestions.length === 0) {
137
+ return null;
138
+ }
139
+ return {
140
+ items: argumentSuggestions,
141
+ prefix: argumentText,
142
+ };
143
+ }
144
+ }
145
+ // Check for file paths - triggered by Tab or if we detect a path pattern
146
+ const pathMatch = this.extractPathPrefix(textBeforeCursor, false);
147
+ logger.debug("CombinedAutocompleteProvider", "Path match check", {
148
+ textBeforeCursor,
149
+ pathMatch,
150
+ });
151
+ if (pathMatch !== null) {
152
+ const suggestions = this.getFileSuggestions(pathMatch);
153
+ if (suggestions.length === 0)
154
+ return null;
155
+ return {
156
+ items: suggestions,
157
+ prefix: pathMatch,
158
+ };
159
+ }
160
+ return null;
161
+ }
162
+ applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
163
+ const currentLine = lines[cursorLine] || "";
164
+ const beforePrefix = currentLine.slice(0, cursorCol - prefix.length);
165
+ const afterCursor = currentLine.slice(cursorCol);
166
+ // Check if we're completing a slash command (prefix starts with "/")
167
+ if (prefix.startsWith("/")) {
168
+ // This is a command name completion
169
+ const newLine = beforePrefix + "/" + item.value + " " + afterCursor;
170
+ const newLines = [...lines];
171
+ newLines[cursorLine] = newLine;
172
+ return {
173
+ lines: newLines,
174
+ cursorLine,
175
+ cursorCol: beforePrefix.length + item.value.length + 2, // +2 for "/" and space
176
+ };
177
+ }
178
+ // Check if we're completing a file attachment (prefix starts with "@")
179
+ if (prefix.startsWith("@")) {
180
+ // This is a file attachment completion
181
+ const newLine = beforePrefix + item.value + " " + afterCursor;
182
+ const newLines = [...lines];
183
+ newLines[cursorLine] = newLine;
184
+ return {
185
+ lines: newLines,
186
+ cursorLine,
187
+ cursorCol: beforePrefix.length + item.value.length + 1, // +1 for space
188
+ };
189
+ }
190
+ // Check if we're in a slash command context (beforePrefix contains "/command ")
191
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
192
+ if (textBeforeCursor.includes("/") && textBeforeCursor.includes(" ")) {
193
+ // This is likely a command argument completion
194
+ const newLine = beforePrefix + item.value + afterCursor;
195
+ const newLines = [...lines];
196
+ newLines[cursorLine] = newLine;
197
+ return {
198
+ lines: newLines,
199
+ cursorLine,
200
+ cursorCol: beforePrefix.length + item.value.length,
201
+ };
202
+ }
203
+ // For file paths, complete the path
204
+ const newLine = beforePrefix + item.value + afterCursor;
205
+ const newLines = [...lines];
206
+ newLines[cursorLine] = newLine;
207
+ return {
208
+ lines: newLines,
209
+ cursorLine,
210
+ cursorCol: beforePrefix.length + item.value.length,
211
+ };
212
+ }
213
+ // Extract a path-like prefix from the text before cursor
214
+ extractPathPrefix(text, forceExtract = false) {
215
+ // Check for @ file attachment syntax first
216
+ const atMatch = text.match(/@([^\s]*)$/);
217
+ if (atMatch) {
218
+ return atMatch[0]; // Return the full @path pattern
219
+ }
220
+ // Match paths - including those ending with /, ~/, or any word at end for forced extraction
221
+ // This regex captures:
222
+ // - Paths starting from beginning of line or after space/quote/equals
223
+ // - Optional ./ or ../ or ~/ prefix (including the trailing slash for ~/)
224
+ // - The path itself (can include / in the middle)
225
+ // - For forced extraction, capture any word at the end
226
+ const matches = text.match(/(?:^|[\s"'=])((?:~\/|\.{0,2}\/?)?(?:[^\s"'=]*\/?)*[^\s"'=]*)$/);
227
+ if (!matches) {
228
+ // If forced extraction and no matches, return empty string to trigger from current dir
229
+ return forceExtract ? "" : null;
230
+ }
231
+ const pathPrefix = matches[1] || "";
232
+ // For forced extraction (Tab key), always return something
233
+ if (forceExtract) {
234
+ return pathPrefix;
235
+ }
236
+ // For natural triggers, return if it looks like a path, ends with /, starts with ~/, .
237
+ // Only return empty string if the text looks like it's starting a path context
238
+ if (pathPrefix.includes("/") || pathPrefix.startsWith(".") || pathPrefix.startsWith("~/")) {
239
+ return pathPrefix;
240
+ }
241
+ // Return empty string only if we're at the beginning of the line or after a space
242
+ // (not after quotes or other delimiters that don't suggest file paths)
243
+ if (pathPrefix === "" && (text === "" || text.endsWith(" "))) {
244
+ return pathPrefix;
245
+ }
246
+ return null;
247
+ }
248
+ // Expand home directory (~/) to actual home path
249
+ expandHomePath(path) {
250
+ if (path.startsWith("~/")) {
251
+ const expandedPath = join(homedir(), path.slice(2));
252
+ // Preserve trailing slash if original path had one
253
+ return path.endsWith("/") && !expandedPath.endsWith("/") ? expandedPath + "/" : expandedPath;
254
+ }
255
+ else if (path === "~") {
256
+ return homedir();
257
+ }
258
+ return path;
259
+ }
260
+ // Get file/directory suggestions for a given path prefix
261
+ getFileSuggestions(prefix) {
262
+ logger.debug("CombinedAutocompleteProvider", "getFileSuggestions called", {
263
+ prefix,
264
+ basePath: this.basePath,
265
+ });
266
+ try {
267
+ let searchDir;
268
+ let searchPrefix;
269
+ let expandedPrefix = prefix;
270
+ let isAtPrefix = false;
271
+ // Handle @ file attachment prefix
272
+ if (prefix.startsWith("@")) {
273
+ isAtPrefix = true;
274
+ expandedPrefix = prefix.slice(1); // Remove the @
275
+ }
276
+ // Handle home directory expansion
277
+ if (expandedPrefix.startsWith("~")) {
278
+ expandedPrefix = this.expandHomePath(expandedPrefix);
279
+ }
280
+ if (expandedPrefix === "" ||
281
+ expandedPrefix === "./" ||
282
+ expandedPrefix === "../" ||
283
+ expandedPrefix === "~" ||
284
+ expandedPrefix === "~/" ||
285
+ prefix === "@") {
286
+ // Complete from specified position
287
+ if (prefix.startsWith("~")) {
288
+ searchDir = expandedPrefix;
289
+ }
290
+ else {
291
+ searchDir = join(this.basePath, expandedPrefix);
292
+ }
293
+ searchPrefix = "";
294
+ }
295
+ else if (expandedPrefix.endsWith("/")) {
296
+ // If prefix ends with /, show contents of that directory
297
+ if (prefix.startsWith("~") || (isAtPrefix && expandedPrefix.startsWith("/"))) {
298
+ searchDir = expandedPrefix;
299
+ }
300
+ else {
301
+ searchDir = join(this.basePath, expandedPrefix);
302
+ }
303
+ searchPrefix = "";
304
+ }
305
+ else {
306
+ // Split into directory and file prefix
307
+ const dir = dirname(expandedPrefix);
308
+ const file = basename(expandedPrefix);
309
+ if (prefix.startsWith("~") || (isAtPrefix && expandedPrefix.startsWith("/"))) {
310
+ searchDir = dir;
311
+ }
312
+ else {
313
+ searchDir = join(this.basePath, dir);
314
+ }
315
+ searchPrefix = file;
316
+ }
317
+ logger.debug("CombinedAutocompleteProvider", "Searching directory", {
318
+ searchDir,
319
+ searchPrefix,
320
+ });
321
+ const entries = readdirSync(searchDir);
322
+ const suggestions = [];
323
+ for (const entry of entries) {
324
+ if (!entry.toLowerCase().startsWith(searchPrefix.toLowerCase())) {
325
+ continue;
326
+ }
327
+ const fullPath = join(searchDir, entry);
328
+ const isDirectory = statSync(fullPath).isDirectory();
329
+ // For @ prefix, filter to only show directories and attachable files
330
+ if (isAtPrefix && !isDirectory && !isAttachableFile(fullPath)) {
331
+ continue;
332
+ }
333
+ let relativePath;
334
+ // Handle @ prefix path construction
335
+ if (isAtPrefix) {
336
+ const pathWithoutAt = expandedPrefix;
337
+ if (pathWithoutAt.endsWith("/")) {
338
+ relativePath = "@" + pathWithoutAt + entry;
339
+ }
340
+ else if (pathWithoutAt.includes("/")) {
341
+ if (pathWithoutAt.startsWith("~/")) {
342
+ const homeRelativeDir = pathWithoutAt.slice(2); // Remove ~/
343
+ const dir = dirname(homeRelativeDir);
344
+ relativePath = "@~/" + (dir === "." ? entry : join(dir, entry));
345
+ }
346
+ else {
347
+ relativePath = "@" + join(dirname(pathWithoutAt), entry);
348
+ }
349
+ }
350
+ else {
351
+ if (pathWithoutAt.startsWith("~")) {
352
+ relativePath = "@~/" + entry;
353
+ }
354
+ else {
355
+ relativePath = "@" + entry;
356
+ }
357
+ }
358
+ }
359
+ else if (prefix.endsWith("/")) {
360
+ // If prefix ends with /, append entry to the prefix
361
+ relativePath = prefix + entry;
362
+ }
363
+ else if (prefix.includes("/")) {
364
+ // Preserve ~/ format for home directory paths
365
+ if (prefix.startsWith("~/")) {
366
+ const homeRelativeDir = prefix.slice(2); // Remove ~/
367
+ const dir = dirname(homeRelativeDir);
368
+ relativePath = "~/" + (dir === "." ? entry : join(dir, entry));
369
+ }
370
+ else {
371
+ relativePath = join(dirname(prefix), entry);
372
+ }
373
+ }
374
+ else {
375
+ // For standalone entries, preserve ~/ if original prefix was ~/
376
+ if (prefix.startsWith("~")) {
377
+ relativePath = "~/" + entry;
378
+ }
379
+ else {
380
+ relativePath = entry;
381
+ }
382
+ }
383
+ suggestions.push({
384
+ value: isDirectory ? relativePath + "/" : relativePath,
385
+ label: entry,
386
+ description: isDirectory ? "directory" : "file",
387
+ });
388
+ }
389
+ // Sort directories first, then alphabetically
390
+ suggestions.sort((a, b) => {
391
+ const aIsDir = a.description === "directory";
392
+ const bIsDir = b.description === "directory";
393
+ if (aIsDir && !bIsDir)
394
+ return -1;
395
+ if (!aIsDir && bIsDir)
396
+ return 1;
397
+ return a.label.localeCompare(b.label);
398
+ });
399
+ logger.debug("CombinedAutocompleteProvider", "Returning suggestions", {
400
+ count: suggestions.length,
401
+ firstFew: suggestions.slice(0, 3).map((s) => s.label),
402
+ });
403
+ return suggestions.slice(0, 10); // Limit to 10 suggestions
404
+ }
405
+ catch (e) {
406
+ // Directory doesn't exist or not accessible
407
+ logger.error("CombinedAutocompleteProvider", "Error reading directory", {
408
+ error: e instanceof Error ? e.message : String(e),
409
+ });
410
+ return [];
411
+ }
412
+ }
413
+ // Force file completion (called on Tab key) - always returns suggestions
414
+ getForceFileSuggestions(lines, cursorLine, cursorCol) {
415
+ logger.debug("CombinedAutocompleteProvider", "getForceFileSuggestions called", {
416
+ lines,
417
+ cursorLine,
418
+ cursorCol,
419
+ });
420
+ const currentLine = lines[cursorLine] || "";
421
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
422
+ // Don't trigger if we're in a slash command
423
+ if (textBeforeCursor.startsWith("/") && !textBeforeCursor.includes(" ")) {
424
+ return null;
425
+ }
426
+ // Force extract path prefix - this will always return something
427
+ const pathMatch = this.extractPathPrefix(textBeforeCursor, true);
428
+ logger.debug("CombinedAutocompleteProvider", "Forced path match", {
429
+ textBeforeCursor,
430
+ pathMatch,
431
+ });
432
+ if (pathMatch !== null) {
433
+ const suggestions = this.getFileSuggestions(pathMatch);
434
+ if (suggestions.length === 0)
435
+ return null;
436
+ return {
437
+ items: suggestions,
438
+ prefix: pathMatch,
439
+ };
440
+ }
441
+ return null;
442
+ }
443
+ // Check if we should trigger file completion (called on Tab key)
444
+ shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
445
+ const currentLine = lines[cursorLine] || "";
446
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
447
+ // Don't trigger if we're in a slash command
448
+ if (textBeforeCursor.startsWith("/") && !textBeforeCursor.includes(" ")) {
449
+ return false;
450
+ }
451
+ return true;
452
+ }
453
+ }
454
+ //# sourceMappingURL=autocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { type AutocompleteItem, type AutocompleteProvider, CombinedAutocompleteProvider, type SlashCommand, } from "./autocomplete.js";
2
+ export { type LoggerConfig, logger } from "./logger.js";
3
+ export { MarkdownComponent } from "./markdown-component.js";
4
+ export { type SelectItem, SelectList } from "./select-list.js";
5
+ export { TextComponent } from "./text-component.js";
6
+ export { TextEditor, type TextEditorConfig } from "./text-editor.js";
7
+ export { type Component, type ComponentRenderResult, Container, type ContainerRenderResult, type Padding, TUI, } from "./tui.js";
8
+ export { WhitespaceComponent } from "./whitespace-component.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,YAAY,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACN,KAAK,SAAS,EACd,KAAK,qBAAqB,EAC1B,SAAS,EACT,KAAK,qBAAqB,EAC1B,KAAK,OAAO,EACZ,GAAG,GACH,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // Core TUI interfaces and classes
2
+ // Autocomplete support
3
+ export { CombinedAutocompleteProvider, } from "./autocomplete.js";
4
+ // Logger for debugging
5
+ export { logger } from "./logger.js";
6
+ // Markdown component
7
+ export { MarkdownComponent } from "./markdown-component.js";
8
+ // Select list component
9
+ export { SelectList } from "./select-list.js";
10
+ // Text component
11
+ export { TextComponent } from "./text-component.js";
12
+ // Text editor component
13
+ export { TextEditor } from "./text-editor.js";
14
+ export { Container, TUI, } from "./tui.js";
15
+ // Whitespace component
16
+ export { WhitespaceComponent } from "./whitespace-component.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,uBAAuB;AACvB,OAAO,EAGN,4BAA4B,GAE5B,MAAM,mBAAmB,CAAC;AAC3B,uBAAuB;AACvB,OAAO,EAAqB,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,wBAAwB;AACxB,OAAO,EAAmB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAGN,SAAS,EAGT,GAAG,GACH,MAAM,UAAU,CAAC;AAClB,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface LoggerConfig {
2
+ enabled: boolean;
3
+ logFile: string;
4
+ logLevel: "debug" | "info" | "warn" | "error";
5
+ }
6
+ declare class Logger {
7
+ private config;
8
+ configure(config: Partial<LoggerConfig>): void;
9
+ private shouldLog;
10
+ private log;
11
+ debug(component: string, message: string, data?: any): void;
12
+ info(component: string, message: string, data?: any): void;
13
+ warn(component: string, message: string, data?: any): void;
14
+ error(component: string, message: string, data?: any): void;
15
+ keyInput(component: string, keyData: string): void;
16
+ render(component: string, renderResult: any): void;
17
+ focus(component: string, focused: boolean): void;
18
+ componentLifecycle(component: string, action: string, details?: any): void;
19
+ stateChange(component: string, property: string, oldValue: any, newValue: any): void;
20
+ }
21
+ export declare const logger: Logger;
22
+ export {};
23
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC9C;AAED,cAAM,MAAM;IACX,OAAO,CAAC,MAAM,CAIZ;IAEF,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAa9C,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,GAAG;IAcX,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI3D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAK3D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAOlD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,IAAI;IAIlD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI;CAGpF;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,75 @@
1
+ import { appendFileSync, writeFileSync } from "fs";
2
+ import { join } from "path";
3
+ class Logger {
4
+ config = {
5
+ enabled: false,
6
+ logFile: join(process.cwd(), "tui-debug.log"),
7
+ logLevel: "debug",
8
+ };
9
+ configure(config) {
10
+ this.config = { ...this.config, ...config };
11
+ if (this.config.enabled) {
12
+ // Clear log file on startup
13
+ try {
14
+ writeFileSync(this.config.logFile, `=== TUI Debug Log Started ${new Date().toISOString()} ===\n`);
15
+ }
16
+ catch (error) {
17
+ // Silently fail if we can't write to log file
18
+ }
19
+ }
20
+ }
21
+ shouldLog(level) {
22
+ if (!this.config.enabled)
23
+ return false;
24
+ const levels = ["debug", "info", "warn", "error"];
25
+ const currentLevel = levels.indexOf(this.config.logLevel);
26
+ const messageLevel = levels.indexOf(level);
27
+ return messageLevel >= currentLevel;
28
+ }
29
+ log(level, component, message, data) {
30
+ if (!this.shouldLog(level))
31
+ return;
32
+ try {
33
+ const timestamp = new Date().toISOString();
34
+ const dataStr = data ? ` | Data: ${JSON.stringify(data)}` : "";
35
+ const logLine = `[${timestamp}] ${level.toUpperCase()} [${component}] ${message}${dataStr}\n`;
36
+ appendFileSync(this.config.logFile, logLine);
37
+ }
38
+ catch (error) {
39
+ // Silently fail if we can't write to log file
40
+ }
41
+ }
42
+ debug(component, message, data) {
43
+ this.log("debug", component, message, data);
44
+ }
45
+ info(component, message, data) {
46
+ this.log("info", component, message, data);
47
+ }
48
+ warn(component, message, data) {
49
+ this.log("warn", component, message, data);
50
+ }
51
+ error(component, message, data) {
52
+ this.log("error", component, message, data);
53
+ }
54
+ // Specific TUI logging methods
55
+ keyInput(component, keyData) {
56
+ this.debug(component, "Key input received", {
57
+ keyData,
58
+ charCodes: Array.from(keyData).map((c) => c.charCodeAt(0)),
59
+ });
60
+ }
61
+ render(component, renderResult) {
62
+ this.debug(component, "Render result", renderResult);
63
+ }
64
+ focus(component, focused) {
65
+ this.info(component, `Focus ${focused ? "gained" : "lost"}`);
66
+ }
67
+ componentLifecycle(component, action, details) {
68
+ this.info(component, `Component ${action}`, details);
69
+ }
70
+ stateChange(component, property, oldValue, newValue) {
71
+ this.debug(component, `State change: ${property}`, { oldValue, newValue });
72
+ }
73
+ }
74
+ export const logger = new Logger();
75
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Component, ComponentRenderResult } from "./tui.js";
2
+ export declare class MarkdownComponent implements Component {
3
+ private text;
4
+ private lines;
5
+ private previousLines;
6
+ constructor(text?: string);
7
+ setText(text: string): void;
8
+ render(width: number): ComponentRenderResult;
9
+ private renderToken;
10
+ private renderInlineTokens;
11
+ private wrapLine;
12
+ private getVisibleLength;
13
+ }
14
+ //# sourceMappingURL=markdown-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-component.d.ts","sourceRoot":"","sources":["../src/markdown-component.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjE,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,IAAI,GAAE,MAAW;IAI7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB;IAkC5C,OAAO,CAAC,WAAW;IAmGnB,OAAO,CAAC,kBAAkB;IAmD1B,OAAO,CAAC,QAAQ;IAsDhB,OAAO,CAAC,gBAAgB;CAIxB"}