centaurus-cli 2.8.9 → 2.9.0
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 +21 -2
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +302 -68
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/models.d.ts +8 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +29 -0
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts +1 -0
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +13 -1
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/hooks/useConnectivity.d.ts +2 -0
- package/dist/hooks/useConnectivity.d.ts.map +1 -0
- package/dist/hooks/useConnectivity.js +12 -0
- package/dist/hooks/useConnectivity.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-command-handler.js +0 -3
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +8 -0
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-service-client.d.ts +1 -0
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.d.ts +26 -40
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +32 -34
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/connectivity-manager.d.ts +18 -0
- package/dist/services/connectivity-manager.d.ts.map +1 -0
- package/dist/services/connectivity-manager.js +72 -0
- package/dist/services/connectivity-manager.js.map +1 -0
- package/dist/services/local-chat-storage.d.ts +5 -0
- package/dist/services/local-chat-storage.d.ts.map +1 -1
- package/dist/services/local-chat-storage.js +33 -0
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/tools/background-command.d.ts +11 -0
- package/dist/tools/background-command.d.ts.map +1 -0
- package/dist/tools/background-command.js +162 -0
- package/dist/tools/background-command.js.map +1 -0
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +6 -3
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/create-image.d.ts +10 -0
- package/dist/tools/create-image.d.ts.map +1 -0
- package/dist/tools/create-image.js +189 -0
- package/dist/tools/create-image.js.map +1 -0
- package/dist/ui/components/App.d.ts +3 -2
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +127 -44
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/ContextWindowIndicator.d.ts.map +1 -1
- package/dist/ui/components/ContextWindowIndicator.js +43 -22
- package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +198 -199
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
- package/dist/ui/components/MessageDisplay.js +8 -15
- package/dist/ui/components/MessageDisplay.js.map +1 -1
- package/dist/ui/components/SlashCommandAutocomplete.d.ts +2 -0
- package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +1 -1
- package/dist/ui/components/SlashCommandAutocomplete.js +19 -10
- package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +4 -0
- 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 +153 -39
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/ToolExecutionStatus.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionStatus.js +1 -0
- package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
- package/dist/utils/chat-formatter.d.ts +12 -0
- package/dist/utils/chat-formatter.d.ts.map +1 -0
- package/dist/utils/chat-formatter.js +326 -0
- package/dist/utils/chat-formatter.js.map +1 -0
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +139 -20
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/text-clipboard.d.ts +12 -0
- package/dist/utils/text-clipboard.d.ts.map +1 -0
- package/dist/utils/text-clipboard.js +63 -0
- package/dist/utils/text-clipboard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Formatter Utility
|
|
3
|
+
*
|
|
4
|
+
* Formats chat messages into human-readable text for clipboard sharing.
|
|
5
|
+
* Converts internal tool call JSON and execution data into readable descriptions.
|
|
6
|
+
*/
|
|
7
|
+
import stripAnsi from 'strip-ansi';
|
|
8
|
+
/**
|
|
9
|
+
* Clean Unicode characters that might get corrupted in clipboard.
|
|
10
|
+
* Removes emojis, box-drawing characters, and other problematic Unicode.
|
|
11
|
+
*/
|
|
12
|
+
function cleanUnicode(text) {
|
|
13
|
+
return text
|
|
14
|
+
// Remove box-drawing characters (used in UI borders)
|
|
15
|
+
.replace(/[\u2500-\u257F]/g, '')
|
|
16
|
+
// Remove block elements
|
|
17
|
+
.replace(/[\u2580-\u259F]/g, '')
|
|
18
|
+
// Remove emojis and pictographs (replace with text equivalents)
|
|
19
|
+
.replace(/✓/g, '[OK]')
|
|
20
|
+
.replace(/✗/g, '[FAIL]')
|
|
21
|
+
.replace(/📖/g, '[READ]')
|
|
22
|
+
.replace(/📁/g, '[DIR]')
|
|
23
|
+
.replace(/📂/g, '[DIR]')
|
|
24
|
+
.replace(/📄/g, '[FILE]')
|
|
25
|
+
.replace(/✅/g, '[DONE]')
|
|
26
|
+
.replace(/❌/g, '[ERROR]')
|
|
27
|
+
.replace(/📭/g, '[EMPTY]')
|
|
28
|
+
.replace(/📋/g, '[CLIPBOARD]')
|
|
29
|
+
.replace(/🔗/g, '[LINK]')
|
|
30
|
+
.replace(/🔌/g, '[DISCONNECT]')
|
|
31
|
+
.replace(/⚠️/g, '[WARNING]')
|
|
32
|
+
.replace(/🆕/g, '[NEW]')
|
|
33
|
+
// Remove remaining emojis (broad Unicode ranges)
|
|
34
|
+
.replace(/[\u{1F300}-\u{1F9FF}]/gu, '')
|
|
35
|
+
.replace(/[\u{2600}-\u{26FF}]/gu, '')
|
|
36
|
+
.replace(/[\u{2700}-\u{27BF}]/gu, '')
|
|
37
|
+
// Remove common corrupted sequences (Γ, ≡, etc.)
|
|
38
|
+
.replace(/Γ[^\s]*/g, '')
|
|
39
|
+
.replace(/≡[^\s]*/g, '')
|
|
40
|
+
// Clean up extra whitespace from removals
|
|
41
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
42
|
+
.trim();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Format a tool execution into human-readable text.
|
|
46
|
+
*/
|
|
47
|
+
function formatToolExecution(toolExecution) {
|
|
48
|
+
const { toolName, status, result, error, arguments: args } = toolExecution;
|
|
49
|
+
// Only format completed or error executions
|
|
50
|
+
if (status !== 'completed' && status !== 'error') {
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
const statusLabel = status === 'completed' ? '✓' : '✗';
|
|
54
|
+
// Clean result output (remove ANSI codes)
|
|
55
|
+
const cleanResult = result ? stripAnsi(result).trim() : '';
|
|
56
|
+
// Helper to truncate long content
|
|
57
|
+
const truncate = (text, maxLen = 3000) => {
|
|
58
|
+
if (text.length <= maxLen)
|
|
59
|
+
return text;
|
|
60
|
+
return text.substring(0, maxLen) + '\n... (content truncated)';
|
|
61
|
+
};
|
|
62
|
+
// Handle different tool types
|
|
63
|
+
switch (toolName) {
|
|
64
|
+
case 'execute_command': {
|
|
65
|
+
const command = args?.command || args?.CommandLine || args?.commandLine || 'unknown command';
|
|
66
|
+
const cwd = args?.cwd || '';
|
|
67
|
+
let output = `${statusLabel} The assistant ran a shell command: \`${command}\``;
|
|
68
|
+
if (cwd) {
|
|
69
|
+
output += ` (in directory: ${cwd})`;
|
|
70
|
+
}
|
|
71
|
+
if (cleanResult) {
|
|
72
|
+
output += `\n\nOutput:\n\`\`\`\n${truncate(cleanResult, 2000)}\n\`\`\``;
|
|
73
|
+
}
|
|
74
|
+
if (status === 'error' && error) {
|
|
75
|
+
output += `\n\nError: ${error}`;
|
|
76
|
+
}
|
|
77
|
+
return output;
|
|
78
|
+
}
|
|
79
|
+
case 'view_file': {
|
|
80
|
+
const filePath = args?.AbsolutePath || args?.file_path || 'unknown file';
|
|
81
|
+
const startLine = args?.StartLine;
|
|
82
|
+
const endLine = args?.EndLine;
|
|
83
|
+
let output = `${statusLabel} The assistant read file: \`${filePath}\``;
|
|
84
|
+
if (startLine && endLine) {
|
|
85
|
+
output += ` (lines ${startLine}-${endLine})`;
|
|
86
|
+
}
|
|
87
|
+
// Include the file contents from the result
|
|
88
|
+
if (cleanResult) {
|
|
89
|
+
output += `\n\nFile contents:\n\`\`\`\n${truncate(cleanResult)}\n\`\`\``;
|
|
90
|
+
}
|
|
91
|
+
return output;
|
|
92
|
+
}
|
|
93
|
+
case 'write_to_file': {
|
|
94
|
+
const filePath = args?.TargetFile || args?.file_path || 'unknown file';
|
|
95
|
+
const content = args?.CodeContent || '';
|
|
96
|
+
const lines = content ? content.split('\n').length : 0;
|
|
97
|
+
let output = `${statusLabel} The assistant wrote to file: \`${filePath}\` (${lines} lines)`;
|
|
98
|
+
// Include the content that was written
|
|
99
|
+
if (content) {
|
|
100
|
+
output += `\n\nNew file contents:\n\`\`\`\n${truncate(content)}\n\`\`\``;
|
|
101
|
+
}
|
|
102
|
+
return output;
|
|
103
|
+
}
|
|
104
|
+
case 'edit_file':
|
|
105
|
+
case 'replace_file_content': {
|
|
106
|
+
const filePath = args?.file_path || args?.TargetFile || 'unknown file';
|
|
107
|
+
const targetContent = args?.TargetContent || args?.target_content || '';
|
|
108
|
+
const replacementContent = args?.ReplacementContent || args?.replacement_content || '';
|
|
109
|
+
let output = `${statusLabel} The assistant edited file: \`${filePath}\``;
|
|
110
|
+
// Include the edit details
|
|
111
|
+
if (targetContent || replacementContent) {
|
|
112
|
+
output += `\n\nEdit made:`;
|
|
113
|
+
if (targetContent) {
|
|
114
|
+
output += `\n\nOriginal:\n\`\`\`\n${truncate(targetContent, 500)}\n\`\`\``;
|
|
115
|
+
}
|
|
116
|
+
if (replacementContent) {
|
|
117
|
+
output += `\n\nReplaced with:\n\`\`\`\n${truncate(replacementContent, 500)}\n\`\`\``;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return output;
|
|
121
|
+
}
|
|
122
|
+
case 'multi_edit_file':
|
|
123
|
+
case 'multi_replace_file_content': {
|
|
124
|
+
const filePath = args?.file_path || args?.TargetFile || 'unknown file';
|
|
125
|
+
const chunks = args?.ReplacementChunks || args?.edits || [];
|
|
126
|
+
let output = `${statusLabel} The assistant made ${chunks.length || 'multiple'} edits to file: \`${filePath}\``;
|
|
127
|
+
// Include each edit
|
|
128
|
+
if (Array.isArray(chunks) && chunks.length > 0) {
|
|
129
|
+
output += `\n\nEdits made:`;
|
|
130
|
+
chunks.slice(0, 5).forEach((chunk, i) => {
|
|
131
|
+
const target = chunk.TargetContent || chunk.target_content || '';
|
|
132
|
+
const replacement = chunk.ReplacementContent || chunk.replacement_content || '';
|
|
133
|
+
output += `\n\n**Edit ${i + 1}:**`;
|
|
134
|
+
if (target) {
|
|
135
|
+
output += `\nOriginal:\n\`\`\`\n${truncate(target, 300)}\n\`\`\``;
|
|
136
|
+
}
|
|
137
|
+
if (replacement) {
|
|
138
|
+
output += `\nReplaced with:\n\`\`\`\n${truncate(replacement, 300)}\n\`\`\``;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
if (chunks.length > 5) {
|
|
142
|
+
output += `\n\n... and ${chunks.length - 5} more edits`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return output;
|
|
146
|
+
}
|
|
147
|
+
case 'list_dir': {
|
|
148
|
+
const dirPath = args?.DirectoryPath || args?.directory || 'unknown directory';
|
|
149
|
+
let output = `${statusLabel} The assistant listed directory: \`${dirPath}\``;
|
|
150
|
+
if (cleanResult) {
|
|
151
|
+
output += `\n\nContents:\n\`\`\`\n${truncate(cleanResult, 1000)}\n\`\`\``;
|
|
152
|
+
}
|
|
153
|
+
return output;
|
|
154
|
+
}
|
|
155
|
+
case 'grep_search': {
|
|
156
|
+
const query = args?.Query || args?.query || 'unknown query';
|
|
157
|
+
let output = `${statusLabel} The assistant searched for: "${query}"`;
|
|
158
|
+
if (cleanResult) {
|
|
159
|
+
output += `\n\nSearch results:\n\`\`\`\n${truncate(cleanResult, 1500)}\n\`\`\``;
|
|
160
|
+
}
|
|
161
|
+
return output;
|
|
162
|
+
}
|
|
163
|
+
case 'find_files':
|
|
164
|
+
case 'find_by_name': {
|
|
165
|
+
const pattern = args?.pattern || args?.Pattern || '*';
|
|
166
|
+
let output = `${statusLabel} The assistant searched for files matching: "${pattern}"`;
|
|
167
|
+
if (cleanResult) {
|
|
168
|
+
output += `\n\nFiles found:\n\`\`\`\n${truncate(cleanResult, 1000)}\n\`\`\``;
|
|
169
|
+
}
|
|
170
|
+
return output;
|
|
171
|
+
}
|
|
172
|
+
case 'web_search':
|
|
173
|
+
case 'search_web': {
|
|
174
|
+
const query = args?.query || 'unknown query';
|
|
175
|
+
let output = `${statusLabel} The assistant searched the web for: "${query}"`;
|
|
176
|
+
if (cleanResult) {
|
|
177
|
+
output += `\n\nSearch results:\n${truncate(cleanResult, 2000)}`;
|
|
178
|
+
}
|
|
179
|
+
return output;
|
|
180
|
+
}
|
|
181
|
+
case 'fetch_url':
|
|
182
|
+
case 'read_url_content': {
|
|
183
|
+
const url = args?.url || args?.Url || 'unknown URL';
|
|
184
|
+
let output = `${statusLabel} The assistant fetched URL: ${url}`;
|
|
185
|
+
if (cleanResult) {
|
|
186
|
+
output += `\n\nContent:\n${truncate(cleanResult, 2000)}`;
|
|
187
|
+
}
|
|
188
|
+
return output;
|
|
189
|
+
}
|
|
190
|
+
case 'view_code_item':
|
|
191
|
+
case 'inspect_symbol': {
|
|
192
|
+
const filePath = args?.filePath || args?.File || 'unknown file';
|
|
193
|
+
const nodePaths = args?.NodePaths || args?.symbols || [];
|
|
194
|
+
let output = `${statusLabel} The assistant inspected code in: \`${filePath}\``;
|
|
195
|
+
if (Array.isArray(nodePaths) && nodePaths.length > 0) {
|
|
196
|
+
output += ` (symbols: ${nodePaths.join(', ')})`;
|
|
197
|
+
}
|
|
198
|
+
if (cleanResult) {
|
|
199
|
+
output += `\n\nCode:\n\`\`\`\n${truncate(cleanResult)}\n\`\`\``;
|
|
200
|
+
}
|
|
201
|
+
return output;
|
|
202
|
+
}
|
|
203
|
+
case 'view_file_outline': {
|
|
204
|
+
const filePath = args?.AbsolutePath || 'unknown file';
|
|
205
|
+
let output = `${statusLabel} The assistant viewed outline of: \`${filePath}\``;
|
|
206
|
+
if (cleanResult) {
|
|
207
|
+
output += `\n\nOutline:\n\`\`\`\n${truncate(cleanResult, 1500)}\n\`\`\``;
|
|
208
|
+
}
|
|
209
|
+
return output;
|
|
210
|
+
}
|
|
211
|
+
case 'read_binary_file': {
|
|
212
|
+
const filePath = args?.file_path || 'unknown file';
|
|
213
|
+
return `${statusLabel} The assistant uploaded binary file: \`${filePath}\``;
|
|
214
|
+
}
|
|
215
|
+
case 'create_image':
|
|
216
|
+
case 'generate_image': {
|
|
217
|
+
const outputPath = args?.output_path || args?.ImageName || 'unknown path';
|
|
218
|
+
const prompt = args?.Prompt || args?.image_prompt || '';
|
|
219
|
+
let output = `${statusLabel} The assistant generated an image: \`${outputPath}\``;
|
|
220
|
+
if (prompt) {
|
|
221
|
+
output += `\n\nPrompt used: "${truncate(prompt, 500)}"`;
|
|
222
|
+
}
|
|
223
|
+
return output;
|
|
224
|
+
}
|
|
225
|
+
default: {
|
|
226
|
+
// Check for MCP tools (mcp_servername_toolname)
|
|
227
|
+
if (toolName.startsWith('mcp_')) {
|
|
228
|
+
const parts = toolName.slice(4).split('_');
|
|
229
|
+
const serverName = parts[0] || 'unknown';
|
|
230
|
+
const mcpToolName = parts.slice(1).join('_') || 'unknown';
|
|
231
|
+
let output = `${statusLabel} The assistant used MCP tool: ${serverName}.${mcpToolName}`;
|
|
232
|
+
// Include the full MCP result
|
|
233
|
+
if (cleanResult) {
|
|
234
|
+
output += `\n\nResult:\n\`\`\`\n${truncate(cleanResult)}\n\`\`\``;
|
|
235
|
+
}
|
|
236
|
+
return output;
|
|
237
|
+
}
|
|
238
|
+
// Generic tool formatting
|
|
239
|
+
let output = `${statusLabel} The assistant used tool: ${toolName}`;
|
|
240
|
+
if (cleanResult) {
|
|
241
|
+
output += `\n\nResult:\n\`\`\`\n${truncate(cleanResult, 1000)}\n\`\`\``;
|
|
242
|
+
}
|
|
243
|
+
return output;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Format a single message into human-readable text.
|
|
249
|
+
*/
|
|
250
|
+
function formatMessage(message) {
|
|
251
|
+
const { role, content, toolExecution, isCommandMode, taskCompletion, planAccepted, connectionStatus } = message;
|
|
252
|
+
// Skip system messages
|
|
253
|
+
if (role === 'system') {
|
|
254
|
+
return '';
|
|
255
|
+
}
|
|
256
|
+
// Handle connection status messages
|
|
257
|
+
if (connectionStatus) {
|
|
258
|
+
const { type, status, connectionString, error: connError } = connectionStatus;
|
|
259
|
+
if (status === 'connected') {
|
|
260
|
+
return `🔗 Connected to ${type.toUpperCase()}: ${connectionString || 'session'}`;
|
|
261
|
+
}
|
|
262
|
+
else if (status === 'disconnected') {
|
|
263
|
+
return `🔌 Disconnected from ${type.toUpperCase()} session`;
|
|
264
|
+
}
|
|
265
|
+
else if (status === 'error') {
|
|
266
|
+
return `❌ ${type.toUpperCase()} connection error: ${connError || 'unknown error'}`;
|
|
267
|
+
}
|
|
268
|
+
return '';
|
|
269
|
+
}
|
|
270
|
+
// Handle plan accepted messages
|
|
271
|
+
if (planAccepted) {
|
|
272
|
+
const { planTitle, totalTasks } = planAccepted;
|
|
273
|
+
return `📋 Plan accepted: "${planTitle || 'Implementation Plan'}" with ${totalTasks || 0} tasks`;
|
|
274
|
+
}
|
|
275
|
+
// Handle task completion messages
|
|
276
|
+
if (taskCompletion) {
|
|
277
|
+
const { taskNumber, totalTasks, taskDescription, completionNote } = taskCompletion;
|
|
278
|
+
let output = `✅ Task ${taskNumber}/${totalTasks} completed: ${taskDescription}`;
|
|
279
|
+
if (completionNote) {
|
|
280
|
+
output += `\nNote: ${completionNote}`;
|
|
281
|
+
}
|
|
282
|
+
return output;
|
|
283
|
+
}
|
|
284
|
+
// Handle tool execution messages
|
|
285
|
+
if (toolExecution) {
|
|
286
|
+
return formatToolExecution(toolExecution);
|
|
287
|
+
}
|
|
288
|
+
// Handle user messages
|
|
289
|
+
if (role === 'user') {
|
|
290
|
+
if (isCommandMode) {
|
|
291
|
+
return `## User (Terminal Command)\n\`\`\`\n${content}\n\`\`\``;
|
|
292
|
+
}
|
|
293
|
+
return `## User\n${content}`;
|
|
294
|
+
}
|
|
295
|
+
// Handle assistant messages
|
|
296
|
+
if (role === 'assistant') {
|
|
297
|
+
if (content && content.trim()) {
|
|
298
|
+
return `## Assistant\n${content}`;
|
|
299
|
+
}
|
|
300
|
+
return '';
|
|
301
|
+
}
|
|
302
|
+
// Handle tool result messages (usually internal, skip)
|
|
303
|
+
if (role === 'tool') {
|
|
304
|
+
return '';
|
|
305
|
+
}
|
|
306
|
+
return '';
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Format entire chat history into human-readable text for clipboard sharing.
|
|
310
|
+
*/
|
|
311
|
+
export function formatChatForClipboard(messages) {
|
|
312
|
+
const header = `# Chat Session Export
|
|
313
|
+
Generated: ${new Date().toLocaleString()}
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
`;
|
|
317
|
+
const formattedMessages = messages
|
|
318
|
+
.map(formatMessage)
|
|
319
|
+
.filter(text => text.trim() !== '')
|
|
320
|
+
.join('\n\n---\n\n');
|
|
321
|
+
if (!formattedMessages) {
|
|
322
|
+
return cleanUnicode(header + 'No messages in this chat session.');
|
|
323
|
+
}
|
|
324
|
+
return cleanUnicode(header + formattedMessages);
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=chat-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-formatter.js","sourceRoot":"","sources":["../../src/utils/chat-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-classifier.d.ts","sourceRoot":"","sources":["../../src/utils/input-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"input-classifier.d.ts","sourceRoot":"","sources":["../../src/utils/input-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;AA0b3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAyGvD"}
|
|
@@ -11,6 +11,7 @@ const SLASH_COMMANDS = new Set([
|
|
|
11
11
|
'model', 'm',
|
|
12
12
|
'config', 'c', 'settings',
|
|
13
13
|
'clear', 'cls', 'reset',
|
|
14
|
+
'sync',
|
|
14
15
|
'clean-ui', 'refresh-ui', 'redraw',
|
|
15
16
|
'exit', 'quit', 'q',
|
|
16
17
|
'session', 's',
|
|
@@ -25,53 +26,125 @@ const SLASH_COMMANDS = new Set([
|
|
|
25
26
|
'quality',
|
|
26
27
|
'autonomous',
|
|
27
28
|
'add-command', 'add-command-auto-detect',
|
|
28
|
-
'background-task', 'bkg', 'bg-task'
|
|
29
|
+
'background-task', 'bkg', 'bg-task',
|
|
30
|
+
'copy-chat-context'
|
|
29
31
|
]);
|
|
30
32
|
// Commands that are definitely terminal commands (not ambiguous with natural language)
|
|
31
33
|
const DEFINITE_COMMANDS = new Set([
|
|
32
34
|
// Package Managers
|
|
33
35
|
'npm', 'yarn', 'pnpm', 'bun', 'npx', 'gem', 'pip', 'pip3', 'conda', 'cargo', 'composer', 'mvn', 'gradle',
|
|
36
|
+
// Package managers (extended)
|
|
37
|
+
'apt', 'apt-get', 'apt-cache', 'dpkg', 'yum', 'dnf', 'rpm', 'zypper', 'pacman', 'emerge',
|
|
38
|
+
'port', 'brew', 'choco', 'scoop', 'winget', 'snap', 'flatpak', 'nix', 'nix-env', 'apk',
|
|
34
39
|
// Version Control
|
|
35
|
-
'git', 'svn', 'hg', 'gh',
|
|
40
|
+
'git', 'svn', 'hg', 'gh', 'gitk', 'tig',
|
|
36
41
|
// File Operations (non-ambiguous)
|
|
37
42
|
'ls', 'cd', 'pwd', 'mkdir', 'rm', 'cp', 'mv', 'cat', 'less', 'more', 'chmod', 'chown', 'chgrp', 'ln',
|
|
43
|
+
'stat', 'file', 'realpath', 'basename', 'dirname', 'readlink', 'dd', 'truncate', 'shred', 'sync',
|
|
44
|
+
'mktemp', 'install', 'xargs', 'tee', 'touch',
|
|
38
45
|
// Editors
|
|
39
46
|
'vim', 'nvim', 'vi', 'nano', 'emacs', 'micro', 'helix', 'hx', 'pico', 'joe', 'ne', 'mcedit', 'code',
|
|
47
|
+
'subl', 'atom', 'gedit', 'kate', 'notepad', 'notepad++',
|
|
40
48
|
// System / Process
|
|
41
49
|
'ps', 'kill', 'killall', 'htop', 'btop', 'free', 'df', 'du', 'whoami', 'su', 'sudo',
|
|
50
|
+
'nice', 'renice', 'nohup', 'timeout', 'strace', 'ltrace', 'pgrep', 'pkill', 'fuser', 'pstree',
|
|
42
51
|
// Network
|
|
43
52
|
'curl', 'wget', 'ssh', 'scp', 'ping', 'telnet', 'nc', 'netstat', 'lsof', 'dig', 'nslookup', 'ip', 'ifconfig', 'traceroute',
|
|
53
|
+
'arp', 'route', 'ss', 'tcpdump', 'nmap', 'iptables', 'ip6tables', 'firewall-cmd', 'ufw',
|
|
54
|
+
'socat', 'rsync', 'ftp', 'sftp', 'sshfs', 'rclone', 'mtr', 'host', 'whois',
|
|
44
55
|
// Build / Run (non-ambiguous)
|
|
45
56
|
'cmake', 'docker', 'docker-compose', 'kubectl', 'python', 'python3', 'ruby', 'perl', 'php', 'java', 'gcc', 'g++', 'clang',
|
|
57
|
+
'javac', 'dotnet', 'mono', 'swift', 'swiftc', 'kotlinc', 'scalac', 'elixir', 'mix', 'iex',
|
|
46
58
|
// Shell / Subshells
|
|
47
|
-
'echo', 'env', 'cal',
|
|
59
|
+
'echo', 'env', 'cal', 'printenv',
|
|
48
60
|
'wsl', 'bash', 'sh', 'zsh', 'fish', 'powershell', 'pwsh', 'cmd',
|
|
61
|
+
'ksh', 'csh', 'tcsh', 'ash', 'dash',
|
|
62
|
+
// Shell built-ins (critical additions)
|
|
63
|
+
'exit', 'logout', 'return', 'break', 'continue',
|
|
64
|
+
'alias', 'unalias', 'builtin', 'command',
|
|
65
|
+
'exec', 'eval', 'declare', 'local', 'readonly',
|
|
66
|
+
'enable', 'disable', 'ulimit', 'umask', 'trap',
|
|
67
|
+
'jobs', 'fg', 'bg', 'disown', 'suspend', 'times',
|
|
68
|
+
'pushd', 'popd', 'dirs', 'cd', 'pwd',
|
|
69
|
+
'fc', 'bind', 'complete', 'compgen', 'compopt', 'shopt',
|
|
70
|
+
'history', 'clear', 'reset', 'tput', 'stty',
|
|
71
|
+
// Session/User management
|
|
72
|
+
'login', 'newgrp', 'groups', 'id', 'users', 'finger', 'w', 'who', 'last', 'lastlog',
|
|
73
|
+
'useradd', 'userdel', 'usermod', 'passwd', 'chpasswd',
|
|
74
|
+
'groupadd', 'groupdel', 'groupmod', 'adduser', 'deluser',
|
|
49
75
|
// Archives
|
|
50
|
-
'tar', 'zip', 'unzip', 'gzip', 'gunzip', '7z', 'rar',
|
|
76
|
+
'tar', 'zip', 'unzip', 'gzip', 'gunzip', '7z', 'rar', 'bzip2', 'bunzip2', 'xz', 'unxz', 'zstd',
|
|
51
77
|
// Search (non-ambiguous)
|
|
52
|
-
'grep', 'locate', 'sed', 'awk', 'ack', 'ag', 'rg',
|
|
78
|
+
'grep', 'egrep', 'fgrep', 'locate', 'sed', 'awk', 'gawk', 'ack', 'ag', 'rg', 'fd', 'fzf',
|
|
79
|
+
// Text processing
|
|
80
|
+
'tr', 'wc', 'nl', 'uniq', 'rev', 'tac', 'hexdump', 'xxd', 'od', 'strings',
|
|
81
|
+
'expand', 'unexpand', 'column', 'colrm', 'csplit', 'pr', 'tsort', 'comm',
|
|
53
82
|
// Misc
|
|
54
|
-
'jq', 'yq', 'crontab', 'visudo', 'vipw', 'sudoedit',
|
|
83
|
+
'jq', 'yq', 'crontab', 'visudo', 'vipw', 'sudoedit', 'at', 'batch',
|
|
55
84
|
// Cloud / DevOps
|
|
56
|
-
'aws', 'az', 'gcloud', 'terraform', 'ansible', 'kubectl', 'helm', 'vagrant',
|
|
85
|
+
'aws', 'az', 'gcloud', 'terraform', 'ansible', 'ansible-playbook', 'kubectl', 'helm', 'vagrant',
|
|
86
|
+
'pulumi', 'cdk', 'sam', 'serverless', 'flyctl', 'heroku', 'vercel', 'netlify',
|
|
57
87
|
// Database
|
|
58
|
-
'mysql', 'psql', 'mongo', 'mongod', 'redis-cli', 'sqlite3',
|
|
88
|
+
'mysql', 'psql', 'mongo', 'mongod', 'mongosh', 'redis-cli', 'sqlite3', 'pg_dump', 'mysqldump',
|
|
59
89
|
// Web / Security
|
|
60
|
-
'openssl', 'certbot', 'nginx', 'apache2', 'httpd',
|
|
90
|
+
'openssl', 'certbot', 'nginx', 'apache2', 'httpd', 'gpg', 'ssh-keygen', 'ssh-agent', 'ssh-add',
|
|
61
91
|
// Language runtimes (non-ambiguous)
|
|
62
92
|
'node', 'deno', 'ts-node', 'tsx', 'esbuild', 'webpack', 'vite', 'rollup', 'parcel',
|
|
93
|
+
'jest', 'vitest', 'mocha', 'pytest', 'phpunit', 'rspec',
|
|
63
94
|
// Go
|
|
64
|
-
'go',
|
|
95
|
+
'go', 'gofmt', 'golint', 'gopls',
|
|
65
96
|
// Rust
|
|
66
|
-
'rustc', 'rustup',
|
|
97
|
+
'rustc', 'rustup', 'rustfmt', 'clippy',
|
|
98
|
+
// System info
|
|
99
|
+
'uname', 'hostname', 'uptime', 'arch', 'nproc', 'lscpu', 'lsblk', 'lsusb', 'lspci',
|
|
100
|
+
'dmidecode', 'dmesg', 'sysctl', 'modprobe', 'lsmod', 'insmod', 'rmmod',
|
|
101
|
+
// Services/Daemons
|
|
102
|
+
'systemctl', 'service', 'journalctl', 'loginctl', 'chkconfig', 'update-rc.d', 'launchctl',
|
|
103
|
+
// Disk/Storage
|
|
104
|
+
'mount', 'umount', 'fdisk', 'parted', 'mkfs', 'fsck', 'blkid', 'findmnt', 'quota', 'hdparm',
|
|
105
|
+
// Windows-specific commands
|
|
106
|
+
'dir', 'copy', 'move', 'del', 'ren', 'rename', 'attrib', 'cls', 'md', 'rd', 'rmdir',
|
|
107
|
+
'xcopy', 'robocopy', 'icacls', 'cacls', 'takeown',
|
|
108
|
+
'tasklist', 'taskkill', 'systeminfo', 'ipconfig', 'netsh', 'pathping',
|
|
109
|
+
'reg', 'regedit', 'schtasks', 'wmic', 'where', 'findstr', 'fc', 'comp',
|
|
110
|
+
'chkdsk', 'sfc', 'dism', 'bcdedit', 'diskpart', 'format', 'label', 'vol',
|
|
111
|
+
'net', 'netstat', 'nbtstat', 'klist', 'gpresult', 'gpupdate', 'shutdown', 'logoff',
|
|
112
|
+
// PowerShell aliases that look like commands
|
|
113
|
+
'gci', 'gc', 'sl', 'gi', 'gm', 'gwmi', 'iwr', 'irm',
|
|
114
|
+
// Date/Time
|
|
115
|
+
'timedatectl', 'hwclock', 'ntpdate', 'chronyc',
|
|
116
|
+
// Containers/Virtualization
|
|
117
|
+
'podman', 'crictl', 'ctr', 'nerdctl', 'lxc', 'lxd', 'virsh', 'vboxmanage', 'multipass', 'lima',
|
|
118
|
+
// Kubernetes ecosystem
|
|
119
|
+
'k9s', 'kubectx', 'kubens', 'kustomize', 'skaffold', 'minikube', 'kind', 'k3s', 'k3d',
|
|
120
|
+
// Misc utilities
|
|
121
|
+
'xdg-open', 'open', 'wslpath', 'cygpath', 'explorer', 'start',
|
|
122
|
+
'yes', 'seq', 'factor', 'bc', 'dc', 'expr',
|
|
123
|
+
'sleep', 'usleep', 'watch',
|
|
124
|
+
// Common CLI tools
|
|
125
|
+
'ffmpeg', 'ffprobe', 'convert', 'identify', 'magick', 'pandoc', 'latex', 'pdflatex', 'bibtex',
|
|
126
|
+
'youtube-dl', 'yt-dlp', 'aria2c', 'axel',
|
|
127
|
+
]);
|
|
128
|
+
// Shell built-ins that work standalone or with simple arguments (exit codes, etc.)
|
|
129
|
+
// These get special handling for disambiguation
|
|
130
|
+
const SHELL_BUILTINS = new Set([
|
|
131
|
+
'exit', 'logout', 'return', 'break', 'continue',
|
|
132
|
+
'jobs', 'fg', 'bg', 'wait', 'disown', 'suspend',
|
|
133
|
+
'pushd', 'popd', 'dirs',
|
|
134
|
+
'history', 'fc',
|
|
135
|
+
'pwd', 'hash', 'help', 'true', 'false',
|
|
136
|
+
'env', 'printenv', 'export', 'set', 'unset',
|
|
137
|
+
'alias', 'unalias', 'type', 'command', 'builtin',
|
|
138
|
+
'clear', 'reset', 'cls',
|
|
67
139
|
]);
|
|
68
140
|
// Commands that can also be natural language words - need disambiguation
|
|
69
141
|
const AMBIGUOUS_COMMANDS = new Set([
|
|
70
|
-
'which', 'make', '
|
|
71
|
-
'test', '
|
|
72
|
-
'date', 'time', '
|
|
142
|
+
'which', 'make', 'find', 'head', 'tail',
|
|
143
|
+
'test', 'run', 'start', 'stop', 'top', 'man',
|
|
144
|
+
'date', 'time', 'source', 'tree', 'sort',
|
|
73
145
|
'diff', 'patch', 'split', 'join', 'cut', 'paste', 'fold', 'fmt',
|
|
74
|
-
'look', 'spell', '
|
|
146
|
+
'look', 'spell', 'read', 'print', 'say', 'write',
|
|
147
|
+
'mount', 'watch', 'locate', 'ping', 'host'
|
|
75
148
|
]);
|
|
76
149
|
// Natural language keywords that strongly indicate AI intent
|
|
77
150
|
const AI_KEYWORDS = new Set([
|
|
@@ -175,8 +248,11 @@ function looksLikeNaturalLanguage(words) {
|
|
|
175
248
|
* Check if input has strong command syntax indicators
|
|
176
249
|
*/
|
|
177
250
|
function hasCommandSyntax(input, words) {
|
|
178
|
-
|
|
179
|
-
const
|
|
251
|
+
const trimmed = input.trim();
|
|
252
|
+
const firstWord = words[0]?.toLowerCase() || '';
|
|
253
|
+
// Flags: -f, --flag (must be preceded by space or at position 2+)
|
|
254
|
+
const hasFlags = /\s-[a-zA-Z]|\s--[a-zA-Z]/.test(input) ||
|
|
255
|
+
(words.length >= 2 && /^-[a-zA-Z]/.test(words[1]));
|
|
180
256
|
// Operators: |, >, >>, <, &&, ||, ;
|
|
181
257
|
const hasOperators = /(\s\|\s)|(\s>\s)|(\s>>\s)|(\s<\s)|(\s&&\s)|(\s\|\|\s)|(;)/.test(input);
|
|
182
258
|
// Variable assignment: VAR=val (at start or after space)
|
|
@@ -185,20 +261,50 @@ function hasCommandSyntax(input, words) {
|
|
|
185
261
|
const hasQuotedWithFlag = /\s-[a-zA-Z]+\s+["']/.test(input) || /\s--[a-zA-Z-]+[=\s]+["']/.test(input);
|
|
186
262
|
// Path patterns (absolute paths or ./ or ../)
|
|
187
263
|
const hasPathPattern = /^[.~]?\/|^\.\.\/|\s[.~]?\/|\s\.\.\//.test(input);
|
|
264
|
+
// Windows path patterns (C:\, D:\, etc.)
|
|
265
|
+
const hasWindowsPath = /^[a-zA-Z]:\\|\\s[a-zA-Z]:\\/.test(input);
|
|
188
266
|
// Redirect to/from file
|
|
189
267
|
const hasFileRedirect = /[<>]\s*[a-zA-Z0-9_./-]+/.test(input);
|
|
190
268
|
// Environment variable usage
|
|
191
|
-
const hasEnvVar = /\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{[^}]+\}
|
|
269
|
+
const hasEnvVar = /\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{[^}]+\}|%[a-zA-Z_][a-zA-Z0-9_]*%/.test(input);
|
|
270
|
+
// Shell built-in patterns:
|
|
271
|
+
// Exit/return with numeric code: exit 0, exit 1, return 0, return 1
|
|
272
|
+
const hasExitCode = /^(exit|return|break|continue)\s+\d+$/.test(trimmed);
|
|
273
|
+
// Background job: command &
|
|
274
|
+
const hasBackgroundJob = /\s*&\s*$/.test(trimmed);
|
|
275
|
+
// Command chaining: cmd1; cmd2
|
|
276
|
+
const hasCommandChain = /;\s*[a-zA-Z]/.test(input);
|
|
277
|
+
// Command substitution: $(cmd) or `cmd`
|
|
278
|
+
const hasCommandSubstitution = /\$\([^)]+\)|`[^`]+`/.test(input);
|
|
279
|
+
// Job control: %1, %2, etc.
|
|
280
|
+
const hasJobReference = /^(fg|bg|jobs|kill|disown)\s+%?\d+$/.test(trimmed);
|
|
281
|
+
// pushd/popd with path or +N/-N
|
|
282
|
+
const hasDirStackOp = /^(pushd|popd)\s+([+\-]\d+|[\/~.])/.test(trimmed);
|
|
283
|
+
// history with number: history 10, history -c, history -d 5
|
|
284
|
+
const hasHistoryOp = /^history\s+(-[a-z]|\d+)/.test(trimmed);
|
|
285
|
+
// alias definition: alias name='...' or alias name="..."
|
|
286
|
+
const hasAliasDefinition = /^alias\s+[a-zA-Z_][a-zA-Z0-9_]*=/.test(trimmed);
|
|
287
|
+
// export with assignment: export VAR=value
|
|
288
|
+
const hasExportAssign = /^export\s+[A-Z_][A-Z0-9_]*=/.test(trimmed);
|
|
289
|
+
// cd with path or special: cd -, cd ~, cd ..
|
|
290
|
+
const hasCdPath = /^cd\s+[\/~.\-]/.test(trimmed);
|
|
192
291
|
// Check for known command + subcommand pattern
|
|
193
292
|
if (words.length >= 2) {
|
|
194
|
-
const firstWord = words[0].toLowerCase();
|
|
195
293
|
const secondWord = words[1].toLowerCase();
|
|
196
294
|
const subcommands = COMMAND_SUBCOMMANDS.get(firstWord);
|
|
197
295
|
if (subcommands && subcommands.has(secondWord)) {
|
|
198
296
|
return true;
|
|
199
297
|
}
|
|
200
298
|
}
|
|
201
|
-
|
|
299
|
+
// Shell built-in as single word is always a command
|
|
300
|
+
if (words.length === 1 && SHELL_BUILTINS.has(firstWord)) {
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
return hasFlags || hasOperators || hasVarAssign || hasQuotedWithFlag ||
|
|
304
|
+
hasPathPattern || hasWindowsPath || hasFileRedirect || hasEnvVar ||
|
|
305
|
+
hasExitCode || hasBackgroundJob || hasCommandChain || hasCommandSubstitution ||
|
|
306
|
+
hasJobReference || hasDirStackOp || hasHistoryOp || hasAliasDefinition ||
|
|
307
|
+
hasExportAssign || hasCdPath;
|
|
202
308
|
}
|
|
203
309
|
/**
|
|
204
310
|
* Disambiguate ambiguous commands based on context
|
|
@@ -352,6 +458,19 @@ export function detectIntent(input) {
|
|
|
352
458
|
}
|
|
353
459
|
// Check 4 - Definite Commands (non-ambiguous command names)
|
|
354
460
|
if (DEFINITE_COMMANDS.has(firstWord)) {
|
|
461
|
+
// Special handling for shell built-ins that might be followed by natural language
|
|
462
|
+
// e.g., "exit" is a command, but "exit the application" is AI
|
|
463
|
+
if (SHELL_BUILTINS.has(firstWord) && words.length > 1) {
|
|
464
|
+
// Check if followed by natural language markers
|
|
465
|
+
const secondWord = words[1].toLowerCase();
|
|
466
|
+
if (NATURAL_LANGUAGE_MARKERS.has(secondWord)) {
|
|
467
|
+
return 'ai';
|
|
468
|
+
}
|
|
469
|
+
// Check for "exit/clear/history the ..." pattern
|
|
470
|
+
if (['the', 'this', 'that', 'my', 'your', 'our', 'all'].includes(secondWord)) {
|
|
471
|
+
return 'ai';
|
|
472
|
+
}
|
|
473
|
+
}
|
|
355
474
|
return 'command';
|
|
356
475
|
}
|
|
357
476
|
// Check 4.5 - Custom Commands (user-defined terminal commands)
|