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.
Files changed (92) hide show
  1. package/dist/cli-adapter.d.ts +13 -22
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +383 -240
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/defaultConfig.d.ts +1 -0
  6. package/dist/config/defaultConfig.d.ts.map +1 -1
  7. package/dist/config/defaultConfig.js +3 -1
  8. package/dist/config/defaultConfig.js.map +1 -1
  9. package/dist/config/types.d.ts +1 -0
  10. package/dist/config/types.d.ts.map +1 -1
  11. package/dist/config/types.js +1 -0
  12. package/dist/config/types.js.map +1 -1
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/services/ai-service-client.d.ts +1 -1
  16. package/dist/services/ai-service-client.d.ts.map +1 -1
  17. package/dist/services/ai-service-client.js +7 -2
  18. package/dist/services/ai-service-client.js.map +1 -1
  19. package/dist/services/api-client.d.ts +6 -0
  20. package/dist/services/api-client.d.ts.map +1 -1
  21. package/dist/services/api-client.js +16 -0
  22. package/dist/services/api-client.js.map +1 -1
  23. package/dist/tools/command.d.ts.map +1 -1
  24. package/dist/tools/command.js +77 -25
  25. package/dist/tools/command.js.map +1 -1
  26. package/dist/tools/file-ops.d.ts.map +1 -1
  27. package/dist/tools/file-ops.js +28 -4
  28. package/dist/tools/file-ops.js.map +1 -1
  29. package/dist/tools/registry.d.ts +1 -0
  30. package/dist/tools/registry.d.ts.map +1 -1
  31. package/dist/tools/registry.js +25 -1
  32. package/dist/tools/registry.js.map +1 -1
  33. package/dist/tools/task-complete.d.ts +3 -0
  34. package/dist/tools/task-complete.d.ts.map +1 -0
  35. package/dist/tools/task-complete.js +48 -0
  36. package/dist/tools/task-complete.js.map +1 -0
  37. package/dist/tools/types.d.ts +1 -0
  38. package/dist/tools/types.d.ts.map +1 -1
  39. package/dist/tools/web-search.d.ts.map +1 -1
  40. package/dist/tools/web-search.js +16 -2
  41. package/dist/tools/web-search.js.map +1 -1
  42. package/dist/ui/components/AgentTimer.d.ts +7 -0
  43. package/dist/ui/components/AgentTimer.d.ts.map +1 -0
  44. package/dist/ui/components/AgentTimer.js +27 -0
  45. package/dist/ui/components/AgentTimer.js.map +1 -0
  46. package/dist/ui/components/App.d.ts +2 -0
  47. package/dist/ui/components/App.d.ts.map +1 -1
  48. package/dist/ui/components/App.js +229 -53
  49. package/dist/ui/components/App.js.map +1 -1
  50. package/dist/ui/components/InputBox.d.ts.map +1 -1
  51. package/dist/ui/components/InputBox.js +579 -130
  52. package/dist/ui/components/InputBox.js.map +1 -1
  53. package/dist/ui/components/InteractiveShell.d.ts +16 -0
  54. package/dist/ui/components/InteractiveShell.d.ts.map +1 -0
  55. package/dist/ui/components/InteractiveShell.js +152 -0
  56. package/dist/ui/components/InteractiveShell.js.map +1 -0
  57. package/dist/ui/components/LoadingIndicator.js +1 -1
  58. package/dist/ui/components/LoadingIndicator.js.map +1 -1
  59. package/dist/ui/components/MarkdownRenderer.js +1 -1
  60. package/dist/ui/components/StreamingMessageDisplay.js +1 -1
  61. package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
  62. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  63. package/dist/ui/components/ToolExecutionMessage.js +43 -47
  64. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  65. package/dist/utils/ansi-encoder.d.ts +2 -0
  66. package/dist/utils/ansi-encoder.d.ts.map +1 -0
  67. package/dist/utils/ansi-encoder.js +57 -0
  68. package/dist/utils/ansi-encoder.js.map +1 -0
  69. package/dist/utils/command-history.d.ts +14 -0
  70. package/dist/utils/command-history.d.ts.map +1 -0
  71. package/dist/utils/command-history.js +140 -0
  72. package/dist/utils/command-history.js.map +1 -0
  73. package/dist/utils/input-classifier.d.ts +26 -0
  74. package/dist/utils/input-classifier.d.ts.map +1 -0
  75. package/dist/utils/input-classifier.js +154 -0
  76. package/dist/utils/input-classifier.js.map +1 -0
  77. package/dist/utils/markdown-parser.d.ts.map +1 -1
  78. package/dist/utils/markdown-parser.js +6 -5
  79. package/dist/utils/markdown-parser.js.map +1 -1
  80. package/dist/utils/shell.d.ts +7 -0
  81. package/dist/utils/shell.d.ts.map +1 -1
  82. package/dist/utils/shell.js +97 -37
  83. package/dist/utils/shell.js.map +1 -1
  84. package/models-config.json +30 -0
  85. package/package.json +2 -1
  86. package/prompts/system-prompt-autonomous.md +428 -0
  87. package/dist/tools/ToolRegistry.d.ts +0 -55
  88. package/dist/tools/ToolRegistry.d.ts.map +0 -1
  89. package/dist/tools/ToolRegistry.js +0 -600
  90. package/dist/tools/ToolRegistry.js.map +0 -1
  91. package/prompts/system-prompt-enhanced.md +0 -659
  92. 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":"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"}
@@ -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;IA2F3B;;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"}
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: /\*\*(.+?)\*\*/g, type: 'bold' },
193
- { regex: /__(.+?)__/g, type: 'bold' },
194
- { regex: /\*(.+?)\*/g, type: 'italic' },
195
- { regex: /_(.+?)_/g, type: 'italic' },
196
- { regex: /`(.+?)`/g, type: 'code-inline' },
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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"}
@@ -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":"AAGA,wBAAgB,eAAe,IAAI,MAAM,CAQxC;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,CA0F/D"}
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"}
@@ -1,13 +1,61 @@
1
1
  import * as os from 'os';
2
- import { spawn } from 'child_process';
2
+ import spawn from 'cross-spawn'; // Use cross-spawn for better Windows support
3
3
  export function getShellCommand() {
4
- const platform = os.platform();
5
- if (platform === 'win32') {
6
- return 'powershell.exe';
7
- }
8
- else {
9
- return process.env.SHELL || '/bin/bash';
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
- // Set 30-second timeout
28
- const timeout = setTimeout(() => {
29
- if (!isResolved) {
30
- isResolved = true;
31
- // Kill the process
32
- childProcess.kill('SIGTERM');
33
- // Force kill after 2 seconds if still running
34
- setTimeout(() => {
35
- if (!childProcess.killed) {
36
- childProcess.kill('SIGKILL');
37
- }
38
- }, 2000);
39
- resolve({
40
- stdout,
41
- stderr: stderr + '\n\nCommand execution timed out after 30 seconds.',
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
- }, 30000);
46
- // Capture stdout with streaming
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
- // Stream to callback if provided
51
- if (onData) {
52
- onData(chunk, 'stdout');
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
- // Stream to callback if provided
60
- if (onData) {
61
- onData(chunk, 'stderr');
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
- clearTimeout(timeout);
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
- clearTimeout(timeout);
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,