lonny-agent 0.1.1 → 0.1.8
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/.kilo/plans/1780064105789-mighty-pixel.md +171 -0
- package/.lonny/fix-new-command-session-cleanup.md +65 -0
- package/.lonny/tui-autocomplete-above.md +62 -0
- package/dist/agent/__tests__/compaction.test.js +6 -4
- package/dist/agent/__tests__/compaction.test.js.map +1 -1
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +3 -2
- package/dist/agent/compaction.js.map +1 -1
- package/dist/agent/llm.d.ts +1 -1
- package/dist/agent/llm.d.ts.map +1 -1
- package/dist/agent/prompt-builder.d.ts.map +1 -1
- package/dist/agent/prompt-builder.js +26 -8
- package/dist/agent/prompt-builder.js.map +1 -1
- package/dist/agent/providers/anthropic.d.ts +1 -1
- package/dist/agent/providers/anthropic.d.ts.map +1 -1
- package/dist/agent/providers/anthropic.js +2 -2
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/providers/google.d.ts +1 -1
- package/dist/agent/providers/google.d.ts.map +1 -1
- package/dist/agent/providers/google.js +2 -1
- package/dist/agent/providers/google.js.map +1 -1
- package/dist/agent/providers/ollama.d.ts +1 -1
- package/dist/agent/providers/ollama.d.ts.map +1 -1
- package/dist/agent/providers/ollama.js +2 -1
- package/dist/agent/providers/ollama.js.map +1 -1
- package/dist/agent/providers/openai.d.ts +1 -1
- package/dist/agent/providers/openai.d.ts.map +1 -1
- package/dist/agent/providers/openai.js +2 -2
- package/dist/agent/providers/openai.js.map +1 -1
- package/dist/agent/session.d.ts +5 -1
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +22 -3
- package/dist/agent/session.js.map +1 -1
- package/dist/pi-tui/autocomplete.d.ts +54 -0
- package/dist/pi-tui/autocomplete.d.ts.map +1 -0
- package/dist/pi-tui/autocomplete.js +636 -0
- package/dist/pi-tui/autocomplete.js.map +1 -0
- package/dist/pi-tui/components/box.d.ts +22 -0
- package/dist/pi-tui/components/box.d.ts.map +1 -0
- package/dist/pi-tui/components/box.js +104 -0
- package/dist/pi-tui/components/box.js.map +1 -0
- package/dist/pi-tui/components/cancellable-loader.d.ts +22 -0
- package/dist/pi-tui/components/cancellable-loader.d.ts.map +1 -0
- package/dist/pi-tui/components/cancellable-loader.js +35 -0
- package/dist/pi-tui/components/cancellable-loader.js.map +1 -0
- package/dist/pi-tui/components/editor.d.ts +249 -0
- package/dist/pi-tui/components/editor.d.ts.map +1 -0
- package/dist/pi-tui/components/editor.js +1883 -0
- package/dist/pi-tui/components/editor.js.map +1 -0
- package/dist/pi-tui/components/image.d.ts +28 -0
- package/dist/pi-tui/components/image.d.ts.map +1 -0
- package/dist/pi-tui/components/image.js +90 -0
- package/dist/pi-tui/components/image.js.map +1 -0
- package/dist/pi-tui/components/input.d.ts +37 -0
- package/dist/pi-tui/components/input.d.ts.map +1 -0
- package/dist/pi-tui/components/input.js +382 -0
- package/dist/pi-tui/components/input.js.map +1 -0
- package/dist/pi-tui/components/loader.d.ts +31 -0
- package/dist/pi-tui/components/loader.d.ts.map +1 -0
- package/dist/pi-tui/components/loader.js +70 -0
- package/dist/pi-tui/components/loader.js.map +1 -0
- package/dist/pi-tui/components/markdown.d.ts +96 -0
- package/dist/pi-tui/components/markdown.d.ts.map +1 -0
- package/dist/pi-tui/components/markdown.js +647 -0
- package/dist/pi-tui/components/markdown.js.map +1 -0
- package/dist/pi-tui/components/select-list.d.ts +50 -0
- package/dist/pi-tui/components/select-list.d.ts.map +1 -0
- package/dist/pi-tui/components/select-list.js +167 -0
- package/dist/pi-tui/components/select-list.js.map +1 -0
- package/dist/pi-tui/components/settings-list.d.ts +50 -0
- package/dist/pi-tui/components/settings-list.d.ts.map +1 -0
- package/dist/pi-tui/components/settings-list.js +189 -0
- package/dist/pi-tui/components/settings-list.js.map +1 -0
- package/dist/pi-tui/components/spacer.d.ts +12 -0
- package/dist/pi-tui/components/spacer.d.ts.map +1 -0
- package/dist/pi-tui/components/spacer.js +23 -0
- package/dist/pi-tui/components/spacer.js.map +1 -0
- package/dist/pi-tui/components/text.d.ts +19 -0
- package/dist/pi-tui/components/text.d.ts.map +1 -0
- package/dist/pi-tui/components/text.js +91 -0
- package/dist/pi-tui/components/text.js.map +1 -0
- package/dist/pi-tui/components/truncated-text.d.ts +13 -0
- package/dist/pi-tui/components/truncated-text.d.ts.map +1 -0
- package/dist/pi-tui/components/truncated-text.js +51 -0
- package/dist/pi-tui/components/truncated-text.js.map +1 -0
- package/dist/pi-tui/editor-component.d.ts +39 -0
- package/dist/pi-tui/editor-component.d.ts.map +1 -0
- package/dist/pi-tui/editor-component.js +2 -0
- package/dist/pi-tui/editor-component.js.map +1 -0
- package/dist/pi-tui/fuzzy.d.ts +16 -0
- package/dist/pi-tui/fuzzy.d.ts.map +1 -0
- package/dist/pi-tui/fuzzy.js +110 -0
- package/dist/pi-tui/fuzzy.js.map +1 -0
- package/dist/pi-tui/index.d.ts +23 -0
- package/dist/pi-tui/index.d.ts.map +1 -0
- package/dist/pi-tui/index.js +32 -0
- package/dist/pi-tui/index.js.map +1 -0
- package/dist/pi-tui/keybindings.d.ts +193 -0
- package/dist/pi-tui/keybindings.d.ts.map +1 -0
- package/dist/pi-tui/keybindings.js +174 -0
- package/dist/pi-tui/keybindings.js.map +1 -0
- package/dist/pi-tui/keys.d.ts +184 -0
- package/dist/pi-tui/keys.d.ts.map +1 -0
- package/dist/pi-tui/keys.js +1182 -0
- package/dist/pi-tui/keys.js.map +1 -0
- package/dist/pi-tui/kill-ring.d.ts +28 -0
- package/dist/pi-tui/kill-ring.d.ts.map +1 -0
- package/dist/pi-tui/kill-ring.js +44 -0
- package/dist/pi-tui/kill-ring.js.map +1 -0
- package/dist/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/dist/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/dist/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/dist/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/dist/pi-tui/native-modifiers.d.ts +3 -0
- package/dist/pi-tui/native-modifiers.d.ts.map +1 -0
- package/dist/pi-tui/native-modifiers.js +53 -0
- package/dist/pi-tui/native-modifiers.js.map +1 -0
- package/dist/pi-tui/stdin-buffer.d.ts +50 -0
- package/dist/pi-tui/stdin-buffer.d.ts.map +1 -0
- package/dist/pi-tui/stdin-buffer.js +361 -0
- package/dist/pi-tui/stdin-buffer.js.map +1 -0
- package/dist/pi-tui/terminal-image.d.ts +90 -0
- package/dist/pi-tui/terminal-image.d.ts.map +1 -0
- package/dist/pi-tui/terminal-image.js +343 -0
- package/dist/pi-tui/terminal-image.js.map +1 -0
- package/dist/pi-tui/terminal.d.ts +113 -0
- package/dist/pi-tui/terminal.d.ts.map +1 -0
- package/dist/pi-tui/terminal.js +478 -0
- package/dist/pi-tui/terminal.js.map +1 -0
- package/dist/pi-tui/tui.d.ts +227 -0
- package/dist/pi-tui/tui.d.ts.map +1 -0
- package/dist/pi-tui/tui.js +1091 -0
- package/dist/pi-tui/tui.js.map +1 -0
- package/dist/pi-tui/undo-stack.d.ts +17 -0
- package/dist/pi-tui/undo-stack.d.ts.map +1 -0
- package/dist/pi-tui/undo-stack.js +25 -0
- package/dist/pi-tui/undo-stack.js.map +1 -0
- package/dist/pi-tui/utils.d.ts +84 -0
- package/dist/pi-tui/utils.d.ts.map +1 -0
- package/dist/pi-tui/utils.js +1024 -0
- package/dist/pi-tui/utils.js.map +1 -0
- package/dist/pi-tui/word-navigation.d.ts +25 -0
- package/dist/pi-tui/word-navigation.d.ts.map +1 -0
- package/dist/pi-tui/word-navigation.js +98 -0
- package/dist/pi-tui/word-navigation.js.map +1 -0
- package/dist/tools/__tests__/edit.test.js +85 -0
- package/dist/tools/__tests__/edit.test.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +23 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +15 -7
- package/dist/tools/registry.js.map +1 -1
- package/dist/tui/components.d.ts +1 -1
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +1 -1
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/editor-patch.d.ts +13 -0
- package/dist/tui/editor-patch.d.ts.map +1 -0
- package/dist/tui/editor-patch.js +41 -0
- package/dist/tui/editor-patch.js.map +1 -0
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +15 -3
- package/dist/tui/index.js.map +1 -1
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +11 -2
- package/dist/web/index.js.map +1 -1
- package/dist/web/public/app.js +65 -4
- package/dist/web/public/style.css +49 -0
- package/dist/web/session-bridge.d.ts +0 -4
- package/dist/web/session-bridge.d.ts.map +1 -1
- package/dist/web/session-bridge.js +16 -2
- package/dist/web/session-bridge.js.map +1 -1
- package/package.json +5 -3
- package/src/agent/__tests__/compaction.test.ts +6 -4
- package/src/agent/compaction.ts +3 -2
- package/src/agent/llm.ts +5 -1
- package/src/agent/prompt-builder.ts +27 -8
- package/src/agent/providers/anthropic.ts +15 -8
- package/src/agent/providers/google.ts +6 -1
- package/src/agent/providers/ollama.ts +6 -1
- package/src/agent/providers/openai.ts +21 -12
- package/src/agent/session.ts +26 -3
- package/src/pi-tui/autocomplete.ts +808 -0
- package/src/pi-tui/components/box.ts +137 -0
- package/src/pi-tui/components/cancellable-loader.ts +40 -0
- package/src/pi-tui/components/editor.ts +2321 -0
- package/src/pi-tui/components/image.ts +130 -0
- package/src/pi-tui/components/input.ts +456 -0
- package/src/pi-tui/components/loader.ts +93 -0
- package/src/pi-tui/components/markdown.ts +839 -0
- package/src/pi-tui/components/select-list.ts +263 -0
- package/src/pi-tui/components/settings-list.ts +264 -0
- package/src/pi-tui/components/spacer.ts +28 -0
- package/src/pi-tui/components/text.ts +113 -0
- package/src/pi-tui/components/truncated-text.ts +65 -0
- package/src/pi-tui/editor-component.ts +74 -0
- package/src/pi-tui/fuzzy.ts +137 -0
- package/src/pi-tui/index.ts +115 -0
- package/src/pi-tui/keybindings.ts +245 -0
- package/src/pi-tui/keys.ts +1440 -0
- package/src/pi-tui/kill-ring.ts +46 -0
- package/src/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/src/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/src/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/src/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/src/pi-tui/native-modifiers.ts +65 -0
- package/src/pi-tui/stdin-buffer.ts +434 -0
- package/src/pi-tui/terminal-image.ts +469 -0
- package/src/pi-tui/terminal.ts +594 -0
- package/src/pi-tui/tui.ts +1376 -0
- package/src/pi-tui/undo-stack.ts +28 -0
- package/src/pi-tui/utils.ts +1176 -0
- package/src/pi-tui/word-navigation.ts +127 -0
- package/src/tools/__tests__/edit.test.ts +91 -0
- package/src/tools/edit.ts +27 -1
- package/src/tools/registry.ts +18 -8
- package/src/tui/components.ts +2 -2
- package/src/tui/index.ts +24 -10
- package/src/web/index.ts +11 -2
- package/src/web/public/app.js +65 -4
- package/src/web/public/style.css +49 -0
- package/src/web/session-bridge.ts +13 -2
- package/tsconfig.json +2 -2
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { getKeybindings } from '../keybindings.js';
|
|
2
|
+
import { decodeKittyPrintable } from '../keys.js';
|
|
3
|
+
import { KillRing } from '../kill-ring.js';
|
|
4
|
+
import { CURSOR_MARKER } from '../tui.js';
|
|
5
|
+
import { UndoStack } from '../undo-stack.js';
|
|
6
|
+
import { getGraphemeSegmenter, isWhitespaceChar, sliceByColumn, visibleWidth } from '../utils.js';
|
|
7
|
+
import { findWordBackward, findWordForward } from '../word-navigation.js';
|
|
8
|
+
const segmenter = getGraphemeSegmenter();
|
|
9
|
+
/**
|
|
10
|
+
* Input component - single-line text input with horizontal scrolling
|
|
11
|
+
*/
|
|
12
|
+
export class Input {
|
|
13
|
+
value = '';
|
|
14
|
+
cursor = 0; // Cursor position in the value
|
|
15
|
+
onSubmit;
|
|
16
|
+
onEscape;
|
|
17
|
+
/** Focusable interface - set by TUI when focus changes */
|
|
18
|
+
focused = false;
|
|
19
|
+
// Bracketed paste mode buffering
|
|
20
|
+
pasteBuffer = '';
|
|
21
|
+
isInPaste = false;
|
|
22
|
+
// Kill ring for Emacs-style kill/yank operations
|
|
23
|
+
killRing = new KillRing();
|
|
24
|
+
lastAction = null;
|
|
25
|
+
// Undo support
|
|
26
|
+
undoStack = new UndoStack();
|
|
27
|
+
getValue() {
|
|
28
|
+
return this.value;
|
|
29
|
+
}
|
|
30
|
+
setValue(value) {
|
|
31
|
+
this.value = value;
|
|
32
|
+
this.cursor = Math.min(this.cursor, value.length);
|
|
33
|
+
}
|
|
34
|
+
handleInput(data) {
|
|
35
|
+
// Handle bracketed paste mode
|
|
36
|
+
// Start of paste: \x1b[200~
|
|
37
|
+
// End of paste: \x1b[201~
|
|
38
|
+
// Check if we're starting a bracketed paste
|
|
39
|
+
if (data.includes('\x1b[200~')) {
|
|
40
|
+
this.isInPaste = true;
|
|
41
|
+
this.pasteBuffer = '';
|
|
42
|
+
data = data.replace('\x1b[200~', '');
|
|
43
|
+
}
|
|
44
|
+
// If we're in a paste, buffer the data
|
|
45
|
+
if (this.isInPaste) {
|
|
46
|
+
// Check if this chunk contains the end marker
|
|
47
|
+
this.pasteBuffer += data;
|
|
48
|
+
const endIndex = this.pasteBuffer.indexOf('\x1b[201~');
|
|
49
|
+
if (endIndex !== -1) {
|
|
50
|
+
// Extract the pasted content
|
|
51
|
+
const pasteContent = this.pasteBuffer.substring(0, endIndex);
|
|
52
|
+
// Process the complete paste
|
|
53
|
+
this.handlePaste(pasteContent);
|
|
54
|
+
// Reset paste state
|
|
55
|
+
this.isInPaste = false;
|
|
56
|
+
// Handle any remaining input after the paste marker
|
|
57
|
+
const remaining = this.pasteBuffer.substring(endIndex + 6); // 6 = length of \x1b[201~
|
|
58
|
+
this.pasteBuffer = '';
|
|
59
|
+
if (remaining) {
|
|
60
|
+
this.handleInput(remaining);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const kb = getKeybindings();
|
|
66
|
+
// Escape/Cancel
|
|
67
|
+
if (kb.matches(data, 'tui.select.cancel')) {
|
|
68
|
+
if (this.onEscape)
|
|
69
|
+
this.onEscape();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Undo
|
|
73
|
+
if (kb.matches(data, 'tui.editor.undo')) {
|
|
74
|
+
this.undo();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Submit
|
|
78
|
+
if (kb.matches(data, 'tui.input.submit') || data === '\n') {
|
|
79
|
+
if (this.onSubmit)
|
|
80
|
+
this.onSubmit(this.value);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Deletion
|
|
84
|
+
if (kb.matches(data, 'tui.editor.deleteCharBackward')) {
|
|
85
|
+
this.handleBackspace();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (kb.matches(data, 'tui.editor.deleteCharForward')) {
|
|
89
|
+
this.handleForwardDelete();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (kb.matches(data, 'tui.editor.deleteWordBackward')) {
|
|
93
|
+
this.deleteWordBackwards();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (kb.matches(data, 'tui.editor.deleteWordForward')) {
|
|
97
|
+
this.deleteWordForward();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (kb.matches(data, 'tui.editor.deleteToLineStart')) {
|
|
101
|
+
this.deleteToLineStart();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (kb.matches(data, 'tui.editor.deleteToLineEnd')) {
|
|
105
|
+
this.deleteToLineEnd();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Kill ring actions
|
|
109
|
+
if (kb.matches(data, 'tui.editor.yank')) {
|
|
110
|
+
this.yank();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (kb.matches(data, 'tui.editor.yankPop')) {
|
|
114
|
+
this.yankPop();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Cursor movement
|
|
118
|
+
if (kb.matches(data, 'tui.editor.cursorLeft')) {
|
|
119
|
+
this.lastAction = null;
|
|
120
|
+
if (this.cursor > 0) {
|
|
121
|
+
const beforeCursor = this.value.slice(0, this.cursor);
|
|
122
|
+
const graphemes = [...segmenter.segment(beforeCursor)];
|
|
123
|
+
const lastGrapheme = graphemes[graphemes.length - 1];
|
|
124
|
+
this.cursor -= lastGrapheme ? lastGrapheme.segment.length : 1;
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (kb.matches(data, 'tui.editor.cursorRight')) {
|
|
129
|
+
this.lastAction = null;
|
|
130
|
+
if (this.cursor < this.value.length) {
|
|
131
|
+
const afterCursor = this.value.slice(this.cursor);
|
|
132
|
+
const graphemes = [...segmenter.segment(afterCursor)];
|
|
133
|
+
const firstGrapheme = graphemes[0];
|
|
134
|
+
this.cursor += firstGrapheme ? firstGrapheme.segment.length : 1;
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (kb.matches(data, 'tui.editor.cursorLineStart')) {
|
|
139
|
+
this.lastAction = null;
|
|
140
|
+
this.cursor = 0;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (kb.matches(data, 'tui.editor.cursorLineEnd')) {
|
|
144
|
+
this.lastAction = null;
|
|
145
|
+
this.cursor = this.value.length;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (kb.matches(data, 'tui.editor.cursorWordLeft')) {
|
|
149
|
+
this.moveWordBackwards();
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (kb.matches(data, 'tui.editor.cursorWordRight')) {
|
|
153
|
+
this.moveWordForwards();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Kitty CSI-u printable character (e.g. \x1b[97u for 'a').
|
|
157
|
+
// Terminals with Kitty protocol flag 1 (disambiguate) send CSI-u for all keys,
|
|
158
|
+
// including plain printable characters. Decode before the control-char check
|
|
159
|
+
// since CSI-u sequences contain \x1b which would be rejected.
|
|
160
|
+
const kittyPrintable = decodeKittyPrintable(data);
|
|
161
|
+
if (kittyPrintable !== undefined) {
|
|
162
|
+
this.insertCharacter(kittyPrintable);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// Regular character input - accept printable characters including Unicode,
|
|
166
|
+
// but reject control characters (C0: 0x00-0x1F, DEL: 0x7F, C1: 0x80-0x9F)
|
|
167
|
+
const hasControlChars = [...data].some(ch => {
|
|
168
|
+
const code = ch.charCodeAt(0);
|
|
169
|
+
return code < 32 || code === 0x7f || (code >= 0x80 && code <= 0x9f);
|
|
170
|
+
});
|
|
171
|
+
if (!hasControlChars) {
|
|
172
|
+
this.insertCharacter(data);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
insertCharacter(char) {
|
|
176
|
+
// Undo coalescing: consecutive word chars coalesce into one undo unit
|
|
177
|
+
if (isWhitespaceChar(char) || this.lastAction !== 'type-word') {
|
|
178
|
+
this.pushUndo();
|
|
179
|
+
}
|
|
180
|
+
this.lastAction = 'type-word';
|
|
181
|
+
this.value = this.value.slice(0, this.cursor) + char + this.value.slice(this.cursor);
|
|
182
|
+
this.cursor += char.length;
|
|
183
|
+
}
|
|
184
|
+
handleBackspace() {
|
|
185
|
+
this.lastAction = null;
|
|
186
|
+
if (this.cursor > 0) {
|
|
187
|
+
this.pushUndo();
|
|
188
|
+
const beforeCursor = this.value.slice(0, this.cursor);
|
|
189
|
+
const graphemes = [...segmenter.segment(beforeCursor)];
|
|
190
|
+
const lastGrapheme = graphemes[graphemes.length - 1];
|
|
191
|
+
const graphemeLength = lastGrapheme ? lastGrapheme.segment.length : 1;
|
|
192
|
+
this.value = this.value.slice(0, this.cursor - graphemeLength) + this.value.slice(this.cursor);
|
|
193
|
+
this.cursor -= graphemeLength;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
handleForwardDelete() {
|
|
197
|
+
this.lastAction = null;
|
|
198
|
+
if (this.cursor < this.value.length) {
|
|
199
|
+
this.pushUndo();
|
|
200
|
+
const afterCursor = this.value.slice(this.cursor);
|
|
201
|
+
const graphemes = [...segmenter.segment(afterCursor)];
|
|
202
|
+
const firstGrapheme = graphemes[0];
|
|
203
|
+
const graphemeLength = firstGrapheme ? firstGrapheme.segment.length : 1;
|
|
204
|
+
this.value = this.value.slice(0, this.cursor) + this.value.slice(this.cursor + graphemeLength);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
deleteToLineStart() {
|
|
208
|
+
if (this.cursor === 0)
|
|
209
|
+
return;
|
|
210
|
+
this.pushUndo();
|
|
211
|
+
const deletedText = this.value.slice(0, this.cursor);
|
|
212
|
+
this.killRing.push(deletedText, { prepend: true, accumulate: this.lastAction === 'kill' });
|
|
213
|
+
this.lastAction = 'kill';
|
|
214
|
+
this.value = this.value.slice(this.cursor);
|
|
215
|
+
this.cursor = 0;
|
|
216
|
+
}
|
|
217
|
+
deleteToLineEnd() {
|
|
218
|
+
if (this.cursor >= this.value.length)
|
|
219
|
+
return;
|
|
220
|
+
this.pushUndo();
|
|
221
|
+
const deletedText = this.value.slice(this.cursor);
|
|
222
|
+
this.killRing.push(deletedText, { prepend: false, accumulate: this.lastAction === 'kill' });
|
|
223
|
+
this.lastAction = 'kill';
|
|
224
|
+
this.value = this.value.slice(0, this.cursor);
|
|
225
|
+
}
|
|
226
|
+
deleteWordBackwards() {
|
|
227
|
+
if (this.cursor === 0)
|
|
228
|
+
return;
|
|
229
|
+
// Save lastAction before cursor movement (moveWordBackwards resets it)
|
|
230
|
+
const wasKill = this.lastAction === 'kill';
|
|
231
|
+
this.pushUndo();
|
|
232
|
+
const oldCursor = this.cursor;
|
|
233
|
+
this.moveWordBackwards();
|
|
234
|
+
const deleteFrom = this.cursor;
|
|
235
|
+
this.cursor = oldCursor;
|
|
236
|
+
const deletedText = this.value.slice(deleteFrom, this.cursor);
|
|
237
|
+
this.killRing.push(deletedText, { prepend: true, accumulate: wasKill });
|
|
238
|
+
this.lastAction = 'kill';
|
|
239
|
+
this.value = this.value.slice(0, deleteFrom) + this.value.slice(this.cursor);
|
|
240
|
+
this.cursor = deleteFrom;
|
|
241
|
+
}
|
|
242
|
+
deleteWordForward() {
|
|
243
|
+
if (this.cursor >= this.value.length)
|
|
244
|
+
return;
|
|
245
|
+
// Save lastAction before cursor movement (moveWordForwards resets it)
|
|
246
|
+
const wasKill = this.lastAction === 'kill';
|
|
247
|
+
this.pushUndo();
|
|
248
|
+
const oldCursor = this.cursor;
|
|
249
|
+
this.moveWordForwards();
|
|
250
|
+
const deleteTo = this.cursor;
|
|
251
|
+
this.cursor = oldCursor;
|
|
252
|
+
const deletedText = this.value.slice(this.cursor, deleteTo);
|
|
253
|
+
this.killRing.push(deletedText, { prepend: false, accumulate: wasKill });
|
|
254
|
+
this.lastAction = 'kill';
|
|
255
|
+
this.value = this.value.slice(0, this.cursor) + this.value.slice(deleteTo);
|
|
256
|
+
}
|
|
257
|
+
yank() {
|
|
258
|
+
const text = this.killRing.peek();
|
|
259
|
+
if (!text)
|
|
260
|
+
return;
|
|
261
|
+
this.pushUndo();
|
|
262
|
+
this.value = this.value.slice(0, this.cursor) + text + this.value.slice(this.cursor);
|
|
263
|
+
this.cursor += text.length;
|
|
264
|
+
this.lastAction = 'yank';
|
|
265
|
+
}
|
|
266
|
+
yankPop() {
|
|
267
|
+
if (this.lastAction !== 'yank' || this.killRing.length <= 1)
|
|
268
|
+
return;
|
|
269
|
+
this.pushUndo();
|
|
270
|
+
// Delete the previously yanked text (still at end of ring before rotation)
|
|
271
|
+
const prevText = this.killRing.peek() || '';
|
|
272
|
+
this.value = this.value.slice(0, this.cursor - prevText.length) + this.value.slice(this.cursor);
|
|
273
|
+
this.cursor -= prevText.length;
|
|
274
|
+
// Rotate and insert new entry
|
|
275
|
+
this.killRing.rotate();
|
|
276
|
+
const text = this.killRing.peek() || '';
|
|
277
|
+
this.value = this.value.slice(0, this.cursor) + text + this.value.slice(this.cursor);
|
|
278
|
+
this.cursor += text.length;
|
|
279
|
+
this.lastAction = 'yank';
|
|
280
|
+
}
|
|
281
|
+
pushUndo() {
|
|
282
|
+
this.undoStack.push({ value: this.value, cursor: this.cursor });
|
|
283
|
+
}
|
|
284
|
+
undo() {
|
|
285
|
+
const snapshot = this.undoStack.pop();
|
|
286
|
+
if (!snapshot)
|
|
287
|
+
return;
|
|
288
|
+
this.value = snapshot.value;
|
|
289
|
+
this.cursor = snapshot.cursor;
|
|
290
|
+
this.lastAction = null;
|
|
291
|
+
}
|
|
292
|
+
moveWordBackwards() {
|
|
293
|
+
if (this.cursor === 0)
|
|
294
|
+
return;
|
|
295
|
+
this.lastAction = null;
|
|
296
|
+
this.cursor = findWordBackward(this.value, this.cursor);
|
|
297
|
+
}
|
|
298
|
+
moveWordForwards() {
|
|
299
|
+
if (this.cursor >= this.value.length)
|
|
300
|
+
return;
|
|
301
|
+
this.lastAction = null;
|
|
302
|
+
this.cursor = findWordForward(this.value, this.cursor);
|
|
303
|
+
}
|
|
304
|
+
handlePaste(pastedText) {
|
|
305
|
+
this.lastAction = null;
|
|
306
|
+
this.pushUndo();
|
|
307
|
+
// Clean the pasted text - remove newlines and carriage returns
|
|
308
|
+
const cleanText = pastedText
|
|
309
|
+
.replace(/\r\n/g, '')
|
|
310
|
+
.replace(/\r/g, '')
|
|
311
|
+
.replace(/\n/g, '')
|
|
312
|
+
.replace(/\t/g, ' ');
|
|
313
|
+
// Insert at cursor position
|
|
314
|
+
this.value = this.value.slice(0, this.cursor) + cleanText + this.value.slice(this.cursor);
|
|
315
|
+
this.cursor += cleanText.length;
|
|
316
|
+
}
|
|
317
|
+
invalidate() {
|
|
318
|
+
// No cached state to invalidate currently
|
|
319
|
+
}
|
|
320
|
+
render(width) {
|
|
321
|
+
// Calculate visible window
|
|
322
|
+
const prompt = '> ';
|
|
323
|
+
const availableWidth = width - prompt.length;
|
|
324
|
+
if (availableWidth <= 0) {
|
|
325
|
+
return [prompt];
|
|
326
|
+
}
|
|
327
|
+
let visibleText = '';
|
|
328
|
+
let cursorDisplay = this.cursor;
|
|
329
|
+
const totalWidth = visibleWidth(this.value);
|
|
330
|
+
if (totalWidth < availableWidth) {
|
|
331
|
+
// Everything fits (leave room for cursor at end)
|
|
332
|
+
visibleText = this.value;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
// Need horizontal scrolling
|
|
336
|
+
// Reserve one column for cursor if it's at the end
|
|
337
|
+
const scrollWidth = this.cursor === this.value.length ? availableWidth - 1 : availableWidth;
|
|
338
|
+
const cursorCol = visibleWidth(this.value.slice(0, this.cursor));
|
|
339
|
+
if (scrollWidth > 0) {
|
|
340
|
+
const halfWidth = Math.floor(scrollWidth / 2);
|
|
341
|
+
let startCol = 0;
|
|
342
|
+
if (cursorCol < halfWidth) {
|
|
343
|
+
// Cursor near start
|
|
344
|
+
startCol = 0;
|
|
345
|
+
}
|
|
346
|
+
else if (cursorCol > totalWidth - halfWidth) {
|
|
347
|
+
// Cursor near end
|
|
348
|
+
startCol = Math.max(0, totalWidth - scrollWidth);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
// Cursor in middle
|
|
352
|
+
startCol = Math.max(0, cursorCol - halfWidth);
|
|
353
|
+
}
|
|
354
|
+
visibleText = sliceByColumn(this.value, startCol, scrollWidth, true);
|
|
355
|
+
const beforeCursor = sliceByColumn(this.value, startCol, Math.max(0, cursorCol - startCol), true);
|
|
356
|
+
cursorDisplay = beforeCursor.length;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
visibleText = '';
|
|
360
|
+
cursorDisplay = 0;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Build line with fake cursor
|
|
364
|
+
// Insert cursor character at cursor position
|
|
365
|
+
const graphemes = [...segmenter.segment(visibleText.slice(cursorDisplay))];
|
|
366
|
+
const cursorGrapheme = graphemes[0];
|
|
367
|
+
const beforeCursor = visibleText.slice(0, cursorDisplay);
|
|
368
|
+
const atCursor = cursorGrapheme?.segment ?? ' '; // Character at cursor, or space if at end
|
|
369
|
+
const afterCursor = visibleText.slice(cursorDisplay + atCursor.length);
|
|
370
|
+
// Hardware cursor marker (zero-width, emitted before fake cursor for IME positioning)
|
|
371
|
+
const marker = this.focused ? CURSOR_MARKER : '';
|
|
372
|
+
// Use inverse video to show cursor
|
|
373
|
+
const cursorChar = `\x1b[7m${atCursor}\x1b[27m`; // ESC[7m = reverse video, ESC[27m = normal
|
|
374
|
+
const textWithCursor = beforeCursor + marker + cursorChar + afterCursor;
|
|
375
|
+
// Calculate visual width
|
|
376
|
+
const visualLength = visibleWidth(textWithCursor);
|
|
377
|
+
const padding = ' '.repeat(Math.max(0, availableWidth - visualLength));
|
|
378
|
+
const line = prompt + textWithCursor + padding;
|
|
379
|
+
return [line];
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/pi-tui/components/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { TUI } from '../tui.js';
|
|
2
|
+
import { Text } from './text.js';
|
|
3
|
+
export interface LoaderIndicatorOptions {
|
|
4
|
+
/** Animation frames. Use an empty array to hide the indicator. */
|
|
5
|
+
frames?: string[];
|
|
6
|
+
/** Frame interval in milliseconds for animated indicators. */
|
|
7
|
+
intervalMs?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Loader component that updates with an optional spinning animation.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Loader extends Text {
|
|
13
|
+
private frames;
|
|
14
|
+
private intervalMs;
|
|
15
|
+
private currentFrame;
|
|
16
|
+
private intervalId;
|
|
17
|
+
private ui;
|
|
18
|
+
private renderIndicatorVerbatim;
|
|
19
|
+
private spinnerColorFn;
|
|
20
|
+
private messageColorFn;
|
|
21
|
+
private message;
|
|
22
|
+
constructor(ui: TUI, spinnerColorFn: (str: string) => string, messageColorFn: (str: string) => string, message?: string, indicator?: LoaderIndicatorOptions);
|
|
23
|
+
render(width: number): string[];
|
|
24
|
+
start(): void;
|
|
25
|
+
stop(): void;
|
|
26
|
+
setMessage(message: string): void;
|
|
27
|
+
setIndicator(indicator?: LoaderIndicatorOptions): void;
|
|
28
|
+
private restartAnimation;
|
|
29
|
+
private updateDisplay;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/pi-tui/components/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAKD;;GAEG;AACH,qBAAa,MAAO,SAAQ,IAAI;IAC9B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,OAAO,CAAuB;gBAGpC,EAAE,EAAE,GAAG,EACP,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,OAAO,GAAE,MAAqB,EAC9B,SAAS,CAAC,EAAE,sBAAsB;IAUpC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAOZ,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKjC,YAAY,CAAC,SAAS,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAStD,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,aAAa;CAStB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Text } from './text.js';
|
|
2
|
+
const DEFAULT_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
3
|
+
const DEFAULT_INTERVAL_MS = 80;
|
|
4
|
+
/**
|
|
5
|
+
* Loader component that updates with an optional spinning animation.
|
|
6
|
+
*/
|
|
7
|
+
export class Loader extends Text {
|
|
8
|
+
frames = [...DEFAULT_FRAMES];
|
|
9
|
+
intervalMs = DEFAULT_INTERVAL_MS;
|
|
10
|
+
currentFrame = 0;
|
|
11
|
+
intervalId = null;
|
|
12
|
+
ui = null;
|
|
13
|
+
renderIndicatorVerbatim = false;
|
|
14
|
+
spinnerColorFn;
|
|
15
|
+
messageColorFn;
|
|
16
|
+
message = 'Loading...';
|
|
17
|
+
constructor(ui, spinnerColorFn, messageColorFn, message = 'Loading...', indicator) {
|
|
18
|
+
super('', 1, 0);
|
|
19
|
+
this.ui = ui;
|
|
20
|
+
this.spinnerColorFn = spinnerColorFn;
|
|
21
|
+
this.messageColorFn = messageColorFn;
|
|
22
|
+
this.message = message;
|
|
23
|
+
this.setIndicator(indicator);
|
|
24
|
+
}
|
|
25
|
+
render(width) {
|
|
26
|
+
return ['', ...super.render(width)];
|
|
27
|
+
}
|
|
28
|
+
start() {
|
|
29
|
+
this.updateDisplay();
|
|
30
|
+
this.restartAnimation();
|
|
31
|
+
}
|
|
32
|
+
stop() {
|
|
33
|
+
if (this.intervalId) {
|
|
34
|
+
clearInterval(this.intervalId);
|
|
35
|
+
this.intervalId = null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
setMessage(message) {
|
|
39
|
+
this.message = message;
|
|
40
|
+
this.updateDisplay();
|
|
41
|
+
}
|
|
42
|
+
setIndicator(indicator) {
|
|
43
|
+
this.renderIndicatorVerbatim = indicator !== undefined;
|
|
44
|
+
this.frames = indicator?.frames !== undefined ? [...indicator.frames] : [...DEFAULT_FRAMES];
|
|
45
|
+
this.intervalMs =
|
|
46
|
+
indicator?.intervalMs && indicator.intervalMs > 0 ? indicator.intervalMs : DEFAULT_INTERVAL_MS;
|
|
47
|
+
this.currentFrame = 0;
|
|
48
|
+
this.start();
|
|
49
|
+
}
|
|
50
|
+
restartAnimation() {
|
|
51
|
+
this.stop();
|
|
52
|
+
if (this.frames.length <= 1) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.intervalId = setInterval(() => {
|
|
56
|
+
this.currentFrame = (this.currentFrame + 1) % this.frames.length;
|
|
57
|
+
this.updateDisplay();
|
|
58
|
+
}, this.intervalMs);
|
|
59
|
+
}
|
|
60
|
+
updateDisplay() {
|
|
61
|
+
const frame = this.frames[this.currentFrame] ?? '';
|
|
62
|
+
const renderedFrame = this.renderIndicatorVerbatim ? frame : this.spinnerColorFn(frame);
|
|
63
|
+
const indicator = frame.length > 0 ? `${renderedFrame} ` : '';
|
|
64
|
+
this.setText(`${indicator}${this.messageColorFn(this.message)}`);
|
|
65
|
+
if (this.ui) {
|
|
66
|
+
this.ui.requestRender();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/pi-tui/components/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Component } from '../tui.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default text styling for markdown content.
|
|
4
|
+
* Applied to all text unless overridden by markdown formatting.
|
|
5
|
+
*/
|
|
6
|
+
export interface DefaultTextStyle {
|
|
7
|
+
/** Foreground color function */
|
|
8
|
+
color?: (text: string) => string;
|
|
9
|
+
/** Background color function */
|
|
10
|
+
bgColor?: (text: string) => string;
|
|
11
|
+
/** Bold text */
|
|
12
|
+
bold?: boolean;
|
|
13
|
+
/** Italic text */
|
|
14
|
+
italic?: boolean;
|
|
15
|
+
/** Strikethrough text */
|
|
16
|
+
strikethrough?: boolean;
|
|
17
|
+
/** Underline text */
|
|
18
|
+
underline?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Theme functions for markdown elements.
|
|
22
|
+
* Each function takes text and returns styled text with ANSI codes.
|
|
23
|
+
*/
|
|
24
|
+
export interface MarkdownTheme {
|
|
25
|
+
heading: (text: string) => string;
|
|
26
|
+
link: (text: string) => string;
|
|
27
|
+
linkUrl: (text: string) => string;
|
|
28
|
+
code: (text: string) => string;
|
|
29
|
+
codeBlock: (text: string) => string;
|
|
30
|
+
codeBlockBorder: (text: string) => string;
|
|
31
|
+
quote: (text: string) => string;
|
|
32
|
+
quoteBorder: (text: string) => string;
|
|
33
|
+
hr: (text: string) => string;
|
|
34
|
+
listBullet: (text: string) => string;
|
|
35
|
+
bold: (text: string) => string;
|
|
36
|
+
italic: (text: string) => string;
|
|
37
|
+
strikethrough: (text: string) => string;
|
|
38
|
+
underline: (text: string) => string;
|
|
39
|
+
highlightCode?: (code: string, lang?: string) => string[];
|
|
40
|
+
/** Prefix applied to each rendered code block line (default: " ") */
|
|
41
|
+
codeBlockIndent?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface MarkdownOptions {
|
|
44
|
+
/** Preserve source ordered-list markers instead of normalizing them from the list start. */
|
|
45
|
+
preserveOrderedListMarkers?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare class Markdown implements Component {
|
|
48
|
+
private text;
|
|
49
|
+
private paddingX;
|
|
50
|
+
private paddingY;
|
|
51
|
+
private defaultTextStyle?;
|
|
52
|
+
private theme;
|
|
53
|
+
private options;
|
|
54
|
+
private defaultStylePrefix?;
|
|
55
|
+
private cachedText?;
|
|
56
|
+
private cachedWidth?;
|
|
57
|
+
private cachedLines?;
|
|
58
|
+
constructor(text: string, paddingX: number, paddingY: number, theme: MarkdownTheme, defaultTextStyle?: DefaultTextStyle, options?: MarkdownOptions);
|
|
59
|
+
setText(text: string): void;
|
|
60
|
+
invalidate(): void;
|
|
61
|
+
render(width: number): string[];
|
|
62
|
+
/**
|
|
63
|
+
* Apply default text style to a string.
|
|
64
|
+
* This is the base styling applied to all text content.
|
|
65
|
+
* NOTE: Background color is NOT applied here - it's applied at the padding stage
|
|
66
|
+
* to ensure it extends to the full line width.
|
|
67
|
+
*/
|
|
68
|
+
private applyDefaultStyle;
|
|
69
|
+
private getDefaultStylePrefix;
|
|
70
|
+
private getStylePrefix;
|
|
71
|
+
private getDefaultInlineStyleContext;
|
|
72
|
+
private renderToken;
|
|
73
|
+
private renderInlineTokens;
|
|
74
|
+
private getOrderedListMarker;
|
|
75
|
+
/**
|
|
76
|
+
* Render a list with proper nesting support
|
|
77
|
+
*/
|
|
78
|
+
private renderList;
|
|
79
|
+
/**
|
|
80
|
+
* Get the visible width of the longest word in a string.
|
|
81
|
+
*/
|
|
82
|
+
private getLongestWordWidth;
|
|
83
|
+
/**
|
|
84
|
+
* Wrap a table cell to fit into a column.
|
|
85
|
+
*
|
|
86
|
+
* Delegates to wrapTextWithAnsi() so ANSI codes + long tokens are handled
|
|
87
|
+
* consistently with the rest of the renderer.
|
|
88
|
+
*/
|
|
89
|
+
private wrapCellText;
|
|
90
|
+
/**
|
|
91
|
+
* Render a table with width-aware cell wrapping.
|
|
92
|
+
* Cells that don't fit are wrapped to multiple lines.
|
|
93
|
+
*/
|
|
94
|
+
private renderTable;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/pi-tui/components/markdown.ts"],"names":[],"mappings":"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"}
|