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.
Files changed (88) hide show
  1. package/dist/cli-adapter.d.ts +21 -2
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +302 -68
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/models.d.ts +8 -0
  6. package/dist/config/models.d.ts.map +1 -1
  7. package/dist/config/models.js +29 -0
  8. package/dist/config/models.js.map +1 -1
  9. package/dist/config/slash-commands.d.ts +1 -0
  10. package/dist/config/slash-commands.d.ts.map +1 -1
  11. package/dist/config/slash-commands.js +13 -1
  12. package/dist/config/slash-commands.js.map +1 -1
  13. package/dist/hooks/useConnectivity.d.ts +2 -0
  14. package/dist/hooks/useConnectivity.d.ts.map +1 -0
  15. package/dist/hooks/useConnectivity.js +12 -0
  16. package/dist/hooks/useConnectivity.js.map +1 -0
  17. package/dist/index.js +3 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
  20. package/dist/mcp/mcp-command-handler.js +0 -3
  21. package/dist/mcp/mcp-command-handler.js.map +1 -1
  22. package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
  23. package/dist/mcp/mcp-tool-wrapper.js +8 -0
  24. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  25. package/dist/services/ai-service-client.d.ts +1 -0
  26. package/dist/services/ai-service-client.d.ts.map +1 -1
  27. package/dist/services/ai-service-client.js.map +1 -1
  28. package/dist/services/api-client.d.ts +26 -40
  29. package/dist/services/api-client.d.ts.map +1 -1
  30. package/dist/services/api-client.js +32 -34
  31. package/dist/services/api-client.js.map +1 -1
  32. package/dist/services/connectivity-manager.d.ts +18 -0
  33. package/dist/services/connectivity-manager.d.ts.map +1 -0
  34. package/dist/services/connectivity-manager.js +72 -0
  35. package/dist/services/connectivity-manager.js.map +1 -0
  36. package/dist/services/local-chat-storage.d.ts +5 -0
  37. package/dist/services/local-chat-storage.d.ts.map +1 -1
  38. package/dist/services/local-chat-storage.js +33 -0
  39. package/dist/services/local-chat-storage.js.map +1 -1
  40. package/dist/tools/background-command.d.ts +11 -0
  41. package/dist/tools/background-command.d.ts.map +1 -0
  42. package/dist/tools/background-command.js +162 -0
  43. package/dist/tools/background-command.js.map +1 -0
  44. package/dist/tools/command.d.ts.map +1 -1
  45. package/dist/tools/command.js +6 -3
  46. package/dist/tools/command.js.map +1 -1
  47. package/dist/tools/create-image.d.ts +10 -0
  48. package/dist/tools/create-image.d.ts.map +1 -0
  49. package/dist/tools/create-image.js +189 -0
  50. package/dist/tools/create-image.js.map +1 -0
  51. package/dist/ui/components/App.d.ts +3 -2
  52. package/dist/ui/components/App.d.ts.map +1 -1
  53. package/dist/ui/components/App.js +127 -44
  54. package/dist/ui/components/App.js.map +1 -1
  55. package/dist/ui/components/ContextWindowIndicator.d.ts.map +1 -1
  56. package/dist/ui/components/ContextWindowIndicator.js +43 -22
  57. package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
  58. package/dist/ui/components/InputBox.d.ts.map +1 -1
  59. package/dist/ui/components/InputBox.js +198 -199
  60. package/dist/ui/components/InputBox.js.map +1 -1
  61. package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
  62. package/dist/ui/components/MessageDisplay.js +8 -15
  63. package/dist/ui/components/MessageDisplay.js.map +1 -1
  64. package/dist/ui/components/SlashCommandAutocomplete.d.ts +2 -0
  65. package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +1 -1
  66. package/dist/ui/components/SlashCommandAutocomplete.js +19 -10
  67. package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
  68. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  69. package/dist/ui/components/StatusBar.js +4 -0
  70. package/dist/ui/components/StatusBar.js.map +1 -1
  71. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  72. package/dist/ui/components/ToolExecutionMessage.js +153 -39
  73. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  74. package/dist/ui/components/ToolExecutionStatus.d.ts.map +1 -1
  75. package/dist/ui/components/ToolExecutionStatus.js +1 -0
  76. package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
  77. package/dist/utils/chat-formatter.d.ts +12 -0
  78. package/dist/utils/chat-formatter.d.ts.map +1 -0
  79. package/dist/utils/chat-formatter.js +326 -0
  80. package/dist/utils/chat-formatter.js.map +1 -0
  81. package/dist/utils/input-classifier.d.ts.map +1 -1
  82. package/dist/utils/input-classifier.js +139 -20
  83. package/dist/utils/input-classifier.js.map +1 -1
  84. package/dist/utils/text-clipboard.d.ts +12 -0
  85. package/dist/utils/text-clipboard.d.ts.map +1 -0
  86. package/dist/utils/text-clipboard.js +63 -0
  87. package/dist/utils/text-clipboard.js.map +1 -0
  88. 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;AAiU3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA4FvD"}
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', 'export', 'watch', 'find', 'head', 'tail', 'clear',
71
- 'test', 'open', 'run', 'start', 'stop', 'touch', 'top', 'man',
72
- 'date', 'time', 'history', 'alias', 'source', 'tree', 'sort',
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', 'type', 'set', 'unset', 'wait', 'read', 'print'
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
- // Flags: -f, --flag (must be preceded by space)
179
- const hasFlags = /\s-[a-zA-Z]|\s--[a-zA-Z]/.test(input);
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_]*|\$\{[^}]+\}/.test(input);
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
- return hasFlags || hasOperators || hasVarAssign || hasQuotedWithFlag || hasPathPattern || hasFileRedirect || hasEnvVar;
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)