@morphllm/morphsdk 0.2.49 → 0.2.50

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 (38) hide show
  1. package/dist/{chunk-L4CPOZKO.js → chunk-2TXLSKGU.js} +3 -3
  2. package/dist/{chunk-CCYRHMJV.js → chunk-4MELBN55.js} +4 -4
  3. package/dist/{chunk-7X53XYJ4.js → chunk-5ASRBH5I.js} +4 -4
  4. package/dist/{chunk-6URINEOK.js → chunk-DZRBTNQR.js} +5 -5
  5. package/dist/{chunk-3OB2FTEW.js → chunk-KH3RKPPO.js} +4 -4
  6. package/dist/{chunk-KM6V456Q.js → chunk-MLDK7SCW.js} +5 -4
  7. package/dist/chunk-MLDK7SCW.js.map +1 -0
  8. package/dist/{chunk-FGRMMG62.js → chunk-NRWVMX4O.js} +13 -13
  9. package/dist/client.cjs +4 -3
  10. package/dist/client.cjs.map +1 -1
  11. package/dist/client.js +12 -12
  12. package/dist/index.cjs +4 -3
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +12 -12
  15. package/dist/tools/warp_grep/agent/runner.js +6 -6
  16. package/dist/tools/warp_grep/anthropic.cjs +4 -3
  17. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  18. package/dist/tools/warp_grep/anthropic.js +9 -9
  19. package/dist/tools/warp_grep/index.cjs +4 -3
  20. package/dist/tools/warp_grep/index.cjs.map +1 -1
  21. package/dist/tools/warp_grep/index.js +11 -11
  22. package/dist/tools/warp_grep/openai.cjs +4 -3
  23. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  24. package/dist/tools/warp_grep/openai.js +9 -9
  25. package/dist/tools/warp_grep/providers/local.cjs +4 -3
  26. package/dist/tools/warp_grep/providers/local.cjs.map +1 -1
  27. package/dist/tools/warp_grep/providers/local.js +1 -1
  28. package/dist/tools/warp_grep/vercel.cjs +4 -3
  29. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  30. package/dist/tools/warp_grep/vercel.js +9 -9
  31. package/package.json +1 -1
  32. package/dist/chunk-KM6V456Q.js.map +0 -1
  33. /package/dist/{chunk-L4CPOZKO.js.map → chunk-2TXLSKGU.js.map} +0 -0
  34. /package/dist/{chunk-CCYRHMJV.js.map → chunk-4MELBN55.js.map} +0 -0
  35. /package/dist/{chunk-7X53XYJ4.js.map → chunk-5ASRBH5I.js.map} +0 -0
  36. /package/dist/{chunk-6URINEOK.js.map → chunk-DZRBTNQR.js.map} +0 -0
  37. /package/dist/{chunk-3OB2FTEW.js.map → chunk-KH3RKPPO.js.map} +0 -0
  38. /package/dist/{chunk-FGRMMG62.js.map → chunk-NRWVMX4O.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  runWarpGrep
3
- } from "./chunk-FGRMMG62.js";
3
+ } from "./chunk-NRWVMX4O.js";
4
4
  import {
5
5
  LocalRipgrepProvider
6
- } from "./chunk-KM6V456Q.js";
6
+ } from "./chunk-MLDK7SCW.js";
7
7
 
8
8
  // tools/warp_grep/core.ts
9
9
  var WarpGrepClient = class {
@@ -102,4 +102,4 @@ export {
102
102
  formatResult,
103
103
  WARP_GREP_DESCRIPTION
104
104
  };
105
- //# sourceMappingURL=chunk-L4CPOZKO.js.map
105
+ //# sourceMappingURL=chunk-2TXLSKGU.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  WARP_GREP_DESCRIPTION
3
- } from "./chunk-L4CPOZKO.js";
3
+ } from "./chunk-2TXLSKGU.js";
4
4
  import {
5
5
  runWarpGrep
6
- } from "./chunk-FGRMMG62.js";
6
+ } from "./chunk-NRWVMX4O.js";
7
7
  import {
8
8
  LocalRipgrepProvider
9
- } from "./chunk-KM6V456Q.js";
9
+ } from "./chunk-MLDK7SCW.js";
10
10
 
