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.
- package/dist/cli-adapter.d.ts +78 -0
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +566 -165
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/build-config.d.ts +1 -1
- package/dist/config/build-config.js +1 -1
- package/dist/config/mcp-config-manager.d.ts +21 -0
- package/dist/config/mcp-config-manager.d.ts.map +1 -1
- package/dist/config/mcp-config-manager.js +184 -1
- package/dist/config/mcp-config-manager.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +7 -2
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +5 -3
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/index.js +66 -11
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.d.ts +34 -3
- package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-command-handler.js +171 -83
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
- package/dist/mcp/mcp-server-manager.js +9 -23
- package/dist/mcp/mcp-server-manager.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +42 -5
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-service-client.d.ts +6 -1
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +6 -6
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.d.ts +20 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +35 -0
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/input-detection-agent.d.ts +40 -0
- package/dist/services/input-detection-agent.d.ts.map +1 -0
- package/dist/services/input-detection-agent.js +213 -0
- package/dist/services/input-detection-agent.js.map +1 -0
- package/dist/services/input-requirement-detector.d.ts +28 -0
- package/dist/services/input-requirement-detector.d.ts.map +1 -0
- package/dist/services/input-requirement-detector.js +203 -0
- package/dist/services/input-requirement-detector.js.map +1 -0
- package/dist/services/monitored-shell-manager.d.ts +120 -0
- package/dist/services/monitored-shell-manager.d.ts.map +1 -0
- package/dist/services/monitored-shell-manager.js +239 -0
- package/dist/services/monitored-shell-manager.js.map +1 -0
- package/dist/services/session-quota-manager.d.ts +101 -0
- package/dist/services/session-quota-manager.d.ts.map +1 -0
- package/dist/services/session-quota-manager.js +242 -0
- package/dist/services/session-quota-manager.js.map +1 -0
- package/dist/services/shell-input-agent.d.ts +89 -0
- package/dist/services/shell-input-agent.d.ts.map +1 -0
- package/dist/services/shell-input-agent.js +361 -0
- package/dist/services/shell-input-agent.js.map +1 -0
- package/dist/services/sub-agent-manager.d.ts +139 -0
- package/dist/services/sub-agent-manager.d.ts.map +1 -0
- package/dist/services/sub-agent-manager.js +517 -0
- package/dist/services/sub-agent-manager.js.map +1 -0
- package/dist/tools/background-command.d.ts.map +1 -1
- package/dist/tools/background-command.js +33 -13
- package/dist/tools/background-command.js.map +1 -1
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +78 -4
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/file-ops.d.ts.map +1 -1
- package/dist/tools/file-ops.js +33 -19
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/get-diff.d.ts.map +1 -1
- package/dist/tools/get-diff.js +5 -2
- package/dist/tools/get-diff.js.map +1 -1
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +41 -15
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/plan-mode.js +3 -3
- package/dist/tools/plan-mode.js.map +1 -1
- package/dist/tools/registry.js +1 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/sub-agent.d.ts +9 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +232 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/task-complete.d.ts.map +1 -1
- package/dist/tools/task-complete.js +14 -32
- package/dist/tools/task-complete.js.map +1 -1
- package/dist/ui/components/App.d.ts +45 -0
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +598 -95
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/CircularSelectInput.d.ts +24 -0
- package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
- package/dist/ui/components/CircularSelectInput.js +71 -0
- package/dist/ui/components/CircularSelectInput.js.map +1 -0
- package/dist/ui/components/ErrorBoundary.d.ts +3 -2
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/ui/components/ErrorBoundary.js +29 -1
- package/dist/ui/components/ErrorBoundary.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +4 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +40 -2
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +6 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +57 -6
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/MCPAddScreen.d.ts +13 -0
- package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPAddScreen.js +54 -0
- package/dist/ui/components/MCPAddScreen.js.map +1 -0
- package/dist/ui/components/MCPListScreen.d.ts +17 -0
- package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPListScreen.js +50 -0
- package/dist/ui/components/MCPListScreen.js.map +1 -0
- package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
- package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPServerListScreen.js +59 -0
- package/dist/ui/components/MCPServerListScreen.js.map +1 -0
- package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
- package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
- package/dist/ui/components/MonitorModeAIPanel.js +69 -0
- package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
- package/dist/ui/components/MultiLineInput.d.ts +13 -0
- package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
- package/dist/ui/components/MultiLineInput.js +223 -0
- package/dist/ui/components/MultiLineInput.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +2 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +33 -2
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +271 -12
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.js +3 -2
- package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
- package/dist/utils/editor-utils.d.ts +3 -3
- package/dist/utils/editor-utils.d.ts.map +1 -1
- package/dist/utils/editor-utils.js +15 -12
- package/dist/utils/editor-utils.js.map +1 -1
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +1 -0
- 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 +198 -171
- package/dist/utils/terminal-output.js.map +1 -1
- 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
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
|
18
|
-
* @returns String with
|
|
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
|
-
|
|
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 === '\
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
cursorPos =
|
|
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 <
|
|
43
|
-
|
|
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
|
-
|
|
59
|
+
// Append to line
|
|
60
|
+
currentLine += char;
|
|
47
61
|
}
|
|
48
62
|
cursorPos++;
|
|
49
63
|
}
|
|
50
64
|
}
|
|
51
|
-
//
|
|
52
|
-
|
|
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
|
-
//
|
|
70
|
-
//
|
|
71
|
-
// This
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
let
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
|
|
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
|
-
//
|
|
90
|
-
.replace(/\x1b\[
|
|
91
|
-
//
|
|
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
|
|
112
|
+
// DEC private mode sequences
|
|
109
113
|
.replace(/\x1b\[\?[\d;]+[a-zA-Z]/g, '')
|
|
110
|
-
// Set/reset mode
|
|
114
|
+
// Set/reset mode
|
|
111
115
|
.replace(/\x1b\[\d*[hl]/g, '')
|
|
112
|
-
//
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
.replace(/\x1b
|
|
122
|
-
//
|
|
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
|
|
125
|
-
//
|
|
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
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
//
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
repeatCount = 0;
|
|
213
|
+
else if (char === '\n') {
|
|
214
|
+
// Newline - move to next line
|
|
215
|
+
cursorRow++;
|
|
216
|
+
cursorCol = 0;
|
|
191
217
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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":"AAAA;;;;;;;;GAQG;AAEH
|
|
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.
|
|
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",
|