@vybestack/llxprt-code-core 0.4.2 → 0.4.3-nightly.251018.dbf36526

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 (46) hide show
  1. package/dist/src/core/client.d.ts +1 -0
  2. package/dist/src/core/client.js +16 -3
  3. package/dist/src/core/client.js.map +1 -1
  4. package/dist/src/core/geminiChat.d.ts +2 -0
  5. package/dist/src/core/geminiChat.js +103 -33
  6. package/dist/src/core/geminiChat.js.map +1 -1
  7. package/dist/src/core/prompts.js +26 -4
  8. package/dist/src/core/prompts.js.map +1 -1
  9. package/dist/src/prompt-config/defaults/core.md +2 -0
  10. package/dist/src/providers/BaseProvider.d.ts +2 -2
  11. package/dist/src/providers/BaseProvider.js +9 -0
  12. package/dist/src/providers/BaseProvider.js.map +1 -1
  13. package/dist/src/providers/ProviderManager.js +6 -0
  14. package/dist/src/providers/ProviderManager.js.map +1 -1
  15. package/dist/src/providers/anthropic/AnthropicProvider.js +68 -10
  16. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  17. package/dist/src/providers/gemini/GeminiProvider.d.ts +14 -0
  18. package/dist/src/providers/gemini/GeminiProvider.js +81 -2
  19. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  20. package/dist/src/providers/openai/OpenAIProvider.js +6 -12
  21. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  22. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js +5 -1
  23. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js.map +1 -1
  24. package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +1 -0
  25. package/dist/src/providers/tokenizers/OpenAITokenizer.js +5 -0
  26. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -1
  27. package/dist/src/services/fileDiscoveryService.d.ts +2 -0
  28. package/dist/src/services/fileDiscoveryService.js +58 -20
  29. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  30. package/dist/src/services/history/HistoryService.d.ts +8 -0
  31. package/dist/src/services/history/HistoryService.js +69 -0
  32. package/dist/src/services/history/HistoryService.js.map +1 -1
  33. package/dist/src/tools/glob.js +15 -5
  34. package/dist/src/tools/glob.js.map +1 -1
  35. package/dist/src/tools/read-many-files.js +9 -10
  36. package/dist/src/tools/read-many-files.js.map +1 -1
  37. package/dist/src/tools/shell.d.ts +16 -0
  38. package/dist/src/tools/shell.js +154 -53
  39. package/dist/src/tools/shell.js.map +1 -1
  40. package/dist/src/tools/tool-registry.d.ts +3 -0
  41. package/dist/src/tools/tool-registry.js +87 -84
  42. package/dist/src/tools/tool-registry.js.map +1 -1
  43. package/dist/src/utils/toolOutputLimiter.d.ts +3 -0
  44. package/dist/src/utils/toolOutputLimiter.js +98 -18
  45. package/dist/src/utils/toolOutputLimiter.js.map +1 -1
  46. package/package.json +1 -1
@@ -7,6 +7,7 @@ import fs from 'fs';
7
7
  import path from 'path';
8
8
  import os, { EOL } from 'os';
9
9
  import crypto from 'crypto';
10
+ import { spawnSync } from 'child_process';
10
11
  import { ToolErrorType } from './tool-error.js';
11
12
  import { BaseDeclarativeTool, BaseToolInvocation, ToolConfirmationOutcome, Kind, } from './tools.js';
12
13
  import { getErrorMessage } from '../utils/errors.js';
@@ -58,6 +59,21 @@ class ShellToolInvocation extends BaseToolInvocation {
58
59
  return confirmationDetails;
59
60
  }