11
11
  // tools/warp_grep/vercel.ts
12
12
  import { tool } from "ai";
@@ -67,4 +67,4 @@ export {
67
67
  execute,
68
68
  createMorphWarpGrepTool
69
69
  };
70
- //# sourceMappingURL=chunk-CCYRHMJV.js.map
70
+ //# sourceMappingURL=chunk-4MELBN55.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  WARP_GREP_DESCRIPTION,
3
3
  formatResult
4
- } from "./chunk-L4CPOZKO.js";
4
+ } from "./chunk-2TXLSKGU.js";
5
5
  import {
6
6
  runWarpGrep
7
- } from "./chunk-FGRMMG62.js";
7
+ } from "./chunk-NRWVMX4O.js";
8
8
  import {
9
9
  getSystemPrompt
10
10
  } from "./chunk-WETRQJGU.js";
11
11
  import {
12
12
  LocalRipgrepProvider
13
- } from "./chunk-KM6V456Q.js";
13
+ } from "./chunk-MLDK7SCW.js";
14
14
 
15
15
  // tools/warp_grep/anthropic.ts
16
16
  var INPUT_SCHEMA = {
@@ -73,4 +73,4 @@ export {
73
73
  createMorphWarpGrepTool,
74
74
  anthropic_default
75
75
  };
76
- //# sourceMappingURL=chunk-7X53XYJ4.js.map
76
+ //# sourceMappingURL=chunk-5ASRBH5I.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  createMorphWarpGrepTool as createMorphWarpGrepTool2
3
- } from "./chunk-7X53XYJ4.js";
3
+ } from "./chunk-5ASRBH5I.js";
4
4
  import {
5
5
  createMorphWarpGrepTool
6
- } from "./chunk-3OB2FTEW.js";
6
+ } from "./chunk-KH3RKPPO.js";
7
7
  import {
8
8
  createMorphWarpGrepTool as createMorphWarpGrepTool3
9
- } from "./chunk-CCYRHMJV.js";
9
+ } from "./chunk-4MELBN55.js";
10
10
  import {
11
11
  WarpGrepClient
12
- } from "./chunk-L4CPOZKO.js";
12
+ } from "./chunk-2TXLSKGU.js";
13
13
  import {
14
14
  createCodebaseSearchTool as createCodebaseSearchTool3
15
15
  } from "./chunk-UBX7QYBD.js";
@@ -280,4 +280,4 @@ export {
280
280
  VercelToolFactory,
281
281
  MorphClient
282
282
  };
283
- //# sourceMappingURL=chunk-6URINEOK.js.map
283
+ //# sourceMappingURL=chunk-DZRBTNQR.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  WARP_GREP_DESCRIPTION,
3
3
  formatResult
4
- } from "./chunk-L4CPOZKO.js";
4
+ } from "./chunk-2TXLSKGU.js";
5
5
  import {
6
6
  runWarpGrep
7
- } from "./chunk-FGRMMG62.js";
7
+ } from "./chunk-NRWVMX4O.js";
8
8
  import {
9
9
  getSystemPrompt
10
10
  } from "./chunk-WETRQJGU.js";
11
11
  import {
12
12
  LocalRipgrepProvider
13
- } from "./chunk-KM6V456Q.js";
13
+ } from "./chunk-MLDK7SCW.js";
14
14
 
15
15
  // tools/warp_grep/openai.ts
