@morphllm/morphsdk 0.2.102 → 0.2.104

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 (110) hide show
  1. package/README.md +146 -1
  2. package/dist/chunk-2MAUPERG.js +129 -0
  3. package/dist/chunk-2MAUPERG.js.map +1 -0
  4. package/dist/{chunk-QH4BSXOD.js → chunk-4CZPXV6R.js} +8 -7
  5. package/dist/chunk-4CZPXV6R.js.map +1 -0
  6. package/dist/{chunk-AIXF4GQC.js → chunk-AFLEE2PO.js} +2 -2
  7. package/dist/{chunk-CP4NZGRY.js → chunk-EMMSRY32.js} +3 -3
  8. package/dist/chunk-EMMSRY32.js.map +1 -0
  9. package/dist/{chunk-QZNGKOCZ.js → chunk-HDRLLCAD.js} +4 -4
  10. package/dist/{chunk-BKIM7SNY.js → chunk-I3IN742Q.js} +4 -4
  11. package/dist/{chunk-7UYDS6OX.js → chunk-KQP6ZPYB.js} +4 -4
  12. package/dist/{chunk-OTPYEYMZ.js → chunk-MY4OU4ON.js} +2 -2
  13. package/dist/{chunk-UBX7QYBD.js → chunk-O5DA5V5S.js} +4 -4
  14. package/dist/{chunk-GJU7UOFL.js → chunk-OUEJ6XEO.js} +4 -4
  15. package/dist/{chunk-L5WXPMCH.js → chunk-QUIGATZE.js} +2 -2
  16. package/dist/chunk-TLC3QKE6.js +114 -0
  17. package/dist/chunk-TLC3QKE6.js.map +1 -0
  18. package/dist/{chunk-4J6NACK2.js → chunk-Y2OTK5WC.js} +15 -15
  19. package/dist/{chunk-4KMBU6T3.js → chunk-YJZP5ZL5.js} +4 -4
  20. package/dist/{chunk-76DJEQEP.js → chunk-ZRLEAPZV.js} +4 -4
  21. package/dist/{chunk-BGEEES52.js → chunk-ZROQPUCQ.js} +7 -7
  22. package/dist/client.cjs +2922 -2840
  23. package/dist/client.cjs.map +1 -1
  24. package/dist/client.d.ts +1 -0
  25. package/dist/client.js +18 -21
  26. package/dist/edge.cjs +437 -0
  27. package/dist/edge.cjs.map +1 -0
  28. package/dist/edge.d.ts +5 -0
  29. package/dist/edge.js +25 -0
  30. package/dist/edge.js.map +1 -0
  31. package/dist/index.cjs +1981 -1888
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.ts +2 -1
  34. package/dist/index.js +28 -26
  35. package/dist/modelrouter/core.cjs +2 -2
  36. package/dist/modelrouter/core.cjs.map +1 -1
  37. package/dist/modelrouter/core.js +1 -1
  38. package/dist/modelrouter/index.cjs +2 -2
  39. package/dist/modelrouter/index.cjs.map +1 -1
  40. package/dist/modelrouter/index.js +1 -1
  41. package/dist/tools/browser/index.js +3 -3
  42. package/dist/tools/codebase_search/anthropic.js +2 -2
  43. package/dist/tools/codebase_search/index.js +6 -6
  44. package/dist/tools/codebase_search/openai.js +2 -2
  45. package/dist/tools/codebase_search/vercel.js +2 -2
  46. package/dist/tools/fastapply/anthropic.cjs +109 -40
  47. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  48. package/dist/tools/fastapply/anthropic.js +3 -2
  49. package/dist/tools/fastapply/apply.cjs +227 -0
  50. package/dist/tools/fastapply/apply.cjs.map +1 -0
  51. package/dist/tools/fastapply/apply.d.ts +59 -0
  52. package/dist/tools/fastapply/apply.js +15 -0
  53. package/dist/tools/fastapply/apply.js.map +1 -0
  54. package/dist/tools/fastapply/core.cjs +156 -116
  55. package/dist/tools/fastapply/core.cjs.map +1 -1
  56. package/dist/tools/fastapply/core.d.ts +5 -41
  57. package/dist/tools/fastapply/core.js +6 -2
  58. package/dist/tools/fastapply/index.cjs +113 -76
  59. package/dist/tools/fastapply/index.cjs.map +1 -1
  60. package/dist/tools/fastapply/index.d.ts +2 -1
  61. package/dist/tools/fastapply/index.js +11 -9
  62. package/dist/tools/fastapply/openai.cjs +110 -41
  63. package/dist/tools/fastapply/openai.cjs.map +1 -1
  64. package/dist/tools/fastapply/openai.js +3 -2
  65. package/dist/tools/fastapply/vercel.cjs +110 -41
  66. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  67. package/dist/tools/fastapply/vercel.js +3 -2
  68. package/dist/tools/index.cjs +113 -76
  69. package/dist/tools/index.cjs.map +1 -1
  70. package/dist/tools/index.d.ts +2 -1
  71. package/dist/tools/index.js +11 -9
  72. package/dist/tools/warp_grep/agent/runner.js +3 -3
  73. package/dist/tools/warp_grep/anthropic.cjs +549 -500
  74. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  75. package/dist/tools/warp_grep/anthropic.js +5 -9
  76. package/dist/tools/warp_grep/client.cjs +550 -501
  77. package/dist/tools/warp_grep/client.cjs.map +1 -1
  78. package/dist/tools/warp_grep/client.js +4 -8
  79. package/dist/tools/warp_grep/gemini.cjs +549 -500
  80. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  81. package/dist/tools/warp_grep/gemini.js +4 -8
  82. package/dist/tools/warp_grep/gemini.js.map +1 -1
  83. package/dist/tools/warp_grep/harness.js +12 -12
  84. package/dist/tools/warp_grep/index.cjs +559 -501
  85. package/dist/tools/warp_grep/index.cjs.map +1 -1
  86. package/dist/tools/warp_grep/index.js +12 -12
  87. package/dist/tools/warp_grep/openai.cjs +549 -500
  88. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  89. package/dist/tools/warp_grep/openai.js +5 -9
  90. package/dist/tools/warp_grep/providers/local.js +2 -2
  91. package/dist/tools/warp_grep/vercel.cjs +549 -500
  92. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  93. package/dist/tools/warp_grep/vercel.js +5 -9
  94. package/package.json +7 -2
  95. package/dist/chunk-CKTA4AXM.js +0 -233
  96. package/dist/chunk-CKTA4AXM.js.map +0 -1
  97. package/dist/chunk-CP4NZGRY.js.map +0 -1
  98. package/dist/chunk-QH4BSXOD.js.map +0 -1
  99. /package/dist/{chunk-AIXF4GQC.js.map → chunk-AFLEE2PO.js.map} +0 -0
  100. /package/dist/{chunk-QZNGKOCZ.js.map → chunk-HDRLLCAD.js.map} +0 -0
  101. /package/dist/{chunk-BKIM7SNY.js.map → chunk-I3IN742Q.js.map} +0 -0
  102. /package/dist/{chunk-7UYDS6OX.js.map → chunk-KQP6ZPYB.js.map} +0 -0
  103. /package/dist/{chunk-OTPYEYMZ.js.map → chunk-MY4OU4ON.js.map} +0 -0
  104. /package/dist/{chunk-UBX7QYBD.js.map → chunk-O5DA5V5S.js.map} +0 -0
  105. /package/dist/{chunk-GJU7UOFL.js.map → chunk-OUEJ6XEO.js.map} +0 -0
  106. /package/dist/{chunk-L5WXPMCH.js.map → chunk-QUIGATZE.js.map} +0 -0
  107. /package/dist/{chunk-4J6NACK2.js.map → chunk-Y2OTK5WC.js.map} +0 -0
  108. /package/dist/{chunk-4KMBU6T3.js.map → chunk-YJZP5ZL5.js.map} +0 -0
  109. /package/dist/{chunk-76DJEQEP.js.map → chunk-ZRLEAPZV.js.map} +0 -0
  110. /package/dist/{chunk-BGEEES52.js.map → chunk-ZROQPUCQ.js.map} +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Morph SDK
