cmdr-agent 1.0.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -0
  3. package/dist/bin/cmdr.d.ts +9 -0
  4. package/dist/bin/cmdr.d.ts.map +1 -0
  5. package/dist/bin/cmdr.js +49 -0
  6. package/dist/bin/cmdr.js.map +1 -0
  7. package/dist/src/cli/args.d.ts +19 -0
  8. package/dist/src/cli/args.d.ts.map +1 -0
  9. package/dist/src/cli/args.js +89 -0
  10. package/dist/src/cli/args.js.map +1 -0
  11. package/dist/src/cli/commands.d.ts +12 -0
  12. package/dist/src/cli/commands.d.ts.map +1 -0
  13. package/dist/src/cli/commands.js +400 -0
  14. package/dist/src/cli/commands.js.map +1 -0
  15. package/dist/src/cli/renderer.d.ts +8 -0
  16. package/dist/src/cli/renderer.d.ts.map +1 -0
  17. package/dist/src/cli/renderer.js +47 -0
  18. package/dist/src/cli/renderer.js.map +1 -0
  19. package/dist/src/cli/repl.d.ts +18 -0
  20. package/dist/src/cli/repl.d.ts.map +1 -0
  21. package/dist/src/cli/repl.js +751 -0
  22. package/dist/src/cli/repl.js.map +1 -0
  23. package/dist/src/cli/spinner.d.ts +16 -0
  24. package/dist/src/cli/spinner.d.ts.map +1 -0
  25. package/dist/src/cli/spinner.js +233 -0
  26. package/dist/src/cli/spinner.js.map +1 -0
  27. package/dist/src/cli/theme.d.ts +95 -0
  28. package/dist/src/cli/theme.d.ts.map +1 -0
  29. package/dist/src/cli/theme.js +178 -0
  30. package/dist/src/cli/theme.js.map +1 -0
  31. package/dist/src/communication/message-bus.d.ts +35 -0
  32. package/dist/src/communication/message-bus.d.ts.map +1 -0
  33. package/dist/src/communication/message-bus.js +60 -0
  34. package/dist/src/communication/message-bus.js.map +1 -0
  35. package/dist/src/communication/shared-memory.d.ts +19 -0
  36. package/dist/src/communication/shared-memory.d.ts.map +1 -0
  37. package/dist/src/communication/shared-memory.js +37 -0
  38. package/dist/src/communication/shared-memory.js.map +1 -0
  39. package/dist/src/communication/task-queue.d.ts +50 -0
  40. package/dist/src/communication/task-queue.d.ts.map +1 -0
  41. package/dist/src/communication/task-queue.js +158 -0
  42. package/dist/src/communication/task-queue.js.map +1 -0
  43. package/dist/src/config/config-loader.d.ts +23 -0
  44. package/dist/src/config/config-loader.d.ts.map +1 -0
  45. package/dist/src/config/config-loader.js +91 -0
  46. package/dist/src/config/config-loader.js.map +1 -0
  47. package/dist/src/config/defaults.d.ts +6 -0
  48. package/dist/src/config/defaults.d.ts.map +1 -0
  49. package/dist/src/config/defaults.js +21 -0
  50. package/dist/src/config/defaults.js.map +1 -0
  51. package/dist/src/config/schema.d.ts +135 -0
  52. package/dist/src/config/schema.d.ts.map +1 -0
  53. package/dist/src/config/schema.js +35 -0
  54. package/dist/src/config/schema.js.map +1 -0
  55. package/dist/src/config/telemetry.d.ts +41 -0
  56. package/dist/src/config/telemetry.d.ts.map +1 -0
  57. package/dist/src/config/telemetry.js +57 -0
  58. package/dist/src/config/telemetry.js.map +1 -0
  59. package/dist/src/core/agent-pool.d.ts +40 -0
  60. package/dist/src/core/agent-pool.d.ts.map +1 -0
  61. package/dist/src/core/agent-pool.js +66 -0
  62. package/dist/src/core/agent-pool.js.map +1 -0
  63. package/dist/src/core/agent-runner.d.ts +51 -0
  64. package/dist/src/core/agent-runner.d.ts.map +1 -0
  65. package/dist/src/core/agent-runner.js +251 -0
  66. package/dist/src/core/agent-runner.js.map +1 -0
  67. package/dist/src/core/agent.d.ts +34 -0
  68. package/dist/src/core/agent.d.ts.map +1 -0
  69. package/dist/src/core/agent.js +143 -0
  70. package/dist/src/core/agent.js.map +1 -0
  71. package/dist/src/core/intent.d.ts +33 -0
  72. package/dist/src/core/intent.d.ts.map +1 -0
  73. package/dist/src/core/intent.js +91 -0
  74. package/dist/src/core/intent.js.map +1 -0
  75. package/dist/src/core/orchestrator.d.ts +43 -0
  76. package/dist/src/core/orchestrator.d.ts.map +1 -0
  77. package/dist/src/core/orchestrator.js +115 -0
  78. package/dist/src/core/orchestrator.js.map +1 -0
  79. package/dist/src/core/permissions.d.ts +36 -0
  80. package/dist/src/core/permissions.d.ts.map +1 -0
  81. package/dist/src/core/permissions.js +129 -0
  82. package/dist/src/core/permissions.js.map +1 -0
  83. package/dist/src/core/presets.d.ts +12 -0
  84. package/dist/src/core/presets.d.ts.map +1 -0
  85. package/dist/src/core/presets.js +148 -0
  86. package/dist/src/core/presets.js.map +1 -0
  87. package/dist/src/core/team.d.ts +44 -0
  88. package/dist/src/core/team.d.ts.map +1 -0
  89. package/dist/src/core/team.js +156 -0
  90. package/dist/src/core/team.js.map +1 -0
  91. package/dist/src/core/types.d.ts +257 -0
  92. package/dist/src/core/types.d.ts.map +1 -0
  93. package/dist/src/core/types.js +7 -0
  94. package/dist/src/core/types.js.map +1 -0
  95. package/dist/src/index.d.ts +44 -0
  96. package/dist/src/index.d.ts.map +1 -0
  97. package/dist/src/index.js +45 -0
  98. package/dist/src/index.js.map +1 -0
  99. package/dist/src/llm/adapter.d.ts +5 -0
  100. package/dist/src/llm/adapter.d.ts.map +1 -0
  101. package/dist/src/llm/adapter.js +5 -0
  102. package/dist/src/llm/adapter.js.map +1 -0
  103. package/dist/src/llm/model-registry.d.ts +14 -0
  104. package/dist/src/llm/model-registry.d.ts.map +1 -0
  105. package/dist/src/llm/model-registry.js +30 -0
  106. package/dist/src/llm/model-registry.js.map +1 -0
  107. package/dist/src/llm/ollama.d.ts +26 -0
  108. package/dist/src/llm/ollama.d.ts.map +1 -0
  109. package/dist/src/llm/ollama.js +375 -0
  110. package/dist/src/llm/ollama.js.map +1 -0
  111. package/dist/src/llm/token-counter.d.ts +11 -0
  112. package/dist/src/llm/token-counter.d.ts.map +1 -0
  113. package/dist/src/llm/token-counter.js +35 -0
  114. package/dist/src/llm/token-counter.js.map +1 -0
  115. package/dist/src/plugins/mcp-client.d.ts +38 -0
  116. package/dist/src/plugins/mcp-client.d.ts.map +1 -0
  117. package/dist/src/plugins/mcp-client.js +113 -0
  118. package/dist/src/plugins/mcp-client.js.map +1 -0
  119. package/dist/src/plugins/plugin-manager.d.ts +37 -0
  120. package/dist/src/plugins/plugin-manager.d.ts.map +1 -0
  121. package/dist/src/plugins/plugin-manager.js +146 -0
  122. package/dist/src/plugins/plugin-manager.js.map +1 -0
  123. package/dist/src/scheduling/semaphore.d.ts +20 -0
  124. package/dist/src/scheduling/semaphore.d.ts.map +1 -0
  125. package/dist/src/scheduling/semaphore.js +52 -0
  126. package/dist/src/scheduling/semaphore.js.map +1 -0
  127. package/dist/src/scheduling/strategies.d.ts +39 -0
  128. package/dist/src/scheduling/strategies.d.ts.map +1 -0
  129. package/dist/src/scheduling/strategies.js +88 -0
  130. package/dist/src/scheduling/strategies.js.map +1 -0
  131. package/dist/src/session/compaction.d.ts +32 -0
  132. package/dist/src/session/compaction.d.ts.map +1 -0
  133. package/dist/src/session/compaction.js +172 -0
  134. package/dist/src/session/compaction.js.map +1 -0
  135. package/dist/src/session/cost-tracker.d.ts +41 -0
  136. package/dist/src/session/cost-tracker.d.ts.map +1 -0
  137. package/dist/src/session/cost-tracker.js +76 -0
  138. package/dist/src/session/cost-tracker.js.map +1 -0
  139. package/dist/src/session/project-context.d.ts +6 -0
  140. package/dist/src/session/project-context.d.ts.map +1 -0
  141. package/dist/src/session/project-context.js +147 -0
  142. package/dist/src/session/project-context.js.map +1 -0
  143. package/dist/src/session/prompt-builder.d.ts +11 -0
  144. package/dist/src/session/prompt-builder.d.ts.map +1 -0
  145. package/dist/src/session/prompt-builder.js +30 -0
  146. package/dist/src/session/prompt-builder.js.map +1 -0
  147. package/dist/src/session/session-manager.d.ts +32 -0
  148. package/dist/src/session/session-manager.d.ts.map +1 -0
  149. package/dist/src/session/session-manager.js +84 -0
  150. package/dist/src/session/session-manager.js.map +1 -0
  151. package/dist/src/session/session-persistence.d.ts +44 -0
  152. package/dist/src/session/session-persistence.d.ts.map +1 -0
  153. package/dist/src/session/session-persistence.js +150 -0
  154. package/dist/src/session/session-persistence.js.map +1 -0
  155. package/dist/src/session/undo-manager.d.ts +35 -0
  156. package/dist/src/session/undo-manager.d.ts.map +1 -0
  157. package/dist/src/session/undo-manager.js +79 -0
  158. package/dist/src/session/undo-manager.js.map +1 -0
  159. package/dist/src/tools/built-in/ask-user.d.ts +7 -0
  160. package/dist/src/tools/built-in/ask-user.d.ts.map +1 -0
  161. package/dist/src/tools/built-in/ask-user.js +28 -0
  162. package/dist/src/tools/built-in/ask-user.js.map +1 -0
  163. package/dist/src/tools/built-in/bash.d.ts +9 -0
  164. package/dist/src/tools/built-in/bash.d.ts.map +1 -0
  165. package/dist/src/tools/built-in/bash.js +67 -0
  166. package/dist/src/tools/built-in/bash.js.map +1 -0
  167. package/dist/src/tools/built-in/file-edit.d.ts +9 -0
  168. package/dist/src/tools/built-in/file-edit.d.ts.map +1 -0
  169. package/dist/src/tools/built-in/file-edit.js +39 -0
  170. package/dist/src/tools/built-in/file-edit.js.map +1 -0
  171. package/dist/src/tools/built-in/file-read.d.ts +9 -0
  172. package/dist/src/tools/built-in/file-read.d.ts.map +1 -0
  173. package/dist/src/tools/built-in/file-read.js +41 -0
  174. package/dist/src/tools/built-in/file-read.js.map +1 -0
  175. package/dist/src/tools/built-in/file-write.d.ts +8 -0
  176. package/dist/src/tools/built-in/file-write.d.ts.map +1 -0
  177. package/dist/src/tools/built-in/file-write.js +29 -0
  178. package/dist/src/tools/built-in/file-write.js.map +1 -0
  179. package/dist/src/tools/built-in/git-commit.d.ts +12 -0
  180. package/dist/src/tools/built-in/git-commit.d.ts.map +1 -0
  181. package/dist/src/tools/built-in/git-commit.js +96 -0
  182. package/dist/src/tools/built-in/git-commit.js.map +1 -0
  183. package/dist/src/tools/built-in/git-diff.d.ts +8 -0
  184. package/dist/src/tools/built-in/git-diff.d.ts.map +1 -0
  185. package/dist/src/tools/built-in/git-diff.js +43 -0
  186. package/dist/src/tools/built-in/git-diff.js.map +1 -0
  187. package/dist/src/tools/built-in/git-log.d.ts +8 -0
  188. package/dist/src/tools/built-in/git-log.d.ts.map +1 -0
  189. package/dist/src/tools/built-in/git-log.js +39 -0
  190. package/dist/src/tools/built-in/git-log.js.map +1 -0
  191. package/dist/src/tools/built-in/glob.d.ts +8 -0
  192. package/dist/src/tools/built-in/glob.d.ts.map +1 -0
  193. package/dist/src/tools/built-in/glob.js +60 -0
  194. package/dist/src/tools/built-in/glob.js.map +1 -0
  195. package/dist/src/tools/built-in/grep.d.ts +9 -0
  196. package/dist/src/tools/built-in/grep.d.ts.map +1 -0
  197. package/dist/src/tools/built-in/grep.js +115 -0
  198. package/dist/src/tools/built-in/grep.js.map +1 -0
  199. package/dist/src/tools/built-in/index.d.ts +21 -0
  200. package/dist/src/tools/built-in/index.d.ts.map +1 -0
  201. package/dist/src/tools/built-in/index.js +30 -0
  202. package/dist/src/tools/built-in/index.js.map +1 -0
  203. package/dist/src/tools/built-in/think.d.ts +7 -0
  204. package/dist/src/tools/built-in/think.d.ts.map +1 -0
  205. package/dist/src/tools/built-in/think.js +18 -0
  206. package/dist/src/tools/built-in/think.js.map +1 -0
  207. package/dist/src/tools/built-in/web-fetch.d.ts +11 -0
  208. package/dist/src/tools/built-in/web-fetch.d.ts.map +1 -0
  209. package/dist/src/tools/built-in/web-fetch.js +70 -0
  210. package/dist/src/tools/built-in/web-fetch.js.map +1 -0
  211. package/dist/src/tools/executor.d.ts +25 -0
  212. package/dist/src/tools/executor.d.ts.map +1 -0
  213. package/dist/src/tools/executor.js +61 -0
  214. package/dist/src/tools/executor.js.map +1 -0
  215. package/dist/src/tools/registry.d.ts +25 -0
  216. package/dist/src/tools/registry.d.ts.map +1 -0
  217. package/dist/src/tools/registry.js +135 -0
  218. package/dist/src/tools/registry.js.map +1 -0
  219. package/package.json +63 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Built-in git_commit tool — commit changes from the working tree.
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { z } from 'zod';
6
+ import { defineTool } from '../registry.js';
7
+ function runGit(args, cwd) {
8
+ return new Promise((resolve) => {
9
+ const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
10
+ const stdout = [];
11
+ const stderr = [];
12
+ child.stdout.on('data', (c) => stdout.push(c));
13
+ child.stderr.on('data', (c) => stderr.push(c));
14
+ child.on('close', (code) => {
15
+ resolve({
16
+ stdout: Buffer.concat(stdout).toString('utf-8').trim(),
17
+ stderr: Buffer.concat(stderr).toString('utf-8').trim(),
18
+ code: code ?? 1,
19
+ });
20
+ });
21
+ child.on('error', (err) => {
22
+ resolve({ stdout: '', stderr: err.message, code: 1 });
23
+ });
24
+ });
25
+ }
26
+ export const gitCommitTool = defineTool({
27
+ name: 'git_commit',
28
+ description: 'Stage and commit files. Can stage specific files or all changes, ' +
29
+ 'then create a commit with the given message.',
30
+ inputSchema: z.object({
31
+ message: z.string().describe('Commit message.'),
32
+ files: z.array(z.string()).optional().describe('Specific files to stage. If omitted, stages all changes (git add -A).'),
33
+ }),
34
+ execute: async (input, context) => {
35
+ const cwd = context.cwd ?? process.cwd();
36
+ // Stage files
37
+ if (input.files && input.files.length > 0) {
38
+ const stageResult = await runGit(['add', '--', ...input.files], cwd);
39
+ if (stageResult.code !== 0) {
40
+ return { data: `git add failed: ${stageResult.stderr}`, isError: true };
41
+ }
42
+ }
43
+ else {
44
+ const stageResult = await runGit(['add', '-A'], cwd);
45
+ if (stageResult.code !== 0) {
46
+ return { data: `git add failed: ${stageResult.stderr}`, isError: true };
47
+ }
48
+ }
49
+ // Commit
50
+ const commitResult = await runGit(['commit', '-m', input.message], cwd);
51
+ if (commitResult.code !== 0) {
52
+ // "nothing to commit" is not really an error
53
+ if (commitResult.stdout.includes('nothing to commit')) {
54
+ return { data: 'Nothing to commit, working tree clean.' };
55
+ }
56
+ return { data: `git commit failed: ${commitResult.stderr || commitResult.stdout}`, isError: true };
57
+ }
58
+ return { data: commitResult.stdout };
59
+ },
60
+ });
61
+ export const gitBranchTool = defineTool({
62
+ name: 'git_branch',
63
+ description: 'Create, switch, or list git branches.',
64
+ inputSchema: z.object({
65
+ action: z.enum(['list', 'create', 'switch']).describe('Branch action.'),
66
+ name: z.string().optional().describe('Branch name (for create/switch).'),
67
+ }),
68
+ execute: async (input, context) => {
69
+ const cwd = context.cwd ?? process.cwd();
70
+ switch (input.action) {
71
+ case 'list': {
72
+ const result = await runGit(['branch', '--no-color', '-a'], cwd);
73
+ return { data: result.stdout || '(no branches)', isError: result.code !== 0 };
74
+ }
75
+ case 'create': {
76
+ if (!input.name)
77
+ return { data: 'Branch name required.', isError: true };
78
+ const result = await runGit(['checkout', '-b', input.name], cwd);
79
+ if (result.code !== 0) {
80
+ return { data: result.stderr, isError: true };
81
+ }
82
+ return { data: `Created and switched to branch: ${input.name}` };
83
+ }
84
+ case 'switch': {
85
+ if (!input.name)
86
+ return { data: 'Branch name required.', isError: true };
87
+ const result = await runGit(['checkout', input.name], cwd);
88
+ if (result.code !== 0) {
89
+ return { data: result.stderr, isError: true };
90
+ }
91
+ return { data: `Switched to branch: ${input.name}` };
92
+ }
93
+ }
94
+ },
95
+ });
96
+ //# sourceMappingURL=git-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-commit.js","sourceRoot":"","sources":["../../../../src/tools/built-in/git-commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Built-in git_diff tool — show git diff of working tree.
3
+ */
4
+ export declare const gitDiffTool: import("../registry.js").ToolDefinition<{
5
+ path?: string | undefined;
6
+ staged?: boolean | undefined;
7
+ }>;
8
+ //# sourceMappingURL=git-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-diff.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/git-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,eAAO,MAAM,WAAW;;;EAwCtB,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Built-in git_diff tool — show git diff of working tree.
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { z } from 'zod';
6
+ import { defineTool } from '../registry.js';
7
+ export const gitDiffTool = defineTool({
8
+ name: 'git_diff',
9
+ description: 'Show the git diff of the working tree or staged changes. ' +
10
+ 'Useful for reviewing changes before committing.',
11
+ inputSchema: z.object({
12
+ staged: z.boolean().optional().describe('If true, show staged changes (--cached).'),
13
+ path: z.string().optional().describe('Limit diff to a specific file or directory.'),
14
+ }),
15
+ execute: async (input, context) => {
16
+ const args = ['diff', '--no-color'];
17
+ if (input.staged)
18
+ args.push('--cached');
19
+ if (input.path)
20
+ args.push('--', input.path);
21
+ const cwd = context.cwd ?? process.cwd();
22
+ return new Promise((resolve) => {
23
+ const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
24
+ const chunks = [];
25
+ const errChunks = [];
26
+ child.stdout.on('data', (c) => chunks.push(c));
27
+ child.stderr.on('data', (c) => errChunks.push(c));
28
+ child.on('close', (code) => {
29
+ if (code === 0) {
30
+ const output = Buffer.concat(chunks).toString('utf-8').trim();
31
+ resolve({ data: output || '(no changes)' });
32
+ }
33
+ else {
34
+ resolve({ data: Buffer.concat(errChunks).toString('utf-8'), isError: true });
35
+ }
36
+ });
37
+ child.on('error', (err) => {
38
+ resolve({ data: err.message, isError: true });
39
+ });
40
+ });
41
+ },
42
+ });
43
+ //# sourceMappingURL=git-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../../src/tools/built-in/git-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,2DAA2D;QAC3D,iDAAiD;IAEnD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACnF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACpF,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QACnC,IAAI,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACvC,IAAI,KAAK,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAE3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;QAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,MAAM,SAAS,GAAa,EAAE,CAAA;YAE9B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACtD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAEzD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;oBAC7D,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,cAAc,EAAE,CAAC,CAAA;gBAC7C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC9E,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Built-in git_log tool — recent git history.
3
+ */
4
+ export declare const gitLogTool: import("../registry.js").ToolDefinition<{
5
+ count?: number | undefined;
6
+ oneline?: boolean | undefined;
7
+ }>;
8
+ //# sourceMappingURL=git-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-log.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/git-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,eAAO,MAAM,UAAU;;;EAoCrB,CAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Built-in git_log tool — recent git history.
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { z } from 'zod';
6
+ import { defineTool } from '../registry.js';
7
+ export const gitLogTool = defineTool({
8
+ name: 'git_log',
9
+ description: 'Show recent git commit history.',
10
+ inputSchema: z.object({
11
+ count: z.number().optional().describe('Number of commits to show. Defaults to 10.'),
12
+ oneline: z.boolean().optional().describe('Use one-line format. Defaults to true.'),
13
+ }),
14
+ execute: async (input, context) => {
15
+ const count = input.count ?? 10;
16
+ const format = input.oneline !== false ? '--oneline' : '--format=medium';
17
+ const args = ['log', format, `-n${count}`, '--no-color'];
18
+ const cwd = context.cwd ?? process.cwd();
19
+ return new Promise((resolve) => {
20
+ const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
21
+ const chunks = [];
22
+ const errChunks = [];
23
+ child.stdout.on('data', (c) => chunks.push(c));
24
+ child.stderr.on('data', (c) => errChunks.push(c));
25
+ child.on('close', (code) => {
26
+ if (code === 0) {
27
+ resolve({ data: Buffer.concat(chunks).toString('utf-8').trim() || '(no commits)' });
28
+ }
29
+ else {
30
+ resolve({ data: Buffer.concat(errChunks).toString('utf-8'), isError: true });
31
+ }
32
+ });
33
+ child.on('error', (err) => {
34
+ resolve({ data: err.message, isError: true });
35
+ });
36
+ });
37
+ },
38
+ });
39
+ //# sourceMappingURL=git-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-log.js","sourceRoot":"","sources":["../../../../src/tools/built-in/git-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,iCAAiC;IAE9C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACnF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAA;QACxE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,EAAE,YAAY,CAAC,CAAA;QACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;QAExC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,MAAM,SAAS,GAAa,EAAE,CAAA;YAE9B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACtD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAEzD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,cAAc,EAAE,CAAC,CAAA;gBACrF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC9E,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Built-in glob tool — find files by pattern.
3
+ */
4
+ export declare const globTool: import("../registry.js").ToolDefinition<{
5
+ pattern: string;
6
+ path?: string | undefined;
7
+ }>;
8
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/glob.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,eAAO,MAAM,QAAQ;;;EAuCnB,CAAA"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Built-in glob tool — find files by pattern.
3
+ */
4
+ import { readdir } from 'fs/promises';
5
+ import { join, relative } from 'path';
6
+ import { z } from 'zod';
7
+ import { defineTool } from '../registry.js';
8
+ export const globTool = defineTool({
9
+ name: 'glob',
10
+ description: 'Find files matching a glob pattern. Useful for discovering project structure. ' +
11
+ 'Skips node_modules and hidden directories by default.',
12
+ inputSchema: z.object({
13
+ pattern: z.string().describe('Glob pattern (e.g. "**/*.ts", "src/**/*.js").'),
14
+ path: z.string().optional().describe('Root directory to search from. Defaults to cwd.'),
15
+ }),
16
+ execute: async (input, context) => {
17
+ const root = input.path ?? context.cwd ?? process.cwd();
18
+ const regex = globToRegex(input.pattern);
19
+ const matches = [];
20
+ async function walk(dir) {
21
+ if (matches.length > 500)
22
+ return;
23
+ try {
24
+ const entries = await readdir(dir, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
27
+ continue;
28
+ const full = join(dir, entry.name);
29
+ const rel = relative(root, full);
30
+ if (entry.isDirectory()) {
31
+ if (regex.test(rel + '/'))
32
+ matches.push(rel + '/');
33
+ await walk(full);
34
+ }
35
+ else if (entry.isFile() && regex.test(rel)) {
36
+ matches.push(rel);
37
+ }
38
+ }
39
+ }
40
+ catch {
41
+ // skip unreadable directories
42
+ }
43
+ }
44
+ await walk(root);
45
+ return { data: matches.slice(0, 500).join('\n') || '(no matches)' };
46
+ },
47
+ });
48
+ function globToRegex(glob) {
49
+ let pattern = glob
50
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
51
+ // Handle glob ? FIRST (before we generate regex ? quantifiers)
52
+ .replace(/\?/g, '[^/]')
53
+ // Handle **/ (match zero or more directories)
54
+ .replace(/\*\*\//g, '(.+/)?')
55
+ // Handle remaining ** (e.g. trailing /**)
56
+ .replace(/\*\*/g, '.*')
57
+ .replace(/\*/g, '[^/]*');
58
+ return new RegExp(`^${pattern}$`, 'i');
59
+ }
60
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../../src/tools/built-in/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Built-in grep tool — search files with regex, ripgrep-first with Node fallback.
3
+ */
4
+ export declare const grepTool: import("../registry.js").ToolDefinition<{
5
+ pattern: string;
6
+ path?: string | undefined;
7
+ include?: string | undefined;
8
+ }>;
9
+ //# sourceMappingURL=grep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/grep.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,eAAO,MAAM,QAAQ;;;;EA6BnB,CAAA"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Built-in grep tool — search files with regex, ripgrep-first with Node fallback.
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { readdir, readFile, stat } from 'fs/promises';
6
+ import { join, relative } from 'path';
7
+ import { z } from 'zod';
8
+ import { defineTool } from '../registry.js';
9
+ export const grepTool = defineTool({
10
+ name: 'grep',
11
+ description: 'Search for a regex pattern in files. Uses ripgrep (rg) if available, ' +
12
+ 'otherwise falls back to a Node.js implementation. Returns matching lines with file paths.',
13
+ inputSchema: z.object({
14
+ pattern: z.string().describe('Regex pattern to search for.'),
15
+ path: z.string().optional().describe('Directory or file to search in. Defaults to cwd.'),
16
+ include: z.string().optional().describe('Glob pattern to filter files (e.g. "*.ts").'),
17
+ }),
18
+ execute: async (input, context) => {
19
+ const searchPath = input.path ?? context.cwd ?? process.cwd();
20
+ try {
21
+ const result = await tryRipgrep(input.pattern, searchPath, input.include);
22
+ return { data: result || '(no matches)' };
23
+ }
24
+ catch {
25
+ // ripgrep not available, use Node fallback
26
+ try {
27
+ const result = await nodeGrep(input.pattern, searchPath, input.include);
28
+ return { data: result || '(no matches)' };
29
+ }
30
+ catch (err) {
31
+ const msg = err instanceof Error ? err.message : String(err);
32
+ return { data: msg, isError: true };
33
+ }
34
+ }
35
+ },
36
+ });
37
+ function tryRipgrep(pattern, searchPath, include) {
38
+ return new Promise((resolve, reject) => {
39
+ const args = ['--no-heading', '--line-number', '--color', 'never', '-e', pattern];
40
+ if (include)
41
+ args.push('--glob', include);
42
+ args.push(searchPath);
43
+ const child = spawn('rg', args, { stdio: ['ignore', 'pipe', 'pipe'] });
44
+ const chunks = [];
45
+ child.stdout.on('data', (chunk) => chunks.push(chunk));
46
+ child.on('close', (code) => {
47
+ if (code === 0 || code === 1) {
48
+ resolve(Buffer.concat(chunks).toString('utf-8').trim());
49
+ }
50
+ else {
51
+ reject(new Error(`rg exited with code ${code}`));
52
+ }
53
+ });
54
+ child.on('error', reject);
55
+ });
56
+ }
57
+ async function nodeGrep(pattern, searchPath, include) {
58
+ const regex = new RegExp(pattern, 'gi');
59
+ const includeRegex = include ? globToRegex(include) : null;
60
+ const results = [];
61
+ async function walk(dir) {
62
+ const entries = await readdir(dir, { withFileTypes: true });
63
+ for (const entry of entries) {
64
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
65
+ continue;
66
+ const full = join(dir, entry.name);
67
+ if (entry.isDirectory()) {
68
+ await walk(full);
69
+ }
70
+ else if (entry.isFile()) {
71
+ if (includeRegex && !includeRegex.test(entry.name))
72
+ continue;
73
+ try {
74
+ const content = await readFile(full, 'utf-8');
75
+ const lines = content.split('\n');
76
+ for (let i = 0; i < lines.length; i++) {
77
+ if (regex.test(lines[i])) {
78
+ const rel = relative(searchPath, full);
79
+ results.push(`${rel}:${i + 1}:${lines[i]}`);
80
+ }
81
+ regex.lastIndex = 0;
82
+ }
83
+ }
84
+ catch {
85
+ // skip binary/unreadable files
86
+ }
87
+ }
88
+ }
89
+ if (results.length > 200)
90
+ return;
91
+ }
92
+ const info = await stat(searchPath);
93
+ if (info.isFile()) {
94
+ const content = await readFile(searchPath, 'utf-8');
95
+ const lines = content.split('\n');
96
+ for (let i = 0; i < lines.length; i++) {
97
+ if (regex.test(lines[i])) {
98
+ results.push(`${searchPath}:${i + 1}:${lines[i]}`);
99
+ }
100
+ regex.lastIndex = 0;
101
+ }
102
+ }
103
+ else {
104
+ await walk(searchPath);
105
+ }
106
+ return results.slice(0, 200).join('\n');
107
+ }
108
+ function globToRegex(glob) {
109
+ const escaped = glob
110
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
111
+ .replace(/\*/g, '.*')
112
+ .replace(/\?/g, '.');
113
+ return new RegExp(`^${escaped}$`, 'i');
114
+ }
115
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../../src/tools/built-in/grep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Built-in tool collection — register all tools at once.
3
+ */
4
+ import type { ToolDefinition } from '../../core/types.js';
5
+ import { ToolRegistry } from '../registry.js';
6
+ import { bashTool } from './bash.js';
7
+ import { fileReadTool } from './file-read.js';
8
+ import { fileWriteTool } from './file-write.js';
9
+ import { fileEditTool } from './file-edit.js';
10
+ import { grepTool } from './grep.js';
11
+ import { globTool } from './glob.js';
12
+ import { gitDiffTool } from './git-diff.js';
13
+ import { gitLogTool } from './git-log.js';
14
+ import { gitCommitTool, gitBranchTool } from './git-commit.js';
15
+ import { thinkTool } from './think.js';
16
+ import { webFetchTool } from './web-fetch.js';
17
+ import { askUserTool } from './ask-user.js';
18
+ export { bashTool, fileReadTool, fileWriteTool, fileEditTool, grepTool, globTool, gitDiffTool, gitLogTool, gitCommitTool, gitBranchTool, thinkTool, webFetchTool, askUserTool, };
19
+ export declare const BUILT_IN_TOOLS: ToolDefinition<any>[];
20
+ export declare function registerBuiltInTools(registry: ToolRegistry): void;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EACL,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EACnD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EACzE,SAAS,EAAE,YAAY,EAAE,WAAW,GACrC,CAAA;AAGD,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,EAI/C,CAAA;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAMjE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Built-in tool collection — register all tools at once.
3
+ */
4
+ import { bashTool } from './bash.js';
5
+ import { fileReadTool } from './file-read.js';
6
+ import { fileWriteTool } from './file-write.js';
7
+ import { fileEditTool } from './file-edit.js';
8
+ import { grepTool } from './grep.js';
9
+ import { globTool } from './glob.js';
10
+ import { gitDiffTool } from './git-diff.js';
11
+ import { gitLogTool } from './git-log.js';
12
+ import { gitCommitTool, gitBranchTool } from './git-commit.js';
13
+ import { thinkTool } from './think.js';
14
+ import { webFetchTool } from './web-fetch.js';
15
+ import { askUserTool } from './ask-user.js';
16
+ export { bashTool, fileReadTool, fileWriteTool, fileEditTool, grepTool, globTool, gitDiffTool, gitLogTool, gitCommitTool, gitBranchTool, thinkTool, webFetchTool, askUserTool, };
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ export const BUILT_IN_TOOLS = [
19
+ bashTool, fileReadTool, fileWriteTool, fileEditTool,
20
+ grepTool, globTool, gitDiffTool, gitLogTool, gitCommitTool, gitBranchTool,
21
+ thinkTool, webFetchTool, askUserTool,
22
+ ];
23
+ export function registerBuiltInTools(registry) {
24
+ for (const tool of BUILT_IN_TOOLS) {
25
+ if (!registry.has(tool.name)) {
26
+ registry.register(tool);
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tools/built-in/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EACL,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EACnD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EACzE,SAAS,EAAE,YAAY,EAAE,WAAW,GACrC,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAA0B;IACnD,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY;IACnD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa;IACzE,SAAS,EAAE,YAAY,EAAE,WAAW;CACrC,CAAA;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Built-in think tool — extended thinking scratchpad with no side effects.
3
+ */
4
+ export declare const thinkTool: import("../registry.js").ToolDefinition<{
5
+ thought: string;
6
+ }>;
7
+ //# sourceMappingURL=think.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"think.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/think.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,SAAS;;EAcpB,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Built-in think tool — extended thinking scratchpad with no side effects.
3
+ */
4
+ import { z } from 'zod';
5
+ import { defineTool } from '../registry.js';
6
+ export const thinkTool = defineTool({
7
+ name: 'think',
8
+ description: 'Use this tool to think through complex problems step by step. ' +
9
+ 'Has no side effects — purely a reasoning scratchpad. ' +
10
+ 'Use before making important decisions or complex code changes.',
11
+ inputSchema: z.object({
12
+ thought: z.string().describe('Your step-by-step reasoning.'),
13
+ }),
14
+ execute: async (input) => {
15
+ return { data: `Thought recorded: ${input.thought.slice(0, 100)}...` };
16
+ },
17
+ });
18
+ //# sourceMappingURL=think.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"think.js","sourceRoot":"","sources":["../../../../src/tools/built-in/think.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,IAAI,EAAE,OAAO;IACb,WAAW,EACT,gEAAgE;QAChE,uDAAuD;QACvD,gEAAgE;IAElE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KAC7D,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvB,OAAO,EAAE,IAAI,EAAE,qBAAqB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;IACxE,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * web_fetch — HTTP fetch tool for retrieving web content.
3
+ */
4
+ export declare const webFetchTool: import("../registry.js").ToolDefinition<{
5
+ url: string;
6
+ method?: "GET" | "POST" | undefined;
7
+ headers?: Record<string, string> | undefined;
8
+ body?: string | undefined;
9
+ maxBytes?: number | undefined;
10
+ }>;
11
+ //# sourceMappingURL=web-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/web-fetch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,YAAY;;;;;;EAuEvB,CAAA"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * web_fetch — HTTP fetch tool for retrieving web content.
3
+ */
4
+ import { z } from 'zod';
5
+ import { defineTool } from '../registry.js';
6
+ export const webFetchTool = defineTool({
7
+ name: 'web_fetch',
8
+ description: 'Fetch content from a URL. Returns the response body as text. Supports GET and POST.',
9
+ inputSchema: z.object({
10
+ url: z.string().describe('The URL to fetch'),
11
+ method: z.enum(['GET', 'POST']).default('GET').describe('HTTP method'),
12
+ headers: z.record(z.string()).optional().describe('Additional HTTP headers'),
13
+ body: z.string().optional().describe('Request body (for POST)'),
14
+ maxBytes: z.number().default(100000).describe('Max response size in bytes (default: 100KB)'),
15
+ }),
16
+ execute: async (input) => {
17
+ // Validate URL
18
+ let parsed;
19
+ try {
20
+ parsed = new URL(input.url);
21
+ }
22
+ catch {
23
+ return { data: `Invalid URL: ${input.url}`, isError: true };
24
+ }
25
+ // Block private/internal addresses
26
+ const hostname = parsed.hostname.toLowerCase();
27
+ if (hostname === 'localhost' ||
28
+ hostname === '127.0.0.1' ||
29
+ hostname === '::1' ||
30
+ hostname === '0.0.0.0' ||
31
+ hostname.endsWith('.local') ||
32
+ hostname.startsWith('192.168.') ||
33
+ hostname.startsWith('10.') ||
34
+ hostname.startsWith('172.16.') ||
35
+ /^169\.254\./.test(hostname)) {
36
+ return { data: `Blocked: cannot fetch private/internal addresses (${hostname})`, isError: true };
37
+ }
38
+ // Only allow http/https
39
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
40
+ return { data: `Blocked: only http/https URLs are allowed`, isError: true };
41
+ }
42
+ try {
43
+ const controller = new AbortController();
44
+ const timeout = setTimeout(() => controller.abort(), 30000);
45
+ const response = await fetch(input.url, {
46
+ method: input.method,
47
+ headers: input.headers,
48
+ body: input.method === 'POST' ? input.body : undefined,
49
+ signal: controller.signal,
50
+ redirect: 'follow',
51
+ });
52
+ clearTimeout(timeout);
53
+ const contentType = response.headers.get('content-type') ?? '';
54
+ const buffer = await response.arrayBuffer();
55
+ const maxBytes = input.maxBytes ?? 100000;
56
+ if (buffer.byteLength > maxBytes) {
57
+ const text = new TextDecoder().decode(buffer.slice(0, maxBytes));
58
+ return { data: `[${response.status}] (truncated to ${maxBytes} bytes)\n${text}` };
59
+ }
60
+ const text = new TextDecoder().decode(buffer);
61
+ const statusLine = `[${response.status} ${response.statusText}] ${contentType}`;
62
+ return { data: `${statusLine}\n${text}` };
63
+ }
64
+ catch (err) {
65
+ const msg = err instanceof Error ? err.message : String(err);
66
+ return { data: `Fetch failed: ${msg}`, isError: true };
67
+ }
68
+ },
69
+ });
70
+ //# sourceMappingURL=web-fetch.js.map