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.
Files changed (148) hide show
  1. package/dist/cli-adapter.d.ts +78 -0
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +566 -165
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/build-config.d.ts +1 -1
  6. package/dist/config/build-config.js +1 -1
  7. package/dist/config/mcp-config-manager.d.ts +21 -0
  8. package/dist/config/mcp-config-manager.d.ts.map +1 -1
  9. package/dist/config/mcp-config-manager.js +184 -1
  10. package/dist/config/mcp-config-manager.js.map +1 -1
  11. package/dist/config/models.d.ts +1 -0
  12. package/dist/config/models.d.ts.map +1 -1
  13. package/dist/config/models.js +7 -2
  14. package/dist/config/models.js.map +1 -1
  15. package/dist/config/slash-commands.d.ts.map +1 -1
  16. package/dist/config/slash-commands.js +5 -3
  17. package/dist/config/slash-commands.js.map +1 -1
  18. package/dist/index.js +66 -11
  19. package/dist/index.js.map +1 -1
  20. package/dist/mcp/mcp-command-handler.d.ts +34 -3
  21. package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
  22. package/dist/mcp/mcp-command-handler.js +171 -83
  23. package/dist/mcp/mcp-command-handler.js.map +1 -1
  24. package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
  25. package/dist/mcp/mcp-server-manager.js +9 -23
  26. package/dist/mcp/mcp-server-manager.js.map +1 -1
  27. package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
  28. package/dist/mcp/mcp-tool-wrapper.js +42 -5
  29. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  30. package/dist/services/ai-service-client.d.ts +6 -1
  31. package/dist/services/ai-service-client.d.ts.map +1 -1
  32. package/dist/services/ai-service-client.js +6 -6
  33. package/dist/services/ai-service-client.js.map +1 -1
  34. package/dist/services/api-client.d.ts +20 -0
  35. package/dist/services/api-client.d.ts.map +1 -1
  36. package/dist/services/api-client.js +35 -0
  37. package/dist/services/api-client.js.map +1 -1
  38. package/dist/services/input-detection-agent.d.ts +40 -0
  39. package/dist/services/input-detection-agent.d.ts.map +1 -0
  40. package/dist/services/input-detection-agent.js +213 -0
  41. package/dist/services/input-detection-agent.js.map +1 -0
  42. package/dist/services/input-requirement-detector.d.ts +28 -0
  43. package/dist/services/input-requirement-detector.d.ts.map +1 -0
  44. package/dist/services/input-requirement-detector.js +203 -0
  45. package/dist/services/input-requirement-detector.js.map +1 -0
  46. package/dist/services/monitored-shell-manager.d.ts +120 -0
  47. package/dist/services/monitored-shell-manager.d.ts.map +1 -0
  48. package/dist/services/monitored-shell-manager.js +239 -0
  49. package/dist/services/monitored-shell-manager.js.map +1 -0
  50. package/dist/services/session-quota-manager.d.ts +101 -0
  51. package/dist/services/session-quota-manager.d.ts.map +1 -0
  52. package/dist/services/session-quota-manager.js +242 -0
  53. package/dist/services/session-quota-manager.js.map +1 -0
  54. package/dist/services/shell-input-agent.d.ts +89 -0
  55. package/dist/services/shell-input-agent.d.ts.map +1 -0
  56. package/dist/services/shell-input-agent.js +361 -0
  57. package/dist/services/shell-input-agent.js.map +1 -0
  58. package/dist/services/sub-agent-manager.d.ts +139 -0
  59. package/dist/services/sub-agent-manager.d.ts.map +1 -0
  60. package/dist/services/sub-agent-manager.js +517 -0
  61. package/dist/services/sub-agent-manager.js.map +1 -0
  62. package/dist/tools/background-command.d.ts.map +1 -1
  63. package/dist/tools/background-command.js +33 -13
  64. package/dist/tools/background-command.js.map +1 -1
  65. package/dist/tools/command.d.ts.map +1 -1
  66. package/dist/tools/command.js +78 -4
  67. package/dist/tools/command.js.map +1 -1
  68. package/dist/tools/file-ops.d.ts.map +1 -1
  69. package/dist/tools/file-ops.js +33 -19
  70. package/dist/tools/file-ops.js.map +1 -1
  71. package/dist/tools/get-diff.d.ts.map +1 -1
  72. package/dist/tools/get-diff.js +5 -2
  73. package/dist/tools/get-diff.js.map +1 -1
  74. package/dist/tools/grep-search.d.ts.map +1 -1
  75. package/dist/tools/grep-search.js +41 -15
  76. package/dist/tools/grep-search.js.map +1 -1
  77. package/dist/tools/plan-mode.js +3 -3
  78. package/dist/tools/plan-mode.js.map +1 -1
  79. package/dist/tools/registry.js +1 -1
  80. package/dist/tools/registry.js.map +1 -1
  81. package/dist/tools/sub-agent.d.ts +9 -0
  82. package/dist/tools/sub-agent.d.ts.map +1 -0
  83. package/dist/tools/sub-agent.js +232 -0
  84. package/dist/tools/sub-agent.js.map +1 -0
  85. package/dist/tools/task-complete.d.ts.map +1 -1
  86. package/dist/tools/task-complete.js +14 -32
  87. package/dist/tools/task-complete.js.map +1 -1
  88. package/dist/ui/components/App.d.ts +45 -0
  89. package/dist/ui/components/App.d.ts.map +1 -1
  90. package/dist/ui/components/App.js +598 -95
  91. package/dist/ui/components/App.js.map +1 -1
  92. package/dist/ui/components/CircularSelectInput.d.ts +24 -0
  93. package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
  94. package/dist/ui/components/CircularSelectInput.js +71 -0
  95. package/dist/ui/components/CircularSelectInput.js.map +1 -0
  96. package/dist/ui/components/ErrorBoundary.d.ts +3 -2
  97. package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
  98. package/dist/ui/components/ErrorBoundary.js +29 -1
  99. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  100. package/dist/ui/components/InputBox.d.ts +4 -0
  101. package/dist/ui/components/InputBox.d.ts.map +1 -1
  102. package/dist/ui/components/InputBox.js +40 -2
  103. package/dist/ui/components/InputBox.js.map +1 -1
  104. package/dist/ui/components/InteractiveShell.d.ts +6 -0
  105. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  106. package/dist/ui/components/InteractiveShell.js +57 -6
  107. package/dist/ui/components/InteractiveShell.js.map +1 -1
  108. package/dist/ui/components/MCPAddScreen.d.ts +13 -0
  109. package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
  110. package/dist/ui/components/MCPAddScreen.js +54 -0
  111. package/dist/ui/components/MCPAddScreen.js.map +1 -0
  112. package/dist/ui/components/MCPListScreen.d.ts +17 -0
  113. package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
  114. package/dist/ui/components/MCPListScreen.js +50 -0
  115. package/dist/ui/components/MCPListScreen.js.map +1 -0
  116. package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
  117. package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
  118. package/dist/ui/components/MCPServerListScreen.js +59 -0
  119. package/dist/ui/components/MCPServerListScreen.js.map +1 -0
  120. package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
  121. package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
  122. package/dist/ui/components/MonitorModeAIPanel.js +69 -0
  123. package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
  124. package/dist/ui/components/MultiLineInput.d.ts +13 -0
  125. package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
  126. package/dist/ui/components/MultiLineInput.js +223 -0
  127. package/dist/ui/components/MultiLineInput.js.map +1 -0
  128. package/dist/ui/components/StatusBar.d.ts +2 -0
  129. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  130. package/dist/ui/components/StatusBar.js +33 -2
  131. package/dist/ui/components/StatusBar.js.map +1 -1
  132. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  133. package/dist/ui/components/ToolExecutionMessage.js +271 -12
  134. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  135. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
  136. package/dist/ui/components/VersionUpdatePrompt.js +3 -2
  137. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
  138. package/dist/utils/editor-utils.d.ts +3 -3
  139. package/dist/utils/editor-utils.d.ts.map +1 -1
  140. package/dist/utils/editor-utils.js +15 -12
  141. package/dist/utils/editor-utils.js.map +1 -1
  142. package/dist/utils/input-classifier.d.ts.map +1 -1
  143. package/dist/utils/input-classifier.js +1 -0
  144. package/dist/utils/input-classifier.js.map +1 -1
  145. package/dist/utils/terminal-output.d.ts.map +1 -1
  146. package/dist/utils/terminal-output.js +198 -171
  147. package/dist/utils/terminal-output.js.map +1 -1
  148. 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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAqC,MAAM,wBAAwB,CAAC;AAI5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAiB3D,sDAAsD;AAEtD,MAAM,qBAAqB,GAAG,EAAE,CAAC,CAAE,iCAAiC;AACpE,MAAM,KAAK,GAAG,wBAAwB,CAAC,CAAE,iCAAiC;AAE1E,6DAA6D;AAE7D;;;GAGG;AACH,SAAS,sBAAsB,CAAC,KAAa;IACzC,OAAO,KAAK;SACP,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAI,UAAU;SACnC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAI,kBAAkB;SAC3C,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAI,MAAM;SAC/B,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAE,4BAA4B;SACxD,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAI,8BAA8B;AACnE,CAAC;AAED,sEAAsE;AAEtE,MAAM,yBAAyB,GAAG;;;;;;;;;;;;sFAYoD,CAAC;AAEvF,kEAAkE;AAElE,MAAM,oBAAoB;IACd,QAAQ,GAAmC,IAAI,GAAG,EAAE,CAAC;IACrD,YAAY,CAAgB;IAC5B,YAAY,CAA4C;IACxD,qBAAqB,CAAyB;IAC9C,gBAAgB,CAA6B,CAAE,2CAA2C;IAC1F,cAAc,GAAyB,IAAI,GAAG,EAAE,CAAC,CAAE,wCAAwC;IAEnG;;OAEG;IACH,UAAU,CAAC,YAA0B;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,sDAAsD,CAAC,CAAC;IACjG,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAkD;QAC9D,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,QAA+B;QACpD,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,QAAmC;QACnD,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,OAAe,EAAE,OAAe,EAAE,GAAW,EAAE,gBAA8B;QACtF,gDAAgD;QAChD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAsB;YAC/B,OAAO;YACP,OAAO;YACP,GAAG;YACH,QAAQ,EAAE,IAAI;YACd,eAAe,EAAE,IAAI,eAAe,EAAE;YACtC,mBAAmB,EAAE,EAAE;YACvB,uBAAuB,EAAE,gBAAgB;YACzC,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAExC,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,UAAU,gBAAgB,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,2CAA2C,OAAO,KAAK,OAAO,GAAG,WAAW,IAAI,CAAC,CAAC;IAC3H,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CACnB,OAAe,EACf,WAAmB,EACnB,aAAqB,EACrB,SAAiB,EACjB,UAAkB;QAElB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,oDAAoD,OAAO,qBAAqB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;QAE7I,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,6CAA6C,OAAO,qBAAqB,CAAC,CAAC;YAChH,OAAO;QACX,CAAC;QAED,sDAAsD;QACtD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,8CAA8C,OAAO,wBAAwB,CAAC,CAAC;YACpH,OAAO;QACX,CAAC;QAED,WAAW;QACX,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEvC,0CAA0C;QAC1C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC;aAC9E,KAAK,CAAC,KAAK,CAAC,EAAE;YACX,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,mDAAmD,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC3H,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC5B,OAA0B,EAC1B,WAAmB,EACnB,aAAqB,EACrB,SAAiB,EACjB,UAAkB;QAElB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,oDAAoD,OAAO,CAAC,OAAO,cAAc,OAAO,CAAC,QAAQ,eAAe,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QAE5K,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,qDAAqD,CAAC,CAAC;YAC5F,OAAO;QACX,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,CAAC,SAAS,IAAI,qBAAqB,EAAE,CAAC;YAC7C,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,+BAA+B,OAAO,CAAC,OAAO,kBAAkB,CAAC,CAAC;YACvG,OAAO;QACX,CAAC;QAED,cAAc;QACd,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,+CAA+C,CAAC,CAAC;YACtF,OAAO;QACX,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,qDAAqD,CAAC,CAAC;YAC5F,OAAO;QACX,CAAC;QAED,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;QAEnC,kCAAkC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAErG,iDAAiD;QACjD,IAAI,OAAO,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,wCAAwC;YACxC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAC7B,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,yBAAyB,GAAG,MAAM,GAAG,UAAU;aAC3D,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAC7B,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,UAAU;aACtB,CAAC,CAAC;QACP,CAAC;QAED,uCAAuC;QACvC,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;QAEtG,IAAI,CAAC;YACD,IAAI,gBAAgB,GAAG,EAAE,CAAC;YAC1B,IAAI,SAAS,GAAU,EAAE,CAAC;YAE1B,kBAAkB;YAClB,mBAAmB,CAAC,qBAAqB,EAAE,CAAC;YAE5C,uCAAuC;YACvC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,eAAe,CAAC,UAAU,CAChD,KAAK,EACL,OAAO,CAAC,mBAAmB,EAC3B,oBAAoB,EACpB;gBACI,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS;gBACrC,EAAE,EAAE,SAAS;gBACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;aACzC,EACD,SAAS,EACT,SAAS,EACT,OAAO,CAAC,eAAe,CAAC,MAAM,CACjC,EAAE,CAAC;gBACA,kCAAkC;gBAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACpB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,+BAA+B,OAAO,CAAC,OAAO,gCAAgC,CAAC,CAAC;oBACrH,OAAO;gBACX,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxB,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC;gBACtC,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;oBAChC,mCAAmC;oBACnC,IAAI,QAAQ,CAAC,SAAS,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;wBAC/D,IAAI,CAAC;4BACD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBACxD,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACT,uBAAuB;wBAC3B,CAAC;oBACL,CAAC;oBACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxB,MAAM;gBACV,CAAC;YACL,CAAC;YAED,yCAAyC;YACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACpB,OAAO;YACX,CAAC;YAED,qBAAqB;YACrB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC/B,IAAI,QAAQ,CAAC,IAAI,KAAK,iBAAiB,IAAI,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;oBACzE,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;oBACrD,sDAAsD;oBACtD,IAAI,UAAU,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;oBAEvD,sEAAsE;oBACtE,4DAA4D;oBAC5D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3D,UAAU,IAAI,IAAI,CAAC;oBACvB,CAAC;oBAED,mCAAmC;oBACnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACpB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,wCAAwC,OAAO,CAAC,OAAO,MAAM,aAAa,aAAa,CAAC,CAAC;wBAC9H,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;wBAE/C,wEAAwE;wBACxE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;4BACxB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC3C,CAAC;wBAED,8BAA8B;wBAC9B,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC;4BAC7B,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,EAAE;4BACX,UAAU,EAAE,CAAC,QAAQ,CAAC;yBACzB,CAAC,CAAC;wBACH,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC;4BAC7B,IAAI,EAAE,MAAM;4BACZ,YAAY,EAAE,QAAQ,CAAC,EAAE;4BACzB,OAAO,EAAE,wBAAwB,UAAU,EAAE;yBAChD,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;YACL,CAAC;QAEL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,+BAA+B,OAAO,CAAC,OAAO,YAAY,CAAC,CAAC;gBACjG,OAAO;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CACpB,OAA0B,EAC1B,WAAmB,EACnB,aAAqB,EACrB,SAAiB,EACjB,UAAkB;QAElB,8BAA8B;QAC9B,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhE,oDAAoD;QACpD,IAAI,mBAAmB,GAAG,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,uBAAuB,IAAI,OAAO,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChF,6EAA6E;YAC7E,MAAM,YAAY,GAAG,OAAO,CAAC,uBAAuB;iBAC/C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC;iBACrE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAiB,CAAC;iBACjC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,mCAAmC;iBAC9C,IAAI,CAAC,SAAS,CAAC,CAAC;YAErB,IAAI,YAAY,EAAE,CAAC;gBACf,mBAAmB,GAAG;;;EAGpC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;CAIrF,CAAC;YACU,CAAC;QACL,CAAC;QAED,OAAO;;uBAEQ,OAAO,CAAC,OAAO;yBACb,OAAO,CAAC,GAAG;EAClC,mBAAmB;;;EAGnB,SAAS;;;uBAGY,aAAa;yBACX,SAAS;kBAChB,UAAU;;;;;;;;sBAQN,OAAO,CAAC,OAAO;cACvB,OAAO,CAAC,GAAG;;EAEvB,CAAC;IACC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAe;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,2CAA2C,OAAO,IAAI,CAAC,CAAC;YAE7F,yBAAyB;YACzB,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;YAEzB,4BAA4B;YAC5B,IAAI,CAAC;gBACD,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YACpC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,sBAAsB;YAC1B,CAAC;YAED,WAAW;YACX,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,OAAO;YACH,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC7B,CAAC;IACN,CAAC;IAED;;OAEG;IACH,oBAAoB;QAChB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;CACJ;AAED,mBAAmB;AACnB,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
@@ -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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"}