@oflow-ai/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/agents/index.d.ts +35 -0
  4. package/dist/agents/index.js +233 -0
  5. package/dist/ai/chinese-provider.d.ts +146 -0
  6. package/dist/ai/chinese-provider.js +193 -0
  7. package/dist/ai/custom-provider.d.ts +11 -0
  8. package/dist/ai/custom-provider.js +113 -0
  9. package/dist/ai/index.d.ts +7 -0
  10. package/dist/ai/index.js +42 -0
  11. package/dist/ai/openai-provider.d.ts +18 -0
  12. package/dist/ai/openai-provider.js +161 -0
  13. package/dist/config/index.d.ts +20 -0
  14. package/dist/config/index.js +83 -0
  15. package/dist/conversation.d.ts +26 -0
  16. package/dist/conversation.js +126 -0
  17. package/dist/index.d.ts +10 -0
  18. package/dist/index.js +72 -0
  19. package/dist/mcp/index.d.ts +48 -0
  20. package/dist/mcp/index.js +175 -0
  21. package/dist/sandbox/index.d.ts +31 -0
  22. package/dist/sandbox/index.js +197 -0
  23. package/dist/skills/index.d.ts +16 -0
  24. package/dist/skills/index.js +169 -0
  25. package/dist/tools/ask-user-question.d.ts +62 -0
  26. package/dist/tools/ask-user-question.js +71 -0
  27. package/dist/tools/base.d.ts +16 -0
  28. package/dist/tools/base.js +39 -0
  29. package/dist/tools/glob.d.ts +27 -0
  30. package/dist/tools/glob.js +125 -0
  31. package/dist/tools/image-read.d.ts +42 -0
  32. package/dist/tools/image-read.js +125 -0
  33. package/dist/tools/index.d.ts +27 -0
  34. package/dist/tools/index.js +127 -0
  35. package/dist/tools/list-directory.d.ts +28 -0
  36. package/dist/tools/list-directory.js +94 -0
  37. package/dist/tools/pdf-extract.d.ts +32 -0
  38. package/dist/tools/pdf-extract.js +130 -0
  39. package/dist/tools/read-file.d.ts +31 -0
  40. package/dist/tools/read-file.js +116 -0
  41. package/dist/tools/replace.d.ts +35 -0
  42. package/dist/tools/replace.js +93 -0
  43. package/dist/tools/run-shell-command.d.ts +35 -0
  44. package/dist/tools/run-shell-command.js +81 -0
  45. package/dist/tools/save-memory.d.ts +22 -0
  46. package/dist/tools/save-memory.js +91 -0
  47. package/dist/tools/search-file-content.d.ts +42 -0
  48. package/dist/tools/search-file-content.js +153 -0
  49. package/dist/tools/task.d.ts +46 -0
  50. package/dist/tools/task.js +54 -0
  51. package/dist/tools/web-fetch.d.ts +26 -0
  52. package/dist/tools/web-fetch.js +81 -0
  53. package/dist/tools/web-search.d.ts +35 -0
  54. package/dist/tools/web-search.js +86 -0
  55. package/dist/tools/write-file.d.ts +25 -0
  56. package/dist/tools/write-file.js +76 -0
  57. package/dist/types/index.d.ts +166 -0
  58. package/dist/types/index.js +43 -0
  59. package/package.json +54 -0
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ListDirectoryTool = void 0;
37
+ const base_1 = require("./base");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ class ListDirectoryTool extends base_1.BaseTool {
41
+ name = 'list_directory';
42
+ description = 'Lists the names of files and subdirectories directly within a specified directory path.';
43
+ parameters = {
44
+ type: 'object',
45
+ properties: {
46
+ path: {
47
+ type: 'string',
48
+ description: 'The absolute path to the directory to list'
49
+ },
50
+ ignore: {
51
+ type: 'array',
52
+ items: { type: 'string' },
53
+ description: 'List of glob patterns to ignore'
54
+ }
55
+ },
56
+ required: ['path']
57
+ };
58
+ async execute(params, options) {
59
+ this.validateRequired(params, ['path']);
60
+ const dirPath = params.path;
61
+ const workingDir = options?.workingDirectory || process.cwd();
62
+ const resolvedPath = path.isAbsolute(dirPath) ? dirPath : path.join(workingDir, dirPath);
63
+ try {
64
+ const entries = await fs.readdir(resolvedPath, { withFileTypes: true });
65
+ let items = entries.map(entry => {
66
+ const prefix = entry.isDirectory() ? '📁 ' : '📄 ';
67
+ return prefix + entry.name;
68
+ });
69
+ // Apply ignore patterns if provided
70
+ if (params.ignore && params.ignore.length > 0) {
71
+ const ignorePatterns = params.ignore;
72
+ items = items.filter(item => {
73
+ const name = item.substring(2); // Remove prefix
74
+ return !ignorePatterns.some(pattern => {
75
+ if (pattern.includes('*')) {
76
+ const regex = new RegExp(pattern.replace(/\*/g, '.*'));
77
+ return regex.test(name);
78
+ }
79
+ return name === pattern;
80
+ });
81
+ });
82
+ }
83
+ if (items.length === 0) {
84
+ return `Directory ${resolvedPath} is empty.`;
85
+ }
86
+ return `Contents of ${resolvedPath}:\n\n${items.join('\n')}`;
87
+ }
88
+ catch (error) {
89
+ return (0, base_1.formatToolError)(error);
90
+ }
91
+ }
92
+ }
93
+ exports.ListDirectoryTool = ListDirectoryTool;
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1kaXJlY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvbGlzdC1kaXJlY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQXVFO0FBQ3ZFLGdEQUFrQztBQUNsQywyQ0FBNkI7QUFPN0IsTUFBYSxpQkFBa0IsU0FBUSxlQUE2QjtJQUNsRSxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDeEIsV0FBVyxHQUFHLHlGQUF5RixDQUFDO0lBQ3hHLFVBQVUsR0FBRztRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw0Q0FBNEM7YUFDMUQ7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLE9BQU87Z0JBQ2IsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDekIsV0FBVyxFQUFFLGlDQUFpQzthQUMvQztTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO0tBQ25CLENBQUM7SUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQTJCLEVBQUUsT0FBNEI7UUFDckUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFeEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFekYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRXhFLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ25ELE9BQU8sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7WUFFSCxvQ0FBb0M7WUFDcEMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNyQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtvQkFDaEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ3BDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUN2RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzFCLENBQUM7d0JBQ0QsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDO29CQUMxQixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sYUFBYSxZQUFZLFlBQVksQ0FBQztZQUMvQyxDQUFDO1lBRUQsT0FBTyxlQUFlLFlBQVksUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUEsc0JBQWUsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMURELDhDQTBEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUb29sLCBUb29sRXhlY3V0ZU9wdGlvbnMsIGZvcm1hdFRvb2xFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbnRlcmZhY2UgTGlzdERpcmVjdG9yeVBhcmFtcyB7XG4gIHBhdGg6IHN0cmluZztcbiAgaWdub3JlPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0RGlyZWN0b3J5VG9vbCBleHRlbmRzIEJhc2VUb29sPExpc3REaXJlY3RvcnlQYXJhbXM+IHtcbiAgbmFtZSA9ICdsaXN0X2RpcmVjdG9yeSc7XG4gIGRlc2NyaXB0aW9uID0gJ0xpc3RzIHRoZSBuYW1lcyBvZiBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgZGlyZWN0bHkgd2l0aGluIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBwYXRoLic7XG4gIHBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgcGF0aDoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGxpc3QnXG4gICAgICB9LFxuICAgICAgaWdub3JlOiB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIGl0ZW1zOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBnbG9iIHBhdHRlcm5zIHRvIGlnbm9yZSdcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3BhdGgnXVxuICB9O1xuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBMaXN0RGlyZWN0b3J5UGFyYW1zLCBvcHRpb25zPzogVG9vbEV4ZWN1dGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLnZhbGlkYXRlUmVxdWlyZWQocGFyYW1zLCBbJ3BhdGgnXSk7XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IG9wdGlvbnM/LndvcmtpbmdEaXJlY3RvcnkgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGlyUGF0aCkgPyBkaXJQYXRoIDogcGF0aC5qb2luKHdvcmtpbmdEaXIsIGRpclBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHJlc29sdmVkUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBsZXQgaXRlbXMgPSBlbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGVudHJ5LmlzRGlyZWN0b3J5KCkgPyAn8J+TgSAnIDogJ/Cfk4QgJztcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIGVudHJ5Lm5hbWU7XG4gICAgICB9KTtcblxuICAgICAgLy8gQXBwbHkgaWdub3JlIHBhdHRlcm5zIGlmIHByb3ZpZGVkXG4gICAgICBpZiAocGFyYW1zLmlnbm9yZSAmJiBwYXJhbXMuaWdub3JlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaWdub3JlUGF0dGVybnMgPSBwYXJhbXMuaWdub3JlO1xuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gaXRlbS5zdWJzdHJpbmcoMik7IC8vIFJlbW92ZSBwcmVmaXhcbiAgICAgICAgICByZXR1cm4gIWlnbm9yZVBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiB7XG4gICAgICAgICAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnKicpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLnJlcGxhY2UoL1xcKi9nLCAnLionKSk7XG4gICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IHBhdHRlcm47XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBgRGlyZWN0b3J5ICR7cmVzb2x2ZWRQYXRofSBpcyBlbXB0eS5gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYENvbnRlbnRzIG9mICR7cmVzb2x2ZWRQYXRofTpcXG5cXG4ke2l0ZW1zLmpvaW4oJ1xcbicpfWA7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmb3JtYXRUb29sRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,32 @@
1
+ import { BaseTool, ToolExecuteOptions } from './base';
2
+ interface PDFExtractParams {
3
+ file_path: string;
4
+ pages?: string;
5
+ extract_images?: boolean;
6
+ }
7
+ export declare class PDFExtractTool extends BaseTool<PDFExtractParams> {
8
+ name: string;
9
+ description: string;
10
+ parameters: {
11
+ type: string;
12
+ properties: {
13
+ file_path: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ pages: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ extract_images: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ execute(params: PDFExtractParams, options?: ToolExecuteOptions): Promise<string>;
29
+ private extractSimpleText;
30
+ private formatBytes;
31
+ }
32
+ export {};
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PDFExtractTool = void 0;
37
+ const base_1 = require("./base");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ class PDFExtractTool extends base_1.BaseTool {
41
+ name = 'pdf_extract';
42
+ description = 'Extracts text and optionally images from PDF files.';
43
+ parameters = {
44
+ type: 'object',
45
+ properties: {
46
+ file_path: {
47
+ type: 'string',
48
+ description: 'The absolute path to the PDF file'
49
+ },
50
+ pages: {
51
+ type: 'string',
52
+ description: 'Pages to extract (e.g., "1-5" or "1,3,5")'
53
+ },
54
+ extract_images: {
55
+ type: 'boolean',
56
+ description: 'Whether to extract images from the PDF'
57
+ }
58
+ },
59
+ required: ['file_path']
60
+ };
61
+ async execute(params, options) {
62
+ this.validateRequired(params, ['file_path']);
63
+ const workingDir = options?.workingDirectory || process.cwd();
64
+ const filePath = path.isAbsolute(params.file_path)
65
+ ? params.file_path
66
+ : path.join(workingDir, params.file_path);
67
+ try {
68
+ // 检查文件是否存在
69
+ const stats = await fs.stat(filePath);
70
+ if (!stats.isFile()) {
71
+ return `Error: ${filePath} is not a file`;
72
+ }
73
+ // 检查文件扩展名
74
+ const ext = path.extname(filePath).toLowerCase();
75
+ if (ext !== '.pdf') {
76
+ return `Error: ${filePath} is not a PDF file`;
77
+ }
78
+ // 读取PDF文件头
79
+ const buffer = await fs.readFile(filePath);
80
+ const header = buffer.slice(0, 8).toString();
81
+ if (!header.startsWith('%PDF')) {
82
+ return `Error: ${filePath} is not a valid PDF file`;
83
+ }
84
+ // 简单的PDF信息提取(实际项目中应使用专门的PDF库)
85
+ const fileSize = stats.size;
86
+ const textContent = await this.extractSimpleText(buffer);
87
+ let result = `PDF File: ${filePath}
88
+ Size: ${this.formatBytes(fileSize)}
89
+ Pages: Not determined (requires PDF parsing library)
90
+
91
+ Extracted Text Preview:
92
+ ${textContent.substring(0, 5000)}${textContent.length > 5000 ? '\n... [truncated]' : ''}`;
93
+ if (params.extract_images) {
94
+ result += '\n\nNote: Image extraction requires additional libraries (pdf2pic, pdf-poppler, etc.)';
95
+ }
96
+ return result;
97
+ }
98
+ catch (error) {
99
+ return (0, base_1.formatToolError)(error);
100
+ }
101
+ }
102
+ async extractSimpleText(buffer) {
103
+ // 非常简单的PDF文本提取(仅用于演示)
104
+ // 实际项目中应使用 pdf-parse 或类似的库
105
+ let text = '';
106
+ const content = buffer.toString('binary');
107
+ // 查找文本流
108
+ const streamRegex = /stream\r?\n([\s\S]*?)\r?\nendstream/g;
109
+ let match;
110
+ while ((match = streamRegex.exec(content)) !== null) {
111
+ const stream = match[1];
112
+ // 尝试提取可打印字符
113
+ const printable = stream.replace(/[^\x20-\x7E\n\r\t]/g, '');
114
+ if (printable.length > 10) {
115
+ text += printable + '\n';
116
+ }
117
+ }
118
+ return text || 'No extractable text found (PDF may be scanned or encrypted)';
119
+ }
120
+ formatBytes(bytes) {
121
+ if (bytes === 0)
122
+ return '0 Bytes';
123
+ const k = 1024;
124
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
125
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
126
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
127
+ }
128
+ }
129
+ exports.PDFExtractTool = PDFExtractTool;
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWV4dHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvcGRmLWV4dHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQXVFO0FBQ3ZFLGdEQUFrQztBQUNsQywyQ0FBNkI7QUFRN0IsTUFBYSxjQUFlLFNBQVEsZUFBMEI7SUFDNUQsSUFBSSxHQUFHLGFBQWEsQ0FBQztJQUNyQixXQUFXLEdBQUcscURBQXFELENBQUM7SUFDcEUsVUFBVSxHQUFHO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLG1DQUFtQzthQUNqRDtZQUNELEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsMkNBQTJDO2FBQ3pEO1lBQ0QsY0FBYyxFQUFFO2dCQUNkLElBQUksRUFBRSxTQUFTO2dCQUNmLFdBQVcsRUFBRSx3Q0FBd0M7YUFDdEQ7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQztLQUN4QixDQUFDO0lBRUYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUF3QixFQUFFLE9BQTRCO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sVUFBVSxHQUFHLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUztZQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxD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QUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7Q0FDRjtBQXRHRCx3Q0FzR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVG9vbCwgVG9vbEV4ZWN1dGVPcHRpb25zLCBmb3JtYXRUb29sRXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW50ZXJmYWNlIFBERkV4dHJhY3RQYXJhbXMge1xuICBmaWxlX3BhdGg6IHN0cmluZztcbiAgcGFnZXM/OiBzdHJpbmc7IC8vIGUuZy4sIFwiMS01XCIgb3IgXCIxLDMsNVwiXG4gIGV4dHJhY3RfaW1hZ2VzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBERkV4dHJhY3RUb29sIGV4dGVuZHMgQmFzZVRvb2w8UERGRXh0cmFjdFBhcmFtcz4ge1xuICBuYW1lID0gJ3BkZl9leHRyYWN0JztcbiAgZGVzY3JpcHRpb24gPSAnRXh0cmFjdHMgdGV4dCBhbmQgb3B0aW9uYWxseSBpbWFnZXMgZnJvbSBQREYgZmlsZXMuJztcbiAgcGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBmaWxlX3BhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIFBERiBmaWxlJ1xuICAgICAgfSxcbiAgICAgIHBhZ2VzOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1BhZ2VzIHRvIGV4dHJhY3QgKGUuZy4sIFwiMS01XCIgb3IgXCIxLDMsNVwiKSdcbiAgICAgIH0sXG4gICAgICBleHRyYWN0X2ltYWdlczoge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBleHRyYWN0IGltYWdlcyBmcm9tIHRoZSBQREYnXG4gICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogWydmaWxlX3BhdGgnXVxuICB9O1xuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBQREZFeHRyYWN0UGFyYW1zLCBvcHRpb25zPzogVG9vbEV4ZWN1dGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLnZhbGlkYXRlUmVxdWlyZWQocGFyYW1zLCBbJ2ZpbGVfcGF0aCddKTtcblxuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBvcHRpb25zPy53b3JraW5nRGlyZWN0b3J5IHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocGFyYW1zLmZpbGVfcGF0aCkgXG4gICAgICA/IHBhcmFtcy5maWxlX3BhdGggXG4gICAgICA6IHBhdGguam9pbih3b3JraW5nRGlyLCBwYXJhbXMuZmlsZV9wYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDmo4Dmn6Xmlofku7bmmK/lkKblrZjlnKhcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgICBpZiAoIXN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgIHJldHVybiBgRXJyb3I6ICR7ZmlsZVBhdGh9IGlzIG5vdCBhIGZpbGVgO1xuICAgICAgfVxuXG4gICAgICAvLyDmo4Dmn6Xmlofku7bmianlsZXlkI1cbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChleHQgIT09ICcucGRmJykge1xuICAgICAgICByZXR1cm4gYEVycm9yOiAke2ZpbGVQYXRofSBpcyBub3QgYSBQREYgZmlsZWA7XG4gICAgICB9XG5cbiAgICAgIC8vIOivu+WPllBERuaWh+S7tuWktFxuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgaGVhZGVyID0gYnVmZmVyLnNsaWNlKDAsIDgpLnRvU3RyaW5nKCk7XG4gICAgICBcbiAgICAgIGlmICghaGVhZGVyLnN0YXJ0c1dpdGgoJyVQREYnKSkge1xuICAgICAgICByZXR1cm4gYEVycm9yOiAke2ZpbGVQYXRofSBpcyBub3QgYSB2YWxpZCBQREYgZmlsZWA7XG4gICAgICB9XG5cbiAgICAgIC8vIOeugOWNleeahFBERuS/oeaBr+aPkOWPlu+8iOWunumZhemhueebruS4reW6lOS9v+eUqOS4k+mXqOeahFBERuW6k++8iVxuICAgICAgY29uc3QgZmlsZVNpemUgPSBzdGF0cy5zaXplO1xuICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBhd2FpdCB0aGlzLmV4dHJhY3RTaW1wbGVUZXh0KGJ1ZmZlcik7XG5cbiAgICAgIGxldCByZXN1bHQgPSBgUERGIEZpbGU6ICR7ZmlsZVBhdGh9XG5TaXplOiAke3RoaXMuZm9ybWF0Qnl0ZXMoZmlsZVNpemUpfVxuUGFnZXM6IE5vdCBkZXRlcm1pbmVkIChyZXF1aXJlcyBQREYgcGFyc2luZyBsaWJyYXJ5KVxuXG5FeHRyYWN0ZWQgVGV4dCBQcmV2aWV3OlxuJHt0ZXh0Q29udGVudC5zdWJzdHJpbmcoMCwgNTAwMCl9JHt0ZXh0Q29udGVudC5sZW5ndGggPiA1MDAwID8gJ1xcbi4uLiBbdHJ1bmNhdGVkXScgOiAnJ31gO1xuXG4gICAgICBpZiAocGFyYW1zLmV4dHJhY3RfaW1hZ2VzKSB7XG4gICAgICAgIHJlc3VsdCArPSAnXFxuXFxuTm90ZTogSW1hZ2UgZXh0cmFjdGlvbiByZXF1aXJlcyBhZGRpdGlvbmFsIGxpYnJhcmllcyAocGRmMnBpYywgcGRmLXBvcHBsZXIsIGV0Yy4pJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VG9vbEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4dHJhY3RTaW1wbGVUZXh0KGJ1ZmZlcjogQnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDpnZ7luLjnroDljZXnmoRQREbmlofmnKzmj5Dlj5bvvIjku4XnlKjkuo7mvJTnpLrvvIlcbiAgICAvLyDlrp7pmYXpobnnm67kuK3lupTkvb/nlKggcGRmLXBhcnNlIOaIluexu+S8vOeahOW6k1xuICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgY29uc3QgY29udGVudCA9IGJ1ZmZlci50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgXG4gICAgLy8g5p+l5om+5paH5pys5rWBXG4gICAgY29uc3Qgc3RyZWFtUmVnZXggPSAvc3RyZWFtXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG5lbmRzdHJlYW0vZztcbiAgICBsZXQgbWF0Y2g7XG4gICAgXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0cmVhbVJlZ2V4LmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBtYXRjaFsxXTtcbiAgICAgIC8vIOWwneivleaPkOWPluWPr+aJk+WNsOWtl+esplxuICAgICAgY29uc3QgcHJpbnRhYmxlID0gc3RyZWFtLnJlcGxhY2UoL1teXFx4MjAtXFx4N0VcXG5cXHJcXHRdL2csICcnKTtcbiAgICAgIGlmIChwcmludGFibGUubGVuZ3RoID4gMTApIHtcbiAgICAgICAgdGV4dCArPSBwcmludGFibGUgKyAnXFxuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dCB8fCAnTm8gZXh0cmFjdGFibGUgdGV4dCBmb3VuZCAoUERGIG1heSBiZSBzY2FubmVkIG9yIGVuY3J5cHRlZCknO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJ107XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDIpKSArICcgJyArIHNpemVzW2ldO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,31 @@
1
+ import { BaseTool, ToolExecuteOptions } from './base';
2
+ interface ReadFileParams {
3
+ absolute_path: string;
4
+ offset?: number;
5
+ limit?: number;
6
+ }
7
+ export declare class ReadFileTool extends BaseTool<ReadFileParams> {
8
+ name: string;
9
+ description: string;
10
+ parameters: {
11
+ type: string;
12
+ properties: {
13
+ absolute_path: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ offset: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ limit: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ execute(params: ReadFileParams, options?: ToolExecuteOptions): Promise<string>;
29
+ private getMimeType;
30
+ }
31
+ export {};
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ReadFileTool = void 0;
37
+ const base_1 = require("./base");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ class ReadFileTool extends base_1.BaseTool {
41
+ name = 'read_file';
42
+ description = 'Reads and returns the content of a specified file from the local filesystem. Handles text files, images, PDF files, and more. For text files, it can read specific line ranges.';
43
+ parameters = {
44
+ type: 'object',
45
+ properties: {
46
+ absolute_path: {
47
+ type: 'string',
48
+ description: 'The absolute path to the file to read'
49
+ },
50
+ offset: {
51
+ type: 'number',
52
+ description: 'Optional: For text files, the 0-based line number to start reading from'
53
+ },
54
+ limit: {
55
+ type: 'number',
56
+ description: 'Optional: For text files, maximum number of lines to read'
57
+ }
58
+ },
59
+ required: ['absolute_path']
60
+ };
61
+ async execute(params, options) {
62
+ this.validateRequired(params, ['absolute_path']);
63
+ const filePath = params.absolute_path;
64
+ const workingDir = options?.workingDirectory || process.cwd();
65
+ const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(workingDir, filePath);
66
+ try {
67
+ const stats = await fs.stat(resolvedPath);
68
+ if (stats.isDirectory()) {
69
+ return `Error: ${resolvedPath} is a directory, not a file. Use list_directory instead.`;
70
+ }
71
+ // Check file type
72
+ const ext = path.extname(resolvedPath).toLowerCase();
73
+ const imageExts = ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp'];
74
+ if (imageExts.includes(ext)) {
75
+ // For images, return base64 info
76
+ const buffer = await fs.readFile(resolvedPath);
77
+ const base64 = buffer.toString('base64');
78
+ const mimeType = this.getMimeType(ext);
79
+ return `Image file: ${resolvedPath}\nBase64 data: data:${mimeType};base64,${base64.substring(0, 100)}...\n[Base64 data too long to display, use image_read tool for full content]`;
80
+ }
81
+ // Read as text
82
+ const content = await fs.readFile(resolvedPath, 'utf-8');
83
+ const lines = content.split('\n');
84
+ if (params.offset !== undefined || params.limit !== undefined) {
85
+ const offset = params.offset || 0;
86
+ const limit = params.limit || lines.length - offset;
87
+ const selectedLines = lines.slice(offset, offset + limit);
88
+ return selectedLines.join('\n');
89
+ }
90
+ // Limit output for very large files
91
+ if (content.length > 100000) {
92
+ const truncatedLines = lines.slice(0, 500);
93
+ return truncatedLines.join('\n') +
94
+ `\n\n... [File truncated, showing first 500 lines of ${lines.length} total lines]`;
95
+ }
96
+ return content;
97
+ }
98
+ catch (error) {
99
+ return (0, base_1.formatToolError)(error);
100
+ }
101
+ }
102
+ getMimeType(ext) {
103
+ const mimeTypes = {
104
+ '.png': 'image/png',
105
+ '.jpg': 'image/jpeg',
106
+ '.jpeg': 'image/jpeg',
107
+ '.gif': 'image/gif',
108
+ '.webp': 'image/webp',
109
+ '.svg': 'image/svg+xml',
110
+ '.bmp': 'image/bmp'
111
+ };
112
+ return mimeTypes[ext] || 'application/octet-stream';
113
+ }
114
+ }
115
+ exports.ReadFileTool = ReadFileTool;
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1maWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL3JlYWQtZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQ0FBdUU7QUFDdkUsZ0RBQWtDO0FBQ2xDLDJDQUE2QjtBQVE3QixNQUFhLFlBQWEsU0FBUSxlQUF3QjtJQUN4RCxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQ25CLFdBQVcsR0FBRyxpTEFBaUwsQ0FBQztJQUNoTSxVQUFVLEdBQUc7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLGFBQWEsRUFBRTtnQkFDYixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsdUNBQXVDO2FBQ3JEO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5RUFBeUU7YUFDdkY7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDJEQUEyRDthQUN6RTtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO0tBQzVCLENBQUM7SUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXNCLEVBQUUsT0FBNEI7UUFDaEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxD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aW1wb3J0IHsgQmFzZVRvb2wsIFRvb2xFeGVjdXRlT3B0aW9ucywgZm9ybWF0VG9vbEVycm9yIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmludGVyZmFjZSBSZWFkRmlsZVBhcmFtcyB7XG4gIGFic29sdXRlX3BhdGg6IHN0cmluZztcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlYWRGaWxlVG9vbCBleHRlbmRzIEJhc2VUb29sPFJlYWRGaWxlUGFyYW1zPiB7XG4gIG5hbWUgPSAncmVhZF9maWxlJztcbiAgZGVzY3JpcHRpb24gPSAnUmVhZHMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSBzcGVjaWZpZWQgZmlsZSBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtLiBIYW5kbGVzIHRleHQgZmlsZXMsIGltYWdlcywgUERGIGZpbGVzLCBhbmQgbW9yZS4gRm9yIHRleHQgZmlsZXMsIGl0IGNhbiByZWFkIHNwZWNpZmljIGxpbmUgcmFuZ2VzLic7XG4gIHBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgYWJzb2x1dGVfcGF0aDoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkJ1xuICAgICAgfSxcbiAgICAgIG9mZnNldDoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbDogRm9yIHRleHQgZmlsZXMsIHRoZSAwLWJhc2VkIGxpbmUgbnVtYmVyIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSdcbiAgICAgIH0sXG4gICAgICBsaW1pdDoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbDogRm9yIHRleHQgZmlsZXMsIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHJlYWQnXG4gICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogWydhYnNvbHV0ZV9wYXRoJ11cbiAgfTtcblxuICBhc3luYyBleGVjdXRlKHBhcmFtczogUmVhZEZpbGVQYXJhbXMsIG9wdGlvbnM/OiBUb29sRXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZChwYXJhbXMsIFsnYWJzb2x1dGVfcGF0aCddKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGFyYW1zLmFic29sdXRlX3BhdGg7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IG9wdGlvbnM/LndvcmtpbmdEaXJlY3RvcnkgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpID8gZmlsZVBhdGggOiBwYXRoLmpvaW4od29ya2luZ0RpciwgZmlsZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChyZXNvbHZlZFBhdGgpO1xuICAgICAgXG4gICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZXR1cm4gYEVycm9yOiAke3Jlc29sdmVkUGF0aH0gaXMgYSBkaXJlY3RvcnksIG5vdCBhIGZpbGUuIFVzZSBsaXN0X2RpcmVjdG9yeSBpbnN0ZWFkLmA7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZpbGUgdHlwZVxuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKHJlc29sdmVkUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGltYWdlRXh0cyA9IFsnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLndlYnAnLCAnLnN2ZycsICcuYm1wJ107XG4gICAgICBcbiAgICAgIGlmIChpbWFnZUV4dHMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICAvLyBGb3IgaW1hZ2VzLCByZXR1cm4gYmFzZTY0IGluZm9cbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucmVhZEZpbGUocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZTY0ID0gYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmdldE1pbWVUeXBlKGV4dCk7XG4gICAgICAgIHJldHVybiBgSW1hZ2UgZmlsZTogJHtyZXNvbHZlZFBhdGh9XFxuQmFzZTY0IGRhdGE6IGRhdGE6JHttaW1lVHlwZX07YmFzZTY0LCR7YmFzZTY0LnN1YnN0cmluZygwLCAxMDApfS4uLlxcbltCYXNlNjQgZGF0YSB0b28gbG9uZyB0byBkaXNwbGF5LCB1c2UgaW1hZ2VfcmVhZCB0b29sIGZvciBmdWxsIGNvbnRlbnRdYDtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBhcyB0ZXh0XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocmVzb2x2ZWRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgIGlmIChwYXJhbXMub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHwgcGFyYW1zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyYW1zLm9mZnNldCB8fCAwO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHBhcmFtcy5saW1pdCB8fCBsaW5lcy5sZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGluZXMgPSBsaW5lcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGxpbWl0KTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkTGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIExpbWl0IG91dHB1dCBmb3IgdmVyeSBsYXJnZSBmaWxlc1xuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gMTAwMDAwKSB7XG4gICAgICAgIGNvbnN0IHRydW5jYXRlZExpbmVzID0gbGluZXMuc2xpY2UoMCwgNTAwKTtcbiAgICAgICAgcmV0dXJuIHRydW5jYXRlZExpbmVzLmpvaW4oJ1xcbicpICsgXG4gICAgICAgICAgYFxcblxcbi4uLiBbRmlsZSB0cnVuY2F0ZWQsIHNob3dpbmcgZmlyc3QgNTAwIGxpbmVzIG9mICR7bGluZXMubGVuZ3RofSB0b3RhbCBsaW5lc11gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZvcm1hdFRvb2xFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNaW1lVHlwZShleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWltZVR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgICAgICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAgICAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgICAgICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbiAgICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAgICAgJy5ibXAnOiAnaW1hZ2UvYm1wJ1xuICAgIH07XG4gICAgcmV0dXJuIG1pbWVUeXBlc1tleHRdIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { BaseTool, ToolExecuteOptions } from './base';
2
+ interface ReplaceParams {
3
+ file_path: string;
4
+ old_string: string;
5
+ new_string: string;
6
+ instruction?: string;
7
+ }
8
+ export declare class ReplaceTool extends BaseTool<ReplaceParams> {
9
+ name: string;
10
+ description: string;
11
+ parameters: {
12
+ type: string;
13
+ properties: {
14
+ file_path: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ old_string: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ new_string: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ instruction: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ };
31
+ required: string[];
32
+ };
33
+ execute(params: ReplaceParams, options?: ToolExecuteOptions): Promise<string>;
34
+ }
35
+ export {};
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ReplaceTool = void 0;
37
+ const base_1 = require("./base");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ class ReplaceTool extends base_1.BaseTool {
41
+ name = 'replace';
42
+ description = 'Replaces text within a file. Requires exact matching of the old_string.';
43
+ parameters = {
44
+ type: 'object',
45
+ properties: {
46
+ file_path: {
47
+ type: 'string',
48
+ description: 'The absolute path to the file to modify'
49
+ },
50
+ old_string: {
51
+ type: 'string',
52
+ description: 'The exact literal text to replace'
53
+ },
54
+ new_string: {
55
+ type: 'string',
56
+ description: 'The exact literal text to replace with'
57
+ },
58
+ instruction: {
59
+ type: 'string',
60
+ description: 'Detailed instruction of what needs to be changed'
61
+ }
62
+ },
63
+ required: ['file_path', 'old_string', 'new_string']
64
+ };
65
+ async execute(params, options) {
66
+ this.validateRequired(params, ['file_path', 'old_string', 'new_string']);
67
+ 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);
71
+ 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 occurrences = content.split(params.old_string).length - 1;
79
+ 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.`;
81
+ }
82
+ // Perform replacement
83
+ 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}`;
86
+ }
87
+ catch (error) {
88
+ return (0, base_1.formatToolError)(error);
89
+ }
90
+ }
91
+ }
92
+ exports.ReplaceTool = ReplaceTool;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9yZXBsYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUF1RTtBQUN2RSxnREFBa0M7QUFDbEMsMkNBQTZCO0FBUzdCLE1BQWEsV0FBWSxTQUFRLGVBQXVCO0lBQ3RELElBQUksR0FBRyxTQUFTLENBQUM7SUFDakIsV0FBVyxHQUFHLHlFQUF5RSxDQUFDO0lBQ3hGLFVBQVUsR0FBRztRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5Q0FBeUM7YUFDdkQ7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLG1DQUFtQzthQUNqRDtZQUNELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsd0NBQXdDO2FBQ3REO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxrREFBa0Q7YUFDaEU7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDO0tBQ3BELENBQUM7SUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXFCLEVBQUUsT0FBNEI7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV6RSxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNoRCxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXJELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBTywwQ0FBMEMsUUFBUSx3REFBd0QsQ0FBQztZQUNwSCxDQUFDO1lBRUQsaUNBQWlDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sZ0JBQWdCLFdBQVcscUlBQXFJLENBQUM7WUFDMUssQ0FBQztZQUVELHNCQUFzQjtZQUN0QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRWxELE9BQU8saUNBQWlDLFFBQVEsRUFBRSxDQUFDO1FBQ3JELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFBLHNCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXpERCxrQ0F5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVG9vbCwgVG9vbEV4ZWN1dGVPcHRpb25zLCBmb3JtYXRUb29sRXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW50ZXJmYWNlIFJlcGxhY2VQYXJhbXMge1xuICBmaWxlX3BhdGg6IHN0cmluZztcbiAgb2xkX3N0cmluZzogc3RyaW5nO1xuICBuZXdfc3RyaW5nOiBzdHJpbmc7XG4gIGluc3RydWN0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmVwbGFjZVRvb2wgZXh0ZW5kcyBCYXNlVG9vbDxSZXBsYWNlUGFyYW1zPiB7XG4gIG5hbWUgPSAncmVwbGFjZSc7XG4gIGRlc2NyaXB0aW9uID0gJ1JlcGxhY2VzIHRleHQgd2l0aGluIGEgZmlsZS4gUmVxdWlyZXMgZXhhY3QgbWF0Y2hpbmcgb2YgdGhlIG9sZF9zdHJpbmcuJztcbiAgcGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBmaWxlX3BhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgdG8gbW9kaWZ5J1xuICAgICAgfSxcbiAgICAgIG9sZF9zdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGV4YWN0IGxpdGVyYWwgdGV4dCB0byByZXBsYWNlJ1xuICAgICAgfSxcbiAgICAgIG5ld19zdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGV4YWN0IGxpdGVyYWwgdGV4dCB0byByZXBsYWNlIHdpdGgnXG4gICAgICB9LFxuICAgICAgaW5zdHJ1Y3Rpb246IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRGV0YWlsZWQgaW5zdHJ1Y3Rpb24gb2Ygd2hhdCBuZWVkcyB0byBiZSBjaGFuZ2VkJ1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnZmlsZV9wYXRoJywgJ29sZF9zdHJpbmcnLCAnbmV3X3N0cmluZyddXG4gIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFJlcGxhY2VQYXJhbXMsIG9wdGlvbnM/OiBUb29sRXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZChwYXJhbXMsIFsnZmlsZV9wYXRoJywgJ29sZF9zdHJpbmcnLCAnbmV3X3N0cmluZyddKTtcblxuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBvcHRpb25zPy53b3JraW5nRGlyZWN0b3J5IHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocGFyYW1zLmZpbGVfcGF0aCkgXG4gICAgICA/IHBhcmFtcy5maWxlX3BhdGggXG4gICAgICA6IHBhdGguam9pbih3b3JraW5nRGlyLCBwYXJhbXMuZmlsZV9wYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAvLyBDaGVjayBpZiBvbGRfc3RyaW5nIGV4aXN0c1xuICAgICAgaWYgKCFjb250ZW50LmluY2x1ZGVzKHBhcmFtcy5vbGRfc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gYEVycm9yOiBUaGUgb2xkX3N0cmluZyB3YXMgbm90IGZvdW5kIGluICR7ZmlsZVBhdGh9LiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBmaXJzdCB0byBlbnN1cmUgZXhhY3QgbWF0Y2hpbmcuYDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIG11bHRpcGxlIG9jY3VycmVuY2VzXG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQocGFyYW1zLm9sZF9zdHJpbmcpLmxlbmd0aCAtIDE7XG4gICAgICBpZiAob2NjdXJyZW5jZXMgPiAxKSB7XG4gICAgICAgIHJldHVybiBgRXJyb3I6IEZvdW5kICR7b2NjdXJyZW5jZXN9IG9jY3VycmVuY2VzIG9mIG9sZF9zdHJpbmcuIFRoZSBvbGRfc3RyaW5nIG11c3QgdW5pcXVlbHkgaWRlbnRpZnkgYSBzaW5nbGUgaW5zdGFuY2UuIFBsZWFzZSBpbmNsdWRlIG1vcmUgY29udGV4dCB0byBtYWtlIGl0IHVuaXF1ZS5gO1xuICAgICAgfVxuXG4gICAgICAvLyBQZXJmb3JtIHJlcGxhY2VtZW50XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKHBhcmFtcy5vbGRfc3RyaW5nLCBwYXJhbXMubmV3X3N0cmluZyk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsICd1dGYtOCcpO1xuXG4gICAgICByZXR1cm4gYFN1Y2Nlc3NmdWxseSByZXBsYWNlZCB0ZXh0IGluICR7ZmlsZVBhdGh9YDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZvcm1hdFRvb2xFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { BaseTool, ToolExecuteOptions } from './base';
2
+ interface RunShellCommandParams {
3
+ command: string;
4
+ description?: string;
5
+ timeout?: number;
6
+ run_in_bg?: boolean;
7
+ }
8
+ export declare class RunShellCommandTool extends BaseTool<RunShellCommandParams> {
9
+ name: string;
10
+ description: string;
11
+ parameters: {
12
+ type: string;
13
+ properties: {
14
+ command: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ description: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ timeout: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ run_in_bg: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ };
31
+ required: string[];
32
+ };
33
+ execute(params: RunShellCommandParams, options?: ToolExecuteOptions): Promise<string>;
34
+ }
35
+ export {};