centaurus-cli 2.9.0 → 2.9.2

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 (148) hide show
  1. package/dist/cli-adapter.d.ts +78 -0
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +566 -165
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/build-config.d.ts +1 -1
  6. package/dist/config/build-config.js +1 -1
  7. package/dist/config/mcp-config-manager.d.ts +21 -0
  8. package/dist/config/mcp-config-manager.d.ts.map +1 -1
  9. package/dist/config/mcp-config-manager.js +184 -1
  10. package/dist/config/mcp-config-manager.js.map +1 -1
  11. package/dist/config/models.d.ts +1 -0
  12. package/dist/config/models.d.ts.map +1 -1
  13. package/dist/config/models.js +7 -2
  14. package/dist/config/models.js.map +1 -1
  15. package/dist/config/slash-commands.d.ts.map +1 -1
  16. package/dist/config/slash-commands.js +5 -3
  17. package/dist/config/slash-commands.js.map +1 -1
  18. package/dist/index.js +66 -11
  19. package/dist/index.js.map +1 -1
  20. package/dist/mcp/mcp-command-handler.d.ts +34 -3
  21. package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
  22. package/dist/mcp/mcp-command-handler.js +171 -83
  23. package/dist/mcp/mcp-command-handler.js.map +1 -1
  24. package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
  25. package/dist/mcp/mcp-server-manager.js +9 -23
  26. package/dist/mcp/mcp-server-manager.js.map +1 -1
  27. package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
  28. package/dist/mcp/mcp-tool-wrapper.js +42 -5
  29. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  30. package/dist/services/ai-service-client.d.ts +6 -1
  31. package/dist/services/ai-service-client.d.ts.map +1 -1
  32. package/dist/services/ai-service-client.js +6 -6
  33. package/dist/services/ai-service-client.js.map +1 -1
  34. package/dist/services/api-client.d.ts +20 -0
  35. package/dist/services/api-client.d.ts.map +1 -1
  36. package/dist/services/api-client.js +35 -0
  37. package/dist/services/api-client.js.map +1 -1
  38. package/dist/services/input-detection-agent.d.ts +40 -0
  39. package/dist/services/input-detection-agent.d.ts.map +1 -0
  40. package/dist/services/input-detection-agent.js +213 -0
  41. package/dist/services/input-detection-agent.js.map +1 -0
  42. package/dist/services/input-requirement-detector.d.ts +28 -0
  43. package/dist/services/input-requirement-detector.d.ts.map +1 -0
  44. package/dist/services/input-requirement-detector.js +203 -0
  45. package/dist/services/input-requirement-detector.js.map +1 -0
  46. package/dist/services/monitored-shell-manager.d.ts +120 -0
  47. package/dist/services/monitored-shell-manager.d.ts.map +1 -0
  48. package/dist/services/monitored-shell-manager.js +239 -0
  49. package/dist/services/monitored-shell-manager.js.map +1 -0
  50. package/dist/services/session-quota-manager.d.ts +101 -0
  51. package/dist/services/session-quota-manager.d.ts.map +1 -0
  52. package/dist/services/session-quota-manager.js +242 -0
  53. package/dist/services/session-quota-manager.js.map +1 -0
  54. package/dist/services/shell-input-agent.d.ts +89 -0
  55. package/dist/services/shell-input-agent.d.ts.map +1 -0
  56. package/dist/services/shell-input-agent.js +361 -0
  57. package/dist/services/shell-input-agent.js.map +1 -0
  58. package/dist/services/sub-agent-manager.d.ts +139 -0
  59. package/dist/services/sub-agent-manager.d.ts.map +1 -0
  60. package/dist/services/sub-agent-manager.js +517 -0
  61. package/dist/services/sub-agent-manager.js.map +1 -0
  62. package/dist/tools/background-command.d.ts.map +1 -1
  63. package/dist/tools/background-command.js +33 -13
  64. package/dist/tools/background-command.js.map +1 -1
  65. package/dist/tools/command.d.ts.map +1 -1
  66. package/dist/tools/command.js +78 -4
  67. package/dist/tools/command.js.map +1 -1
  68. package/dist/tools/file-ops.d.ts.map +1 -1
  69. package/dist/tools/file-ops.js +33 -19
  70. package/dist/tools/file-ops.js.map +1 -1
  71. package/dist/tools/get-diff.d.ts.map +1 -1
  72. package/dist/tools/get-diff.js +5 -2
  73. package/dist/tools/get-diff.js.map +1 -1
  74. package/dist/tools/grep-search.d.ts.map +1 -1
  75. package/dist/tools/grep-search.js +41 -15
  76. package/dist/tools/grep-search.js.map +1 -1
  77. package/dist/tools/plan-mode.js +3 -3
  78. package/dist/tools/plan-mode.js.map +1 -1
  79. package/dist/tools/registry.js +1 -1
  80. package/dist/tools/registry.js.map +1 -1
  81. package/dist/tools/sub-agent.d.ts +9 -0
  82. package/dist/tools/sub-agent.d.ts.map +1 -0
  83. package/dist/tools/sub-agent.js +232 -0
  84. package/dist/tools/sub-agent.js.map +1 -0
  85. package/dist/tools/task-complete.d.ts.map +1 -1
  86. package/dist/tools/task-complete.js +14 -32
  87. package/dist/tools/task-complete.js.map +1 -1
  88. package/dist/ui/components/App.d.ts +45 -0
  89. package/dist/ui/components/App.d.ts.map +1 -1
  90. package/dist/ui/components/App.js +598 -95
  91. package/dist/ui/components/App.js.map +1 -1
  92. package/dist/ui/components/CircularSelectInput.d.ts +24 -0
  93. package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
  94. package/dist/ui/components/CircularSelectInput.js +71 -0
  95. package/dist/ui/components/CircularSelectInput.js.map +1 -0
  96. package/dist/ui/components/ErrorBoundary.d.ts +3 -2
  97. package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
  98. package/dist/ui/components/ErrorBoundary.js +29 -1
  99. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  100. package/dist/ui/components/InputBox.d.ts +4 -0
  101. package/dist/ui/components/InputBox.d.ts.map +1 -1
  102. package/dist/ui/components/InputBox.js +40 -2
  103. package/dist/ui/components/InputBox.js.map +1 -1
  104. package/dist/ui/components/InteractiveShell.d.ts +6 -0
  105. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  106. package/dist/ui/components/InteractiveShell.js +57 -6
  107. package/dist/ui/components/InteractiveShell.js.map +1 -1
  108. package/dist/ui/components/MCPAddScreen.d.ts +13 -0
  109. package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
  110. package/dist/ui/components/MCPAddScreen.js +54 -0
  111. package/dist/ui/components/MCPAddScreen.js.map +1 -0
  112. package/dist/ui/components/MCPListScreen.d.ts +17 -0
  113. package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
  114. package/dist/ui/components/MCPListScreen.js +50 -0
  115. package/dist/ui/components/MCPListScreen.js.map +1 -0
  116. package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
  117. package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
  118. package/dist/ui/components/MCPServerListScreen.js +59 -0
  119. package/dist/ui/components/MCPServerListScreen.js.map +1 -0
  120. package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
  121. package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
  122. package/dist/ui/components/MonitorModeAIPanel.js +69 -0
  123. package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
  124. package/dist/ui/components/MultiLineInput.d.ts +13 -0
  125. package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
  126. package/dist/ui/components/MultiLineInput.js +223 -0
  127. package/dist/ui/components/MultiLineInput.js.map +1 -0
  128. package/dist/ui/components/StatusBar.d.ts +2 -0
  129. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  130. package/dist/ui/components/StatusBar.js +33 -2
  131. package/dist/ui/components/StatusBar.js.map +1 -1
  132. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  133. package/dist/ui/components/ToolExecutionMessage.js +271 -12
  134. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  135. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
  136. package/dist/ui/components/VersionUpdatePrompt.js +3 -2
  137. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
  138. package/dist/utils/editor-utils.d.ts +3 -3
  139. package/dist/utils/editor-utils.d.ts.map +1 -1
  140. package/dist/utils/editor-utils.js +15 -12
  141. package/dist/utils/editor-utils.js.map +1 -1
  142. package/dist/utils/input-classifier.d.ts.map +1 -1
  143. package/dist/utils/input-classifier.js +1 -0
  144. package/dist/utils/input-classifier.js.map +1 -1
  145. package/dist/utils/terminal-output.d.ts.map +1 -1
  146. package/dist/utils/terminal-output.js +198 -171
  147. package/dist/utils/terminal-output.js.map +1 -1
  148. package/package.json +2 -1
