@morphllm/morphsdk 0.2.102 → 0.2.103

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 (109) hide show
  1. package/dist/chunk-2MAUPERG.js +129 -0
  2. package/dist/chunk-2MAUPERG.js.map +1 -0
  3. package/dist/{chunk-QH4BSXOD.js → chunk-4CZPXV6R.js} +8 -7
  4. package/dist/chunk-4CZPXV6R.js.map +1 -0
  5. package/dist/{chunk-AIXF4GQC.js → chunk-AFLEE2PO.js} +2 -2
  6. package/dist/{chunk-CP4NZGRY.js → chunk-EMMSRY32.js} +3 -3
  7. package/dist/chunk-EMMSRY32.js.map +1 -0
  8. package/dist/{chunk-QZNGKOCZ.js → chunk-HDRLLCAD.js} +4 -4
  9. package/dist/{chunk-BKIM7SNY.js → chunk-I3IN742Q.js} +4 -4
  10. package/dist/{chunk-7UYDS6OX.js → chunk-KQP6ZPYB.js} +4 -4
  11. package/dist/{chunk-OTPYEYMZ.js → chunk-MY4OU4ON.js} +2 -2
  12. package/dist/{chunk-UBX7QYBD.js → chunk-O5DA5V5S.js} +4 -4
  13. package/dist/{chunk-GJU7UOFL.js → chunk-OUEJ6XEO.js} +4 -4
  14. package/dist/{chunk-L5WXPMCH.js → chunk-QUIGATZE.js} +2 -2
  15. package/dist/chunk-TLC3QKE6.js +114 -0
  16. package/dist/chunk-TLC3QKE6.js.map +1 -0
  17. package/dist/{chunk-4J6NACK2.js → chunk-Y2OTK5WC.js} +15 -15
  18. package/dist/{chunk-4KMBU6T3.js → chunk-YJZP5ZL5.js} +4 -4
  19. package/dist/{chunk-76DJEQEP.js → chunk-ZRLEAPZV.js} +4 -4
  20. package/dist/{chunk-BGEEES52.js → chunk-ZROQPUCQ.js} +7 -7
  21. package/dist/client.cjs +2922 -2840
  22. package/dist/client.cjs.map +1 -1
  23. package/dist/client.d.ts +1 -0
  24. package/dist/client.js +18 -21
  25. package/dist/edge.cjs +437 -0
  26. package/dist/edge.cjs.map +1 -0
  27. package/dist/edge.d.ts +5 -0
  28. package/dist/edge.js +25 -0
  29. package/dist/edge.js.map +1 -0
  30. package/dist/index.cjs +1981 -1888
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.ts +2 -1
  33. package/dist/index.js +28 -26
  34. package/dist/modelrouter/core.cjs +2 -2
  35. package/dist/modelrouter/core.cjs.map +1 -1
  36. package/dist/modelrouter/core.js +1 -1
  37. package/dist/modelrouter/index.cjs +2 -2
  38. package/dist/modelrouter/index.cjs.map +1 -1
  39. package/dist/modelrouter/index.js +1 -1
  40. package/dist/tools/browser/index.js +3 -3
  41. package/dist/tools/codebase_search/anthropic.js +2 -2
  42. package/dist/tools/codebase_search/index.js +6 -6
  43. package/dist/tools/codebase_search/openai.js +2 -2
  44. package/dist/tools/codebase_search/vercel.js +2 -2
  45. package/dist/tools/fastapply/anthropic.cjs +109 -40
  46. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  47. package/dist/tools/fastapply/anthropic.js +3 -2
  48. package/dist/tools/fastapply/apply.cjs +227 -0
  49. package/dist/tools/fastapply/apply.cjs.map +1 -0
  50. package/dist/tools/fastapply/apply.d.ts +59 -0
  51. package/dist/tools/fastapply/apply.js +15 -0
  52. package/dist/tools/fastapply/apply.js.map +1 -0
  53. package/dist/tools/fastapply/core.cjs +156 -116
  54. package/dist/tools/fastapply/core.cjs.map +1 -1
  55. package/dist/tools/fastapply/core.d.ts +5 -41
  56. package/dist/tools/fastapply/core.js +6 -2
  57. package/dist/tools/fastapply/index.cjs +113 -76
  58. package/dist/tools/fastapply/index.cjs.map +1 -1
  59. package/dist/tools/fastapply/index.d.ts +2 -1
  60. package/dist/tools/fastapply/index.js +11 -9
  61. package/dist/tools/fastapply/openai.cjs +110 -41
  62. package/dist/tools/fastapply/openai.cjs.map +1 -1
  63. package/dist/tools/fastapply/openai.js +3 -2
  64. package/dist/tools/fastapply/vercel.cjs +110 -41
  65. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  66. package/dist/tools/fastapply/vercel.js +3 -2
  67. package/dist/tools/index.cjs +113 -76
  68. package/dist/tools/index.cjs.map +1 -1
  69. package/dist/tools/index.d.ts +2 -1
  70. package/dist/tools/index.js +11 -9
  71. package/dist/tools/warp_grep/agent/runner.js +3 -3
  72. package/dist/tools/warp_grep/anthropic.cjs +549 -500
  73. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  74. package/dist/tools/warp_grep/anthropic.js +5 -9
  75. package/dist/tools/warp_grep/client.cjs +550 -501
  76. package/dist/tools/warp_grep/client.cjs.map +1 -1
  77. package/dist/tools/warp_grep/client.js +4 -8
  78. package/dist/tools/warp_grep/gemini.cjs +549 -500
  79. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  80. package/dist/tools/warp_grep/gemini.js +4 -8
  81. package/dist/tools/warp_grep/gemini.js.map +1 -1
  82. package/dist/tools/warp_grep/harness.js +12 -12
  83. package/dist/tools/warp_grep/index.cjs +559 -501
  84. package/dist/tools/warp_grep/index.cjs.map +1 -1
  85. package/dist/tools/warp_grep/index.js +12 -12
  86. package/dist/tools/warp_grep/openai.cjs +549 -500
  87. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  88. package/dist/tools/warp_grep/openai.js +5 -9
  89. package/dist/tools/warp_grep/providers/local.js +2 -2
  90. package/dist/tools/warp_grep/vercel.cjs +549 -500
  91. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  92. package/dist/tools/warp_grep/vercel.js +5 -9
  93. package/package.json +7 -2
  94. package/dist/chunk-CKTA4AXM.js +0 -233
  95. package/dist/chunk-CKTA4AXM.js.map +0 -1
  96. package/dist/chunk-CP4NZGRY.js.map +0 -1
  97. package/dist/chunk-QH4BSXOD.js.map +0 -1
  98. /package/dist/{chunk-AIXF4GQC.js.map → chunk-AFLEE2PO.js.map} +0 -0
  99. /package/dist/{chunk-QZNGKOCZ.js.map → chunk-HDRLLCAD.js.map} +0 -0
  100. /package/dist/{chunk-BKIM7SNY.js.map → chunk-I3IN742Q.js.map} +0 -0
  101. /package/dist/{chunk-7UYDS6OX.js.map → chunk-KQP6ZPYB.js.map} +0 -0
  102. /package/dist/{chunk-OTPYEYMZ.js.map → chunk-MY4OU4ON.js.map} +0 -0
  103. /package/dist/{chunk-UBX7QYBD.js.map → chunk-O5DA5V5S.js.map} +0 -0
  104. /package/dist/{chunk-GJU7UOFL.js.map → chunk-OUEJ6XEO.js.map} +0 -0
  105. /package/dist/{chunk-L5WXPMCH.js.map → chunk-QUIGATZE.js.map} +0 -0
  106. /package/dist/{chunk-4J6NACK2.js.map → chunk-Y2OTK5WC.js.map} +0 -0
  107. /package/dist/{chunk-4KMBU6T3.js.map → chunk-YJZP5ZL5.js.map} +0 -0
  108. /package/dist/{chunk-76DJEQEP.js.map → chunk-ZRLEAPZV.js.map} +0 -0
  109. /package/dist/{chunk-BGEEES52.js.map → chunk-ZROQPUCQ.js.map} +0 -0
