@element47/ag 4.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 (158) hide show
  1. package/README.md +316 -0
  2. package/dist/cli/parser.d.ts +6 -0
  3. package/dist/cli/parser.d.ts.map +1 -0
  4. package/dist/cli/parser.js +62 -0
  5. package/dist/cli/parser.js.map +1 -0
  6. package/dist/cli/repl.d.ts +16 -0
  7. package/dist/cli/repl.d.ts.map +1 -0
  8. package/dist/cli/repl.js +599 -0
  9. package/dist/cli/repl.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +84 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/core/__tests__/agent.test.d.ts +2 -0
  15. package/dist/core/__tests__/agent.test.d.ts.map +1 -0
  16. package/dist/core/__tests__/agent.test.js +53 -0
  17. package/dist/core/__tests__/agent.test.js.map +1 -0
  18. package/dist/core/__tests__/config.test.d.ts +2 -0
  19. package/dist/core/__tests__/config.test.d.ts.map +1 -0
  20. package/dist/core/__tests__/config.test.js +58 -0
  21. package/dist/core/__tests__/config.test.js.map +1 -0
  22. package/dist/core/__tests__/constants.test.d.ts +2 -0
  23. package/dist/core/__tests__/constants.test.d.ts.map +1 -0
  24. package/dist/core/__tests__/constants.test.js +40 -0
  25. package/dist/core/__tests__/constants.test.js.map +1 -0
  26. package/dist/core/__tests__/context.test.d.ts +2 -0
  27. package/dist/core/__tests__/context.test.d.ts.map +1 -0
  28. package/dist/core/__tests__/context.test.js +120 -0
  29. package/dist/core/__tests__/context.test.js.map +1 -0
  30. package/dist/core/__tests__/environment.test.d.ts +2 -0
  31. package/dist/core/__tests__/environment.test.d.ts.map +1 -0
  32. package/dist/core/__tests__/environment.test.js +94 -0
  33. package/dist/core/__tests__/environment.test.js.map +1 -0
  34. package/dist/core/__tests__/permissions.test.d.ts +2 -0
  35. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  36. package/dist/core/__tests__/permissions.test.js +66 -0
  37. package/dist/core/__tests__/permissions.test.js.map +1 -0
  38. package/dist/core/__tests__/registry.test.d.ts +2 -0
  39. package/dist/core/__tests__/registry.test.d.ts.map +1 -0
  40. package/dist/core/__tests__/registry.test.js +152 -0
  41. package/dist/core/__tests__/registry.test.js.map +1 -0
  42. package/dist/core/__tests__/streaming.test.d.ts +2 -0
  43. package/dist/core/__tests__/streaming.test.d.ts.map +1 -0
  44. package/dist/core/__tests__/streaming.test.js +54 -0
  45. package/dist/core/__tests__/streaming.test.js.map +1 -0
  46. package/dist/core/agent.d.ts +87 -0
  47. package/dist/core/agent.d.ts.map +1 -0
  48. package/dist/core/agent.js +711 -0
  49. package/dist/core/agent.js.map +1 -0
  50. package/dist/core/colors.d.ts +12 -0
  51. package/dist/core/colors.d.ts.map +1 -0
  52. package/dist/core/colors.js +37 -0
  53. package/dist/core/colors.js.map +1 -0
  54. package/dist/core/config.d.ts +13 -0
  55. package/dist/core/config.d.ts.map +1 -0
  56. package/dist/core/config.js +30 -0
  57. package/dist/core/config.js.map +1 -0
  58. package/dist/core/constants.d.ts +5 -0
  59. package/dist/core/constants.d.ts.map +1 -0
  60. package/dist/core/constants.js +26 -0
  61. package/dist/core/constants.js.map +1 -0
  62. package/dist/core/context.d.ts +18 -0
  63. package/dist/core/context.d.ts.map +1 -0
  64. package/dist/core/context.js +99 -0
  65. package/dist/core/context.js.map +1 -0
  66. package/dist/core/loader.d.ts +3 -0
  67. package/dist/core/loader.d.ts.map +1 -0
  68. package/dist/core/loader.js +39 -0
  69. package/dist/core/loader.js.map +1 -0
  70. package/dist/core/registry.d.ts +11 -0
  71. package/dist/core/registry.d.ts.map +1 -0
  72. package/dist/core/registry.js +112 -0
  73. package/dist/core/registry.js.map +1 -0
  74. package/dist/core/skills.d.ts +14 -0
  75. package/dist/core/skills.d.ts.map +1 -0
  76. package/dist/core/skills.js +100 -0
  77. package/dist/core/skills.js.map +1 -0
  78. package/dist/core/types.d.ts +64 -0
  79. package/dist/core/types.d.ts.map +1 -0
  80. package/dist/core/types.js +2 -0
  81. package/dist/core/types.js.map +1 -0
  82. package/dist/core/version.d.ts +2 -0
  83. package/dist/core/version.d.ts.map +1 -0
  84. package/dist/core/version.js +7 -0
  85. package/dist/core/version.js.map +1 -0
  86. package/dist/memory/__tests__/memory.test.d.ts +2 -0
  87. package/dist/memory/__tests__/memory.test.d.ts.map +1 -0
  88. package/dist/memory/__tests__/memory.test.js +196 -0
  89. package/dist/memory/__tests__/memory.test.js.map +1 -0
  90. package/dist/memory/memory.d.ts +41 -0
  91. package/dist/memory/memory.d.ts.map +1 -0
  92. package/dist/memory/memory.js +206 -0
  93. package/dist/memory/memory.js.map +1 -0
  94. package/dist/tools/__tests__/bash.test.d.ts +2 -0
  95. package/dist/tools/__tests__/bash.test.d.ts.map +1 -0
  96. package/dist/tools/__tests__/bash.test.js +58 -0
  97. package/dist/tools/__tests__/bash.test.js.map +1 -0
  98. package/dist/tools/__tests__/file.test.d.ts +2 -0
  99. package/dist/tools/__tests__/file.test.d.ts.map +1 -0
  100. package/dist/tools/__tests__/file.test.js +115 -0
  101. package/dist/tools/__tests__/file.test.js.map +1 -0
  102. package/dist/tools/__tests__/git.test.d.ts +2 -0
  103. package/dist/tools/__tests__/git.test.d.ts.map +1 -0
  104. package/dist/tools/__tests__/git.test.js +19 -0
  105. package/dist/tools/__tests__/git.test.js.map +1 -0
  106. package/dist/tools/__tests__/grep.test.d.ts +2 -0
  107. package/dist/tools/__tests__/grep.test.d.ts.map +1 -0
  108. package/dist/tools/__tests__/grep.test.js +36 -0
  109. package/dist/tools/__tests__/grep.test.js.map +1 -0
  110. package/dist/tools/__tests__/memory-tool.test.d.ts +2 -0
  111. package/dist/tools/__tests__/memory-tool.test.d.ts.map +1 -0
  112. package/dist/tools/__tests__/memory-tool.test.js +39 -0
  113. package/dist/tools/__tests__/memory-tool.test.js.map +1 -0
  114. package/dist/tools/__tests__/plan.test.d.ts +2 -0
  115. package/dist/tools/__tests__/plan.test.d.ts.map +1 -0
  116. package/dist/tools/__tests__/plan.test.js +81 -0
  117. package/dist/tools/__tests__/plan.test.js.map +1 -0
  118. package/dist/tools/__tests__/schemas.test.d.ts +2 -0
  119. package/dist/tools/__tests__/schemas.test.d.ts.map +1 -0
  120. package/dist/tools/__tests__/schemas.test.js +40 -0
  121. package/dist/tools/__tests__/schemas.test.js.map +1 -0
  122. package/dist/tools/__tests__/web.test.d.ts +2 -0
  123. package/dist/tools/__tests__/web.test.d.ts.map +1 -0
  124. package/dist/tools/__tests__/web.test.js +51 -0
  125. package/dist/tools/__tests__/web.test.js.map +1 -0
  126. package/dist/tools/bash.d.ts +6 -0
  127. package/dist/tools/bash.d.ts.map +1 -0
  128. package/dist/tools/bash.js +89 -0
  129. package/dist/tools/bash.js.map +1 -0
  130. package/dist/tools/file.d.ts +7 -0
  131. package/dist/tools/file.d.ts.map +1 -0
  132. package/dist/tools/file.js +224 -0
  133. package/dist/tools/file.js.map +1 -0
  134. package/dist/tools/git.d.ts +3 -0
  135. package/dist/tools/git.d.ts.map +1 -0
  136. package/dist/tools/git.js +220 -0
  137. package/dist/tools/git.js.map +1 -0
  138. package/dist/tools/grep.d.ts +8 -0
  139. package/dist/tools/grep.d.ts.map +1 -0
  140. package/dist/tools/grep.js +265 -0
  141. package/dist/tools/grep.js.map +1 -0
  142. package/dist/tools/memory.d.ts +3 -0
  143. package/dist/tools/memory.d.ts.map +1 -0
  144. package/dist/tools/memory.js +33 -0
  145. package/dist/tools/memory.js.map +1 -0
  146. package/dist/tools/plan.d.ts +3 -0
  147. package/dist/tools/plan.d.ts.map +1 -0
  148. package/dist/tools/plan.js +60 -0
  149. package/dist/tools/plan.js.map +1 -0
  150. package/dist/tools/skill.d.ts +6 -0
  151. package/dist/tools/skill.d.ts.map +1 -0
  152. package/dist/tools/skill.js +20 -0
  153. package/dist/tools/skill.js.map +1 -0
  154. package/dist/tools/web.d.ts +3 -0
  155. package/dist/tools/web.d.ts.map +1 -0
  156. package/dist/tools/web.js +187 -0
  157. package/dist/tools/web.js.map +1 -0
  158. package/package.json +48 -0
