concevent-ai-agent-sdk 2.2.0 → 2.4.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 (73) hide show
  1. package/README.md +281 -0
  2. package/dist/core/agent.js +1 -1
  3. package/dist/core/agent.js.map +1 -1
  4. package/dist/core/orchestrator.d.ts.map +1 -1
  5. package/dist/core/orchestrator.js.map +1 -1
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +9 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/tools/bash-output.d.ts +19 -0
  11. package/dist/tools/bash-output.d.ts.map +1 -0
  12. package/dist/tools/bash-output.js +47 -0
  13. package/dist/tools/bash-output.js.map +1 -0
  14. package/dist/tools/bash.d.ts +25 -0
  15. package/dist/tools/bash.d.ts.map +1 -0
  16. package/dist/tools/bash.js +79 -0
  17. package/dist/tools/bash.js.map +1 -0
  18. package/dist/tools/edit.d.ts +28 -0
  19. package/dist/tools/edit.d.ts.map +1 -0
  20. package/dist/tools/edit.js +97 -0
  21. package/dist/tools/edit.js.map +1 -0
  22. package/dist/tools/glob.d.ts +25 -0
  23. package/dist/tools/glob.d.ts.map +1 -0
  24. package/dist/tools/glob.js +88 -0
  25. package/dist/tools/glob.js.map +1 -0
  26. package/dist/tools/grep.d.ts +31 -0
  27. package/dist/tools/grep.d.ts.map +1 -0
  28. package/dist/tools/grep.js +195 -0
  29. package/dist/tools/grep.js.map +1 -0
  30. package/dist/tools/index.d.ts +85 -0
  31. package/dist/tools/index.d.ts.map +1 -0
  32. package/dist/tools/index.js +141 -0
  33. package/dist/tools/index.js.map +1 -0
  34. package/dist/tools/kill-bash.d.ts +19 -0
  35. package/dist/tools/kill-bash.d.ts.map +1 -0
  36. package/dist/tools/kill-bash.js +49 -0
  37. package/dist/tools/kill-bash.js.map +1 -0
  38. package/dist/tools/read.d.ts +25 -0
  39. package/dist/tools/read.d.ts.map +1 -0
  40. package/dist/tools/read.js +103 -0
  41. package/dist/tools/read.js.map +1 -0
  42. package/dist/tools/task.d.ts +25 -0
  43. package/dist/tools/task.d.ts.map +1 -0
  44. package/dist/tools/task.js +71 -0
  45. package/dist/tools/task.js.map +1 -0
  46. package/dist/tools/todo-write.d.ts +46 -0
  47. package/dist/tools/todo-write.d.ts.map +1 -0
  48. package/dist/tools/todo-write.js +151 -0
  49. package/dist/tools/todo-write.js.map +1 -0
  50. package/dist/tools/types.d.ts +147 -0
  51. package/dist/tools/types.d.ts.map +1 -0
  52. package/dist/tools/types.js +16 -0
  53. package/dist/tools/types.js.map +1 -0
  54. package/dist/tools/utils/index.d.ts +3 -0
  55. package/dist/tools/utils/index.d.ts.map +1 -0
  56. package/dist/tools/utils/index.js +3 -0
  57. package/dist/tools/utils/index.js.map +1 -0
  58. package/dist/tools/utils/path.d.ts +40 -0
  59. package/dist/tools/utils/path.d.ts.map +1 -0
  60. package/dist/tools/utils/path.js +146 -0
  61. package/dist/tools/utils/path.js.map +1 -0
  62. package/dist/tools/utils/shell.d.ts +49 -0
  63. package/dist/tools/utils/shell.d.ts.map +1 -0
  64. package/dist/tools/utils/shell.js +232 -0
  65. package/dist/tools/utils/shell.js.map +1 -0
  66. package/dist/tools/write.d.ts +22 -0
  67. package/dist/tools/write.d.ts.map +1 -0
  68. package/dist/tools/write.js +70 -0
  69. package/dist/tools/write.js.map +1 -0
  70. package/dist/types/config.d.ts +6 -0
  71. package/dist/types/config.d.ts.map +1 -1
  72. package/dist/types/config.js.map +1 -1
  73. package/package.json +2 -2
