@zaly/agent 0.0.5 → 0.0.9

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 (51) hide show
  1. package/dist/{agent-BaD2kax9.mjs → agent-B7cQOuMZ.mjs} +2 -2
  2. package/dist/agent-B7cQOuMZ.mjs.map +1 -0
  3. package/dist/{agent-EkPynZRJ.mjs → agent-D3wVIibN.mjs} +4 -3
  4. package/dist/agent-D3wVIibN.mjs.map +1 -0
  5. package/dist/{compactions-3AjPqjeZ.mjs → compactions-B8VdZJoU.mjs} +2 -2
  6. package/dist/{compactions-3AjPqjeZ.mjs.map → compactions-B8VdZJoU.mjs.map} +1 -1
  7. package/dist/{edit-Qxl4w1C2.mjs → edit-D4yaBK1K.mjs} +9 -17
  8. package/dist/edit-D4yaBK1K.mjs.map +1 -0
  9. package/dist/{fetch-DknuSrSX.mjs → fetch-VKhSWdEh.mjs} +2 -2
  10. package/dist/{fetch-DknuSrSX.mjs.map → fetch-VKhSWdEh.mjs.map} +1 -1
  11. package/dist/{find-Bah9SKWX.mjs → find-CimUGn-L.mjs} +6 -20
  12. package/dist/find-CimUGn-L.mjs.map +1 -0
  13. package/dist/{grep-B4GF0svc.mjs → grep-6O3mjSvV.mjs} +10 -78
  14. package/dist/grep-6O3mjSvV.mjs.map +1 -0
  15. package/dist/index-node-esm-CJsN8G51.mjs +2116 -0
  16. package/dist/index-node-esm-CJsN8G51.mjs.map +1 -0
  17. package/dist/index.d.mts +25 -37
  18. package/dist/index.d.mts.map +1 -1
  19. package/dist/index.mjs +3 -953
  20. package/dist/{manager-f-WjFTMX.mjs → manager-BqlbCGYV.mjs} +12 -2
  21. package/dist/{manager-f-WjFTMX.mjs.map → manager-BqlbCGYV.mjs.map} +1 -1
  22. package/dist/{masker-Bv9KjkDF.mjs → masker-DRFztUwc.mjs} +2 -2
  23. package/dist/{masker-Bv9KjkDF.mjs.map → masker-DRFztUwc.mjs.map} +1 -1
  24. package/dist/{read-Djsx2NZl.mjs → read-CSL_8nAk.mjs} +47 -63
  25. package/dist/read-CSL_8nAk.mjs.map +1 -0
  26. package/dist/{registry-BVf0aZEA.mjs → registry-L9GDccS0.mjs} +89 -43
  27. package/dist/registry-L9GDccS0.mjs.map +1 -0
  28. package/dist/{session-Bv8JiT8P.mjs → session-BSvUrr12.mjs} +2 -2
  29. package/dist/{session-Bv8JiT8P.mjs.map → session-BSvUrr12.mjs.map} +1 -1
  30. package/dist/session.mjs +1 -1
  31. package/dist/src-fK6DL2bg.mjs +953 -0
  32. package/dist/src-fK6DL2bg.mjs.map +1 -0
  33. package/dist/{subagent-CX7Zjcws.mjs → subagent-C8XCEecM.mjs} +2 -2
  34. package/dist/{subagent-CX7Zjcws.mjs.map → subagent-C8XCEecM.mjs.map} +1 -1
  35. package/dist/{tools-Bl-YI890.mjs → tools-wvkkuXWH.mjs} +76 -20
  36. package/dist/tools-wvkkuXWH.mjs.map +1 -0
  37. package/dist/{write-D3L-92vj.mjs → write-DwGiDNeG.mjs} +3 -11
  38. package/dist/write-DwGiDNeG.mjs.map +1 -0
  39. package/package.json +12 -12
  40. package/dist/agent-BaD2kax9.mjs.map +0 -1
  41. package/dist/agent-EkPynZRJ.mjs.map +0 -1
  42. package/dist/edit-Qxl4w1C2.mjs.map +0 -1
  43. package/dist/find-Bah9SKWX.mjs.map +0 -1
  44. package/dist/grep-B4GF0svc.mjs.map +0 -1
  45. package/dist/index-node-esm-D6YQRKEz.mjs +0 -1537
  46. package/dist/index-node-esm-D6YQRKEz.mjs.map +0 -1
  47. package/dist/index.mjs.map +0 -1
  48. package/dist/read-Djsx2NZl.mjs.map +0 -1
  49. package/dist/registry-BVf0aZEA.mjs.map +0 -1
  50. package/dist/tools-Bl-YI890.mjs.map +0 -1
  51. package/dist/write-D3L-92vj.mjs.map +0 -1