@@ -5,6 +5,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
8
11
  var __export = (target, all) => {
9
12
  for (var name in all)
10
13
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -27,6 +30,540 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
30
  ));
28
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
32
 
33
+ // tools/warp_grep/agent/config.ts
34
+ var parseEnvTimeout, AGENT_CONFIG, BUILTIN_EXCLUDES, DEFAULT_EXCLUDES, DEFAULT_MODEL;
35
+ var init_config = __esm({
36
+ "tools/warp_grep/agent/config.ts"() {
37
+ "use strict";
38
+ parseEnvTimeout = (envValue, defaultMs) => {
39
+ if (!envValue) return defaultMs;
40
+ const parsed = parseInt(envValue, 10);
41
+ return isNaN(parsed) || parsed <= 0 ? defaultMs : parsed;
42
+ };
43
+ AGENT_CONFIG = {
44
+ MAX_TURNS: 4,
45
+ /** Default timeout for model calls. Can be overridden via MORPH_WARP_GREP_TIMEOUT env var (in ms) */
46
+ TIMEOUT_MS: parseEnvTimeout(process.env.MORPH_WARP_GREP_TIMEOUT, 3e4),
47
+ MAX_CONTEXT_CHARS: 54e4,
48
+ MAX_OUTPUT_LINES: 200,
49
+ MAX_READ_LINES: 800,
50
+ MAX_LIST_DEPTH: 3,
51
+ LIST_TIMEOUT_MS: 2e3
52
+ };
53
+ BUILTIN_EXCLUDES = [
54
+ // Version control
55
+ ".git",
56
+ ".svn",
57
+ ".hg",
58
+ ".bzr",
59
+ // Dependencies
60
+ "node_modules",
61
+ "bower_components",
62
+ ".pnpm",
63
+ ".yarn",
64
+ "vendor",
65
+ "packages",
66
+ "Pods",
67
+ ".bundle",
68
+ // Python
69
+ "__pycache__",
70
+ ".pytest_cache",
71
+ ".mypy_cache",
72
+ ".ruff_cache",
73
+ ".venv",
74
+ "venv",
75
+ ".tox",
76
+ ".nox",
77
+ ".eggs",
78
+ "*.egg-info",
79
+ // Build outputs
80
+ "dist",
81
+ "build",
82
+ "out",
83
+ "output",
84
+ "target",
85
+ "_build",
86
+ ".next",
87
+ ".nuxt",
88
+ ".output",
89
+ ".vercel",
90
+ ".netlify",
91
+ // Cache directories
92
+ ".cache",
93
+ ".parcel-cache",
94
+ ".turbo",
95
+ ".nx",
96
+ ".gradle",
97
+ // IDE/Editor
98
+ ".idea",
99
+ ".vscode",
100
+ ".vs",
101
+ // Coverage
102
+ "coverage",
103
+ ".coverage",
104
+ "htmlcov",
105
+ ".nyc_output",
106
+ // Temporary
107
+ "tmp",
108
+ "temp",
109
+ ".tmp",
110
+ ".temp",
111
+ // Lock files
112
+ "package-lock.json",
113
+ "yarn.lock",
114
+ "pnpm-lock.yaml",
115
+ "bun.lockb",
116
+ "Cargo.lock",
117
+ "Gemfile.lock",
118
+ "poetry.lock",
119
+ // Binary/minified
120
+ "*.min.js",
121
+ "*.min.css",
122
+ "*.bundle.js",
123
+ "*.wasm",
124
+ "*.so",
125
+ "*.dll",
126
+ "*.pyc",
127
+ "*.map",
128
+ "*.js.map",
129
+ // Hidden directories catch-all
130
+ ".*"
131
+ ];
132
+ DEFAULT_EXCLUDES = (process.env.MORPH_WARP_GREP_EXCLUDE || "").split(",").map((s) => s.trim()).filter(Boolean).concat(BUILTIN_EXCLUDES);
133
+ DEFAULT_MODEL = "morph-warp-grep-v1";
134
+ }
135
+ });
136
+
137
+ // tools/warp_grep/utils/ripgrep.ts
138
+ function spawnRg(rgBinary, args, opts) {
139
+ return new Promise((resolve) => {
140
+ const child = (0, import_child_process.spawn)(rgBinary, args, {
141
+ cwd: opts?.cwd,
142
+ env: { ...process.env, ...opts?.env || {} },
143
+ stdio: ["ignore", "pipe", "pipe"]
144
+ });
145
+ let stdout = "";
146
+ let stderr = "";
147
+ child.stdout.on("data", (d) => stdout += d.toString());
148
+ child.stderr.on("data", (d) => stderr += d.toString());
149
+ child.on("close", (code) => {
150
+ resolve({ stdout, stderr, exitCode: typeof code === "number" ? code : -1 });
151
+ });
152
+ child.on("error", () => {
153
+ resolve({ stdout: "", stderr: "Failed to spawn ripgrep.", exitCode: -1 });
154
+ });
155
+ });
156
+ }
157
+ function isBinaryFailure(result) {
158
+ if (result.exitCode === -1) return true;
159
+ if (result.stderr.includes("jemalloc") || result.stderr.includes("Unsupported system page size")) return true;
160
+ if (result.exitCode === 134) return true;
161
+ return false;
162
+ }
163
+ async function runRipgrep(args, opts) {
164
+ if (rgPathChecked && resolvedRgPath) {
165
+ return spawnRg(resolvedRgPath, args, opts);
166
+ }
167
+ if (!rgPathChecked) {
168
+ const result = await spawnRg(import_ripgrep.rgPath, args, opts);
169
+ if (!isBinaryFailure(result)) {
170
+ resolvedRgPath = import_ripgrep.rgPath;
171
+ rgPathChecked = true;
172
+ return result;
173
+ }
174
+ const fallbackResult = await spawnRg("rg", args, opts);
175
+ if (!isBinaryFailure(fallbackResult)) {
176
+ resolvedRgPath = "rg";
177
+ rgPathChecked = true;
178
+ return fallbackResult;
179
+ }
180
+ rgPathChecked = true;
181
+ return {
182
+ stdout: "",
183
+ stderr: "Failed to spawn ripgrep. Neither bundled nor system rg is available.",
184
+ exitCode: -1
185
+ };
186
+ }
187
+ return {
188
+ stdout: "",
189
+ stderr: "Failed to spawn ripgrep. Neither bundled nor system rg is available.",
190
+ exitCode: -1
191
+ };
192
+ }
193
+ var import_child_process, import_ripgrep, resolvedRgPath, rgPathChecked;
194
+ var init_ripgrep = __esm({
195
+ "tools/warp_grep/utils/ripgrep.ts"() {
196
+ "use strict";
197
+ import_child_process = require("child_process");
198
+ import_ripgrep = require("@vscode/ripgrep");
199
+ resolvedRgPath = null;
200
+ rgPathChecked = false;
201
+ }
202
+ });
203
+
204
+ // tools/warp_grep/utils/paths.ts
205
+ function resolveUnderRepo(repoRoot, targetPath) {
206
+ const absRoot = import_path3.default.resolve(repoRoot);
207
+ const resolved = import_path3.default.resolve(absRoot, targetPath);
208
+ ensureWithinRepo(absRoot, resolved);
209
+ return resolved;
210
+ }
211
+ function ensureWithinRepo(repoRoot, absTarget) {
212
+ const rel = import_path3.default.relative(import_path3.default.resolve(repoRoot), import_path3.default.resolve(absTarget));
213
+ if (rel.startsWith("..") || import_path3.default.isAbsolute(rel)) {
214
+ throw new Error(`Path outside repository root: ${absTarget}`);
215
+ }
216
+ }
217
+ function toRepoRelative(repoRoot, absPath) {
218
+ return import_path3.default.relative(import_path3.default.resolve(repoRoot), import_path3.default.resolve(absPath));
219
+ }
220
+ function isSymlink(p) {
221
+ try {
222
+ const st = import_fs.default.lstatSync(p);
223
+ return st.isSymbolicLink();
224
+ } catch {
225
+ return false;
226
+ }
227
+ }
228
+ function fixPathRepetition(fullPath) {
229
+ const segments = fullPath.split(import_path3.default.sep).filter(Boolean);
230
+ if (segments.length < 2) return null;
231
+ for (let len = Math.floor(segments.length / 2); len >= 1; len--) {
232
+ for (let i = 0; i <= segments.length - 2 * len; i++) {
233
+ const first = segments.slice(i, i + len);
234
+ const second = segments.slice(i + len, i + 2 * len);
235
+ if (first.every((seg, idx) => seg === second[idx])) {
236
+ const fixed = [...segments.slice(0, i), ...segments.slice(i + len)];
237
+ return import_path3.default.sep + fixed.join(import_path3.default.sep);
238
+ }
239
+ }
240
+ }
241
+ return null;
242
+ }
243
+ function isTextualFile(filePath, maxBytes = 2e6) {
244
+ try {
245
+ const st = import_fs.default.statSync(filePath);
246
+ if (!st.isFile()) return false;
247
+ if (st.size > maxBytes) return false;
248
+ const fd = import_fs.default.openSync(filePath, "r");
249
+ const buf = Buffer.alloc(512);
250
+ const read = import_fs.default.readSync(fd, buf, 0, buf.length, 0);
251
+ import_fs.default.closeSync(fd);
252
+ for (let i = 0; i < read; i++) {
253
+ const c = buf[i];
254
+ if (c === 0) return false;
255
+ }
256
+ return true;
257
+ } catch {
258
+ return false;
259
+ }
260
+ }
261
+ var import_fs, import_path3;
262
+ var init_paths = __esm({
263
+ "tools/warp_grep/utils/paths.ts"() {
264
+ "use strict";
265
+ import_fs = __toESM(require("fs"), 1);
266
+ import_path3 = __toESM(require("path"), 1);
267
+ }
268
+ });
269
+
270
+ // tools/warp_grep/utils/files.ts
271
+ async function readAllLines(filePath) {
272
+ const content = await import_promises.default.readFile(filePath, "utf8");
273
+ return content.split(/\r?\n/);
274
+ }
275
+ var import_promises;
276
+ var init_files = __esm({
277
+ "tools/warp_grep/utils/files.ts"() {
278
+ "use strict";
279
+ import_promises = __toESM(require("fs/promises"), 1);
280
+ }
281
+ });
282
+
283
+ // tools/warp_grep/providers/local.ts
284
+ var local_exports = {};
285
+ __export(local_exports, {
286
+ LocalRipgrepProvider: () => LocalRipgrepProvider
287
+ });
288
+ function shouldSkip2(name) {
289
+ if (SKIP_NAMES2.has(name)) return true;
290
+ if (name.startsWith(".")) return true;
291
+ for (const ext of SKIP_EXTENSIONS2) {
292
+ if (name.endsWith(ext)) return true;
293
+ }
294
+ return false;
295
+ }
296
+ var import_promises2, import_path4, SKIP_NAMES2, SKIP_EXTENSIONS2, LocalRipgrepProvider;
297
+ var init_local = __esm({
298
+ "tools/warp_grep/providers/local.ts"() {
299
+ "use strict";
300
+ import_promises2 = __toESM(require("fs/promises"), 1);
301
+ import_path4 = __toESM(require("path"), 1);
302
+ init_ripgrep();
303
+ init_paths();
304
+ init_files();
305
+ init_config();
306
+ SKIP_NAMES2 = /* @__PURE__ */ new Set([
307
+ // Version control
308
+ ".git",
309
+ ".svn",
310
+ ".hg",
311
+ ".bzr",
312
+ // Dependencies
313
+ "node_modules",
314
+ "bower_components",
315
+ ".pnpm",
316
+ ".yarn",
317
+ "vendor",
318
+ "Pods",
319
+ ".bundle",
320
+ // Python
321
+ "__pycache__",
322
+ ".pytest_cache",
323
+ ".mypy_cache",
324
+ ".ruff_cache",
325
+ ".venv",
326
+ "venv",
327
+ ".tox",
328
+ ".nox",
329
+ ".eggs",
330
+ // Build outputs
331
+ "dist",
332
+ "build",
333
+ "out",
334
+ "output",
335
+ "target",
336
+ "_build",
337
+ ".next",
338
+ ".nuxt",
339
+ ".output",
340
+ ".vercel",
341
+ ".netlify",
342
+ // Cache
343
+ ".cache",
344
+ ".parcel-cache",
345
+ ".turbo",
346
+ ".nx",
347
+ ".gradle",
348
+ // IDE
349
+ ".idea",
350
+ ".vscode",
351
+ ".vs",
352
+ // Coverage
353
+ "coverage",
354
+ ".coverage",
355
+ "htmlcov",
356
+ ".nyc_output",
357
+ // Temp
358
+ "tmp",
359
+ "temp",
360
+ ".tmp",
361
+ ".temp",
362
+ // Lock files
363
+ "package-lock.json",
364
+ "yarn.lock",
365
+ "pnpm-lock.yaml",
366
+ "bun.lockb",
367
+ "Cargo.lock",
368
+ "Gemfile.lock",
369
+ "poetry.lock"
370
+ ]);
371
+ SKIP_EXTENSIONS2 = /* @__PURE__ */ new Set([
372
+ ".min.js",
373
+ ".min.css",
374
+ ".bundle.js",
375
+ ".wasm",
376
+ ".so",
377
+ ".dll",
378
+ ".pyc",
379
+ ".map",
380
+ ".js.map"
381
+ ]);
382
+ LocalRipgrepProvider = class {
383
+ constructor(repoRoot, excludes = DEFAULT_EXCLUDES) {
384
+ this.repoRoot = repoRoot;
385
+ this.excludes = excludes;
386
+ }
387
+ async grep(params) {
388
+ let abs;
389
+ try {
390
+ abs = resolveUnderRepo(this.repoRoot, params.path);
391
+ } catch (err) {
392
+ return {
393
+ lines: [],
394
+ error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}`
395
+ };
396
+ }
397
+ const stat = await import_promises2.default.stat(abs).catch(() => null);
398
+ if (!stat) return { lines: [] };
399
+ const targetArg = abs === import_path4.default.resolve(this.repoRoot) ? "." : toRepoRelative(this.repoRoot, abs);
400
+ const args = [
401
+ "--no-config",
402
+ "--no-heading",
403
+ "--with-filename",
404
+ "--line-number",
405
+ "--color=never",
406
+ "--trim",
407
+ "--max-columns=400",
408
+ "-C",
409
+ "1",
410
+ ...params.glob ? ["--glob", params.glob] : [],
411
+ ...this.excludes.flatMap((e) => ["-g", `!${e}`]),
412
+ params.pattern,
413
+ targetArg || "."
414
+ ];
415
+ const res = await runRipgrep(args, { cwd: this.repoRoot });
416
+ if (res.exitCode === -1) {
417
+ return {
418
+ lines: [],
419
+ error: `[RIPGREP NOT AVAILABLE] ripgrep (rg) is required but failed to execute. Please install it:
420
+ \u2022 macOS: brew install ripgrep
421
+ \u2022 Ubuntu/Debian: apt install ripgrep
422
+ \u2022 Windows: choco install ripgrep
423
+ \u2022 Or visit: https://github.com/BurntSushi/ripgrep#installation
424
+ Exit code: ${res.exitCode}${res.stderr ? `
425
+ Details: ${res.stderr}` : ""}`
426
+ };
427
+ }
428
+ if (res.exitCode !== 0 && res.exitCode !== 1) {
429
+ return {
430
+ lines: [],
431
+ error: `[RIPGREP ERROR] grep failed with exit code ${res.exitCode}${res.stderr ? `: ${res.stderr}` : ""}`
432
+ };
433
+ }
434
+ const lines = (res.stdout || "").trim().split(/\r?\n/).filter((l) => l.length > 0);
435
+ if (lines.length > AGENT_CONFIG.MAX_OUTPUT_LINES) {
436
+ return {
437
+ lines: [],
438
+ error: "query not specific enough, tool tried to return too much context and failed"
439
+ };
440
+ }
441
+ return { lines };
442
+ }
443
+ async read(params) {
444
+ let abs;
445
+ try {
446
+ abs = resolveUnderRepo(this.repoRoot, params.path);
447
+ } catch (err) {
448
+ return {
449
+ lines: [],
450
+ error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}`
451
+ };
452
+ }
453
+ let stat = await import_promises2.default.stat(abs).catch(() => null);
454
+ if (!stat || !stat.isFile()) {
455
+ const fixedPath = fixPathRepetition(abs);
456
+ if (fixedPath) {
457
+ const fixedStat = await import_promises2.default.stat(fixedPath).catch(() => null);
458
+ if (fixedStat?.isFile()) {
459
+ abs = fixedPath;
460
+ stat = fixedStat;
461
+ }
462
+ }
463
+ }
464
+ if (!stat || !stat.isFile()) {
465
+ return {
466
+ lines: [],
467
+ error: `[FILE NOT FOUND] You tried to read "${params.path}" but there is no file at this path. Double-check the path exists and is spelled correctly.`
468
+ };
469
+ }
470
+ if (isSymlink(abs)) {
471
+ return {
472
+ lines: [],
473
+ error: `[SYMLINK] You tried to read "${params.path}" but this is a symlink. Try reading the actual file it points to instead.`
474
+ };
475
+ }
476
+ if (!isTextualFile(abs)) {
477
+ return {
478
+ lines: [],
479
+ error: `[UNREADABLE FILE] You tried to read "${params.path}" but this file is either too large or not a text file, so it cannot be read. Try a different file.`
480
+ };
481
+ }
482
+ let lines;
483
+ try {
484
+ lines = await readAllLines(abs);
485
+ } catch (err) {
486
+ return {
487
+ lines: [],
488
+ error: `[READ ERROR] Failed to read "${params.path}": ${err instanceof Error ? err.message : String(err)}`
489
+ };
490
+ }
491
+ const total = lines.length;
492
+ const rawStart = params.start;
493
+ const rawEnd = params.end;
494
+ let s = 1;
495
+ let e = total;
496
+ const startValid = rawStart === void 0 || Number.isFinite(rawStart) && rawStart > 0;
497
+ const endValid = rawEnd === void 0 || Number.isFinite(rawEnd) && rawEnd > 0;
498
+ if (startValid && endValid) {
499
+ s = rawStart ?? 1;
500
+ e = Math.min(rawEnd ?? total, total);
501
+ if (s > total && total > 0 || s > e) {
502
+ s = 1;
503
+ e = total;
504
+ }
505
+ }
506
+ const out = [];
507
+ for (let i = s; i <= e; i += 1) {
508
+ const content = lines[i - 1] ?? "";
509
+ out.push(`${i}|${content}`);
510
+ }
511
+ if (out.length > AGENT_CONFIG.MAX_READ_LINES) {
512
+ const truncated = out.slice(0, AGENT_CONFIG.MAX_READ_LINES);
513
+ truncated.push(`... [truncated: showing ${AGENT_CONFIG.MAX_READ_LINES} of ${out.length} lines]`);
514
+ return { lines: truncated };
515
+ }
516
+ return { lines: out };
517
+ }
518
+ async listDirectory(params) {
519
+ let abs;
520
+ try {
521
+ abs = resolveUnderRepo(this.repoRoot, params.path);
522
+ } catch {
523
+ return [];
524
+ }
525
+ const stat = await import_promises2.default.stat(abs).catch(() => null);
526
+ if (!stat || !stat.isDirectory()) {
527
+ return [];
528
+ }
529
+ const maxResults = params.maxResults ?? AGENT_CONFIG.MAX_OUTPUT_LINES;
530
+ const maxDepth = params.maxDepth ?? AGENT_CONFIG.MAX_LIST_DEPTH;
531
+ const regex = params.pattern ? new RegExp(params.pattern) : null;
532
+ const repoRoot = this.repoRoot;
533
+ const results = [];
534
+ let timedOut = false;
535
+ const startTime = Date.now();
536
+ async function walk(dir, depth) {
537
+ if (Date.now() - startTime > AGENT_CONFIG.LIST_TIMEOUT_MS) {
538
+ timedOut = true;
539
+ return;
540
+ }
541
+ if (depth > maxDepth || results.length >= maxResults) return;
542
+ const entries = await import_promises2.default.readdir(dir, { withFileTypes: true });
543
+ for (const entry of entries) {
544
+ if (timedOut || results.length >= maxResults) break;
545
+ if (shouldSkip2(entry.name)) continue;
546
+ if (regex && !regex.test(entry.name)) continue;
547
+ const full = import_path4.default.join(dir, entry.name);
548
+ const isDir = entry.isDirectory();
549
+ results.push({
550
+ name: entry.name,
551
+ path: toRepoRelative(repoRoot, full),
552
+ type: isDir ? "dir" : "file",
553
+ depth
554
+ });
555
+ if (isDir) {
556
+ await walk(full, depth + 1);
557
+ }
558
+ }
559
+ }
560
+ await walk(abs, 0);
561
+ return results;
562
+ }
563
+ };
564
+ }
565
+ });
566
+
30
567
  // tools/warp_grep/client.ts
