@smartledger.technology/openai-claw 0.1.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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/agent.js +262 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/autopr/index.js +127 -0
  6. package/dist/autopr/index.js.map +1 -0
  7. package/dist/client.js +199 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/commands/index.js +624 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/config.js +71 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/cost.js +97 -0
  14. package/dist/cost.js.map +1 -0
  15. package/dist/eval/cli.js +32 -0
  16. package/dist/eval/cli.js.map +1 -0
  17. package/dist/eval/index.js +134 -0
  18. package/dist/eval/index.js.map +1 -0
  19. package/dist/hooks/index.js +69 -0
  20. package/dist/hooks/index.js.map +1 -0
  21. package/dist/index.js +246 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/input.js +96 -0
  24. package/dist/input.js.map +1 -0
  25. package/dist/mcp/index.js +135 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/memory/compaction.js +70 -0
  28. package/dist/memory/compaction.js.map +1 -0
  29. package/dist/memory/index.js +56 -0
  30. package/dist/memory/index.js.map +1 -0
  31. package/dist/notifications/index.js +80 -0
  32. package/dist/notifications/index.js.map +1 -0
  33. package/dist/permissions/index.js +104 -0
  34. package/dist/permissions/index.js.map +1 -0
  35. package/dist/planmode.js +12 -0
  36. package/dist/planmode.js.map +1 -0
  37. package/dist/plugins/index.js +239 -0
  38. package/dist/plugins/index.js.map +1 -0
  39. package/dist/prompts/system.js +148 -0
  40. package/dist/prompts/system.js.map +1 -0
  41. package/dist/rag/index.js +158 -0
  42. package/dist/rag/index.js.map +1 -0
  43. package/dist/self-review/index.js +157 -0
  44. package/dist/self-review/index.js.map +1 -0
  45. package/dist/session.js +113 -0
  46. package/dist/session.js.map +1 -0
  47. package/dist/skills/index.js +39 -0
  48. package/dist/skills/index.js.map +1 -0
  49. package/dist/subagent.js +128 -0
  50. package/dist/subagent.js.map +1 -0
  51. package/dist/subagents/index.js +61 -0
  52. package/dist/subagents/index.js.map +1 -0
  53. package/dist/tools/bash.js +94 -0
  54. package/dist/tools/bash.js.map +1 -0
  55. package/dist/tools/edit.js +64 -0
  56. package/dist/tools/edit.js.map +1 -0
  57. package/dist/tools/glob.js +34 -0
  58. package/dist/tools/glob.js.map +1 -0
  59. package/dist/tools/grep.js +87 -0
  60. package/dist/tools/grep.js.map +1 -0
  61. package/dist/tools/index.js +44 -0
  62. package/dist/tools/index.js.map +1 -0
  63. package/dist/tools/ls.js +39 -0
  64. package/dist/tools/ls.js.map +1 -0
  65. package/dist/tools/read.js +126 -0
  66. package/dist/tools/read.js.map +1 -0
  67. package/dist/tools/semantic.js +40 -0
  68. package/dist/tools/semantic.js.map +1 -0
  69. package/dist/tools/shell.js +131 -0
  70. package/dist/tools/shell.js.map +1 -0
  71. package/dist/tools/task.js +91 -0
  72. package/dist/tools/task.js.map +1 -0
  73. package/dist/tools/todo.js +64 -0
  74. package/dist/tools/todo.js.map +1 -0
  75. package/dist/tools/types.js +7 -0
  76. package/dist/tools/types.js.map +1 -0
  77. package/dist/tools/webfetch.js +62 -0
  78. package/dist/tools/webfetch.js.map +1 -0
  79. package/dist/tools/websearch.js +82 -0
  80. package/dist/tools/websearch.js.map +1 -0
  81. package/dist/tools/write.js +39 -0
  82. package/dist/tools/write.js.map +1 -0
  83. package/dist/ui/repl.js +203 -0
  84. package/dist/ui/repl.js.map +1 -0
  85. package/dist/ui/tui/App.js +234 -0
  86. package/dist/ui/tui/App.js.map +1 -0
  87. package/dist/ui/tui/Diff.js +38 -0
  88. package/dist/ui/tui/Diff.js.map +1 -0
  89. package/dist/ui/tui/MessageView.js +50 -0
  90. package/dist/ui/tui/MessageView.js.map +1 -0
  91. package/dist/ui/tui/PermissionPrompt.js +47 -0
  92. package/dist/ui/tui/PermissionPrompt.js.map +1 -0
  93. package/dist/ui/tui/SlashSuggest.js +36 -0
  94. package/dist/ui/tui/SlashSuggest.js.map +1 -0
  95. package/dist/ui/tui/StatusBar.js +31 -0
  96. package/dist/ui/tui/StatusBar.js.map +1 -0
  97. package/dist/ui/tui/highlight.js +66 -0
  98. package/dist/ui/tui/highlight.js.map +1 -0
  99. package/dist/ui/tui/index.js +12 -0
  100. package/dist/ui/tui/index.js.map +1 -0
  101. package/dist/ui/tui/markdown.js +46 -0
  102. package/dist/ui/tui/markdown.js.map +1 -0
  103. package/dist/ui/tui/types.js +2 -0
  104. package/dist/ui/tui/types.js.map +1 -0
  105. package/dist/web/index.js +195 -0
  106. package/dist/web/index.js.map +1 -0
  107. package/package.json +79 -0
