@oflow-ai/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conversation.js +21 -2
- package/dist/tools/base.d.ts +7 -0
- package/dist/tools/base.js +28 -2
- package/dist/tools/glob.d.ts +6 -2
- package/dist/tools/glob.js +28 -87
- package/dist/tools/list-directory.d.ts +1 -0
- package/dist/tools/list-directory.js +29 -24
- package/dist/tools/read-file.d.ts +1 -0
- package/dist/tools/read-file.js +7 -6
- package/dist/tools/replace.d.ts +1 -0
- package/dist/tools/replace.js +24 -19
- package/dist/tools/run-shell-command.d.ts +2 -5
- package/dist/tools/run-shell-command.js +61 -37
- package/dist/tools/search-file-content.d.ts +2 -2
- package/dist/tools/search-file-content.js +94 -72
- package/dist/tools/write-file.d.ts +1 -0
- package/dist/tools/write-file.js +7 -6
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.js +1 -1
- package/package.json +1 -1
package/dist/tools/replace.js
CHANGED
|
@@ -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.
|
|
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: '
|
|
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
|
|
69
|
-
|
|
70
|
-
: 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(
|
|
73
|
-
//
|
|
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
|
|
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(
|
|
85
|
-
return `Successfully replaced text in ${
|
|
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,
|
|
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 =
|
|
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: '
|
|
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
|
|
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
|
|
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' : '
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
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('
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
84
|
+
result += `\nStdout:\n${stdout}`;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
result += `\nStdout: (empty)`;
|
|
66
88
|
}
|
|
67
89
|
if (stderr) {
|
|
68
|
-
|
|
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(
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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: '
|
|
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
|
|
76
|
-
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
127
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
|
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==
|