grok-agent 0.5.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 (141) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/LICENSE +190 -0
  3. package/README.md +449 -0
  4. package/bin/grok-cli.js +26 -0
  5. package/dist/agent.d.ts +4 -0
  6. package/dist/agent.d.ts.map +1 -0
  7. package/dist/agent.js +898 -0
  8. package/dist/agent.js.map +1 -0
  9. package/dist/approvals.d.ts +4 -0
  10. package/dist/approvals.d.ts.map +1 -0
  11. package/dist/approvals.js +90 -0
  12. package/dist/approvals.js.map +1 -0
  13. package/dist/batch-api.d.ts +11 -0
  14. package/dist/batch-api.d.ts.map +1 -0
  15. package/dist/batch-api.js +101 -0
  16. package/dist/batch-api.js.map +1 -0
  17. package/dist/cli-errors.d.ts +6 -0
  18. package/dist/cli-errors.d.ts.map +1 -0
  19. package/dist/cli-errors.js +80 -0
  20. package/dist/cli-errors.js.map +1 -0
  21. package/dist/client.d.ts +6 -0
  22. package/dist/client.d.ts.map +1 -0
  23. package/dist/client.js +41 -0
  24. package/dist/client.js.map +1 -0
  25. package/dist/collections-api.d.ts +11 -0
  26. package/dist/collections-api.d.ts.map +1 -0
  27. package/dist/collections-api.js +144 -0
  28. package/dist/collections-api.js.map +1 -0
  29. package/dist/compaction.d.ts +11 -0
  30. package/dist/compaction.d.ts.map +1 -0
  31. package/dist/compaction.js +94 -0
  32. package/dist/compaction.js.map +1 -0
  33. package/dist/config.d.ts +12 -0
  34. package/dist/config.d.ts.map +1 -0
  35. package/dist/config.js +142 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/diff.d.ts +5 -0
  38. package/dist/diff.d.ts.map +1 -0
  39. package/dist/diff.js +80 -0
  40. package/dist/diff.js.map +1 -0
  41. package/dist/hooks.d.ts +11 -0
  42. package/dist/hooks.d.ts.map +1 -0
  43. package/dist/hooks.js +30 -0
  44. package/dist/hooks.js.map +1 -0
  45. package/dist/image.d.ts +8 -0
  46. package/dist/image.d.ts.map +1 -0
  47. package/dist/image.js +58 -0
  48. package/dist/image.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +1264 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/json-output.d.ts +27 -0
  54. package/dist/json-output.d.ts.map +1 -0
  55. package/dist/json-output.js +62 -0
  56. package/dist/json-output.js.map +1 -0
  57. package/dist/notifications.d.ts +6 -0
  58. package/dist/notifications.d.ts.map +1 -0
  59. package/dist/notifications.js +25 -0
  60. package/dist/notifications.js.map +1 -0
  61. package/dist/project-context.d.ts +6 -0
  62. package/dist/project-context.d.ts.map +1 -0
  63. package/dist/project-context.js +34 -0
  64. package/dist/project-context.js.map +1 -0
  65. package/dist/response-utils.d.ts +10 -0
  66. package/dist/response-utils.d.ts.map +1 -0
  67. package/dist/response-utils.js +123 -0
  68. package/dist/response-utils.js.map +1 -0
  69. package/dist/server-tools.d.ts +7 -0
  70. package/dist/server-tools.d.ts.map +1 -0
  71. package/dist/server-tools.js +205 -0
  72. package/dist/server-tools.js.map +1 -0
  73. package/dist/session.d.ts +46 -0
  74. package/dist/session.d.ts.map +1 -0
  75. package/dist/session.js +305 -0
  76. package/dist/session.js.map +1 -0
  77. package/dist/stream.d.ts +22 -0
  78. package/dist/stream.d.ts.map +1 -0
  79. package/dist/stream.js +102 -0
  80. package/dist/stream.js.map +1 -0
  81. package/dist/system-prompt.d.ts +3 -0
  82. package/dist/system-prompt.d.ts.map +1 -0
  83. package/dist/system-prompt.js +64 -0
  84. package/dist/system-prompt.js.map +1 -0
  85. package/dist/tools/bash.d.ts +8 -0
  86. package/dist/tools/bash.d.ts.map +1 -0
  87. package/dist/tools/bash.js +49 -0
  88. package/dist/tools/bash.js.map +1 -0
  89. package/dist/tools/definitions.d.ts +3 -0
  90. package/dist/tools/definitions.d.ts.map +1 -0
  91. package/dist/tools/definitions.js +190 -0
  92. package/dist/tools/definitions.js.map +1 -0
  93. package/dist/tools/edit-file.d.ts +10 -0
  94. package/dist/tools/edit-file.d.ts.map +1 -0
  95. package/dist/tools/edit-file.js +73 -0
  96. package/dist/tools/edit-file.js.map +1 -0
  97. package/dist/tools/glob.d.ts +7 -0
  98. package/dist/tools/glob.d.ts.map +1 -0
  99. package/dist/tools/glob.js +44 -0
  100. package/dist/tools/glob.js.map +1 -0
  101. package/dist/tools/grep.d.ts +10 -0
  102. package/dist/tools/grep.d.ts.map +1 -0
  103. package/dist/tools/grep.js +102 -0
  104. package/dist/tools/grep.js.map +1 -0
  105. package/dist/tools/index.d.ts +10 -0
  106. package/dist/tools/index.d.ts.map +1 -0
  107. package/dist/tools/index.js +41 -0
  108. package/dist/tools/index.js.map +1 -0
  109. package/dist/tools/list-dir.d.ts +7 -0
  110. package/dist/tools/list-dir.d.ts.map +1 -0
  111. package/dist/tools/list-dir.js +68 -0
  112. package/dist/tools/list-dir.js.map +1 -0
  113. package/dist/tools/policy.d.ts +4 -0
  114. package/dist/tools/policy.d.ts.map +1 -0
  115. package/dist/tools/policy.js +36 -0
  116. package/dist/tools/policy.js.map +1 -0
  117. package/dist/tools/read-file.d.ts +8 -0
  118. package/dist/tools/read-file.d.ts.map +1 -0
  119. package/dist/tools/read-file.js +45 -0
  120. package/dist/tools/read-file.js.map +1 -0
  121. package/dist/tools/write-file.d.ts +7 -0
  122. package/dist/tools/write-file.d.ts.map +1 -0
  123. package/dist/tools/write-file.js +35 -0
  124. package/dist/tools/write-file.js.map +1 -0
  125. package/dist/truncation.d.ts +13 -0
  126. package/dist/truncation.d.ts.map +1 -0
  127. package/dist/truncation.js +55 -0
  128. package/dist/truncation.js.map +1 -0
  129. package/dist/types.d.ts +159 -0
  130. package/dist/types.d.ts.map +1 -0
  131. package/dist/types.js +2 -0
  132. package/dist/types.js.map +1 -0
  133. package/dist/usage.d.ts +17 -0
  134. package/dist/usage.d.ts.map +1 -0
  135. package/dist/usage.js +80 -0
  136. package/dist/usage.js.map +1 -0
  137. package/dist/voice-api.d.ts +16 -0
  138. package/dist/voice-api.d.ts.map +1 -0
  139. package/dist/voice-api.js +84 -0
  140. package/dist/voice-api.js.map +1 -0
  141. package/package.json +64 -0