@@ -0,0 +1,61 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import matter from "gray-matter";
4
+ const BUILTIN = [
5
+ {
6
+ name: "general-purpose",
7
+ description: "General-purpose subagent with the full tool set. Use for open-ended multi-step tasks.",
8
+ body: "",
9
+ file: "(builtin)",
10
+ },
11
+ {
12
+ name: "explore",
13
+ description: "Read-only search subagent. Use for locating code, files, references.",
14
+ tools: ["Read", "Grep", "Glob", "LS", "WebFetch", "WebSearch"],
15
+ body: "",
16
+ file: "(builtin)",
17
+ },
18
+ ];
19
+ /**
20
+ * Discover subagent definitions. Order of precedence:
21
+ * 1. project: <workdir>/.claw/agents/*.md (wins on name clash)
22
+ * 2. user: <homeDir>/agents/*.md
23
+ * 3. builtin: general-purpose, explore
24
+ */
25
+ export function listSubagents(config) {
26
+ const seen = new Map();
27
+ for (const def of BUILTIN)
28
+ seen.set(def.name, def);
29
+ const dirs = [
30
+ path.join(config.homeDir, "agents"),
31
+ path.join(config.workdir, ".claw", "agents"),
32
+ ];
33
+ for (const dir of dirs) {
34
+ if (!fs.existsSync(dir))
35
+ continue;
36
+ for (const entry of fs.readdirSync(dir)) {
37
+ if (!entry.endsWith(".md"))
38
+ continue;
39
+ const file = path.join(dir, entry);
40
+ try {
41
+ const parsed = matter(fs.readFileSync(file, "utf8"));
42
+ const name = parsed.data?.name ?? entry.replace(/\.md$/, "");
43
+ const def = {
44
+ name,
45
+ description: parsed.data?.description ?? "",
46
+ tools: Array.isArray(parsed.data?.tools) ? parsed.data.tools : undefined,
47
+ modelRole: parsed.data?.modelRole,
48
+ body: parsed.content.trim(),
49
+ file,
50
+ };
51
+ seen.set(name, def); // later overwrites earlier
52
+ }
53
+ catch { }
54
+ }
55
+ }
56
+ return Array.from(seen.values());
57
+ }
58
+ export function findSubagent(config, name) {
59
+ return listSubagents(config).find((s) => s.name === name);
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subagents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AAgBjC,MAAM,OAAO,GAAkB;IAC7B;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,uFAAuF;QACpG,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,sEAAsE;QACnF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC;QAC9D,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,WAAW;KAClB;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;KAC7C,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC7D,MAAM,GAAG,GAAgB;oBACvB,IAAI;oBACJ,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE;oBAC3C,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;oBACxE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,SAAkC;oBAC1D,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC3B,IAAI;iBACL,CAAC;gBACF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,2BAA2B;YAClD,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkB,EAAE,IAAY;IAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { spawn } from "node:child_process";
2
+ import { ok, err } from "./types.js";
3
+ import { spawnBackgroundShell } from "./shell.js";
4
+ const DEFAULT_TIMEOUT = 120_000;
5
+ const MAX_TIMEOUT = 600_000;
6
+ const MAX_OUTPUT = 100_000;
7
+ export const bashTool = {
8
+ name: "Bash",
9
+ description: "Execute a bash command. Working directory persists, shell state does not. Always quote paths with spaces. Output is truncated at 100k chars. Timeout defaults to 120s (max 600s). Set run_in_background=true to start a long-running shell and get back a shell_id; poll it with BashOutput and stop it with KillShell.",
10
+ needsPermission: true,
11
+ mutates: true,
12
+ parameters: {
13
+ type: "object",
14
+ properties: {
15
+ command: { type: "string", description: "The bash command to execute" },
16
+ description: { type: "string", description: "Brief description of what the command does" },
17
+ timeout: { type: "number", description: "Timeout in ms (max 600000)" },
18
+ run_in_background: { type: "boolean", description: "Run as a background shell; returns a shell_id for BashOutput/KillShell" },
19
+ },
20
+ required: ["command"],
21
+ },
22
+ async run(input, ctx) {
23
+ if (input.run_in_background) {
24
+ const shell = spawnBackgroundShell(ctx.config, input.command);
25
+ return ok(`Started background shell ${shell.id} (pid ${shell.pid}).\nUse BashOutput(shell_id="${shell.id}") to poll, KillShell to stop.`);
26
+ }
27
+ const timeout = Math.min(input.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT);
28
+ const cwd = ctx.config.workdir;
29
+ return new Promise((resolve) => {
30
+ const child = spawn("bash", ["-c", input.command], {
31
+ cwd,
32
+ env: process.env,
33
+ stdio: ["ignore", "pipe", "pipe"],
34
+ });
35
+ let stdout = "";
36
+ let stderr = "";
37
+ let timedOut = false;
38
+ let killed = false;
39
+ const timer = setTimeout(() => {
40
+ timedOut = true;
41
+ try {
42
+ child.kill("SIGTERM");
43
+ setTimeout(() => child.kill("SIGKILL"), 2000);
44
+ }
45
+ catch { }
46
+ }, timeout);
47
+ const abortHandler = () => {
48
+ killed = true;
49
+ try {
50
+ child.kill("SIGTERM");
51
+ }
52
+ catch { }
53
+ };
54
+ ctx.abortSignal?.addEventListener("abort", abortHandler);
55
+ child.stdout.on("data", (d) => {
56
+ const text = d.toString();
57
+ stdout += text;
58
+ if (stdout.length > MAX_OUTPUT)
59
+ stdout = stdout.slice(0, MAX_OUTPUT) + "\n[stdout truncated]";
60
+ ctx.onProgress?.(text);
61
+ });
62
+ child.stderr.on("data", (d) => {
63
+ const text = d.toString();
64
+ stderr += text;
65
+ if (stderr.length > MAX_OUTPUT)
66
+ stderr = stderr.slice(0, MAX_OUTPUT) + "\n[stderr truncated]";
67
+ ctx.onProgress?.(text);
68
+ });
69
+ child.on("close", (code) => {
70
+ clearTimeout(timer);
71
+ ctx.abortSignal?.removeEventListener("abort", abortHandler);
72
+ const parts = [];
73
+ if (stdout)
74
+ parts.push(stdout);
75
+ if (stderr)
76
+ parts.push(`[stderr]\n${stderr}`);
77
+ if (timedOut)
78
+ parts.push(`[command timed out after ${timeout}ms]`);
79
+ if (killed)
80
+ parts.push(`[command aborted]`);
81
+ parts.push(`[exit code: ${code ?? -1}]`);
82
+ const out = parts.join("\n");
83
+ if (code !== 0 || timedOut || killed) {
84
+ resolve(err(out));
85
+ }
86
+ else {
87
+ resolve(ok(out || "(no output)"));
88
+ }
89
+ });
90
+ });
91
+ },
92
+ preview: (input) => `Bash: ${input.command.split("\n")[0].slice(0, 100)}`,
93
+ };
94
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createPatch } from "diff";
4
+ import { err } from "./types.js";
5
+ export const editTool = {
6
+ name: "Edit",
7
+ description: "Perform an exact string replacement in a file. old_string must be unique unless replace_all is true. Preserve exact indentation. For renames or sweeping changes, use replace_all.",
8
+ needsPermission: true,
9
+ mutates: true,
10
+ parameters: {
11
+ type: "object",
12
+ properties: {
13
+ file_path: { type: "string", description: "Absolute path to the file to modify" },
14
+ old_string: { type: "string", description: "Exact text to replace" },
15
+ new_string: { type: "string", description: "Replacement text (must differ from old_string)" },
16
+ replace_all: {
17
+ type: "boolean",
18
+ description: "Replace all occurrences instead of requiring uniqueness (default false)",
19
+ },
20
+ },
21
+ required: ["file_path", "old_string", "new_string"],
22
+ },
23
+ async run(input) {
24
+ const fp = path.resolve(input.file_path);
25
+ if (!fs.existsSync(fp))
26
+ return err(`File does not exist: ${fp}`);
27
+ if (input.old_string === input.new_string)
28
+ return err("new_string must differ from old_string");
29
+ const original = fs.readFileSync(fp, "utf8");
30
+ // If the file uses CRLF endings but old_string was given with LF (typical when the
31
+ // model echoes Read output), normalize both sides for matching, then re-apply line
32
+ // endings to the final result.
33
+ const usesCRLF = original.includes("\r\n");
34
+ const matchText = usesCRLF ? original.replace(/\r\n/g, "\n") : original;
35
+ const oldStr = input.old_string.replace(/\r\n/g, "\n");
36
+ const newStr = input.new_string.replace(/\r\n/g, "\n");
37
+ let updated;
38
+ let summary;
39
+ if (input.replace_all) {
40
+ const count = matchText.split(oldStr).length - 1;
41
+ if (count === 0)
42
+ return err(`old_string not found in ${fp}`);
43
+ updated = matchText.split(oldStr).join(newStr);
44
+ summary = `Replaced ${count} occurrence(s) in ${fp}`;
45
+ }
46
+ else {
47
+ const first = matchText.indexOf(oldStr);
48
+ if (first === -1)
49
+ return err(`old_string not found in ${fp}`);
50
+ const last = matchText.lastIndexOf(oldStr);
51
+ if (first !== last) {
52
+ return err(`old_string is not unique in ${fp} (found multiple matches). Provide more context or set replace_all=true.`);
53
+ }
54
+ updated = matchText.slice(0, first) + newStr + matchText.slice(first + oldStr.length);
55
+ summary = `Edited ${fp}`;
56
+ }
57
+ const finalText = usesCRLF ? updated.replace(/\n/g, "\r\n") : updated;
58
+ fs.writeFileSync(fp, finalText, "utf8");
59
+ const patch = createPatch(path.relative(process.cwd(), fp), original, finalText, "", "");
60
+ return { content: summary, display: patch };
61
+ },
62
+ preview: (input) => `Edit ${input.file_path}`,
63
+ };
64
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import fg from "fast-glob";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import { ok } from "./types.js";
5
+ export const globTool = {
6
+ name: "Glob",
7
+ description: "Find files matching a glob pattern (e.g. '**/*.ts', 'src/**/index.js'). Returns results sorted by modification time.",
8
+ needsPermission: false,
9
+ mutates: false,
10
+ parameters: {
11
+ type: "object",
12
+ properties: {
13
+ pattern: { type: "string", description: "Glob pattern" },
14
+ path: { type: "string", description: "Directory to search (default: cwd)" },
15
+ },
16
+ required: ["pattern"],
17
+ },
18
+ async run(input, ctx) {
19
+ const cwd = path.resolve(input.path ?? ctx.config.workdir);
20
+ const entries = await fg(input.pattern, {
21
+ cwd,
22
+ absolute: true,
23
+ dot: false,
24
+ ignore: ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/.next/**"],
25
+ });
26
+ const sorted = entries
27
+ .map((p) => ({ p, mtime: fs.statSync(p).mtimeMs }))
28
+ .sort((a, b) => (b.mtime - a.mtime) || a.p.localeCompare(b.p))
29
+ .map((x) => x.p);
30
+ return ok(sorted.length === 0 ? "(no matches)" : sorted.join("\n"));
31
+ },
32
+ preview: (input) => `Glob ${input.pattern}`,
33
+ };
34
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAa,EAAE,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GAA6C;IAChE,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,sHAAsH;IACxH,eAAe,EAAE,KAAK;IACtB,OAAO,EAAE,KAAK;IACd,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;YACxD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;SAC5E;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;YACtC,GAAG;YACH,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,KAAK;YACV,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;SAC1E,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,OAAO,EAAE;CAC5C,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ import { ok, err } from "./types.js";
4
+ export const grepTool = {
5
+ name: "Grep",
6
+ description: "Search file contents using ripgrep-style regex. Supports glob filters, content/files-with-matches/count output, line numbers, context lines, and multiline mode. Prefer this over `grep` via Bash.",
7
+ needsPermission: false,
8
+ mutates: false,
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ pattern: { type: "string", description: "Regex pattern to search for" },
13
+ path: { type: "string", description: "Directory or file to search (default: cwd)" },
14
+ glob: { type: "string", description: "Glob filter, e.g. '*.ts'" },
15
+ type: { type: "string", description: "File type filter, e.g. 'ts', 'py'" },
16
+ output_mode: {
17
+ type: "string",
18
+ enum: ["content", "files_with_matches", "count"],
19
+ description: "Output mode (default 'files_with_matches')",
20
+ },
21
+ "-i": { type: "boolean", description: "Case-insensitive" },
22
+ "-n": { type: "boolean", description: "Show line numbers (with content mode)" },
23
+ "-A": { type: "number", description: "Lines of context after match" },
24
+ "-B": { type: "number", description: "Lines of context before match" },
25
+ "-C": { type: "number", description: "Lines of context around match" },
26
+ head_limit: { type: "number", description: "Limit output to N lines" },
27
+ multiline: {
28
+ type: "boolean",
29
+ description: "Enable multiline regex mode (-U). Patterns may span newlines.",
30
+ },
31
+ },
32
+ required: ["pattern"],
33
+ },
34
+ async run(input, ctx) {
35
+ const args = [];
36
+ const mode = input.output_mode ?? "files_with_matches";
37
+ if (mode === "files_with_matches")
38
+ args.push("-l");
39
+ else if (mode === "count")
40
+ args.push("-c");
41
+ if (input["-i"])
42
+ args.push("-i");
43
+ if (mode === "content" && input["-n"])
44
+ args.push("-n");
45
+ if (input["-A"] !== undefined)
46
+ args.push("-A", String(input["-A"]));
47
+ if (input["-B"] !== undefined)
48
+ args.push("-B", String(input["-B"]));
49
+ if (input["-C"] !== undefined)
50
+ args.push("-C", String(input["-C"]));
51
+ if (input.glob)
52
+ args.push("--glob", input.glob);
53
+ if (input.type)
54
+ args.push("--type", input.type);
55
+ if (input.multiline)
56
+ args.push("-U", "--multiline-dotall");
57
+ // Cap matches at ripgrep level when possible — saves memory on huge result sets.
58
+ if (input.head_limit && mode === "content") {
59
+ args.push("--max-count", String(input.head_limit));
60
+ }
61
+ args.push(input.pattern);
62
+ args.push(path.resolve(input.path ?? ctx.config.workdir));
63
+ return new Promise((resolve) => {
64
+ const child = spawn("rg", args, { cwd: ctx.config.workdir, env: process.env });
65
+ let out = "";
66
+ let errOut = "";
67
+ child.stdout.on("data", (d) => (out += d.toString()));
68
+ child.stderr.on("data", (d) => (errOut += d.toString()));
69
+ child.on("error", (e) => {
70
+ resolve(err(`Failed to run ripgrep (is it installed?): ${e.message}`));
71
+ });
72
+ child.on("close", (code) => {
73
+ if (code === 1)
74
+ return resolve(ok("(no matches)"));
75
+ if (code !== 0 && code !== null) {
76
+ return resolve(err(errOut || `ripgrep exited ${code}`));
77
+ }
78
+ let lines = out.split("\n");
79
+ if (input.head_limit)
80
+ lines = lines.slice(0, input.head_limit);
81
+ resolve(ok(lines.join("\n").trim() || "(no matches)"));
82
+ });
83
+ });
84
+ },
85
+ preview: (input) => `Grep ${input.pattern} in ${input.path ?? "."}`,
86
+ };
87
+ //# 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,44 @@
1
+ import { readTool } from "./read.js";
2
+ import { writeTool } from "./write.js";
3
+ import { editTool } from "./edit.js";
4
+ import { bashTool } from "./bash.js";
5
+ import { grepTool } from "./grep.js";
6
+ import { globTool } from "./glob.js";
7
+ import { lsTool } from "./ls.js";
8
+ import { webFetchTool } from "./webfetch.js";
9
+ import { webSearchTool } from "./websearch.js";
10
+ import { taskTool, buildTaskTool } from "./task.js";
11
+ import { todoWriteTool } from "./todo.js";
12
+ import { bashOutputTool, killShellTool } from "./shell.js";
13
+ import { semanticTool } from "./semantic.js";
14
+ /**
15
+ * Build the tool catalog. Pass a config to get a Task tool whose enum reflects
16
+ * the current registered subagent types; without it falls back to the static
17
+ * taskTool with only the builtin types.
18
+ */
19
+ export function getAllTools(config) {
20
+ const task = config ? buildTaskTool(config) : taskTool;
21
+ return [
22
+ readTool,
23
+ writeTool,
24
+ editTool,
25
+ bashTool,
26
+ bashOutputTool,
27
+ killShellTool,
28
+ grepTool,
29
+ globTool,
30
+ lsTool,
31
+ semanticTool,
32
+ webFetchTool,
33
+ webSearchTool,
34
+ task,
35
+ todoWriteTool,
36
+ ];
37
+ }
38
+ export function getSubagentTools(kind) {
39
+ if (kind === "explore") {
40
+ return [readTool, grepTool, globTool, lsTool, semanticTool, webFetchTool, webSearchTool];
41
+ }
42
+ return getAllTools().filter((t) => t.name !== "Task");
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvD,OAAO;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,cAAc;QACd,aAAa;QACb,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,YAAY;QACZ,YAAY;QACZ,aAAa;QACb,IAAI;QACJ,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAmC;IAClE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { minimatch } from "minimatch";
4
+ import { ok, err } from "./types.js";
5
+ export const lsTool = {
6
+ name: "LS",
7
+ description: "List files and directories at the given absolute path.",
8
+ needsPermission: false,
9
+ mutates: false,
10
+ parameters: {
11
+ type: "object",
12
+ properties: {
13
+ path: { type: "string", description: "Absolute path to list" },
14
+ ignore: {
15
+ type: "array",
16
+ items: { type: "string" },
17
+ description: "Glob patterns to skip",
18
+ },
19
+ },
20
+ required: ["path"],
21
+ },
22
+ async run(input) {
23
+ const p = path.resolve(input.path);
24
+ if (!fs.existsSync(p))
25
+ return err(`Path does not exist: ${p}`);
26
+ const stat = fs.statSync(p);
27
+ if (!stat.isDirectory())
28
+ return ok(p);
29
+ const entries = fs.readdirSync(p, { withFileTypes: true });
30
+ const ignore = input.ignore ?? [];
31
+ const lines = entries
32
+ .filter((e) => !ignore.some((g) => minimatch(e.name, g, { dot: true })))
33
+ .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))
34
+ .sort();
35
+ return ok(lines.join("\n") || "(empty)");
36
+ },
37
+ preview: (input) => `LS ${input.path}`,
38
+ };
39
+ //# sourceMappingURL=ls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../src/tools/ls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAa,EAAE,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,MAAM,MAAM,GAA8C;IAC/D,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,wDAAwD;IACrE,eAAe,EAAE,KAAK;IACtB,OAAO,EAAE,KAAK;IACd,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC9D,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,uBAAuB;aACrC;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;IACD,KAAK,CAAC,GAAG,CAAC,KAAK;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aACvE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACrD,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE;CACvC,CAAC"}
@@ -0,0 +1,126 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ok, err } from "./types.js";
4
+ const MAX_LINES = 2000;
5
+ const MAX_LINE_LEN = 2000;
6
+ const IMAGE_EXTS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp", ".ico", ".tiff"]);
7
+ export const readTool = {
8
+ name: "Read",
9
+ description: "Read a file from the local filesystem. Use absolute paths. Text files return lines prefixed with line numbers (cat -n format); use offset/limit for large files. .pdf files extract text (use `pages` like '1-5'); .ipynb files return cell sources and outputs.",
10
+ needsPermission: false,
11
+ mutates: false,
12
+ parameters: {
13
+ type: "object",
14
+ properties: {
15
+ file_path: { type: "string", description: "Absolute path to the file" },
16
+ offset: { type: "number", description: "Line number to start reading from (1-indexed)" },
17
+ limit: { type: "number", description: "Number of lines to read (default 2000)" },
18
+ pages: { type: "string", description: "Page range for PDFs, e.g. '1-5' or '3'" },
19
+ },
20
+ required: ["file_path"],
21
+ },
22
+ async run(input) {
23
+ const fp = path.resolve(input.file_path);
24
+ if (!fs.existsSync(fp))
25
+ return err(`File does not exist: ${fp}`);
26
+ const stat = fs.statSync(fp);
27
+ if (stat.isDirectory())
28
+ return err(`Path is a directory, not a file: ${fp}`);
29
+ const ext = path.extname(fp).toLowerCase();
30
+ if (IMAGE_EXTS.has(ext)) {
31
+ return err(`${fp} is an image file. Read returns raw bytes which are not useful for understanding image content. ` +
32
+ `If the image was already attached to the user's message, just look at it. ` +
33
+ `If not, ask the user to attach it via @${path.basename(fp)} or /img.`);
34
+ }
35
+ if (ext === ".pdf") {
36
+ return readPdf(fp, input.pages);
37
+ }
38
+ if (ext === ".ipynb") {
39
+ return readNotebook(fp);
40
+ }
41
+ if (stat.size > 10 * 1024 * 1024 && !input.limit) {
42
+ return err(`File is too large (${(stat.size / 1024 / 1024).toFixed(1)}MB). Use offset/limit.`);
43
+ }
44
+ const text = fs.readFileSync(fp, "utf8");
45
+ const lines = text.split("\n");
46
+ const start = (input.offset ?? 1) - 1;
47
+ const limit = input.limit ?? MAX_LINES;
48
+ const slice = lines.slice(start, start + limit);
49
+ const rendered = slice
50
+ .map((line, i) => {
51
+ const num = start + i + 1;
52
+ const truncated = line.length > MAX_LINE_LEN ? line.slice(0, MAX_LINE_LEN) + " [truncated]" : line;
53
+ return `${String(num).padStart(6, " ")}\t${truncated}`;
54
+ })
55
+ .join("\n");
56
+ if (rendered.length === 0)
57
+ return ok("(file is empty)");
58
+ return ok(rendered);
59
+ },
60
+ preview: (input) => `Read ${input.file_path}`,
61
+ };
62
+ async function readPdf(fp, pages) {
63
+ try {
64
+ const mod = (await import("pdf-parse"));
65
+ const pdf = mod.default ?? mod;
66
+ const data = await pdf(fs.readFileSync(fp));
67
+ if (!pages) {
68
+ if (data.numpages > 10) {
69
+ return err(`PDF has ${data.numpages} pages. Provide a 'pages' range (e.g. '1-5') to limit extraction.`);
70
+ }
71
+ return ok(data.text || "(empty PDF)");
72
+ }
73
+ // pdf-parse doesn't expose per-page text directly without a hook, so we approximate by
74
+ // splitting on form-feed (\f) which pdf-parse inserts between pages.
75
+ const allPages = (data.text || "").split("\f");
76
+ const [from, to] = parsePageRange(pages, allPages.length);
77
+ if (from < 1 || from > allPages.length) {
78
+ return err(`pages out of range — PDF has ${allPages.length} page(s).`);
79
+ }
80
+ const slice = allPages.slice(from - 1, to);
81
+ return ok(slice.map((p, i) => `--- Page ${from + i} ---\n${p}`).join("\n\n"));
82
+ }
83
+ catch (e) {
84
+ return err(`PDF read failed: ${e?.message ?? String(e)}`);
85
+ }
86
+ }
87
+ function parsePageRange(spec, total) {
88
+ const m = spec.match(/^(\d+)(?:-(\d+))?$/);
89
+ if (!m)
90
+ return [1, total];
91
+ const from = parseInt(m[1], 10);
92
+ const to = m[2] ? parseInt(m[2], 10) : from;
93
+ return [from, Math.min(to, total)];
94
+ }
95
+ function readNotebook(fp) {
96
+ try {
97
+ const nb = JSON.parse(fs.readFileSync(fp, "utf8"));
98
+ const cells = Array.isArray(nb.cells) ? nb.cells : [];
99
+ const out = [];
100
+ cells.forEach((cell, i) => {
101
+ const src = Array.isArray(cell.source) ? cell.source.join("") : String(cell.source ?? "");
102
+ out.push(`[cell ${i + 1} type=${cell.cell_type}]\n${src}`);
103
+ if (cell.cell_type === "code" && Array.isArray(cell.outputs) && cell.outputs.length) {
104
+ const outs = cell.outputs
105
+ .map((o) => {
106
+ if (o.text)
107
+ return Array.isArray(o.text) ? o.text.join("") : String(o.text);
108
+ if (o.data?.["text/plain"]) {
109
+ const t = o.data["text/plain"];
110
+ return Array.isArray(t) ? t.join("") : String(t);
111
+ }
112
+ return "";
113
+ })
114
+ .filter(Boolean)
115
+ .join("\n");
116
+ if (outs)
117
+ out.push(`[cell ${i + 1} output]\n${outs}`);
118
+ }
119
+ });
120
+ return ok(out.join("\n\n") || "(empty notebook)");
121
+ }
122
+ catch (e) {
123
+ return err(`Notebook parse failed: ${e?.message ?? String(e)}`);
124
+ }
125
+ }
126
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}