@@ -8,20 +8,22 @@
8
8
  * final rendered state is preserved (not intermediate states that should be overwritten).
9
9
  */
10
10
  /**
11
- * Process backspace characters to simulate terminal buffer behavior.
11
+ * Process backspace and carriage return characters to simulate terminal buffer behavior.
12
12
  *
13
- * Terminals send \x08 (backspace) to move cursor left, often followed by
14
- * space and another backspace to visually erase the character.
15
- * This function simulates that behavior on a virtual buffer.
13
+ * This is critical for proper display of progress bars and spinners:
14
+ * - \x08 (backspace) moves cursor left
15
+ * - \r (carriage return) moves cursor to start of line (overwrites from beginning)
16
+ * - \n (newline) moves to next line
16
17
  *
17
- * @param input - String containing backspace characters
18
- * @returns String with backspaces applied
18
+ * @param input - String containing control characters
19
+ * @returns String with control characters applied (simulating terminal display)
19
20
  */
20
21
  function processBackspaces(input) {
21
- if (!input.includes('\x08'))
22
+ if (!input.includes('\x08') && !input.includes('\r'))
22
23
  return input;
23
24
  // Process the string character by character, simulating a terminal buffer
24
- let result = '';
25
+ const lines = [];
26
+ let currentLine = '';
25
27
  let cursorPos = 0;
26
28
  for (let i = 0; i < input.length; i++) {
27
29
  const char = input[i];
@@ -31,25 +33,44 @@ function processBackspaces(input) {
31
33
  cursorPos--;
32
34
  }
33
35
  }
34
- else if (char === '\n' || char === '\r') {
35
- // Newline/CR: append and reset cursor
36
- result = result.substring(0, cursorPos);
37
- result += char;
38
- cursorPos = result.length;
36
+ else if (char === '\r') {
37
+ // Carriage return: reset cursor to start of line
38
+ // This simulates progress bars that overwrite the same line
39
+ // DO NOT append \r to output - just reset cursor position
40
+ cursorPos = 0;
41
+ }
42
+ else if (char === '\n') {
43
+ // Newline: finalize current line and start new one
44
+ // Trim to cursor position to remove orphaned content after \r overwrites
45
+ if (cursorPos < currentLine.length) {
46
+ currentLine = currentLine.substring(0, cursorPos);
47
+ }
48
+ lines.push(currentLine);
49
+ currentLine = '';
50
+ cursorPos = 0;
39
51
  }
40
52
  else {
41
53
  // Regular character: insert/overwrite at cursor position
42
- if (cursorPos < result.length) {
43
- result = result.substring(0, cursorPos) + char + result.substring(cursorPos + 1);
54
+ if (cursorPos < currentLine.length) {
55
+ // Overwrite existing character
56
+ currentLine = currentLine.substring(0, cursorPos) + char + currentLine.substring(cursorPos + 1);
44
57
  }
45
58
  else {
46
- result += char;
59
+ // Append to line
60
+ currentLine += char;
47
61
  }
48
62
  cursorPos++;
49
63
  }
50
64
  }
51
- // Trim any trailing content after cursor (for partial backspace at end)
52
- return result.substring(0, cursorPos);
65
+ // Add any remaining content in the current line
66
+ if (currentLine.length > 0) {
67
+ // Trim to cursor position in case of trailing orphaned content
68
+ if (cursorPos < currentLine.length) {
69
+ currentLine = currentLine.substring(0, cursorPos);
70
+ }
71
+ lines.push(currentLine);
72
+ }
73
+ return lines.join('\n');
53
74
  }
54
75
  /**
55
76
  * Process terminal output to properly handle carriage returns and ANSI sequences.
@@ -66,179 +87,185 @@ function processBackspaces(input) {
66
87
  export function processTerminalOutput(raw) {
67
88
  if (!raw)
68
89
  return '';
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, '');
80
- // Now strip other ANSI cursor movement sequences that could break the layout
81
- // These include: cursor up/down/left/right, cursor position set, cursor save/restore, erase line/screen
82
- // We keep color codes (handled by stripAnsi later) but handle cursor manipulation
83
- cleaned = cleaned
90
+ // Virtual Terminal Emulator Approach
91
+ // We maintain a virtual screen buffer and process escape sequences properly
92
+ // This simulates how a real terminal would render the output
93
+ const SCREEN_ROWS = 500; // Large enough to capture scrollback
94
+ const SCREEN_COLS = 200; // Wide enough for most outputs
95
+ // Initialize screen buffer - array of strings representing each row
96
+ const screen = [];
97
+ for (let i = 0; i < SCREEN_ROWS; i++) {
98
+ screen[i] = '';
99
+ }
100
+ let cursorRow = 0;
101
+ let cursorCol = 0;
102
+ let maxRowUsed = 0; // Track the highest row we've written to
103
+ // First, strip sequences we want to completely ignore (don't affect cursor or content)
104
+ let input = raw
84
105
  // OSC sequences (Operating System Commands): \x1b]...\x07 or \x1b]...\x1b\\
85
- // This includes hyperlinks (\x1b]8;;url\x1b\\text\x1b]8;;\x1b\\), title changes, etc.
86
106
  .replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, '')
87
- // Also handle malformed/partial OSC sequences that may end with common terminators
88
107
  .replace(/\x1b\][^\x07]*\x07/g, '')
89
- // Erase in display: \x1b[J, \x1b[0J, \x1b[1J, \x1b[2J, \x1b[3J - remove without adding newlines
90
- .replace(/\x1b\[\d*J/g, '')
91
- // Cursor position: \x1b[n;mH or \x1b[n;mf - REPLACE WITH NEWLINE to preserve line structure
92
- .replace(/\x1b\[\d+;\d+[Hf]/g, '\n')
93
- // Simple cursor home without row/col: \x1b[H - already converted to \r above
94
- .replace(/\x1b\[\d*[Hf]/g, '')
95
- // Cursor down movement: \x1b[nB - REPLACE WITH NEWLINE
96
- .replace(/\x1b\[\d*B/g, '\n')
97
- // Cursor up/right/left: \x1b[nA (up), \x1b[nC (right), \x1b[nD (left) - just strip
98
- .replace(/\x1b\[\d*[ACD]/g, '')
99
- // Cursor save/restore: \x1b[s, \x1b[u, \x1b7, \x1b8
100
- .replace(/\x1b\[[su]/g, '')
101
- .replace(/\x1b[78]/g, '')
102
- // Erase in line: \x1b[K, \x1b[0K, \x1b[1K, \x1b[2K
103
- .replace(/\x1b\[\d*K/g, '')
104
- // Scroll up/down: \x1b[nS, \x1b[nT
105
- .replace(/\x1b\[\d*[ST]/g, '')
106
- // Hide/show cursor: \x1b[?25h, \x1b[?25l (and other single/double digit variants)
108
+ // Alternate screen buffer - we don't support alternate screens
109
+ .replace(/\x1b\[\?(?:1049|47)[hl]/g, '')
110
+ // Hide/show cursor - purely visual
107
111
  .replace(/\x1b\[\?\d+[hl]/g, '')
108
- // DEC private mode sequences with any number: \x1b[?nnnnh or \x1b[?nnnnl
112
+ // DEC private mode sequences
109
113
  .replace(/\x1b\[\?[\d;]+[a-zA-Z]/g, '')
110
- // Set/reset mode: \x1b[nh, \x1b[nl
114
+ // Set/reset mode
111
115
  .replace(/\x1b\[\d*[hl]/g, '')
112
- // Erase character: \x1b[nX - strip (used for clearing parts of line)
113
- .replace(/\x1b\[\d*X/g, '')
114
- // SGR (Select Graphic Rendition) reset: \x1b[m
115
- .replace(/\x1b\[m/g, '')
116
- // SGR with parameters (colors, etc.): \x1b[n;n;...m - strip all color codes
116
+ // SGR (colors/styles) - strip for clean text output
117
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)
118
+ .replace(/\x1b\[m/g, '')
119
+ // Cursor save/restore - we'll handle positioning manually
120
+ .replace(/\x1b\[[su]/g, '')
121
+ .replace(/\x1b[78]/g, '')
122
+ // Scroll up/down
123
+ .replace(/\x1b\[\d*[ST]/g, '')
124
+ // Character set designations
123
125
  .replace(/\x1b[()#][0-9A-Za-z]/g, '')
124
- .replace(/\x1b[DME78=>]/g, '')
125
- // Strip any remaining bare escape sequences starting with \x1b[
126
- .replace(/\x1b\[/g, '')
127
- // Strip any remaining bare ESC character
128
- .replace(/\x1b/g, '')
129
- // Strip BEL character (U+0007) - causes display issues
126
+ .replace(/\x1b[DME78=\>]/g, '')
127
+ // BEL and Form Feed
130
128
  .replace(/\x07/g, '')
131
- // Strip Form Feed (U+000C) - causes display issues
132
129
  .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, '')
138
- // Convert tab characters to spaces for consistent display
139
- .replace(/\t/g, ' ');
140
- // Process backspace sequences to simulate terminal behavior
141
- // Terminal sends \b \b (backspace-space-backspace) to visually erase characters
142
- // We need to simulate this in a virtual buffer
143
- cleaned = processBackspaces(cleaned);
144
- // Clean up multiple consecutive newlines (max 2)
145
- cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
146
- // Split by newlines first, then process each "line segment" for carriage returns
147
- const segments = cleaned.split('\n');
148
- const processedLines = [];
149
- for (const segment of segments) {
150
- // Split by \r and take the last non-empty part (simulates cursor returning to start)
151
- const parts = segment.split('\r');
152
- let finalLine = '';
153
- for (const part of parts) {
154
- if (part.length === 0)
155
- continue;
156
- // If the new part is shorter than current line, it overwrites from the start
157
- // If longer or equal, it replaces the line
158
- if (part.length >= finalLine.length) {
159
- finalLine = part;
130
+ // DEL character
131
+ .replace(/\x7F/g, '');
132
+ // Now process the input character by character with escape sequence handling
133
+ let i = 0;
134
+ while (i < input.length) {
135
+ // Check for escape sequences
136
+ if (input[i] === '\x1b' && i + 1 < input.length && input[i + 1] === '[') {
137
+ // CSI sequence - parse it
138
+ let j = i + 2;
139
+ let params = '';
140
+ // Collect parameters (digits and semicolons)
141
+ while (j < input.length && /[\d;]/.test(input[j])) {
142
+ params += input[j];
143
+ j++;
160
144
  }
161
- else {
162
- // Overwrite from the beginning, keep the rest
163
- finalLine = part + finalLine.slice(part.length);
145
+ // Get the command character
146
+ const cmd = j < input.length ? input[j] : '';
147
+ // Parse numeric parameters
148
+ const numbers = params.split(';').map(s => parseInt(s) || 0);
149
+ switch (cmd) {
150
+ case 'H': // Cursor position
151
+ case 'f': // Cursor position (alternate)
152
+ // \x1b[row;colH or \x1b[H (home)
153
+ cursorRow = Math.max(0, (numbers[0] || 1) - 1); // 1-indexed to 0-indexed
154
+ cursorCol = Math.max(0, (numbers[1] || 1) - 1);
155
+ break;
156
+ case 'A': // Cursor up
157
+ cursorRow = Math.max(0, cursorRow - (numbers[0] || 1));
158
+ break;
159
+ case 'B': // Cursor down
160
+ cursorRow = cursorRow + (numbers[0] || 1);
161
+ break;
162
+ case 'C': // Cursor right
163
+ cursorCol = cursorCol + (numbers[0] || 1);
164
+ break;
165
+ case 'D': // Cursor left
166
+ cursorCol = Math.max(0, cursorCol - (numbers[0] || 1));
167
+ break;
168
+ case 'J': // Erase in display
169
+ // 0 = cursor to end, 1 = start to cursor, 2 = entire screen, 3 = scrollback
170
+ // For our purposes, just ignore - we want to keep all content
171
+ break;
172
+ case 'K': // Erase in line
173
+ {
174
+ const mode = numbers[0] || 0;
175
+ const line = screen[cursorRow] || '';
176
+ if (mode === 0) {
177
+ // Erase from cursor to end of line
178
+ screen[cursorRow] = line.substring(0, cursorCol);
179
+ }
180
+ else if (mode === 1) {
181
+ // Erase from start to cursor
182
+ screen[cursorRow] = ' '.repeat(cursorCol) + line.substring(cursorCol);
183
+ }
184
+ else if (mode === 2) {
185
+ // Erase entire line
186
+ screen[cursorRow] = '';
187
+ }
188
+ }
189
+ break;
190
+ case 'X': // Erase characters
191
+ {
192
+ const count = numbers[0] || 1;
193
+ const line = screen[cursorRow] || '';
194
+ // Replace 'count' characters with spaces starting at cursor
195
+ screen[cursorRow] = line.substring(0, cursorCol) +
196
+ ' '.repeat(count) +
197
+ line.substring(cursorCol + count);
198
+ }
199
+ break;
200
+ default:
201
+ // Unknown CSI sequence - skip it
202
+ break;
164
203
  }
204
+ i = j + 1; // Move past the sequence
205
+ continue;
165
206
  }
166
- processedLines.push(finalLine.trimEnd());
167
- }
168
- // Join and remove leading empty lines
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
- }
207
+ // Handle control characters
208
+ const char = input[i];
209
+ if (char === '\r') {
210
+ // Carriage return - move to start of line
211
+ cursorCol = 0;
185
212
  }
186
- else {
187
- // Different line - reset counter
188
- dedupedLines.push(line);
189
- lastLine = line;
190
- repeatCount = 0;
213
+ else if (char === '\n') {
214
+ // Newline - move to next line
215
+ cursorRow++;
216
+ cursorCol = 0;
191
217
  }
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);
218
+ else if (char === '\x08') {
219
+ // Backspace - move cursor left
220
+ if (cursorCol > 0) {
221
+ cursorCol--;
211
222
  }
212
223
  }
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
- }
224
+ else if (char === '\t') {
225
+ // Tab - move to next tab stop (every 8 columns)
226
+ cursorCol = Math.floor(cursorCol / 8 + 1) * 8;
227
+ }
228
+ else if (char >= ' ' || char === '\x00') {
229
+ // Skip null bytes
230
+ if (char === '\x00') {
231
+ i++;
232
+ continue;
233
+ }
234
+ // Regular printable character - write to screen
235
+ // Ensure we have enough rows
236
+ while (cursorRow >= screen.length) {
237
+ screen.push('');
238
+ }
239
+ // Ensure line is long enough
240
+ const line = screen[cursorRow];
241
+ if (cursorCol > line.length) {
242
+ screen[cursorRow] = line + ' '.repeat(cursorCol - line.length);
243
+ }
244
+ // Write character
245
+ const currentLine = screen[cursorRow];
246
+ screen[cursorRow] = currentLine.substring(0, cursorCol) + char + currentLine.substring(cursorCol + 1);
247
+ cursorCol++;
248
+ // Track max row
249
+ if (cursorRow > maxRowUsed) {
250
+ maxRowUsed = cursorRow;
239
251
  }
240
252
  }
253
+ // Skip other control characters (0x01-0x1A except those handled above)
254
+ i++;
255
+ }
256
+ // Extract the used portion of the screen
257
+ const outputLines = [];
258
+ for (let row = 0; row <= maxRowUsed; row++) {
259
+ outputLines.push((screen[row] || '').trimEnd());
241
260
  }
261
+ // Join lines and clean up
262
+ let result = outputLines.join('\n');
263
+ // Clean up excessive newlines (max 2 consecutive)
264
+ result = result.replace(/\n{3,}/g, '\n\n');
265
+ // Remove leading empty lines
266
+ result = result.replace(/^\n+/, '');
267
+ // Trim trailing whitespace
268
+ result = result.trimEnd();
242
269
  return result;
243
270
  }
244
271
  //# 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centaurus-cli",
3
- "version": "2.9.0",
3
+ "version": "2.9.2",
4
4
  "description": "A powerful command-line AI coding assistant with Google Gemini support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -62,6 +62,7 @@
62
62
  "ink-select-input": "^5.0.0",
63
63
  "ink-spinner": "^5.0.0",
64
64
  "ink-text-input": "^5.0.1",
65
+ "js-tiktoken": "^1.0.21",
65
66
  "open": "^10.1.0",
66
67
  "react": "^18.3.1",
67
68
  "ssh2": "^1.15.0",