@oflow-ai/core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,50 +39,55 @@ const fs = __importStar(require("fs/promises"));
39
39
  const path = __importStar(require("path"));
40
40
  class ReplaceTool extends base_1.BaseTool {
41
41
  name = 'replace';
42
- description = 'Replaces text within a file. Requires exact matching of the old_string.';
42
+ description = 'Replaces text within a file. Replaces a single occurrence. This tool requires providing significant context around the change to ensure precise targeting. Always use the read_file tool to examine the file current content before attempting a text replacement.';
43
43
  parameters = {
44
44
  type: 'object',
45
45
  properties: {
46
46
  file_path: {
47
47
  type: 'string',
48
- description: 'The absolute path to the file to modify'
48
+ description: 'The absolute path to the file to modify. Must start with /'
49
49
  },
50
50
  old_string: {
51
51
  type: 'string',
52
- description: 'The exact literal text to replace'
52
+ description: 'The exact literal text to replace. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely.'
53
53
  },
54
54
  new_string: {
55
55
  type: 'string',
56
- description: 'The exact literal text to replace with'
56
+ description: 'The exact literal text to replace old_string with. Also including all whitespace, indentation, newlines, and surrounding code etc.'
57
57
  },
58
58
  instruction: {
59
59
  type: 'string',
60
- description: 'Detailed instruction of what needs to be changed'
60
+ description: 'A clear, semantic instruction for the code change, acting as a high-quality prompt for an expert LLM assistant.'
61
61
  }
62
62
  },
63
- required: ['file_path', 'old_string', 'new_string']
63
+ required: ['file_path', 'old_string', 'new_string'],
64
+ additionalProperties: false
64
65
  };
65
66
  async execute(params, options) {
66
67
  this.validateRequired(params, ['file_path', 'old_string', 'new_string']);
68
+ const filePath = params.file_path;
67
69
  const workingDir = options?.workingDirectory || process.cwd();
68
- const filePath = path.isAbsolute(params.file_path)
69
- ? params.file_path
70
- : path.join(workingDir, params.file_path);
70
+ const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(workingDir, filePath);
71
+ if (!path.isAbsolute(filePath)) {
72
+ return `Error: file_path must be an absolute path. Received: ${filePath}`;
73
+ }
74
+ if (params.old_string === params.new_string) {
75
+ return `Error: old_string and new_string are identical. No changes made.`;
76
+ }
71
77
  try {
72
- const content = await fs.readFile(filePath, 'utf-8');
73
- // Check if old_string exists
74
- if (!content.includes(params.old_string)) {
75
- return `Error: The old_string was not found in ${filePath}. Please read the file first to ensure exact matching.`;
76
- }
77
- // Check for multiple occurrences
78
+ const content = await fs.readFile(resolvedPath, 'utf-8');
79
+ // Count occurrences
78
80
  const occurrences = content.split(params.old_string).length - 1;
81
+ if (occurrences === 0) {
82
+ return `Error: old_string not found in file ${resolvedPath}. Please read the file first to see its current content.`;
83
+ }
79
84
  if (occurrences > 1) {
80
- return `Error: Found ${occurrences} occurrences of old_string. The old_string must uniquely identify a single instance. Please include more context to make it unique.`;
85
+ return `Error: Found ${occurrences} occurrences of old_string. The string must uniquely identify a single location. Please include more context lines to make it unique.`;
81
86
  }
82
87
  // Perform replacement
83
88
  const newContent = content.replace(params.old_string, params.new_string);
84
- await fs.writeFile(filePath, newContent, 'utf-8');
85
- return `Successfully replaced text in ${filePath}`;
89
+ await fs.writeFile(resolvedPath, newContent, 'utf-8');
90
+ return `Successfully replaced text in ${resolvedPath}`;
86
91
  }
87
92
  catch (error) {
88
93
  return (0, base_1.formatToolError)(error);
@@ -90,4 +95,4 @@ class ReplaceTool extends base_1.BaseTool {
90
95
  }
91
96
  }
92
97
  exports.ReplaceTool = ReplaceTool;
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9yZXBsYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUF1RTtBQUN2RSxnREFBa0M7QUFDbEMsMkNBQTZCO0FBUzdCLE1BQWEsV0FBWSxTQUFRLGVBQXVCO0lBQ3RELElBQUksR0FBRyxTQUFTLENBQUM7SUFDakIsV0FBVyxHQUFHLHlFQUF5RSxDQUFDO0lBQ3hGLFVBQVUsR0FBRztRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5Q0FBeUM7YUFDdkQ7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLG1DQUFtQzthQUNqRDtZQUNELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsd0NBQXdDO2FBQ3REO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxrREFBa0Q7YUFDaEU7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDO0tBQ3BELENBQUM7SUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXFCLEVBQUUsT0FBNEI7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV6RSxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNoRCxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXJELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBTywwQ0FBMEMsUUFBUSx3REFBd0QsQ0FBQztZQUNwSCxDQUFDO1lBRUQsaUNBQWlDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sZ0JBQWdCLFdBQVcscUlBQXFJLENBQUM7WUFDMUssQ0FBQztZQUVELHNCQUFzQjtZQUN0QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRWxELE9BQU8saUNBQWlDLFFBQVEsRUFBRSxDQUFDO1FBQ3JELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFBLHNCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXpERCxrQ0F5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVG9vbCwgVG9vbEV4ZWN1dGVPcHRpb25zLCBmb3JtYXRUb29sRXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW50ZXJmYWNlIFJlcGxhY2VQYXJhbXMge1xuICBmaWxlX3BhdGg6IHN0cmluZztcbiAgb2xkX3N0cmluZzogc3RyaW5nO1xuICBuZXdfc3RyaW5nOiBzdHJpbmc7XG4gIGluc3RydWN0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmVwbGFjZVRvb2wgZXh0ZW5kcyBCYXNlVG9vbDxSZXBsYWNlUGFyYW1zPiB7XG4gIG5hbWUgPSAncmVwbGFjZSc7XG4gIGRlc2NyaXB0aW9uID0gJ1JlcGxhY2VzIHRleHQgd2l0aGluIGEgZmlsZS4gUmVxdWlyZXMgZXhhY3QgbWF0Y2hpbmcgb2YgdGhlIG9sZF9zdHJpbmcuJztcbiAgcGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBmaWxlX3BhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgdG8gbW9kaWZ5J1xuICAgICAgfSxcbiAgICAgIG9sZF9zdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGV4YWN0IGxpdGVyYWwgdGV4dCB0byByZXBsYWNlJ1xuICAgICAgfSxcbiAgICAgIG5ld19zdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGV4YWN0IGxpdGVyYWwgdGV4dCB0byByZXBsYWNlIHdpdGgnXG4gICAgICB9LFxuICAgICAgaW5zdHJ1Y3Rpb246IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRGV0YWlsZWQgaW5zdHJ1Y3Rpb24gb2Ygd2hhdCBuZWVkcyB0byBiZSBjaGFuZ2VkJ1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnZmlsZV9wYXRoJywgJ29sZF9zdHJpbmcnLCAnbmV3X3N0cmluZyddXG4gIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFJlcGxhY2VQYXJhbXMsIG9wdGlvbnM/OiBUb29sRXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZChwYXJhbXMsIFsnZmlsZV9wYXRoJywgJ29sZF9zdHJpbmcnLCAnbmV3X3N0cmluZyddKTtcblxuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBvcHRpb25zPy53b3JraW5nRGlyZWN0b3J5IHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocGFyYW1zLmZpbGVfcGF0aCkgXG4gICAgICA/IHBhcmFtcy5maWxlX3BhdGggXG4gICAgICA6IHBhdGguam9pbih3b3JraW5nRGlyLCBwYXJhbXMuZmlsZV9wYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAvLyBDaGVjayBpZiBvbGRfc3RyaW5nIGV4aXN0c1xuICAgICAgaWYgKCFjb250ZW50LmluY2x1ZGVzKHBhcmFtcy5vbGRfc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gYEVycm9yOiBUaGUgb2xkX3N0cmluZyB3YXMgbm90IGZvdW5kIGluICR7ZmlsZVBhdGh9LiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBmaXJzdCB0byBlbnN1cmUgZXhhY3QgbWF0Y2hpbmcuYDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIG11bHRpcGxlIG9jY3VycmVuY2VzXG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQocGFyYW1zLm9sZF9zdHJpbmcpLmxlbmd0aCAtIDE7XG4gICAgICBpZiAob2NjdXJyZW5jZXMgPiAxKSB7XG4gICAgICAgIHJldHVybiBgRXJyb3I6IEZvdW5kICR7b2NjdXJyZW5jZXN9IG9jY3VycmVuY2VzIG9mIG9sZF9zdHJpbmcuIFRoZSBvbGRfc3RyaW5nIG11c3QgdW5pcXVlbHkgaWRlbnRpZnkgYSBzaW5nbGUgaW5zdGFuY2UuIFBsZWFzZSBpbmNsdWRlIG1vcmUgY29udGV4dCB0byBtYWtlIGl0IHVuaXF1ZS5gO1xuICAgICAgfVxuXG4gICAgICAvLyBQZXJmb3JtIHJlcGxhY2VtZW50XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKHBhcmFtcy5vbGRfc3RyaW5nLCBwYXJhbXMubmV3X3N0cmluZyk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsICd1dGYtOCcpO1xuXG4gICAgICByZXR1cm4gYFN1Y2Nlc3NmdWxseSByZXBsYWNlZCB0ZXh0IGluICR7ZmlsZVBhdGh9YDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZvcm1hdFRvb2xFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iXX0=
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9yZXBsYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUF1RTtBQUN2RSxnREFBa0M7QUFDbEMsMkNBQTZCO0FBUzdCLE1BQWEsV0FBWSxTQUFRLGVBQXVCO0lBQ3RELElBQUksR0FBRyxTQUFTLENBQUM7SUFDakIsV0FBVyxHQUFHLG9RQUFvUSxDQUFDO0lBQ25SLFVBQVUsR0FBRztRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw0REFBNEQ7YUFDMUU7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHlKQUF5SjthQUN2SztZQUNELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsb0lBQW9JO2FBQ2xKO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpSEFBaUg7YUFDL0g7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDO1FBQ25ELG9CQUFvQixFQUFFLEtBQUs7S0FDNUIsQ0FBQztJQUVGLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUIsRUFBRSxPQUE0QjtRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTVGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyx3REFBd0QsUUFBUSxFQUFFLENBQUM7UUFDNUUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUMsT0FBTyxrRUFBa0UsQ0FBQztRQUM1RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV6RCxvQkFBb0I7WUFDcEIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUVoRSxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyx1Q0FBdUMsWUFBWSwwREFBMEQsQ0FBQztZQUN2SCxDQUFDO1lBRUQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sZ0JBQWdCLFdBQVcsdUlBQXVJLENBQUM7WUFDNUssQ0FBQztZQUVELHNCQUFzQjtZQUN0QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXRELE9BQU8saUNBQWlDLFlBQVksRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFBLHNCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpFRCxrQ0FpRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVG9vbCwgVG9vbEV4ZWN1dGVPcHRpb25zLCBmb3JtYXRUb29sRXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW50ZXJmYWNlIFJlcGxhY2VQYXJhbXMge1xuICBmaWxlX3BhdGg6IHN0cmluZztcbiAgb2xkX3N0cmluZzogc3RyaW5nO1xuICBuZXdfc3RyaW5nOiBzdHJpbmc7XG4gIGluc3RydWN0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmVwbGFjZVRvb2wgZXh0ZW5kcyBCYXNlVG9vbDxSZXBsYWNlUGFyYW1zPiB7XG4gIG5hbWUgPSAncmVwbGFjZSc7XG4gIGRlc2NyaXB0aW9uID0gJ1JlcGxhY2VzIHRleHQgd2l0aGluIGEgZmlsZS4gUmVwbGFjZXMgYSBzaW5nbGUgb2NjdXJyZW5jZS4gVGhpcyB0b29sIHJlcXVpcmVzIHByb3ZpZGluZyBzaWduaWZpY2FudCBjb250ZXh0IGFyb3VuZCB0aGUgY2hhbmdlIHRvIGVuc3VyZSBwcmVjaXNlIHRhcmdldGluZy4gQWx3YXlzIHVzZSB0aGUgcmVhZF9maWxlIHRvb2wgdG8gZXhhbWluZSB0aGUgZmlsZSBjdXJyZW50IGNvbnRlbnQgYmVmb3JlIGF0dGVtcHRpbmcgYSB0ZXh0IHJlcGxhY2VtZW50Lic7XG4gIHBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgZmlsZV9wYXRoOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIG1vZGlmeS4gTXVzdCBzdGFydCB3aXRoIC8nXG4gICAgICB9LFxuICAgICAgb2xkX3N0cmluZzoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgZXhhY3QgbGl0ZXJhbCB0ZXh0IHRvIHJlcGxhY2UuIEluY2x1ZGUgYXQgbGVhc3QgMyBsaW5lcyBvZiBjb250ZXh0IEJFRk9SRSBhbmQgQUZURVIgdGhlIHRhcmdldCB0ZXh0LCBtYXRjaGluZyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBwcmVjaXNlbHkuJ1xuICAgICAgfSxcbiAgICAgIG5ld19zdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGV4YWN0IGxpdGVyYWwgdGV4dCB0byByZXBsYWNlIG9sZF9zdHJpbmcgd2l0aC4gQWxzbyBpbmNsdWRpbmcgYWxsIHdoaXRlc3BhY2UsIGluZGVudGF0aW9uLCBuZXdsaW5lcywgYW5kIHN1cnJvdW5kaW5nIGNvZGUgZXRjLidcbiAgICAgIH0sXG4gICAgICBpbnN0cnVjdGlvbjoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdBIGNsZWFyLCBzZW1hbnRpYyBpbnN0cnVjdGlvbiBmb3IgdGhlIGNvZGUgY2hhbmdlLCBhY3RpbmcgYXMgYSBoaWdoLXF1YWxpdHkgcHJvbXB0IGZvciBhbiBleHBlcnQgTExNIGFzc2lzdGFudC4nXG4gICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogWydmaWxlX3BhdGgnLCAnb2xkX3N0cmluZycsICduZXdfc3RyaW5nJ10sXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFJlcGxhY2VQYXJhbXMsIG9wdGlvbnM/OiBUb29sRXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZChwYXJhbXMsIFsnZmlsZV9wYXRoJywgJ29sZF9zdHJpbmcnLCAnbmV3X3N0cmluZyddKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGFyYW1zLmZpbGVfcGF0aDtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gb3B0aW9ucz8ud29ya2luZ0RpcmVjdG9yeSB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aCkgPyBmaWxlUGF0aCA6IHBhdGguam9pbih3b3JraW5nRGlyLCBmaWxlUGF0aCk7XG5cbiAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBgRXJyb3I6IGZpbGVfcGF0aCBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGguIFJlY2VpdmVkOiAke2ZpbGVQYXRofWA7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5vbGRfc3RyaW5nID09PSBwYXJhbXMubmV3X3N0cmluZykge1xuICAgICAgcmV0dXJuIGBFcnJvcjogb2xkX3N0cmluZyBhbmQgbmV3X3N0cmluZyBhcmUgaWRlbnRpY2FsLiBObyBjaGFuZ2VzIG1hZGUuYDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHJlc29sdmVkUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIC8vIENvdW50IG9jY3VycmVuY2VzXG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQocGFyYW1zLm9sZF9zdHJpbmcpLmxlbmd0aCAtIDE7XG5cbiAgICAgIGlmIChvY2N1cnJlbmNlcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYEVycm9yOiBvbGRfc3RyaW5nIG5vdCBmb3VuZCBpbiBmaWxlICR7cmVzb2x2ZWRQYXRofS4gUGxlYXNlIHJlYWQgdGhlIGZpbGUgZmlyc3QgdG8gc2VlIGl0cyBjdXJyZW50IGNvbnRlbnQuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9jY3VycmVuY2VzID4gMSkge1xuICAgICAgICByZXR1cm4gYEVycm9yOiBGb3VuZCAke29jY3VycmVuY2VzfSBvY2N1cnJlbmNlcyBvZiBvbGRfc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QgdW5pcXVlbHkgaWRlbnRpZnkgYSBzaW5nbGUgbG9jYXRpb24uIFBsZWFzZSBpbmNsdWRlIG1vcmUgY29udGV4dCBsaW5lcyB0byBtYWtlIGl0IHVuaXF1ZS5gO1xuICAgICAgfVxuXG4gICAgICAvLyBQZXJmb3JtIHJlcGxhY2VtZW50XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKHBhcmFtcy5vbGRfc3RyaW5nLCBwYXJhbXMubmV3X3N0cmluZyk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocmVzb2x2ZWRQYXRoLCBuZXdDb250ZW50LCAndXRmLTgnKTtcblxuICAgICAgcmV0dXJuIGBTdWNjZXNzZnVsbHkgcmVwbGFjZWQgdGV4dCBpbiAke3Jlc29sdmVkUGF0aH1gO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VG9vbEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -3,7 +3,6 @@ interface RunShellCommandParams {
3
3
  command: string;
4
4
  description?: string;
5
5
  timeout?: number;
6
- run_in_bg?: boolean;
7
6
  }
8
7
  export declare class RunShellCommandTool extends BaseTool<RunShellCommandParams> {
9
8
  name: string;
@@ -23,13 +22,11 @@ export declare class RunShellCommandTool extends BaseTool<RunShellCommandParams>
23
22
  type: string;
24
23
  description: string;
25
24
  };
26
- run_in_bg: {
27
- type: string;
28
- description: string;
29
- };
30
25
  };
31
26
  required: string[];
27
+ additionalProperties: boolean;
32
28
  };
