centaurus-cli 2.8.5 → 2.8.7
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/cli-adapter.d.ts +85 -0
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +769 -28
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/slash-commands.d.ts +2 -0
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +31 -1
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.d.ts +16 -1
- package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
- package/dist/context/handlers/ssh-handler.js +57 -12
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/subshell-handler.d.ts +14 -0
- package/dist/context/subshell-handler.d.ts.map +1 -1
- package/dist/hooks/useTerminalDimensions.d.ts +41 -0
- package/dist/hooks/useTerminalDimensions.d.ts.map +1 -0
- package/dist/hooks/useTerminalDimensions.js +84 -0
- package/dist/hooks/useTerminalDimensions.js.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/services/api-client.d.ts +24 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +27 -0
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/auth-handler.js +1 -1
- package/dist/services/auth-handler.js.map +1 -1
- package/dist/services/clipboard-service.d.ts +42 -0
- package/dist/services/clipboard-service.d.ts.map +1 -0
- package/dist/services/clipboard-service.js +217 -0
- package/dist/services/clipboard-service.js.map +1 -0
- package/dist/services/local-chat-storage.d.ts +154 -0
- package/dist/services/local-chat-storage.d.ts.map +1 -0
- package/dist/services/local-chat-storage.js +258 -0
- package/dist/services/local-chat-storage.js.map +1 -0
- package/dist/tools/grep-search.d.ts +5 -0
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +68 -16
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/plan-mode.d.ts +57 -6
- package/dist/tools/plan-mode.d.ts.map +1 -1
- package/dist/tools/plan-mode.js +297 -46
- package/dist/tools/plan-mode.js.map +1 -1
- package/dist/tools/read-binary-file.d.ts +10 -0
- package/dist/tools/read-binary-file.d.ts.map +1 -0
- package/dist/tools/read-binary-file.js +210 -0
- package/dist/tools/read-binary-file.js.map +1 -0
- package/dist/types/index.d.ts +7 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/components/App.d.ts +35 -0
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +608 -16
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/ClipboardImageAutocomplete.d.ts +14 -0
- package/dist/ui/components/ClipboardImageAutocomplete.d.ts.map +1 -0
- package/dist/ui/components/ClipboardImageAutocomplete.js +39 -0
- package/dist/ui/components/ClipboardImageAutocomplete.js.map +1 -0
- package/dist/ui/components/ConnectionStatusMessage.d.ts +1 -1
- package/dist/ui/components/ConnectionStatusMessage.d.ts.map +1 -1
- package/dist/ui/components/ConnectionStatusMessage.js +21 -0
- package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
- package/dist/ui/components/DetailedPlanReviewScreen.d.ts +17 -0
- package/dist/ui/components/DetailedPlanReviewScreen.d.ts.map +1 -0
- package/dist/ui/components/DetailedPlanReviewScreen.js +110 -0
- package/dist/ui/components/DetailedPlanReviewScreen.js.map +1 -0
- package/dist/ui/components/InputBox.d.ts +2 -1
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +399 -28
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +20 -6
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/MessageDisplay.d.ts +6 -0
- package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
- package/dist/ui/components/MessageDisplay.js +66 -3
- package/dist/ui/components/MessageDisplay.js.map +1 -1
- package/dist/ui/components/PlanAcceptedMessage.d.ts +8 -0
- package/dist/ui/components/PlanAcceptedMessage.d.ts.map +1 -1
- package/dist/ui/components/PlanAcceptedMessage.js +26 -8
- package/dist/ui/components/PlanAcceptedMessage.js.map +1 -1
- package/dist/ui/components/StreamingMessageDisplay.d.ts +3 -0
- package/dist/ui/components/StreamingMessageDisplay.d.ts.map +1 -1
- package/dist/ui/components/StreamingMessageDisplay.js +10 -6
- package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
- package/dist/ui/components/TaskCompletedMessage.d.ts.map +1 -1
- package/dist/ui/components/TaskCompletedMessage.js +4 -4
- package/dist/ui/components/TaskCompletedMessage.js.map +1 -1
- package/dist/ui/components/TaskProgressIndicator.d.ts +18 -0
- package/dist/ui/components/TaskProgressIndicator.d.ts.map +1 -0
- package/dist/ui/components/TaskProgressIndicator.js +72 -0
- package/dist/ui/components/TaskProgressIndicator.js.map +1 -0
- package/dist/ui/components/ThinkingDisplay.d.ts +3 -0
- package/dist/ui/components/ThinkingDisplay.d.ts.map +1 -1
- package/dist/ui/components/ThinkingDisplay.js +6 -4
- package/dist/ui/components/ThinkingDisplay.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +85 -15
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/utils/custom-commands-manager.d.ts +59 -0
- package/dist/utils/custom-commands-manager.d.ts.map +1 -0
- package/dist/utils/custom-commands-manager.js +142 -0
- package/dist/utils/custom-commands-manager.js.map +1 -0
- package/dist/utils/input-classifier.d.ts +10 -11
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +299 -75
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/terminal-output.d.ts.map +1 -1
- package/dist/utils/terminal-output.js +110 -14
- package/dist/utils/terminal-output.js.map +1 -1
- package/dist/utils/unicode-sanitizer.d.ts +44 -0
- package/dist/utils/unicode-sanitizer.d.ts.map +1 -0
- package/dist/utils/unicode-sanitizer.js +211 -0
- package/dist/utils/unicode-sanitizer.js.map +1 -0
- package/models-config.json +2 -3
- package/package.json +7 -3
|
@@ -66,10 +66,17 @@ function processBackspaces(input) {
|
|
|
66
66
|
export function processTerminalOutput(raw) {
|
|
67
67
|
if (!raw)
|
|
68
68
|
return '';
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
// This
|
|
72
|
-
|
|
69
|
+
// APPROACH: Like a real terminal scrollback, keep ALL content.
|
|
70
|
+
// Just strip escape sequences - don't discard any content.
|
|
71
|
+
// This is what you'd see if you scrolled through the terminal's complete history.
|
|
72
|
+
// Strip alternate screen buffer sequences (but keep surrounding content)
|
|
73
|
+
// \x1b[?1049h/l = alternate screen with cursor save/restore
|
|
74
|
+
// \x1b[?47h/l = basic alternate screen buffer
|
|
75
|
+
let workingRaw = raw.replace(/\x1b\[\?(?:1049|47)[hl]/g, '');
|
|
76
|
+
// Strip cursor home sequences (\x1b[H) - these move cursor to position (1,1)
|
|
77
|
+
// For scrollback view, we just remove these rather than trying to simulate screen positioning
|
|
78
|
+
// NOTE: We do NOT convert to \r because that causes duplicate lines at top
|
|
79
|
+
let cleaned = workingRaw.replace(/\x1b\[H/g, '');
|
|
73
80
|
// Now strip other ANSI cursor movement sequences that could break the layout
|
|
74
81
|
// These include: cursor up/down/left/right, cursor position set, cursor save/restore, erase line/screen
|
|
75
82
|
// We keep color codes (handled by stripAnsi later) but handle cursor manipulation
|
|
@@ -96,22 +103,38 @@ export function processTerminalOutput(raw) {
|
|
|
96
103
|
.replace(/\x1b\[\d*K/g, '')
|
|
97
104
|
// Scroll up/down: \x1b[nS, \x1b[nT
|
|
98
105
|
.replace(/\x1b\[\d*[ST]/g, '')
|
|
99
|
-
// Hide/show cursor: \x1b[?25h, \x1b[?25l
|
|
100
|
-
.replace(/\x1b\[\?25[hl]/g, '')
|
|
101
|
-
// Other DEC private mode sequences: \x1b[?...h, \x1b[?...l (like alternate screen)
|
|
106
|
+
// Hide/show cursor: \x1b[?25h, \x1b[?25l (and other single/double digit variants)
|
|
102
107
|
.replace(/\x1b\[\?\d+[hl]/g, '')
|
|
103
|
-
//
|
|
104
|
-
.replace(/\x1b\[
|
|
108
|
+
// DEC private mode sequences with any number: \x1b[?nnnnh or \x1b[?nnnnl
|
|
109
|
+
.replace(/\x1b\[\?[\d;]+[a-zA-Z]/g, '')
|
|
110
|
+
// Set/reset mode: \x1b[nh, \x1b[nl
|
|
111
|
+
.replace(/\x1b\[\d*[hl]/g, '')
|
|
105
112
|
// Erase character: \x1b[nX - strip (used for clearing parts of line)
|
|
106
113
|
.replace(/\x1b\[\d*X/g, '')
|
|
107
114
|
// SGR (Select Graphic Rendition) reset: \x1b[m
|
|
108
115
|
.replace(/\x1b\[m/g, '')
|
|
109
116
|
// SGR with parameters (colors, etc.): \x1b[n;n;...m - strip all color codes
|
|
110
|
-
.replace(/\x1b\[\d
|
|
111
|
-
//
|
|
112
|
-
.replace(/\x1b\[\d*[a-zA-Z]/g, '')
|
|
113
|
-
// Strip any remaining
|
|
117
|
+
.replace(/\x1b\[[\d;]*m/g, '')
|
|
118
|
+
// CSI sequences with any parameters: \x1b[...letter
|
|
119
|
+
.replace(/\x1b\[[\d;]*[a-zA-Z]/g, '')
|
|
120
|
+
// Strip any remaining CSI sequences
|
|
121
|
+
.replace(/\x1b\[[^\x1b]*?[a-zA-Z@`]/g, '')
|
|
122
|
+
// Strip bare ESC followed by single character (like ESC M for reverse index)
|
|
123
|
+
.replace(/\x1b[()#][0-9A-Za-z]/g, '')
|
|
124
|
+
.replace(/\x1b[DME78=>]/g, '')
|
|
125
|
+
// Strip any remaining bare escape sequences starting with \x1b[
|
|
114
126
|
.replace(/\x1b\[/g, '')
|
|
127
|
+
// Strip any remaining bare ESC character
|
|
128
|
+
.replace(/\x1b/g, '')
|
|
129
|
+
// Strip BEL character (U+0007) - causes display issues
|
|
130
|
+
.replace(/\x07/g, '')
|
|
131
|
+
// Strip Form Feed (U+000C) - causes display issues
|
|
132
|
+
.replace(/\x0C/g, '')
|
|
133
|
+
// Strip control characters EXCEPT: 0x08 (backspace - needed for processBackspaces),
|
|
134
|
+
// 0x09 (tab), 0x0A (newline), 0x0D (carriage return)
|
|
135
|
+
.replace(/[\x00-\x06\x0B\x0E-\x1F]/g, '')
|
|
136
|
+
// Strip DEL character (U+007F)
|
|
137
|
+
.replace(/\x7F/g, '')
|
|
115
138
|
// Convert tab characters to spaces for consistent display
|
|
116
139
|
.replace(/\t/g, ' ');
|
|
117
140
|
// Process backspace sequences to simulate terminal behavior
|
|
@@ -143,6 +166,79 @@ export function processTerminalOutput(raw) {
|
|
|
143
166
|
processedLines.push(finalLine.trimEnd());
|
|
144
167
|
}
|
|
145
168
|
// Join and remove leading empty lines
|
|
146
|
-
|
|
169
|
+
let result = processedLines.join('\n').replace(/^\n+/, '');
|
|
170
|
+
// CRITICAL: Deduplicate consecutive identical lines caused by alternate screen buffer switches
|
|
171
|
+
// When terminals switch to/from alternate screen, they may resend the same content
|
|
172
|
+
// This creates duplicate blocks that need to be collapsed
|
|
173
|
+
const finalLines = result.split('\n');
|
|
174
|
+
const dedupedLines = [];
|
|
175
|
+
let lastLine = '';
|
|
176
|
+
let repeatCount = 0;
|
|
177
|
+
for (const line of finalLines) {
|
|
178
|
+
if (line === lastLine && line.trim() !== '') {
|
|
179
|
+
// Same non-empty line repeated - count repetitions
|
|
180
|
+
repeatCount++;
|
|
181
|
+
// Only keep if it's the first repeat (allow max 1 duplicate for things like separators)
|
|
182
|
+
if (repeatCount <= 1) {
|
|
183
|
+
dedupedLines.push(line);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Different line - reset counter
|
|
188
|
+
dedupedLines.push(line);
|
|
189
|
+
lastLine = line;
|
|
190
|
+
repeatCount = 0;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// BLOCK-LEVEL DEDUPLICATION: Detect and remove repeated content blocks
|
|
194
|
+
// This handles cases where a large section of output is repeated due to screen buffer operations
|
|
195
|
+
result = dedupedLines.join('\n');
|
|
196
|
+
// Look for repeated blocks by finding content that appears twice with the same sequence
|
|
197
|
+
// We do this by checking if the second half of the output is a repeat of content from earlier
|
|
198
|
+
const lines = result.split('\n');
|
|
199
|
+
if (lines.length > 20) {
|
|
200
|
+
// Try to find if there's a repeated block by looking for a unique "marker" line
|
|
201
|
+
// that appears twice (like section headers)
|
|
202
|
+
const lineOccurrences = new Map();
|
|
203
|
+
for (let i = 0; i < lines.length; i++) {
|
|
204
|
+
const line = lines[i].trim();
|
|
205
|
+
// Only track substantive lines (not empty or short filler)
|
|
206
|
+
if (line.length > 10) {
|
|
207
|
+
if (!lineOccurrences.has(line)) {
|
|
208
|
+
lineOccurrences.set(line, []);
|
|
209
|
+
}
|
|
210
|
+
lineOccurrences.get(line).push(i);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Find lines that appear exactly twice - potential block boundaries
|
|
214
|
+
for (const [line, indices] of lineOccurrences) {
|
|
215
|
+
if (indices.length === 2) {
|
|
216
|
+
const firstIdx = indices[0];
|
|
217
|
+
const secondIdx = indices[1];
|
|
218
|
+
const blockSize = secondIdx - firstIdx;
|
|
219
|
+
// Check if this could be a repeated block (at least 5 lines)
|
|
220
|
+
if (blockSize >= 5 && secondIdx + blockSize <= lines.length) {
|
|
221
|
+
// Verify the block after secondIdx matches the block after firstIdx
|
|
222
|
+
let isMatch = true;
|
|
223
|
+
for (let i = 0; i < Math.min(blockSize, 10); i++) {
|
|
224
|
+
if (lines[firstIdx + i] !== lines[secondIdx + i]) {
|
|
225
|
+
isMatch = false;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (isMatch) {
|
|
230
|
+
// Remove the duplicated block (keep the first occurrence)
|
|
231
|
+
const cleanedLines = lines.slice(0, secondIdx);
|
|
232
|
+
// If there's content after the duplicated block, keep it
|
|
233
|
+
if (secondIdx + blockSize < lines.length) {
|
|
234
|
+
cleanedLines.push(...lines.slice(secondIdx + blockSize));
|
|
235
|
+
}
|
|
236
|
+
return cleanedLines.join('\n');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return result;
|
|
147
243
|
}
|
|
148
244
|
//# sourceMappingURL=terminal-output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-output.js","sourceRoot":"","sources":["../../src/utils/terminal-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,0EAA0E;IAC1E,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,uDAAuD;YACvD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAChB,SAAS,EAAE,CAAC;YAChB,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACxC,sCAAsC;YACtC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACxC,MAAM,IAAI,IAAI,CAAC;YACf,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;aAAM,CAAC;YACJ,yDAAyD;YACzD,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,IAAI,CAAC;YACnB,CAAC;YACD,SAAS,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,
|
|
1
|
+
{"version":3,"file":"terminal-output.js","sourceRoot":"","sources":["../../src/utils/terminal-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unicode Sanitizer for Terminal Output
|
|
3
|
+
*
|
|
4
|
+
* This utility sanitizes problematic Unicode characters that cause display issues
|
|
5
|
+
* in terminal-based UIs like React Ink. The main problems are:
|
|
6
|
+
*
|
|
7
|
+
* 1. Emojis have double display width but string.length returns 1
|
|
8
|
+
* 2. Variation selectors (U+FE0F) change emoji rendering
|
|
9
|
+
* 3. Zero-width characters cause layout issues
|
|
10
|
+
* 4. Combining characters can cause unexpected visual output
|
|
11
|
+
*
|
|
12
|
+
* This module provides functions to:
|
|
13
|
+
* - Replace problematic emojis with ASCII fallbacks
|
|
14
|
+
* - Strip zero-width and invisible characters
|
|
15
|
+
* - Remove variation selectors
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Sanitize a string for terminal display by replacing or removing
|
|
19
|
+
* problematic Unicode characters.
|
|
20
|
+
*
|
|
21
|
+
* @param input - The string to sanitize
|
|
22
|
+
* @param options - Sanitization options
|
|
23
|
+
* @returns Sanitized string safe for terminal display
|
|
24
|
+
*/
|
|
25
|
+
export declare function sanitizeUnicode(input: string, options?: {
|
|
26
|
+
/** Replace emojis with ASCII fallbacks instead of stripping */
|
|
27
|
+
useFallbacks?: boolean;
|
|
28
|
+
/** Aggressively strip all non-ASCII characters (except box-drawing) */
|
|
29
|
+
aggressive?: boolean;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Light sanitization that only removes the most problematic characters
|
|
33
|
+
* while preserving as much Unicode as possible.
|
|
34
|
+
*
|
|
35
|
+
* Use this for final display where you want to keep most characters
|
|
36
|
+
* but prevent layout breaking.
|
|
37
|
+
*/
|
|
38
|
+
export declare function sanitizeUnicodeLight(input: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a string contains any potentially problematic Unicode
|
|
41
|
+
* that might cause display issues.
|
|
42
|
+
*/
|
|
43
|
+
export declare function hasProblematicUnicode(input: string): boolean;
|
|
44
|
+
//# sourceMappingURL=unicode-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicode-sanitizer.d.ts","sourceRoot":"","sources":["../../src/utils/unicode-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA4IH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IACpD,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,MAAM,CAkDd;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc1D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAS5D"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unicode Sanitizer for Terminal Output
|
|
3
|
+
*
|
|
4
|
+
* This utility sanitizes problematic Unicode characters that cause display issues
|
|
5
|
+
* in terminal-based UIs like React Ink. The main problems are:
|
|
6
|
+
*
|
|
7
|
+
* 1. Emojis have double display width but string.length returns 1
|
|
8
|
+
* 2. Variation selectors (U+FE0F) change emoji rendering
|
|
9
|
+
* 3. Zero-width characters cause layout issues
|
|
10
|
+
* 4. Combining characters can cause unexpected visual output
|
|
11
|
+
*
|
|
12
|
+
* This module provides functions to:
|
|
13
|
+
* - Replace problematic emojis with ASCII fallbacks
|
|
14
|
+
* - Strip zero-width and invisible characters
|
|
15
|
+
* - Remove variation selectors
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Map of emojis to their ASCII text fallbacks.
|
|
19
|
+
* These are common emojis that might appear in terminal output.
|
|
20
|
+
*/
|
|
21
|
+
const EMOJI_FALLBACKS = {
|
|
22
|
+
// Status indicators
|
|
23
|
+
'✓': '[ok]',
|
|
24
|
+
'✔': '[ok]',
|
|
25
|
+
'✗': '[x]',
|
|
26
|
+
'✘': '[x]',
|
|
27
|
+
'✅': '[ok]',
|
|
28
|
+
'❌': '[x]',
|
|
29
|
+
'⚠': '[!]',
|
|
30
|
+
'⚡': '*',
|
|
31
|
+
'✨': '*',
|
|
32
|
+
// Common emojis in dev tools
|
|
33
|
+
'🚀': '>',
|
|
34
|
+
'📝': '#',
|
|
35
|
+
'🔥': '*',
|
|
36
|
+
'💡': '*',
|
|
37
|
+
'📦': '#',
|
|
38
|
+
'🔧': '*',
|
|
39
|
+
'⚙': '*',
|
|
40
|
+
'🔍': '*',
|
|
41
|
+
'📁': '#',
|
|
42
|
+
'📂': '#',
|
|
43
|
+
'💬': '#',
|
|
44
|
+
'🎉': '*',
|
|
45
|
+
'🎯': '*',
|
|
46
|
+
'🐛': '#',
|
|
47
|
+
'🔒': '#',
|
|
48
|
+
'🔓': '#',
|
|
49
|
+
// Arrows (these usually work, but some might cause issues)
|
|
50
|
+
'➡': '->',
|
|
51
|
+
'⬅': '<-',
|
|
52
|
+
'⬆': '^',
|
|
53
|
+
'⬇': 'v',
|
|
54
|
+
'↔': '<->',
|
|
55
|
+
'↕': '^v',
|
|
56
|
+
'⇐': '<=',
|
|
57
|
+
'⇒': '=>',
|
|
58
|
+
'⇑': '^^',
|
|
59
|
+
'⇓': 'vv',
|
|
60
|
+
// Weather/Nature
|
|
61
|
+
'☀': '*',
|
|
62
|
+
'☁': '*',
|
|
63
|
+
'☂': '#',
|
|
64
|
+
'⛅': '*',
|
|
65
|
+
// Misc symbols that might cause issues
|
|
66
|
+
'⌘': '#',
|
|
67
|
+
'⎇': '#',
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Regex patterns for Unicode ranges that should be handled
|
|
71
|
+
*/
|
|
72
|
+
const PATTERNS = {
|
|
73
|
+
// Variation selectors: U+FE00-U+FE0F (VS1-VS16)
|
|
74
|
+
variationSelectors: /[\uFE00-\uFE0F]/g,
|
|
75
|
+
// Zero-width characters
|
|
76
|
+
zeroWidth: /[\u200B-\u200D\uFEFF\u2060]/g,
|
|
77
|
+
// Emoji modifiers (skin tones, etc.): U+1F3FB-U+1F3FF
|
|
78
|
+
emojiModifiers: /[\u{1F3FB}-\u{1F3FF}]/gu,
|
|
79
|
+
// Regional indicator symbols (flag emojis): U+1F1E0-U+1F1FF
|
|
80
|
+
regionalIndicators: /[\u{1F1E0}-\u{1F1FF}]/gu,
|
|
81
|
+
// Emoji presentation sequences (typically cause double-width issues)
|
|
82
|
+
// This covers most emoji ranges including:
|
|
83
|
+
// - Emoticons: U+1F600-U+1F64F
|
|
84
|
+
// - Miscellaneous Symbols and Pictographs: U+1F300-U+1F5FF
|
|
85
|
+
// - Transport and Map Symbols: U+1F680-U+1F6FF
|
|
86
|
+
// - Supplemental Symbols: U+1F900-U+1F9FF
|
|
87
|
+
// - Symbols and Pictographs Extended-A: U+1FA00-U+1FA6F
|
|
88
|
+
// - Additional emoji blocks: U+1FA70-U+1FAFF
|
|
89
|
+
commonEmojis: /[\u{1F300}-\u{1F9FF}\u{1FA00}-\u{1FAFF}]/gu,
|
|
90
|
+
// Enclosed alphanumerics and symbols (circled letters, numbers)
|
|
91
|
+
enclosedAlphanumerics: /[\u2460-\u24FF\u2776-\u2793]/g,
|
|
92
|
+
// Dingbats that might cause issues (but not all - keep common ones)
|
|
93
|
+
problematicDingbats: /[\u2700-\u27BF]/g,
|
|
94
|
+
// Miscellaneous symbols that are typically single-width: U+2600-U+26FF
|
|
95
|
+
// We'll handle these selectively
|
|
96
|
+
miscSymbols: /[\u2600-\u26FF]/g,
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Characters/ranges that should be PRESERVED (work fine in terminals)
|
|
100
|
+
*/
|
|
101
|
+
const PRESERVE_RANGES = {
|
|
102
|
+
// Box-drawing characters: U+2500-U+257F
|
|
103
|
+
boxDrawing: /[\u2500-\u257F]/,
|
|
104
|
+
// Block elements: U+2580-U+259F
|
|
105
|
+
blockElements: /[\u2580-\u259F]/,
|
|
106
|
+
// Basic Latin punctuation and symbols
|
|
107
|
+
basicLatin: /[\u0020-\u007E]/,
|
|
108
|
+
// Latin-1 Supplement
|
|
109
|
+
latin1: /[\u00A0-\u00FF]/,
|
|
110
|
+
// General punctuation: U+2000-U+206F (except zero-width)
|
|
111
|
+
generalPunctuation: /[\u2010-\u205E]/,
|
|
112
|
+
// Arrows: U+2190-U+21FF (single-width arrows work fine)
|
|
113
|
+
arrows: /[\u2190-\u21FF]/,
|
|
114
|
+
// Mathematical operators: U+2200-U+22FF
|
|
115
|
+
mathOperators: /[\u2200-\u22FF]/,
|
|
116
|
+
// Currency symbols: U+20A0-U+20CF
|
|
117
|
+
currency: /[\u20A0-\u20CF]/,
|
|
118
|
+
// Common card suits and symbols that work: ♠♣♥♦★☆
|
|
119
|
+
commonSymbols: /[♠♣♥♦★☆]/,
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Check if a character should be preserved (not sanitized)
|
|
123
|
+
*/
|
|
124
|
+
function shouldPreserve(char) {
|
|
125
|
+
for (const pattern of Object.values(PRESERVE_RANGES)) {
|
|
126
|
+
if (pattern.test(char)) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Sanitize a string for terminal display by replacing or removing
|
|
134
|
+
* problematic Unicode characters.
|
|
135
|
+
*
|
|
136
|
+
* @param input - The string to sanitize
|
|
137
|
+
* @param options - Sanitization options
|
|
138
|
+
* @returns Sanitized string safe for terminal display
|
|
139
|
+
*/
|
|
140
|
+
export function sanitizeUnicode(input, options = {}) {
|
|
141
|
+
if (!input)
|
|
142
|
+
return '';
|
|
143
|
+
const { useFallbacks = true, aggressive = false } = options;
|
|
144
|
+
let result = input;
|
|
145
|
+
// Step 1: Remove variation selectors (these change emoji presentation)
|
|
146
|
+
result = result.replace(PATTERNS.variationSelectors, '');
|
|
147
|
+
// Step 2: Remove zero-width characters
|
|
148
|
+
result = result.replace(PATTERNS.zeroWidth, '');
|
|
149
|
+
// Step 3: Remove emoji modifiers (skin tones)
|
|
150
|
+
result = result.replace(PATTERNS.emojiModifiers, '');
|
|
151
|
+
// Step 4: Remove regional indicators (flag emojis become letter pairs)
|
|
152
|
+
result = result.replace(PATTERNS.regionalIndicators, '');
|
|
153
|
+
// Step 5: Replace known emojis with fallbacks or strip them
|
|
154
|
+
if (useFallbacks) {
|
|
155
|
+
// Replace known emojis with their fallbacks
|
|
156
|
+
for (const [emoji, fallback] of Object.entries(EMOJI_FALLBACKS)) {
|
|
157
|
+
result = result.split(emoji).join(fallback);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Step 6: Strip remaining common emojis
|
|
161
|
+
result = result.replace(PATTERNS.commonEmojis, aggressive ? '' : '*');
|
|
162
|
+
// Step 7: Handle miscellaneous symbols selectively
|
|
163
|
+
// Many of these work fine, but some cause issues
|
|
164
|
+
// In aggressive mode, strip all; otherwise, only strip known problematic ones
|
|
165
|
+
if (aggressive) {
|
|
166
|
+
result = result.replace(PATTERNS.miscSymbols, (char) => {
|
|
167
|
+
// Preserve if it's in our preserve list
|
|
168
|
+
if (shouldPreserve(char)) {
|
|
169
|
+
return char;
|
|
170
|
+
}
|
|
171
|
+
return '';
|
|
172
|
+
});
|
|
173
|
+
result = result.replace(PATTERNS.enclosedAlphanumerics, '');
|
|
174
|
+
result = result.replace(PATTERNS.problematicDingbats, '');
|
|
175
|
+
}
|
|
176
|
+
// Step 8: Clean up any resulting double spaces
|
|
177
|
+
result = result.replace(/ +/g, ' ');
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Light sanitization that only removes the most problematic characters
|
|
182
|
+
* while preserving as much Unicode as possible.
|
|
183
|
+
*
|
|
184
|
+
* Use this for final display where you want to keep most characters
|
|
185
|
+
* but prevent layout breaking.
|
|
186
|
+
*/
|
|
187
|
+
export function sanitizeUnicodeLight(input) {
|
|
188
|
+
if (!input)
|
|
189
|
+
return '';
|
|
190
|
+
let result = input;
|
|
191
|
+
// Only remove variation selectors and zero-width characters
|
|
192
|
+
result = result.replace(PATTERNS.variationSelectors, '');
|
|
193
|
+
result = result.replace(PATTERNS.zeroWidth, '');
|
|
194
|
+
// Replace common problematic emojis with simple markers
|
|
195
|
+
result = result.replace(PATTERNS.commonEmojis, '*');
|
|
196
|
+
result = result.replace(PATTERNS.enclosedAlphanumerics, '#');
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if a string contains any potentially problematic Unicode
|
|
201
|
+
* that might cause display issues.
|
|
202
|
+
*/
|
|
203
|
+
export function hasProblematicUnicode(input) {
|
|
204
|
+
if (!input)
|
|
205
|
+
return false;
|
|
206
|
+
return (PATTERNS.commonEmojis.test(input) ||
|
|
207
|
+
PATTERNS.variationSelectors.test(input) ||
|
|
208
|
+
PATTERNS.emojiModifiers.test(input) ||
|
|
209
|
+
PATTERNS.regionalIndicators.test(input));
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=unicode-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicode-sanitizer.js","sourceRoot":"","sources":["../../src/utils/unicode-sanitizer.ts"],"names":[],"mappings":"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"}
|
package/models-config.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "centaurus-cli",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"description": "A powerful command-line AI coding assistant with Google Gemini support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -45,15 +45,15 @@
|
|
|
45
45
|
"AUTH_FLOW.md"
|
|
46
46
|
],
|
|
47
47
|
"dependencies": {
|
|
48
|
+
"@crosscopy/clipboard": "^0.2.8",
|
|
48
49
|
"@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
|
|
49
50
|
"@modelcontextprotocol/sdk": "^1.24.2",
|
|
50
|
-
"@types/node": "^24.7.2",
|
|
51
|
-
"@types/react": "^18.3.26",
|
|
52
51
|
"axios": "^1.12.2",
|
|
53
52
|
"boxen": "^8.0.1",
|
|
54
53
|
"chalk": "^5.6.2",
|
|
55
54
|
"cheerio": "^1.1.2",
|
|
56
55
|
"cli-highlight": "^2.1.11",
|
|
56
|
+
"clipboard-files": "^3.0.0",
|
|
57
57
|
"commander": "^14.0.1",
|
|
58
58
|
"cross-spawn": "^7.0.6",
|
|
59
59
|
"diff": "^8.0.2",
|
|
@@ -66,11 +66,15 @@
|
|
|
66
66
|
"open": "^10.1.0",
|
|
67
67
|
"react": "^18.3.1",
|
|
68
68
|
"ssh2": "^1.15.0",
|
|
69
|
+
"string-width": "^8.1.0",
|
|
70
|
+
"strip-ansi": "^7.1.0",
|
|
69
71
|
"typescript": "^5.9.3",
|
|
70
72
|
"wrap-ansi": "^9.0.2"
|
|
71
73
|
},
|
|
72
74
|
"devDependencies": {
|
|
73
75
|
"@types/inquirer": "^9.0.9",
|
|
76
|
+
"@types/node": "^24.7.2",
|
|
77
|
+
"@types/react": "^18.3.26",
|
|
74
78
|
"@types/ssh2": "^1.15.0",
|
|
75
79
|
"prettier": "^3.6.2",
|
|
76
80
|
"ts-node": "^10.9.2"
|