2
2
 
3
- Production-ready tools for AI coding agents: WarpGrep (intelligent code search), Fast Apply (10,500 tokens/s), and Repo Storage.
3
+ Production-ready tools for AI coding agents: WarpGrep (intelligent code search), Fast Apply (10,500 tokens/s), GitHub integration, and Browser automation.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@morphllm/morphsdk.svg)](https://www.npmjs.com/package/@morphllm/morphsdk)
6
6
 
@@ -20,6 +20,8 @@ export MORPH_API_KEY="sk-your-key-here"
20
20
 
21
21
  - **🔍 WarpGrep** - Intelligent code search agent that explores your codebase with parallel grep/read operations
22
22
  - **⚡ Fast Apply** - 98% 1st pass accuracy, AI-powered code editing at 10,500 tokens/s
23
+ - **🐙 GitHub** - Access PR context, post comments, manage check runs through your connected GitHub account
24
+ - **🌐 Browser** - AI-powered browser automation for testing and interaction
23
25
  - **📦 Repo Storage** - Agent native git with automatic code indexing and agent metadata
24
26
  - **🤖 Agent Tools** - Ready-to-use tools for Anthropic, OpenAI, Gemini, and Vercel AI SDK
25
27
 
@@ -78,6 +80,147 @@ const tool = createWarpGrepTool({
78
80
  });
79
81
  ```
80
82
 
83
+ ## GitHub Integration
84
+
85
+ Access your GitHub repositories, pull requests, and deployments through your connected Morph account.
86
+
87
+ ### Setup
88
+
89
+ Connect your GitHub account in the [Morph Dashboard](https://morphllm.com/dashboard/integrations/github), then use the SDK:
90
+
91
+ ```typescript
92
+ import { MorphClient } from '@morphllm/morphsdk';
93
+
94
+ const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
95
+
96
+ // List your GitHub installations
97
+ const installations = await morph.github.installations.list();
98
+ console.log(installations);
99
+ // [{ id: "12345", accountLogin: "acme", accountType: "Organization" }]
100
+ ```
101
+
102
+ ### List Repositories
103
+
104
+ ```typescript
105
+ // List repos for an installation
106
+ const repos = await morph.github.repos.list({
107
+ installationId: "12345"
108
+ });
109
+ // [{ id: 123, name: "app", fullName: "acme/app", private: true }]
110
+ ```
111
+
112
+ ### Get Pull Request Context
113
+
114
+ ```typescript
115
+ // Get PR with full context (title, body, diff, files)
116
+ const pr = await morph.github.pullRequests.get({
117
+ owner: "acme",
118
+ repo: "app",
119
+ number: 42
120
+ });
121
+
122
+ console.log(pr.title); // "Add user authentication"
123
+ console.log(pr.diff); // Full unified diff
124
+ console.log(pr.files); // [{ filename, status, additions, deletions, patch }]
125
+ ```
126
+
127
+ ### Find Preview Deployments
128
+
129
+ ```typescript
130
+ // Get deployments for a PR's head SHA
131
+ const deployments = await morph.github.deployments.list({
132
+ owner: "acme",
133
+ repo: "app",
134
+ sha: pr.headSha
135
+ });
136
+
137
+ const preview = deployments.find(d => d.environment === "preview");
138
+ console.log(preview?.url); // "https://app-pr-42.vercel.app"
139
+ ```
140
+
141
+ ### Post PR Comments
142
+
143
+ ```typescript
144
+ // Post a comment to a PR
145
+ const comment = await morph.github.comments.create({
146
+ owner: "acme",
147
+ repo: "app",
148
+ pr: 42,
149
+ body: "## Test Results\n\n✅ All tests passed!"
150
+ });
151
+
152
+ // Update the comment
153
+ await morph.github.comments.update({
154
+ owner: "acme",
155
+ repo: "app",
156
+ commentId: comment.id,
157
+ body: "## Test Results\n\n✅ All tests passed!\n\nUpdated at: " + new Date()
158
+ });
159
+ ```
160
+
161
+ ### Manage Check Runs (CI Status)
162
+
163
+ ```typescript
164
+ // Create a check run
165
+ const checkRun = await morph.github.checkRuns.create({
166
+ owner: "acme",
167
+ repo: "app",
168
+ sha: pr.headSha,
169
+ name: "Preview Test",
170
+ status: "in_progress",
171
+ title: "Testing preview deployment...",
172
+ summary: "Running automated browser tests"
173
+ });
174
+
175
+ // Update with results
176
+ await morph.github.checkRuns.update({
177
+ owner: "acme",
178
+ repo: "app",
179
+ checkRunId: checkRun.id,
180
+ conclusion: "success",
181
+ title: "✅ Preview test passed",
182
+ summary: "All tests completed successfully"
183
+ });
184
+ ```
185
+
186
+ ### Full Example: PR Preview Testing
187
+
188
+ ```typescript
189
+ import { MorphClient } from '@morphllm/morphsdk';
190
+
191
+ const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
192
+
193
+ async function testPRPreview(owner: string, repo: string, prNumber: number) {
194
+ // 1. Get PR context
195
+ const pr = await morph.github.pullRequests.get({ owner, repo, number: prNumber });
196
+
197
+ // 2. Find preview deployment
198
+ const deployments = await morph.github.deployments.list({ owner, repo, sha: pr.headSha });
199
+ const preview = deployments.find(d => d.state === "success" && d.url);
200
+
201
+ if (!preview) {
202
+ console.log("No preview deployment found");
203
+ return;
204
+ }
205
+
206
+ // 3. Run browser test with PR context
207
+ const task = await morph.browser.createTask({
208
+ url: preview.url,
209
+ diff: pr.diff,
210
+ task: "Test the changes in this PR"
211
+ });
212
+
213
+ // 4. Wait for results
214
+ const recording = await morph.browser.waitForRecording(task.recordingId);
215
+
216
+ // 5. Post results to PR
217
+ await morph.github.comments.create({
218
+ owner, repo, pr: prNumber,
219
+ body: `## 🤖 Preview Test Results\n\n${recording.result || "Test completed"}`
220
+ });
221
+ }
222
+ ```
223
+
81
224
  ## Fast Apply
82
225
 
83
226
  AI-powered code editing at 10,500 tokens/s with 98% first-pass accuracy.
@@ -160,4 +303,6 @@ Full docs: [docs.morphllm.com](https://docs.morphllm.com)
160
303
  **Key Pages:**
161
304
  - [WarpGrep](https://docs.morphllm.com/sdk/components/warp-grep) - Intelligent code search
162
305
  - [Fast Apply](https://docs.morphllm.com/sdk/components/fast-apply) - AI-powered code editing
306
+ - [GitHub](https://docs.morphllm.com/sdk/components/github) - GitHub integration for PR context and automation
307
+ - [Browser](https://docs.morphllm.com/sdk/components/browser) - AI-powered browser automation
163
308
  - [Repo Storage](https://docs.morphllm.com/sdk/components/git) - Git operations and agent metadata
@@ -0,0 +1,129 @@
1
+ import {
2
+ fetchWithRetry,
3
+ withTimeout
4
+ } from "./chunk-4VWJFZVS.js";
5
+
6
+ // tools/fastapply/apply.ts
7
+ import { createTwoFilesPatch } from "diff";
8
+ var DEFAULT_API_URL = "https://api.morphllm.com";
9
+ var DEFAULT_TIMEOUT = 3e4;
10
+ function generateUdiff(original, modified, filepath) {
11
+ return createTwoFilesPatch(
12
+ filepath,
13
+ filepath,
14
+ original,
15
+ modified,
16
+ "Original",
17
+ "Modified"
18
+ );
19
+ }
20
+ function countChanges(original, modified) {
21
+ const diff = generateUdiff(original, modified, "file");
22
+ const lines = diff.split("\n");
23
+ let linesAdded = 0;
24
+ let linesRemoved = 0;
25
+ for (const line of lines) {
26
+ if (line.startsWith("+") && !line.startsWith("+++")) {
27
+ linesAdded++;
28
+ } else if (line.startsWith("-") && !line.startsWith("---")) {
29
+ linesRemoved++;
30
+ }
31
+ }
32
+ const linesModified = Math.min(linesAdded, linesRemoved);
33
+ return {
34
+ linesAdded: linesAdded - linesModified,
35
+ linesRemoved: linesRemoved - linesModified,
36
+ linesModified
37
+ };
38
+ }
39
+ async function callMorphAPI(originalCode, codeEdit, instructions, filepath, config) {
40
+ const apiKey = config.morphApiKey || (typeof process !== "undefined" ? process.env?.MORPH_API_KEY : void 0);
41
+ const apiUrl = config.morphApiUrl || DEFAULT_API_URL;
42
+ const timeout = config.timeout || DEFAULT_TIMEOUT;
43
+ const debug = config.debug || false;
44
+ if (!apiKey) {
45
+ throw new Error(
46
+ "Morph API key not found. Set MORPH_API_KEY environment variable or pass morphApiKey in config."
47
+ );
48
+ }
49
+ const message = `<instruction>${instructions}</instruction>
50
+ <code>${originalCode}</code>
51
+ <update>${codeEdit}</update>`;
52
+ if (debug) {
53
+ console.log(`[FastApply] Calling ${apiUrl}/v1/chat/completions`);
54
+ console.log(`[FastApply] File: ${filepath}, Instructions: ${instructions.slice(0, 60)}...`);
55
+ console.log(`[FastApply] Original: ${originalCode.length} chars, Edit: ${codeEdit.length} chars`);
56
+ }
57
+ const startTime = Date.now();
58
+ const fetchPromise = fetchWithRetry(
59
+ `${apiUrl}/v1/chat/completions`,
60
+ {
61
+ method: "POST",
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ "Authorization": `Bearer ${apiKey}`
65
+ },
66
+ body: JSON.stringify({
67
+ model: "morph-v3-fast",
68
+ messages: [{ role: "user", content: message }]
69
+ })
70
+ },
71
+ config.retryConfig
72
+ );
73
+ const response = await withTimeout(
74
+ fetchPromise,
75
+ timeout,
76
+ `Morph API request timed out after ${timeout}ms`
77
+ );
78
+ if (!response.ok) {
79
+ const error = await response.text();
80
+ if (debug) console.error(`[FastApply] API error: ${response.status} - ${error}`);
81
+ throw new Error(`Morph API error (${response.status}): ${error}`);
82
+ }
83
+ const data = await response.json();
84
+ const elapsed = Date.now() - startTime;
85
+ if (debug) {
86
+ console.log(`[FastApply] \u2705 Success in ${elapsed}ms, merged: ${data.choices[0].message.content.length} chars`);
87
+ }
88
+ return data.choices[0].message.content;
89
+ }
90
+ async function applyEdit(input, config = {}) {
91
+ const debug = config.debug || false;
92
+ const filepath = input.filepath || "file";
93
+ try {
94
+ if (debug) {
95
+ console.log(`[FastApply] Applying edit to code (${input.originalCode.length} chars)`);
96
+ }
97
+ const mergedCode = await callMorphAPI(
98
+ input.originalCode,
99
+ input.codeEdit,
100
+ input.instructions,
101
+ filepath,
102
+ config
103
+ );
104
+ const udiff = config.generateUdiff !== false ? generateUdiff(input.originalCode, mergedCode, filepath) : void 0;
105
+ const changes = countChanges(input.originalCode, mergedCode);
106
+ return {
107
+ success: true,
108
+ mergedCode,
109
+ udiff,
110
+ changes
111
+ };
112
+ } catch (error) {
113
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
114
+ if (debug) console.error(`[FastApply] Error: ${errorMessage}`);
115
+ return {
116
+ success: false,
117
+ changes: { linesAdded: 0, linesRemoved: 0, linesModified: 0 },
118
+ error: errorMessage
119
+ };
120
+ }
121
+ }
122
+
123
+ export {
124
+ generateUdiff,
125
+ countChanges,
126
+ callMorphAPI,
127
+ applyEdit
128
+ };
129
+ //# sourceMappingURL=chunk-2MAUPERG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/fastapply/apply.ts"],"sourcesContent":["/**\n * Edge-compatible code application API\n *\n * This module has zero Node.js dependencies and works on:\n * - Cloudflare Workers\n * - Vercel Edge Functions\n * - Deno Deploy\n * - Browser environments\n *\n * For file-based operations, use executeEditFile from core.ts\n */\n\nimport { createTwoFilesPatch } from 'diff';\nimport { fetchWithRetry, withTimeout } from '../utils/resilience.js';\nimport type {\n EditChanges,\n MorphApplyResponse,\n ApplyEditInput,\n ApplyEditResult,\n ApplyEditConfig,\n} from './types.js';\n\nconst DEFAULT_API_URL = 'https://api.morphllm.com';\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Generate a unified diff between two strings\n */\nexport function generateUdiff(\n original: string,\n modified: string,\n filepath: string\n): string {\n return createTwoFilesPatch(\n filepath,\n filepath,\n original,\n modified,\n 'Original',\n 'Modified'\n );\n}\n\n/**\n * Count changes from a unified diff\n */\nexport function countChanges(original: string, modified: string): EditChanges {\n const diff = generateUdiff(original, modified, 'file');\n const lines = diff.split('\\n');\n\n let linesAdded = 0;\n let linesRemoved = 0;\n\n for (const line of lines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n linesAdded++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n linesRemoved++;\n }\n }\n\n const linesModified = Math.min(linesAdded, linesRemoved);\n\n return {\n linesAdded: linesAdded - linesModified,\n linesRemoved: linesRemoved - linesModified,\n linesModified,\n };\n}\n\n/**\n * Call Morph Apply API to merge code edits\n * Uses OpenAI-compatible chat completions endpoint with XML-formatted message\n */\nexport async function callMorphAPI(\n originalCode: string,\n codeEdit: string,\n instructions: string,\n filepath: string,\n config: ApplyEditConfig\n): Promise<string> {\n const apiKey = config.morphApiKey || (typeof process !== 'undefined' ? process.env?.MORPH_API_KEY : undefined);\n const apiUrl = config.morphApiUrl || DEFAULT_API_URL;\n const timeout = config.timeout || DEFAULT_TIMEOUT;\n const debug = config.debug || false;\n\n if (!apiKey) {\n throw new Error(\n 'Morph API key not found. Set MORPH_API_KEY environment variable or pass morphApiKey in config.'\n );\n }\n\n // Format message with XML tags as per Morph Fast Apply spec\n const message = `<instruction>${instructions}</instruction>\\n<code>${originalCode}</code>\\n<update>${codeEdit}</update>`;\n\n if (debug) {\n console.log(`[FastApply] Calling ${apiUrl}/v1/chat/completions`);\n console.log(`[FastApply] File: ${filepath}, Instructions: ${instructions.slice(0, 60)}...`);\n console.log(`[FastApply] Original: ${originalCode.length} chars, Edit: ${codeEdit.length} chars`);\n }\n\n const startTime = Date.now();\n\n // Fetch with retry and timeout\n const fetchPromise = fetchWithRetry(\n `${apiUrl}/v1/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: 'morph-v3-fast',\n messages: [{ role: 'user', content: message }],\n }),\n },\n config.retryConfig\n );\n\n const response = await withTimeout(\n fetchPromise,\n timeout,\n `Morph API request timed out after ${timeout}ms`\n );\n\n if (!response.ok) {\n const error = await response.text();\n if (debug) console.error(`[FastApply] API error: ${response.status} - ${error}`);\n throw new Error(`Morph API error (${response.status}): ${error}`);\n }\n\n const data: MorphApplyResponse = await response.json();\n const elapsed = Date.now() - startTime;\n\n if (debug) {\n console.log(`[FastApply] ✅ Success in ${elapsed}ms, merged: ${data.choices[0].message.content.length} chars`);\n }\n\n return data.choices[0].message.content;\n}\n\n/**\n * Apply an edit to code directly without file I/O\n *\n * This is the edge-compatible code-in/code-out API that accepts code content directly\n * and returns the merged result without reading or writing any files.\n *\n * Works on Cloudflare Workers, Vercel Edge Functions, Deno, and browsers.\n *\n * @param input - Code and edit parameters\n * @param config - Optional configuration\n * @returns Result with merged code\n *\n * @example\n * ```typescript\n * import { applyEdit } from '@morphllm/morphsdk';\n *\n * const result = await applyEdit({\n * originalCode: fs.readFileSync('file.ts', 'utf-8'),\n * codeEdit: '// ... existing code ...\\nconst newVar = 42;\\n// ... existing code ...',\n * instructions: 'Add a new variable',\n * filepath: 'file.ts' // optional, for udiff context\n * });\n *\n * if (result.success) {\n * fs.writeFileSync('file.ts', result.mergedCode);\n * }\n * ```\n */\nexport async function applyEdit(\n input: ApplyEditInput,\n config: ApplyEditConfig = {}\n): Promise<ApplyEditResult> {\n const debug = config.debug || false;\n const filepath = input.filepath || 'file';\n\n try {\n if (debug) {\n console.log(`[FastApply] Applying edit to code (${input.originalCode.length} chars)`);\n }\n\n const mergedCode = await callMorphAPI(\n input.originalCode,\n input.codeEdit,\n input.instructions,\n filepath,\n config\n );\n\n const udiff = config.generateUdiff !== false\n ? generateUdiff(input.originalCode, mergedCode, filepath)\n : undefined;\n\n const changes = countChanges(input.originalCode, mergedCode);\n\n return {\n success: true,\n mergedCode,\n udiff,\n changes,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n if (debug) console.error(`[FastApply] Error: ${errorMessage}`);\n\n return {\n success: false,\n changes: { linesAdded: 0, linesRemoved: 0, linesModified: 0 },\n error: errorMessage,\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,15 +1,16 @@
1
1
  import {
2
2
  runWarpGrep,
3
3
  runWarpGrepStreaming
4
- } from "./chunk-BGEEES52.js";
4
+ } from "./chunk-ZROQPUCQ.js";
5
5
  import {
6
6
  RemoteCommandsProvider
7
7
  } from "./chunk-PUGSTXLO.js";
8
- import {
9
- LocalRipgrepProvider
10
- } from "./chunk-4KMBU6T3.js";
11
8
 
12
9
  // tools/warp_grep/client.ts
10
+ async function getLocalProvider(repoRoot, excludes) {
11
+ const { LocalRipgrepProvider } = await import("./tools/warp_grep/providers/local.js");
12
+ return new LocalRipgrepProvider(repoRoot, excludes);
13
+ }
13
14
  var WarpGrepClient = class {
14
15
  config;
15
16
  constructor(config = {}) {
@@ -49,7 +50,7 @@ function executeWarpGrep(input, config) {
49
50
  }
50
51
  async function executeToolCall(input, config) {
51
52
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
52
- const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
53
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
53
54
  const result = await runWarpGrep({
54
55
  query: parsed.query,
55
56
  repoRoot: config.repoRoot,
@@ -85,7 +86,7 @@ function processAgentResult(result) {
85
86
  }
86
87
  async function* executeToolCallStreaming(input, config) {
87
88
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
88
- const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
89
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
89
90
  const generator = runWarpGrepStreaming({
90
91
  query: parsed.query,
91
92
  repoRoot: config.repoRoot,
@@ -138,4 +139,4 @@ export {
138
139
  executeToolCall,
139
140
  formatResult
140
141
  };
141
- //# sourceMappingURL=chunk-QH4BSXOD.js.map
142
+ //# sourceMappingURL=chunk-4CZPXV6R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/warp_grep/client.ts"],"sourcesContent":["/**\n * WarpGrep client for programmatic code search\n */\n\nimport { runWarpGrep, runWarpGrepStreaming } from './agent/runner.js';\nimport { RemoteCommandsProvider } from './providers/remote.js';\nimport type { WarpGrepProvider } from './providers/types.js';\nimport type { AgentRunResult, WarpGrepStep } from './agent/types.js';\nimport type {\n WarpGrepClientConfig,\n WarpGrepInput,\n WarpGrepResult,\n WarpGrepContext,\n WarpGrepToolConfig,\n} from './types.js';\n\n/**\n * Lazy-load LocalRipgrepProvider to avoid importing Node.js-specific\n * modules (child_process, fs) in edge environments like Cloudflare Workers.\n * Only loads when actually needed (i.e., when no remoteCommands or provider is specified).\n */\nasync function getLocalProvider(repoRoot: string, excludes?: string[]): Promise<WarpGrepProvider> {\n const { LocalRipgrepProvider } = await import('./providers/local.js');\n return new LocalRipgrepProvider(repoRoot, excludes);\n}\n\n/**\n * WarpGrep client for programmatic code search\n * \n * @example\n * ```typescript\n * import { WarpGrepClient } from '@morphllm/morphsdk';\n * \n * const client = new WarpGrepClient({ morphApiKey: process.env.MORPH_API_KEY });\n * \n * // Simple usage - defaults to LocalRipgrepProvider\n * const result = await client.execute({\n * query: 'Find authentication middleware',\n * repoRoot: '.'\n * });\n * \n * // With custom excludes\n * const result = await client.execute({\n * query: 'Find database models',\n * repoRoot: '.',\n * excludes: ['node_modules', '.git', 'dist']\n * });\n * ```\n */\nexport class WarpGrepClient {\n private config: WarpGrepClientConfig;\n\n constructor(config: WarpGrepClientConfig = {}) {\n this.config = {\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n debug: config.debug,\n timeout: config.timeout,\n retryConfig: config.retryConfig,\n };\n }\n\n /**\n * Execute a code search query\n *\n * @param input - Search parameters including query, repoRoot, and optional provider\n * @returns Search results with relevant code contexts, or an AsyncGenerator if streamSteps is true\n *\n * @example\n * ```typescript\n * // Standard execution\n * const result = await client.execute({\n * query: 'Find authentication middleware',\n * repoRoot: '.'\n * });\n *\n * if (result.success) {\n * for (const ctx of result.contexts) {\n * console.log(`File: ${ctx.file}`);\n * console.log(ctx.content);\n * }\n * }\n *\n * // Streaming execution\n * const stream = client.execute({\n * query: 'Find auth middleware',\n * repoRoot: '.',\n * streamSteps: true\n * });\n *\n * for await (const step of stream) {\n * console.log(`Turn ${step.turn}:`, step.toolCalls);\n * }\n * ```\n */\n execute(input: WarpGrepInput & { streamSteps: true }): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\n execute(input: WarpGrepInput & { streamSteps?: false | undefined }): Promise<WarpGrepResult>;\n execute(input: WarpGrepInput): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n const toolConfig: WarpGrepToolConfig = {\n repoRoot: input.repoRoot,\n remoteCommands: input.remoteCommands,\n provider: input.provider,\n excludes: input.excludes,\n includes: input.includes,\n debug: input.debug ?? this.config.debug,\n morphApiKey: this.config.morphApiKey,\n morphApiUrl: this.config.morphApiUrl,\n retryConfig: this.config.retryConfig,\n timeout: this.config.timeout,\n };\n\n if (input.streamSteps) {\n return executeToolCallStreaming({ query: input.query }, toolConfig);\n }\n return executeToolCall({ query: input.query }, toolConfig);\n }\n}\n\n/**\n * Execute a warp grep search directly\n *\n * @param input - Search parameters\n * @param config - Optional client configuration\n * @returns Search results, or an AsyncGenerator if streamSteps is true\n *\n * @example\n * ```typescript\n * import { executeWarpGrep } from '@morphllm/morphsdk/tools/warp-grep';\n *\n * const result = await executeWarpGrep({\n * query: 'Find authentication middleware',\n * repoRoot: '.'\n * });\n *\n * // Streaming\n * const stream = executeWarpGrep({\n * query: 'Find auth',\n * repoRoot: '.',\n * streamSteps: true\n * });\n * for await (const step of stream) {\n * console.log(step.turn, step.toolCalls);\n * }\n * ```\n */\nexport function executeWarpGrep(\n input: WarpGrepInput & { streamSteps: true },\n config?: WarpGrepClientConfig\n): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\nexport function executeWarpGrep(\n input: WarpGrepInput & { streamSteps?: false | undefined },\n config?: WarpGrepClientConfig\n): Promise<WarpGrepResult>;\nexport function executeWarpGrep(\n input: WarpGrepInput,\n config?: WarpGrepClientConfig\n): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n const client = new WarpGrepClient(config);\n if (input.streamSteps) {\n return client.execute({ ...input, streamSteps: true });\n }\n return client.execute({ ...input, streamSteps: false });\n}\n\nexport async function executeToolCall(\n input: { query: string } | string,\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n\n // Priority: remoteCommands > provider > LocalRipgrepProvider (lazy-loaded for edge compatibility)\n const provider = config.remoteCommands\n ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);\n \n const result = await runWarpGrep({\n query: parsed.query,\n repoRoot: config.repoRoot,\n provider,\n excludes: config.excludes,\n includes: config.includes,\n debug: config.debug ?? false,\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: config.timeout,\n });\n\n const finish = result.finish;\n if (result.terminationReason !== 'completed' || !finish?.metadata) {\n return { success: false, error: 'Search did not complete' };\n }\n\n const contexts: WarpGrepContext[] = (finish.resolved ?? []).map(r => ({\n file: r.path,\n content: r.content,\n }));\n\n return { success: true, contexts, summary: finish.payload };\n}\n\n/**\n * Helper to process AgentRunResult into WarpGrepResult\n */\nfunction processAgentResult(result: AgentRunResult): WarpGrepResult {\n const finish = result.finish;\n if (result.terminationReason !== 'completed' || !finish?.metadata) {\n return { success: false, error: 'Search did not complete' };\n }\n\n const contexts: WarpGrepContext[] = (finish.resolved ?? []).map(r => ({\n file: r.path,\n content: r.content,\n }));\n\n return { success: true, contexts, summary: finish.payload };\n}\n\n/**\n * Streaming version of executeToolCall that yields WarpGrepStep for each turn.\n */\nasync function* executeToolCallStreaming(\n input: { query: string } | string,\n config: WarpGrepToolConfig\n): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n\n // Priority: remoteCommands > provider > LocalRipgrepProvider (lazy-loaded for edge compatibility)\n const provider = config.remoteCommands\n ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);\n\n const generator = runWarpGrepStreaming({\n query: parsed.query,\n repoRoot: config.repoRoot,\n provider,\n excludes: config.excludes,\n includes: config.includes,\n debug: config.debug ?? false,\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: config.timeout,\n });\n\n // Forward all yielded steps\n let agentResult: AgentRunResult;\n for (;;) {\n const { value, done } = await generator.next();\n if (done) {\n agentResult = value;\n break;\n }\n yield value;\n }\n\n return processAgentResult(agentResult);\n}\n\n/**\n * Format warp grep results for display or tool responses\n * \n * @param result - The search result\n * @returns Formatted string representation\n */\nexport function formatResult(result: WarpGrepResult): string {\n if (!result.success) {\n return `Search failed: ${result.error}`;\n }\n\n if (!result.contexts || result.contexts.length === 0) {\n return 'No relevant code found. Try rephrasing your query.';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${result.contexts.length} relevant code sections:\\n`);\n\n result.contexts.forEach((ctx, i) => {\n lines.push(`${i + 1}. ${ctx.file}`);\n lines.push('```');\n lines.push(ctx.content);\n lines.push('```');\n lines.push('');\n });\n\n if (result.summary) {\n lines.push(`Summary: ${result.summary}`);\n }\n\n return lines.join('\\n');\n}\n\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  executeToolCall,
7
7
  formatResult
8
- } from "./chunk-QH4BSXOD.js";
8
+ } from "./chunk-4CZPXV6R.js";
9
9
  import {
10
10
  getSystemPrompt
11
11
  } from "./chunk-FMLHRJDF.js";
@@ -50,4 +50,4 @@ export {
50
50
  execute,
51
51
  createWarpGrepTool
52
52
  };
53
- //# sourceMappingURL=chunk-AIXF4GQC.js.map
53
+ //# sourceMappingURL=chunk-AFLEE2PO.js.map
@@ -28,7 +28,7 @@ var BaseRouter = class {
28
28
  */
29
29
  async selectModel(input) {
30
30
  const mode = input.mode || "balanced";
31
- const apiKey = this.config.apiKey || process.env.MORPH_API_KEY;
31
+ const apiKey = this.config.apiKey || (typeof process !== "undefined" ? process.env?.MORPH_API_KEY : void 0);
32
32
  if (!apiKey) {
33
33
  throw new Error(
34
34
  "Morph API key is required. Set MORPH_API_KEY environment variable or pass apiKey in config."
@@ -139,7 +139,7 @@ var RawRouter = class extends BaseRouter {
139
139
  */
140
140
  async classify(input) {
141
141
  const mode = input.mode || "balanced";
142
- const apiKey = this.config.apiKey || process.env.MORPH_API_KEY;
142
+ const apiKey = this.config.apiKey || (typeof process !== "undefined" ? process.env?.MORPH_API_KEY : void 0);
143
143
  if (!apiKey) {
144
144
  throw new Error(
145
145
  "Morph API key is required. Set MORPH_API_KEY environment variable or pass apiKey in config."
@@ -209,4 +209,4 @@ export {
209
209
  GeminiRouter,
210
210
  RawRouter
211
211
  };
212
- //# sourceMappingURL=chunk-CP4NZGRY.js.map
212
+ //# sourceMappingURL=chunk-EMMSRY32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../modelrouter/core.ts"],"sourcesContent":["/**\n * Core implementation for intelligent model routing\n */\n\nimport { fetchWithRetry, withTimeout } from '../tools/utils/resilience.js';\nimport type {\n RouterConfig,\n RouterInput,\n RouterResult,\n RawRouterResult,\n ComplexityLevel,\n RouterMode,\n Provider,\n} from './types.js';\n\nconst DEFAULT_CONFIG = {\n apiUrl: 'https://api.morphllm.com',\n timeout: 5000, // 5 seconds (responses typically <500ms)\n debug: false,\n};\n\nabstract class BaseRouter {\n protected config: Required<Omit<RouterConfig, 'apiKey' | 'retryConfig'>> & Pick<RouterConfig, 'apiKey' | 'retryConfig'>;\n protected provider: Provider;\n\n constructor(provider: Provider, config: RouterConfig = {}) {\n this.provider = provider;\n this.config = {\n apiKey: config.apiKey,\n apiUrl: config.apiUrl || DEFAULT_CONFIG.apiUrl,\n timeout: config.timeout || DEFAULT_CONFIG.timeout,\n debug: config.debug || DEFAULT_CONFIG.debug,\n retryConfig: config.retryConfig,\n };\n }\n\n /**\n * Select the optimal model for a given input and mode\n */\n async selectModel(input: RouterInput): Promise<RouterResult> {\n const mode = input.mode || 'balanced';\n const apiKey = this.config.apiKey || (typeof process !== 'undefined' ? process.env?.MORPH_API_KEY : undefined);\n\n if (!apiKey) {\n throw new Error(\n 'Morph API key is required. Set MORPH_API_KEY environment variable or pass apiKey in config.'\n );\n }\n\n const url = `${this.config.apiUrl}/v1/router/${this.provider}`;\n const payload = {\n input: input.input,\n mode,\n };\n\n if (this.config.debug) {\n console.log(`[ModelRouter] Requesting ${this.provider} model selection:`, {\n mode,\n inputLength: input.input.length,\n });\n }\n\n try {\n const fetchPromise = fetchWithRetry(\n url,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n },\n this.config.retryConfig\n );\n\n const response = await withTimeout(\n fetchPromise,\n this.config.timeout,\n `Router API request timed out after ${this.config.timeout}ms`\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Router API error (${response.status}): ${errorText || response.statusText}`\n );\n }\n\n const apiResult: { model: string; confidence?: number } = await response.json();\n\n const result: RouterResult = {\n model: apiResult.model,\n };\n\n if (this.config.debug) {\n console.log(`[ModelRouter] Selected model: ${apiResult.model}, Confidence: ${apiResult.confidence?.toFixed(3)}`);\n }\n\n return result;\n } catch (error) {\n if (this.config.debug) {\n console.error(`[ModelRouter] Error selecting model:`, error);\n }\n throw error;\n }\n }\n}\n\n/**\n * OpenAI model router for GPT-5 series\n */\nexport class OpenAIRouter extends BaseRouter {\n constructor(config: RouterConfig = {}) {\n super('openai', config);\n }\n\n /**\n * Select optimal GPT-5 model\n * \n * @param input - User input and mode\n * @returns Selected model name (gpt-5-mini | gpt-5-low | gpt-5-medium | gpt-5-high)\n */\n async selectModel(input: RouterInput): Promise<RouterResult> {\n return super.selectModel(input);\n }\n}\n\n/**\n * Anthropic model router for Claude 4.5 series\n */\nexport class AnthropicRouter extends BaseRouter {\n constructor(config: RouterConfig = {}) {\n super('anthropic', config);\n }\n\n /**\n * Select optimal Claude model\n * \n * @param input - User input and mode\n * @returns Selected model name (claude-4.5-haiku | claude-4.5-sonnet)\n */\n async selectModel(input: RouterInput): Promise<RouterResult> {\n return super.selectModel(input);\n }\n}\n\n/**\n * Google Gemini model router\n */\nexport class GeminiRouter extends BaseRouter {\n constructor(config: RouterConfig = {}) {\n super('gemini', config);\n }\n\n /**\n * Select optimal Gemini model\n * \n * @param input - User input and mode\n * @returns Selected model name (gemini-2.5-flash | gemini-2.5-pro)\n */\n async selectModel(input: RouterInput): Promise<RouterResult> {\n return super.selectModel(input);\n }\n}\n\n/**\n * Raw difficulty classification router (no provider-specific mapping)\n */\nexport class RawRouter extends BaseRouter {\n constructor(config: RouterConfig = {}) {\n super('raw' as Provider, config);\n }\n\n /**\n * Get raw difficulty classification\n * \n * @param input - User input and mode\n * @returns Raw difficulty (easy | medium | hard | needs_info)\n */\n async classify(input: RouterInput): Promise<RawRouterResult> {\n const mode = input.mode || 'balanced';\n const apiKey = this.config.apiKey || (typeof process !== 'undefined' ? process.env?.MORPH_API_KEY : undefined);\n\n if (!apiKey) {\n throw new Error(\n 'Morph API key is required. Set MORPH_API_KEY environment variable or pass apiKey in config.'\n );\n }\n\n const url = `${this.config.apiUrl}/v1/router/raw`;\n const payload = {\n input: input.input,\n mode,\n };\n\n if (this.config.debug) {\n console.log(`[RawRouter] Requesting raw difficulty classification:`, {\n mode,\n inputLength: input.input.length,\n });\n }\n\n try {\n const fetchPromise = fetchWithRetry(\n url,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n },\n this.config.retryConfig\n );\n\n const response = await withTimeout(\n fetchPromise,\n this.config.timeout,\n `Router API request timed out after ${this.config.timeout}ms`\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Router API error (${response.status}): ${errorText || response.statusText}`\n );\n }\n\n const apiResult: { model?: string; difficulty?: string; confidence?: number } = await response.json();\n\n // Support both 'model' and 'difficulty' fields for compatibility\n // Empty string from API means \"medium\" difficulty (API bug workaround)\n let difficulty: ComplexityLevel;\n if (apiResult.difficulty === '') {\n difficulty = 'medium';\n } else {\n difficulty = (apiResult.difficulty || apiResult.model) as ComplexityLevel;\n }\n\n const result: RawRouterResult = {\n difficulty,\n };\n\n if (this.config.debug) {\n console.log(`[RawRouter] Classified as: ${difficulty}`);\n }\n\n return result;\n } catch (error) {\n if (this.config.debug) {\n console.error(`[RawRouter] Error classifying:`, error);\n }\n throw error;\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
- import {
2
- executeEditFile
3
- } from "./chunk-CKTA4AXM.js";
4
1
  import {
5
2
  EDIT_FILE_SYSTEM_PROMPT,
6
3
  EDIT_FILE_TOOL_DESCRIPTION
7
4
  } from "./chunk-63WE2C5R.js";
5
+ import {
6
+ executeEditFile
7
+ } from "./chunk-TLC3QKE6.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-PZ5AY32C.js";
@@ -86,4 +86,4 @@ export {
86
86
  vercel_default,
87
87
  vercel_exports
88
88
  };
89
- //# sourceMappingURL=chunk-QZNGKOCZ.js.map
89
+ //# sourceMappingURL=chunk-HDRLLCAD.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- executeEditFile
3
- } from "./chunk-CKTA4AXM.js";
4
1
  import {
5
2
  EDIT_FILE_SYSTEM_PROMPT,
6
3
  EDIT_FILE_TOOL_DESCRIPTION
7
4
  } from "./chunk-63WE2C5R.js";
5
+ import {
6
+ executeEditFile
7
+ } from "./chunk-TLC3QKE6.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-PZ5AY32C.js";
@@ -91,4 +91,4 @@ export {
91
91
  openai_default,
92
92
  openai_exports
93
93
  };
94
- //# sourceMappingURL=chunk-BKIM7SNY.js.map
94
+ //# sourceMappingURL=chunk-I3IN742Q.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- executeEditFile
3
- } from "./chunk-CKTA4AXM.js";
4
1
  import {
5
2
  EDIT_FILE_SYSTEM_PROMPT,
6
3
  EDIT_FILE_TOOL_DESCRIPTION
7
4
  } from "./chunk-63WE2C5R.js";
5
+ import {
6
+ executeEditFile
7
+ } from "./chunk-TLC3QKE6.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-PZ5AY32C.js";
@@ -79,4 +79,4 @@ export {
79
79
  getSystemPrompt,
80
80
  anthropic_exports
81
81
  };
82
- //# sourceMappingURL=chunk-7UYDS6OX.js.map
82
+ //# sourceMappingURL=chunk-KQP6ZPYB.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KW7OEGZK.js";
4
4
  import {
5
5
  executeToolCall
6
- } from "./chunk-QH4BSXOD.js";
6
+ } from "./chunk-4CZPXV6R.js";
7
7
 
8
8
  // tools/warp_grep/vercel.ts
9
9
  import { tool } from "ai";
@@ -50,4 +50,4 @@ export {
50
50
  createWarpGrepTool,
51
51
  vercel_default
52
52
  };
53
- //# sourceMappingURL=chunk-OTPYEYMZ.js.map
53
+ //# sourceMappingURL=chunk-MY4OU4ON.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- executeCodebaseSearch
3
- } from "./chunk-WM77HRKO.js";
4
1
  import {
5
2
  CODEBASE_SEARCH_DESCRIPTION
6
3
  } from "./chunk-YQMPVJ2L.js";
4
+ import {
5
+ executeCodebaseSearch
6
+ } from "./chunk-WM77HRKO.js";
7
7
 
8
8
  // tools/codebase_search/vercel.ts
9
9
  import { tool } from "ai";
@@ -55,4 +55,4 @@ export {
55
55
  getSystemPrompt,
56
56
  vercel_default
57
57
  };
58
- //# sourceMappingURL=chunk-UBX7QYBD.js.map
58
+ //# sourceMappingURL=chunk-O5DA5V5S.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- executeCodebaseSearch
3
- } from "./chunk-WM77HRKO.js";
4
1
  import {
5
2
  CODEBASE_SEARCH_DESCRIPTION,
6
3
  CODEBASE_SEARCH_SYSTEM_PROMPT
7
4
  } from "./chunk-YQMPVJ2L.js";
5
+ import {
6
+ executeCodebaseSearch
7
+ } from "./chunk-WM77HRKO.js";
8
8
 
9
9
  // tools/codebase_search/anthropic.ts
10
10
  function createCodebaseSearchTool(config) {
@@ -80,4 +80,4 @@ function formatResult(result) {
80
80
  export {
81
81
  createCodebaseSearchTool
82
82
  };
83
- //# sourceMappingURL=chunk-GJU7UOFL.js.map
83
+ //# sourceMappingURL=chunk-OUEJ6XEO.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  executeToolCall,
7
7
  formatResult
8
- } from "./chunk-QH4BSXOD.js";
8
+ } from "./chunk-4CZPXV6R.js";
9
9
  import {
10
10
  getSystemPrompt
11
11
  } from "./chunk-FMLHRJDF.js";
@@ -58,4 +58,4 @@ export {
58
58
  createWarpGrepTool,
59
59
  openai_default
60
60
  };
61
- //# sourceMappingURL=chunk-L5WXPMCH.js.map
61
+ //# sourceMappingURL=chunk-QUIGATZE.js.map