@open-multi-agent/core 1.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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/dist/agent/agent.d.ts +153 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +559 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/loop-detector.d.ts +39 -0
  8. package/dist/agent/loop-detector.d.ts.map +1 -0
  9. package/dist/agent/loop-detector.js +122 -0
  10. package/dist/agent/loop-detector.js.map +1 -0
  11. package/dist/agent/pool.d.ts +158 -0
  12. package/dist/agent/pool.d.ts.map +1 -0
  13. package/dist/agent/pool.js +320 -0
  14. package/dist/agent/pool.js.map +1 -0
  15. package/dist/agent/runner.d.ts +242 -0
  16. package/dist/agent/runner.d.ts.map +1 -0
  17. package/dist/agent/runner.js +943 -0
  18. package/dist/agent/runner.js.map +1 -0
  19. package/dist/agent/structured-output.d.ts +33 -0
  20. package/dist/agent/structured-output.d.ts.map +1 -0
  21. package/dist/agent/structured-output.js +116 -0
  22. package/dist/agent/structured-output.js.map +1 -0
  23. package/dist/cli/oma.d.ts +30 -0
  24. package/dist/cli/oma.d.ts.map +1 -0
  25. package/dist/cli/oma.js +433 -0
  26. package/dist/cli/oma.js.map +1 -0
  27. package/dist/dashboard/layout-tasks.d.ts +23 -0
  28. package/dist/dashboard/layout-tasks.d.ts.map +1 -0
  29. package/dist/dashboard/layout-tasks.js +79 -0
  30. package/dist/dashboard/layout-tasks.js.map +1 -0
  31. package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
  32. package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
  33. package/dist/dashboard/render-team-run-dashboard.js +456 -0
  34. package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
  35. package/dist/errors.d.ts +14 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +20 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/index.d.ts +79 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +92 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llm/adapter.d.ts +54 -0
  44. package/dist/llm/adapter.d.ts.map +1 -0
  45. package/dist/llm/adapter.js +101 -0
  46. package/dist/llm/adapter.js.map +1 -0
  47. package/dist/llm/anthropic.d.ts +57 -0
  48. package/dist/llm/anthropic.d.ts.map +1 -0
  49. package/dist/llm/anthropic.js +432 -0
  50. package/dist/llm/anthropic.js.map +1 -0
  51. package/dist/llm/azure-openai.d.ts +74 -0
  52. package/dist/llm/azure-openai.d.ts.map +1 -0
  53. package/dist/llm/azure-openai.js +267 -0
  54. package/dist/llm/azure-openai.js.map +1 -0
  55. package/dist/llm/bedrock.d.ts +41 -0
  56. package/dist/llm/bedrock.d.ts.map +1 -0
  57. package/dist/llm/bedrock.js +345 -0
  58. package/dist/llm/bedrock.js.map +1 -0
  59. package/dist/llm/copilot.d.ts +92 -0
  60. package/dist/llm/copilot.d.ts.map +1 -0
  61. package/dist/llm/copilot.js +433 -0
  62. package/dist/llm/copilot.js.map +1 -0
  63. package/dist/llm/deepseek.d.ts +21 -0
  64. package/dist/llm/deepseek.d.ts.map +1 -0
  65. package/dist/llm/deepseek.js +24 -0
  66. package/dist/llm/deepseek.js.map +1 -0
  67. package/dist/llm/gemini.d.ts +65 -0
  68. package/dist/llm/gemini.d.ts.map +1 -0
  69. package/dist/llm/gemini.js +427 -0
  70. package/dist/llm/gemini.js.map +1 -0
  71. package/dist/llm/grok.d.ts +21 -0
  72. package/dist/llm/grok.d.ts.map +1 -0
  73. package/dist/llm/grok.js +24 -0
  74. package/dist/llm/grok.js.map +1 -0
  75. package/dist/llm/minimax.d.ts +21 -0
  76. package/dist/llm/minimax.d.ts.map +1 -0
  77. package/dist/llm/minimax.js +24 -0
  78. package/dist/llm/minimax.js.map +1 -0
  79. package/dist/llm/openai-common.d.ts +65 -0
  80. package/dist/llm/openai-common.d.ts.map +1 -0
  81. package/dist/llm/openai-common.js +286 -0
  82. package/dist/llm/openai-common.js.map +1 -0
  83. package/dist/llm/openai.d.ts +63 -0
  84. package/dist/llm/openai.d.ts.map +1 -0
  85. package/dist/llm/openai.js +256 -0
  86. package/dist/llm/openai.js.map +1 -0
  87. package/dist/llm/qiniu.d.ts +21 -0
  88. package/dist/llm/qiniu.d.ts.map +1 -0
  89. package/dist/llm/qiniu.js +24 -0
  90. package/dist/llm/qiniu.js.map +1 -0
  91. package/dist/mcp.d.ts +3 -0
  92. package/dist/mcp.d.ts.map +1 -0
  93. package/dist/mcp.js +2 -0
  94. package/dist/mcp.js.map +1 -0
  95. package/dist/memory/shared.d.ts +162 -0
  96. package/dist/memory/shared.d.ts.map +1 -0
  97. package/dist/memory/shared.js +294 -0
  98. package/dist/memory/shared.js.map +1 -0
  99. package/dist/memory/store.d.ts +72 -0
  100. package/dist/memory/store.d.ts.map +1 -0
  101. package/dist/memory/store.js +121 -0
  102. package/dist/memory/store.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +245 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +1400 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/scheduler.d.ts +112 -0
  108. package/dist/orchestrator/scheduler.d.ts.map +1 -0
  109. package/dist/orchestrator/scheduler.js +256 -0
  110. package/dist/orchestrator/scheduler.js.map +1 -0
  111. package/dist/task/queue.d.ts +191 -0
  112. package/dist/task/queue.d.ts.map +1 -0
  113. package/dist/task/queue.js +408 -0
  114. package/dist/task/queue.js.map +1 -0
  115. package/dist/task/task.d.ts +90 -0
  116. package/dist/task/task.d.ts.map +1 -0
  117. package/dist/task/task.js +206 -0
  118. package/dist/task/task.js.map +1 -0
  119. package/dist/team/messaging.d.ts +106 -0
  120. package/dist/team/messaging.d.ts.map +1 -0
  121. package/dist/team/messaging.js +183 -0
  122. package/dist/team/messaging.js.map +1 -0
  123. package/dist/team/team.d.ts +141 -0
  124. package/dist/team/team.d.ts.map +1 -0
  125. package/dist/team/team.js +293 -0
  126. package/dist/team/team.js.map +1 -0
  127. package/dist/tool/built-in/bash.d.ts +12 -0
  128. package/dist/tool/built-in/bash.d.ts.map +1 -0
  129. package/dist/tool/built-in/bash.js +133 -0
  130. package/dist/tool/built-in/bash.js.map +1 -0
  131. package/dist/tool/built-in/delegate.d.ts +29 -0
  132. package/dist/tool/built-in/delegate.d.ts.map +1 -0
  133. package/dist/tool/built-in/delegate.js +92 -0
  134. package/dist/tool/built-in/delegate.js.map +1 -0
  135. package/dist/tool/built-in/file-edit.d.ts +14 -0
  136. package/dist/tool/built-in/file-edit.d.ts.map +1 -0
  137. package/dist/tool/built-in/file-edit.js +130 -0
  138. package/dist/tool/built-in/file-edit.js.map +1 -0
  139. package/dist/tool/built-in/file-read.d.ts +12 -0
  140. package/dist/tool/built-in/file-read.d.ts.map +1 -0
  141. package/dist/tool/built-in/file-read.js +82 -0
  142. package/dist/tool/built-in/file-read.js.map +1 -0
  143. package/dist/tool/built-in/file-write.d.ts +11 -0
  144. package/dist/tool/built-in/file-write.d.ts.map +1 -0
  145. package/dist/tool/built-in/file-write.js +70 -0
  146. package/dist/tool/built-in/file-write.js.map +1 -0
  147. package/dist/tool/built-in/fs-walk.d.ts +23 -0
  148. package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
  149. package/dist/tool/built-in/fs-walk.js +78 -0
  150. package/dist/tool/built-in/fs-walk.js.map +1 -0
  151. package/dist/tool/built-in/glob.d.ts +12 -0
  152. package/dist/tool/built-in/glob.d.ts.map +1 -0
  153. package/dist/tool/built-in/glob.js +82 -0
  154. package/dist/tool/built-in/glob.js.map +1 -0
  155. package/dist/tool/built-in/grep.d.ts +15 -0
  156. package/dist/tool/built-in/grep.d.ts.map +1 -0
  157. package/dist/tool/built-in/grep.js +218 -0
  158. package/dist/tool/built-in/grep.js.map +1 -0
  159. package/dist/tool/built-in/index.d.ts +48 -0
  160. package/dist/tool/built-in/index.d.ts.map +1 -0
  161. package/dist/tool/built-in/index.js +56 -0
  162. package/dist/tool/built-in/index.js.map +1 -0
  163. package/dist/tool/executor.d.ts +100 -0
  164. package/dist/tool/executor.d.ts.map +1 -0
  165. package/dist/tool/executor.js +184 -0
  166. package/dist/tool/executor.js.map +1 -0
  167. package/dist/tool/framework.d.ts +167 -0
  168. package/dist/tool/framework.d.ts.map +1 -0
  169. package/dist/tool/framework.js +402 -0
  170. package/dist/tool/framework.js.map +1 -0
  171. package/dist/tool/mcp.d.ts +31 -0
  172. package/dist/tool/mcp.d.ts.map +1 -0
  173. package/dist/tool/mcp.js +175 -0
  174. package/dist/tool/mcp.js.map +1 -0
  175. package/dist/tool/text-tool-extractor.d.ts +32 -0
  176. package/dist/tool/text-tool-extractor.d.ts.map +1 -0
  177. package/dist/tool/text-tool-extractor.js +195 -0
  178. package/dist/tool/text-tool-extractor.js.map +1 -0
  179. package/dist/types.d.ts +916 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +8 -0
  182. package/dist/types.js.map +1 -0
  183. package/dist/utils/keywords.d.ts +18 -0
  184. package/dist/utils/keywords.d.ts.map +1 -0
  185. package/dist/utils/keywords.js +32 -0
  186. package/dist/utils/keywords.js.map +1 -0
  187. package/dist/utils/semaphore.d.ts +49 -0
  188. package/dist/utils/semaphore.d.ts.map +1 -0
  189. package/dist/utils/semaphore.js +89 -0
  190. package/dist/utils/semaphore.js.map +1 -0
  191. package/dist/utils/tokens.d.ts +7 -0
  192. package/dist/utils/tokens.d.ts.map +1 -0
  193. package/dist/utils/tokens.js +30 -0
  194. package/dist/utils/tokens.js.map +1 -0
  195. package/dist/utils/trace.d.ts +12 -0
  196. package/dist/utils/trace.d.ts.map +1 -0
  197. package/dist/utils/trace.js +30 -0
  198. package/dist/utils/trace.js.map +1 -0
  199. package/docs/DECISIONS.md +49 -0
  200. package/docs/cli.md +265 -0
  201. package/docs/context-management.md +24 -0
  202. package/docs/featured-partner.md +28 -0
  203. package/docs/observability.md +56 -0
  204. package/docs/providers.md +78 -0
  205. package/docs/shared-memory.md +27 -0
  206. package/docs/tool-configuration.md +152 -0
  207. package/package.json +96 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Built-in file-edit tool.