@@ -0,0 +1,79 @@
1
+ import { z } from 'zod';
2
+ import { zodToJsonSchema } from 'zod-to-json-schema';
3
+ import { executeCommand, isCommandBlocked, DEFAULT_BLOCKED_COMMANDS } from './utils/shell.js';
4
+ import { resolvePath, isPathAllowed } from './utils/path.js';
5
+ /**
6
+ * Schema for the Bash tool parameters
7
+ */
8
+ export const bashSchema = z.object({
9
+ command: z.string().describe('The shell command to execute.'),
10
+ timeout_ms: z
11
+ .number()
12
+ .optional()
13
+ .describe('Timeout in milliseconds. Defaults to 30000 (30 seconds). Set to 0 for no timeout.'),
14
+ cwd: z
15
+ .string()
16
+ .optional()
17
+ .describe('Working directory for the command. Defaults to the configured working directory.'),
18
+ });
19
+ /**
20
+ * Creates the Bash tool for executing shell commands
21
+ */
22
+ export function createBashTool(config = {}, _processManager) {
23
+ const workingDirectory = config.workingDirectory || process.cwd();
24
+ const defaultTimeout = config.defaultTimeout ?? 30000;
25
+ const blockedPatterns = config.blockedCommands ?? DEFAULT_BLOCKED_COMMANDS;
26
+ return {
27
+ declaration: {
28
+ name: 'Bash',
29
+ description: `Executes a shell command and returns the output.
30
+ Uses the system's default shell (bash on Unix, cmd on Windows).
31
+
32
+ Returns stdout, stderr, and exit code.
33
+ Commands have a default timeout of 30 seconds.
34
+
35
+ SECURITY: Certain dangerous commands are blocked by default.`,
36
+ parametersJsonSchema: zodToJsonSchema(bashSchema),
37
+ },
38
+ executor: async (args, context) => {
39
+ const params = bashSchema.parse(args);
40
+ // Security check: block dangerous commands
41
+ const blockReason = isCommandBlocked(params.command, blockedPatterns);
42
+ if (blockReason) {
43
+ throw new Error(blockReason);
44
+ }
45
+ // Resolve working directory
46
+ const cwd = params.cwd ? resolvePath(params.cwd, workingDirectory) : workingDirectory;
47
+ // Security check for cwd
48
+ if (params.cwd && !isPathAllowed(cwd, config.allowedPaths)) {
49
+ throw new Error(`Access denied: working directory ${params.cwd} is outside allowed paths`);
50
+ }
51
+ const timeout = params.timeout_ms ?? defaultTimeout;
52
+ try {
53
+ const result = await executeCommand(params.command, {
54
+ cwd,
55
+ timeout,
56
+ abortSignal: context.abortSignal,
57
+ });
58
+ return {
59
+ command: params.command,
60
+ stdout: result.stdout,
61
+ stderr: result.stderr,
62
+ exit_code: result.exitCode,
63
+ timed_out: result.timedOut ?? false,
64
+ success: result.exitCode === 0,
65
+ message: result.timedOut
66
+ ? `Command timed out after ${timeout}ms`
67
+ : result.exitCode === 0
68
+ ? 'Command completed successfully'
69
+ : `Command failed with exit code ${result.exitCode}`,
70
+ };
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Failed to execute command: ${error.message}`);
74
+ }
75
+ },
76
+ parallel: false, // Shell commands should be sequential to avoid race conditions
77
+ };
78
+ }
79
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC7D,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mFAAmF,CAAC;IAChG,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kFAAkF,CAAC;CAChG,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAqB,EAAE,EACvB,eAAgC;IAEhC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClE,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC;IACtD,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,wBAAwB,CAAC;IAE3E,OAAO;QACL,WAAW,EAAE;YACX,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE;;;;;;6DAM0C;YACvD,oBAAoB,EAAE,eAAe,CAAC,UAAU,CAAC;SAClD;QACD,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,OAA4B,EAAE,EAAE;YACrD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEtC,2CAA2C;YAC3C,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACtE,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;YAED,4BAA4B;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAEtF,yBAAyB;YACzB,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,GAAG,2BAA2B,CAAC,CAAC;YAC7F,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,cAAc,CAAC;YAEpD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE;oBAClD,GAAG;oBACH,OAAO;oBACP,WAAW,EAAE,OAAO,CAAC,WAAW;iBACjC,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,SAAS,EAAE,MAAM,CAAC,QAAQ;oBAC1B,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;oBACnC,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC;oBAC9B,OAAO,EAAE,MAAM,CAAC,QAAQ;wBACtB,CAAC,CAAC,2BAA2B,OAAO,IAAI;wBACxC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC;4BACrB,CAAC,CAAC,gCAAgC;4BAClC,CAAC,CAAC,iCAAiC,MAAM,CAAC,QAAQ,EAAE;iBACzD,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,8BAA+B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,+DAA+D;KACjF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import type { ToolDefinition } from '../types/index.js';
3
+ import type { ToolConfig } from './types.js';
4
+ /**
5
+ * Schema for the Edit tool parameters
6
+ */
7
+ export declare const editSchema: z.ZodObject<{
8
+ file_path: z.ZodString;
9
+ old_string: z.ZodString;
10
+ new_string: z.ZodString;
11
+ replace_all: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ file_path: string;
14
+ old_string: string;
15
+ new_string: string;
16
+ replace_all: boolean;
17
+ }, {
18
+ file_path: string;
19
+ old_string: string;
20
+ new_string: string;
21
+ replace_all?: boolean | undefined;
22
+ }>;
23
+ export type EditParams = z.infer<typeof editSchema>;
24
+ /**
25
+ * Creates the Edit tool for targeted string replacement in files
26
+ */
27
+ export declare function createEditTool(config?: ToolConfig): ToolDefinition;
28
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;EAiBrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,UAAe,GAAG,cAAc,CAqFtE"}
@@ -0,0 +1,97 @@
1
+ import * as fs from 'fs/promises';
2
+ import { z } from 'zod';
3
+ import { zodToJsonSchema } from 'zod-to-json-schema';
4
+ import { resolvePath, isPathAllowed, isPathSafe } from './utils/path.js';
5
+ /**
6
+ * Schema for the Edit tool parameters
7
+ */
8
+ export const editSchema = z.object({
9
+ file_path: z
10
+ .string()
11
+ .describe('The path to the file to edit. Can be absolute or relative to working directory.'),
12
+ old_string: z
13
+ .string()
14
+ .describe('The exact string to find and replace. Must match exactly including whitespace and indentation.'),
15
+ new_string: z.string().describe('The string to replace old_string with.'),
16
+ replace_all: z
17
+ .boolean()
18
+ .optional()
19
+ .default(false)
20
+ .describe('If true, replace all occurrences. If false (default), replace only the first occurrence.'),
21
+ });
22
+ /**
23
+ * Creates the Edit tool for targeted string replacement in files
24
+ */
25
+ export function createEditTool(config = {}) {
26
+ const workingDirectory = config.workingDirectory || process.cwd();
27
+ return {
28
+ declaration: {
29
+ name: 'Edit',
30
+ description: `Performs targeted string replacement in a file.
31
+ The old_string must match exactly (including whitespace and indentation).
32
+ By default, only the first occurrence is replaced. Set replace_all to true to replace all occurrences.
33
+ The edit will FAIL if old_string is not found in the file.
34
+ TIP: Include enough context in old_string to make it unique within the file.`,
35
+ parametersJsonSchema: zodToJsonSchema(editSchema),
36
+ },
37
+ executor: async (args) => {
38
+ const params = editSchema.parse(args);
39
+ const resolvedPath = resolvePath(params.file_path, workingDirectory);
40
+ // Security checks
41
+ if (!isPathSafe(params.file_path, workingDirectory)) {
42
+ throw new Error(`Path traversal detected: ${params.file_path}`);
43
+ }
44
+ if (!isPathAllowed(resolvedPath, config.allowedPaths)) {
45
+ throw new Error(`Access denied: ${params.file_path} is outside allowed paths`);
46
+ }
47
+ // Check if file exists
48
+ try {
49
+ const stat = await fs.stat(resolvedPath);
50
+ if (!stat.isFile()) {
51
+ throw new Error(`Not a file: ${params.file_path}`);
52
+ }
53
+ }
54
+ catch (error) {
55
+ if (error.code === 'ENOENT') {
56
+ throw new Error(`File not found: ${params.file_path}`);
57
+ }
58
+ throw error;
59
+ }
60
+ // Read current content
61
+ const content = await fs.readFile(resolvedPath, 'utf-8');
62
+ // Check if old_string exists
63
+ if (!content.includes(params.old_string)) {
64
+ throw new Error(`String not found in file: The specified old_string was not found in ${params.file_path}. ` +
65
+ `Make sure the string matches exactly, including whitespace and indentation.`);
66
+ }
67
+ // Count occurrences before replacement
68
+ const occurrences = content.split(params.old_string).length - 1;
69
+ // Check for uniqueness if not replacing all
70
+ if (!params.replace_all && occurrences > 1) {
71
+ throw new Error(`Multiple occurrences found: old_string appears ${occurrences} times in the file. ` +
72
+ `Either provide more context to make it unique, or set replace_all to true.`);
73
+ }
74
+ // Perform replacement
75
+ let newContent;
76
+ let replacementCount;
77
+ if (params.replace_all) {
78
+ newContent = content.split(params.old_string).join(params.new_string);
79
+ replacementCount = occurrences;
80
+ }
81
+ else {
82
+ newContent = content.replace(params.old_string, params.new_string);
83
+ replacementCount = 1;
84
+ }
85
+ // Write the updated content
86
+ await fs.writeFile(resolvedPath, newContent, 'utf-8');
87
+ return {
88
+ success: true,
89
+ file_path: params.file_path,
90
+ replacements_made: replacementCount,
91
+ message: `Successfully replaced ${replacementCount} occurrence${replacementCount > 1 ? 's' : ''} in ${params.file_path}`,
92
+ };
93
+ },
94
+ parallel: false, // Editing should be sequential to avoid conflicts
95
+ };
96
+ }
97
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import type { ToolDefinition } from '../types/index.js';
3
+ import type { ToolConfig } from './types.js';
4
+ /**
5
+ * Schema for the Glob tool parameters
6
+ */
7
+ export declare const globSchema: z.ZodObject<{
8
+ pattern: z.ZodString;
9
+ cwd: z.ZodOptional<z.ZodString>;
10
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ pattern: string;
13
+ cwd?: string | undefined;
14
+ ignore?: string[] | undefined;
15
+ }, {
16
+ pattern: string;
17
+ cwd?: string | undefined;
18
+ ignore?: string[] | undefined;
19
+ }>;
20
+ export type GlobParams = z.infer<typeof globSchema>;
21
+ /**
22
+ * Creates the Glob tool for finding files matching patterns
23
+ */
24
+ export declare function createGlobTool(config?: ToolConfig): ToolDefinition;
25
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;EAWrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAkBpD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,UAAe,GAAG,cAAc,CA+DtE"}
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ import { zodToJsonSchema } from 'zod-to-json-schema';
3
+ import { resolvePath, isPathAllowed, walkDirectory, matchGlobPattern, getRelativePath, } from './utils/path.js';
4
+ /**
5
+ * Schema for the Glob tool parameters
6
+ */
7
+ export const globSchema = z.object({
8
+ pattern: z
9
+ .string()
10
+ .describe('Glob pattern to match files. Supports *, **, and ? wildcards. Examples: "*.ts", "src/**/*.js", "test_?.py"'),
11
+ cwd: z.string().optional().describe('Directory to search in. Defaults to working directory.'),
12
+ ignore: z
13
+ .array(z.string())
14
+ .optional()
15
+ .describe('Array of patterns to ignore. Example: ["node_modules/**", "*.test.ts"]'),
16
+ });
17
+ /**
18
+ * Default ignore patterns
19
+ */
20
+ const DEFAULT_IGNORE_PATTERNS = [
21
+ 'node_modules/**',
22
+ '.git/**',
23
+ '.next/**',
24
+ 'dist/**',
25
+ 'build/**',
26
+ 'coverage/**',
27
+ '__pycache__/**',
28
+ '.cache/**',
29
+ '.idea/**',
30
+ '.vscode/**',
31
+ ];
32
+ /**
33
+ * Creates the Glob tool for finding files matching patterns
34
+ */
35
+ export function createGlobTool(config = {}) {
36
+ const workingDirectory = config.workingDirectory || process.cwd();
37
+ return {
38
+ declaration: {
39
+ name: 'Glob',
40
+ description: `Finds files matching a glob pattern.
41
+ Supports wildcards:
42
+ - * matches any characters except path separators
43
+ - ** matches any characters including path separators (for recursive matching)
44
+ - ? matches any single character
45
+
46
+ By default ignores common directories like node_modules, .git, dist, etc.
47
+ Returns file paths relative to the search directory.`,
48
+ parametersJsonSchema: zodToJsonSchema(globSchema),
49
+ },
50
+ executor: async (args) => {
51
+ const params = globSchema.parse(args);
52
+ // Resolve the search directory
53
+ const searchDir = params.cwd ? resolvePath(params.cwd, workingDirectory) : workingDirectory;
54
+ // Security check
55
+ if (!isPathAllowed(searchDir, config.allowedPaths)) {
56
+ throw new Error(`Access denied: ${params.cwd || '.'} is outside allowed paths`);
57
+ }
58
+ // Combine default and custom ignore patterns
59
+ const ignorePatterns = [...DEFAULT_IGNORE_PATTERNS, ...(params.ignore || [])];
60
+ // Walk the directory
61
+ const allFiles = await walkDirectory(searchDir, {
62
+ ignore: ignorePatterns,
63
+ maxDepth: 50,
64
+ });
65
+ // Filter files matching the pattern
66
+ const matchingFiles = [];
67
+ for (const filePath of allFiles) {
68
+ const relativePath = getRelativePath(filePath, searchDir);
69
+ if (matchGlobPattern(params.pattern, relativePath)) {
70
+ matchingFiles.push(relativePath);
71
+ }
72
+ }
73
+ // Sort results for consistent output
74
+ matchingFiles.sort();
75
+ return {
76
+ pattern: params.pattern,
77
+ search_directory: params.cwd || '.',
78
+ matches: matchingFiles,
79
+ count: matchingFiles.length,
80
+ message: matchingFiles.length > 0
81
+ ? `Found ${matchingFiles.length} file${matchingFiles.length > 1 ? 's' : ''} matching "${params.pattern}"`
82
+ : `No files found matching "${params.pattern}"`,
83
+ };
84
+ },
85
+ parallel: true, // Glob is read-only and safe to run in parallel
86
+ };
87
+ }
88
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import type { ToolDefinition } from '../types/index.js';
3
+ import type { ToolConfig } from './types.js';
4
+ /**
5
+ * Schema for the Grep tool parameters
6
+ */
7
+ export declare const grepSchema: z.ZodObject<{
8
+ pattern: z.ZodString;
9
+ path: z.ZodOptional<z.ZodString>;
10
+ include: z.ZodOptional<z.ZodString>;
11
+ context_lines: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
12
+ case_insensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ pattern: string;
15
+ context_lines: number;
16
+ case_insensitive: boolean;
17
+ path?: string | undefined;
18
+ include?: string | undefined;
19
+ }, {
20
+ pattern: string;
21
+ path?: string | undefined;
22
+ include?: string | undefined;
23
+ context_lines?: number | undefined;
24
+ case_insensitive?: boolean | undefined;
25
+ }>;
26
+ export type GrepParams = z.infer<typeof grepSchema>;
27
+ /**
28
+ * Creates the Grep tool for searching patterns in files
29
+ */
30
+ export declare function createGrepTool(config?: ToolConfig): ToolDefinition;
31
+ //# sourceMappingURL=grep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;EAwBrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAwBpD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,UAAe,GAAG,cAAc,CA0KtE"}
@@ -0,0 +1,195 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { z } from 'zod';
4
+ import { zodToJsonSchema } from 'zod-to-json-schema';
5
+ import { resolvePath, isPathAllowed, walkDirectory, matchGlobPattern, getRelativePath, } from './utils/path.js';
6
+ /**
7
+ * Schema for the Grep tool parameters
8
+ */
9
+ export const grepSchema = z.object({
10
+ pattern: z
11
+ .string()
12
+ .describe('Regular expression pattern to search for. Use string literals for exact matches.'),
13
+ path: z
14
+ .string()
15
+ .optional()
16
+ .describe('File or directory path to search in. Defaults to working directory.'),
17
+ include: z
18
+ .string()
19
+ .optional()
20
+ .describe('Glob pattern to filter which files to search. Example: "*.ts" to only search TypeScript files.'),
21
+ context_lines: z
22
+ .number()
23
+ .optional()
24
+ .default(0)
25
+ .describe('Number of lines to show before and after each match. Default is 0.'),
26
+ case_insensitive: z
27
+ .boolean()
28
+ .optional()
29
+ .default(false)
30
+ .describe('If true, perform case-insensitive matching.'),
31
+ });
32
+ /**
33
+ * Default ignore patterns for grep
34
+ */
35
+ const DEFAULT_IGNORE_PATTERNS = [
36
+ 'node_modules/**',
37
+ '.git/**',
38
+ '.next/**',
39
+ 'dist/**',
40
+ 'build/**',
41
+ 'coverage/**',
42
+ '__pycache__/**',
43
+ '.cache/**',
44
+ ];
45
+ /**
46
+ * Creates the Grep tool for searching patterns in files
47
+ */
48
+ export function createGrepTool(config = {}) {
49
+ const workingDirectory = config.workingDirectory || process.cwd();
50
+ return {
51
+ declaration: {
52
+ name: 'Grep',
53
+ description: `Searches for a pattern in file contents using regular expressions.
54
+ Returns matching lines with file paths and line numbers.
55
+ Use context_lines to show surrounding context.
56
+
57
+ Examples:
58
+ - pattern: "function\\s+\\w+" - Find function declarations
59
+ - pattern: "TODO|FIXME" with case_insensitive: true - Find todo comments
60
+ - pattern: "import.*from" with include: "*.ts" - Find imports in TypeScript files`,
61
+ parametersJsonSchema: zodToJsonSchema(grepSchema),
62
+ },
63
+ executor: async (args) => {
64
+ const params = grepSchema.parse(args);
65
+ // Resolve the search path
66
+ const searchPath = params.path
67
+ ? resolvePath(params.path, workingDirectory)
68
+ : workingDirectory;
69
+ // Security check
70
+ if (!isPathAllowed(searchPath, config.allowedPaths)) {
71
+ throw new Error(`Access denied: ${params.path || '.'} is outside allowed paths`);
72
+ }
73
+ // Compile the regex
74
+ let regex;
75
+ try {
76
+ regex = new RegExp(params.pattern, params.case_insensitive ? 'gi' : 'g');
77
+ }
78
+ catch (error) {
79
+ throw new Error(`Invalid regex pattern: ${error.message}`);
80
+ }
81
+ // Get files to search
82
+ let filesToSearch = [];
83
+ try {
84
+ const stat = await fs.stat(searchPath);
85
+ if (stat.isFile()) {
86
+ filesToSearch = [searchPath];
87
+ }
88
+ else if (stat.isDirectory()) {
89
+ filesToSearch = await walkDirectory(searchPath, {
90
+ ignore: DEFAULT_IGNORE_PATTERNS,
91
+ maxDepth: 30,
92
+ });
93
+ }
94
+ }
95
+ catch (error) {
96
+ if (error.code === 'ENOENT') {
97
+ throw new Error(`Path not found: ${params.path || '.'}`);
98
+ }
99
+ throw error;
100
+ }
101
+ // Apply include filter if specified
102
+ if (params.include) {
103
+ filesToSearch = filesToSearch.filter((file) => {
104
+ const relativePath = getRelativePath(file, workingDirectory);
105
+ const fileName = path.basename(file);
106
+ return (matchGlobPattern(params.include, relativePath) ||
107
+ matchGlobPattern(params.include, fileName));
108
+ });
109
+ }
110
+ // Search each file
111
+ const matches = [];
112
+ const maxMatches = 500; // Limit to prevent overwhelming output
113
+ let truncated = false;
114
+ for (const filePath of filesToSearch) {
115
+ if (matches.length >= maxMatches) {
116
+ truncated = true;
117
+ break;
118
+ }
119
+ try {
120
+ const content = await fs.readFile(filePath, 'utf-8');
121
+ const lines = content.split('\n');
122
+ for (let i = 0; i < lines.length; i++) {
123
+ if (matches.length >= maxMatches) {
124
+ truncated = true;
125
+ break;
126
+ }
127
+ // Reset regex lastIndex for global regex
128
+ regex.lastIndex = 0;
129
+ if (regex.test(lines[i])) {
130
+ const match = {
131
+ file: getRelativePath(filePath, workingDirectory),
132
+ line_number: i + 1,
133
+ line: lines[i],
134
+ };
135
+ // Add context if requested
136
+ if (params.context_lines && params.context_lines > 0) {
137
+ const contextBefore = [];
138
+ const contextAfter = [];
139
+ for (let j = Math.max(0, i - params.context_lines); j < i; j++) {
140
+ contextBefore.push(lines[j]);
141
+ }
142
+ for (let j = i + 1; j <= Math.min(lines.length - 1, i + params.context_lines); j++) {
143
+ contextAfter.push(lines[j]);
144
+ }
145
+ if (contextBefore.length > 0) {
146
+ match.context_before = contextBefore;
147
+ }
148
+ if (contextAfter.length > 0) {
149
+ match.context_after = contextAfter;
150
+ }
151
+ }
152
+ matches.push(match);
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // Skip files that can't be read (binary files, permission issues, etc.)
158
+ }
159
+ }
160
+ // Format output
161
+ const formattedMatches = matches.map((m) => {
162
+ let output = `${m.file}:${m.line_number}:${m.line}`;
163
+ if (m.context_before || m.context_after) {
164
+ const parts = [];
165
+ if (m.context_before) {
166
+ m.context_before.forEach((line, idx) => {
167
+ parts.push(`${m.file}:${m.line_number - m.context_before.length + idx}-${line}`);
168
+ });
169
+ }
170
+ parts.push(`${m.file}:${m.line_number}:${m.line}`);
171
+ if (m.context_after) {
172
+ m.context_after.forEach((line, idx) => {
173
+ parts.push(`${m.file}:${m.line_number + idx + 1}-${line}`);
174
+ });
175
+ }
176
+ output = parts.join('\n');
177
+ }
178
+ return output;
179
+ });
180
+ return {
181
+ pattern: params.pattern,
182
+ search_path: params.path || '.',
183
+ matches: formattedMatches,
184
+ match_count: matches.length,
185
+ files_searched: filesToSearch.length,
186
+ truncated,
187
+ message: matches.length > 0
188
+ ? `Found ${matches.length} match${matches.length > 1 ? 'es' : ''} in ${filesToSearch.length} file${filesToSearch.length > 1 ? 's' : ''}${truncated ? ' (results truncated)' : ''}`
189
+ : `No matches found for "${params.pattern}"`,
190
+ };
191
+ },
192
+ parallel: true, // Grep is read-only and safe to run in parallel
193
+ };
194
+ }
195
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}