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.
Files changed (115) hide show
  1. package/dist/cli-adapter.d.ts +85 -0
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +769 -28
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/slash-commands.d.ts +2 -0
  6. package/dist/config/slash-commands.d.ts.map +1 -1
  7. package/dist/config/slash-commands.js +31 -1
  8. package/dist/config/slash-commands.js.map +1 -1
  9. package/dist/context/handlers/docker-handler.js.map +1 -1
  10. package/dist/context/handlers/ssh-handler.d.ts +16 -1
  11. package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
  12. package/dist/context/handlers/ssh-handler.js +57 -12
  13. package/dist/context/handlers/ssh-handler.js.map +1 -1
  14. package/dist/context/subshell-handler.d.ts +14 -0
  15. package/dist/context/subshell-handler.d.ts.map +1 -1
  16. package/dist/hooks/useTerminalDimensions.d.ts +41 -0
  17. package/dist/hooks/useTerminalDimensions.d.ts.map +1 -0
  18. package/dist/hooks/useTerminalDimensions.js +84 -0
  19. package/dist/hooks/useTerminalDimensions.js.map +1 -0
  20. package/dist/index.js +27 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/services/api-client.d.ts +24 -0
  23. package/dist/services/api-client.d.ts.map +1 -1
  24. package/dist/services/api-client.js +27 -0
  25. package/dist/services/api-client.js.map +1 -1
  26. package/dist/services/auth-handler.js +1 -1
  27. package/dist/services/auth-handler.js.map +1 -1
  28. package/dist/services/clipboard-service.d.ts +42 -0
  29. package/dist/services/clipboard-service.d.ts.map +1 -0
  30. package/dist/services/clipboard-service.js +217 -0
  31. package/dist/services/clipboard-service.js.map +1 -0
  32. package/dist/services/local-chat-storage.d.ts +154 -0
  33. package/dist/services/local-chat-storage.d.ts.map +1 -0
  34. package/dist/services/local-chat-storage.js +258 -0
  35. package/dist/services/local-chat-storage.js.map +1 -0
  36. package/dist/tools/grep-search.d.ts +5 -0
  37. package/dist/tools/grep-search.d.ts.map +1 -1
  38. package/dist/tools/grep-search.js +68 -16
  39. package/dist/tools/grep-search.js.map +1 -1
  40. package/dist/tools/plan-mode.d.ts +57 -6
  41. package/dist/tools/plan-mode.d.ts.map +1 -1
  42. package/dist/tools/plan-mode.js +297 -46
  43. package/dist/tools/plan-mode.js.map +1 -1
  44. package/dist/tools/read-binary-file.d.ts +10 -0
  45. package/dist/tools/read-binary-file.d.ts.map +1 -0
  46. package/dist/tools/read-binary-file.js +210 -0
  47. package/dist/tools/read-binary-file.js.map +1 -0
  48. package/dist/types/index.d.ts +7 -1
  49. package/dist/types/index.d.ts.map +1 -1
  50. package/dist/ui/components/App.d.ts +35 -0
  51. package/dist/ui/components/App.d.ts.map +1 -1
  52. package/dist/ui/components/App.js +608 -16
  53. package/dist/ui/components/App.js.map +1 -1
  54. package/dist/ui/components/ClipboardImageAutocomplete.d.ts +14 -0
  55. package/dist/ui/components/ClipboardImageAutocomplete.d.ts.map +1 -0
  56. package/dist/ui/components/ClipboardImageAutocomplete.js +39 -0
  57. package/dist/ui/components/ClipboardImageAutocomplete.js.map +1 -0
  58. package/dist/ui/components/ConnectionStatusMessage.d.ts +1 -1
  59. package/dist/ui/components/ConnectionStatusMessage.d.ts.map +1 -1
  60. package/dist/ui/components/ConnectionStatusMessage.js +21 -0
  61. package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
  62. package/dist/ui/components/DetailedPlanReviewScreen.d.ts +17 -0
  63. package/dist/ui/components/DetailedPlanReviewScreen.d.ts.map +1 -0
  64. package/dist/ui/components/DetailedPlanReviewScreen.js +110 -0
  65. package/dist/ui/components/DetailedPlanReviewScreen.js.map +1 -0
  66. package/dist/ui/components/InputBox.d.ts +2 -1
  67. package/dist/ui/components/InputBox.d.ts.map +1 -1
  68. package/dist/ui/components/InputBox.js +399 -28
  69. package/dist/ui/components/InputBox.js.map +1 -1
  70. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  71. package/dist/ui/components/InteractiveShell.js +20 -6
  72. package/dist/ui/components/InteractiveShell.js.map +1 -1
  73. package/dist/ui/components/MessageDisplay.d.ts +6 -0
  74. package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
  75. package/dist/ui/components/MessageDisplay.js +66 -3
  76. package/dist/ui/components/MessageDisplay.js.map +1 -1
  77. package/dist/ui/components/PlanAcceptedMessage.d.ts +8 -0
  78. package/dist/ui/components/PlanAcceptedMessage.d.ts.map +1 -1
  79. package/dist/ui/components/PlanAcceptedMessage.js +26 -8
  80. package/dist/ui/components/PlanAcceptedMessage.js.map +1 -1
  81. package/dist/ui/components/StreamingMessageDisplay.d.ts +3 -0
  82. package/dist/ui/components/StreamingMessageDisplay.d.ts.map +1 -1
  83. package/dist/ui/components/StreamingMessageDisplay.js +10 -6
  84. package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
  85. package/dist/ui/components/TaskCompletedMessage.d.ts.map +1 -1
  86. package/dist/ui/components/TaskCompletedMessage.js +4 -4
  87. package/dist/ui/components/TaskCompletedMessage.js.map +1 -1
  88. package/dist/ui/components/TaskProgressIndicator.d.ts +18 -0
  89. package/dist/ui/components/TaskProgressIndicator.d.ts.map +1 -0
  90. package/dist/ui/components/TaskProgressIndicator.js +72 -0
  91. package/dist/ui/components/TaskProgressIndicator.js.map +1 -0
  92. package/dist/ui/components/ThinkingDisplay.d.ts +3 -0
  93. package/dist/ui/components/ThinkingDisplay.d.ts.map +1 -1
  94. package/dist/ui/components/ThinkingDisplay.js +6 -4
  95. package/dist/ui/components/ThinkingDisplay.js.map +1 -1
  96. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  97. package/dist/ui/components/ToolExecutionMessage.js +85 -15
  98. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  99. package/dist/utils/custom-commands-manager.d.ts +59 -0
  100. package/dist/utils/custom-commands-manager.d.ts.map +1 -0
  101. package/dist/utils/custom-commands-manager.js +142 -0
  102. package/dist/utils/custom-commands-manager.js.map +1 -0
  103. package/dist/utils/input-classifier.d.ts +10 -11
  104. package/dist/utils/input-classifier.d.ts.map +1 -1
  105. package/dist/utils/input-classifier.js +299 -75
  106. package/dist/utils/input-classifier.js.map +1 -1
  107. package/dist/utils/terminal-output.d.ts.map +1 -1
  108. package/dist/utils/terminal-output.js +110 -14
  109. package/dist/utils/terminal-output.js.map +1 -1
  110. package/dist/utils/unicode-sanitizer.d.ts +44 -0
  111. package/dist/utils/unicode-sanitizer.d.ts.map +1 -0
  112. package/dist/utils/unicode-sanitizer.js +211 -0
  113. package/dist/utils/unicode-sanitizer.js.map +1 -0
  114. package/models-config.json +2 -3
  115. 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
- // CRITICAL: Convert cursor home sequences (\x1b[H) to \r BEFORE other processing
70
- // PTY terminals often use \x1b[H instead of \r for spinners/progress bars
71
- // This must happen first so that carriage return handling works correctly
72
- let cleaned = raw.replace(/\x1b\[H/g, '\r');
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
- // VT sequences for special modes
104
- .replace(/\x1b\[\?\d+[a-zA-Z]/g, '')
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+(?:;\d+)*m/g, '')
111
- // Strip any remaining escape sequences ending with letters that might leak through
112
- .replace(/\x1b\[\d*[a-zA-Z]/g, '')
113
- // Strip any remaining bare escape sequences
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
- return processedLines.join('\n').replace(/^\n+/, '');
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":"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"}
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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"}
@@ -57,9 +57,8 @@
57
57
  },
58
58
  "generationConfig": {
59
59
  "temperature": 0.1,
60
- "topP": 0.95,
61
- "topK": 64,
62
- "maxOutputTokens": 32768
60
+ "topP": 0.9,
61
+ "maxOutputTokens": 16384
63
62
  }
64
63
  },
65
64
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centaurus-cli",
3
- "version": "2.8.5",
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"