centaurus-cli 2.6.2 → 2.7.1
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 +13 -22
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +383 -240
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/defaultConfig.d.ts +1 -0
- package/dist/config/defaultConfig.d.ts.map +1 -1
- package/dist/config/defaultConfig.js +3 -1
- package/dist/config/defaultConfig.js.map +1 -1
- package/dist/config/types.d.ts +1 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/services/ai-service-client.d.ts +1 -1
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +7 -2
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.d.ts +6 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +16 -0
- package/dist/services/api-client.js.map +1 -1
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +77 -25
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/file-ops.d.ts.map +1 -1
- package/dist/tools/file-ops.js +28 -4
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/registry.d.ts +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +25 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/task-complete.d.ts +3 -0
- package/dist/tools/task-complete.d.ts.map +1 -0
- package/dist/tools/task-complete.js +48 -0
- package/dist/tools/task-complete.js.map +1 -0
- package/dist/tools/types.d.ts +1 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +16 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/ui/components/AgentTimer.d.ts +7 -0
- package/dist/ui/components/AgentTimer.d.ts.map +1 -0
- package/dist/ui/components/AgentTimer.js +27 -0
- package/dist/ui/components/AgentTimer.js.map +1 -0
- package/dist/ui/components/App.d.ts +2 -0
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +229 -53
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +579 -130
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +16 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -0
- package/dist/ui/components/InteractiveShell.js +152 -0
- package/dist/ui/components/InteractiveShell.js.map +1 -0
- package/dist/ui/components/LoadingIndicator.js +1 -1
- package/dist/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/ui/components/MarkdownRenderer.js +1 -1
- package/dist/ui/components/StreamingMessageDisplay.js +1 -1
- package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +43 -47
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/utils/ansi-encoder.d.ts +2 -0
- package/dist/utils/ansi-encoder.d.ts.map +1 -0
- package/dist/utils/ansi-encoder.js +57 -0
- package/dist/utils/ansi-encoder.js.map +1 -0
- package/dist/utils/command-history.d.ts +14 -0
- package/dist/utils/command-history.d.ts.map +1 -0
- package/dist/utils/command-history.js +140 -0
- package/dist/utils/command-history.js.map +1 -0
- package/dist/utils/input-classifier.d.ts +26 -0
- package/dist/utils/input-classifier.d.ts.map +1 -0
- package/dist/utils/input-classifier.js +154 -0
- package/dist/utils/input-classifier.js.map +1 -0
- package/dist/utils/markdown-parser.d.ts.map +1 -1
- package/dist/utils/markdown-parser.js +6 -5
- package/dist/utils/markdown-parser.js.map +1 -1
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +97 -37
- package/dist/utils/shell.js.map +1 -1
- package/models-config.json +30 -0
- package/package.json +2 -1
- package/prompts/system-prompt-autonomous.md +428 -0
- package/dist/tools/ToolRegistry.d.ts +0 -55
- package/dist/tools/ToolRegistry.d.ts.map +0 -1
- package/dist/tools/ToolRegistry.js +0 -600
- package/dist/tools/ToolRegistry.js.map +0 -1
- package/prompts/system-prompt-enhanced.md +0 -659
- package/prompts/system-prompt.md +0 -206
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
const HISTORY_FILE = 'history.json';
|
|
5
|
+
const MAX_HISTORY_SIZE = 200;
|
|
6
|
+
export class CommandHistoryManager {
|
|
7
|
+
static instance;
|
|
8
|
+
historyPath;
|
|
9
|
+
data = { version: 1, commands: {} };
|
|
10
|
+
loaded = false;
|
|
11
|
+
constructor() {
|
|
12
|
+
const configDir = path.join(os.homedir(), '.centaurus');
|
|
13
|
+
this.historyPath = path.join(configDir, HISTORY_FILE);
|
|
14
|
+
}
|
|
15
|
+
static getInstance() {
|
|
16
|
+
if (!CommandHistoryManager.instance) {
|
|
17
|
+
CommandHistoryManager.instance = new CommandHistoryManager();
|
|
18
|
+
}
|
|
19
|
+
return CommandHistoryManager.instance;
|
|
20
|
+
}
|
|
21
|
+
async load() {
|
|
22
|
+
if (this.loaded)
|
|
23
|
+
return;
|
|
24
|
+
try {
|
|
25
|
+
const fileContent = await fs.readFile(this.historyPath, 'utf-8');
|
|
26
|
+
const parsed = JSON.parse(fileContent);
|
|
27
|
+
if (Array.isArray(parsed)) {
|
|
28
|
+
// Migration: Convert old array format to new object format
|
|
29
|
+
this.data = {
|
|
30
|
+
version: 1,
|
|
31
|
+
commands: {}
|
|
32
|
+
};
|
|
33
|
+
// Treat old commands as having global count 1, unknown CWD
|
|
34
|
+
parsed.forEach(cmd => {
|
|
35
|
+
if (typeof cmd === 'string') {
|
|
36
|
+
this.data.commands[cmd] = {
|
|
37
|
+
lastExecuted: Date.now(),
|
|
38
|
+
globalCount: 1,
|
|
39
|
+
cwdCounts: {}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Assume valid new format (or empty)
|
|
46
|
+
this.data = parsed;
|
|
47
|
+
// Ensure structure integrity
|
|
48
|
+
if (!this.data.commands)
|
|
49
|
+
this.data.commands = {};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Start fresh if file missing or corrupt
|
|
54
|
+
this.data = { version: 1, commands: {} };
|
|
55
|
+
}
|
|
56
|
+
this.loaded = true;
|
|
57
|
+
}
|
|
58
|
+
async save() {
|
|
59
|
+
try {
|
|
60
|
+
const configDir = path.dirname(this.historyPath);
|
|
61
|
+
try {
|
|
62
|
+
await fs.access(configDir);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
await fs.writeFile(this.historyPath, JSON.stringify(this.data, null, 2), 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error('Failed to save command history:', error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async addCommand(command, cwd = '') {
|
|
74
|
+
if (!command || !command.trim())
|
|
75
|
+
return;
|
|
76
|
+
const trimmedCommand = command.trim();
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
if (!this.data.commands[trimmedCommand]) {
|
|
79
|
+
this.data.commands[trimmedCommand] = {
|
|
80
|
+
lastExecuted: now,
|
|
81
|
+
globalCount: 0,
|
|
82
|
+
cwdCounts: {}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const stats = this.data.commands[trimmedCommand];
|
|
86
|
+
stats.lastExecuted = now;
|
|
87
|
+
stats.globalCount += 1;
|
|
88
|
+
if (cwd) {
|
|
89
|
+
stats.cwdCounts[cwd] = (stats.cwdCounts[cwd] || 0) + 1;
|
|
90
|
+
}
|
|
91
|
+
// Pruning logic: If history gets too big, remove least used/oldest
|
|
92
|
+
// For now, let's just keep it simple or implement a soft limit if needed.
|
|
93
|
+
// Given the object structure, 200 items is nothing. We can store thousands easily.
|
|
94
|
+
// Let's implement a cleanup if keys > 1000
|
|
95
|
+
const keys = Object.keys(this.data.commands);
|
|
96
|
+
if (keys.length > 1000) {
|
|
97
|
+
// Sort by lastExecuted and remove oldest 200
|
|
98
|
+
const sortedKeys = keys.sort((a, b) => this.data.commands[a].lastExecuted - this.data.commands[b].lastExecuted);
|
|
99
|
+
for (let i = 0; i < 200; i++) {
|
|
100
|
+
delete this.data.commands[sortedKeys[i]];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
await this.save();
|
|
104
|
+
}
|
|
105
|
+
getMatches(prefix, cwd = '') {
|
|
106
|
+
if (!prefix || !prefix.trim())
|
|
107
|
+
return [];
|
|
108
|
+
const lowerPrefix = prefix.toLowerCase();
|
|
109
|
+
const commands = Object.keys(this.data.commands);
|
|
110
|
+
// Filter matches
|
|
111
|
+
const matches = commands.filter(cmd => cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix);
|
|
112
|
+
// Score matches
|
|
113
|
+
const scoredMatches = matches.map(cmd => {
|
|
114
|
+
const stats = this.data.commands[cmd];
|
|
115
|
+
// Base score: Global frequency
|
|
116
|
+
let score = stats.globalCount;
|
|
117
|
+
// Context bonus: CWD frequency * 10
|
|
118
|
+
if (cwd && stats.cwdCounts[cwd]) {
|
|
119
|
+
score += stats.cwdCounts[cwd] * 10;
|
|
120
|
+
}
|
|
121
|
+
// Recency bonus: slightly boost very recent commands to act like a history buffer
|
|
122
|
+
// (Optional, but helps if you just typed it)
|
|
123
|
+
return { cmd, score, lastExecuted: stats.lastExecuted };
|
|
124
|
+
});
|
|
125
|
+
// Sort by Score DESC, then LastExecuted DESC
|
|
126
|
+
scoredMatches.sort((a, b) => {
|
|
127
|
+
if (a.score !== b.score) {
|
|
128
|
+
return b.score - a.score;
|
|
129
|
+
}
|
|
130
|
+
return b.lastExecuted - a.lastExecuted;
|
|
131
|
+
});
|
|
132
|
+
return scoredMatches.map(m => m.cmd);
|
|
133
|
+
}
|
|
134
|
+
// Helper to get simple history list (sorted by recency) for arrow key navigation
|
|
135
|
+
getHistory() {
|
|
136
|
+
return Object.keys(this.data.commands)
|
|
137
|
+
.sort((a, b) => this.data.commands[b].lastExecuted - this.data.commands[a].lastExecuted);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=command-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-history.js","sourceRoot":"","sources":["../../src/utils/command-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Classification Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides heuristic-based detection of user intent (Terminal Command vs AI Message).
|
|
5
|
+
* Completely replaces backend API classification.
|
|
6
|
+
*/
|
|
7
|
+
export type InputIntent = 'command' | 'ai';
|
|
8
|
+
/**
|
|
9
|
+
* Detects the intent of the user input using local heuristics.
|
|
10
|
+
*
|
|
11
|
+
* Logic:
|
|
12
|
+
* 1. Slash Commands: If starts with '/', check if valid command -> AI
|
|
13
|
+
* 2. Prefixes: '?' -> AI, '.', '/', '$', '~' -> Command
|
|
14
|
+
* 3. Known Binaries: First word matches common commands -> Command
|
|
15
|
+
* 4. Syntax Patterns: Flags (--), pipes (|), redirects (>), chaining (&&, ||, ;) -> Command
|
|
16
|
+
* 5. AI Indicators: Starts with keywords, ends with '?' -> AI
|
|
17
|
+
* 6. Fallback:
|
|
18
|
+
* - If it looks like a file path -> Command
|
|
19
|
+
* - If it's a sentence (multiple words) -> AI
|
|
20
|
+
* - Default -> AI (Safer to assume chat if unsure)
|
|
21
|
+
*
|
|
22
|
+
* @param input The user input string
|
|
23
|
+
* @returns 'command' | 'ai'
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectIntent(input: string): InputIntent;
|
|
26
|
+
//# sourceMappingURL=input-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-classifier.d.ts","sourceRoot":"","sources":["../../src/utils/input-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;AAqD3C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA6FvD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Classification Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides heuristic-based detection of user intent (Terminal Command vs AI Message).
|
|
5
|
+
* Completely replaces backend API classification.
|
|
6
|
+
*/
|
|
7
|
+
// Valid slash commands that should be handled by the Agent/CLI logic
|
|
8
|
+
const SLASH_COMMANDS = new Set([
|
|
9
|
+
'help', 'h', '?',
|
|
10
|
+
'model', 'm',
|
|
11
|
+
'config', 'c', 'settings',
|
|
12
|
+
'clear', 'cls', 'reset',
|
|
13
|
+
'exit', 'quit', 'q',
|
|
14
|
+
'session', 's',
|
|
15
|
+
'tools', 't',
|
|
16
|
+
'plan'
|
|
17
|
+
]);
|
|
18
|
+
// Common binaries that definitely indicate a terminal command
|
|
19
|
+
const COMMON_COMMANDS = new Set([
|
|
20
|
+
// Package Managers
|
|
21
|
+
'npm', 'yarn', 'pnpm', 'bun', 'npx', 'gem', 'pip', 'pip3', 'conda', 'cargo', 'go', 'composer', 'mvn', 'gradle',
|
|
22
|
+
// Version Control
|
|
23
|
+
'git', 'svn', 'hg', 'gh',
|
|
24
|
+
// File Operations
|
|
25
|
+
'ls', 'cd', 'pwd', 'mkdir', 'rm', 'cp', 'mv', 'touch', 'cat', 'less', 'more', 'head', 'tail', 'nano', 'vim', 'vi', 'code',
|
|
26
|
+
// System / Process
|
|
27
|
+
'ps', 'kill', 'killall', 'top', 'htop', 'btop', 'free', 'df', 'du', 'chmod', 'chown', 'chgrp', 'ln', 'whoami', 'su', 'sudo',
|
|
28
|
+
// Network
|
|
29
|
+
'curl', 'wget', 'ssh', 'scp', 'ping', 'telnet', 'nc', 'netstat', 'lsof', 'dig', 'nslookup', 'ip', 'ifconfig', 'traceroute',
|
|
30
|
+
// Build / Run
|
|
31
|
+
'make', 'cmake', 'docker', 'docker-compose', 'kubectl', 'node', 'python', 'python3', 'ruby', 'perl', 'php', 'java', 'gcc', 'g++', 'clang',
|
|
32
|
+
// Shell
|
|
33
|
+
'echo', 'export', 'alias', 'unalias', 'source', 'env', 'history', 'clear', 'exit', 'date', 'cal', 'man', 'which', 'whereis',
|
|
34
|
+
// Archives
|
|
35
|
+
'tar', 'zip', 'unzip', 'gzip', 'gunzip', '7z', 'rar',
|
|
36
|
+
// Search
|
|
37
|
+
'grep', 'find', 'locate', 'sed', 'awk', 'ack', 'ag', 'rg',
|
|
38
|
+
// Misc
|
|
39
|
+
'tree', 'watch', 'jq', 'yq'
|
|
40
|
+
]);
|
|
41
|
+
// Natural language keywords that strongly indicate AI intent
|
|
42
|
+
const AI_KEYWORDS = new Set([
|
|
43
|
+
'how', 'what', 'why', 'when', 'where', 'who',
|
|
44
|
+
'write', 'create', 'make', 'build', 'generate', 'implement', 'scaffold',
|
|
45
|
+
'explain', 'describe', 'clarify', 'analyze', 'review', 'audit',
|
|
46
|
+
'fix', 'debug', 'solve', 'correct', 'repair',
|
|
47
|
+
'optimize', 'improve', 'refactor', 'clean', 'format',
|
|
48
|
+
'test', 'verify', 'validate', 'check',
|
|
49
|
+
'translate', 'convert', 'transform',
|
|
50
|
+
'summarize', 'document', 'comment',
|
|
51
|
+
'add', 'update', 'change', 'modify', 'remove', 'delete',
|
|
52
|
+
'can', 'could', 'would', 'should',
|
|
53
|
+
'hey', 'hi', 'hello', 'help', 'please'
|
|
54
|
+
]);
|
|
55
|
+
/**
|
|
56
|
+
* Detects the intent of the user input using local heuristics.
|
|
57
|
+
*
|
|
58
|
+
* Logic:
|
|
59
|
+
* 1. Slash Commands: If starts with '/', check if valid command -> AI
|
|
60
|
+
* 2. Prefixes: '?' -> AI, '.', '/', '$', '~' -> Command
|
|
61
|
+
* 3. Known Binaries: First word matches common commands -> Command
|
|
62
|
+
* 4. Syntax Patterns: Flags (--), pipes (|), redirects (>), chaining (&&, ||, ;) -> Command
|
|
63
|
+
* 5. AI Indicators: Starts with keywords, ends with '?' -> AI
|
|
64
|
+
* 6. Fallback:
|
|
65
|
+
* - If it looks like a file path -> Command
|
|
66
|
+
* - If it's a sentence (multiple words) -> AI
|
|
67
|
+
* - Default -> AI (Safer to assume chat if unsure)
|
|
68
|
+
*
|
|
69
|
+
* @param input The user input string
|
|
70
|
+
* @returns 'command' | 'ai'
|
|
71
|
+
*/
|
|
72
|
+
export function detectIntent(input) {
|
|
73
|
+
const trimmed = input.trim();
|
|
74
|
+
if (!trimmed) {
|
|
75
|
+
return 'ai'; // Default to AI for empty/whitespace
|
|
76
|
+
}
|
|
77
|
+
// Check 0 - Slash Commands (Highest Priority)
|
|
78
|
+
if (trimmed.startsWith('/')) {
|
|
79
|
+
// Extract command name (remove '/' and take first word)
|
|
80
|
+
const commandName = trimmed.slice(1).split(/\s+/)[0].toLowerCase();
|
|
81
|
+
if (SLASH_COMMANDS.has(commandName)) {
|
|
82
|
+
return 'ai';
|
|
83
|
+
}
|
|
84
|
+
// If starts with '/' but not a valid slash command, assume it's a path -> Command
|
|
85
|
+
return 'command';
|
|
86
|
+
}
|
|
87
|
+
// Check 1 - Explicit Prefixes
|
|
88
|
+
if (trimmed.startsWith('?'))
|
|
89
|
+
return 'ai';
|
|
90
|
+
if (trimmed.startsWith('.') || trimmed.startsWith('$') || trimmed.startsWith('~'))
|
|
91
|
+
return 'command';
|
|
92
|
+
// Check 2 - Known Binaries
|
|
93
|
+
const words = trimmed.split(/\s+/);
|
|
94
|
+
const firstWord = words[0].toLowerCase();
|
|
95
|
+
if (COMMON_COMMANDS.has(firstWord)) {
|
|
96
|
+
return 'command';
|
|
97
|
+
}
|
|
98
|
+
// Check 3 - Strong Command Syntax
|
|
99
|
+
// Flags: -f, --flag (must be preceded by space)
|
|
100
|
+
const hasFlags = /\s-[a-zA-Z]|\s--[a-zA-Z]/.test(trimmed);
|
|
101
|
+
// Operators: |, >, >>, <, &&, ||, ;
|
|
102
|
+
const hasOperators = /(\s\|\s)|(\s>\s)|(\s>>\s)|(\s<\s)|(\s&&\s)|(\s\|\|\s)|(;)/.test(trimmed);
|
|
103
|
+
// Variable assignment: VAR=val (at start or after space)
|
|
104
|
+
const hasVarAssign = /^[a-zA-Z_][a-zA-Z0-9_]*=[^ ]/.test(trimmed) || /\s[a-zA-Z_][a-zA-Z0-9_]*=[^ ]/.test(trimmed);
|
|
105
|
+
if (hasFlags || hasOperators || hasVarAssign) {
|
|
106
|
+
return 'command';
|
|
107
|
+
}
|
|
108
|
+
// Check 4 - AI Indicators
|
|
109
|
+
const isQuestion = trimmed.endsWith('?');
|
|
110
|
+
const startsWithKeyword = AI_KEYWORDS.has(firstWord);
|
|
111
|
+
if (startsWithKeyword || isQuestion) {
|
|
112
|
+
return 'ai';
|
|
113
|
+
}
|
|
114
|
+
// Check 5 - Path-like strings
|
|
115
|
+
// If it contains slashes and no spaces, it might be a path execution
|
|
116
|
+
if ((trimmed.includes('/') || trimmed.includes('\\')) && !trimmed.includes(' ')) {
|
|
117
|
+
return 'command';
|
|
118
|
+
}
|
|
119
|
+
// Check 6 - Fallback Heuristics
|
|
120
|
+
// If it's a single word and NOT a known command/keyword:
|
|
121
|
+
// "foo" -> Could be a custom script.
|
|
122
|
+
// But "hello" -> AI.
|
|
123
|
+
// If it's mixed case or has numbers, maybe command/script? "runScript.sh"
|
|
124
|
+
if (words.length === 1) {
|
|
125
|
+
if (trimmed.includes('.'))
|
|
126
|
+
return 'command'; // script.sh, main.py
|
|
127
|
+
// If it's all lowercase alpha, and not in our list, it's ambiguous.
|
|
128
|
+
// User wants no ambiguous.
|
|
129
|
+
// "centaurus" -> command?
|
|
130
|
+
// "thanks" -> AI
|
|
131
|
+
// Let's lean towards AI for unknown single words unless they look "technical"
|
|
132
|
+
return 'ai';
|
|
133
|
+
}
|
|
134
|
+
// Multiple words, no flags, no operators, no keywords.
|
|
135
|
+
// "install react" -> "npm install react" (Command) or "how to install react" (AI)?
|
|
136
|
+
// "install" is not in AI keywords (I added it to commands? No, "npm" is command).
|
|
137
|
+
// If I type "git status", "git" catches it.
|
|
138
|
+
// If I type "my script param", "my" is unknown.
|
|
139
|
+
// If I type "make a button", "make" is a command! But "make a button" is AI.
|
|
140
|
+
// Special Case: "make"
|
|
141
|
+
if (firstWord === 'make') {
|
|
142
|
+
// "make build" -> Command
|
|
143
|
+
// "make a file" -> AI
|
|
144
|
+
// Heuristic: "make" followed by "a", "an", "the", "me" -> AI
|
|
145
|
+
const secondWord = words[1]?.toLowerCase();
|
|
146
|
+
if (['a', 'an', 'the', 'me', 'it'].includes(secondWord)) {
|
|
147
|
+
return 'ai';
|
|
148
|
+
}
|
|
149
|
+
return 'command';
|
|
150
|
+
}
|
|
151
|
+
// Default to AI for multi-word sentences
|
|
152
|
+
return 'ai';
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=input-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-classifier.js","sourceRoot":"","sources":["../../src/utils/input-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,qEAAqE;AACrE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC3B,MAAM,EAAE,GAAG,EAAE,GAAG;IAChB,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG,EAAE,UAAU;IACzB,OAAO,EAAE,KAAK,EAAE,OAAO;IACvB,MAAM,EAAE,MAAM,EAAE,GAAG;IACnB,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,GAAG;IACZ,MAAM;CACT,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC5B,mBAAmB;IACnB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ;IAC9G,kBAAkB;IAClB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI;IACxB,kBAAkB;IAClB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM;IACzH,mBAAmB;IACnB,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM;IAC3H,UAAU;IACV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY;IAC1H,cAAc;IACd,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO;IACzI,QAAQ;IACR,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS;IAC3H,WAAW;IACX,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;IACpD,SAAS;IACT,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI;IACzD,OAAO;IACP,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;CAC9B,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;IAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU;IACvE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;IAC9D,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;IAC5C,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ;IACpD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO;IACrC,WAAW,EAAE,SAAS,EAAE,WAAW;IACnC,WAAW,EAAE,UAAU,EAAE,SAAS;IAClC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IACvD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;IACjC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ;CACzC,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,CAAC,qCAAqC;IACtD,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,wDAAwD;QACxD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,IAAI,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,kFAAkF;QAClF,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpG,2BAA2B;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,kCAAkC;IAClC,gDAAgD;IAChD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,oCAAoC;IACpC,MAAM,YAAY,GAAG,2DAA2D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/F,yDAAyD;IACzD,MAAM,YAAY,GAAG,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnH,IAAI,QAAQ,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,iBAAiB,IAAI,UAAU,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,8BAA8B;IAC9B,qEAAqE;IACrE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,gCAAgC;IAEhC,yDAAyD;IACzD,qCAAqC;IACrC,qBAAqB;IACrB,0EAA0E;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC,CAAC,qBAAqB;QAClE,oEAAoE;QACpE,2BAA2B;QAC3B,0BAA0B;QAC1B,iBAAiB;QACjB,8EAA8E;QAC9E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,uDAAuD;IACvD,mFAAmF;IACnF,kFAAkF;IAClF,4CAA4C;IAC5C,gDAAgD;IAChD,6EAA6E;IAE7E,uBAAuB;IACvB,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACvB,0BAA0B;QAC1B,sBAAsB;QACtB,6DAA6D;QAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,yCAAyC;IACzC,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,iBAAiB,GAAG,YAAY,CAAC;IACrJ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,qBAAa,cAAc;IACzB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IA0ExC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,iBAAiB,GAAG,YAAY,CAAC;IACrJ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,qBAAa,cAAc;IACzB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IA0ExC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4F3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA4B1B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,EAAE,CAyBrF"}
|
|
@@ -188,12 +188,13 @@ export class MarkdownParser {
|
|
|
188
188
|
const elements = [];
|
|
189
189
|
let currentPos = 0;
|
|
190
190
|
// Patterns for inline formatting
|
|
191
|
+
// IMPORTANT: Bold (**) must come before italic (*) to match correctly
|
|
191
192
|
const patterns = [
|
|
192
|
-
{ regex: /\*\*(
|
|
193
|
-
{ regex: /__(
|
|
194
|
-
{ regex: /\*(
|
|
195
|
-
{ regex: /_(
|
|
196
|
-
{ regex: /`(
|
|
193
|
+
{ regex: /\*\*([^\*]+?)\*\*/g, type: 'bold' },
|
|
194
|
+
{ regex: /__([^_]+?)__/g, type: 'bold' },
|
|
195
|
+
{ regex: /\*([^\*]+?)\*/g, type: 'italic' },
|
|
196
|
+
{ regex: /_([^_]+?)_/g, type: 'italic' },
|
|
197
|
+
{ regex: /`([^`]+?)`/g, type: 'code-inline' },
|
|
197
198
|
{ regex: /\[(.+?)\]\((.+?)\)/g, type: 'link' },
|
|
198
199
|
];
|
|
199
200
|
// Find all matches
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/utils/markdown-parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/utils/markdown-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/shell.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import { ChildProcess } from 'child_process';
|
|
1
2
|
export declare function getShellCommand(): string;
|
|
3
|
+
export interface InteractiveProcess {
|
|
4
|
+
process: ChildProcess;
|
|
5
|
+
write: (input: string) => void;
|
|
6
|
+
kill: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function executeCommandInteractive(command: string, cwd: string, onData: (chunk: string, type: 'stdout' | 'stderr') => void, onExit?: (exitCode: number) => void): InteractiveProcess;
|
|
2
9
|
export declare function executeCommand(command: string, cwd: string, onData?: (chunk: string, type: 'stdout' | 'stderr') => void): Promise<{
|
|
3
10
|
stdout: string;
|
|
4
11
|
stderr: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,EAC1D,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAClC,kBAAkB,CA0DpB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,GAC1D,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0G/D"}
|
package/dist/utils/shell.js
CHANGED
|
@@ -1,13 +1,61 @@
|
|
|
1
1
|
import * as os from 'os';
|
|
2
|
-
import
|
|
2
|
+
import spawn from 'cross-spawn'; // Use cross-spawn for better Windows support
|
|
3
3
|
export function getShellCommand() {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
return os.platform() === 'win32' ? 'powershell.exe' : (process.env.SHELL || '/bin/bash');
|
|
5
|
+
}
|
|
6
|
+
export function executeCommandInteractive(command, cwd, onData, onExit) {
|
|
7
|
+
const shell = getShellCommand();
|
|
8
|
+
// cross-spawn handles the args parsing automatically/safely
|
|
9
|
+
const args = os.platform() === 'win32' ? ['-Command', command] : ['-c', command];
|
|
10
|
+
const childProcess = spawn(shell, args, {
|
|
11
|
+
cwd,
|
|
12
|
+
stdio: ['pipe', 'pipe', 'pipe'], // CRITICAL: All pipes must be open
|
|
13
|
+
env: {
|
|
14
|
+
...process.env,
|
|
15
|
+
// Force Unbuffered Output so Python/Ruby print immediately
|
|
16
|
+
PYTHONUNBUFFERED: '1',
|
|
17
|
+
// Force Color Output (Many tools check this)
|
|
18
|
+
FORCE_COLOR: '1',
|
|
19
|
+
CLICOLOR: '1',
|
|
20
|
+
TERM: 'xterm-256color'
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
// Throttling Logic (Keep this from your previous code)
|
|
24
|
+
let buffer = '';
|
|
25
|
+
let throttleTimer = null;
|
|
26
|
+
const flush = () => {
|
|
27
|
+
if (buffer) {
|
|
28
|
+
onData(buffer, 'stdout'); // Merge to single stream for UI simplicity
|
|
29
|
+
buffer = '';
|
|
30
|
+
}
|
|
31
|
+
throttleTimer = null;
|
|
32
|
+
};
|
|
33
|
+
const handleData = (data) => {
|
|
34
|
+
buffer += data.toString();
|
|
35
|
+
if (!throttleTimer)
|
|
36
|
+
throttleTimer = setTimeout(flush, 50); // 50ms debounce
|
|
37
|
+
};
|
|
38
|
+
childProcess.stdout?.on('data', handleData);
|
|
39
|
+
childProcess.stderr?.on('data', handleData); // Merge stderr so user sees errors inline
|
|
40
|
+
childProcess.on('close', (code) => {
|
|
41
|
+
if (throttleTimer)
|
|
42
|
+
clearTimeout(throttleTimer);
|
|
43
|
+
flush();
|
|
44
|
+
if (onExit)
|
|
45
|
+
onExit(code ?? 0);
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
process: childProcess,
|
|
49
|
+
// Simple write wrapper
|
|
50
|
+
write: (input) => {
|
|
51
|
+
if (childProcess.stdin && !childProcess.stdin.destroyed) {
|
|
52
|
+
childProcess.stdin.write(input);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
kill: () => {
|
|
56
|
+
childProcess.kill();
|
|
57
|
+
}
|
|
58
|
+
};
|
|
11
59
|
}
|
|
12
60
|
export async function executeCommand(command, cwd, onData) {
|
|
13
61
|
return new Promise((resolve) => {
|
|
@@ -16,56 +64,64 @@ export async function executeCommand(command, cwd, onData) {
|
|
|
16
64
|
// Determine shell and command format
|
|
17
65
|
const shell = isWindows ? 'powershell.exe' : (process.env.SHELL || '/bin/bash');
|
|
18
66
|
const shellArgs = isWindows ? ['-Command', command] : ['-c', command];
|
|
19
|
-
// Spawn the process
|
|
67
|
+
// Spawn the process with explicit pipe mode
|
|
20
68
|
const childProcess = spawn(shell, shellArgs, {
|
|
21
69
|
cwd,
|
|
22
70
|
windowsHide: true,
|
|
71
|
+
stdio: ['pipe', 'pipe', 'pipe'], // Explicit pipe mode - no inheritance
|
|
23
72
|
});
|
|
24
73
|
let stdout = '';
|
|
25
74
|
let stderr = '';
|
|
26
75
|
let isResolved = false;
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
exitCode: 124, // Standard timeout exit code
|
|
43
|
-
});
|
|
76
|
+
// Throttling buffers
|
|
77
|
+
let stdoutBuffer = '';
|
|
78
|
+
let stderrBuffer = '';
|
|
79
|
+
let throttleTimer = null;
|
|
80
|
+
// Flush function - sends buffered data to callback
|
|
81
|
+
const flush = () => {
|
|
82
|
+
if (onData) {
|
|
83
|
+
if (stdoutBuffer) {
|
|
84
|
+
onData(stdoutBuffer, 'stdout');
|
|
85
|
+
stdoutBuffer = '';
|
|
86
|
+
}
|
|
87
|
+
if (stderrBuffer) {
|
|
88
|
+
onData(stderrBuffer, 'stderr');
|
|
89
|
+
stderrBuffer = '';
|
|
90
|
+
}
|
|
44
91
|
}
|
|
45
|
-
|
|
46
|
-
|
|
92
|
+
throttleTimer = null;
|
|
93
|
+
};
|
|
94
|
+
// Capture stdout with throttled streaming
|
|
47
95
|
childProcess.stdout?.on('data', (data) => {
|
|
48
96
|
const chunk = data.toString();
|
|
49
97
|
stdout += chunk;
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
98
|
+
// Buffer the chunk
|
|
99
|
+
stdoutBuffer += chunk;
|
|
100
|
+
// Set throttle timer if not already running
|
|
101
|
+
if (!throttleTimer && onData) {
|
|
102
|
+
throttleTimer = setTimeout(flush, 50); // 50ms throttle
|
|
53
103
|
}
|
|
54
104
|
});
|
|
55
|
-
// Capture stderr with streaming
|
|
105
|
+
// Capture stderr with throttled streaming
|
|
56
106
|
childProcess.stderr?.on('data', (data) => {
|
|
57
107
|
const chunk = data.toString();
|
|
58
108
|
stderr += chunk;
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
109
|
+
// Buffer the chunk
|
|
110
|
+
stderrBuffer += chunk;
|
|
111
|
+
// Set throttle timer if not already running
|
|
112
|
+
if (!throttleTimer && onData) {
|
|
113
|
+
throttleTimer = setTimeout(flush, 50); // 50ms throttle
|
|
62
114
|
}
|
|
63
115
|
});
|
|
64
116
|
// Handle process completion
|
|
65
117
|
childProcess.on('close', (exitCode) => {
|
|
66
118
|
if (!isResolved) {
|
|
67
119
|
isResolved = true;
|
|
68
|
-
|
|
120
|
+
// Clear throttle timer and flush remaining data
|
|
121
|
+
if (throttleTimer) {
|
|
122
|
+
clearTimeout(throttleTimer);
|
|
123
|
+
}
|
|
124
|
+
flush();
|
|
69
125
|
resolve({
|
|
70
126
|
stdout,
|
|
71
127
|
stderr,
|
|
@@ -77,7 +133,11 @@ export async function executeCommand(command, cwd, onData) {
|
|
|
77
133
|
childProcess.on('error', (error) => {
|
|
78
134
|
if (!isResolved) {
|
|
79
135
|
isResolved = true;
|
|
80
|
-
|
|
136
|
+
// Clear throttle timer and flush remaining data
|
|
137
|
+
if (throttleTimer) {
|
|
138
|
+
clearTimeout(throttleTimer);
|
|
139
|
+
}
|
|
140
|
+
flush();
|
|
81
141
|
resolve({
|
|
82
142
|
stdout,
|
|
83
143
|
stderr: stderr || error.message,
|