60
61
  async execute(signal, updateOutput, terminalColumns, terminalRows) {
62
+ // Validate filtering parameters
63
+ if (this.params.head_lines) {
64
+ validatePositiveInteger(this.params.head_lines, 'head_lines');
65
+ }
66
+ if (this.params.tail_lines) {
67
+ validatePositiveInteger(this.params.tail_lines, 'tail_lines');
68
+ }
69
+ if (this.params.grep_pattern) {
70
+ if (!this.params.grep_pattern.trim()) {
71
+ throw new Error('grep_pattern cannot be empty');
72
+ }
73
+ }
74
+ if (this.params.grep_flags) {
75
+ validateGrepFlags(this.params.grep_flags);
76
+ }
61
77
  const strippedCommand = stripShellWrapper(this.params.command);
62
78
  if (signal.aborted) {
63
79
  return {
@@ -86,7 +102,7 @@ class ShellToolInvocation extends BaseToolInvocation {
86
102
  let outputChunks = [cumulativeOutput];
87
103
  let lastUpdateTime = Date.now();
88
104
  let isBinaryStream = false;
89
- const { result: resultPromise } = await ShellExecutionService.execute(commandToExecute, cwd, (event) => {
105
+ const executionResult = await ShellExecutionService.execute(commandToExecute, cwd, (event) => {
90
106
  if (!updateOutput) {
91
107
  return;
92
108
  }
@@ -126,9 +142,10 @@ class ShellToolInvocation extends BaseToolInvocation {
126
142
  lastUpdateTime = Date.now();
127
143
  }
128
144
  }, signal, this.config.getShouldUseNodePtyShell(), terminalColumns, terminalRows);
129
- const result = await resultPromise;
145
+ const result = await executionResult.result;
130
146
  const backgroundPIDs = [];
131
- if (os.platform() !== 'win32') {
147
+ let pgid = null;
148
+ if (os.platform() !== 'win32' && result) {
132
149
  if (fs.existsSync(tempFilePath)) {
133
150
  const pgrepLines = fs
134
151
  .readFileSync(tempFilePath, 'utf8')
@@ -139,7 +156,7 @@ class ShellToolInvocation extends BaseToolInvocation {
139
156
  console.error(`pgrep: ${line}`);
140
157
  }
141
158
  const pid = Number(line);
142
- if (pid !== result.pid) {
159
+ if (result.pid && pid !== result.pid) {
143
160
  backgroundPIDs.push(pid);
144
161
  }
145
162
  }
@@ -149,63 +166,91 @@ class ShellToolInvocation extends BaseToolInvocation {
149
166
  console.error('missing pgrep output');
150
167
  }
151
168
  }
169
+ // Try to get the actual PGID
170
+ try {
171
+ const psResult = spawnSync('ps', [
172
+ '-o',
173
+ 'pgid=',
174
+ '-p',
175
+ String(result.pid),
176
+ ]);
177
+ if (psResult.status === 0 && psResult.stdout.toString().trim()) {
178
+ pgid = parseInt(psResult.stdout.toString().trim(), 10);
179
+ }
180
+ }
181
+ catch (error) {
182
+ // If we can't get the PGID, that's okay
183
+ console.error('Failed to get PGID:', error);
184
+ }
152
185
  }
186
+ const rawOutput = result?.output ?? '';
187
+ const filterInfo = applyOutputFilters(rawOutput, this.params);
188
+ const filteredOutput = filterInfo.content;
153
189
  let llmContent = '';
154
- if (result.aborted) {
190
+ let returnDisplayMessage = '';
191
+ if (!result) {
192
+ llmContent = 'Command failed to execute.';
193
+ if (this.config.getDebugMode()) {
194
+ returnDisplayMessage = llmContent;
195
+ }
196
+ }
197
+ else if (result.aborted) {
155
198
  llmContent = 'Command was cancelled by user before it could complete.';
156
- if (result.output.trim()) {
157
- llmContent += ` Below is the output before it was cancelled:\n${result.output}`;
199
+ if (rawOutput && rawOutput.trim()) {
200
+ llmContent += ` Below is the output before it was cancelled:\n${rawOutput}`;
158
201
  }
159
202
  else {
160
203
  llmContent += ' There was no output before it was cancelled.';
161
204
  }
205
+ if (this.config.getDebugMode()) {
206
+ returnDisplayMessage = llmContent;
207
+ }
208
+ else if (filteredOutput && filteredOutput.trim()) {
209
+ returnDisplayMessage = filteredOutput;
210
+ }
211
+ else {
212
+ returnDisplayMessage = 'Command cancelled by user.';
213
+ }
162
214
  }
163
215
  else {
164
- // Create a formatted error string for display, replacing the wrapper command
165
- // with the user-facing command.
166
216
  const finalError = result.error
167
217
  ? result.error.message.replace(commandToExecute, this.params.command)
168
218
  : '(none)';
169
219
  llmContent = [
170
220
  `Command: ${this.params.command}`,
171
221
  `Directory: ${this.params.directory || '(root)'}`,
172
- `Output: ${result.output || '(empty)'}`,
173
- `Error: ${finalError}`, // Use the cleaned error string.
222
+ `Stdout: ${filteredOutput || '(empty)'}`,
223
+ `Stderr: ${result.stderr || '(empty)'}`,
224
+ `Error: ${finalError}`,
174
225
  `Exit Code: ${result.exitCode ?? '(none)'}`,
175
226
  `Signal: ${result.signal ?? '(none)'}`,
176
227
  `Background PIDs: ${backgroundPIDs.length ? backgroundPIDs.join(', ') : '(none)'}`,
177
- `Process Group PGID: ${result.pid ?? '(none)'}`,
228
+ `Process Group PGID: ${pgid ?? result.pid ?? '(none)'}`,
178
229
  ].join('\n');
179
- }
180
- let returnDisplayMessage = '';
181
- if (this.config.getDebugMode()) {
182
- returnDisplayMessage = llmContent;
183
- }
184
- else {
185
- if (result.output.trim()) {
186
- returnDisplayMessage = result.output;
230
+ if (this.config.getDebugMode()) {
231
+ returnDisplayMessage = llmContent;
187
232
  }
188
- else {
189
- if (result.aborted) {
190
- returnDisplayMessage = 'Command cancelled by user.';
191
- }
192
- else if (result.signal) {
193
- returnDisplayMessage = `Command terminated by signal: ${result.signal}`;
194
- }
195
- else if (result.error) {
196
- returnDisplayMessage = `Command failed: ${getErrorMessage(result.error)}`;
197
- }
198
- else if (result.exitCode !== null && result.exitCode !== 0) {
199
- returnDisplayMessage = `Command exited with code: ${result.exitCode}`;
200
- }
201
- // If output is empty and command succeeded (code 0, no error/signal/abort),
202
- // returnDisplayMessage will remain empty, which is fine.
233
+ else if (filteredOutput && filteredOutput.trim()) {
234
+ returnDisplayMessage = filteredOutput;
235
+ }
236
+ else if (result.signal) {
237
+ returnDisplayMessage = `Command terminated by signal: ${result.signal}`;
203
238
  }
239
+ else if (result.error) {
240
+ returnDisplayMessage = `Command failed: ${getErrorMessage(result.error)}`;
241
+ }
242
+ else if (result.exitCode !== null && result.exitCode !== 0) {
243
+ returnDisplayMessage = `Command exited with code: ${result.exitCode}`;
244
+ }
245
+ }
246
+ if (filterInfo.description && !this.config.getDebugMode()) {
247
+ returnDisplayMessage = returnDisplayMessage
248
+ ? `[${filterInfo.description}]\n${returnDisplayMessage}`
249
+ : `[${filterInfo.description}]`;
204
250
  }
205
- let processedContent = llmContent;
206
251
  // Check if summarization is configured
207
252
  const summarizeConfig = this.config.getSummarizeToolOutputConfig();
208
- const executionError = result.error
253
+ const executionError = result?.error
209
254
  ? {
210
255
  error: {
211
256
  message: result.error.message,
@@ -213,7 +258,11 @@ class ShellToolInvocation extends BaseToolInvocation {
213
258
  },
214
259
  }
215
260
  : {};
216
- if (summarizeConfig && summarizeConfig[ShellTool.Name]) {
261
+ let llmPayload = llmContent;
262
+ if (summarizeConfig &&
263
+ summarizeConfig[ShellTool.Name] &&
264
+ result &&
265
+ !result.aborted) {
217
266
  // Get the ServerToolsProvider for summarization
218
267
  const contentGenConfig = this.config.getContentGeneratorConfig();
219
268
  if (contentGenConfig?.providerManager) {
@@ -223,14 +272,17 @@ class ShellToolInvocation extends BaseToolInvocation {
223
272
  // TODO: Need to adapt summarizeToolOutput to use ServerToolsProvider
224
273
  // For now, check if it's a Gemini provider and use the existing function
225
274
  if (serverToolsProvider.name === 'gemini') {
226
- processedContent = await summarizeToolOutput(llmContent, this.config.getGeminiClient(), signal, summarizeConfig[ShellTool.Name].tokenBudget);
275
+ const summary = await summarizeToolOutput(llmContent, this.config.getGeminiClient(), signal, summarizeConfig[ShellTool.Name].tokenBudget);
276
+ if (summary) {
277
+ llmPayload = summary;
278
+ }
227
279
  }
228
280
  // If not Gemini, we can't summarize yet - need provider-agnostic summarization
229
281
  }
230
282
  }
231
283
  }
232
284
  // ALWAYS apply token-based limiting at the end to protect the outer model
233
- const limitedResult = limitOutputTokens(processedContent, this.config, 'run_shell_command');
285
+ const limitedResult = limitOutputTokens(llmPayload, this.config, 'run_shell_command');
234
286
  if (limitedResult.wasTruncated) {
235
287
  const formatted = formatLimitedOutput(limitedResult);
236
288
  return {
@@ -252,20 +304,69 @@ class ShellToolInvocation extends BaseToolInvocation {
252
304
  }
253
305
  }
254
306
  }
307
+ function applyOutputFilters(output, params) {
308
+ let content = output;
309
+ const descriptionParts = [];
310
+ // Apply grep filter first
311
+ if (params.grep_pattern) {
312
+ const lines = content.split('\n');
313
+ let filteredLines;
314
+ if (params.grep_flags?.includes('-v')) {
315
+ // Inverted grep
316
+ const options = params.grep_flags.includes('-i') ? 'i' : '';
317
+ const regex = new RegExp(params.grep_pattern, options);
318
+ filteredLines = lines.filter((line) => !regex.test(line));
319
+ }
320
+ else {
321
+ // Normal grep
322
+ const options = params.grep_flags?.includes('-i') ? 'i' : '';
323
+ const regex = new RegExp(params.grep_pattern, options);
324
+ filteredLines = lines.filter((line) => regex.test(line));
325
+ }
326
+ content = filteredLines.join('\n');
327
+ descriptionParts.push(`grep_pattern filter: "${params.grep_pattern}"`);
328
+ if (params.grep_flags?.length) {
329
+ descriptionParts.push(`flags: [${params.grep_flags.join(', ')}]`);
330
+ }
331
+ }
332
+ // Apply head_lines filter
333
+ if (params.head_lines) {
334
+ validatePositiveInteger(params.head_lines, 'head_lines');
335
+ const lines = content.split('\n');
336
+ const headLines = lines.slice(0, params.head_lines);
337
+ const wasTruncated = lines.length > params.head_lines;
338
+ content = headLines.join('\n');
339
+ descriptionParts.push(`head_lines filter: showing first ${params.head_lines} lines${wasTruncated ? ` (of ${lines.length} total)` : ''}`);
340
+ }
341
+ // Apply tail_lines filter
342
+ if (params.tail_lines) {
343
+ validatePositiveInteger(params.tail_lines, 'tail_lines');
344
+ const lines = content.split('\n');
345
+ const tailLines = lines.slice(-params.tail_lines);
346
+ const wasTruncated = lines.length > params.tail_lines;
347
+ content = tailLines.join('\n');
348
+ descriptionParts.push(`tail_lines filter: showing last ${params.tail_lines} lines${wasTruncated ? ` (of ${lines.length} total)` : ''}`);
349
+ }
350
+ return {
351
+ content,
352
+ description: descriptionParts.length > 0 ? descriptionParts.join('; ') : undefined,
353
+ };
354
+ }
355
+ function validatePositiveInteger(value, paramName) {
356
+ if (!Number.isInteger(value) || value <= 0) {
357
+ throw new Error(`${paramName} must be a positive integer, got: ${value}`);
358
+ }
359
+ }
360
+ function validateGrepFlags(flags) {
361
+ const validFlags = ['-i', '-v', '-E', '-F', '-x', '-w'];
362
+ for (const flag of flags) {
363
+ if (!validFlags.includes(flag)) {
364
+ throw new Error(`Invalid grep flag: ${flag}. Valid flags: ${validFlags.join(', ')}`);
365
+ }
366
+ }
367
+ }
255
368
  function getShellToolDescription() {
256
- const returnedInfo = `
257
-
258
- The following information is returned:
259
-
260
- Command: Executed command.
261
- Directory: Directory (relative to project root) where command was executed, or \`(root)\`.
262
- Stdout: Output on stdout stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.
263
- Stderr: Output on stderr stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.
264
- Error: Error or \`(none)\` if no error was reported for the subprocess.
265
- Exit Code: Exit code or \`(none)\` if terminated by signal.
266
- Signal: Signal number or \`(none)\` if no signal was received.
267
- Background PIDs: List of background processes started or \`(none)\`.
268
- Process Group PGID: Process group started or \`(none)\``;
369
+ const returnedInfo = `\n\n The following information is returned:\n\n Command: Executed command.\n Directory: Directory (relative to project root) where command was executed, or \`(root)\`.\n Stdout: Output on stdout stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.\n Stderr: Output on stderr stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.\n Error: Error or \`(none)\` if no error was reported for the subprocess.\n Exit Code: Exit code or \`(none)\` if terminated by signal.\n Signal: Signal number or \`(none)\` if no signal was received.\n Background PIDs: List of background processes started or \`(none)\`.\n Process Group PGID: Process group started or \`(none)\``;
269
370
  if (os.platform() === 'win32') {
270
371
  return `This tool executes a given shell command as \`cmd.exe /c <command>\`. Command can start background processes using \`start /b\`.${returnedInfo}`;
271
372
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ export declare class ToolRegistry {
28
28
  private config;
29
29
  private mcpClientManager;
30
30
  private logger;
31
+ private discoveryLock;
31
32
  constructor(config: Config, eventEmitter?: EventEmitter);
32
33
  /**
33
34
  * Registers a tool definition.
@@ -105,5 +106,7 @@ export declare class ToolRegistry {
105
106
  * @param context Optional context to inject into the tool instance
106
107
  */
107
108
  getTool(name: string, context?: ToolContext): AnyDeclarativeTool | undefined;
109
+ private registerToolIntoMap;
110
+ private withDiscoveryLock;
108
111
  }
109
112
  export {};
@@ -127,6 +127,7 @@ export class ToolRegistry {
127
127
  config;
128
128
  mcpClientManager;
129
129
  logger = new DebugLogger('llxprt:tool-registry');
130
+ discoveryLock = null;
130
131
  constructor(config, eventEmitter) {
131
132
  this.config = config;
132
133
  this.mcpClientManager = new McpClientManager(this.config.getMcpServers() ?? {}, this.config.getMcpServerCommand(), this, this.config.getPromptRegistry(), this.config.getDebugMode(), this.config.getWorkspaceContext(), eventEmitter);
@@ -136,16 +137,7 @@ export class ToolRegistry {
136
137
  * @param tool - The tool object containing schema and execution logic.
137
138
  */
138
139
  registerTool(tool) {
139
- if (this.tools.has(tool.name)) {
140
- if (tool instanceof DiscoveredMCPTool) {
141
- tool = tool.asFullyQualifiedTool();
142
- }
143
- else {
144
- // Decide on behavior: throw error, log warning, or allow overwrite
145
- this.logger.warn(() => `Tool with name "${tool.name}" is already registered. Overwriting.`);
146
- }
147
- }
148
- this.tools.set(tool.name, tool);
140
+ this.registerToolIntoMap(tool, this.tools);
149
141
  }
150
142
  /**
151
143
  * Builds a new tool map with only non-discovered tools (core tools).
@@ -178,35 +170,20 @@ export class ToolRegistry {
178
170
  * Uses truly atomic updates to prevent race conditions.
179
171
  */
180
172
  async discoverAllTools() {
181
- // Build new tool map starting with core tools (non-discovered)
182
- const newTools = this.buildCoreToolsMap();
183
- await this.config.getPromptRegistry().clear();
184
- // Create a temporary registry that adds to newTools, not this.tools
185
- const tempRegistry = {
186
- registerTool: (tool) => {
187
- newTools.set(tool.name, tool);
188
- },
189
- };
190
- // Discover command tools into newTools
191
- // For now, we'll use the existing method but need to modify it to accept a registry
192
- const discoveryCmd = this.config.getToolDiscoveryCommand();
193
- if (discoveryCmd) {
194
- const oldRegisterTool = this.registerTool.bind(this);
195
- this.registerTool = tempRegistry.registerTool;
173
+ await this.withDiscoveryLock(async () => {
174
+ const newTools = this.buildCoreToolsMap();
175
+ await this.config.getPromptRegistry().clear();
176
+ await this.discoverAndRegisterToolsFromCommand(newTools);
177
+ const previousTools = this.tools;
196
178
  try {
197
- await this.discoverAndRegisterToolsFromCommand();
179
+ this.tools = newTools;
180
+ await this.mcpClientManager.discoverAllMcpTools(this.config);
198
181
  }
199
- finally {
200
- this.registerTool = oldRegisterTool;
182
+ catch (error) {
183
+ this.tools = previousTools;
184
+ throw error;
201
185
  }
202
- }
203
- // Temporarily swap tools to newTools so MCP tools get registered to the right map
204
- this.tools = newTools;
205
- // Discover MCP tools into newTools
206
- await this.mcpClientManager.discoverAllMcpTools(this.config);
207
- // The tools are now already in the right place (this.tools === newTools)
208
- // No need to swap again
209
- // At this point, the update is truly atomic from the perspective of getFunctionDeclarations()
186
+ });
210
187
  }
211
188
  /**
212
189
  * Discovers tools from project (if available and configured).
@@ -215,37 +192,31 @@ export class ToolRegistry {
215
192
  * Uses truly atomic updates to prevent race conditions.
216
193
  */
217
194
  async discoverMcpTools() {
218
- // Build new tool map starting with core tools (non-discovered)
219
- const newTools = this.buildCoreToolsMap();
220
- // Re-add command-discovered tools if they exist
221
- for (const [name, tool] of this.tools.entries()) {
222
- if (tool instanceof DiscoveredTool &&
223
- !(tool instanceof DiscoveredMCPTool)) {
224
- newTools.set(name, tool);
195
+ await this.withDiscoveryLock(async () => {
196
+ const newTools = this.buildCoreToolsMap();
197
+ for (const tool of this.tools.values()) {
198
+ if (tool instanceof DiscoveredTool &&
199
+ !(tool instanceof DiscoveredMCPTool)) {
200
+ this.registerToolIntoMap(tool, newTools);
201
+ }
225
202
  }
226
- }
227
- await this.config.getPromptRegistry().clear();
228
- // Create a temporary registry that adds to newTools
229
- const tempRegistry = {
230
- registerTool: (tool) => {
231
- newTools.set(tool.name, tool);
232
- },
233
- };
234
- // Discover MCP tools into newTools
235
- const oldRegisterTool = this.registerTool.bind(this);
236
- this.registerTool = tempRegistry.registerTool;
237
- await this.mcpClientManager.discoverAllMcpTools(this.config);
238
- this.registerTool = oldRegisterTool;
239
- // Only NOW do we atomically swap the reference
240
- // This ensures getFunctionDeclarations() never sees a partial tool map
241
- this.tools = newTools;
242
- // At this point, the update is truly atomic from the perspective of getFunctionDeclarations()
203
+ await this.config.getPromptRegistry().clear();
204
+ const previousTools = this.tools;
205
+ try {
206
+ this.tools = newTools;
207
+ await this.mcpClientManager.discoverAllMcpTools(this.config);
208
+ }
209
+ catch (error) {
210
+ this.tools = previousTools;
211
+ throw error;
212
+ }
213
+ });
243
214
  }
244
215
  /**
245
216
  * Restarts all MCP servers and re-discovers tools.
246
217
  */
247
218
  async restartMcpServers() {
248
- await this.mcpClientManager.discoverAllMcpTools(this.config);
219
+ await this.discoverMcpTools();
249
220
  }
250
221
  /**
251
222
  * Discover or re-discover tools for a single MCP server.
@@ -253,30 +224,34 @@ export class ToolRegistry {
253
224
  * @param serverName - The name of the server to discover tools from.
254
225
  */
255
226
  async discoverToolsForServer(serverName) {
256
- // Build new tool map with all tools except those from the target server
257
- const newTools = new Map();
258
- for (const [name, tool] of this.tools.entries()) {
259
- if (!(tool instanceof DiscoveredMCPTool && tool.serverName === serverName)) {
260
- newTools.set(name, tool);
227
+ await this.withDiscoveryLock(async () => {
228
+ const newTools = new Map();
229
+ for (const tool of this.tools.values()) {
230
+ if (!(tool instanceof DiscoveredMCPTool && tool.serverName === serverName)) {
231
+ this.registerToolIntoMap(tool, newTools);
232
+ }
261
233
  }
262
- }
263
- await this.config.getPromptRegistry().removePromptsByServer(serverName);
264
- const mcpServers = this.config.getMcpServers() ?? {};
265
- const serverConfig = mcpServers[serverName];
266
- if (serverConfig) {
267
- // Create a temporary registry that adds to newTools
268
- const tempRegistry = Object.create(this);
269
- tempRegistry.registerTool = (tool) => {
270
- newTools.set(tool.name, tool);
271
- };
272
- await connectAndDiscover(serverName, serverConfig, tempRegistry, this.config.getPromptRegistry(), this.config.getDebugMode(), this.config.getWorkspaceContext(), this.config);
273
- }
274
- // Only NOW do we atomically swap the reference
275
- // This ensures getFunctionDeclarations() never sees a partial tool map
276
- this.tools = newTools;
277
- // At this point, the update is truly atomic from the perspective of getFunctionDeclarations()
234
+ await this.config.getPromptRegistry().removePromptsByServer(serverName);
235
+ const mcpServers = this.config.getMcpServers() ?? {};
236
+ const serverConfig = mcpServers[serverName];
237
+ const previousTools = this.tools;
238
+ try {
239
+ this.tools = newTools;
240
+ if (serverConfig) {
241
+ const tempRegistry = Object.create(this);
242
+ tempRegistry.registerTool = (tool) => {
243
+ this.registerToolIntoMap(tool, newTools);
244
+ };
245
+ await connectAndDiscover(serverName, serverConfig, tempRegistry, this.config.getPromptRegistry(), this.config.getDebugMode(), this.config.getWorkspaceContext(), this.config);
246
+ }
247
+ }
248
+ catch (error) {
249
+ this.tools = previousTools;
250
+ throw error;
251
+ }
252
+ });
278
253
  }
279
- async discoverAndRegisterToolsFromCommand() {
254
+ async discoverAndRegisterToolsFromCommand(targetMap) {
280
255
  const discoveryCmd = this.config.getToolDiscoveryCommand();
281
256
  if (!discoveryCmd) {
282
257
  return;
@@ -364,7 +339,7 @@ export class ToolRegistry {
364
339
  !Array.isArray(func.parametersJsonSchema)
365
340
  ? func.parametersJsonSchema
366
341
  : {};
367
- this.registerTool(new DiscoveredTool(this.config, func.name, func.description ?? '', parameters));
342
+ this.registerToolIntoMap(new DiscoveredTool(this.config, func.name, func.description ?? '', parameters), targetMap);
368
343
  }
369
344
  }
370
345
  catch (e) {
@@ -469,5 +444,33 @@ export class ToolRegistry {
469
444
  }
470
445
  return tool;
471
446
  }
447
+ registerToolIntoMap(tool, targetMap) {
448
+ let toolToRegister = tool;
449
+ if (targetMap.has(toolToRegister.name)) {
450
+ if (toolToRegister instanceof DiscoveredMCPTool) {
451
+ toolToRegister = toolToRegister.asFullyQualifiedTool();
452
+ }
453
+ else {
454
+ this.logger.warn(() => `Tool with name "${toolToRegister.name}" is already registered. Overwriting.`);
455
+ }
456
+ }
457
+ targetMap.set(toolToRegister.name, toolToRegister);
458
+ }
459
+ async withDiscoveryLock(task) {
460
+ while (this.discoveryLock) {
461
+ await this.discoveryLock;
462
+ }
463
+ let release = () => { };
464
+ this.discoveryLock = new Promise((resolve) => {
465
+ release = () => resolve();
466
+ });
467
+ try {
468
+ return await task();
469
+ }
470
+ finally {
471
+ release();
472
+ this.discoveryLock = null;
473
+ }
474
+ }
472
475
  }
473
476
  //# sourceMappingURL=tool-registry.js.map