@@ -0,0 +1,102 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import fg from "fast-glob";
4
+ import { ensurePathAllowed } from "./policy.js";
5
+ const MAX_RESULTS = 100;
6
+ const MAX_FILE_SIZE = 2 * 1024 * 1024; // 2MB
7
+ export async function executeGrep(args, projectCwd, options) {
8
+ const searchPath = args.path ? path.resolve(projectCwd, args.path) : projectCwd;
9
+ const maxResults = Math.min(args.max_results || MAX_RESULTS, 500);
10
+ const sandboxError = ensurePathAllowed(searchPath, projectCwd, options.sandboxMode || "danger-full-access", "read");
11
+ if (sandboxError)
12
+ return sandboxError;
13
+ try {
14
+ const regex = new RegExp(args.pattern, args.ignore_case ? "gi" : "g");
15
+ // If searchPath is a file, search just that file
16
+ if (fs.existsSync(searchPath) && fs.statSync(searchPath).isFile()) {
17
+ return searchFile(searchPath, regex, maxResults, projectCwd);
18
+ }
19
+ // Otherwise, search directory
20
+ const globPattern = args.include || "**/*";
21
+ const files = await fg(globPattern, {
22
+ cwd: searchPath,
23
+ dot: false,
24
+ onlyFiles: true,
25
+ ignore: [
26
+ "**/node_modules/**",
27
+ "**/.git/**",
28
+ "**/dist/**",
29
+ "**/build/**",
30
+ "**/__pycache__/**",
31
+ "**/.venv/**",
32
+ "**/target/**",
33
+ "**/*.min.js",
34
+ "**/*.map",
35
+ "**/package-lock.json",
36
+ "**/pnpm-lock.yaml",
37
+ "**/yarn.lock",
38
+ ],
39
+ });
40
+ const matches = [];
41
+ for (const file of files) {
42
+ if (matches.length >= maxResults)
43
+ break;
44
+ const fullPath = path.join(searchPath, file);
45
+ try {
46
+ const stat = fs.statSync(fullPath);
47
+ if (stat.size > MAX_FILE_SIZE)
48
+ continue;
49
+ const content = fs.readFileSync(fullPath, "utf-8");
50
+ const lines = content.split("\n");
51
+ for (let i = 0; i < lines.length; i++) {
52
+ if (matches.length >= maxResults)
53
+ break;
54
+ if (regex.test(lines[i])) {
55
+ const relativePath = path.relative(projectCwd, fullPath);
56
+ matches.push(`${relativePath}:${i + 1}: ${lines[i].trimEnd()}`);
57
+ }
58
+ regex.lastIndex = 0; // Reset regex state
59
+ }
60
+ }
61
+ catch {
62
+ // Skip files we can't read (binary, permissions, etc)
63
+ }
64
+ }
65
+ if (matches.length === 0) {
66
+ return { output: `No matches for pattern: ${args.pattern}` };
67
+ }
68
+ let output = matches.join("\n");
69
+ if (matches.length >= maxResults) {
70
+ output += `\n... (limited to ${maxResults} results)`;
71
+ }
72
+ return { output: `${matches.length} match(es) for /${args.pattern}/:\n${output}` };
73
+ }
74
+ catch (err) {
75
+ if (err instanceof SyntaxError) {
76
+ return { output: `Invalid regex pattern: ${err.message}`, error: true };
77
+ }
78
+ return { output: `Grep error: ${err.message}`, error: true };
79
+ }
80
+ }
81
+ function searchFile(filePath, regex, maxResults, projectCwd) {
82
+ try {
83
+ const content = fs.readFileSync(filePath, "utf-8");
84
+ const lines = content.split("\n");
85
+ const matches = [];
86
+ const relativePath = path.relative(projectCwd, filePath);
87
+ for (let i = 0; i < lines.length && matches.length < maxResults; i++) {
88
+ if (regex.test(lines[i])) {
89
+ matches.push(`${relativePath}:${i + 1}: ${lines[i].trimEnd()}`);
90
+ }
91
+ regex.lastIndex = 0;
92
+ }
93
+ if (matches.length === 0) {
94
+ return { output: `No matches in ${relativePath}` };
95
+ }
96
+ return { output: `${matches.length} match(es):\n${matches.join("\n")}` };
97
+ }
98
+ catch (err) {
99
+ return { output: `Error searching file: ${err.message}`, error: true };
100
+ }
101
+ }
102
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolResult } from "../types.js";
2
+ import { toolDefinitions } from "./definitions.js";
3
+ import type { SandboxMode } from "../types.js";
4
+ export { toolDefinitions };
5
+ export interface ToolExecutionOptions {
6
+ sandboxMode?: SandboxMode;
7
+ }
8
+ export declare function setMaxOutputTokens(n: number): void;
9
+ export declare function executeTool(name: string, argsJson: string, cwd: string, options?: ToolExecutionOptions): Promise<ToolResult>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AASnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAeD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAyB;AAE5E,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
@@ -0,0 +1,41 @@
1
+ import { toolDefinitions } from "./definitions.js";
2
+ import { executeBash } from "./bash.js";
3
+ import { executeReadFile } from "./read-file.js";
4
+ import { executeWriteFile } from "./write-file.js";
5
+ import { executeEditFile } from "./edit-file.js";
6
+ import { executeGlob } from "./glob.js";
7
+ import { executeGrep } from "./grep.js";
8
+ import { executeListDir } from "./list-dir.js";
9
+ import { truncateOutput } from "../truncation.js";
10
+ export { toolDefinitions };
11
+ const executors = {
12
+ bash: executeBash,
13
+ read_file: executeReadFile,
14
+ write_file: executeWriteFile,
15
+ edit_file: executeEditFile,
16
+ glob: executeGlob,
17
+ grep: executeGrep,
18
+ list_directory: executeListDir,
19
+ };
20
+ let maxOutputTokens = 8000;
21
+ export function setMaxOutputTokens(n) { maxOutputTokens = n; }
22
+ export async function executeTool(name, argsJson, cwd, options = {}) {
23
+ const executor = executors[name];
24
+ if (!executor) {
25
+ return { output: `Unknown tool: ${name}`, error: true };
26
+ }
27
+ try {
28
+ const args = JSON.parse(argsJson);
29
+ const result = await executor(args, cwd, options);
30
+ // Truncate large outputs to prevent context window blowup
31
+ result.output = truncateOutput(result.output, maxOutputTokens);
32
+ return result;
33
+ }
34
+ catch (err) {
35
+ if (err instanceof SyntaxError) {
36
+ return { output: `Invalid tool arguments JSON: ${err.message}`, error: true };
37
+ }
38
+ return { output: `Tool execution error: ${err.message}`, error: true };
39
+ }
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,CAAC;AAQ3B,MAAM,SAAS,GAAiC;IAC9C,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;IAC5B,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,cAAc,EAAE,cAAc;CAC/B,CAAC;AAEF,IAAI,eAAe,GAAG,IAAI,CAAC;AAC3B,MAAM,UAAU,kBAAkB,CAAC,CAAS,IAAU,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,QAAgB,EAChB,GAAW,EACX,UAAgC,EAAE;IAElC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,iBAAiB,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,0DAA0D;QAC1D,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,gCAAgC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,yBAAyB,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ToolResult } from "../types.js";
2
+ import type { ToolExecutionOptions } from "./index.js";
3
+ export declare function executeListDir(args: {
4
+ path?: string;
5
+ recursive?: boolean;
6
+ }, projectCwd: string, options: ToolExecutionOptions): Promise<ToolResult>;
7
+ //# sourceMappingURL=list-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-dir.d.ts","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAKvD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CA8BzE"}
@@ -0,0 +1,68 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ensurePathAllowed } from "./policy.js";
4
+ const MAX_ENTRIES = 500;
5
+ export async function executeListDir(args, projectCwd, options) {
6
+ const dirPath = args.path ? path.resolve(projectCwd, args.path) : projectCwd;
7
+ const sandboxError = ensurePathAllowed(dirPath, projectCwd, options.sandboxMode || "danger-full-access", "read");
8
+ if (sandboxError)
9
+ return sandboxError;
10
+ try {
11
+ if (!fs.existsSync(dirPath)) {
12
+ return { output: `Directory not found: ${dirPath}`, error: true };
13
+ }
14
+ if (!fs.statSync(dirPath).isDirectory()) {
15
+ return { output: `Not a directory: ${dirPath}`, error: true };
16
+ }
17
+ const entries = [];
18
+ listRecursive(dirPath, "", entries, args.recursive ? 3 : 0, 0);
19
+ if (entries.length === 0) {
20
+ return { output: `Empty directory: ${args.path || "."}` };
21
+ }
22
+ let output = entries.join("\n");
23
+ if (entries.length >= MAX_ENTRIES) {
24
+ output += "\n... (truncated)";
25
+ }
26
+ return { output };
27
+ }
28
+ catch (err) {
29
+ return { output: `Error listing directory: ${err.message}`, error: true };
30
+ }
31
+ }
32
+ function listRecursive(basePath, relativePath, entries, maxDepth, currentDepth) {
33
+ if (entries.length >= MAX_ENTRIES)
34
+ return;
35
+ const fullPath = path.join(basePath, relativePath);
36
+ const items = fs.readdirSync(fullPath, { withFileTypes: true });
37
+ // Sort: directories first, then files
38
+ const sorted = items.sort((a, b) => {
39
+ if (a.isDirectory() && !b.isDirectory())
40
+ return -1;
41
+ if (!a.isDirectory() && b.isDirectory())
42
+ return 1;
43
+ return a.name.localeCompare(b.name);
44
+ });
45
+ const skipDirs = new Set([
46
+ "node_modules", ".git", "dist", "build", ".next",
47
+ "coverage", "__pycache__", ".venv", "target", ".cache",
48
+ ]);
49
+ for (const item of sorted) {
50
+ if (entries.length >= MAX_ENTRIES)
51
+ return;
52
+ const itemRelative = relativePath ? `${relativePath}/${item.name}` : item.name;
53
+ if (item.isDirectory()) {
54
+ if (skipDirs.has(item.name))
55
+ continue;
56
+ const indent = " ".repeat(currentDepth);
57
+ entries.push(`${indent}${item.name}/`);
58
+ if (currentDepth < maxDepth) {
59
+ listRecursive(basePath, itemRelative, entries, maxDepth, currentDepth + 1);
60
+ }
61
+ }
62
+ else {
63
+ const indent = " ".repeat(currentDepth);
64
+ entries.push(`${indent}${item.name}`);
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=list-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SandboxMode, ToolResult } from "../types.js";
2
+ export declare function ensurePathAllowed(inputPath: string, projectCwd: string, sandboxMode: SandboxMode, access: "read" | "write"): ToolResult | null;
3
+ export declare function ensureCommandAllowed(sandboxMode: SandboxMode): ToolResult | null;
4
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM3D,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,GAAG,OAAO,GACvB,UAAU,GAAG,IAAI,CAwBnB;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,CAShF"}
@@ -0,0 +1,36 @@
1
+ import path from "node:path";
2
+ function normalizePath(p) {
3
+ return path.resolve(p);
4
+ }
5
+ export function ensurePathAllowed(inputPath, projectCwd, sandboxMode, access) {
6
+ if (sandboxMode === "danger-full-access")
7
+ return null;
8
+ const resolvedPath = normalizePath(inputPath);
9
+ const root = normalizePath(projectCwd);
10
+ const relative = path.relative(root, resolvedPath);
11
+ const outsideWorkspace = relative.startsWith("..") || path.isAbsolute(relative) && !resolvedPath.startsWith(root);
12
+ if (outsideWorkspace) {
13
+ return {
14
+ output: `Sandbox policy (${sandboxMode}) blocks ${access} access outside the workspace: ${resolvedPath}`,
15
+ error: true,
16
+ };
17
+ }
18
+ if (sandboxMode === "read-only" && access === "write") {
19
+ return {
20
+ output: `Sandbox policy (read-only) blocks write access: ${resolvedPath}`,
21
+ error: true,
22
+ };
23
+ }
24
+ return null;
25
+ }
26
+ export function ensureCommandAllowed(sandboxMode) {
27
+ if (sandboxMode === "danger-full-access")
28
+ return null;
29
+ return {
30
+ output: sandboxMode === "read-only"
31
+ ? "Sandbox policy (read-only) blocks shell execution."
32
+ : "Sandbox policy (workspace-write) blocks shell execution. Use structured file tools instead or switch to --sandbox danger-full-access.",
33
+ error: true,
34
+ };
35
+ }
36
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,UAAkB,EAClB,WAAwB,EACxB,MAAwB;IAExB,IAAI,WAAW,KAAK,oBAAoB;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,gBAAgB,GACpB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3F,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO;YACL,MAAM,EAAE,mBAAmB,WAAW,YAAY,MAAM,kCAAkC,YAAY,EAAE;YACxG,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,KAAK,WAAW,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACtD,OAAO;YACL,MAAM,EAAE,mDAAmD,YAAY,EAAE;YACzE,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAwB;IAC3D,IAAI,WAAW,KAAK,oBAAoB;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO;QACL,MAAM,EACJ,WAAW,KAAK,WAAW;YACzB,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,uIAAuI;QAC7I,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ToolResult } from "../types.js";
2
+ import type { ToolExecutionOptions } from "./index.js";
3
+ export declare function executeReadFile(args: {
4
+ file_path: string;
5
+ offset?: number;
6
+ limit?: number;
7
+ }, projectCwd: string, options: ToolExecutionOptions): Promise<ToolResult>;
8
+ //# sourceMappingURL=read-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAKvD,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4CzE"}
@@ -0,0 +1,45 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ensurePathAllowed } from "./policy.js";
4
+ const MAX_LINES = 5000;
5
+ export async function executeReadFile(args, projectCwd, options) {
6
+ const filePath = path.resolve(projectCwd, args.file_path);
7
+ const offset = Math.max((args.offset || 1) - 1, 0); // Convert 1-based to 0-based
8
+ const limit = Math.min(args.limit || 2000, MAX_LINES);
9
+ const sandboxError = ensurePathAllowed(filePath, projectCwd, options.sandboxMode || "danger-full-access", "read");
10
+ if (sandboxError)
11
+ return sandboxError;
12
+ try {
13
+ if (!fs.existsSync(filePath)) {
14
+ return { output: `File not found: ${filePath}`, error: true };
15
+ }
16
+ const stat = fs.statSync(filePath);
17
+ if (stat.isDirectory()) {
18
+ return { output: `Path is a directory, not a file: ${filePath}`, error: true };
19
+ }
20
+ // Warn on very large files
21
+ if (stat.size > 5 * 1024 * 1024) {
22
+ return {
23
+ output: `File is very large (${(stat.size / 1024 / 1024).toFixed(1)}MB). Use offset/limit to read specific portions.`,
24
+ error: true,
25
+ };
26
+ }
27
+ const content = fs.readFileSync(filePath, "utf-8");
28
+ const lines = content.split("\n");
29
+ const selected = lines.slice(offset, offset + limit);
30
+ // Format with line numbers
31
+ const numbered = selected
32
+ .map((line, i) => `${offset + i + 1}\t${line}`)
33
+ .join("\n");
34
+ const total = lines.length;
35
+ let header = `File: ${args.file_path} (${total} lines)`;
36
+ if (offset > 0 || offset + limit < total) {
37
+ header += ` — showing lines ${offset + 1}-${Math.min(offset + limit, total)}`;
38
+ }
39
+ return { output: `${header}\n${numbered}` };
40
+ }
41
+ catch (err) {
42
+ return { output: `Error reading file: ${err.message}`, error: true };
43
+ }
44
+ }
45
+ //# sourceMappingURL=read-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToolResult } from "../types.js";
2
+ import type { ToolExecutionOptions } from "./index.js";
3
+ export declare function executeWriteFile(args: {
4
+ file_path: string;
5
+ content: string;
6
+ }, projectCwd: string, options: ToolExecutionOptions): Promise<ToolResult>;
7
+ //# sourceMappingURL=write-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiCzE"}
@@ -0,0 +1,35 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ensurePathAllowed } from "./policy.js";
4
+ export async function executeWriteFile(args, projectCwd, options) {
5
+ const filePath = path.resolve(projectCwd, args.file_path);
6
+ const sandboxError = ensurePathAllowed(filePath, projectCwd, options.sandboxMode || "danger-full-access", "write");
7
+ if (sandboxError)
8
+ return sandboxError;
9
+ // Safety: block writing to sensitive paths
10
+ const basename = path.basename(filePath).toLowerCase();
11
+ const sensitiveFiles = [".env", "credentials.json", "secrets.json", ".npmrc"];
12
+ if (sensitiveFiles.some(s => basename === s || basename.startsWith(".env"))) {
13
+ return {
14
+ output: `Refusing to write to sensitive file: ${basename}. This could expose secrets.`,
15
+ error: true,
16
+ };
17
+ }
18
+ try {
19
+ const dir = path.dirname(filePath);
20
+ if (!fs.existsSync(dir)) {
21
+ fs.mkdirSync(dir, { recursive: true });
22
+ }
23
+ const existed = fs.existsSync(filePath);
24
+ fs.writeFileSync(filePath, args.content, "utf-8");
25
+ const lines = args.content.split("\n").length;
26
+ const bytes = Buffer.byteLength(args.content, "utf-8");
27
+ return {
28
+ output: `${existed ? "Updated" : "Created"} ${args.file_path} (${lines} lines, ${bytes} bytes)`,
29
+ };
30
+ }
31
+ catch (err) {
32
+ return { output: `Error writing file: ${err.message}`, error: true };
33
+ }
34
+ }
35
+ //# sourceMappingURL=write-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAGtC,EAAE,UAAkB,EAAE,OAA6B;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,WAAW,IAAI,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACnH,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC9E,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO;YACL,MAAM,EAAE,wCAAwC,QAAQ,8BAA8B;YACtF,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEvD,OAAO;YACL,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,WAAW,KAAK,SAAS;SAChG,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Token estimation and output truncation.
3
+ * Prevents massive tool outputs from blowing the context window.
4
+ */
5
+ export declare function approxTokenCountFromChars(charCount: number): number;
6
+ export declare function approxTokenCount(text: string): number;
7
+ export declare function approxBytesForTokens(tokens: number): number;
8
+ /**
9
+ * Truncate output to fit within a token budget.
10
+ * Preserves the beginning and end, inserting a truncation notice in the middle.
11
+ */
12
+ export declare function truncateOutput(output: string, maxTokens?: number): string;
13
+ //# sourceMappingURL=truncation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.d.ts","sourceRoot":"","sources":["../src/truncation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAa,GACvB,MAAM,CAqCR"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Token estimation and output truncation.
3
+ * Prevents massive tool outputs from blowing the context window.
4
+ */
5
+ // Rough approximation: ~4 chars per token for English text
6
+ const CHARS_PER_TOKEN = 4;
7
+ export function approxTokenCountFromChars(charCount) {
8
+ return Math.ceil(Math.max(0, charCount) / CHARS_PER_TOKEN);
9
+ }
10
+ export function approxTokenCount(text) {
11
+ return approxTokenCountFromChars(text.length);
12
+ }
13
+ export function approxBytesForTokens(tokens) {
14
+ return tokens * CHARS_PER_TOKEN;
15
+ }
16
+ /**
17
+ * Truncate output to fit within a token budget.
18
+ * Preserves the beginning and end, inserting a truncation notice in the middle.
19
+ */
20
+ export function truncateOutput(output, maxTokens = 8000) {
21
+ const estimatedTokens = approxTokenCount(output);
22
+ if (estimatedTokens <= maxTokens)
23
+ return output;
24
+ const maxChars = maxTokens * CHARS_PER_TOKEN;
25
+ const keepStart = Math.floor(maxChars * 0.6); // 60% from start
26
+ const keepEnd = Math.floor(maxChars * 0.3); // 30% from end
27
+ const lines = output.split("\n");
28
+ const totalLines = lines.length;
29
+ // Find line boundaries
30
+ let startChars = 0;
31
+ let startLineEnd = 0;
32
+ for (let i = 0; i < lines.length; i++) {
33
+ if (startChars + lines[i].length + 1 > keepStart)
34
+ break;
35
+ startChars += lines[i].length + 1;
36
+ startLineEnd = i + 1;
37
+ }
38
+ let endChars = 0;
39
+ let endLineStart = lines.length;
40
+ for (let i = lines.length - 1; i >= 0; i--) {
41
+ if (endChars + lines[i].length + 1 > keepEnd)
42
+ break;
43
+ endChars += lines[i].length + 1;
44
+ endLineStart = i;
45
+ }
46
+ if (startLineEnd >= endLineStart) {
47
+ // Overlap — just hard truncate
48
+ return output.slice(0, maxChars) + `\n\n[... truncated, ${totalLines} total lines, ~${estimatedTokens} tokens]`;
49
+ }
50
+ const omitted = endLineStart - startLineEnd;
51
+ const head = lines.slice(0, startLineEnd).join("\n");
52
+ const tail = lines.slice(endLineStart).join("\n");
53
+ return `${head}\n\n[... ${omitted} lines omitted, ${totalLines} total lines, ~${estimatedTokens} tokens ...]\n\n${tail}`;
54
+ }
55
+ //# sourceMappingURL=truncation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.js","sourceRoot":"","sources":["../src/truncation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2DAA2D;AAC3D,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,eAAe,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,MAAM,GAAG,eAAe,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,YAAoB,IAAI;IAExB,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,eAAe,IAAI,SAAS;QAAE,OAAO,MAAM,CAAC;IAEhD,MAAM,QAAQ,GAAG,SAAS,GAAG,eAAe,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAG,eAAe;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAEhC,uBAAuB;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS;YAAE,MAAM;QACxD,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO;YAAE,MAAM;QACpD,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,YAAY,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;QACjC,+BAA+B;QAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,uBAAuB,UAAU,kBAAkB,eAAe,UAAU,CAAC;IAClH,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElD,OAAO,GAAG,IAAI,YAAY,OAAO,mBAAmB,UAAU,kBAAkB,eAAe,mBAAmB,IAAI,EAAE,CAAC;AAC3H,CAAC"}