16
16
  var TOOL_PARAMETERS = {
@@ -79,4 +79,4 @@ export {
79
79
  createMorphWarpGrepTool,
80
80
  openai_default
81
81
  };
82
- //# sourceMappingURL=chunk-3OB2FTEW.js.map
82
+ //# sourceMappingURL=chunk-KH3RKPPO.js.map
@@ -81,10 +81,11 @@ var LocalRipgrepProvider = class {
81
81
  }
82
82
  const lines = await readAllLines(abs);
83
83
  const total = lines.length;
84
- const s = params.start ?? 1;
85
- const e = Math.min(params.end ?? total, total);
84
+ let s = params.start ?? 1;
85
+ let e = Math.min(params.end ?? total, total);
86
86
  if (s > total && total > 0) {
87
- throw new Error(`start ${s} exceeds file length (${total})`);
87
+ s = 1;
88
+ e = total;
88
89
  }
89
90
  const out = [];
90
91
  for (let i = s; i <= e; i += 1) {
@@ -132,4 +133,4 @@ var LocalRipgrepProvider = class {
132
133
  export {
133
134
  LocalRipgrepProvider
134
135
  };
135
- //# sourceMappingURL=chunk-KM6V456Q.js.map
136
+ //# sourceMappingURL=chunk-MLDK7SCW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/warp_grep/providers/local.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport fssync from 'fs';\nimport path from 'path';\nimport { runRipgrep } from '../utils/ripgrep.js';\nimport { ensureWithinRepo, resolveUnderRepo, toRepoRelative, isSymlink, isTextualFile } from '../utils/paths.js';\nimport type { WarpGrepProvider, GrepResult, ReadResult, AnalyseEntry } from './types.js';\nimport { readAllLines } from '../utils/files.js';\nimport { DEFAULT_EXCLUDES } from '../agent/config.js';\n\nexport class LocalRipgrepProvider implements WarpGrepProvider {\n constructor(private readonly repoRoot: string, private readonly excludes: string[] = DEFAULT_EXCLUDES) {}\n\n async grep(params: { pattern: string; path: string }): Promise<GrepResult> {\n const abs = resolveUnderRepo(this.repoRoot, params.path);\n const stat = await fs.stat(abs).catch(() => null);\n if (!stat) return { lines: [] };\n const targetArg = abs === path.resolve(this.repoRoot) ? '.' : toRepoRelative(this.repoRoot, abs);\n const args = [\n '--no-config',\n '--no-heading',\n '--with-filename',\n '--line-number',\n '--color=never',\n '--trim',\n '--max-columns=400',\n ...this.excludes.flatMap((e) => ['-g', `!${e}`]),\n params.pattern,\n targetArg || '.',\n ];\n const res = await runRipgrep(args, { cwd: this.repoRoot });\n if (res.exitCode === -1) {\n throw new Error(res.stderr || 'ripgrep (rg) execution failed.');\n }\n if (res.exitCode !== 0 && res.exitCode !== 1) {\n throw new Error(res.stderr || `ripgrep failed with code ${res.exitCode}`);\n }\n const lines = (res.stdout || '')\n .trim()\n .split(/\\r?\\n/)\n .filter((l) => l.length > 0);\n return { lines };\n }\n\n async glob(params: { pattern: string; path: string }): Promise<{ files: string[] }> {\n const abs = resolveUnderRepo(this.repoRoot, params.path);\n const targetArg = abs === path.resolve(this.repoRoot) ? '.' : toRepoRelative(this.repoRoot, abs);\n const args = [\n '--no-config',\n '--files',\n '-g',\n params.pattern,\n ...this.excludes.flatMap((e) => ['-g', `!${e}`]),\n targetArg || '.',\n ];\n const res = await runRipgrep(args, { cwd: this.repoRoot });\n if (res.exitCode === -1) {\n throw new Error(res.stderr || 'ripgrep (rg) execution failed.');\n }\n const files = (res.stdout || '')\n .trim()\n .split(/\\r?\\n/)\n .filter((l) => l.length > 0);\n return { files };\n }\n\n async read(params: { path: string; start?: number; end?: number }): Promise<ReadResult> {\n const abs = resolveUnderRepo(this.repoRoot, params.path);\n const stat = await fs.stat(abs).catch(() => null);\n if (!stat || !stat.isFile()) {\n throw new Error(`Path is not a file: ${params.path}`);\n }\n if (isSymlink(abs)) {\n throw new Error(`Refusing to read symlink: ${params.path}`);\n }\n if (!isTextualFile(abs)) {\n throw new Error(`Non-text or too-large file: ${params.path}`);\n }\n const lines = await readAllLines(abs);\n const total = lines.length;\n let s = params.start ?? 1;\n let e = Math.min(params.end ?? total, total);\n if (s > total && total > 0) {\n // Model hallucinated range - fallback to full file\n s = 1;\n e = total;\n }\n const out: string[] = [];\n for (let i = s; i <= e; i += 1) {\n const content = lines[i - 1] ?? '';\n out.push(`${i}|${content}`);\n }\n return { lines: out };\n }\n\n async analyse(params: { path: string; pattern?: string | null; maxResults?: number; maxDepth?: number }): Promise<AnalyseEntry[]> {\n const abs = resolveUnderRepo(this.repoRoot, params.path);\n const stat = await fs.stat(abs).catch(() => null);\n if (!stat || !stat.isDirectory()) {\n return [];\n }\n const maxResults = params.maxResults ?? 100;\n const maxDepth = params.maxDepth ?? 2;\n const regex = params.pattern ? new RegExp(params.pattern) : null;\n\n const results: AnalyseEntry[] = [];\n async function walk(dir: string, depth: number) {\n if (depth > maxDepth || results.length >= maxResults) return;\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n const rel = toRepoRelative(abs, full).replace(/^[.][/\\\\]?/, '');\n if (DEFAULT_EXCLUDES.some((ex) => rel.split(path.sep).includes(ex))) continue;\n if (regex && !regex.test(entry.name)) continue;\n if (results.length >= maxResults) break;\n results.push({\n name: entry.name,\n path: toRepoRelative(path.resolve(''), full), // relative display\n type: entry.isDirectory() ? 'dir' : 'file',\n depth,\n });\n if (entry.isDirectory()) {\n await walk(full, depth + 1);\n }\n }\n }\n await walk(abs, 0);\n return results;\n }\n}\n\n\n"],"mappings":"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","names":[]}
@@ -1,11 +1,9 @@
1
1
  import {
2
- formatAgentToolOutput
3
- } from "./chunk-TICMYDII.js";
2
+ readFinishFiles
3
+ } from "./chunk-EK7OQPWD.js";
4
4
  import {
5
- GrepState,
6
- formatTurnGrepOutput,
7
- parseAndFilterGrepOutput
8
- } from "./chunk-NDZO5IPV.js";
5
+ toolRead
6
+ } from "./chunk-Z2FBMSNE.js";
9
7
  import {
10
8
  LLMResponseParser
11
9
  } from "./chunk-SWQPIKPY.js";
@@ -13,18 +11,20 @@ import {
13
11
  getSystemPrompt
14
12
  } from "./chunk-WETRQJGU.js";
15
13
  import {
16
- toolRead
17
- } from "./chunk-Z2FBMSNE.js";
14
+ toolAnalyse
15
+ } from "./chunk-73RQWOQC.js";
18
16
  import {
19
17
  AGENT_CONFIG,
20
18
  DEFAULT_MODEL
21
19
  } from "./chunk-TJIUA27P.js";