33
29
  execute(params: RunShellCommandParams, options?: ToolExecuteOptions): Promise<string>;
30
+ private runCommand;
34
31
  }
35
32
  export {};
@@ -5,77 +5,101 @@ const base_1 = require("./base");
5
5
  const child_process_1 = require("child_process");
6
6
  class RunShellCommandTool extends base_1.BaseTool {
7
7
  name = 'run_shell_command';
8
- description = 'Executes a shell command in the terminal. Supports both foreground and background execution.';
8
+ description = `This tool executes a given shell command as \`powershell.exe -NoProfile -Command <command>\` on Windows, or \`bash -c <command>\` on Unix. Command can start background processes using PowerShell constructs such as \`Start-Process -NoNewWindow\` or \`Start-Job\`.
9
+
10
+ Usage notes:
11
+ - The command argument is required.
12
+ - It is very helpful if you write a clear, concise description of what this command does in 5-10 words.
13
+ - You can use the \`run_in_bg\` parameter to run the command in the background, which allows you to continue working while the command runs. You can monitor the output using the BashOutput tool as it becomes available.
14
+ - The following information is returned:
15
+ Command: Executed command.
16
+ Directory: Directory where command was executed, or \`(root)\`.
17
+ Stdout: Output on stdout stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.
18
+ Stderr: Output on stderr stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.
19
+ Error: Error or \`(none)\` if no error was reported for the subprocess.
20
+ Exit Code: Exit code or \`(none)\` if terminated by signal.
21
+ Signal: Signal number or \`(none)\` if no signal was received.
22
+ Background PIDs: List of background processes started or \`(none)\`.
23
+ Process Group PGID: Process group started or \`(none)\`.`;
9
24
  parameters = {
10
25
  type: 'object',
11
26
  properties: {
12
27
  command: {
13
28
  type: 'string',
14
- description: 'The shell command to execute'
29
+ description: 'Exact command to execute as powershell.exe -NoProfile -Command <command> on Windows or bash -c <command> on Unix'
15
30
  },
16
31
  description: {
17
32
  type: 'string',
18
- description: 'Brief description of what the command does'
33
+ description: 'Brief description of the command for the user. Be specific and concise. Ideally a single sentence. Can be up to 3 sentences for clarity. No line breaks.'
19
34
  },
20
35
  timeout: {
21
36
  type: 'number',
22
- description: 'Timeout in seconds (default: 120)'
23
- },
24
- run_in_bg: {
25
- type: 'boolean',
26
- description: 'If true, run command in background'
37
+ description: 'Optional: Timeout in seconds for the command execution. If not provided, uses the default timeout of 120s.'
27
38
  }
28
39
  },
29
- required: ['command']
40
+ required: ['command'],
41
+ additionalProperties: false
30
42
  };
31
43
  async execute(params, options) {
32
44
  this.validateRequired(params, ['command']);
33
- const timeout = (params.timeout || 120) * 1000;
34
45
  const workingDir = options?.workingDirectory || process.cwd();
46
+ const timeout = params.timeout || options?.timeout || 120000; // Default 120 seconds
47
+ try {
48
+ const result = await this.runCommand(params.command, workingDir, timeout);
49
+ return result;
50
+ }
51
+ catch (error) {
52
+ return (0, base_1.formatToolError)(error);
53
+ }
54
+ }
55
+ async runCommand(command, cwd, timeout) {
35
56
  return new Promise((resolve) => {
36
57
  const isWindows = process.platform === 'win32';
37
- const shell = isWindows ? 'powershell.exe' : '/bin/bash';
38
- const shellArgs = isWindows
39
- ? ['-NoProfile', '-Command', params.command]
40
- : ['-c', params.command];
41
- const proc = (0, child_process_1.spawn)(shell, shellArgs, {
42
- cwd: workingDir,
43
- env: process.env,
44
- timeout: timeout
58
+ const shell = isWindows ? 'powershell.exe' : 'bash';
59
+ const args = isWindows ? ['-NoProfile', '-Command', command] : ['-c', command];
60
+ const proc = (0, child_process_1.spawn)(shell, args, {
61
+ cwd,
62
+ shell: false,
63
+ windowsHide: true
45
64
  });
46
65
  let stdout = '';
47
66
  let stderr = '';
48
- let timeoutId = null;
67
+ let timedOut = false;
68
+ const timeoutId = setTimeout(() => {
69
+ timedOut = true;
70
+ proc.kill();
71
+ }, timeout);
49
72
  proc.stdout.on('data', (data) => {
50
73
  stdout += data.toString();
51
74
  });
52
75
  proc.stderr.on('data', (data) => {
53
76
  stderr += data.toString();
54
77
  });
55
- proc.on('error', (error) => {
56
- resolve((0, base_1.formatToolError)(error));
57
- });
58
- proc.on('close', (code, signal) => {
59
- if (timeoutId)
60
- clearTimeout(timeoutId);
61
- let output = `Command: ${params.command}\n`;
62
- output += `Directory: ${workingDir}\n`;
63
- output += `Exit Code: ${code}\n\n`;
78
+ proc.on('close', (code) => {
79
+ clearTimeout(timeoutId);
80
+ let result = `Command: ${command}\n`;
81
+ result += `Directory: ${cwd}\n`;
82
+ result += `Exit Code: ${code ?? '(none)'}\n`;
64
83
  if (stdout) {
65
- output += `Stdout:\n${stdout}\n`;
84
+ result += `\nStdout:\n${stdout}`;
85
+ }
86
+ else {
87
+ result += `\nStdout: (empty)`;
66
88
  }
67
89
  if (stderr) {
68
- output += `Stderr:\n${stderr}\n`;
90
+ result += `\n\nStderr:\n${stderr}`;
91
+ }
92
+ if (timedOut) {
93
+ result += `\n\n⚠️ Command timed out after ${timeout / 1000} seconds`;
69
94
  }
70
- resolve(output);
95
+ resolve(result);
96
+ });
97
+ proc.on('error', (err) => {
98
+ clearTimeout(timeoutId);
99
+ resolve(`Error executing command: ${err.message}`);
71
100
  });
72
- // Handle timeout
73
- timeoutId = setTimeout(() => {
74
- proc.kill();
75
- resolve(`Command timed out after ${timeout / 1000} seconds`);
76
- }, timeout);
77
101
  });
78
102
  }
79
103
  }
80
104
  exports.RunShellCommandTool = RunShellCommandTool;
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLXNoZWxsLWNvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvcnVuLXNoZWxsLWNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQXVFO0FBQ3ZFLGlEQUFzQztBQVN0QyxNQUFhLG1CQUFvQixTQUFRLGVBQStCO0lBQ3RFLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUMzQixXQUFXLEdBQUcsOEZBQThGLENBQUM7SUFDN0csVUFBVSxHQUFHO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDhCQUE4QjthQUM1QztZQUNELFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsNENBQTRDO2FBQzFEO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxtQ0FBbUM7YUFDakQ7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsV0FBVyxFQUFFLG9DQUFvQzthQUNsRDtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO0tBQ3RCLENBQUM7SUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQTZCLEVBQUUsT0FBNEI7UUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFM0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTlELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQztZQUMvQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDekQsTUFBTSxTQUFTLEdBQUcsU0FBUztnQkFDekIsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUM1QyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTNCLE1BQU0sSUFBSSxHQUFHLElBQUEscUJBQUssRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUNuQyxHQUFHLEVBQUUsVUFBVTtnQkFDZixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxPQUFPO2FBQ2pCLENBQUMsQ0FBQztZQUVILElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxTQUFTLEdBQTBCLElBQUksQ0FBQztZQUU1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM5QixNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDekIsT0FBTyxDQUFDLElBQUEsc0JBQWUsRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2hDLElBQUksU0FBUztvQkFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRXZDLElBQUksTUFBTSxHQUFHLFlBQVksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDO2dCQUM1QyxNQUFNLElBQUksY0FBYyxVQUFVLElBQUksQ0FBQztnQkFDdkMsTUFBTSxJQUFJLGNBQWMsSUFBSSxNQUFNLENBQUM7Z0JBRW5DLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxJQUFJLFlBQVksTUFBTSxJQUFJLENBQUM7Z0JBQ25DLENBQUM7Z0JBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxNQUFNLElBQUksWUFBWSxNQUFNLElBQUksQ0FBQztnQkFDbkMsQ0FBQztnQkFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxpQkFBaUI7WUFDakIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDWixPQUFPLENBQUMsMkJBQTJCLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDO1lBQy9ELENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdEZELGtEQXNGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUb29sLCBUb29sRXhlY3V0ZU9wdGlvbnMsIGZvcm1hdFRvb2xFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuXG5pbnRlcmZhY2UgUnVuU2hlbGxDb21tYW5kUGFyYW1zIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgcnVuX2luX2JnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFJ1blNoZWxsQ29tbWFuZFRvb2wgZXh0ZW5kcyBCYXNlVG9vbDxSdW5TaGVsbENvbW1hbmRQYXJhbXM+IHtcbiAgbmFtZSA9ICdydW5fc2hlbGxfY29tbWFuZCc7XG4gIGRlc2NyaXB0aW9uID0gJ0V4ZWN1dGVzIGEgc2hlbGwgY29tbWFuZCBpbiB0aGUgdGVybWluYWwuIFN1cHBvcnRzIGJvdGggZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBleGVjdXRpb24uJztcbiAgcGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBjb21tYW5kOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGUnXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQnJpZWYgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgY29tbWFuZCBkb2VzJ1xuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiAxMjApJ1xuICAgICAgfSxcbiAgICAgIHJ1bl9pbl9iZzoge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSWYgdHJ1ZSwgcnVuIGNvbW1hbmQgaW4gYmFja2dyb3VuZCdcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ2NvbW1hbmQnXVxuICB9O1xuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBSdW5TaGVsbENvbW1hbmRQYXJhbXMsIG9wdGlvbnM/OiBUb29sRXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZChwYXJhbXMsIFsnY29tbWFuZCddKTtcblxuICAgIGNvbnN0IHRpbWVvdXQgPSAocGFyYW1zLnRpbWVvdXQgfHwgMTIwKSAqIDEwMDA7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IG9wdGlvbnM/LndvcmtpbmdEaXJlY3RvcnkgfHwgcHJvY2Vzcy5jd2QoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICAgIGNvbnN0IHNoZWxsID0gaXNXaW5kb3dzID8gJ3Bvd2Vyc2hlbGwuZXhlJyA6ICcvYmluL2Jhc2gnO1xuICAgICAgY29uc3Qgc2hlbGxBcmdzID0gaXNXaW5kb3dzIFxuICAgICAgICA/IFsnLU5vUHJvZmlsZScsICctQ29tbWFuZCcsIHBhcmFtcy5jb21tYW5kXVxuICAgICAgICA6IFsnLWMnLCBwYXJhbXMuY29tbWFuZF07XG5cbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihzaGVsbCwgc2hlbGxBcmdzLCB7XG4gICAgICAgIGN3ZDogd29ya2luZ0RpcixcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgdGltZW91dDogdGltZW91dFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZGVyciArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzb2x2ZShmb3JtYXRUb29sRXJyb3IoZXJyb3IpKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKHRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgbGV0IG91dHB1dCA9IGBDb21tYW5kOiAke3BhcmFtcy5jb21tYW5kfVxcbmA7XG4gICAgICAgIG91dHB1dCArPSBgRGlyZWN0b3J5OiAke3dvcmtpbmdEaXJ9XFxuYDtcbiAgICAgICAgb3V0cHV0ICs9IGBFeGl0IENvZGU6ICR7Y29kZX1cXG5cXG5gO1xuXG4gICAgICAgIGlmIChzdGRvdXQpIHtcbiAgICAgICAgICBvdXRwdXQgKz0gYFN0ZG91dDpcXG4ke3N0ZG91dH1cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIG91dHB1dCArPSBgU3RkZXJyOlxcbiR7c3RkZXJyfVxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKG91dHB1dCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBwcm9jLmtpbGwoKTtcbiAgICAgICAgcmVzb2x2ZShgQ29tbWFuZCB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0IC8gMTAwMH0gc2Vjb25kc2ApO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLXNoZWxsLWNvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvcnVuLXNoZWxsLWNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQXVFO0FBQ3ZFLGlEQUFzQztBQVF0QyxNQUFhLG1CQUFvQixTQUFRLGVBQStCO0lBQ3RFLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUMzQixXQUFXLEdBQUc7Ozs7Ozs7Ozs7Ozs7OzsyREFlMkMsQ0FBQztJQUMxRCxVQUFVLEdBQUc7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsa0hBQWtIO2FBQ2hJO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSwwSkFBMEo7YUFDeEs7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDRHQUE0RzthQUMxSDtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ3JCLG9CQUFvQixFQUFFLEtBQUs7S0FDNUIsQ0FBQztJQUVGLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBNkIsRUFBRSxPQUE0QjtRQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUzQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksT0FBTyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxzQkFBc0I7UUFFcEYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FB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RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBL0dELGtEQStHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUb29sLCBUb29sRXhlY3V0ZU9wdGlvbnMsIGZvcm1hdFRvb2xFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuXG5pbnRlcmZhY2UgUnVuU2hlbGxDb21tYW5kUGFyYW1zIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJ1blNoZWxsQ29tbWFuZFRvb2wgZXh0ZW5kcyBCYXNlVG9vbDxSdW5TaGVsbENvbW1hbmRQYXJhbXM+IHtcbiAgbmFtZSA9ICdydW5fc2hlbGxfY29tbWFuZCc7XG4gIGRlc2NyaXB0aW9uID0gYFRoaXMgdG9vbCBleGVjdXRlcyBhIGdpdmVuIHNoZWxsIGNvbW1hbmQgYXMgXFxgcG93ZXJzaGVsbC5leGUgLU5vUHJvZmlsZSAtQ29tbWFuZCA8Y29tbWFuZD5cXGAgb24gV2luZG93cywgb3IgXFxgYmFzaCAtYyA8Y29tbWFuZD5cXGAgb24gVW5peC4gQ29tbWFuZCBjYW4gc3RhcnQgYmFja2dyb3VuZCBwcm9jZXNzZXMgdXNpbmcgUG93ZXJTaGVsbCBjb25zdHJ1Y3RzIHN1Y2ggYXMgXFxgU3RhcnQtUHJvY2VzcyAtTm9OZXdXaW5kb3dcXGAgb3IgXFxgU3RhcnQtSm9iXFxgLlxuICAgICAgXG5Vc2FnZSBub3Rlczpcbi0gVGhlIGNvbW1hbmQgYXJndW1lbnQgaXMgcmVxdWlyZWQuXG4tIEl0IGlzIHZlcnkgaGVscGZ1bCBpZiB5b3Ugd3JpdGUgYSBjbGVhciwgY29uY2lzZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgY29tbWFuZCBkb2VzIGluIDUtMTAgd29yZHMuXG4tIFlvdSBjYW4gdXNlIHRoZSBcXGBydW5faW5fYmdcXGAgcGFyYW1ldGVyIHRvIHJ1biB0aGUgY29tbWFuZCBpbiB0aGUgYmFja2dyb3VuZCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjb250aW51ZSB3b3JraW5nIHdoaWxlIHRoZSBjb21tYW5kIHJ1bnMuIFlvdSBjYW4gbW9uaXRvciB0aGUgb3V0cHV0IHVzaW5nIHRoZSBCYXNoT3V0cHV0IHRvb2wgYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuXG4tIFRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQ6XG4gIENvbW1hbmQ6IEV4ZWN1dGVkIGNvbW1hbmQuXG4gIERpcmVjdG9yeTogRGlyZWN0b3J5IHdoZXJlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkLCBvciBcXGAocm9vdClcXGAuXG4gIFN0ZG91dDogT3V0cHV0IG9uIHN0ZG91dCBzdHJlYW0uIENhbiBiZSBcXGAoZW1wdHkpXFxgIG9yIHBhcnRpYWwgb24gZXJyb3IgYW5kIGZvciBhbnkgdW53YWl0ZWQgYmFja2dyb3VuZCBwcm9jZXNzZXMuXG4gIFN0ZGVycjogT3V0cHV0IG9uIHN0ZGVyciBzdHJlYW0uIENhbiBiZSBcXGAoZW1wdHkpXFxgIG9yIHBhcnRpYWwgb24gZXJyb3IgYW5kIGZvciBhbnkgdW53YWl0ZWQgYmFja2dyb3VuZCBwcm9jZXNzZXMuXG4gIEVycm9yOiBFcnJvciBvciBcXGAobm9uZSlcXGAgaWYgbm8gZXJyb3Igd2FzIHJlcG9ydGVkIGZvciB0aGUgc3VicHJvY2Vzcy5cbiAgRXhpdCBDb2RlOiBFeGl0IGNvZGUgb3IgXFxgKG5vbmUpXFxgIGlmIHRlcm1pbmF0ZWQgYnkgc2lnbmFsLlxuICBTaWduYWw6IFNpZ25hbCBudW1iZXIgb3IgXFxgKG5vbmUpXFxgIGlmIG5vIHNpZ25hbCB3YXMgcmVjZWl2ZWQuXG4gIEJhY2tncm91bmQgUElEczogTGlzdCBvZiBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBzdGFydGVkIG9yIFxcYChub25lKVxcYC5cbiAgUHJvY2VzcyBHcm91cCBQR0lEOiBQcm9jZXNzIGdyb3VwIHN0YXJ0ZWQgb3IgXFxgKG5vbmUpXFxgLmA7XG4gIHBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgY29tbWFuZDoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdFeGFjdCBjb21tYW5kIHRvIGV4ZWN1dGUgYXMgcG93ZXJzaGVsbC5leGUgLU5vUHJvZmlsZSAtQ29tbWFuZCA8Y29tbWFuZD4gb24gV2luZG93cyBvciBiYXNoIC1jIDxjb21tYW5kPiBvbiBVbml4J1xuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0JyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kIGZvciB0aGUgdXNlci4gQmUgc3BlY2lmaWMgYW5kIGNvbmNpc2UuIElkZWFsbHkgYSBzaW5nbGUgc2VudGVuY2UuIENhbiBiZSB1cCB0byAzIHNlbnRlbmNlcyBmb3IgY2xhcml0eS4gTm8gbGluZSBicmVha3MuJ1xuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW9uYWw6IFRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGRlZmF1bHQgdGltZW91dCBvZiAxMjBzLidcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ2NvbW1hbmQnXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgfTtcblxuICBhc3luYyBleGVjdXRlKHBhcmFtczogUnVuU2hlbGxDb21tYW5kUGFyYW1zLCBvcHRpb25zPzogVG9vbEV4ZWN1dGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLnZhbGlkYXRlUmVxdWlyZWQocGFyYW1zLCBbJ2NvbW1hbmQnXSk7XG5cbiAgICBjb25zdCB3b3JraW5nRGlyID0gb3B0aW9ucz8ud29ya2luZ0RpcmVjdG9yeSB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBwYXJhbXMudGltZW91dCB8fCBvcHRpb25zPy50aW1lb3V0IHx8IDEyMDAwMDsgLy8gRGVmYXVsdCAxMjAgc2Vjb25kc1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZChwYXJhbXMuY29tbWFuZCwgd29ya2luZ0RpciwgdGltZW91dCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VG9vbEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZywgdGltZW91dDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgICBjb25zdCBzaGVsbCA9IGlzV2luZG93cyA/ICdwb3dlcnNoZWxsLmV4ZScgOiAnYmFzaCc7XG4gICAgICBjb25zdCBhcmdzID0gaXNXaW5kb3dzID8gWyctTm9Qcm9maWxlJywgJy1Db21tYW5kJywgY29tbWFuZF0gOiBbJy1jJywgY29tbWFuZF07XG5cbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihzaGVsbCwgYXJncywge1xuICAgICAgICBjd2QsXG4gICAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgICAgd2luZG93c0hpZGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBsZXQgdGltZWRPdXQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgcHJvYy5raWxsKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHByb2Muc3RkZXJyLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlc3VsdCA9IGBDb21tYW5kOiAke2NvbW1hbmR9XFxuYDtcbiAgICAgICAgcmVzdWx0ICs9IGBEaXJlY3Rvcnk6ICR7Y3dkfVxcbmA7XG4gICAgICAgIHJlc3VsdCArPSBgRXhpdCBDb2RlOiAke2NvZGUgPz8gJyhub25lKSd9XFxuYDtcbiAgICAgICAgXG4gICAgICAgIGlmIChzdGRvdXQpIHtcbiAgICAgICAgICByZXN1bHQgKz0gYFxcblN0ZG91dDpcXG4ke3N0ZG91dH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSBgXFxuU3Rkb3V0OiAoZW1wdHkpYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHJlc3VsdCArPSBgXFxuXFxuU3RkZXJyOlxcbiR7c3RkZXJyfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgICAgIHJlc3VsdCArPSBgXFxuXFxu4pqg77iPIENvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dCAvIDEwMDB9IHNlY29uZHNgO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICByZXNvbHZlKGBFcnJvciBleGVjdXRpbmcgY29tbWFuZDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59Il19
@@ -34,9 +34,9 @@ export declare class SearchFileContentTool extends BaseTool<SearchFileContentPar
34
34
  };
35
35
  };
36
36
  required: string[];
37
+ additionalProperties: boolean;
37
38
  };
38
39
  execute(params: SearchFileContentParams, options?: ToolExecuteOptions): Promise<string>;
39
- private searchInDir;
40
- private shouldInclude;
40
+ private runSearch;
41
41
  }
