centaurus-cli 2.9.0 → 2.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-adapter.d.ts +78 -0
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +566 -165
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/build-config.d.ts +1 -1
- package/dist/config/build-config.js +1 -1
- package/dist/config/mcp-config-manager.d.ts +21 -0
- package/dist/config/mcp-config-manager.d.ts.map +1 -1
- package/dist/config/mcp-config-manager.js +184 -1
- package/dist/config/mcp-config-manager.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +7 -2
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +5 -3
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/index.js +66 -11
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.d.ts +34 -3
- package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-command-handler.js +171 -83
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
- package/dist/mcp/mcp-server-manager.js +9 -23
- package/dist/mcp/mcp-server-manager.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +42 -5
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-service-client.d.ts +6 -1
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +6 -6
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.d.ts +20 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +35 -0
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/input-detection-agent.d.ts +40 -0
- package/dist/services/input-detection-agent.d.ts.map +1 -0
- package/dist/services/input-detection-agent.js +213 -0
- package/dist/services/input-detection-agent.js.map +1 -0
- package/dist/services/input-requirement-detector.d.ts +28 -0
- package/dist/services/input-requirement-detector.d.ts.map +1 -0
- package/dist/services/input-requirement-detector.js +203 -0
- package/dist/services/input-requirement-detector.js.map +1 -0
- package/dist/services/monitored-shell-manager.d.ts +120 -0
- package/dist/services/monitored-shell-manager.d.ts.map +1 -0
- package/dist/services/monitored-shell-manager.js +239 -0
- package/dist/services/monitored-shell-manager.js.map +1 -0
- package/dist/services/session-quota-manager.d.ts +101 -0
- package/dist/services/session-quota-manager.d.ts.map +1 -0
- package/dist/services/session-quota-manager.js +242 -0
- package/dist/services/session-quota-manager.js.map +1 -0
- package/dist/services/shell-input-agent.d.ts +89 -0
- package/dist/services/shell-input-agent.d.ts.map +1 -0
- package/dist/services/shell-input-agent.js +361 -0
- package/dist/services/shell-input-agent.js.map +1 -0
- package/dist/services/sub-agent-manager.d.ts +139 -0
- package/dist/services/sub-agent-manager.d.ts.map +1 -0
- package/dist/services/sub-agent-manager.js +517 -0
- package/dist/services/sub-agent-manager.js.map +1 -0
- package/dist/tools/background-command.d.ts.map +1 -1
- package/dist/tools/background-command.js +33 -13
- package/dist/tools/background-command.js.map +1 -1
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +78 -4
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/file-ops.d.ts.map +1 -1
- package/dist/tools/file-ops.js +33 -19
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/get-diff.d.ts.map +1 -1
- package/dist/tools/get-diff.js +5 -2
- package/dist/tools/get-diff.js.map +1 -1
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +41 -15
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/plan-mode.js +3 -3
- package/dist/tools/plan-mode.js.map +1 -1
- package/dist/tools/registry.js +1 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/sub-agent.d.ts +9 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +232 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/task-complete.d.ts.map +1 -1
- package/dist/tools/task-complete.js +14 -32
- package/dist/tools/task-complete.js.map +1 -1
- package/dist/ui/components/App.d.ts +45 -0
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +598 -95
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/CircularSelectInput.d.ts +24 -0
- package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
- package/dist/ui/components/CircularSelectInput.js +71 -0
- package/dist/ui/components/CircularSelectInput.js.map +1 -0
- package/dist/ui/components/ErrorBoundary.d.ts +3 -2
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/ui/components/ErrorBoundary.js +29 -1
- package/dist/ui/components/ErrorBoundary.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +4 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +40 -2
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +6 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +57 -6
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/MCPAddScreen.d.ts +13 -0
- package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPAddScreen.js +54 -0
- package/dist/ui/components/MCPAddScreen.js.map +1 -0
- package/dist/ui/components/MCPListScreen.d.ts +17 -0
- package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPListScreen.js +50 -0
- package/dist/ui/components/MCPListScreen.js.map +1 -0
- package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
- package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPServerListScreen.js +59 -0
- package/dist/ui/components/MCPServerListScreen.js.map +1 -0
- package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
- package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
- package/dist/ui/components/MonitorModeAIPanel.js +69 -0
- package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
- package/dist/ui/components/MultiLineInput.d.ts +13 -0
- package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
- package/dist/ui/components/MultiLineInput.js +223 -0
- package/dist/ui/components/MultiLineInput.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +2 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +33 -2
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +271 -12
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.js +3 -2
- package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
- package/dist/utils/editor-utils.d.ts +3 -3
- package/dist/utils/editor-utils.d.ts.map +1 -1
- package/dist/utils/editor-utils.js +15 -12
- package/dist/utils/editor-utils.js.map +1 -1
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +1 -0
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/terminal-output.d.ts.map +1 -1
- package/dist/utils/terminal-output.js +198 -171
- package/dist/utils/terminal-output.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Input Agent Service
|
|
3
|
+
*
|
|
4
|
+
* An isolated AI agent that handles shell input prompts during Agent Control Mode.
|
|
5
|
+
* Completely separate from the main chat agent - has its own conversation history,
|
|
6
|
+
* tools, and lifecycle. Terminates immediately when the shell command completes.
|
|
7
|
+
*/
|
|
8
|
+
import { aiServiceClient } from './ai-service-client.js';
|
|
9
|
+
import { sessionQuotaManager } from './session-quota-manager.js';
|
|
10
|
+
import { quickLog } from '../utils/conversation-logger.js';
|
|
11
|
+
// ==================== Constants ====================
|
|
12
|
+
const MAX_TURNS_PER_SESSION = 20; // Max AI turns per shell session
|
|
13
|
+
const MODEL = 'gemini-3-flash-preview'; // Fast model for quick responses
|
|
14
|
+
// ==================== Helper Functions ====================
|
|
15
|
+
/**
|
|
16
|
+
* Convert literal escape sequences (like \n, \r, \t) to actual control characters.
|
|
17
|
+
* The AI often returns "1\n" where \n is meant to be a newline but arrives as literal chars.
|
|
18
|
+
*/
|
|
19
|
+
function convertEscapeSequences(input) {
|
|
20
|
+
return input
|
|
21
|
+
.replace(/\\n/g, '\n') // newline
|
|
22
|
+
.replace(/\\r/g, '\r') // carriage return
|
|
23
|
+
.replace(/\\t/g, '\t') // tab
|
|
24
|
+
.replace(/\\x1b/gi, '\x1b') // escape for arrow keys etc
|
|
25
|
+
.replace(/\\e/g, '\x1b'); // alternative escape notation
|
|
26
|
+
}
|
|
27
|
+
// ==================== Shell Input System Prompt ====================
|
|
28
|
+
const SHELL_INPUT_SYSTEM_PROMPT = `You are a specialized AI agent that ONLY provides input to an interactive shell command.
|
|
29
|
+
|
|
30
|
+
CRITICAL RULES:
|
|
31
|
+
1. You may ONLY use the execute_command tool with shell_input parameter
|
|
32
|
+
2. NEVER try to start a new command - only send input to the EXISTING running shell
|
|
33
|
+
3. Respond with ONLY the tool call - no explanations needed
|
|
34
|
+
4. Set SafeToAutoRun: true to avoid approval prompts
|
|
35
|
+
5. For password prompts, DO NOT provide passwords - skip with a neutral response
|
|
36
|
+
6. IMPORTANT: The shell_input value will automatically have Enter pressed after it
|
|
37
|
+
- Just provide the text you want to type, the system will press Enter
|
|
38
|
+
- For example: shell_input="1" NOT shell_input="1\\n"
|
|
39
|
+
|
|
40
|
+
Your ONLY job is to analyze shell output and provide appropriate input when prompted.`;
|
|
41
|
+
// ==================== ShellInputAgent Class ====================
|
|
42
|
+
class ShellInputAgentClass {
|
|
43
|
+
sessions = new Map();
|
|
44
|
+
toolRegistry;
|
|
45
|
+
onShellInput;
|
|
46
|
+
onToolExecutionUpdate;
|
|
47
|
+
onPromptAnswered; // Callback when a prompt has been answered
|
|
48
|
+
processingLock = new Map(); // Prevent concurrent AI calls per shell
|
|
49
|
+
/**
|
|
50
|
+
* Initialize the agent with a tool registry
|
|
51
|
+
*/
|
|
52
|
+
initialize(toolRegistry) {
|
|
53
|
+
this.toolRegistry = toolRegistry;
|
|
54
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Initialized with tool registry\n`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Set callback for sending input to shell (bridges to App.tsx's onShellInput)
|
|
58
|
+
*/
|
|
59
|
+
setOnShellInput(callback) {
|
|
60
|
+
this.onShellInput = callback;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Set callback for tool execution updates (for UI feedback)
|
|
64
|
+
*/
|
|
65
|
+
setOnToolExecutionUpdate(callback) {
|
|
66
|
+
this.onToolExecutionUpdate = callback;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Set callback for when a prompt has been answered
|
|
70
|
+
* This is used to update the UI to show a tick instead of spinner
|
|
71
|
+
*/
|
|
72
|
+
setOnPromptAnswered(callback) {
|
|
73
|
+
this.onPromptAnswered = callback;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Start a new shell input session
|
|
77
|
+
* @param shellId Unique identifier for this shell session
|
|
78
|
+
* @param command The command being run
|
|
79
|
+
* @param cwd Current working directory
|
|
80
|
+
* @param mainConversation Optional main agent conversation history for context
|
|
81
|
+
*/
|
|
82
|
+
startSession(shellId, command, cwd, mainConversation) {
|
|
83
|
+
// Terminate any existing session for this shell
|
|
84
|
+
this.terminateSession(shellId);
|
|
85
|
+
const session = {
|
|
86
|
+
shellId,
|
|
87
|
+
command,
|
|
88
|
+
cwd,
|
|
89
|
+
isActive: true,
|
|
90
|
+
abortController: new AbortController(),
|
|
91
|
+
conversationHistory: [],
|
|
92
|
+
mainConversationContext: mainConversation,
|
|
93
|
+
turnCount: 0,
|
|
94
|
+
startTime: new Date()
|
|
95
|
+
};
|
|
96
|
+
this.sessions.set(shellId, session);
|
|
97
|
+
this.processingLock.set(shellId, false);
|
|
98
|
+
const contextInfo = mainConversation ? ` (with ${mainConversation.length} context messages)` : '';
|
|
99
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Started session for ${shellId}: ${command}${contextInfo}\n`);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Handle an input prompt detected in shell output
|
|
103
|
+
* Returns quickly - AI call runs in background
|
|
104
|
+
*/
|
|
105
|
+
async handleInputPrompt(shellId, shellOutput, promptContext, inputType, confidence) {
|
|
106
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] handleInputPrompt called for ${shellId}, sessions count: ${this.sessions.size}\n`);
|
|
107
|
+
const session = this.sessions.get(shellId);
|
|
108
|
+
if (!session || !session.isActive) {
|
|
109
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] No active session for ${shellId}, ignoring prompt\n`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Check if already processing a prompt for this shell
|
|
113
|
+
if (this.processingLock.get(shellId)) {
|
|
114
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Already processing for ${shellId}, ignoring duplicate\n`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Set lock
|
|
118
|
+
this.processingLock.set(shellId, true);
|
|
119
|
+
// Run AI call in background (don't await)
|
|
120
|
+
this.processInputPrompt(session, shellOutput, promptContext, inputType, confidence)
|
|
121
|
+
.catch(error => {
|
|
122
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Error processing prompt for ${shellId}: ${error.message}\n`);
|
|
123
|
+
})
|
|
124
|
+
.finally(() => {
|
|
125
|
+
this.processingLock.set(shellId, false);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Process an input prompt with AI
|
|
130
|
+
*/
|
|
131
|
+
async processInputPrompt(session, shellOutput, promptContext, inputType, confidence) {
|
|
132
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] processInputPrompt entry for ${session.shellId}, isActive=${session.isActive}, turnCount=${session.turnCount}\n`);
|
|
133
|
+
if (!session.isActive) {
|
|
134
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Session not active, returning\n`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Check turn limit
|
|
138
|
+
if (session.turnCount >= MAX_TURNS_PER_SESSION) {
|
|
139
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Session ${session.shellId} hit max turns\n`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Check quota
|
|
143
|
+
if (!sessionQuotaManager.canSendMessage()) {
|
|
144
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Session quota exhausted\n`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Check if tool registry is available
|
|
148
|
+
if (!this.toolRegistry) {
|
|
149
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Tool registry not initialized\n`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
session.turnCount++;
|
|
153
|
+
session.lastInputTime = new Date();
|
|
154
|
+
// Build the prompt for this input
|
|
155
|
+
const userPrompt = this.buildInputPrompt(session, shellOutput, promptContext, inputType, confidence);
|
|
156
|
+
// Add to session's isolated conversation history
|
|
157
|
+
if (session.conversationHistory.length === 0) {
|
|
158
|
+
// First message includes system context
|
|
159
|
+
session.conversationHistory.push({
|
|
160
|
+
role: 'user',
|
|
161
|
+
content: SHELL_INPUT_SYSTEM_PROMPT + '\n\n' + userPrompt
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
session.conversationHistory.push({
|
|
166
|
+
role: 'user',
|
|
167
|
+
content: userPrompt
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Get only execute_command tool schema
|
|
171
|
+
const executeCommandSchema = this.toolRegistry.getSchemas().filter(t => t.name === 'execute_command');
|
|
172
|
+
try {
|
|
173
|
+
let assistantMessage = '';
|
|
174
|
+
let toolCalls = [];
|
|
175
|
+
// Increment quota
|
|
176
|
+
sessionQuotaManager.incrementMessageCount();
|
|
177
|
+
// Stream AI response with abort signal
|
|
178
|
+
for await (const chunk of aiServiceClient.streamChat(MODEL, session.conversationHistory, executeCommandSchema, {
|
|
179
|
+
cwd: session.cwd,
|
|
180
|
+
platform: process.platform,
|
|
181
|
+
shell: process.env.SHELL || 'cmd.exe',
|
|
182
|
+
os: 'windows',
|
|
183
|
+
homeDir: process.env.USERPROFILE || ''
|
|
184
|
+
}, undefined, undefined, session.abortController.signal)) {
|
|
185
|
+
// Check if session was terminated
|
|
186
|
+
if (!session.isActive) {
|
|
187
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Session ${session.shellId} terminated during streaming\n`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (chunk.type === 'error') {
|
|
191
|
+
throw new Error(chunk.message);
|
|
192
|
+
}
|
|
193
|
+
if (chunk.type === 'text') {
|
|
194
|
+
assistantMessage += chunk.content;
|
|
195
|
+
}
|
|
196
|
+
if (chunk.type === 'tool_call') {
|
|
197
|
+
const toolCall = chunk.toolCall;
|
|
198
|
+
// Parse string arguments if needed
|
|
199
|
+
if (toolCall.arguments && typeof toolCall.arguments === 'string') {
|
|
200
|
+
try {
|
|
201
|
+
toolCall.arguments = JSON.parse(toolCall.arguments);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
// Ignore parsing error
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
toolCalls.push(toolCall);
|
|
208
|
+
}
|
|
209
|
+
if (chunk.type === 'done') {
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Check again if session is still active
|
|
214
|
+
if (!session.isActive) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// Process tool calls
|
|
218
|
+
for (const toolCall of toolCalls) {
|
|
219
|
+
if (toolCall.name === 'execute_command' && toolCall.arguments?.shell_input) {
|
|
220
|
+
const rawShellInput = toolCall.arguments.shell_input;
|
|
221
|
+
// Convert escape sequences like \n to actual newlines
|
|
222
|
+
let shellInput = convertEscapeSequences(rawShellInput);
|
|
223
|
+
// Automatically append Enter (carriage return) if not already present
|
|
224
|
+
// This ensures the input is actually submitted to the shell
|
|
225
|
+
if (!shellInput.endsWith('\n') && !shellInput.endsWith('\r')) {
|
|
226
|
+
shellInput += '\r';
|
|
227
|
+
}
|
|
228
|
+
// Send input to shell via callback
|
|
229
|
+
if (this.onShellInput) {
|
|
230
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Sending input to ${session.shellId}: "${rawShellInput}" + Enter\n`);
|
|
231
|
+
this.onShellInput(session.shellId, shellInput);
|
|
232
|
+
// Notify that a prompt has been answered (to update UI spinner -> tick)
|
|
233
|
+
if (this.onPromptAnswered) {
|
|
234
|
+
this.onPromptAnswered(session.shellId);
|
|
235
|
+
}
|
|
236
|
+
// Add to conversation history
|
|
237
|
+
session.conversationHistory.push({
|
|
238
|
+
role: 'assistant',
|
|
239
|
+
content: '',
|
|
240
|
+
tool_calls: [toolCall]
|
|
241
|
+
});
|
|
242
|
+
session.conversationHistory.push({
|
|
243
|
+
role: 'tool',
|
|
244
|
+
tool_call_id: toolCall.id,
|
|
245
|
+
content: `Sent input to shell: ${shellInput}`
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
if (error.name === 'AbortError') {
|
|
253
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Session ${session.shellId} aborted\n`);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Build the input prompt for AI
|
|
261
|
+
*/
|
|
262
|
+
buildInputPrompt(session, shellOutput, promptContext, inputType, confidence) {
|
|
263
|
+
// Get last 30 lines of output
|
|
264
|
+
const lastLines = shellOutput.split('\n').slice(-30).join('\n');
|
|
265
|
+
// Build context from main conversation if available
|
|
266
|
+
let conversationContext = '';
|
|
267
|
+
if (session.mainConversationContext && session.mainConversationContext.length > 0) {
|
|
268
|
+
// Extract user messages for context (most relevant for understanding intent)
|
|
269
|
+
const userMessages = session.mainConversationContext
|
|
270
|
+
.filter(msg => msg.role === 'user' && typeof msg.content === 'string')
|
|
271
|
+
.map(msg => msg.content)
|
|
272
|
+
.slice(-3) // Last 3 user messages for context
|
|
273
|
+
.join('\n---\n');
|
|
274
|
+
if (userMessages) {
|
|
275
|
+
conversationContext = `
|
|
276
|
+
**User's Original Intent (from main conversation):**
|
|
277
|
+
\`\`\`
|
|
278
|
+
${userMessages.substring(0, 1000)}${userMessages.length > 1000 ? '...[truncated]' : ''}
|
|
279
|
+
\`\`\`
|
|
280
|
+
|
|
281
|
+
Consider the user's original intent when providing input. If the user mentioned specific values to use, prefer those.
|
|
282
|
+
`;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return `[SHELL INPUT REQUIRED]
|
|
286
|
+
|
|
287
|
+
**Running command:** ${session.command}
|
|
288
|
+
**Working directory:** ${session.cwd}
|
|
289
|
+
${conversationContext}
|
|
290
|
+
**Current shell output (last 30 lines):**
|
|
291
|
+
\`\`\`
|
|
292
|
+
${lastLines}
|
|
293
|
+
\`\`\`
|
|
294
|
+
|
|
295
|
+
**Detected prompt:** ${promptContext}
|
|
296
|
+
**Input type needed:** ${inputType}
|
|
297
|
+
**Confidence:** ${confidence}
|
|
298
|
+
|
|
299
|
+
Use execute_command with shell_input to respond. Example:
|
|
300
|
+
{
|
|
301
|
+
"tool": "execute_command",
|
|
302
|
+
"arguments": {
|
|
303
|
+
"shell_input": "YOUR_INPUT_HERE",
|
|
304
|
+
"SafeToAutoRun": true,
|
|
305
|
+
"CommandLine": "${session.command}",
|
|
306
|
+
"Cwd": "${session.cwd}"
|
|
307
|
+
}
|
|
308
|
+
}`;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Terminate a shell input session immediately
|
|
312
|
+
*/
|
|
313
|
+
terminateSession(shellId) {
|
|
314
|
+
const session = this.sessions.get(shellId);
|
|
315
|
+
if (session) {
|
|
316
|
+
quickLog(`[${new Date().toISOString()}] [ShellInputAgent] Terminating session ${shellId}\n`);
|
|
317
|
+
// Mark as inactive first
|
|
318
|
+
session.isActive = false;
|
|
319
|
+
// Abort any running AI call
|
|
320
|
+
try {
|
|
321
|
+
session.abortController.abort();
|
|
322
|
+
}
|
|
323
|
+
catch (e) {
|
|
324
|
+
// Ignore abort errors
|
|
325
|
+
}
|
|
326
|
+
// Clean up
|
|
327
|
+
this.sessions.delete(shellId);
|
|
328
|
+
this.processingLock.delete(shellId);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Check if a session is active
|
|
333
|
+
*/
|
|
334
|
+
isSessionActive(shellId) {
|
|
335
|
+
const session = this.sessions.get(shellId);
|
|
336
|
+
return session?.isActive ?? false;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get session info (for debugging)
|
|
340
|
+
*/
|
|
341
|
+
getSessionInfo(shellId) {
|
|
342
|
+
const session = this.sessions.get(shellId);
|
|
343
|
+
if (!session)
|
|
344
|
+
return undefined;
|
|
345
|
+
return {
|
|
346
|
+
turnCount: session.turnCount,
|
|
347
|
+
isActive: session.isActive
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Terminate all active sessions
|
|
352
|
+
*/
|
|
353
|
+
terminateAllSessions() {
|
|
354
|
+
for (const shellId of this.sessions.keys()) {
|
|
355
|
+
this.terminateSession(shellId);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Export singleton
|
|
360
|
+
export const ShellInputAgent = new ShellInputAgentClass();
|
|
361
|
+
//# sourceMappingURL=shell-input-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-input-agent.js","sourceRoot":"","sources":["../../src/services/shell-input-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sub-Agent Manager Service
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of background sub-agents that can be spawned
|
|
5
|
+
* by the main agent to handle delegated tasks.
|
|
6
|
+
*/
|
|
7
|
+
import { Message as AIMessage } from './ai-service-client.js';
|
|
8
|
+
import { ToolRegistry } from '../tools/registry.js';
|
|
9
|
+
export interface SubAgentConfig {
|
|
10
|
+
prompt: string;
|
|
11
|
+
context: string;
|
|
12
|
+
workingDirectory: string;
|
|
13
|
+
complexity: number;
|
|
14
|
+
}
|
|
15
|
+
export interface FileOperation {
|
|
16
|
+
type: 'create' | 'edit' | 'delete';
|
|
17
|
+
path: string;
|
|
18
|
+
originalContent?: string;
|
|
19
|
+
newContent?: string;
|
|
20
|
+
diff?: string;
|
|
21
|
+
reasonText?: string;
|
|
22
|
+
timestamp: Date;
|
|
23
|
+
}
|
|
24
|
+
export interface ToolExecution {
|
|
25
|
+
toolName: string;
|
|
26
|
+
arguments: Record<string, any>;
|
|
27
|
+
reasonText?: string;
|
|
28
|
+
result: string;
|
|
29
|
+
success: boolean;
|
|
30
|
+
timestamp: Date;
|
|
31
|
+
}
|
|
32
|
+
export type SubAgentStatus = 'pending' | 'running' | 'completed' | 'failed' | 'terminated';
|
|
33
|
+
export interface SubAgent {
|
|
34
|
+
id: string;
|
|
35
|
+
status: SubAgentStatus;
|
|
36
|
+
prompt: string;
|
|
37
|
+
context: string;
|
|
38
|
+
workingDirectory: string;
|
|
39
|
+
complexity: number;
|
|
40
|
+
model: string;
|
|
41
|
+
startTime: Date;
|
|
42
|
+
endTime?: Date;
|
|
43
|
+
conversationHistory: AIMessage[];
|
|
44
|
+
turnCount: number;
|
|
45
|
+
fileOperations: FileOperation[];
|
|
46
|
+
toolHistory: ToolExecution[];
|
|
47
|
+
result?: string;
|
|
48
|
+
error?: string;
|
|
49
|
+
isRead: boolean;
|
|
50
|
+
abortController?: AbortController;
|
|
51
|
+
}
|
|
52
|
+
declare class SubAgentManagerClass {
|
|
53
|
+
private subAgents;
|
|
54
|
+
private toolRegistry?;
|
|
55
|
+
private onSubAgentCountChange?;
|
|
56
|
+
private onToolExecutionUpdate?;
|
|
57
|
+
/**
|
|
58
|
+
* Initialize the manager with a tool registry
|
|
59
|
+
*/
|
|
60
|
+
initialize(toolRegistry: ToolRegistry): void;
|
|
61
|
+
/**
|
|
62
|
+
* Set callback for sub-agent count changes
|
|
63
|
+
*/
|
|
64
|
+
setOnSubAgentCountChange(callback: (count: number) => void): void;
|
|
65
|
+
/**
|
|
66
|
+
* Set callback for tool execution updates (for logging)
|
|
67
|
+
*/
|
|
68
|
+
setOnToolExecutionUpdate(callback: (update: any) => void): void;
|
|
69
|
+
/**
|
|
70
|
+
* Notify listeners about sub-agent count change
|
|
71
|
+
*/
|
|
72
|
+
private notifyCountChange;
|
|
73
|
+
/**
|
|
74
|
+
* Select model based on complexity
|
|
75
|
+
*/
|
|
76
|
+
private selectModel;
|
|
77
|
+
/**
|
|
78
|
+
* Generate system prompt for sub-agent
|
|
79
|
+
*/
|
|
80
|
+
private generateSystemPrompt;
|
|
81
|
+
/**
|
|
82
|
+
* Spawn a new sub-agent
|
|
83
|
+
*/
|
|
84
|
+
spawnSubAgent(config: SubAgentConfig): Promise<{
|
|
85
|
+
success: boolean;
|
|
86
|
+
agentId?: string;
|
|
87
|
+
error?: string;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Run the sub-agent's agent loop
|
|
91
|
+
*/
|
|
92
|
+
private runSubAgentLoop;
|
|
93
|
+
/**
|
|
94
|
+
* Track file operations made by sub-agent
|
|
95
|
+
*/
|
|
96
|
+
private trackFileOperation;
|
|
97
|
+
/**
|
|
98
|
+
* Get a sub-agent by ID
|
|
99
|
+
*/
|
|
100
|
+
getSubAgent(agentId: string): SubAgent | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Get all sub-agents
|
|
103
|
+
*/
|
|
104
|
+
getAllSubAgents(): SubAgent[];
|
|
105
|
+
/**
|
|
106
|
+
* Get running sub-agents
|
|
107
|
+
*/
|
|
108
|
+
getRunningSubAgents(): SubAgent[];
|
|
109
|
+
/**
|
|
110
|
+
* Get completed but unread sub-agents
|
|
111
|
+
*/
|
|
112
|
+
getCompletedUnreadSubAgents(): SubAgent[];
|
|
113
|
+
/**
|
|
114
|
+
* Terminate a sub-agent
|
|
115
|
+
*/
|
|
116
|
+
terminateSubAgent(agentId: string): {
|
|
117
|
+
success: boolean;
|
|
118
|
+
error?: string;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Get formatted diff output for a sub-agent
|
|
122
|
+
*/
|
|
123
|
+
getSubAgentDiff(agentId: string): string;
|
|
124
|
+
/**
|
|
125
|
+
* Mark sub-agent results as read
|
|
126
|
+
*/
|
|
127
|
+
markSubAgentRead(agentId: string): void;
|
|
128
|
+
/**
|
|
129
|
+
* Format duration between two dates
|
|
130
|
+
*/
|
|
131
|
+
private formatDuration;
|
|
132
|
+
/**
|
|
133
|
+
* Clean up old completed sub-agents (call periodically)
|
|
134
|
+
*/
|
|
135
|
+
cleanup(): void;
|
|
136
|
+
}
|
|
137
|
+
export declare const SubAgentManager: SubAgentManagerClass;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=sub-agent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sub-agent-manager.d.ts","sourceRoot":"","sources":["../../src/services/sub-agent-manager.ts"],"names":[],"mappings":"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"}
|