31
568
  var client_exports = {};
32
569
  __export(client_exports, {
@@ -37,103 +574,8 @@ __export(client_exports, {
37
574
  });
38
575
  module.exports = __toCommonJS(client_exports);
39
576
 
40
- // tools/warp_grep/agent/config.ts
41
- var parseEnvTimeout = (envValue, defaultMs) => {
42
- if (!envValue) return defaultMs;
43
- const parsed = parseInt(envValue, 10);
44
- return isNaN(parsed) || parsed <= 0 ? defaultMs : parsed;
45
- };
46
- var AGENT_CONFIG = {
47
- MAX_TURNS: 4,
48
- /** Default timeout for model calls. Can be overridden via MORPH_WARP_GREP_TIMEOUT env var (in ms) */
49
- TIMEOUT_MS: parseEnvTimeout(process.env.MORPH_WARP_GREP_TIMEOUT, 3e4),
50
- MAX_CONTEXT_CHARS: 54e4,
51
- MAX_OUTPUT_LINES: 200,
52
- MAX_READ_LINES: 800,
53
- MAX_LIST_DEPTH: 3,
54
- LIST_TIMEOUT_MS: 2e3
55
- };
56
- var BUILTIN_EXCLUDES = [
57
- // Version control
58
- ".git",
59
- ".svn",
60
- ".hg",
61
- ".bzr",
62
- // Dependencies
63
- "node_modules",
64
- "bower_components",
65
- ".pnpm",
66
- ".yarn",
67
- "vendor",
68
- "packages",
69
- "Pods",
70
- ".bundle",
71
- // Python
72
- "__pycache__",
73
- ".pytest_cache",
74
- ".mypy_cache",
75
- ".ruff_cache",
76
- ".venv",
77
- "venv",
78
- ".tox",
79
- ".nox",
80
- ".eggs",
81
- "*.egg-info",
82
- // Build outputs
83
- "dist",
84
- "build",
85
- "out",
86
- "output",
87
- "target",
88
- "_build",
89
- ".next",
90
- ".nuxt",
91
- ".output",
92
- ".vercel",
93
- ".netlify",
94
- // Cache directories
95
- ".cache",
96
- ".parcel-cache",
97
- ".turbo",
98
- ".nx",
99
- ".gradle",
100
- // IDE/Editor
101
- ".idea",
102
- ".vscode",
103
- ".vs",
104
- // Coverage
105
- "coverage",
106
- ".coverage",
107
- "htmlcov",
108
- ".nyc_output",
109
- // Temporary
110
- "tmp",
111
- "temp",
112
- ".tmp",
113
- ".temp",
114
- // Lock files
115
- "package-lock.json",
116
- "yarn.lock",
117
- "pnpm-lock.yaml",
118
- "bun.lockb",
119
- "Cargo.lock",
120
- "Gemfile.lock",
121
- "poetry.lock",
122
- // Binary/minified
123
- "*.min.js",
124
- "*.min.css",
125
- "*.bundle.js",
126
- "*.wasm",
127
- "*.so",
128
- "*.dll",
129
- "*.pyc",
130
- "*.map",
131
- "*.js.map",
132
- // Hidden directories catch-all
133
- ".*"
134
- ];
135
- var DEFAULT_EXCLUDES = (process.env.MORPH_WARP_GREP_EXCLUDE || "").split(",").map((s) => s.trim()).filter(Boolean).concat(BUILTIN_EXCLUDES);
136
- var DEFAULT_MODEL = "morph-warp-grep-v1";
577
+ // tools/warp_grep/agent/runner.ts
578
+ init_config();
137
579
 
138
580
  // tools/warp_grep/agent/prompt.ts
139
581
  var SYSTEM_PROMPT = `You are a code search agent. Your task is to find all relevant code for a given search_string.
@@ -649,6 +1091,7 @@ async function toolRead(provider, args) {
649
1091
  }
650
1092
 
651
1093
  // tools/warp_grep/agent/tools/list_directory.ts
1094
+ init_config();
652
1095
  async function toolListDirectory(provider, args) {
653
1096
  const maxResults = args.maxResults ?? AGENT_CONFIG.MAX_OUTPUT_LINES;
654
1097
  const initialDepth = args.maxDepth ?? AGENT_CONFIG.MAX_LIST_DEPTH;
@@ -823,6 +1266,7 @@ function formatAgentToolOutput(toolName, args, output, options = {}) {
823
1266
 
824
1267
  // tools/warp_grep/agent/helpers.ts
825
1268
  var import_path = __toESM(require("path"), 1);
1269
+ init_config();
826
1270
  var TRUNCATED_MARKER = "[truncated for context limit]";
827
1271
  function formatTurnMessage(turnsUsed, maxTurns) {
828
1272
  const turnsRemaining = maxTurns - turnsUsed;
@@ -1232,139 +1676,8 @@ async function* runWarpGrepStreaming(config) {
1232
1676
  };
1233
1677
  }
1234
1678
 
1235
- // tools/warp_grep/providers/local.ts
1236
- var import_promises2 = __toESM(require("fs/promises"), 1);
1237
- var import_path4 = __toESM(require("path"), 1);
1238
-
1239
- // tools/warp_grep/utils/ripgrep.ts
1240
- var import_child_process = require("child_process");
1241
- var import_ripgrep = require("@vscode/ripgrep");
1242
- var resolvedRgPath = null;
1243
- var rgPathChecked = false;
1244
- function spawnRg(rgBinary, args, opts) {
1245
- return new Promise((resolve) => {
1246
- const child = (0, import_child_process.spawn)(rgBinary, args, {
1247
- cwd: opts?.cwd,
1248
- env: { ...process.env, ...opts?.env || {} },
1249
- stdio: ["ignore", "pipe", "pipe"]
1250
- });
1251
- let stdout = "";
1252
- let stderr = "";
1253
- child.stdout.on("data", (d) => stdout += d.toString());
1254
- child.stderr.on("data", (d) => stderr += d.toString());
1255
- child.on("close", (code) => {
1256
- resolve({ stdout, stderr, exitCode: typeof code === "number" ? code : -1 });
1257
- });
1258
- child.on("error", () => {
1259
- resolve({ stdout: "", stderr: "Failed to spawn ripgrep.", exitCode: -1 });
1260
- });
1261
- });
1262
- }
1263
- function isBinaryFailure(result) {
1264
- if (result.exitCode === -1) return true;
1265
- if (result.stderr.includes("jemalloc") || result.stderr.includes("Unsupported system page size")) return true;
1266
- if (result.exitCode === 134) return true;
1267
- return false;
1268
- }
1269
- async function runRipgrep(args, opts) {
1270
- if (rgPathChecked && resolvedRgPath) {
1271
- return spawnRg(resolvedRgPath, args, opts);
1272
- }
1273
- if (!rgPathChecked) {
1274
- const result = await spawnRg(import_ripgrep.rgPath, args, opts);
1275
- if (!isBinaryFailure(result)) {
1276
- resolvedRgPath = import_ripgrep.rgPath;
1277
- rgPathChecked = true;
1278
- return result;
1279
- }
1280
- const fallbackResult = await spawnRg("rg", args, opts);
1281
- if (!isBinaryFailure(fallbackResult)) {
1282
- resolvedRgPath = "rg";
1283
- rgPathChecked = true;
1284
- return fallbackResult;
1285
- }
1286
- rgPathChecked = true;
1287
- return {
1288
- stdout: "",
1289
- stderr: "Failed to spawn ripgrep. Neither bundled nor system rg is available.",
1290
- exitCode: -1
1291
- };
1292
- }
1293
- return {
1294
- stdout: "",
1295
- stderr: "Failed to spawn ripgrep. Neither bundled nor system rg is available.",
1296
- exitCode: -1
1297
- };
1298
- }
1299
-
1300
- // tools/warp_grep/utils/paths.ts
1301
- var import_fs = __toESM(require("fs"), 1);
1302
- var import_path3 = __toESM(require("path"), 1);
1303
- function resolveUnderRepo(repoRoot, targetPath) {
1304
- const absRoot = import_path3.default.resolve(repoRoot);
1305
- const resolved = import_path3.default.resolve(absRoot, targetPath);
1306
- ensureWithinRepo(absRoot, resolved);
1307
- return resolved;
1308
- }
1309
- function ensureWithinRepo(repoRoot, absTarget) {
1310
- const rel = import_path3.default.relative(import_path3.default.resolve(repoRoot), import_path3.default.resolve(absTarget));
1311
- if (rel.startsWith("..") || import_path3.default.isAbsolute(rel)) {
1312
- throw new Error(`Path outside repository root: ${absTarget}`);
1313
- }
1314
- }
1315
- function toRepoRelative(repoRoot, absPath) {
1316
- return import_path3.default.relative(import_path3.default.resolve(repoRoot), import_path3.default.resolve(absPath));
1317
- }
1318
- function isSymlink(p) {
1319
- try {
1320
- const st = import_fs.default.lstatSync(p);
1321
- return st.isSymbolicLink();
1322
- } catch {
1323
- return false;
1324
- }
1325
- }
1326
- function fixPathRepetition(fullPath) {
1327
- const segments = fullPath.split(import_path3.default.sep).filter(Boolean);
1328
- if (segments.length < 2) return null;
1329
- for (let len = Math.floor(segments.length / 2); len >= 1; len--) {
1330
- for (let i = 0; i <= segments.length - 2 * len; i++) {
1331
- const first = segments.slice(i, i + len);
1332
- const second = segments.slice(i + len, i + 2 * len);
1333
- if (first.every((seg, idx) => seg === second[idx])) {
1334
- const fixed = [...segments.slice(0, i), ...segments.slice(i + len)];
1335
- return import_path3.default.sep + fixed.join(import_path3.default.sep);
1336
- }
1337
- }
1338
- }
1339
- return null;
1340
- }
1341
- function isTextualFile(filePath, maxBytes = 2e6) {
1342
- try {
1343
- const st = import_fs.default.statSync(filePath);
1344
- if (!st.isFile()) return false;
1345
- if (st.size > maxBytes) return false;
1346
- const fd = import_fs.default.openSync(filePath, "r");
1347
- const buf = Buffer.alloc(512);
1348
- const read = import_fs.default.readSync(fd, buf, 0, buf.length, 0);
1349
- import_fs.default.closeSync(fd);
1350
- for (let i = 0; i < read; i++) {
1351
- const c = buf[i];
1352
- if (c === 0) return false;
1353
- }
1354
- return true;
1355
- } catch {
1356
- return false;
1357
- }
1358
- }
1359
-
1360
- // tools/warp_grep/utils/files.ts
1361
- var import_promises = __toESM(require("fs/promises"), 1);
1362
- async function readAllLines(filePath) {
1363
- const content = await import_promises.default.readFile(filePath, "utf8");
1364
- return content.split(/\r?\n/);
1365
- }
1366
-
1367
- // tools/warp_grep/providers/local.ts
1679
+ // tools/warp_grep/providers/remote.ts
1680
+ init_config();
1368
1681
  var SKIP_NAMES = /* @__PURE__ */ new Set([
1369
1682
  // Version control
1370
1683
  ".git",
@@ -1449,274 +1762,6 @@ function shouldSkip(name) {
1449
1762
  }
1450
1763
  return false;
1451
1764
  }
1452
- var LocalRipgrepProvider = class {
1453
- constructor(repoRoot, excludes = DEFAULT_EXCLUDES) {
1454
- this.repoRoot = repoRoot;
1455
- this.excludes = excludes;
1456
- }
1457
- async grep(params) {
1458
- let abs;
1459
- try {
1460
- abs = resolveUnderRepo(this.repoRoot, params.path);
1461
- } catch (err) {
1462
- return {
1463
- lines: [],
1464
- error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}`
1465
- };
1466
- }
1467
- const stat = await import_promises2.default.stat(abs).catch(() => null);
1468
- if (!stat) return { lines: [] };
1469
- const targetArg = abs === import_path4.default.resolve(this.repoRoot) ? "." : toRepoRelative(this.repoRoot, abs);
1470
- const args = [
1471
- "--no-config",
1472
- "--no-heading",
1473
- "--with-filename",
1474
- "--line-number",
1475
- "--color=never",
1476
- "--trim",
1477
- "--max-columns=400",
1478
- "-C",
1479
- "1",
1480
- ...params.glob ? ["--glob", params.glob] : [],
1481
- ...this.excludes.flatMap((e) => ["-g", `!${e}`]),
1482
- params.pattern,
1483
- targetArg || "."
1484
- ];
1485
- const res = await runRipgrep(args, { cwd: this.repoRoot });
1486
- if (res.exitCode === -1) {
1487
- return {
1488
- lines: [],
1489
- error: `[RIPGREP NOT AVAILABLE] ripgrep (rg) is required but failed to execute. Please install it:
1490
- \u2022 macOS: brew install ripgrep
1491
- \u2022 Ubuntu/Debian: apt install ripgrep
1492
- \u2022 Windows: choco install ripgrep
1493
- \u2022 Or visit: https://github.com/BurntSushi/ripgrep#installation
1494
- Exit code: ${res.exitCode}${res.stderr ? `
1495
- Details: ${res.stderr}` : ""}`
1496
- };
1497
- }
1498
- if (res.exitCode !== 0 && res.exitCode !== 1) {
1499
- return {
1500
- lines: [],
1501
- error: `[RIPGREP ERROR] grep failed with exit code ${res.exitCode}${res.stderr ? `: ${res.stderr}` : ""}`
1502
- };
1503
- }
1504
- const lines = (res.stdout || "").trim().split(/\r?\n/).filter((l) => l.length > 0);
1505
- if (lines.length > AGENT_CONFIG.MAX_OUTPUT_LINES) {
1506
- return {
1507
- lines: [],
1508
- error: "query not specific enough, tool tried to return too much context and failed"
1509
- };
1510
- }
1511
- return { lines };
1512
- }
1513
- async read(params) {
1514
- let abs;
1515
- try {
1516
- abs = resolveUnderRepo(this.repoRoot, params.path);
1517
- } catch (err) {
1518
- return {
1519
- lines: [],
1520
- error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}`
1521
- };
1522
- }
1523
- let stat = await import_promises2.default.stat(abs).catch(() => null);
1524
- if (!stat || !stat.isFile()) {
1525
- const fixedPath = fixPathRepetition(abs);
1526
- if (fixedPath) {
1527
- const fixedStat = await import_promises2.default.stat(fixedPath).catch(() => null);
1528
- if (fixedStat?.isFile()) {
1529
- abs = fixedPath;
1530
- stat = fixedStat;
1531
- }
1532
- }
1533
- }
1534
- if (!stat || !stat.isFile()) {
1535
- return {
1536
- lines: [],
1537
- error: `[FILE NOT FOUND] You tried to read "${params.path}" but there is no file at this path. Double-check the path exists and is spelled correctly.`
1538
- };
1539
- }
1540
- if (isSymlink(abs)) {
1541
- return {
1542
- lines: [],
1543
- error: `[SYMLINK] You tried to read "${params.path}" but this is a symlink. Try reading the actual file it points to instead.`
1544
- };
1545
- }
1546
- if (!isTextualFile(abs)) {
1547
- return {
1548
- lines: [],
1549
- error: `[UNREADABLE FILE] You tried to read "${params.path}" but this file is either too large or not a text file, so it cannot be read. Try a different file.`
1550
- };
1551
- }
1552
- let lines;
1553
- try {
1554
- lines = await readAllLines(abs);
1555
- } catch (err) {
1556
- return {
1557
- lines: [],
1558
- error: `[READ ERROR] Failed to read "${params.path}": ${err instanceof Error ? err.message : String(err)}`
1559
- };
1560
- }
1561
- const total = lines.length;
1562
- const rawStart = params.start;
1563
- const rawEnd = params.end;
1564
- let s = 1;
1565
- let e = total;
1566
- const startValid = rawStart === void 0 || Number.isFinite(rawStart) && rawStart > 0;
1567
- const endValid = rawEnd === void 0 || Number.isFinite(rawEnd) && rawEnd > 0;
1568
- if (startValid && endValid) {
1569
- s = rawStart ?? 1;
1570
- e = Math.min(rawEnd ?? total, total);
1571
- if (s > total && total > 0 || s > e) {
1572
- s = 1;
1573
- e = total;
1574
- }
1575
- }
1576
- const out = [];
1577
- for (let i = s; i <= e; i += 1) {
1578
- const content = lines[i - 1] ?? "";
1579
- out.push(`${i}|${content}`);
1580
- }
1581
- if (out.length > AGENT_CONFIG.MAX_READ_LINES) {
1582
- const truncated = out.slice(0, AGENT_CONFIG.MAX_READ_LINES);
1583
- truncated.push(`... [truncated: showing ${AGENT_CONFIG.MAX_READ_LINES} of ${out.length} lines]`);
1584
- return { lines: truncated };
1585
- }
1586
- return { lines: out };
1587
- }
1588
- async listDirectory(params) {
1589
- let abs;
1590
- try {
1591
- abs = resolveUnderRepo(this.repoRoot, params.path);
1592
- } catch {
1593
- return [];
1594
- }
1595
- const stat = await import_promises2.default.stat(abs).catch(() => null);
1596
- if (!stat || !stat.isDirectory()) {
1597
- return [];
1598
- }
1599
- const maxResults = params.maxResults ?? AGENT_CONFIG.MAX_OUTPUT_LINES;
1600
- const maxDepth = params.maxDepth ?? AGENT_CONFIG.MAX_LIST_DEPTH;
1601
- const regex = params.pattern ? new RegExp(params.pattern) : null;
1602
- const repoRoot = this.repoRoot;
1603
- const results = [];
1604
- let timedOut = false;
1605
- const startTime = Date.now();
1606
- async function walk(dir, depth) {
1607
- if (Date.now() - startTime > AGENT_CONFIG.LIST_TIMEOUT_MS) {
1608
- timedOut = true;
1609
- return;
1610
- }
1611
- if (depth > maxDepth || results.length >= maxResults) return;
1612
- const entries = await import_promises2.default.readdir(dir, { withFileTypes: true });
1613
- for (const entry of entries) {
1614
- if (timedOut || results.length >= maxResults) break;
1615
- if (shouldSkip(entry.name)) continue;
1616
- if (regex && !regex.test(entry.name)) continue;
1617
- const full = import_path4.default.join(dir, entry.name);
1618
- const isDir = entry.isDirectory();
1619
- results.push({
1620
- name: entry.name,
1621
- path: toRepoRelative(repoRoot, full),
1622
- type: isDir ? "dir" : "file",
1623
- depth
1624
- });
1625
- if (isDir) {
1626
- await walk(full, depth + 1);
1627
- }
1628
- }
1629
- }
1630
- await walk(abs, 0);
1631
- return results;
1632
- }
1633
- };
1634
-
1635
- // tools/warp_grep/providers/remote.ts
1636
- var SKIP_NAMES2 = /* @__PURE__ */ new Set([
1637
- // Version control
1638
- ".git",
1639
- ".svn",
1640
- ".hg",
1641
- ".bzr",
1642
- // Dependencies
1643
- "node_modules",
1644
- "bower_components",
1645
- ".pnpm",
1646
- ".yarn",
1647
- "vendor",
1648
- "Pods",
1649
- ".bundle",
1650
- // Python
1651
- "__pycache__",
1652
- ".pytest_cache",
1653
- ".mypy_cache",
1654
- ".ruff_cache",
1655
- ".venv",
1656
- "venv",
1657
- ".tox",
1658
- ".nox",
1659
- ".eggs",
1660
- // Build outputs
1661
- "dist",
1662
- "build",
1663
- "out",
1664
- "output",
1665
- "target",
1666
- "_build",
1667
- ".next",
1668
- ".nuxt",
1669
- ".output",
1670
- ".vercel",
1671
- ".netlify",
1672
- // Cache
1673
- ".cache",
1674
- ".parcel-cache",
1675
- ".turbo",
1676
- ".nx",
1677
- ".gradle",
1678
- // IDE
1679
- ".idea",
1680
- ".vscode",
1681
- ".vs",
1682
- // Coverage
1683
- "coverage",
1684
- ".coverage",
1685
- "htmlcov",
1686
- ".nyc_output",
1687
- // Temp
1688
- "tmp",
1689
- "temp",
1690
- ".tmp",
1691
- ".temp",
1692
- // Lock files
1693
- "package-lock.json",
1694
- "yarn.lock",
1695
- "pnpm-lock.yaml",
1696
- "bun.lockb",
1697
- "Cargo.lock",
1698
- "Gemfile.lock",
1699
- "poetry.lock"
1700
- ]);
1701
- var SKIP_EXTENSIONS2 = /* @__PURE__ */ new Set([
1702
- ".min.js",
1703
- ".min.css",
1704
- ".bundle.js",
1705
- ".wasm",
1706
- ".so",
1707
- ".dll",
1708
- ".pyc",
1709
- ".map",
1710
- ".js.map"
1711
- ]);
1712
- function shouldSkip2(name) {
1713
- if (SKIP_NAMES2.has(name)) return true;
1714
- if (name.startsWith(".")) return true;
1715
- for (const ext of SKIP_EXTENSIONS2) {
1716
- if (name.endsWith(ext)) return true;
1717
- }
1718
- return false;
1719
- }
1720
1765
  var RemoteCommandsProvider = class {
1721
1766
  constructor(repoRoot, commands) {
1722
1767
  this.repoRoot = repoRoot;
@@ -1788,7 +1833,7 @@ var RemoteCommandsProvider = class {
1788
1833
  for (const fullPath of paths) {
1789
1834
  if (fullPath === params.path || fullPath === this.repoRoot) continue;
1790
1835
  const name = fullPath.split("/").pop() || "";
1791
- if (shouldSkip2(name)) continue;
1836
+ if (shouldSkip(name)) continue;
1792
1837
  if (regex && !regex.test(name)) continue;
1793
1838
  let relativePath = fullPath;
1794
1839
  if (fullPath.startsWith(this.repoRoot)) {
@@ -1813,6 +1858,10 @@ var RemoteCommandsProvider = class {
1813
1858
  };
1814
1859
 
1815
1860
  // tools/warp_grep/client.ts
1861
+ async function getLocalProvider(repoRoot, excludes) {
1862
+ const { LocalRipgrepProvider: LocalRipgrepProvider2 } = await Promise.resolve().then(() => (init_local(), local_exports));
1863
+ return new LocalRipgrepProvider2(repoRoot, excludes);
1864
+ }
1816
1865
  var WarpGrepClient = class {
1817
1866
  config;
1818
1867
  constructor(config = {}) {
@@ -1852,7 +1901,7 @@ function executeWarpGrep(input, config) {
1852
1901
  }
1853
1902
  async function executeToolCall(input, config) {
1854
1903
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
1855
- const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
1904
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
1856
1905
  const result = await runWarpGrep({
1857
1906
  query: parsed.query,
1858
1907
  repoRoot: config.repoRoot,
@@ -1888,7 +1937,7 @@ function processAgentResult(result) {
1888
1937
  }
1889
1938
  async function* executeToolCallStreaming(input, config) {
1890
1939
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
1891
- const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
1940
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
1892
1941
  const generator = runWarpGrepStreaming({
1893
1942
  query: parsed.query,
1894
1943
  repoRoot: config.repoRoot,