@@ -0,0 +1,81 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { planTool } from '../plan.js';
3
+ import { mkdirSync, rmSync, existsSync } from 'node:fs';
4
+ import { randomBytes } from 'node:crypto';
5
+ import { paths } from '../../memory/memory.js';
6
+ const fakeCwd = `/tmp/__ag_plan_test_${randomBytes(8).toString('hex')}__`;
7
+ let projectDir;
8
+ let plan;
9
+ beforeEach(() => {
10
+ mkdirSync(fakeCwd, { recursive: true });
11
+ projectDir = paths(fakeCwd).projectDir;
12
+ plan = planTool(fakeCwd);
13
+ });
14
+ afterEach(() => {
15
+ if (existsSync(projectDir))
16
+ rmSync(projectDir, { recursive: true });
17
+ if (existsSync(fakeCwd))
18
+ rmSync(fakeCwd, { recursive: true });
19
+ });
20
+ describe('plan tool', () => {
21
+ it('save creates a plan and returns path', async () => {
22
+ const result = await plan.execute({ action: 'save', content: '# My Plan\nStep 1' });
23
+ expect(result).toContain('Plan saved');
24
+ });
25
+ it('save requires content', async () => {
26
+ const result = await plan.execute({ action: 'save' });
27
+ expect(result).toContain('content is required');
28
+ });
29
+ it('list shows saved plans', async () => {
30
+ await plan.execute({ action: 'save', content: 'plan 1', name: 'first' });
31
+ await plan.execute({ action: 'save', content: 'plan 2', name: 'second' });
32
+ const result = await plan.execute({ action: 'list' });
33
+ expect(result).toContain('first');
34
+ expect(result).toContain('second');
35
+ });
36
+ it('list returns message when empty', async () => {
37
+ const result = await plan.execute({ action: 'list' });
38
+ expect(result).toContain('No plans');
39
+ });
40
+ it('read loads a specific plan by name', async () => {
41
+ await plan.execute({ action: 'save', content: 'specific content', name: 'readable' });
42
+ const listResult = await plan.execute({ action: 'list' });
43
+ // Extract the plan name from the list
44
+ const name = listResult.split('\n')[0].split(' ')[0].trim();
45
+ const result = await plan.execute({ action: 'read', name });
46
+ expect(result).toContain('specific content');
47
+ });
48
+ it('read requires name', async () => {
49
+ const result = await plan.execute({ action: 'read' });
50
+ expect(result).toContain('name is required');
51
+ });
52
+ it('append adds to latest plan', async () => {
53
+ await plan.execute({ action: 'save', content: 'base plan', name: 'appendable' });
54
+ const result = await plan.execute({ action: 'append', content: '\nappended text' });
55
+ expect(result).toContain('Appended');
56
+ });
57
+ it('append requires content', async () => {
58
+ const result = await plan.execute({ action: 'append' });
59
+ expect(result).toContain('content is required');
60
+ });
61
+ it('switch activates a different plan', async () => {
62
+ await plan.execute({ action: 'save', content: 'plan A', name: 'alpha' });
63
+ await plan.execute({ action: 'save', content: 'plan B', name: 'beta' });
64
+ const result = await plan.execute({ action: 'switch', name: 'alpha' });
65
+ expect(result).toContain('Switched to plan');
66
+ expect(result).toContain('alpha');
67
+ });
68
+ it('switch requires name', async () => {
69
+ const result = await plan.execute({ action: 'switch' });
70
+ expect(result).toContain('name is required');
71
+ });
72
+ it('switch errors on nonexistent plan', async () => {
73
+ const result = await plan.execute({ action: 'switch', name: 'nonexistent' });
74
+ expect(result).toContain('No plan matching');
75
+ });
76
+ it('unknown action returns error', async () => {
77
+ const result = await plan.execute({ action: 'delete' });
78
+ expect(result).toContain('Unknown action');
79
+ });
80
+ });
81
+ //# sourceMappingURL=plan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/plan.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schemas.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/schemas.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Tool schema contract tests — ensures tool definitions (the API contract with LLMs)
3
+ * don't accidentally change shape, names, or required parameters.
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { fileTool } from '../file.js';
7
+ import { bashToolFactory } from '../bash.js';
8
+ import { grepTool } from '../grep.js';
9
+ import { gitTool } from '../git.js';
10
+ import { webTool } from '../web.js';
11
+ import { memoryTool } from '../memory.js';
12
+ import { planTool } from '../plan.js';
13
+ const cwd = process.cwd();
14
+ function schema(tool) {
15
+ return { name: tool.function.name, parameters: tool.function.parameters };
16
+ }
17
+ describe('tool schema contracts', () => {
18
+ it('file tool schema', () => {
19
+ expect(schema(fileTool(cwd))).toMatchSnapshot();
20
+ });
21
+ it('bash tool schema', () => {
22
+ expect(schema(bashToolFactory(cwd))).toMatchSnapshot();
23
+ });
24
+ it('grep tool schema', () => {
25
+ expect(schema(grepTool(cwd))).toMatchSnapshot();
26
+ });
27
+ it('git tool schema', () => {
28
+ expect(schema(gitTool(cwd))).toMatchSnapshot();
29
+ });
30
+ it('web tool schema', () => {
31
+ expect(schema(webTool())).toMatchSnapshot();
32
+ });
33
+ it('memory tool schema', () => {
34
+ expect(schema(memoryTool(cwd))).toMatchSnapshot();
35
+ });
36
+ it('plan tool schema', () => {
37
+ expect(schema(planTool(cwd))).toMatchSnapshot();
38
+ });
39
+ });
40
+ //# sourceMappingURL=schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/schemas.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1B,SAAS,MAAM,CAAC,IAA8E;IAC5F,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC5E,CAAC;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=web.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/web.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { webTool } from '../web.js';
3
+ const web = webTool();
4
+ describe('web tool - SSRF protection', () => {
5
+ const blockedUrls = [
6
+ 'http://localhost/admin',
7
+ 'http://127.0.0.1/secret',
8
+ 'http://0.0.0.0:8080/',
9
+ 'http://[::1]/',
10
+ 'http://169.254.169.254/latest/meta-data/',
11
+ 'http://metadata.google.internal/computeMetadata/v1/',
12
+ 'http://10.0.0.1/internal',
13
+ 'http://172.16.0.1/internal',
14
+ 'http://192.168.1.1/admin',
15
+ ];
16
+ for (const url of blockedUrls) {
17
+ it(`blocks ${new URL(url).hostname}`, async () => {
18
+ const result = await web.execute({ action: 'fetch', url });
19
+ expect(result).toMatch(/blocked.*private|internal/i);
20
+ });
21
+ }
22
+ it('blocks non-http protocols', async () => {
23
+ const result = await web.execute({ action: 'fetch', url: 'ftp://example.com/file' });
24
+ expect(result).toMatch(/http.*https/);
25
+ });
26
+ it('rejects invalid URLs', async () => {
27
+ const result = await web.execute({ action: 'fetch', url: 'not-a-url' });
28
+ expect(result).toMatch(/Invalid URL/);
29
+ });
30
+ it('requires url for fetch', async () => {
31
+ const result = await web.execute({ action: 'fetch' });
32
+ expect(result).toMatch(/url is required/);
33
+ });
34
+ it('requires query for search', async () => {
35
+ const result = await web.execute({ action: 'search' });
36
+ expect(result).toMatch(/query is required/);
37
+ });
38
+ it('unknown action returns error', async () => {
39
+ const result = await web.execute({ action: 'post' });
40
+ expect(result).toMatch(/Unknown action/);
41
+ });
42
+ it('blocks 169.254.x.x link-local addresses', async () => {
43
+ const result = await web.execute({ action: 'fetch', url: 'http://169.254.1.1/metadata' });
44
+ expect(result).toMatch(/blocked/i);
45
+ });
46
+ it('blocks 172.16-31 private range', async () => {
47
+ const result = await web.execute({ action: 'fetch', url: 'http://172.31.255.255/' });
48
+ expect(result).toMatch(/blocked/i);
49
+ });
50
+ });
51
+ //# sourceMappingURL=web.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/web.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bash tool - the universal interface for system operations
3
+ */
4
+ import { Tool } from '../core/types.js';
5
+ export declare function bashToolFactory(cwd: string): Tool;
6
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAyBxC,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiEjD"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Bash tool - the universal interface for system operations
3
+ */
4
+ import { spawn } from 'node:child_process';
5
+ const MAX_BUFFER = 1024 * 1024; // 1 MB
6
+ const DANGEROUS_PATTERNS = [
7
+ { pattern: /\bfind\s+[~\/](?![\w.])/, message: 'Blocked: `find` on home/root directory. Use the grep tool (action=find) to search for files, or scope to a specific subdirectory.' },
8
+ { pattern: /\brm\s+(-[a-zA-Z]*r[a-zA-Z]*)?\s*-[a-zA-Z]*f[a-zA-Z]*\s+[~\/]/, message: 'Blocked: destructive `rm` targeting home or root directory.' },
9
+ { pattern: /\brm\s+(-[a-zA-Z]*f[a-zA-Z]*)?\s*-[a-zA-Z]*r[a-zA-Z]*\s+[~\/]/, message: 'Blocked: destructive `rm` targeting home or root directory.' },
10
+ { pattern: /\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|f[a-zA-Z]*r)[a-zA-Z]*\s+\/\*/, message: 'Blocked: destructive `rm` targeting root glob.' },
11
+ { pattern: /:\(\)\{.*:\|:/, message: 'Blocked: fork bomb detected.' },
12
+ { pattern: /\bdd\b.*\bof=\/dev\//, message: 'Blocked: dd write to device.' },
13
+ { pattern: /\bmkfs\b/, message: 'Blocked: filesystem format command.' },
14
+ { pattern: /\b(chmod|chown)\s+-[a-zA-Z]*R[a-zA-Z]*\s+.*[~\/]/, message: 'Blocked: recursive permission change on home/root.' },
15
+ { pattern: /\b(curl|wget)\b.*\|\s*(sh|bash|zsh|sudo)/, message: 'Blocked: pipe-to-shell pattern detected. Download the script first and review it.' },
16
+ { pattern: />\s*\/dev\/[hs]d[a-z]/, message: 'Blocked: redirect write to raw block device.' },
17
+ { pattern: /\bsudo\s+rm\b/, message: 'Blocked: sudo rm is too dangerous. Remove files without sudo or do it manually.' },
18
+ ];
19
+ function checkCommand(command) {
20
+ for (const { pattern, message } of DANGEROUS_PATTERNS) {
21
+ if (pattern.test(command))
22
+ return `Error: ${message}`;
23
+ }
24
+ return null;
25
+ }
26
+ export function bashToolFactory(cwd) {
27
+ return {
28
+ type: 'function',
29
+ function: {
30
+ name: 'bash',
31
+ description: 'Run a shell command in the project directory. Use ONLY for: running tests, builds, installs, servers, and system operations. Do NOT use bash for: reading files (use file tool), editing files (use file tool), searching code (use grep tool), finding files (use grep tool), listing directories (use file tool), or git operations (use git tool). Dangerous commands like rm -rf, sudo rm, and pipe-to-shell are blocked.',
32
+ parameters: {
33
+ type: 'object',
34
+ properties: {
35
+ command: {
36
+ type: 'string',
37
+ description: 'The shell command to execute'
38
+ }
39
+ },
40
+ required: ['command']
41
+ }
42
+ },
43
+ execute: ({ command }) => {
44
+ const blocked = checkCommand(command);
45
+ if (blocked)
46
+ return Promise.resolve(blocked);
47
+ return new Promise((resolve) => {
48
+ const child = spawn('sh', ['-c', command], {
49
+ cwd,
50
+ timeout: 60_000,
51
+ stdio: ['pipe', 'pipe', 'pipe']
52
+ });
53
+ let stdout = '';
54
+ let stderr = '';
55
+ let stdoutOverflow = false;
56
+ child.stdout.on('data', (chunk) => {
57
+ if (stdout.length < MAX_BUFFER) {
58
+ stdout += chunk.toString();
59
+ }
60
+ else {
61
+ stdoutOverflow = true;
62
+ }
63
+ });
64
+ child.stderr.on('data', (chunk) => {
65
+ if (stderr.length < MAX_BUFFER) {
66
+ stderr += chunk.toString();
67
+ }
68
+ });
69
+ child.on('close', (code) => {
70
+ let result = stdout.trim();
71
+ if (stdoutOverflow) {
72
+ result += '\n... (output truncated at 1MB)';
73
+ }
74
+ if (code === 0) {
75
+ resolve(result);
76
+ }
77
+ else {
78
+ const status = code ?? 1;
79
+ resolve(`EXIT ${status}\n${(stdout + stderr).trim()}`);
80
+ }
81
+ });
82
+ child.on('error', (err) => {
83
+ resolve(`EXIT 1\n${err.message}`);
84
+ });
85
+ });
86
+ }
87
+ };
88
+ }
89
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAEvC,MAAM,kBAAkB,GAAgD;IACtE,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,mIAAmI,EAAE;IACpL,EAAE,OAAO,EAAE,+DAA+D,EAAE,OAAO,EAAE,6DAA6D,EAAE;IACpJ,EAAE,OAAO,EAAE,+DAA+D,EAAE,OAAO,EAAE,6DAA6D,EAAE;IACpJ,EAAE,OAAO,EAAE,4DAA4D,EAAE,OAAO,EAAE,gDAAgD,EAAE;IACpI,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,8BAA8B,EAAE;IACrE,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,8BAA8B,EAAE;IAC5E,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,qCAAqC,EAAE;IACvE,EAAE,OAAO,EAAE,kDAAkD,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC9H,EAAE,OAAO,EAAE,0CAA0C,EAAE,OAAO,EAAE,mFAAmF,EAAE;IACrJ,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,8CAA8C,EAAE;IAC7F,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,iFAAiF,EAAE;CACzH,CAAC;AAEF,SAAS,YAAY,CAAC,OAAe;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,UAAU,OAAO,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,+ZAA+Z;YAC5a,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,8BAA8B;qBAC5C;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;QACD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAuB,EAAmB,EAAE;YAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;oBACzC,GAAG;oBACH,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBAChC,CAAC,CAAC;gBAEH,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,cAAc,GAAG,KAAK,CAAC;gBAE3B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBACxC,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;wBAC/B,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC7B,CAAC;yBAAM,CAAC;wBACN,cAAc,GAAG,IAAI,CAAC;oBACxB,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBACxC,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;wBAC/B,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC7B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC3B,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,IAAI,iCAAiC,CAAC;oBAC9C,CAAC;oBACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClB,CAAC;yBAAM,CAAC;wBACN,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC;wBACzB,OAAO,CAAC,QAAQ,MAAM,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACxB,OAAO,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * File tool — read files and list directories
3
+ * Prevents the model from falling back to bash for cat/head/tail/ls.
4
+ */
5
+ import { Tool } from '../core/types.js';
6
+ export declare function fileTool(cwd: string): Tool;
7
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/tools/file.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAgKxC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAuC1C"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * File tool — read files and list directories
3
+ * Prevents the model from falling back to bash for cat/head/tail/ls.
4
+ */
5
+ import { readFileSync, writeFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';
6
+ import { resolve, extname, dirname } from 'node:path';
7
+ import { DEFAULT_IGNORE, isBinary } from '../core/constants.js';
8
+ const MAX_READ_BYTES = 100 * 1024; // 100 KB text cap
9
+ const MAX_LIST_ENTRIES = 200;
10
+ const MAX_LIST_DEPTH = 3;
11
+ function formatSize(bytes) {
12
+ if (bytes < 1024)
13
+ return `${bytes}B`;
14
+ if (bytes < 1024 * 1024)
15
+ return `${(bytes / 1024).toFixed(1)}KB`;
16
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
17
+ }
18
+ function doRead(cwd, path, offset, limit) {
19
+ const resolved = resolve(cwd, path);
20
+ const cwdResolved = resolve(cwd);
21
+ if (!resolved.startsWith(cwdResolved + '/') && resolved !== cwdResolved) {
22
+ return `Error: path "${path}" is outside the project directory. Access is restricted to ${cwdResolved}`;
23
+ }
24
+ let stat;
25
+ try {
26
+ stat = statSync(resolved);
27
+ }
28
+ catch (e) {
29
+ const err = e;
30
+ if (err.code === 'ENOENT')
31
+ return `Error: file not found — ${path}. Use grep(action=find) or file(action=list) to discover the correct filename.`;
32
+ if (err.code === 'EACCES')
33
+ return `Error: permission denied — ${path}`;
34
+ return `Error: ${err.message ?? String(e)}`;
35
+ }
36
+ if (stat.isDirectory())
37
+ return `Error: "${path}" is a directory. Use action=list instead.`;
38
+ if (isBinary(resolved)) {
39
+ const ext = extname(resolved);
40
+ return `Binary file (${formatSize(stat.size)} ${ext || 'unknown type'}). Use bash with an appropriate tool (e.g. pdftotext, xxd, strings) to inspect.`;
41
+ }
42
+ let content;
43
+ try {
44
+ content = readFileSync(resolved, 'utf-8');
45
+ }
46
+ catch (e) {
47
+ return `Error: ${e instanceof Error ? e.message : String(e)}`;
48
+ }
49
+ const lines = content.split('\n');
50
+ const start = Math.max(0, (offset ?? 1) - 1);
51
+ const count = limit ?? lines.length;
52
+ const slice = lines.slice(start, start + count);
53
+ // Check if we need to truncate by byte size
54
+ let totalBytes = 0;
55
+ let truncIdx = slice.length;
56
+ for (let i = 0; i < slice.length; i++) {
57
+ totalBytes += slice[i].length + 1;
58
+ if (totalBytes > MAX_READ_BYTES) {
59
+ truncIdx = i;
60
+ break;
61
+ }
62
+ }
63
+ const output = slice.slice(0, truncIdx);
64
+ const numbered = output.map((line, i) => `${String(start + i + 1).padStart(6)}\t${line}`);
65
+ let result = numbered.join('\n');
66
+ if (truncIdx < slice.length) {
67
+ result += `\n... (truncated at 100KB — showing lines ${start + 1}-${start + truncIdx} of ${lines.length} total)`;
68
+ }
69
+ else if (start + count < lines.length && !limit) {
70
+ // no truncation needed
71
+ }
72
+ return result;
73
+ }
74
+ function doList(cwd, path, maxDepth) {
75
+ const resolved = resolve(cwd, path);
76
+ const cwdResolved = resolve(cwd);
77
+ if (!resolved.startsWith(cwdResolved + '/') && resolved !== cwdResolved) {
78
+ return `Error: path "${path}" is outside the project directory. Access is restricted to ${cwdResolved}`;
79
+ }
80
+ const entries = [];
81
+ let count = 0;
82
+ function walk(dir, depth, prefix) {
83
+ if (depth > maxDepth || count >= MAX_LIST_ENTRIES)
84
+ return;
85
+ let items;
86
+ try {
87
+ items = readdirSync(dir, { withFileTypes: true });
88
+ }
89
+ catch {
90
+ return;
91
+ }
92
+ // Sort: dirs first, then files
93
+ items.sort((a, b) => {
94
+ if (a.isDirectory() && !b.isDirectory())
95
+ return -1;
96
+ if (!a.isDirectory() && b.isDirectory())
97
+ return 1;
98
+ return a.name.localeCompare(b.name);
99
+ });
100
+ for (const item of items) {
101
+ if (count >= MAX_LIST_ENTRIES)
102
+ break;
103
+ if (DEFAULT_IGNORE.has(item.name))
104
+ continue;
105
+ if (item.name.startsWith('.') && item.name !== '.')
106
+ continue;
107
+ const full = resolve(dir, item.name);
108
+ if (item.isDirectory()) {
109
+ entries.push(`${prefix}[dir] ${item.name}/`);
110
+ count++;
111
+ if (depth < maxDepth)
112
+ walk(full, depth + 1, prefix + ' ');
113
+ }
114
+ else if (item.isFile()) {
115
+ try {
116
+ const s = statSync(full);
117
+ entries.push(`${prefix}${item.name} (${formatSize(s.size)})`);
118
+ }
119
+ catch {
120
+ entries.push(`${prefix}${item.name}`);
121
+ }
122
+ count++;
123
+ }
124
+ }
125
+ }
126
+ walk(resolved, 1, '');
127
+ if (entries.length === 0)
128
+ return 'Empty directory.';
129
+ let result = entries.join('\n');
130
+ if (count >= MAX_LIST_ENTRIES)
131
+ result += `\n... (${MAX_LIST_ENTRIES} entries shown. Narrow with path.)`;
132
+ return result;
133
+ }
134
+ function validatePath(cwd, path) {
135
+ const resolved = resolve(cwd, path);
136
+ const cwdResolved = resolve(cwd);
137
+ if (!resolved.startsWith(cwdResolved + '/') && resolved !== cwdResolved) {
138
+ return { resolved, error: `Error: path "${path}" is outside the project directory. Access is restricted to ${cwdResolved}` };
139
+ }
140
+ return { resolved };
141
+ }
142
+ function doWrite(cwd, path, content) {
143
+ const { resolved, error } = validatePath(cwd, path);
144
+ if (error)
145
+ return error;
146
+ try {
147
+ mkdirSync(dirname(resolved), { recursive: true });
148
+ writeFileSync(resolved, content);
149
+ const lines = content.split('\n').length;
150
+ const bytes = Buffer.byteLength(content);
151
+ return `Wrote ${path} (${lines} lines, ${formatSize(bytes)})`;
152
+ }
153
+ catch (e) {
154
+ return `Error: ${e instanceof Error ? e.message : String(e)}`;
155
+ }
156
+ }
157
+ function doEdit(cwd, path, oldString, newString) {
158
+ const { resolved, error } = validatePath(cwd, path);
159
+ if (error)
160
+ return error;
161
+ let content;
162
+ try {
163
+ content = readFileSync(resolved, 'utf-8');
164
+ }
165
+ catch (e) {
166
+ const err = e;
167
+ if (err.code === 'ENOENT')
168
+ return `Error: file not found — ${path}`;
169
+ return `Error: ${err.message ?? String(e)}`;
170
+ }
171
+ if (isBinary(resolved))
172
+ return `Error: cannot edit binary file — ${path}`;
173
+ const occurrences = content.split(oldString).length - 1;
174
+ if (occurrences === 0)
175
+ return `Error: old_string not found in ${path}. Read the file first to verify exact content.`;
176
+ if (occurrences > 1)
177
+ return `Error: old_string matches ${occurrences} times in ${path}. Provide more surrounding context to make it unique.`;
178
+ const updated = content.replace(oldString, newString);
179
+ writeFileSync(resolved, updated);
180
+ return `Edited ${path} — replaced ${oldString.split('\n').length} line(s)`;
181
+ }
182
+ export function fileTool(cwd) {
183
+ return {
184
+ type: 'function',
185
+ function: {
186
+ name: 'file',
187
+ description: 'Read, list, write, and edit files. Prefer this over bash for ALL file operations. Actions: read (view with line numbers — always read before editing), list (directory tree), write (create/overwrite file), edit (find-and-replace in existing file — old_string must match exactly once).',
188
+ parameters: {
189
+ type: 'object',
190
+ properties: {
191
+ action: { type: 'string', enum: ['read', 'list', 'write', 'edit'], description: 'read = view file, list = directory listing, write = create/overwrite file, edit = replace a string in an existing file.' },
192
+ path: { type: 'string', description: 'File or directory path (relative to project root, or absolute).' },
193
+ content: { type: 'string', description: 'File content to write (write action only).' },
194
+ old_string: { type: 'string', description: 'Exact string to find and replace (edit action only). Must match exactly once.' },
195
+ new_string: { type: 'string', description: 'Replacement string (edit action only).' },
196
+ offset: { type: 'number', description: 'Line number to start reading from (read only, default: 1).' },
197
+ limit: { type: 'number', description: 'Max lines to return (read only). Omit to read entire file.' },
198
+ depth: { type: 'number', description: 'Directory depth for list (default: 2, max: 3).' },
199
+ },
200
+ required: ['action', 'path']
201
+ }
202
+ },
203
+ execute: async ({ action, path, content, old_string, new_string, offset, limit, depth }) => {
204
+ if (!path)
205
+ return 'Error: path is required.';
206
+ switch (action) {
207
+ case 'read': return doRead(cwd, path, offset, limit);
208
+ case 'list': return doList(cwd, path, Math.min(depth ?? 2, MAX_LIST_DEPTH));
209
+ case 'write':
210
+ if (content === undefined)
211
+ return 'Error: content is required for write action.';
212
+ return doWrite(cwd, path, content);
213
+ case 'edit':
214
+ if (!old_string)
215
+ return 'Error: old_string is required for edit action.';
216
+ if (new_string === undefined)
217
+ return 'Error: new_string is required for edit action.';
218
+ return doEdit(cwd, path, old_string, new_string);
219
+ default: return `Unknown action "${action}". Use: read, list, write, edit.`;
220
+ }
221
+ }
222
+ };
223
+ }
224
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/tools/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../core/types.js';
2
+ export declare function gitTool(cwd: string): Tool;
3
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA+LxC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAsCzC"}