@morphllm/morphsdk 0.2.95 → 0.2.97

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 (42) hide show
  1. package/README.md +84 -147
  2. package/dist/{chunk-7D6TXC7X.js → chunk-AIXF4GQC.js} +2 -2
  3. package/dist/{chunk-43LQLGP6.js → chunk-BGEEES52.js} +2 -2
  4. package/dist/chunk-BGEEES52.js.map +1 -0
  5. package/dist/{chunk-ZYTAKEBW.js → chunk-EZEYREHA.js} +5 -5
  6. package/dist/{chunk-73RV6EXR.js → chunk-L5WXPMCH.js} +2 -2
  7. package/dist/{chunk-O7LDZA52.js → chunk-OTPYEYMZ.js} +2 -2
  8. package/dist/{chunk-QAT5UVPX.js → chunk-QH4BSXOD.js} +2 -2
  9. package/dist/client.cjs +1 -1
  10. package/dist/client.cjs.map +1 -1
  11. package/dist/client.js +6 -6
  12. package/dist/index.cjs +1 -1
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +6 -6
  15. package/dist/tools/warp_grep/agent/runner.cjs +1 -1
  16. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  17. package/dist/tools/warp_grep/agent/runner.js +1 -1
  18. package/dist/tools/warp_grep/anthropic.cjs +1 -1
  19. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  20. package/dist/tools/warp_grep/anthropic.js +3 -3
  21. package/dist/tools/warp_grep/client.cjs +1 -1
  22. package/dist/tools/warp_grep/client.cjs.map +1 -1
  23. package/dist/tools/warp_grep/client.js +2 -2
  24. package/dist/tools/warp_grep/gemini.cjs +1 -1
  25. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  26. package/dist/tools/warp_grep/gemini.js +2 -2
  27. package/dist/tools/warp_grep/index.cjs +1 -1
  28. package/dist/tools/warp_grep/index.cjs.map +1 -1
  29. package/dist/tools/warp_grep/index.js +2 -2
  30. package/dist/tools/warp_grep/openai.cjs +1 -1
  31. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  32. package/dist/tools/warp_grep/openai.js +3 -3
  33. package/dist/tools/warp_grep/vercel.cjs +1 -1
  34. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  35. package/dist/tools/warp_grep/vercel.js +3 -3
  36. package/package.json +3 -8
  37. package/dist/chunk-43LQLGP6.js.map +0 -1
  38. /package/dist/{chunk-7D6TXC7X.js.map → chunk-AIXF4GQC.js.map} +0 -0
  39. /package/dist/{chunk-ZYTAKEBW.js.map → chunk-EZEYREHA.js.map} +0 -0
  40. /package/dist/{chunk-73RV6EXR.js.map → chunk-L5WXPMCH.js.map} +0 -0
  41. /package/dist/{chunk-O7LDZA52.js.map → chunk-OTPYEYMZ.js.map} +0 -0
  42. /package/dist/{chunk-QAT5UVPX.js.map → chunk-QH4BSXOD.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: Repo Storage with automatic code indexing, semantic search, and Fast Apply (10,500 tokens/s).
3
+ Production-ready tools for AI coding agents: WarpGrep (intelligent code search), Fast Apply (10,500 tokens/s), and Repo Storage.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@morphllm/morphsdk.svg)](https://www.npmjs.com/package/@morphllm/morphsdk)
6
6
 
@@ -18,209 +18,146 @@ export MORPH_API_KEY="sk-your-key-here"
18
18
 
19
19
  ## Features
20
20
 
21
- - **🔍 Semantic Search** - State of the Art Code Search (AST aware chunking, morph-v4-embedding + morph-v4-rerank)
22
- - **📦 Repo Storage** - Agent native git with automatic code indexing, agent metadata, and chat history
21
+ - **🔍 WarpGrep** - Intelligent code search agent that explores your codebase with parallel grep/read operations
23
22
  - **⚡ Fast Apply** - 98% 1st pass accuracy, AI-powered code editing at 10,500 tokens/s
24
- - **🤖 Agent Tools** - Ready-to-use tools for Anthropic, OpenAI, and Vercel AI SDK
23
+ - **📦 Repo Storage** - Agent native git with automatic code indexing and agent metadata
24
+ - **🤖 Agent Tools** - Ready-to-use tools for Anthropic, OpenAI, Gemini, and Vercel AI SDK
25
25
 
26
26
  ## Quick Start
27
27
 
28
- ### Repo Storage + Semantic Search
28
+ ### WarpGrep - Intelligent Code Search
29
29
 
30
- ```typescript
31
- import { MorphClient } from '@morphllm/morphsdk';
30
+ WarpGrep is a search subagent that explores your codebase using parallel grep and file read operations. It understands natural language queries and returns relevant code with line numbers.
32
31
 
33
- const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
32
+ ```typescript
33
+ import { WarpGrepClient } from '@morphllm/morphsdk/tools/warp-grep';
34
34
 
35
- // Initialize repo
36
- await morph.git.init({ repoId: 'my-project', dir: './my-project' });
35
+ const client = new WarpGrepClient({ morphApiKey: process.env.MORPH_API_KEY });
37
36
 
38
- // Commit with agent metadata
39
- await morph.git.add({ dir: './my-project', filepath: '.' });
40
- await morph.git.commit({
41
- dir: './my-project',
42
- message: 'Add authentication'
37
+ const result = await client.execute({
38
+ query: 'Find where authentication requests are handled',
39
+ repoRoot: './my-project'
43
40
  });
44
41
 
45
- // Push (triggers automatic code embedding, 3-8s)
46
- await morph.git.push({ dir: './my-project' });
47
-
48
- // Search your code with natural language
49
- const results = await morph.codebaseSearch.search({
50
- query: "Where is the OAuth login implemented?",
51
- repoId: 'my-project',
52
- targetDirectories: [] // or ['src/auth'] to narrow search
42
+ // Returns relevant files with specific line ranges
43
+ result.files.forEach(file => {
44
+ console.log(`${file.path}: lines ${file.lines}`);
53
45
  });
54
-
55
- console.log(results.results[0].content);
56
46
  ```
57
47
 
58
- ### Fast Apply
48
+ ### As Agent Tool
59
49
 
60
50
  ```typescript
61
- import { MorphClient } from '@morphllm/morphsdk';
51
+ import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/anthropic';
52
+ import Anthropic from '@anthropic-ai/sdk';
62
53
 
63
- const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
54
+ const client = new Anthropic();
55
+ const tool = createWarpGrepTool({ repoRoot: './my-project' });
64
56
 
65
- // AI-powered file editing
66
- await morph.fastApply.execute({
67
- target_filepath: 'src/app.ts',
68
- instructions: 'Add error handling',
69
- code_edit: 'try { ... } catch (e) { ... }'
57
+ const response = await client.messages.create({
58
+ model: "claude-sonnet-4-5-20250929",
59
+ tools: [tool],
60
+ messages: [{ role: "user", content: "Find the error handling logic" }]
70
61
  });
71
62
  ```
72
63
 
73
- ## Repo Storage
74
-
75
- Git built for AI agents with automatic code indexing and semantic search.
64
+ ### Remote Sandbox Support
76
65
 
77
- ### Git Operations
66
+ WarpGrep works in remote sandboxes (E2B, Modal, Daytona) by providing custom command implementations:
78
67
 
79
68
  ```typescript
80
- // Initialize
81
- await morph.git.init({ repoId: 'my-project', dir: './my-project' });
82
-
83
- // Clone
84
- await morph.git.clone({ repoId: 'my-project', dir: './local-copy' });
85
-
86
- // Stage and commit
87
- await morph.git.add({ dir: './my-project', filepath: '.' });
88
- await morph.git.commit({
89
- dir: './my-project',
90
- message: 'Add feature'
69
+ import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/anthropic';
70
+
71
+ const tool = createWarpGrepTool({
72
+ repoRoot: '/home/repo',
73
+ remoteCommands: {
74
+ grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,
75
+ read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,
76
+ listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,
77
+ },
91
78
  });
92
-
93
- // Push (triggers code embedding in background)
94
- await morph.git.push({ dir: './my-project' });
95
-
96
- // Status and history
97
- const files = await morph.git.statusMatrix({ dir: './my-project' });
98
- const commits = await morph.git.log({ dir: './my-project', depth: 10 });
99
-
100
- // Branch operations
101
- await morph.git.branch({ dir: './my-project', name: 'feature' });
102
- const branches = await morph.git.listBranches({ dir: './my-project' });
103
- await morph.git.checkout({ dir: './my-project', ref: 'main' });
104
79
  ```
105
80
 
106
- ### Agent Metadata
107
-
108
- Store chat history and browser recordings with commits:
109
-
110
- ```typescript
111
- // Commit with metadata
112
- const sha = await morph.git.commit({
113
- dir: './my-project',
114
- message: 'Implement user auth',
115
- chatHistory: [
116
- { role: 'user', content: 'Add OAuth' },
117
- { role: 'assistant', content: 'Adding Google OAuth' }
118
- ],
119
- recordingId: 'rec_abc123'
120
- });
121
-
122
- // Retrieve metadata later
123
- const metadata = await morph.git.getCommitMetadata({
124
- dir: './my-project',
125
- commitSha: sha
126
- });
127
-
128
- console.log(metadata?.chatHistory);
129
- console.log(metadata?.recordingId);
130
- ```
131
-
132
- ### State of the Art Code Semantic Search
81
+ ## Fast Apply
133
82
 
134
- When you push, Morph automatically embeds your code for semantic search. Each commit is indexed separately:
83
+ AI-powered code editing at 10,500 tokens/s with 98% first-pass accuracy.
135
84
 
136
85
  ```typescript
137
- // Search latest code on 'main'
138
- await morph.codebaseSearch.search({
139
- query: "auth logic",
140
- repoId: 'my-project'
141
- });
86
+ import { MorphClient } from '@morphllm/morphsdk';
142
87
 
143
- // Advanced: Search specific branch
144
- await morph.codebaseSearch.search({
145
- query: "auth logic",
146
- repoId: 'my-project',
147
- branch: 'develop'
148
- });
88
+ const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
149
89
 
150
- // Advanced: Search exact commit
151
- await morph.codebaseSearch.search({
152
- query: "auth logic",
153
- repoId: 'my-project',
154
- commitHash: 'abc123...'
90
+ await morph.fastApply.execute({
91
+ target_filepath: 'src/app.ts',
92
+ instructions: 'Add error handling to the API call',
93
+ code_edit: `
94
+ // ... existing code ...
95
+ try {
96
+ const response = await fetch(url);
97
+ // ... existing code ...
98
+ } catch (e) {
99
+ console.error('API call failed:', e);
100
+ throw e;
101
+ }
102
+ `
155
103
  });
156
104
  ```
157
105
 
158
- ## Semantic Search
106
+ See [tools/fastapply/README.md](./tools/fastapply/README.md) for details.
159
107
 
160
- Two-stage retrieval: embedding similarity (morph-v4-embedding) + reranking (morph-v4-rerank).
108
+ ## Repo Storage
161
109
 
162
- ### As Agent Tool
110
+ Git built for AI agents with automatic code indexing.
163
111
 
164
112
  ```typescript
165
- import { createCodebaseSearchTool } from '@morphllm/morphsdk/tools/anthropic';
166
- import Anthropic from '@anthropic-ai/sdk';
167
-
168
- const client = new Anthropic();
169
- const tool = createCodebaseSearchTool({ repoId: 'my-project' });
170
-
171
- const response = await client.messages.create({
172
- model: "claude-sonnet-4-5-20250929",
173
- tools: [tool],
174
- messages: [{ role: "user", content: "Find authentication code" }]
175
- });
176
- ```
113
+ import { MorphClient } from '@morphllm/morphsdk';
177
114
 
178
- ### Direct Search
115
+ const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
179
116
 
180
- ```typescript
181
- const results = await morph.codebaseSearch.search({
182
- query: "How does authentication work?",
183
- repoId: 'my-project',
184
- targetDirectories: ["src/auth"], // or [] for all
185
- limit: 10
186
- });
117
+ // Initialize repo
118
+ await morph.git.init({ repoId: 'my-project', dir: './my-project' });
187
119
 
188
- results.results.forEach(r => {
189
- console.log(`${r.filepath} (${(r.rerankScore * 100).toFixed(1)}% relevant)`);
190
- console.log(r.content);
120
+ // Stage and commit with agent metadata
121
+ await morph.git.add({ dir: './my-project', filepath: '.' });
122
+ await morph.git.commit({
123
+ dir: './my-project',
124
+ message: 'Add authentication',
125
+ chatHistory: [
126
+ { role: 'user', content: 'Add OAuth login' },
127
+ { role: 'assistant', content: 'Adding Google OAuth...' }
128
+ ]
191
129
  });
192
- ```
193
-
194
- ### How It Works
195
130
 
196
- 1. **Embedding Search**: Query embedded with morph-v4-embedding, vector search retrieves top 50 candidates (~50ms)
197
- 2. **Reranking**: Candidates scored with morph-v4-rerank for precision (~150ms)
198
- 3. **Results**: Top 10 most relevant code chunks (~1230ms total)
199
-
200
- ## Fast Apply
131
+ // Push
132
+ await morph.git.push({ dir: './my-project' });
201
133
 
202
- AI-powered code editing at 10,500 tokens/s. See [tools/fastapply/README.md](./tools/fastapply/README.md) for details.
134
+ // Clone, branch, checkout
135
+ await morph.git.clone({ repoId: 'my-project', dir: './local-copy' });
136
+ await morph.git.branch({ dir: './my-project', name: 'feature' });
137
+ await morph.git.checkout({ dir: './my-project', ref: 'main' });
138
+ ```
203
139
 
204
140
  ## Agent Tools
205
141
 
206
142
  Ready-to-use tools for popular AI frameworks:
207
143
 
208
- - **Anthropic SDK** - `@morphllm/morphsdk/tools/anthropic`
209
- - **OpenAI SDK** - `@morphllm/morphsdk/tools/openai`
210
- - **Vercel AI SDK** - `@morphllm/morphsdk/tools/vercel`
144
+ | Framework | Import Path |
145
+ |-----------|-------------|
146
+ | Anthropic SDK | `@morphllm/morphsdk/tools/warp-grep/anthropic` |
147
+ | OpenAI SDK | `@morphllm/morphsdk/tools/warp-grep/openai` |
148
+ | Gemini SDK | `@morphllm/morphsdk/tools/warp-grep/gemini` |
149
+ | Vercel AI SDK | `@morphllm/morphsdk/tools/warp-grep/vercel` |
211
150
 
212
151
  Available tools:
213
- - `createCodebaseSearchTool` - Semantic code search
152
+ - `createWarpGrepTool` - Intelligent code search
214
153
  - `createFastApplyTool` - AI-powered code editing
215
154
  - `createBrowserTool` - Browser automation
216
- - `createWarpGrepTool` - Fast grep with AI parsing
217
155
 
218
156
  ## Documentation
219
157
 
220
158
  Full docs: [docs.morphllm.com](https://docs.morphllm.com)
221
159
 
222
160
  **Key Pages:**
223
- - [Repo Storage](https://docs.morphllm.com/sdk/components/git) - Git operations and agent metadata
224
- - [Semantic Search](https://docs.morphllm.com/sdk/components/semantic-search) - Code search with natural language
161
+ - [WarpGrep](https://docs.morphllm.com/sdk/components/warp-grep) - Intelligent code search
225
162
  - [Fast Apply](https://docs.morphllm.com/sdk/components/fast-apply) - AI-powered code editing
226
-
163
+ - [Repo Storage](https://docs.morphllm.com/sdk/components/git) - Git operations and agent metadata
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  executeToolCall,
7
7
  formatResult
8
- } from "./chunk-QAT5UVPX.js";
8
+ } from "./chunk-QH4BSXOD.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-7D6TXC7X.js.map
53
+ //# sourceMappingURL=chunk-AIXF4GQC.js.map
@@ -33,7 +33,7 @@ async function callModel(messages, model, options = {}) {
33
33
  const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;
34
34
  const client = new OpenAI({
35
35
  apiKey,
36
- baseURL: baseUrl,
36
+ baseURL: `${baseUrl}/v1`,
37
37
  maxRetries: options.retryConfig?.maxRetries,
38
38
  timeout: timeoutMs
39
39
  });
@@ -357,4 +357,4 @@ export {
357
357
  runWarpGrep,
358
358
  runWarpGrepStreaming
359
359
  };
360
- //# sourceMappingURL=chunk-43LQLGP6.js.map
360
+ //# sourceMappingURL=chunk-BGEEES52.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/warp_grep/agent/runner.ts"],"sourcesContent":["import { AGENT_CONFIG, DEFAULT_MODEL } from './config.js';\nimport { getSystemPrompt } from './prompt.js';\nimport type { AgentRunResult, ChatMessage, SessionConfig, AgentFinish, WarpGrepExecutionMetrics, WarpGrepTurnMetrics, WarpGrepStep } from './types.js';\nimport { LLMResponseParser } from './parser.js';\nimport type { WarpGrepProvider } from '../providers/types.js';\nimport { toolGrep } from './tools/grep.js';\nimport { toolRead } from './tools/read.js';\nimport { toolListDirectory } from './tools/list_directory.js';\nimport { readFinishFiles } from './tools/finish.js';\nimport type { RetryConfig } from '../../utils/resilience.js';\nimport { formatAgentToolOutput } from './formatter.js';\nimport { formatTurnMessage, calculateContextBudget, buildInitialState, enforceContextLimit } from './helpers.js';\nimport OpenAI from 'openai';\nimport path from 'path';\n\ntype EventName =\n | 'initial_state'\n | 'round_start'\n | 'round_end'\n | 'finish'\n | 'error';\n\nexport type EventCallback = (name: EventName, payload: Record<string, unknown>) => void;\n\nconst parser = new LLMResponseParser();\n\nconst DEFAULT_API_URL = 'https://api.morphllm.com';\n\ninterface CallModelOptions {\n morphApiKey?: string;\n morphApiUrl?: string;\n retryConfig?: RetryConfig;\n timeout?: number;\n}\n\nasync function callModel(\n messages: ChatMessage[],\n model: string,\n options: CallModelOptions = {}\n): Promise<string> {\n const baseUrl = options.morphApiUrl || DEFAULT_API_URL;\n const apiKey = options.morphApiKey || process.env.MORPH_API_KEY || '';\n const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n\n const client = new OpenAI({\n apiKey,\n baseURL: `${baseUrl}/v1`,\n maxRetries: options.retryConfig?.maxRetries,\n timeout: timeoutMs,\n });\n\n let data;\n try {\n data = await client.chat.completions.create({\n model,\n temperature: 0.0,\n max_tokens: 1024,\n messages,\n });\n } catch (error) {\n if (error instanceof OpenAI.APIError && error.status === 404) {\n throw new Error(\n 'The endpoint you are trying to call is likely deprecated. Please update with: npm cache clean --force && npx -y @morphllm/morphmcp@latest or visit: https://morphllm.com/mcp'\n );\n }\n throw error;\n }\n\n const content = data?.choices?.[0]?.message?.content;\n if (!content || typeof content !== 'string') {\n throw new Error('Invalid response from model');\n }\n return content;\n}\n\nexport async function runWarpGrep(config: SessionConfig & { provider: WarpGrepProvider }): Promise<AgentRunResult> {\n const totalStart = Date.now();\n const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n const timings: Partial<WarpGrepExecutionMetrics> = { turns: [], timeout_ms: timeoutMs };\n \n const repoRoot = path.resolve(config.repoRoot || process.cwd());\n const messages: ChatMessage[] = [];\n\n messages.push({ role: 'system' as const, content: getSystemPrompt() });\n \n const initialStateStart = Date.now();\n const initialState = await buildInitialState(repoRoot, config.query, config.provider);\n timings.initial_state_ms = Date.now() - initialStateStart;\n \n messages.push({ role: 'user', content: initialState });\n\n const maxTurns = AGENT_CONFIG.MAX_TURNS;\n const model = config.model || DEFAULT_MODEL;\n const provider = config.provider;\n const errors: Array<{ message: string }> = [];\n\n let finishMeta: AgentFinish | undefined;\n let terminationReason: AgentRunResult['terminationReason'] = 'terminated';\n\n for (let turn = 1; turn <= maxTurns; turn += 1) {\n const turnMetrics: WarpGrepTurnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };\n \n // Enforce hard context limit before calling model\n enforceContextLimit(messages);\n \n // call model\n const modelCallStart = Date.now();\n const assistantContent = await callModel(messages, model, {\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: timeoutMs,\n }).catch((e: unknown) => {\n errors.push({ message: e instanceof Error ? e.message : String(e) });\n return '';\n });\n turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n \n if (!assistantContent) {\n timings.turns!.push(turnMetrics);\n break;\n }\n messages.push({ role: 'assistant', content: assistantContent });\n\n // parse tool calls (no longer throws - returns _skip calls for malformed commands)\n const toolCalls = parser.parse(assistantContent);\n if (toolCalls.length === 0) {\n errors.push({ message: 'No tool calls produced by the model. Your MCP is likely out of date! Update it by running: rm -rf ~/.npm/_npx && npm cache clean --force && npx -y @morphllm/morphmcp@latest' });\n terminationReason = 'terminated';\n timings.turns!.push(turnMetrics);\n break;\n }\n\n const finishCalls = toolCalls.filter(c => c.name === 'finish');\n const grepCalls = toolCalls.filter(c => c.name === 'grep');\n const listDirCalls = toolCalls.filter(c => c.name === 'list_directory');\n const readCalls = toolCalls.filter(c => c.name === 'read');\n const skipCalls = toolCalls.filter(c => c.name === '_skip');\n\n const formatted: string[] = [];\n\n // Surface any skipped commands as feedback to the LLM\n for (const c of skipCalls) {\n const msg = (c.arguments as { message?: string })?.message || 'Command skipped due to parsing error';\n formatted.push(msg);\n }\n\n const allPromises: Array<Promise<string>> = [];\n \n for (const c of grepCalls) {\n const args = (c.arguments ?? {}) as { pattern: string; path: string; glob?: string };\n allPromises.push(\n toolGrep(provider, args).then(\n ({ output }) => formatAgentToolOutput('grep', args, output, { isError: false }),\n err => formatAgentToolOutput('grep', args, String(err), { isError: true })\n )\n );\n }\n \n for (const c of listDirCalls) {\n const args = (c.arguments ?? {}) as { path: string; pattern?: string | null };\n allPromises.push(\n toolListDirectory(provider, args).then(\n p => formatAgentToolOutput('list_directory', args, p, { isError: false }),\n err => formatAgentToolOutput('list_directory', args, String(err), { isError: true })\n )\n );\n }\n \n for (const c of readCalls) {\n const args = (c.arguments ?? {}) as { path: string; start?: number; end?: number; lines?: Array<[number, number]> };\n allPromises.push(\n toolRead(provider, args).then(\n p => formatAgentToolOutput('read', args, p, { isError: false }),\n err => formatAgentToolOutput('read', args, String(err), { isError: true })\n )\n );\n }\n \n const toolExecStart = Date.now();\n const allResults = await Promise.all(allPromises);\n turnMetrics.local_tools_ms = Date.now() - toolExecStart;\n \n for (const result of allResults) {\n formatted.push(result);\n }\n\n if (formatted.length > 0) {\n const turnMessage = formatTurnMessage(turn, maxTurns);\n const contextBudget = calculateContextBudget(messages);\n messages.push({ role: 'user', content: formatted.join('\\n') + turnMessage + '\\n' + contextBudget });\n }\n\n timings.turns!.push(turnMetrics);\n\n if (finishCalls.length) {\n const fc = finishCalls[0];\n const files = ((fc.arguments as any)?.files ?? []) as AgentFinish['files'];\n finishMeta = { files };\n terminationReason = 'completed';\n break;\n }\n }\n\n if (terminationReason !== 'completed' || !finishMeta) {\n timings.total_ms = Date.now() - totalStart;\n return { terminationReason, messages, errors, timings: timings as WarpGrepExecutionMetrics };\n }\n\n // Build finish payload\n const parts: string[] = ['Relevant context found:'];\n for (const f of finishMeta.files) {\n const ranges = f.lines === '*' ? '*' \n : Array.isArray(f.lines) ? f.lines.map(([s, e]) => `${s}-${e}`).join(', ') \n : '*';\n parts.push(`- ${f.path}: ${ranges}`);\n }\n const payload = parts.join('\\n');\n\n // Resolve file contents for returned ranges\n // Wrap reader in try-catch to handle non-existent or unreadable files gracefully\n // Track files that couldn't be read for error reporting\n const finishResolutionStart = Date.now();\n const fileReadErrors: Array<{ path: string; error: string }> = [];\n const resolved = await readFinishFiles(\n repoRoot,\n finishMeta.files,\n async (p: string, s?: number, e?: number) => {\n try {\n const rr = await provider.read({ path: p, start: s, end: e });\n // rr.lines are \"line|content\" → strip the \"line|\" prefix\n return rr.lines.map(l => {\n const idx = l.indexOf('|');\n return idx >= 0 ? l.slice(idx + 1) : l;\n });\n } catch (err) {\n // File doesn't exist or can't be read - log error but don't throw\n // This handles cases where the agent hallucinated a path or the file was deleted\n const errorMsg = err instanceof Error ? err.message : String(err);\n fileReadErrors.push({ path: p, error: errorMsg });\n console.error(`[warp_grep] Failed to read file: ${p} - ${errorMsg}`);\n return [`[couldn't find: ${p}]`];\n }\n }\n );\n\n timings.finish_resolution_ms = Date.now() - finishResolutionStart;\n\n // Add file read errors to the result so MCP can report them\n if (fileReadErrors.length > 0) {\n errors.push(...fileReadErrors.map(e => ({ message: `File read error: ${e.path} - ${e.error}` })));\n }\n\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta, resolved },\n timings: timings as WarpGrepExecutionMetrics,\n };\n}\n\n/**\n * Streaming version of runWarpGrep that yields step information after each turn.\n * Yields WarpGrepStep with tool calls for each turn, then returns the final AgentRunResult.\n */\nexport async function* runWarpGrepStreaming(\n config: SessionConfig & { provider: WarpGrepProvider }\n): AsyncGenerator<WarpGrepStep, AgentRunResult, undefined> {\n const totalStart = Date.now();\n const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n const timings: Partial<WarpGrepExecutionMetrics> = { turns: [], timeout_ms: timeoutMs };\n\n const repoRoot = path.resolve(config.repoRoot || process.cwd());\n const messages: ChatMessage[] = [];\n\n messages.push({ role: 'system' as const, content: getSystemPrompt() });\n\n const initialStateStart = Date.now();\n const initialState = await buildInitialState(repoRoot, config.query, config.provider);\n timings.initial_state_ms = Date.now() - initialStateStart;\n\n messages.push({ role: 'user', content: initialState });\n\n const maxTurns = AGENT_CONFIG.MAX_TURNS;\n const model = config.model || DEFAULT_MODEL;\n const provider = config.provider;\n const errors: Array<{ message: string }> = [];\n\n let finishMeta: AgentFinish | undefined;\n let terminationReason: AgentRunResult['terminationReason'] = 'terminated';\n\n for (let turn = 1; turn <= maxTurns; turn += 1) {\n const turnMetrics: WarpGrepTurnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };\n\n // Enforce hard context limit before calling model\n enforceContextLimit(messages);\n\n // call model\n const modelCallStart = Date.now();\n const assistantContent = await callModel(messages, model, {\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: timeoutMs,\n }).catch((e: unknown) => {\n errors.push({ message: e instanceof Error ? e.message : String(e) });\n return '';\n });\n turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n\n if (!assistantContent) {\n timings.turns!.push(turnMetrics);\n break;\n }\n messages.push({ role: 'assistant', content: assistantContent });\n\n // parse tool calls (no longer throws - returns _skip calls for malformed commands)\n const toolCalls = parser.parse(assistantContent);\n if (toolCalls.length === 0) {\n errors.push({ message: 'No tool calls produced by the model. Your MCP is likely out of date! Update it by running: rm -rf ~/.npm/_npx && npm cache clean --force && npx -y @morphllm/morphmcp@latest' });\n terminationReason = 'terminated';\n timings.turns!.push(turnMetrics);\n break;\n }\n\n // Yield step with tool calls (before execution)\n yield {\n turn,\n toolCalls: toolCalls.map(c => ({\n name: c.name,\n arguments: c.arguments ?? {}\n }))\n };\n\n const finishCalls = toolCalls.filter(c => c.name === 'finish');\n const grepCalls = toolCalls.filter(c => c.name === 'grep');\n const listDirCalls = toolCalls.filter(c => c.name === 'list_directory');\n const readCalls = toolCalls.filter(c => c.name === 'read');\n const skipCalls = toolCalls.filter(c => c.name === '_skip');\n\n const formatted: string[] = [];\n\n // Surface any skipped commands as feedback to the LLM\n for (const c of skipCalls) {\n const msg = (c.arguments as { message?: string })?.message || 'Command skipped due to parsing error';\n formatted.push(msg);\n }\n\n const allPromises: Array<Promise<string>> = [];\n\n for (const c of grepCalls) {\n const args = (c.arguments ?? {}) as { pattern: string; path: string; glob?: string };\n allPromises.push(\n toolGrep(provider, args).then(\n ({ output }) => formatAgentToolOutput('grep', args, output, { isError: false }),\n err => formatAgentToolOutput('grep', args, String(err), { isError: true })\n )\n );\n }\n\n for (const c of listDirCalls) {\n const args = (c.arguments ?? {}) as { path: string; pattern?: string | null };\n allPromises.push(\n toolListDirectory(provider, args).then(\n p => formatAgentToolOutput('list_directory', args, p, { isError: false }),\n err => formatAgentToolOutput('list_directory', args, String(err), { isError: true })\n )\n );\n }\n\n for (const c of readCalls) {\n const args = (c.arguments ?? {}) as { path: string; start?: number; end?: number; lines?: Array<[number, number]> };\n allPromises.push(\n toolRead(provider, args).then(\n p => formatAgentToolOutput('read', args, p, { isError: false }),\n err => formatAgentToolOutput('read', args, String(err), { isError: true })\n )\n );\n }\n\n const toolExecStart = Date.now();\n const allResults = await Promise.all(allPromises);\n turnMetrics.local_tools_ms = Date.now() - toolExecStart;\n\n for (const result of allResults) {\n formatted.push(result);\n }\n\n if (formatted.length > 0) {\n const turnMessage = formatTurnMessage(turn, maxTurns);\n const contextBudget = calculateContextBudget(messages);\n messages.push({ role: 'user', content: formatted.join('\\n') + turnMessage + '\\n' + contextBudget });\n }\n\n timings.turns!.push(turnMetrics);\n\n if (finishCalls.length) {\n const fc = finishCalls[0];\n const files = ((fc.arguments as any)?.files ?? []) as AgentFinish['files'];\n finishMeta = { files };\n terminationReason = 'completed';\n break;\n }\n }\n\n if (terminationReason !== 'completed' || !finishMeta) {\n timings.total_ms = Date.now() - totalStart;\n return { terminationReason, messages, errors, timings: timings as WarpGrepExecutionMetrics };\n }\n\n // Build finish payload\n const parts: string[] = ['Relevant context found:'];\n for (const f of finishMeta.files) {\n const ranges = f.lines === '*' ? '*'\n : Array.isArray(f.lines) ? f.lines.map(([s, e]) => `${s}-${e}`).join(', ')\n : '*';\n parts.push(`- ${f.path}: ${ranges}`);\n }\n const payload = parts.join('\\n');\n\n // Resolve file contents for returned ranges\n const finishResolutionStart = Date.now();\n const fileReadErrors: Array<{ path: string; error: string }> = [];\n const resolved = await readFinishFiles(\n repoRoot,\n finishMeta.files,\n async (p: string, s?: number, e?: number) => {\n try {\n const rr = await provider.read({ path: p, start: s, end: e });\n return rr.lines.map(l => {\n const idx = l.indexOf('|');\n return idx >= 0 ? l.slice(idx + 1) : l;\n });\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n fileReadErrors.push({ path: p, error: errorMsg });\n console.error(`[warp_grep] Failed to read file: ${p} - ${errorMsg}`);\n return [`[couldn't find: ${p}]`];\n }\n }\n );\n\n timings.finish_resolution_ms = Date.now() - finishResolutionStart;\n\n if (fileReadErrors.length > 0) {\n errors.push(...fileReadErrors.map(e => ({ message: `File read error: ${e.path} - ${e.error}` })));\n }\n\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta, resolved },\n timings: timings as WarpGrepExecutionMetrics,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  createWarpGrepTool as createWarpGrepTool3
3
- } from "./chunk-O7LDZA52.js";
3
+ } from "./chunk-OTPYEYMZ.js";
4
4
  import {
5
5
  createWarpGrepTool as createWarpGrepTool2
6
- } from "./chunk-7D6TXC7X.js";
6
+ } from "./chunk-AIXF4GQC.js";
7
7
  import {
8
8
  createWarpGrepTool
9
- } from "./chunk-73RV6EXR.js";
9
+ } from "./chunk-L5WXPMCH.js";
10
10
  import {
11
11
  WarpGrepClient
12
- } from "./chunk-QAT5UVPX.js";
12
+ } from "./chunk-QH4BSXOD.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-ZYTAKEBW.js.map
283
+ //# sourceMappingURL=chunk-EZEYREHA.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  executeToolCall,
7
7
  formatResult
8
- } from "./chunk-QAT5UVPX.js";
8
+ } from "./chunk-QH4BSXOD.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-73RV6EXR.js.map
61
+ //# sourceMappingURL=chunk-L5WXPMCH.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KW7OEGZK.js";
4
4
  import {
5
5
  executeToolCall
6
- } from "./chunk-QAT5UVPX.js";
6
+ } from "./chunk-QH4BSXOD.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-O7LDZA52.js.map
53
+ //# sourceMappingURL=chunk-OTPYEYMZ.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  runWarpGrep,
3
3
  runWarpGrepStreaming
4
- } from "./chunk-43LQLGP6.js";
4
+ } from "./chunk-BGEEES52.js";
5
5
  import {
6
6
  RemoteCommandsProvider
7
7
  } from "./chunk-PUGSTXLO.js";
@@ -138,4 +138,4 @@ export {
138
138
  executeToolCall,
139
139
  formatResult
140
140
  };
141
- //# sourceMappingURL=chunk-QAT5UVPX.js.map
141
+ //# sourceMappingURL=chunk-QH4BSXOD.js.map
package/dist/client.cjs CHANGED
@@ -2541,7 +2541,7 @@ async function callModel(messages, model, options = {}) {
2541
2541
  const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;
2542
2542
  const client = new import_openai.default({
2543
2543
  apiKey,
2544
- baseURL: baseUrl,
2544
+ baseURL: `${baseUrl}/v1`,
2545
2545
  maxRetries: options.retryConfig?.maxRetries,
2546
2546
  timeout: timeoutMs
2547
2547
  });