22
20
  import {
23
- toolAnalyse
24
- } from "./chunk-73RQWOQC.js";
21
+ formatAgentToolOutput
22
+ } from "./chunk-TICMYDII.js";
25
23
  import {
26
- readFinishFiles
27
- } from "./chunk-EK7OQPWD.js";
24
+ GrepState,
25
+ formatTurnGrepOutput,
26
+ parseAndFilterGrepOutput
27
+ } from "./chunk-NDZO5IPV.js";
28
28
  import {
29
29
  fetchWithRetry,
30
30
  withTimeout
@@ -218,4 +218,4 @@ async function runWarpGrep(config) {
218
218
  export {
219
219
  runWarpGrep
220
220
  };
221
- //# sourceMappingURL=chunk-FGRMMG62.js.map
221
+ //# sourceMappingURL=chunk-NRWVMX4O.js.map
package/dist/client.cjs CHANGED
@@ -1886,10 +1886,11 @@ var LocalRipgrepProvider = class {
1886
1886
  }
1887
1887
  const lines = await readAllLines(abs);
1888
1888
  const total = lines.length;
1889
- const s = params.start ?? 1;
1890
- const e = Math.min(params.end ?? total, total);
1889
+ let s = params.start ?? 1;
1890
+ let e = Math.min(params.end ?? total, total);
1891
1891
  if (s > total && total > 0) {
1892
- throw new Error(`start ${s} exceeds file length (${total})`);
1892
+ s = 1;
1893
+ e = total;
1893
1894
  }
1894
1895
  const out = [];
1895
1896
  for (let i = s; i <= e; i += 1) {