42
42
  export {};
@@ -35,119 +35,141 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.SearchFileContentTool = void 0;
37
37
  const base_1 = require("./base");
38
- const fs = __importStar(require("fs/promises"));
38
+ const fs = __importStar(require("fs"));
39
39
  const path = __importStar(require("path"));
40
40
  class SearchFileContentTool extends base_1.BaseTool {
41
41
  name = 'search_file_content';
42
- description = 'Searches for a pattern within files in a directory using regex.';
42
+ description = 'Searches for a regular expression pattern within the content of files or directories. Returns the lines containing matches, along with their file paths and line numbers.';
43
43
  parameters = {
44
44
  type: 'object',
45
45
  properties: {
46
46
  pattern: {
47
47
  type: 'string',
48
- description: 'The regular expression pattern to search for'
48
+ description: 'The regular expression (regex) pattern to search for within file contents'
49
49
  },
50
50
  path: {
51
51
  type: 'string',
52
- description: 'Optional: The path to search within'
52
+ description: 'Optional: The absolute path to the file or directory to search within. If omitted, searches the current working directory.'
53
53
  },
54
54
  include: {
55
55
  type: 'string',
56
- description: 'Optional: A glob pattern to filter files'
56
+ description: 'Optional: A glob pattern to filter which files are searched (e.g., *.js, *.{ts,tsx}, src/**)'
57
57
  },
58
58
  case_sensitive: {
59
59
  type: 'boolean',
60
- description: 'If true, search is case-sensitive'
60
+ description: 'If true, search is case-sensitive. Defaults to false.'
61
61
  },
62
62
  context: {
63
63
  type: 'number',
64
- description: 'Number of lines of context around matches'
64
+ description: 'Show this many lines of context around each match. Defaults to 0.'
65
65
  }
66
66
  },
67
- required: ['pattern']
67
+ required: ['pattern'],
68
+ additionalProperties: false
68
69
  };
69
70
  async execute(params, options) {
70
71
  this.validateRequired(params, ['pattern']);
71
72
  const workingDir = options?.workingDirectory || process.cwd();
72
73
  const searchPath = params.path || workingDir;
73
- const caseSensitive = params.case_sensitive ?? false;
74
74
  try {
75
- const regex = new RegExp(params.pattern, caseSensitive ? 'g' : 'gi');
76
- const results = [];
77
- const maxResults = 500;
78
- await this.searchInDir(searchPath, regex, params.include, results, maxResults);
79
- if (results.length === 0) {
80
- return `No matches found for pattern: ${params.pattern}`;
81
- }
82
- const output = results.map(r => {
83
- return `${r.file}:${r.line}: ${r.content}`;
84
- }).join('\n');
85
- return `Found ${results.length} matches:\n\n${output}`;
75
+ const results = await this.runSearch(params, searchPath);
76
+ return results;
86
77
  }
87
78
  catch (error) {
88
79
  return (0, base_1.formatToolError)(error);
89
80
  }
90
81
  }
91
- async searchInDir(dir, regex, include, results, maxResults) {
92
- if (results.length >= maxResults)
93
- return;
94
- const entries = await fs.readdir(dir, { withFileTypes: true });
95
- for (const entry of entries) {
96
- if (results.length >= maxResults)
97
- return;
98
- const fullPath = path.join(dir, entry.name);
99
- if (entry.isDirectory()) {
100
- if (['node_modules', '.git', 'dist', 'build', '.next'].includes(entry.name)) {
101
- continue;
82
+ async runSearch(params, searchPath) {
83
+ const isWindows = process.platform === 'win32';
84
+ const pattern = params.case_sensitive
85
+ ? new RegExp(params.pattern, 'g')
86
+ : new RegExp(params.pattern, 'gi');
87
+ const results = [];
88
+ const contextLines = params.context || 0;
89
+ const searchFile = (filePath) => {
90
+ try {
91
+ const content = fs.readFileSync(filePath, 'utf-8');
92
+ const lines = content.split('\n');
93
+ for (let i = 0; i < lines.length; i++) {
94
+ const line = lines[i];
95
+ if (pattern.test(line)) {
96
+ // Add context before
97
+ if (contextLines > 0) {
98
+ for (let j = Math.max(0, i - contextLines); j < i; j++) {
99
+ results.push(` ${filePath}:${j + 1}: ${lines[j]}`);
100
+ }
101
+ }
102
+ // Add matching line
103
+ results.push(`> ${filePath}:${i + 1}: ${line}`);
104
+ // Add context after
105
+ if (contextLines > 0) {
106
+ for (let j = i + 1; j <= Math.min(lines.length - 1, i + contextLines); j++) {
107
+ results.push(` ${filePath}:${j + 1}: ${lines[j]}`);
108
+ }
109
+ }
110
+ results.push(''); // Empty line between matches
111
+ }
102
112
  }
103
- await this.searchInDir(fullPath, regex, include, results, maxResults);
104
113
  }
105
- else if (entry.isFile()) {
106
- if (!this.shouldInclude(fullPath, include)) {
107
- continue;
108
- }
109
- try {
110
- const content = await fs.readFile(fullPath, 'utf-8');
111
- const lines = content.split('\n');
112
- lines.forEach((line, index) => {
113
- if (results.length >= maxResults)
114
- return;
115
- const match = line.match(regex);
116
- if (match) {
117
- results.push({
118
- file: fullPath,
119
- line: index + 1,
120
- content: line.trim(),
121
- match: match[0]
122
- });
114
+ catch {
115
+ // Skip files that can't be read as text
116
+ }
117
+ };
118
+ const searchDir = (dirPath) => {
119
+ try {
120
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
121
+ for (const entry of entries) {
122
+ const fullPath = path.join(dirPath, entry.name);
123
+ if (entry.isDirectory()) {
124
+ // Skip hidden directories and common ignore patterns
125
+ if (!entry.name.startsWith('.') &&
126
+ entry.name !== 'node_modules' &&
127
+ entry.name !== 'dist' &&
128
+ entry.name !== 'build') {
129
+ searchDir(fullPath);
123
130
  }
124
- });
125
- }
126
- catch {
127
- // Skip files that can't be read as text
131
+ }
132
+ else if (entry.isFile()) {
133
+ // Apply include filter if provided
134
+ if (params.include) {
135
+ const minimatch = require('minimatch');
136
+ if (!minimatch(entry.name, params.include)) {
137
+ continue;
138
+ }
139
+ }
140
+ searchFile(fullPath);
141
+ }
128
142
  }
129
143
  }
144
+ catch {
145
+ // Skip directories that can't be accessed
146
+ }
147
+ };
148
+ try {
149
+ const stat = fs.statSync(searchPath);
150
+ if (stat.isDirectory()) {
151
+ searchDir(searchPath);
152
+ }
153
+ else {
154
+ searchFile(searchPath);
155
+ }
130
156
  }
131
- }
132
- shouldInclude(filePath, include) {
133
- if (!include) {
134
- // Default: only text files
135
- const ext = path.extname(filePath).toLowerCase();
136
- const textExts = [
137
- '.ts', '.tsx', '.js', '.jsx', '.json', '.md', '.txt',
138
- '.py', '.java', '.c', '.cpp', '.h', '.go', '.rs',
139
- '.yaml', '.yml', '.toml', '.ini', '.env', '.sh',
140
- '.html', '.css', '.scss', '.less', '.vue', '.svelte'
141
- ];
142
- return textExts.includes(ext) || ext === '';
157
+ catch (error) {
158
+ return `Error: Could not access ${searchPath}: ${error}`;
159
+ }
160
+ if (results.length === 0) {
161
+ return `No matches found for pattern "${params.pattern}" in ${searchPath}`;
143
162
  }
144
- // Simple include pattern matching
145
- if (include.startsWith('*.')) {
146
- const ext = include.slice(1);
147
- return filePath.endsWith(ext);
163
+ // Limit results to prevent overwhelming output
164
+ const maxResults = 500;
165
+ const limitedResults = results.slice(0, maxResults);
166
+ let output = `Found ${results.length} matches for "${params.pattern}":\n\n`;
167
+ output += limitedResults.join('\n');
168
+ if (results.length > maxResults) {
169
+ output += `\n\n... and ${results.length - maxResults} more matches (truncated)`;
148
170
  }
149
- return filePath.includes(include);
171
+ return output;
150
172
  }
151
173
  }
152
174
  exports.SearchFileContentTool = SearchFileContentTool;
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbGUtY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9zZWFyY2gtZmlsZS1jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUF1RTtBQUN2RSxnREFBa0M7QUFDbEMsMkNBQTZCO0FBaUI3QixNQUFhLHFCQUFzQixTQUFRLGVBQWlDO0lBQzFFLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUM3QixXQUFXLEdBQUcsaUVBQWlFLENBQUM7SUFDaEYsVUFBVSxHQUFHO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDhDQUE4QzthQUM1RDtZQUNELElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUscUNBQXFDO2FBQ25EO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSwwQ0FBMEM7YUFDeEQ7WUFDRCxjQUFjLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsV0FBVyxFQUFFLG1DQUFtQzthQUNqRDtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsMkNBQTJDO2FBQ3pEO1NBQ0Y7UUFDRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUM7S0FDdEIsQ0FBQztJQUVGLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBK0IsRUFBRSxPQUE0QjtRQUN6RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUzQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELE1B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QUFHLEtBQUssRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFoSUQsc0RBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZVRvb2wsIFRvb2xFeGVjdXRlT3B0aW9ucywgZm9ybWF0VG9vbEVycm9yIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmludGVyZmFjZSBTZWFyY2hGaWxlQ29udGVudFBhcmFtcyB7XG4gIHBhdHRlcm46IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgY2FzZV9zZW5zaXRpdmU/OiBib29sZWFuO1xuICBjb250ZXh0PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2VhcmNoUmVzdWx0IHtcbiAgZmlsZTogc3RyaW5nO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgbWF0Y2g6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlYXJjaEZpbGVDb250ZW50VG9vbCBleHRlbmRzIEJhc2VUb29sPFNlYXJjaEZpbGVDb250ZW50UGFyYW1zPiB7XG4gIG5hbWUgPSAnc2VhcmNoX2ZpbGVfY29udGVudCc7XG4gIGRlc2NyaXB0aW9uID0gJ1NlYXJjaGVzIGZvciBhIHBhdHRlcm4gd2l0aGluIGZpbGVzIGluIGEgZGlyZWN0b3J5IHVzaW5nIHJlZ2V4Lic7XG4gIHBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgcGF0dGVybjoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gc2VhcmNoIGZvcidcbiAgICAgIH0sXG4gICAgICBwYXRoOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsOiBUaGUgcGF0aCB0byBzZWFyY2ggd2l0aGluJ1xuICAgICAgfSxcbiAgICAgIGluY2x1ZGU6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW9uYWw6IEEgZ2xvYiBwYXR0ZXJuIHRvIGZpbHRlciBmaWxlcydcbiAgICAgIH0sXG4gICAgICBjYXNlX3NlbnNpdGl2ZToge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSWYgdHJ1ZSwgc2VhcmNoIGlzIGNhc2Utc2Vuc2l0aXZlJ1xuICAgICAgfSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGxpbmVzIG9mIGNvbnRleHQgYXJvdW5kIG1hdGNoZXMnXG4gICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogWydwYXR0ZXJuJ11cbiAgfTtcblxuICBhc3luYyBleGVjdXRlKHBhcmFtczogU2VhcmNoRmlsZUNvbnRlbnRQYXJhbXMsIG9wdGlvbnM/OiBUb29sRXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZChwYXJhbXMsIFsncGF0dGVybiddKTtcblxuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBvcHRpb25zPy53b3JraW5nRGlyZWN0b3J5IHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3Qgc2VhcmNoUGF0aCA9IHBhcmFtcy5wYXRoIHx8IHdvcmtpbmdEaXI7XG4gICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHBhcmFtcy5jYXNlX3NlbnNpdGl2ZSA/PyBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGFyYW1zLnBhdHRlcm4sIGNhc2VTZW5zaXRpdmUgPyAnZycgOiAnZ2knKTtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgICBjb25zdCBtYXhSZXN1bHRzID0gNTAwO1xuXG4gICAgICBhd2FpdCB0aGlzLnNlYXJjaEluRGlyKHNlYXJjaFBhdGgsIHJlZ2V4LCBwYXJhbXMuaW5jbHVkZSwgcmVzdWx0cywgbWF4UmVzdWx0cyk7XG5cbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYE5vIG1hdGNoZXMgZm91bmQgZm9yIHBhdHRlcm46ICR7cGFyYW1zLnBhdHRlcm59YDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0cy5tYXAociA9PiB7XG4gICAgICAgIHJldHVybiBgJHtyLmZpbGV9OiR7ci5saW5lfTogJHtyLmNvbnRlbnR9YDtcbiAgICAgIH0pLmpvaW4oJ1xcbicpO1xuXG4gICAgICByZXR1cm4gYEZvdW5kICR7cmVzdWx0cy5sZW5ndGh9IG1hdGNoZXM6XFxuXFxuJHtvdXRwdXR9YDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZvcm1hdFRvb2xFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZWFyY2hJbkRpcihcbiAgICBkaXI6IHN0cmluZyxcbiAgICByZWdleDogUmVnRXhwLFxuICAgIGluY2x1ZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZXN1bHRzOiBTZWFyY2hSZXN1bHRbXSxcbiAgICBtYXhSZXN1bHRzOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IG1heFJlc3VsdHMpIHJldHVybjtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPj0gbWF4UmVzdWx0cykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoWydub2RlX21vZHVsZXMnLCAnLmdpdCcsICdkaXN0JywgJ2J1aWxkJywgJy5uZXh0J10uaW5jbHVkZXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNlYXJjaEluRGlyKGZ1bGxQYXRoLCByZWdleCwgaW5jbHVkZSwgcmVzdWx0cywgbWF4UmVzdWx0cyk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRJbmNsdWRlKGZ1bGxQYXRoLCBpbmNsdWRlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IG1heFJlc3VsdHMpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpbGU6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgIGxpbmU6IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBsaW5lLnRyaW0oKSxcbiAgICAgICAgICAgICAgICBtYXRjaDogbWF0Y2hbMF1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFNraXAgZmlsZXMgdGhhdCBjYW4ndCBiZSByZWFkIGFzIHRleHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkSW5jbHVkZShmaWxlUGF0aDogc3RyaW5nLCBpbmNsdWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAoIWluY2x1ZGUpIHtcbiAgICAgIC8vIERlZmF1bHQ6IG9ubHkgdGV4dCBmaWxlc1xuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdGV4dEV4dHMgPSBbXG4gICAgICAgICcudHMnLCAnLnRzeCcsICcuanMnLCAnLmpzeCcsICcuanNvbicsICcubWQnLCAnLnR4dCcsXG4gICAgICAgICcucHknLCAnLmphdmEnLCAnLmMnLCAnLmNwcCcsICcuaCcsICcuZ28nLCAnLnJzJyxcbiAgICAgICAgJy55YW1sJywgJy55bWwnLCAnLnRvbWwnLCAnLmluaScsICcuZW52JywgJy5zaCcsXG4gICAgICAgICcuaHRtbCcsICcuY3NzJywgJy5zY3NzJywgJy5sZXNzJywgJy52dWUnLCAnLnN2ZWx0ZSdcbiAgICAgIF07XG4gICAgICByZXR1cm4gdGV4dEV4dHMuaW5jbHVkZXMoZXh0KSB8fCBleHQgPT09ICcnO1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSBpbmNsdWRlIHBhdHRlcm4gbWF0Y2hpbmdcbiAgICBpZiAoaW5jbHVkZS5zdGFydHNXaXRoKCcqLicpKSB7XG4gICAgICBjb25zdCBleHQgPSBpbmNsdWRlLnNsaWNlKDEpO1xuICAgICAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlUGF0aC5pbmNsdWRlcyhpbmNsdWRlKTtcbiAgfVxufVxuIl19
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbGUtY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9zZWFyY2gtZmlsZS1jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUF1RTtBQUV2RSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBVTdCLE1BQWEscUJBQXNCLFNBQVEsZUFBaUM7SUFDMUUsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQzdCLFdBQVcsR0FBRywyS0FBMkssQ0FBQztJQUMxTCxVQUFVLEdBQUc7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsMkVBQTJFO2FBQ3pGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw0SEFBNEg7YUFDMUk7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDhGQUE4RjthQUM1RztZQUNELGNBQWMsRUFBRTtnQkFDZCxJQUFJLEVBQUUsU0FBUztnQkFDZixXQUFXLEVBQUUsdURBQXVEO2FBQ3JFO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxtRUFBbUU7YUFDakY7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNyQixvQkFBb0IsRUFBRSxLQUFLO0tBQzVCLENBQUM7SUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQStCLEVBQUUsT0FBNEI7UUFDekUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFM0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxH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MEM7WUFDNUMsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDdkIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTywyQkFBMkIsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzNELENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxpQ0FBaUMsTUFBTSxDQUFDLE9BQU8sUUFBUSxVQUFVLEVBQUUsQ0FBQztRQUM3RSxDQUFDO1FBRUQsK0NBQStDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVwRCxJQUFJLE1BQU0sR0FBRyxTQUFTLE9BQU8sQ0FBQyxNQUFNLGlCQUFpQixNQUFNLENBQUMsT0FBTyxRQUFRLENBQUM7UUFDNUUsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxlQUFlLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSwyQkFBMkIsQ0FBQztRQUNsRixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBL0lELHNEQStJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUb29sLCBUb29sRXhlY3V0ZU9wdGlvbnMsIGZvcm1hdFRvb2xFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW50ZXJmYWNlIFNlYXJjaEZpbGVDb250ZW50UGFyYW1zIHtcbiAgcGF0dGVybjogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBpbmNsdWRlPzogc3RyaW5nO1xuICBjYXNlX3NlbnNpdGl2ZT86IGJvb2xlYW47XG4gIGNvbnRleHQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hGaWxlQ29udGVudFRvb2wgZXh0ZW5kcyBCYXNlVG9vbDxTZWFyY2hGaWxlQ29udGVudFBhcmFtcz4ge1xuICBuYW1lID0gJ3NlYXJjaF9maWxlX2NvbnRlbnQnO1xuICBkZXNjcmlwdGlvbiA9ICdTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB3aXRoaW4gdGhlIGNvbnRlbnQgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMuIFJldHVybnMgdGhlIGxpbmVzIGNvbnRhaW5pbmcgbWF0Y2hlcywgYWxvbmcgd2l0aCB0aGVpciBmaWxlIHBhdGhzIGFuZCBsaW5lIG51bWJlcnMuJztcbiAgcGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSByZWd1bGFyIGV4cHJlc3Npb24gKHJlZ2V4KSBwYXR0ZXJuIHRvIHNlYXJjaCBmb3Igd2l0aGluIGZpbGUgY29udGVudHMnXG4gICAgICB9LFxuICAgICAgcGF0aDoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbDogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIHNlYXJjaCB3aXRoaW4uIElmIG9taXR0ZWQsIHNlYXJjaGVzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LidcbiAgICAgIH0sXG4gICAgICBpbmNsdWRlOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsOiBBIGdsb2IgcGF0dGVybiB0byBmaWx0ZXIgd2hpY2ggZmlsZXMgYXJlIHNlYXJjaGVkIChlLmcuLCAqLmpzLCAqLnt0cyx0c3h9LCBzcmMvKiopJ1xuICAgICAgfSxcbiAgICAgIGNhc2Vfc2Vuc2l0aXZlOiB7XG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdJZiB0cnVlLCBzZWFyY2ggaXMgY2FzZS1zZW5zaXRpdmUuIERlZmF1bHRzIHRvIGZhbHNlLidcbiAgICAgIH0sXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1Nob3cgdGhpcyBtYW55IGxpbmVzIG9mIGNvbnRleHQgYXJvdW5kIGVhY2ggbWF0Y2guIERlZmF1bHRzIHRvIDAuJ1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsncGF0dGVybiddLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICB9O1xuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBTZWFyY2hGaWxlQ29udGVudFBhcmFtcywgb3B0aW9ucz86IFRvb2xFeGVjdXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy52YWxpZGF0ZVJlcXVpcmVkKHBhcmFtcywgWydwYXR0ZXJuJ10pO1xuXG4gICAgY29uc3Qgd29ya2luZ0RpciA9IG9wdGlvbnM/LndvcmtpbmdEaXJlY3RvcnkgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBzZWFyY2hQYXRoID0gcGFyYW1zLnBhdGggfHwgd29ya2luZ0RpcjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5TZWFyY2gocGFyYW1zLCBzZWFyY2hQYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VG9vbEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlYXJjaChwYXJhbXM6IFNlYXJjaEZpbGVDb250ZW50UGFyYW1zLCBzZWFyY2hQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgY29uc3QgcGF0dGVybiA9IHBhcmFtcy5jYXNlX3NlbnNpdGl2ZSBcbiAgICAgID8gbmV3IFJlZ0V4cChwYXJhbXMucGF0dGVybiwgJ2cnKVxuICAgICAgOiBuZXcgUmVnRXhwKHBhcmFtcy5wYXR0ZXJuLCAnZ2knKTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY29udGV4dExpbmVzID0gcGFyYW1zLmNvbnRleHQgfHwgMDtcblxuICAgIGNvbnN0IHNlYXJjaEZpbGUgPSAoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICBpZiAocGF0dGVybi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAvLyBBZGQgY29udGV4dCBiZWZvcmVcbiAgICAgICAgICAgIGlmIChjb250ZXh0TGluZXMgPiAwKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSBNYXRoLm1heCgwLCBpIC0gY29udGV4dExpbmVzKTsgaiA8IGk7IGorKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChgICAke2ZpbGVQYXRofToke2ogKyAxfTogJHtsaW5lc1tqXX1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWRkIG1hdGNoaW5nIGxpbmVcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChgPiAke2ZpbGVQYXRofToke2kgKyAxfTogJHtsaW5lfWApO1xuICAgICAgICAgICAgLy8gQWRkIGNvbnRleHQgYWZ0ZXJcbiAgICAgICAgICAgIGlmIChjb250ZXh0TGluZXMgPiAwKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8PSBNYXRoLm1pbihsaW5lcy5sZW5ndGggLSAxLCBpICsgY29udGV4dExpbmVzKTsgaisrKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGAgICR7ZmlsZVBhdGh9OiR7aiArIDF9OiAke2xpbmVzW2pdfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goJycpOyAvLyBFbXB0eSBsaW5lIGJldHdlZW4gbWF0Y2hlc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNraXAgZmlsZXMgdGhhdCBjYW4ndCBiZSByZWFkIGFzIHRleHRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc2VhcmNoRGlyID0gKGRpclBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcblxuICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGhpZGRlbiBkaXJlY3RvcmllcyBhbmQgY29tbW9uIGlnbm9yZSBwYXR0ZXJuc1xuICAgICAgICAgICAgaWYgKCFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSAmJiBcbiAgICAgICAgICAgICAgICBlbnRyeS5uYW1lICE9PSAnbm9kZV9tb2R1bGVzJyAmJiBcbiAgICAgICAgICAgICAgICBlbnRyeS5uYW1lICE9PSAnZGlzdCcgJiZcbiAgICAgICAgICAgICAgICBlbnRyeS5uYW1lICE9PSAnYnVpbGQnKSB7XG4gICAgICAgICAgICAgIHNlYXJjaERpcihmdWxsUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgLy8gQXBwbHkgaW5jbHVkZSBmaWx0ZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChwYXJhbXMuaW5jbHVkZSkge1xuICAgICAgICAgICAgICBjb25zdCBtaW5pbWF0Y2ggPSByZXF1aXJlKCdtaW5pbWF0Y2gnKTtcbiAgICAgICAgICAgICAgaWYgKCFtaW5pbWF0Y2goZW50cnkubmFtZSwgcGFyYW1zLmluY2x1ZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlYXJjaEZpbGUoZnVsbFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBjYW4ndCBiZSBhY2Nlc3NlZFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKHNlYXJjaFBhdGgpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBzZWFyY2hEaXIoc2VhcmNoUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWFyY2hGaWxlKHNlYXJjaFBhdGgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gYEVycm9yOiBDb3VsZCBub3QgYWNjZXNzICR7c2VhcmNoUGF0aH06ICR7ZXJyb3J9YDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgTm8gbWF0Y2hlcyBmb3VuZCBmb3IgcGF0dGVybiBcIiR7cGFyYW1zLnBhdHRlcm59XCIgaW4gJHtzZWFyY2hQYXRofWA7XG4gICAgfVxuXG4gICAgLy8gTGltaXQgcmVzdWx0cyB0byBwcmV2ZW50IG92ZXJ3aGVsbWluZyBvdXRwdXRcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gNTAwO1xuICAgIGNvbnN0IGxpbWl0ZWRSZXN1bHRzID0gcmVzdWx0cy5zbGljZSgwLCBtYXhSZXN1bHRzKTtcblxuICAgIGxldCBvdXRwdXQgPSBgRm91bmQgJHtyZXN1bHRzLmxlbmd0aH0gbWF0Y2hlcyBmb3IgXCIke3BhcmFtcy5wYXR0ZXJufVwiOlxcblxcbmA7XG4gICAgb3V0cHV0ICs9IGxpbWl0ZWRSZXN1bHRzLmpvaW4oJ1xcbicpO1xuXG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gbWF4UmVzdWx0cykge1xuICAgICAgb3V0cHV0ICs9IGBcXG5cXG4uLi4gYW5kICR7cmVzdWx0cy5sZW5ndGggLSBtYXhSZXN1bHRzfSBtb3JlIG1hdGNoZXMgKHRydW5jYXRlZClgO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn1cbiJdfQ==
@@ -19,6 +19,7 @@ export declare class WriteFileTool extends BaseTool<WriteFileParams> {
19
19
  };
20
20
  };
21
21
  required: string[];
22
+ additionalProperties: boolean;
22
23
  };
23
24
  execute(params: WriteFileParams, options?: ToolExecuteOptions): Promise<string>;
24
25
  }