@@ -16,49 +16,30 @@ const grepTool = defineTool({
16
16
  parallel: true,
17
17
  params: Type.Object({
18
18
  pattern: Type.String({
19
- description: "Text or regex pattern to search for.",
19
+ description: "Text or regex pattern. Uses smart case: case-insensitive unless uppercase is present.",
20
20
  minLength: 1
21
21
  }),
22
- cwd: Type.Optional(Type.String({ description: "Directory to search from. Defaults to cwd." })),
23
22
  paths: Type.Optional(Type.Array(Type.String(), { description: "Optional files/directories to search, relative to cwd or absolute." })),
24
23
  glob: Type.Optional(Type.Array(Type.String(), { description: "Ripgrep glob filters, e.g. [`*.ts`, `!dist/**`]." })),
25
- exclude: Type.Optional(Type.Array(Type.String(), { description: "Patterns to exclude, e.g. [`node_modules`, `dist/**`]." })),
26
- file_type: Type.Optional(Type.Array(Type.String(), { description: "Ripgrep file types (`-t`), e.g. [`ts`, `rust`, `markdown`]." })),
27
24
  fixed_strings: Type.Optional(Type.Boolean({
28
25
  default: false,
29
26
  description: "Treat all patterns as literals instead of as regular expressions"
30
27
  })),
31
- case_sensitive: Type.Optional(Type.Boolean({
32
- default: false,
33
- description: "Case sensitive search. Default false is smart case (case-insensitive if pattern is lowercase)."
34
- })),
35
- hidden: Type.Optional(Type.Boolean({
36
- default: false,
37
- description: "Search hidden files/directories."
38
- })),
39
- ignore: Type.Optional(Type.Boolean({
40
- default: true,
41
- description: "Respect .gitignore/.ignore rules."
42
- })),
43
- follow: Type.Optional(Type.Boolean({
44
- default: false,
45
- description: "Follow symlinks."
46
- })),
47
28
  context: Type.Optional(Type.Integer({
48
29
  default: 0,
49
- description: "Context lines before/after each match. 0-5.",
30
+ description: "Context lines before/after each match. 0-10.",
50
31
  maximum: 10,
51
32
  minimum: 0
52
33
  })),
53
34
  limit: Type.Optional(Type.Integer({
54
35
  default: DEFAULT_LIMIT,
55
- description: "Maximum matched lines to keep inline.",
36
+ description: "Maximum output lines to keep inline, including file headings and context.",
56
37
  maximum: MAX_LIMIT,
57
38
  minimum: 1
58
39
  }))
59
40
  }),
60
41
  async preflight(args, ctx) {
61
- const cwd = normPath(ctx.cwd, args.cwd ?? ".");
42
+ const cwd = normPath(ctx.cwd, ".");
62
43
  await ctx.need?.("read", cwd);
63
44
  const paths = (args.paths?.length ? args.paths : ["."]).map((p) => normPath(cwd, p));
64
45
  await Promise.all(paths.map((path) => Promise.resolve(ctx.need?.("read", path))));
@@ -69,7 +50,7 @@ const grepTool = defineTool({
69
50
  code: "MISSING_TOOL",
70
51
  message: "grep requires rg or grep"
71
52
  });
72
- const cwd = normPath(ctx.cwd, args.cwd ?? ".");
53
+ const cwd = normPath(ctx.cwd, ".");
73
54
  const paths = args.paths?.length ? args.paths : [];
74
55
  const cmdArgs = buildArgs(command.kind, args, paths);
75
56
  const result = await new Spawn(command.cmd, cmdArgs, {
@@ -131,47 +112,6 @@ const grepTool = defineTool({
131
112
  return parts;
132
113
  }
133
114
  });
134
- const FILE_TYPE_EXTENSIONS = {
135
- c: ["c", "h"],
136
- cpp: [
137
- "cpp",
138
- "cc",
139
- "cxx",
140
- "hpp",
141
- "hh",
142
- "hxx"
143
- ],
144
- go: ["go"],
145
- java: ["java"],
146
- js: [
147
- "js",
148
- "jsx",
149
- "mjs",
150
- "cjs"
151
- ],
152
- json: ["json"],
153
- lua: ["lua"],
154
- markdown: ["md", "markdown"],
155
- md: ["md", "markdown"],
156
- py: ["py"],
157
- python: ["py"],
158
- rs: ["rs"],
159
- rust: ["rs"],
160
- toml: ["toml"],
161
- ts: [
162
- "ts",
163
- "tsx",
164
- "mts",
165
- "cts"
166
- ],
167
- yaml: ["yml", "yaml"]
168
- };
169
- function fileTypeExtensions(type) {
170
- return FILE_TYPE_EXTENSIONS[type] ?? [type];
171
- }
172
- function fileTypeGlobs(type) {
173
- return fileTypeExtensions(type).map((e) => `*.${e}`);
174
- }
175
115
  function resolveGrep() {
176
116
  const rg = which("rg");
177
117
  if (rg) return {
@@ -198,17 +138,11 @@ function buildRgArgs(args, paths) {
198
138
  "--path-separator=/"
199
139
  ];
200
140
  if (args.fixed_strings) ret.push("--fixed-strings");
201
- if (args.case_sensitive) ret.push("--case-sensitive");
202
- else ret.push("--smart-case");
203
- if (args.hidden) ret.push("--hidden");
204
- else ret.push("--no-hidden");
205
- if (!args.ignore) ret.push("--no-ignore");
206
- if (args.follow) ret.push("--follow");
141
+ ret.push("--smart-case", "--no-hidden");
207
142
  const context = args.context ?? 0;
208
143
  if (context > 0) ret.push(`--context=${context}`);
209
- for (const e of [...defaultExcludes(paths), ...args.exclude ?? []]) ret.push("--glob", `!${e}`);
144
+ for (const e of defaultExcludes(paths)) ret.push("--glob", `!${e}`);
210
145
  for (const g of args.glob ?? []) ret.push("--glob", g);
211
- for (const t of args.file_type ?? []) ret.push("--type", t);
212
146
  ret.push("--", args.pattern, ...paths);
213
147
  return ret;
214
148
  }
@@ -222,12 +156,10 @@ function buildGrepArgs(args, paths) {
222
156
  ];
223
157
  if (args.fixed_strings) ret.push("--fixed-strings");
224
158
  else ret.push("--extended-regexp");
225
- const hasUpper = /[A-Z]/.test(args.pattern);
226
- if (!args.case_sensitive && !hasUpper) ret.push("--ignore-case");
159
+ if (!/[A-Z]/.test(args.pattern)) ret.push("--ignore-case");
227
160
  const context = args.context ?? 0;
228
161
  if (context > 0) ret.push("--context", String(context));
229
- for (const e of [...defaultExcludes(paths), ...args.exclude ?? []]) ret.push("--exclude-dir", e);
230
- for (const t of args.file_type ?? []) for (const g of fileTypeGlobs(t)) ret.push("--include", g);
162
+ for (const e of defaultExcludes(paths)) ret.push("--exclude-dir", e);
231
163
  for (const g of args.glob ?? []) ret.push(...grepGlobArgs(g));
232
164
  ret.push("--", args.pattern, ...paths);
233
165
  return ret;
@@ -241,4 +173,4 @@ function grepGlobArgs(glob) {
241
173
  //#endregion
242
174
  export { grepTool };
243
175
 
244
- //# sourceMappingURL=grep-B4GF0svc.mjs.map
176
+ //# sourceMappingURL=grep-6O3mjSvV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep-6O3mjSvV.mjs","names":[],"sources":["../src/tools/grep.ts"],"sourcesContent":["import type { MetaPart, TextPart, ToolContext } from \"@zaly/ai\"\n\nimport { AiError, defineTool } from \"@zaly/ai\"\nimport { normPath } from \"@zaly/shared\"\nimport { defaultExcludes } from \"@zaly/shared/find\"\nimport { Spawn, TextStream, which } from \"@zaly/shared/process\"\nimport { cleanTextTui } from \"@zaly/shared/text\"\nimport { Type } from \"typebox\"\nimport { truncate } from \"../utils/truncate.ts\"\n\nconst MAX_BUFFER = 512 * 1024\nconst DEFAULT_LIMIT = 100\nconst MAX_LIMIT = 1000\nconst MAX_COLUMNS = 200\n\nexport type GrepTool = typeof grepTool\nexport type GrepToolMeta = {\n cwd: string\n pattern: string\n truncated: boolean\n cmd: string[]\n}\n\n// oxlint-disable-next-line sort-keys -- semantic field order: name, desc, params, call\nexport const grepTool = defineTool({\n name: \"grep\",\n desc:\n `Search file contents using rg/grep. Respects .gitignore by default when ripgrep is available; ` +\n \"prefer this over bash grep/find for code search. Returns human-readable grouped matches with line numbers.\",\n parallel: true,\n // oxlint-disable-next-line sort-keys -- semantic param order\n params: Type.Object({\n pattern: Type.String({\n description:\n \"Text or regex pattern. Uses smart case: case-insensitive unless uppercase is present.\",\n minLength: 1,\n }),\n paths: Type.Optional(\n Type.Array(Type.String(), {\n description: \"Optional files/directories to search, relative to cwd or absolute.\",\n })\n ),\n glob: Type.Optional(\n Type.Array(Type.String(), {\n description: \"Ripgrep glob filters, e.g. [`*.ts`, `!dist/**`].\",\n })\n ),\n fixed_strings: Type.Optional(\n Type.Boolean({\n default: false,\n description: \"Treat all patterns as literals instead of as regular expressions\",\n })\n ),\n context: Type.Optional(\n Type.Integer({\n default: 0,\n description: \"Context lines before/after each match. 0-10.\",\n maximum: 10,\n minimum: 0,\n })\n ),\n limit: Type.Optional(\n Type.Integer({\n default: DEFAULT_LIMIT,\n description: \"Maximum output lines to keep inline, including file headings and context.\",\n maximum: MAX_LIMIT,\n minimum: 1,\n })\n ),\n }),\n\n async preflight(args, ctx: ToolContext<GrepToolMeta>) {\n const cwd = normPath(ctx.cwd, \".\")\n await ctx.need?.(\"read\", cwd)\n\n const paths = (args.paths?.length ? args.paths : [\".\"]).map((p) => normPath(cwd, p))\n await Promise.all(paths.map((path) => Promise.resolve(ctx.need?.(\"read\", path))))\n },\n\n async call(args, ctx: ToolContext<GrepToolMeta>): Promise<(MetaPart | TextPart)[]> {\n const command = resolveGrep()\n if (!command) throw new AiError({ code: \"MISSING_TOOL\", message: \"grep requires rg or grep\" })\n\n const cwd = normPath(ctx.cwd, \".\")\n const paths = args.paths?.length ? args.paths : []\n\n const cmdArgs = buildArgs(command.kind, args, paths)\n const proc = new Spawn(command.cmd, cmdArgs, {\n cwd,\n maxBuffer: MAX_BUFFER,\n signal: ctx.signal,\n stderr: new TextStream(),\n stdout: new TextStream(),\n timeout: 60_000,\n })\n const result = await proc.result.catch((error: unknown) => {\n throw new AiError({ cause: error, code: \"GREP_FAILED\", message: String(error) })\n })\n\n // rg/grep: 0 matches found, 1 no matches, >1 error.\n if (result.code > 1 && result.killReason !== \"maxBuffer\") {\n throw new AiError({\n code: \"GREP_FAILED\",\n data: { code: result.code, stderr: result.stderr },\n message: `${command.cmd} failed (${result.code}): ${result.stderr.slice(0, 500)}`,\n })\n }\n\n const text = cleanTextTui(result.stdout)\n const limit = args.limit ?? DEFAULT_LIMIT\n const summary = truncate(text, {\n maxLineChars: command.kind === \"rg\" ? 500 : MAX_COLUMNS,\n maxLines: limit + 1,\n strategy: \"head\",\n })\n\n const truncated = summary.truncated || result.killReason === \"maxBuffer\"\n ctx.meta = {\n cmd: [command.cmd, ...cmdArgs],\n cwd,\n pattern: args.pattern,\n truncated,\n }\n\n const parts: (MetaPart | TextPart)[] = []\n\n const stderr = result.stderr.trim()\n if (stderr || result.killReason) {\n const meta: Record<string, unknown> = {\n command: command.cmd,\n cwd,\n truncated,\n }\n if (result.killReason) meta.killReason = result.killReason\n if (stderr) meta.stderr = stderr.slice(0, 500)\n parts.push({ data: meta, tag: \"grep\", type: \"meta\" })\n }\n parts.push({ text: summary.text || \"No matches found.\", type: \"text\" })\n return parts\n },\n})\n\ntype GrepArgs = Parameters<GrepTool[\"call\"]>[0]\ntype GrepBackend = { cmd: string; kind: \"rg\" | \"grep\" }\n\nfunction resolveGrep(): GrepBackend | undefined {\n const rg = which(\"rg\")\n if (rg) return { cmd: rg, kind: \"rg\" }\n const grep = which(\"grep\")\n return grep ? { cmd: grep, kind: \"grep\" } : undefined\n}\n\nfunction buildArgs(kind: GrepBackend[\"kind\"], args: GrepArgs, paths: string[]): string[] {\n return kind === \"rg\" ? buildRgArgs(args, paths) : buildGrepArgs(args, paths)\n}\n\nfunction buildRgArgs(args: GrepArgs, paths: string[]): string[] {\n const ret = [\n \"--color=always\",\n \"--heading\",\n \"--with-filename\",\n \"--line-number\",\n `--max-columns=${MAX_COLUMNS}`,\n \"--max-columns-preview\",\n \"--path-separator=/\",\n ]\n\n if (args.fixed_strings) ret.push(\"--fixed-strings\")\n ret.push(\"--smart-case\", \"--no-hidden\")\n const context = args.context ?? 0\n if (context > 0) ret.push(`--context=${context}`)\n\n for (const e of defaultExcludes(paths)) ret.push(\"--glob\", `!${e}`)\n for (const g of args.glob ?? []) ret.push(\"--glob\", g)\n\n ret.push(\"--\", args.pattern, ...paths)\n return ret\n}\n\nfunction buildGrepArgs(args: GrepArgs, paths: string[]): string[] {\n const ret = [\n \"--recursive\",\n \"--line-number\",\n \"--with-filename\",\n \"--binary-files=without-match\",\n \"--color=always\",\n ]\n if (args.fixed_strings) ret.push(\"--fixed-strings\")\n else ret.push(\"--extended-regexp\")\n const hasUpper = /[A-Z]/.test(args.pattern)\n if (!hasUpper) ret.push(\"--ignore-case\")\n const context = args.context ?? 0\n if (context > 0) ret.push(\"--context\", String(context))\n for (const e of defaultExcludes(paths)) ret.push(\"--exclude-dir\", e)\n for (const g of args.glob ?? []) ret.push(...grepGlobArgs(g))\n ret.push(\"--\", args.pattern, ...paths)\n return ret\n}\n\nfunction grepGlobArgs(glob: string): string[] {\n if (!glob.startsWith(\"!\")) return [\"--include\", glob]\n const exclude = glob.slice(1)\n if (exclude.endsWith(\"/**\") && !exclude.slice(0, -3).includes(\"*\")) {\n return [\"--exclude-dir\", exclude.slice(0, -3)]\n }\n return [\"--exclude\", exclude]\n}\n"],"mappings":"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"}