3
+ *
4
+ * Performs a targeted string replacement inside an existing file.
5
+ * The uniqueness invariant (one match unless replace_all is set) prevents the
6
+ * common class of bugs where a generic pattern matches the wrong occurrence.
7
+ */
8
+ import { readFile, writeFile } from 'fs/promises';
9
+ import { z } from 'zod';
10
+ import { defineTool } from '../framework.js';
11
+ // ---------------------------------------------------------------------------
12
+ // Tool definition
13
+ // ---------------------------------------------------------------------------
14
+ export const fileEditTool = defineTool({
15
+ name: 'file_edit',
16
+ description: 'Edit a file by replacing a specific string with new content. ' +
17
+ 'The `old_string` must appear verbatim in the file. ' +
18
+ 'By default the tool errors if `old_string` appears more than once — ' +
19
+ 'use `replace_all: true` to replace every occurrence. ' +
20
+ 'Use file_write when you need to create a new file or rewrite it entirely.',
21
+ inputSchema: z.object({
22
+ path: z
23
+ .string()
24
+ .describe('Absolute path to the file to edit.'),
25
+ old_string: z
26
+ .string()
27
+ .describe('The exact string to find and replace. ' +
28
+ 'Must match character-for-character including whitespace and newlines.'),
29
+ new_string: z
30
+ .string()
31
+ .describe('The replacement string that will be inserted in place of `old_string`.'),
32
+ replace_all: z
33
+ .boolean()
34
+ .optional()
35
+ .describe('When true, replace every occurrence of `old_string` instead of requiring it ' +
36
+ 'to be unique. Defaults to false.'),
37
+ }),
38
+ execute: async (input) => {
39
+ // Read the existing file.
40
+ let original;
41
+ try {
42
+ const buffer = await readFile(input.path);
43
+ original = buffer.toString('utf8');
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : 'Unknown error reading file.';
47
+ return {
48
+ data: `Could not read "${input.path}": ${message}`,
49
+ isError: true,
50
+ };
51
+ }
52
+ const occurrences = countOccurrences(original, input.old_string);
53
+ if (occurrences === 0) {
54
+ return {
55
+ data: `The string to replace was not found in "${input.path}".\n` +
56
+ 'Make sure `old_string` matches the file contents exactly, ' +
57
+ 'including indentation and line endings.',
58
+ isError: true,
59
+ };
60
+ }
61
+ const replaceAll = input.replace_all ?? false;
62
+ if (occurrences > 1 && !replaceAll) {
63
+ return {
64
+ data: `\`old_string\` appears ${occurrences} times in "${input.path}". ` +
65
+ 'Provide a more specific string to uniquely identify the section you want ' +
66
+ 'to replace, or set `replace_all: true` to replace every occurrence.',
67
+ isError: true,
68
+ };
69
+ }
70
+ // Perform the replacement.
71
+ const updated = replaceAll
72
+ ? replaceAllOccurrences(original, input.old_string, input.new_string)
73
+ : original.replace(input.old_string, input.new_string);
74
+ // Persist the result.
75
+ try {
76
+ await writeFile(input.path, updated, 'utf8');
77
+ }
78
+ catch (err) {
79
+ const message = err instanceof Error ? err.message : 'Unknown error writing file.';
80
+ return {
81
+ data: `Failed to write "${input.path}": ${message}`,
82
+ isError: true,
83
+ };
84
+ }
85
+ const replacedCount = replaceAll ? occurrences : 1;
86
+ return {
87
+ data: `Replaced ${replacedCount} occurrence${replacedCount === 1 ? '' : 's'} ` +
88
+ `in "${input.path}".`,
89
+ isError: false,
90
+ };
91
+ },
92
+ });
93
+ // ---------------------------------------------------------------------------
94
+ // Internal helpers
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Count how many times `needle` appears in `haystack`.
98
+ * Uses a plain loop to avoid constructing a potentially large regex from
99
+ * untrusted input.
100
+ */
101
+ function countOccurrences(haystack, needle) {
102
+ if (needle.length === 0)
103
+ return 0;
104
+ let count = 0;
105
+ let pos = 0;
106
+ while ((pos = haystack.indexOf(needle, pos)) !== -1) {
107
+ count++;
108
+ pos += needle.length;
109
+ }
110
+ return count;
111
+ }
112
+ /**
113
+ * Replace all occurrences of `needle` in `haystack` with `replacement`
114
+ * without using a regex (avoids regex-special-character escaping issues).
115
+ */
116
+ function replaceAllOccurrences(haystack, needle, replacement) {
117
+ if (needle.length === 0)
118
+ return haystack;
119
+ const parts = [];
120
+ let pos = 0;
121
+ let next;
122
+ while ((next = haystack.indexOf(needle, pos)) !== -1) {
123
+ parts.push(haystack.slice(pos, next));
124
+ parts.push(replacement);
125
+ pos = next + needle.length;
126
+ }
127
+ parts.push(haystack.slice(pos));
128
+ return parts.join('');
129
+ }
130
+ //# sourceMappingURL=file-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-edit.js","sourceRoot":"","sources":["../../../src/tool/built-in/file-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Built-in file-read tool.
3
+ *
4
+ * Reads a file from disk and returns its contents with 1-based line numbers.
5
+ * Supports reading a slice of lines via `offset` and `limit` for large files.
6
+ */
7
+ export declare const fileReadTool: import("../framework.js").ToolDefinition<{
8
+ path: string;
9
+ offset?: number | undefined;
10
+ limit?: number | undefined;
11
+ }>;
12
+ //# sourceMappingURL=file-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-read.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/file-read.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,YAAY;;;;EAyFvB,CAAA"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Built-in file-read tool.
3
+ *
4
+ * Reads a file from disk and returns its contents with 1-based line numbers.
5
+ * Supports reading a slice of lines via `offset` and `limit` for large files.
6
+ */
7
+ import { readFile } from 'fs/promises';
8
+ import { z } from 'zod';
9
+ import { defineTool } from '../framework.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Tool definition
12
+ // ---------------------------------------------------------------------------
13
+ export const fileReadTool = defineTool({
14
+ name: 'file_read',
15
+ description: 'Read the contents of a file from disk. ' +
16
+ 'Returns the file contents with line numbers prefixed in the format "N\\t<line>". ' +
17
+ 'Use `offset` and `limit` to read large files in chunks without loading the ' +
18
+ 'entire file into the context window.',
19
+ inputSchema: z.object({
20
+ path: z.string().describe('Absolute path to the file to read.'),
21
+ offset: z
22
+ .number()
23
+ .int()
24
+ .nonnegative()
25
+ .optional()
26
+ .describe('1-based line number to start reading from. ' +
27
+ 'When omitted the file is read from the beginning.'),
28
+ limit: z
29
+ .number()
30
+ .int()
31
+ .positive()
32
+ .optional()
33
+ .describe('Maximum number of lines to return. ' +
34
+ 'When omitted all lines from `offset` to the end of the file are returned.'),
35
+ }),
36
+ execute: async (input) => {
37
+ let raw;
38
+ try {
39
+ const buffer = await readFile(input.path);
40
+ raw = buffer.toString('utf8');
41
+ }
42
+ catch (err) {
43
+ const message = err instanceof Error ? err.message : 'Unknown error reading file.';
44
+ return {
45
+ data: `Could not read file "${input.path}": ${message}`,
46
+ isError: true,
47
+ };
48
+ }
49
+ // Split preserving trailing newlines correctly
50
+ const lines = raw.split('\n');
51
+ // Remove the last empty string produced by a trailing newline
52
+ if (lines.length > 0 && lines[lines.length - 1] === '') {
53
+ lines.pop();
54
+ }
55
+ const totalLines = lines.length;
56
+ // Apply offset (convert from 1-based to 0-based)
57
+ const startIndex = input.offset !== undefined ? Math.max(0, input.offset - 1) : 0;
58
+ if (startIndex >= totalLines && totalLines > 0) {
59
+ return {
60
+ data: `File "${input.path}" has ${totalLines} line${totalLines === 1 ? '' : 's'} ` +
61
+ `but offset ${input.offset} is beyond the end.`,
62
+ isError: true,
63
+ };
64
+ }
65
+ const endIndex = input.limit !== undefined
66
+ ? Math.min(startIndex + input.limit, totalLines)
67
+ : totalLines;
68
+ const slice = lines.slice(startIndex, endIndex);
69
+ // Build line-numbered output (1-based line numbers matching file positions)
70
+ const numbered = slice
71
+ .map((line, i) => `${startIndex + i + 1}\t${line}`)
72
+ .join('\n');
73
+ const meta = endIndex < totalLines
74
+ ? `\n\n(showing lines ${startIndex + 1}–${endIndex} of ${totalLines})`
75
+ : '';
76
+ return {
77
+ data: numbered + meta,
78
+ isError: false,
79
+ };
80
+ },
81
+ });
82
+ //# sourceMappingURL=file-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-read.js","sourceRoot":"","sources":["../../../src/tool/built-in/file-read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Built-in file-write tool.
3
+ *
4
+ * Creates or overwrites a file with the supplied content. Parent directories
5
+ * are created automatically (equivalent to `mkdir -p`).
6
+ */
7
+ export declare const fileWriteTool: import("../framework.js").ToolDefinition<{
8
+ content: string;
9
+ path: string;
10
+ }>;
11
+ //# sourceMappingURL=file-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-write.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/file-write.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,eAAO,MAAM,aAAa;;;EAgExB,CAAA"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Built-in file-write tool.
3
+ *
4
+ * Creates or overwrites a file with the supplied content. Parent directories
5
+ * are created automatically (equivalent to `mkdir -p`).
6
+ */
7
+ import { mkdir, stat, writeFile } from 'fs/promises';
8
+ import { dirname } from 'path';
9
+ import { z } from 'zod';
10
+ import { defineTool } from '../framework.js';
11
+ // ---------------------------------------------------------------------------
12
+ // Tool definition
13
+ // ---------------------------------------------------------------------------
14
+ export const fileWriteTool = defineTool({
15
+ name: 'file_write',
16
+ description: 'Write content to a file, creating it (and any missing parent directories) if it ' +
17
+ 'does not already exist, or overwriting it if it does. ' +
18
+ 'Prefer this tool for creating new files; use file_edit for targeted in-place edits ' +
19
+ 'of existing files.',
20
+ inputSchema: z.object({
21
+ path: z
22
+ .string()
23
+ .describe('Absolute path to the file to write. ' +
24
+ 'The path must be absolute (starting with /).'),
25
+ content: z.string().describe('The full content to write to the file.'),
26
+ }),
27
+ execute: async (input) => {
28
+ // Determine whether the file already exists so we can report create vs update.
29
+ let existed = false;
30
+ try {
31
+ await stat(input.path);
32
+ existed = true;
33
+ }
34
+ catch {
35
+ // File does not exist — will be created.
36
+ }
37
+ // Ensure parent directory hierarchy exists.
38
+ const parentDir = dirname(input.path);
39
+ try {
40
+ await mkdir(parentDir, { recursive: true });
41
+ }
42
+ catch (err) {
43
+ const message = err instanceof Error ? err.message : 'Unknown error creating directories.';
44
+ return {
45
+ data: `Failed to create parent directory "${parentDir}": ${message}`,
46
+ isError: true,
47
+ };
48
+ }
49
+ // Write the file.
50
+ try {
51
+ await writeFile(input.path, input.content, 'utf8');
52
+ }
53
+ catch (err) {
54
+ const message = err instanceof Error ? err.message : 'Unknown error writing file.';
55
+ return {
56
+ data: `Failed to write file "${input.path}": ${message}`,
57
+ isError: true,
58
+ };
59
+ }
60
+ const lineCount = input.content.split('\n').length;
61
+ const byteCount = Buffer.byteLength(input.content, 'utf8');
62
+ const action = existed ? 'Updated' : 'Created';
63
+ return {
64
+ data: `${action} "${input.path}" ` +
65
+ `(${lineCount} line${lineCount === 1 ? '' : 's'}, ${byteCount} bytes).`,
66
+ isError: false,
67
+ };
68
+ },
69
+ });
70
+ //# sourceMappingURL=file-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-write.js","sourceRoot":"","sources":["../../../src/tool/built-in/file-write.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,kFAAkF;QAClF,wDAAwD;QACxD,qFAAqF;QACrF,oBAAoB;IAEtB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CACP,sCAAsC;YACpC,8CAA8C,CACjD;QACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACvE,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvB,+EAA+E;QAC/E,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACtB,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QAED,4CAA4C;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC,CAAA;YAC5E,OAAO;gBACL,IAAI,EAAE,sCAAsC,SAAS,MAAM,OAAO,EAAE;gBACpE,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAA;YACpE,OAAO;gBACL,IAAI,EAAE,yBAAyB,KAAK,CAAC,IAAI,MAAM,OAAO,EAAE;gBACxD,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;QAClD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;QAE9C,OAAO;YACL,IAAI,EACF,GAAG,MAAM,KAAK,KAAK,CAAC,IAAI,IAAI;gBAC5B,IAAI,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,UAAU;YACzE,OAAO,EAAE,KAAK;SACf,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared recursive directory walk for built-in file tools.
3
+ *
4
+ * Used by {@link grepTool} and {@link globTool} so glob filtering and skip
5
+ * rules stay consistent.
6
+ */
7
+ /** Directories that are almost never useful to traverse for code search. */
8
+ export declare const SKIP_DIRS: Set<string>;
9
+ export interface CollectFilesOptions {
10
+ /** When set, stop collecting once this many paths are gathered. */
11
+ readonly maxFiles?: number;
12
+ }
13
+ /**
14
+ * Recursively walk `dir` and return file paths, honouring {@link SKIP_DIRS}
15
+ * and an optional filename glob pattern.
16
+ */
17
+ export declare function collectFiles(dir: string, glob: string | undefined, signal: AbortSignal | undefined, options?: CollectFilesOptions): Promise<string[]>;
18
+ /**
19
+ * Minimal glob match supporting `*.ext` and `**<pattern>` forms.
20
+ *
21
+ */
22
+ export declare function matchesGlob(filename: string, glob: string): boolean;
23
+ //# sourceMappingURL=fs-walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-walk.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/fs-walk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,4EAA4E;AAC5E,eAAO,MAAM,SAAS,aAQpB,CAAA;AAEF,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CAInB;AA2CD;;;EAGE;AAGF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQnE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Shared recursive directory walk for built-in file tools.
3
+ *
4
+ * Used by {@link grepTool} and {@link globTool} so glob filtering and skip
5
+ * rules stay consistent.
6
+ */
7
+ import { readdir, stat } from 'fs/promises';
8
+ import { join } from 'path';
9
+ /** Directories that are almost never useful to traverse for code search. */
10
+ export const SKIP_DIRS = new Set([
11
+ '.git',
12
+ '.svn',
13
+ '.hg',
14
+ 'node_modules',
15
+ '.next',
16
+ 'dist',
17
+ 'build',
18
+ ]);
19
+ /**
20
+ * Recursively walk `dir` and return file paths, honouring {@link SKIP_DIRS}
21
+ * and an optional filename glob pattern.
22
+ */
23
+ export async function collectFiles(dir, glob, signal, options) {
24
+ const results = [];
25
+ await walk(dir, glob, results, signal, options?.maxFiles);
26
+ return results;
27
+ }
28
+ async function walk(dir, glob, results, signal, maxFiles) {
29
+ if (signal?.aborted === true)
30
+ return;
31
+ if (maxFiles !== undefined && results.length >= maxFiles)
32
+ return;
33
+ let entryNames;
34
+ try {
35
+ entryNames = await readdir(dir, { encoding: 'utf8' });
36
+ }
37
+ catch {
38
+ return;
39
+ }
40
+ for (const entryName of entryNames) {
41
+ if (signal !== undefined && signal.aborted)
42
+ return;
43
+ if (maxFiles !== undefined && results.length >= maxFiles)
44
+ return;
45
+ const fullPath = join(dir, entryName);
46
+ let entryInfo;
47
+ try {
48
+ entryInfo = await stat(fullPath);
49
+ }
50
+ catch {
51
+ continue;
52
+ }
53
+ if (entryInfo.isDirectory()) {
54
+ if (!SKIP_DIRS.has(entryName)) {
55
+ await walk(fullPath, glob, results, signal, maxFiles);
56
+ }
57
+ }
58
+ else if (entryInfo.isFile()) {
59
+ if (glob === undefined || matchesGlob(entryName, glob)) {
60
+ results.push(fullPath);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ /**
66
+ * Minimal glob match supporting `*.ext` and `**<pattern>` forms.
67
+ *
68
+ */
69
+ export function matchesGlob(filename, glob) {
70
+ const pattern = glob.startsWith('**/') ? glob.slice(3) : glob;
71
+ const regexSource = pattern
72
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
73
+ .replace(/\*/g, '.*')
74
+ .replace(/\?/g, '.');
75
+ const re = new RegExp(`^${regexSource}$`, 'i');
76
+ return re.test(filename);
77
+ }
78
+ //# sourceMappingURL=fs-walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-walk.js","sourceRoot":"","sources":["../../../src/tool/built-in/fs-walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Built-in glob tool.
3
+ *
4
+ * Lists file paths under a directory matching an optional filename glob.
5
+ * Does not read file contents — use {@link grepTool} to search inside files.
6
+ */
7
+ export declare const globTool: import("../framework.js").ToolDefinition<{
8
+ path?: string | undefined;
9
+ pattern?: string | undefined;
10
+ maxFiles?: number | undefined;
11
+ }>;
12
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/glob.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,eAAO,MAAM,QAAQ;;;;EAkFnB,CAAA"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Built-in glob tool.
3
+ *
4
+ * Lists file paths under a directory matching an optional filename glob.
5
+ * Does not read file contents — use {@link grepTool} to search inside files.
6
+ */
7
+ import { stat } from 'fs/promises';
8
+ import { basename, relative } from 'path';
9
+ import { z } from 'zod';
10
+ import { collectFiles, matchesGlob } from './fs-walk.js';
11
+ import { defineTool } from '../framework.js';
12
+ const DEFAULT_MAX_FILES = 500;
13
+ export const globTool = defineTool({
14
+ name: 'glob',
15
+ description: 'List file paths under a directory that match an optional filename glob. ' +
16
+ 'Does not read file contents — use `grep` to search inside files. ' +
17
+ 'Skips common bulky directories (node_modules, .git, dist, etc.). ' +
18
+ 'Paths in the result are relative to the process working directory. ' +
19
+ 'Results are capped by `maxFiles`.',
20
+ inputSchema: z.object({
21
+ path: z
22
+ .string()
23
+ .optional()
24
+ .describe('Directory to list files under. Defaults to the current working directory.'),
25
+ pattern: z
26
+ .string()
27
+ .optional()
28
+ .describe('Filename glob (e.g. "*.ts", "**/*.json"). When omitted, every file ' +
29
+ 'under the directory is listed (subject to maxFiles and skipped dirs).'),
30
+ maxFiles: z
31
+ .number()
32
+ .int()
33
+ .positive()
34
+ .optional()
35
+ .describe(`Maximum number of file paths to return. Defaults to ${DEFAULT_MAX_FILES}.`),
36
+ }),
37
+ execute: async (input, context) => {
38
+ const root = input.path ?? process.cwd();
39
+ const maxFiles = input.maxFiles ?? DEFAULT_MAX_FILES;
40
+ const signal = context.abortSignal;
41
+ let linesOut;
42
+ let truncated = false;
43
+ try {
44
+ const info = await stat(root);
45
+ if (info.isFile()) {
46
+ const name = basename(root);
47
+ if (input.pattern !== undefined &&
48
+ !matchesGlob(name, input.pattern)) {
49
+ return { data: 'No files matched.', isError: false };
50
+ }
51
+ linesOut = [relative(process.cwd(), root) || root];
52
+ }
53
+ else {
54
+ const collected = await collectFiles(root, input.pattern, signal, {
55
+ maxFiles: maxFiles + 1,
56
+ });
57
+ truncated = collected.length > maxFiles;
58
+ const capped = collected.slice(0, maxFiles);
59
+ linesOut = capped.map((f) => relative(process.cwd(), f) || f);
60
+ }
61
+ }
62
+ catch (err) {
63
+ const message = err instanceof Error ? err.message : 'Unknown error';
64
+ return {
65
+ data: `Cannot access path "${root}": ${message}`,
66
+ isError: true,
67
+ };
68
+ }
69
+ if (linesOut.length === 0) {
70
+ return { data: 'No files matched.', isError: false };
71
+ }
72
+ const sorted = [...linesOut].sort((a, b) => a.localeCompare(b));
73
+ const truncationNote = truncated
74
+ ? `\n\n(listing capped at ${maxFiles} paths; raise maxFiles for more)`
75
+ : '';
76
+ return {
77
+ data: sorted.join('\n') + truncationNote,
78
+ isError: false,
79
+ };
80
+ },
81
+ });
82
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../src/tool/built-in/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Built-in grep tool.
3
+ *
4
+ * Searches for a regex pattern in files. Prefers the `rg` (ripgrep) binary
5
+ * when available for performance; falls back to a pure Node.js recursive
6
+ * implementation using the standard `fs` module so the tool works in
7
+ * environments without ripgrep installed.
8
+ */
9
+ export declare const grepTool: import("../framework.js").ToolDefinition<{
10
+ pattern: string;
11
+ path?: string | undefined;
12
+ glob?: string | undefined;
13
+ maxResults?: number | undefined;
14
+ }>;
15
+ //# sourceMappingURL=grep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/tool/built-in/grep.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,eAAO,MAAM,QAAQ;;;;;EAwEnB,CAAA"}