@morphllm/morphsdk 0.2.137 → 0.2.139
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.
- package/dist/{chunk-AVIE6SRT.js → chunk-3J74OXN6.js} +2 -2
- package/dist/chunk-3T5W2D2W.js +288 -0
- package/dist/chunk-3T5W2D2W.js.map +1 -0
- package/dist/{chunk-HRJENFMZ.js → chunk-4J5UW34J.js} +4 -4
- package/dist/{chunk-L37HJNBY.js → chunk-5CBMLTG5.js} +5 -5
- package/dist/{chunk-5UDCVVZE.js → chunk-6W3X76KE.js} +21 -6
- package/dist/chunk-6W3X76KE.js.map +1 -0
- package/dist/{chunk-LQIGX3MX.js → chunk-6WSZDCGP.js} +2 -2
- package/dist/{chunk-6EQ5IEK6.js → chunk-73ZLTWKF.js} +4 -4
- package/dist/{chunk-Y4QRWCMI.js → chunk-7RCHQN7F.js} +2 -2
- package/dist/{chunk-5BLLE3UZ.js → chunk-ATAQZLQN.js} +2 -2
- package/dist/{chunk-JTBQIPLB.js → chunk-B55ZEX4M.js} +2 -2
- package/dist/{chunk-RI2GNU2V.js → chunk-DRAQDTSR.js} +2 -2
- package/dist/{chunk-4546AOKY.js → chunk-EEBGEMOO.js} +2 -2
- package/dist/{chunk-4YEGLW4W.js → chunk-EHRKLQ62.js} +2 -2
- package/dist/chunk-GQX4PKXZ.js +265 -0
- package/dist/chunk-GQX4PKXZ.js.map +1 -0
- package/dist/{chunk-SJKGUXNG.js → chunk-MHNCFELG.js} +4 -4
- package/dist/{chunk-3GEXJ6WJ.js → chunk-MTD2JOO7.js} +1 -1
- package/dist/{chunk-ODYZXYFX.js → chunk-NEVPVOTT.js} +3 -3
- package/dist/{chunk-JNMYWTLZ.js → chunk-NGHLDI64.js} +2 -2
- package/dist/{chunk-7JA4SBAA.js → chunk-OICUUS5Y.js} +4 -4
- package/dist/{chunk-3OG25CSW.js → chunk-TCXBKB7P.js} +2 -2
- package/dist/{chunk-2NVSFPMB.js → chunk-ULMSWACH.js} +9 -7
- package/dist/chunk-ULMSWACH.js.map +1 -0
- package/dist/{chunk-K632JRRH.js → chunk-XIEU3N3R.js} +4 -4
- package/dist/{chunk-D7E5WBMV.js → chunk-XUDE6SOY.js} +57 -21
- package/dist/{chunk-D7E5WBMV.js.map → chunk-XUDE6SOY.js.map} +1 -1
- package/dist/{chunk-MJZ5HL6P.js → chunk-ZUG2L4BJ.js} +2 -2
- package/dist/{chunk-OPVFUVNJ.js → chunk-ZYN64ZVG.js} +4 -4
- package/dist/chunk-ZZ25FZG2.js +73 -0
- package/dist/chunk-ZZ25FZG2.js.map +1 -0
- package/dist/{client-Ca7e11hJ.d.ts → client-BMmG3SZs.d.ts} +39 -0
- package/dist/client.cjs +653 -14
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.ts +2 -1
- package/dist/client.js +30 -27
- package/dist/edge.cjs +20 -5
- package/dist/edge.cjs.map +1 -1
- package/dist/edge.js +9 -9
- package/dist/index.cjs +656 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +37 -34
- package/dist/modelrouter/core.cjs +20 -5
- package/dist/modelrouter/core.cjs.map +1 -1
- package/dist/modelrouter/core.js +3 -3
- package/dist/modelrouter/index.cjs +20 -5
- package/dist/modelrouter/index.cjs.map +1 -1
- package/dist/modelrouter/index.js +3 -3
- package/dist/subagents/anthropic.cjs +2397 -0
- package/dist/subagents/anthropic.cjs.map +1 -0
- package/dist/subagents/anthropic.d.ts +41 -0
- package/dist/subagents/anthropic.js +19 -0
- package/dist/subagents/anthropic.js.map +1 -0
- package/dist/subagents/index.cjs +101 -0
- package/dist/subagents/index.cjs.map +1 -0
- package/dist/subagents/index.d.ts +5 -0
- package/dist/subagents/index.js +12 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents/prompts.cjs +99 -0
- package/dist/subagents/prompts.cjs.map +1 -0
- package/dist/subagents/prompts.d.ts +42 -0
- package/dist/subagents/prompts.js +12 -0
- package/dist/subagents/prompts.js.map +1 -0
- package/dist/subagents/types.cjs +19 -0
- package/dist/subagents/types.cjs.map +1 -0
- package/dist/subagents/types.d.ts +93 -0
- package/dist/subagents/types.js +1 -0
- package/dist/subagents/types.js.map +1 -0
- package/dist/subagents/vercel.cjs +2374 -0
- package/dist/subagents/vercel.cjs.map +1 -0
- package/dist/subagents/vercel.d.ts +32 -0
- package/dist/subagents/vercel.js +19 -0
- package/dist/subagents/vercel.js.map +1 -0
- package/dist/tools/browser/anthropic.cjs +20 -5
- package/dist/tools/browser/anthropic.cjs.map +1 -1
- package/dist/tools/browser/anthropic.js +6 -6
- package/dist/tools/browser/core.cjs +20 -5
- package/dist/tools/browser/core.cjs.map +1 -1
- package/dist/tools/browser/core.js +5 -5
- package/dist/tools/browser/index.cjs +20 -5
- package/dist/tools/browser/index.cjs.map +1 -1
- package/dist/tools/browser/index.js +15 -15
- package/dist/tools/browser/openai.cjs +20 -5
- package/dist/tools/browser/openai.cjs.map +1 -1
- package/dist/tools/browser/openai.js +6 -6
- package/dist/tools/browser/profiles/core.cjs +20 -5
- package/dist/tools/browser/profiles/core.cjs.map +1 -1
- package/dist/tools/browser/profiles/core.js +3 -3
- package/dist/tools/browser/profiles/index.cjs +20 -5
- package/dist/tools/browser/profiles/index.cjs.map +1 -1
- package/dist/tools/browser/profiles/index.js +3 -3
- package/dist/tools/browser/vercel.cjs +20 -5
- package/dist/tools/browser/vercel.cjs.map +1 -1
- package/dist/tools/browser/vercel.js +6 -6
- package/dist/tools/codebase_search/anthropic.cjs +20 -5
- package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
- package/dist/tools/codebase_search/anthropic.js +4 -4
- package/dist/tools/codebase_search/core.cjs +20 -5
- package/dist/tools/codebase_search/core.cjs.map +1 -1
- package/dist/tools/codebase_search/core.js +3 -3
- package/dist/tools/codebase_search/index.cjs +20 -5
- package/dist/tools/codebase_search/index.cjs.map +1 -1
- package/dist/tools/codebase_search/index.js +10 -10
- package/dist/tools/codebase_search/openai.cjs +20 -5
- package/dist/tools/codebase_search/openai.cjs.map +1 -1
- package/dist/tools/codebase_search/openai.js +4 -4
- package/dist/tools/codebase_search/vercel.cjs +20 -5
- package/dist/tools/codebase_search/vercel.cjs.map +1 -1
- package/dist/tools/codebase_search/vercel.js +4 -4
- package/dist/tools/fastapply/anthropic.cjs +20 -5
- package/dist/tools/fastapply/anthropic.cjs.map +1 -1
- package/dist/tools/fastapply/anthropic.js +4 -4
- package/dist/tools/fastapply/apply.cjs +20 -5
- package/dist/tools/fastapply/apply.cjs.map +1 -1
- package/dist/tools/fastapply/apply.js +2 -2
- package/dist/tools/fastapply/core.cjs +20 -5
- package/dist/tools/fastapply/core.cjs.map +1 -1
- package/dist/tools/fastapply/core.js +3 -3
- package/dist/tools/fastapply/index.cjs +20 -5
- package/dist/tools/fastapply/index.cjs.map +1 -1
- package/dist/tools/fastapply/index.js +8 -8
- package/dist/tools/fastapply/openai.cjs +20 -5
- package/dist/tools/fastapply/openai.cjs.map +1 -1
- package/dist/tools/fastapply/openai.js +4 -4
- package/dist/tools/fastapply/vercel.cjs +20 -5
- package/dist/tools/fastapply/vercel.cjs.map +1 -1
- package/dist/tools/fastapply/vercel.js +4 -4
- package/dist/tools/index.cjs +20 -5
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js +8 -8
- package/dist/tools/utils/resilience.cjs +20 -5
- package/dist/tools/utils/resilience.cjs.map +1 -1
- package/dist/tools/utils/resilience.js +2 -2
- package/dist/tools/warp_grep/agent/runner.cjs +23 -6
- package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/runner.js +3 -3
- package/dist/tools/warp_grep/anthropic.cjs +23 -6
- package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
- package/dist/tools/warp_grep/anthropic.js +6 -6
- package/dist/tools/warp_grep/client.cjs +23 -6
- package/dist/tools/warp_grep/client.cjs.map +1 -1
- package/dist/tools/warp_grep/client.js +5 -5
- package/dist/tools/warp_grep/gemini.cjs +23 -6
- package/dist/tools/warp_grep/gemini.cjs.map +1 -1
- package/dist/tools/warp_grep/gemini.js +5 -5
- package/dist/tools/warp_grep/harness.js +4 -4
- package/dist/tools/warp_grep/index.cjs +23 -6
- package/dist/tools/warp_grep/index.cjs.map +1 -1
- package/dist/tools/warp_grep/index.js +7 -7
- package/dist/tools/warp_grep/openai.cjs +23 -6
- package/dist/tools/warp_grep/openai.cjs.map +1 -1
- package/dist/tools/warp_grep/openai.js +6 -6
- package/dist/tools/warp_grep/vercel.cjs +23 -6
- package/dist/tools/warp_grep/vercel.cjs.map +1 -1
- package/dist/tools/warp_grep/vercel.js +6 -6
- package/dist/version.cjs +20 -5
- package/dist/version.cjs.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +20 -5
- package/dist/chunk-2NVSFPMB.js.map +0 -1
- package/dist/chunk-5UDCVVZE.js.map +0 -1
- /package/dist/{chunk-AVIE6SRT.js.map → chunk-3J74OXN6.js.map} +0 -0
- /package/dist/{chunk-HRJENFMZ.js.map → chunk-4J5UW34J.js.map} +0 -0
- /package/dist/{chunk-L37HJNBY.js.map → chunk-5CBMLTG5.js.map} +0 -0
- /package/dist/{chunk-LQIGX3MX.js.map → chunk-6WSZDCGP.js.map} +0 -0
- /package/dist/{chunk-6EQ5IEK6.js.map → chunk-73ZLTWKF.js.map} +0 -0
- /package/dist/{chunk-Y4QRWCMI.js.map → chunk-7RCHQN7F.js.map} +0 -0
- /package/dist/{chunk-5BLLE3UZ.js.map → chunk-ATAQZLQN.js.map} +0 -0
- /package/dist/{chunk-JTBQIPLB.js.map → chunk-B55ZEX4M.js.map} +0 -0
- /package/dist/{chunk-RI2GNU2V.js.map → chunk-DRAQDTSR.js.map} +0 -0
- /package/dist/{chunk-4546AOKY.js.map → chunk-EEBGEMOO.js.map} +0 -0
- /package/dist/{chunk-4YEGLW4W.js.map → chunk-EHRKLQ62.js.map} +0 -0
- /package/dist/{chunk-SJKGUXNG.js.map → chunk-MHNCFELG.js.map} +0 -0
- /package/dist/{chunk-3GEXJ6WJ.js.map → chunk-MTD2JOO7.js.map} +0 -0
- /package/dist/{chunk-ODYZXYFX.js.map → chunk-NEVPVOTT.js.map} +0 -0
- /package/dist/{chunk-JNMYWTLZ.js.map → chunk-NGHLDI64.js.map} +0 -0
- /package/dist/{chunk-7JA4SBAA.js.map → chunk-OICUUS5Y.js.map} +0 -0
- /package/dist/{chunk-3OG25CSW.js.map → chunk-TCXBKB7P.js.map} +0 -0
- /package/dist/{chunk-K632JRRH.js.map → chunk-XIEU3N3R.js.map} +0 -0
- /package/dist/{chunk-MJZ5HL6P.js.map → chunk-ZUG2L4BJ.js.map} +0 -0
- /package/dist/{chunk-OPVFUVNJ.js.map → chunk-ZYN64ZVG.js.map} +0 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WarpGrepClient,
|
|
3
|
+
formatResult
|
|
4
|
+
} from "./chunk-5CBMLTG5.js";
|
|
5
|
+
import {
|
|
6
|
+
CODEBASE_SEARCH_TOOL,
|
|
7
|
+
SEND_MESSAGE_TOOL,
|
|
8
|
+
getSystemPrompt
|
|
9
|
+
} from "./chunk-ZZ25FZG2.js";
|
|
10
|
+
|
|
11
|
+
// subagents/vercel.ts
|
|
12
|
+
import { tool, generateText, stepCountIs } from "ai";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
var DEFAULT_MAX_TURNS = {
|
|
15
|
+
quick: 3,
|
|
16
|
+
medium: 6,
|
|
17
|
+
thorough: 12
|
|
18
|
+
};
|
|
19
|
+
function getMaxTurns(config) {
|
|
20
|
+
return config.maxTurns ?? DEFAULT_MAX_TURNS[config.thoroughness ?? "medium"] ?? 6;
|
|
21
|
+
}
|
|
22
|
+
function createExploreSubagent(config) {
|
|
23
|
+
if (!config.repoRoot) {
|
|
24
|
+
throw new Error("repoRoot is required for Explore subagent");
|
|
25
|
+
}
|
|
26
|
+
const warpGrep = new WarpGrepClient({
|
|
27
|
+
morphApiKey: config.morphApiKey
|
|
28
|
+
});
|
|
29
|
+
const thoroughness = config.thoroughness ?? "medium";
|
|
30
|
+
const replyTimeout = config.replyTimeout ?? 3e4;
|
|
31
|
+
async function runExplore(prompt, callbacks = {}) {
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
const allContexts = [];
|
|
34
|
+
let searchCount = 0;
|
|
35
|
+
const timeoutMs = config.timeout;
|
|
36
|
+
const timeoutPromise = timeoutMs ? new Promise(
|
|
37
|
+
(_, reject) => setTimeout(() => reject(new Error(`Exploration timed out after ${timeoutMs}ms`)), timeoutMs)
|
|
38
|
+
) : null;
|
|
39
|
+
const runPromise = (async () => {
|
|
40
|
+
try {
|
|
41
|
+
const codebaseSearchSchema = z.object({
|
|
42
|
+
searchRequest: z.string().describe("Natural language description of what to search for")
|
|
43
|
+
});
|
|
44
|
+
const sendMessageSchema = z.object({
|
|
45
|
+
message: z.string().describe("The message to send to the orchestrator")
|
|
46
|
+
});
|
|
47
|
+
const result = await generateText({
|
|
48
|
+
model: config.model,
|
|
49
|
+
system: getSystemPrompt(thoroughness),
|
|
50
|
+
prompt,
|
|
51
|
+
tools: {
|
|
52
|
+
codebase_search: tool({
|
|
53
|
+
description: CODEBASE_SEARCH_TOOL.description,
|
|
54
|
+
inputSchema: codebaseSearchSchema,
|
|
55
|
+
execute: async (params) => {
|
|
56
|
+
searchCount++;
|
|
57
|
+
const warpResult = await warpGrep.execute({
|
|
58
|
+
searchTerm: params.searchRequest,
|
|
59
|
+
repoRoot: config.repoRoot,
|
|
60
|
+
excludes: config.excludes,
|
|
61
|
+
includes: config.includes
|
|
62
|
+
});
|
|
63
|
+
if (warpResult.contexts) {
|
|
64
|
+
allContexts.push(...warpResult.contexts);
|
|
65
|
+
}
|
|
66
|
+
callbacks.onStep?.({
|
|
67
|
+
step: searchCount,
|
|
68
|
+
searchRequest: params.searchRequest,
|
|
69
|
+
contextsFound: warpResult.contexts?.length ?? 0,
|
|
70
|
+
isFinal: false
|
|
71
|
+
});
|
|
72
|
+
return formatResult(warpResult);
|
|
73
|
+
}
|
|
74
|
+
}),
|
|
75
|
+
send_message: tool({
|
|
76
|
+
description: SEND_MESSAGE_TOOL.description,
|
|
77
|
+
inputSchema: sendMessageSchema,
|
|
78
|
+
execute: async (params) => {
|
|
79
|
+
const subagentMsg = {
|
|
80
|
+
from: "explore",
|
|
81
|
+
content: params.message,
|
|
82
|
+
timestamp: Date.now()
|
|
83
|
+
};
|
|
84
|
+
const replyPromise = new Promise((resolve) => {
|
|
85
|
+
if (callbacks.onMessage) {
|
|
86
|
+
callbacks.onMessage(subagentMsg, (replyText) => {
|
|
87
|
+
resolve(replyText);
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
setTimeout(() => resolve(""), replyTimeout);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const reply = await Promise.race([
|
|
94
|
+
replyPromise,
|
|
95
|
+
new Promise(
|
|
96
|
+
(resolve) => setTimeout(() => resolve(""), replyTimeout)
|
|
97
|
+
)
|
|
98
|
+
]);
|
|
99
|
+
if (reply) {
|
|
100
|
+
return `Response from orchestrator: ${reply}`;
|
|
101
|
+
}
|
|
102
|
+
return "No response. Continue with your best judgment.";
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
},
|
|
106
|
+
stopWhen: stepCountIs(getMaxTurns(config))
|
|
107
|
+
});
|
|
108
|
+
callbacks.onStep?.({
|
|
109
|
+
step: searchCount,
|
|
110
|
+
searchRequest: "",
|
|
111
|
+
contextsFound: allContexts.length,
|
|
112
|
+
isFinal: true
|
|
113
|
+
});
|
|
114
|
+
const uniqueContexts = deduplicateContexts(allContexts);
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
summary: result.text || "Exploration completed but no summary was generated.",
|
|
118
|
+
contexts: uniqueContexts,
|
|
119
|
+
searchCount,
|
|
120
|
+
durationMs: Date.now() - startTime
|
|
121
|
+
};
|
|
122
|
+
} catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
summary: "",
|
|
126
|
+
contexts: deduplicateContexts(allContexts),
|
|
127
|
+
searchCount,
|
|
128
|
+
durationMs: Date.now() - startTime,
|
|
129
|
+
error: error instanceof Error ? error.message : String(error)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
})();
|
|
133
|
+
if (timeoutPromise) {
|
|
134
|
+
try {
|
|
135
|
+
return await Promise.race([runPromise, timeoutPromise]);
|
|
136
|
+
} catch (error) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
summary: "",
|
|
140
|
+
contexts: deduplicateContexts(allContexts),
|
|
141
|
+
searchCount,
|
|
142
|
+
durationMs: Date.now() - startTime,
|
|
143
|
+
error: error instanceof Error ? error.message : String(error)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return runPromise;
|
|
148
|
+
}
|
|
149
|
+
const exploreToolSchema = z.object({
|
|
150
|
+
searchRequest: z.string().describe("What to explore in the codebase. Be specific about what you want to understand.")
|
|
151
|
+
});
|
|
152
|
+
const exploreTool = tool({
|
|
153
|
+
description: "Explore a codebase to answer questions about code structure, find implementations, trace call chains, and understand architecture. Returns a summary of findings. Use this for broad exploration rather than pinpoint keyword searches.",
|
|
154
|
+
inputSchema: exploreToolSchema,
|
|
155
|
+
execute: async (params) => {
|
|
156
|
+
const result = await runExplore(params.searchRequest);
|
|
157
|
+
return {
|
|
158
|
+
success: result.success,
|
|
159
|
+
summary: result.summary,
|
|
160
|
+
searchCount: result.searchCount,
|
|
161
|
+
error: result.error
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
/** Vercel AI SDK tool for use as a tool in parent agents */
|
|
167
|
+
tool: exploreTool,
|
|
168
|
+
/** Run exploration with messaging support */
|
|
169
|
+
run(prompt) {
|
|
170
|
+
const messageHandlers = [];
|
|
171
|
+
const stepHandlers = [];
|
|
172
|
+
let resultPromise = null;
|
|
173
|
+
const session = {
|
|
174
|
+
on(event, handler) {
|
|
175
|
+
if (event === "message") messageHandlers.push(handler);
|
|
176
|
+
if (event === "step") stepHandlers.push(handler);
|
|
177
|
+
return session;
|
|
178
|
+
},
|
|
179
|
+
send(_text) {
|
|
180
|
+
},
|
|
181
|
+
get result() {
|
|
182
|
+
if (!resultPromise) {
|
|
183
|
+
resultPromise = runExplore(prompt, {
|
|
184
|
+
onStep: (step) => {
|
|
185
|
+
for (const handler of stepHandlers) handler(step);
|
|
186
|
+
},
|
|
187
|
+
onMessage: (msg, reply) => {
|
|
188
|
+
if (messageHandlers.length > 0) {
|
|
189
|
+
for (const handler of messageHandlers) handler(msg, reply);
|
|
190
|
+
} else {
|
|
191
|
+
reply("");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return resultPromise;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
return session;
|
|
200
|
+
},
|
|
201
|
+
/** Stream exploration events as an async generator */
|
|
202
|
+
async *stream(prompt) {
|
|
203
|
+
const events = [];
|
|
204
|
+
let resolveNext = null;
|
|
205
|
+
let done = false;
|
|
206
|
+
const resultPromise = runExplore(prompt, {
|
|
207
|
+
onStep: (step) => {
|
|
208
|
+
events.push({
|
|
209
|
+
type: "step",
|
|
210
|
+
step: step.step,
|
|
211
|
+
searchRequest: step.searchRequest,
|
|
212
|
+
contextsFound: step.contextsFound,
|
|
213
|
+
isFinal: step.isFinal
|
|
214
|
+
});
|
|
215
|
+
resolveNext?.();
|
|
216
|
+
},
|
|
217
|
+
onMessage: (msg, reply) => {
|
|
218
|
+
events.push({
|
|
219
|
+
type: "message",
|
|
220
|
+
from: msg.from,
|
|
221
|
+
content: msg.content,
|
|
222
|
+
timestamp: msg.timestamp
|
|
223
|
+
});
|
|
224
|
+
resolveNext?.();
|
|
225
|
+
reply("Continue with your best judgment.");
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
while (!done) {
|
|
229
|
+
if (events.length > 0) {
|
|
230
|
+
yield events.shift();
|
|
231
|
+
} else {
|
|
232
|
+
const raceResult = await Promise.race([
|
|
233
|
+
resultPromise.then((r) => ({ type: "done", result: r })),
|
|
234
|
+
new Promise((resolve) => {
|
|
235
|
+
resolveNext = () => resolve({ type: "event" });
|
|
236
|
+
})
|
|
237
|
+
]);
|
|
238
|
+
if (raceResult.type === "done") {
|
|
239
|
+
while (events.length > 0) {
|
|
240
|
+
yield events.shift();
|
|
241
|
+
}
|
|
242
|
+
done = true;
|
|
243
|
+
return raceResult.result;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return await resultPromise;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function deduplicateContexts(contexts) {
|
|
252
|
+
const map = /* @__PURE__ */ new Map();
|
|
253
|
+
for (const ctx of contexts) {
|
|
254
|
+
const existing = map.get(ctx.file);
|
|
255
|
+
if (!existing || ctx.content.length > existing.content.length) {
|
|
256
|
+
map.set(ctx.file, ctx);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return Array.from(map.values());
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export {
|
|
263
|
+
createExploreSubagent
|
|
264
|
+
};
|
|
265
|
+
//# sourceMappingURL=chunk-GQX4PKXZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../subagents/vercel.ts"],"sourcesContent":["/**\n * Vercel AI SDK adapter for Explore subagent\n */\n\nimport { tool, generateText, stepCountIs } from 'ai';\nimport type { LanguageModel } from 'ai';\nimport { z } from 'zod';\nimport { WarpGrepClient } from '../tools/warp_grep/client.js';\nimport { formatResult } from '../tools/warp_grep/client.js';\nimport type { WarpGrepContext } from '../tools/warp_grep/types.js';\nimport { getSystemPrompt, CODEBASE_SEARCH_TOOL, SEND_MESSAGE_TOOL } from './prompts.js';\nimport type {\n ExploreSubagentConfig,\n ExploreResult,\n ExploreStep,\n ExploreSession,\n ExploreEvent,\n SubagentMessage,\n MessageHandler,\n StepHandler,\n} from './types.js';\n\n/** Config for Vercel AI SDK Explore subagent */\nexport interface VercelExploreConfig extends ExploreSubagentConfig {\n /** Vercel AI SDK model instance */\n model: LanguageModel;\n}\n\nconst DEFAULT_MAX_TURNS: Record<string, number> = {\n quick: 3,\n medium: 6,\n thorough: 12,\n};\n\nfunction getMaxTurns(config: ExploreSubagentConfig): number {\n return config.maxTurns ?? DEFAULT_MAX_TURNS[config.thoroughness ?? 'medium'] ?? 6;\n}\n\n/**\n * Create an Explore subagent using Vercel AI SDK\n */\nexport function createExploreSubagent(config: VercelExploreConfig) {\n if (!config.repoRoot) {\n throw new Error('repoRoot is required for Explore subagent');\n }\n\n const warpGrep = new WarpGrepClient({\n morphApiKey: config.morphApiKey,\n });\n\n const thoroughness = config.thoroughness ?? 'medium';\n const replyTimeout = config.replyTimeout ?? 30_000;\n\n /** Run the agent loop and collect results */\n async function runExplore(\n prompt: string,\n callbacks: {\n onStep?: StepHandler;\n onMessage?: MessageHandler;\n } = {},\n ): Promise<ExploreResult> {\n const startTime = Date.now();\n const allContexts: WarpGrepContext[] = [];\n let searchCount = 0;\n\n const timeoutMs = config.timeout;\n const timeoutPromise = timeoutMs\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Exploration timed out after ${timeoutMs}ms`)), timeoutMs),\n )\n : null;\n\n const runPromise = (async (): Promise<ExploreResult> => {\n try {\n const codebaseSearchSchema = z.object({\n searchRequest: z.string().describe('Natural language description of what to search for'),\n });\n\n const sendMessageSchema = z.object({\n message: z.string().describe('The message to send to the orchestrator'),\n });\n\n const result = await generateText({\n model: config.model,\n system: getSystemPrompt(thoroughness),\n prompt,\n tools: {\n codebase_search: tool({\n description: CODEBASE_SEARCH_TOOL.description,\n inputSchema: codebaseSearchSchema,\n execute: async (params: z.infer<typeof codebaseSearchSchema>) => {\n searchCount++;\n const warpResult = await warpGrep.execute({\n searchTerm: params.searchRequest,\n repoRoot: config.repoRoot,\n excludes: config.excludes,\n includes: config.includes,\n });\n\n if (warpResult.contexts) {\n allContexts.push(...warpResult.contexts);\n }\n\n callbacks.onStep?.({\n step: searchCount,\n searchRequest: params.searchRequest,\n contextsFound: warpResult.contexts?.length ?? 0,\n isFinal: false,\n });\n\n return formatResult(warpResult);\n },\n }),\n send_message: tool({\n description: SEND_MESSAGE_TOOL.description,\n inputSchema: sendMessageSchema,\n execute: async (params: z.infer<typeof sendMessageSchema>) => {\n const subagentMsg: SubagentMessage = {\n from: 'explore',\n content: params.message,\n timestamp: Date.now(),\n };\n\n // Create a promise that waits for the host's reply\n const replyPromise = new Promise<string>((resolve) => {\n // Emit the message to the host via callback\n if (callbacks.onMessage) {\n callbacks.onMessage(subagentMsg, (replyText: string) => {\n resolve(replyText);\n });\n } else {\n // No handler registered, auto-resolve after timeout\n setTimeout(() => resolve(''), replyTimeout);\n }\n });\n\n // Wait for reply with timeout\n const reply = await Promise.race([\n replyPromise,\n new Promise<string>((resolve) =>\n setTimeout(() => resolve(''), replyTimeout),\n ),\n ]);\n\n if (reply) {\n return `Response from orchestrator: ${reply}`;\n }\n return 'No response. Continue with your best judgment.';\n },\n }),\n },\n stopWhen: stepCountIs(getMaxTurns(config)),\n });\n\n // Emit final step\n callbacks.onStep?.({\n step: searchCount,\n searchRequest: '',\n contextsFound: allContexts.length,\n isFinal: true,\n });\n\n // Deduplicate contexts by file path\n const uniqueContexts = deduplicateContexts(allContexts);\n\n return {\n success: true,\n summary: result.text || 'Exploration completed but no summary was generated.',\n contexts: uniqueContexts,\n searchCount,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n summary: '',\n contexts: deduplicateContexts(allContexts),\n searchCount,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n })();\n\n if (timeoutPromise) {\n try {\n return await Promise.race([runPromise, timeoutPromise]);\n } catch (error) {\n return {\n success: false,\n summary: '',\n contexts: deduplicateContexts(allContexts),\n searchCount,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n return runPromise;\n }\n\n const exploreToolSchema = z.object({\n searchRequest: z\n .string()\n .describe('What to explore in the codebase. Be specific about what you want to understand.'),\n });\n\n /** The Vercel AI tool for use in parent agents */\n const exploreTool = tool({\n description:\n 'Explore a codebase to answer questions about code structure, find implementations, trace call chains, and understand architecture. Returns a summary of findings. Use this for broad exploration rather than pinpoint keyword searches.',\n inputSchema: exploreToolSchema,\n execute: async (params: z.infer<typeof exploreToolSchema>) => {\n const result = await runExplore(params.searchRequest);\n return {\n success: result.success,\n summary: result.summary,\n searchCount: result.searchCount,\n error: result.error,\n };\n },\n });\n\n return {\n /** Vercel AI SDK tool for use as a tool in parent agents */\n tool: exploreTool,\n\n /** Run exploration with messaging support */\n run(prompt: string): ExploreSession {\n const messageHandlers: MessageHandler[] = [];\n const stepHandlers: StepHandler[] = [];\n\n // Start the run lazily (after handlers are attached)\n let resultPromise: Promise<ExploreResult> | null = null;\n\n const session: ExploreSession = {\n on(event: string, handler: any) {\n if (event === 'message') messageHandlers.push(handler);\n if (event === 'step') stepHandlers.push(handler);\n return session;\n },\n send(_text: string) {\n // Convenience method — pause-and-ask flow uses the reply callback\n },\n get result() {\n if (!resultPromise) {\n resultPromise = runExplore(prompt, {\n onStep: (step) => {\n for (const handler of stepHandlers) handler(step);\n },\n onMessage: (msg, reply) => {\n if (messageHandlers.length > 0) {\n for (const handler of messageHandlers) handler(msg, reply);\n } else {\n // No handlers, auto-reply\n reply('');\n }\n },\n });\n }\n return resultPromise;\n },\n };\n\n return session;\n },\n\n /** Stream exploration events as an async generator */\n async *stream(prompt: string): AsyncGenerator<ExploreEvent, ExploreResult, undefined> {\n const events: ExploreEvent[] = [];\n let resolveNext: (() => void) | null = null;\n let done = false;\n\n const resultPromise = runExplore(prompt, {\n onStep: (step) => {\n events.push({\n type: 'step',\n step: step.step,\n searchRequest: step.searchRequest,\n contextsFound: step.contextsFound,\n isFinal: step.isFinal,\n });\n resolveNext?.();\n },\n onMessage: (msg, reply) => {\n events.push({\n type: 'message',\n from: msg.from,\n content: msg.content,\n timestamp: msg.timestamp,\n });\n resolveNext?.();\n // Auto-reply in streaming mode\n reply('Continue with your best judgment.');\n },\n });\n\n // Yield events as they come in\n while (!done) {\n if (events.length > 0) {\n yield events.shift()!;\n } else {\n // Check if the result is already done\n const raceResult = await Promise.race([\n resultPromise.then((r) => ({ type: 'done' as const, result: r })),\n new Promise<{ type: 'event' }>((resolve) => {\n resolveNext = () => resolve({ type: 'event' });\n }),\n ]);\n\n if (raceResult.type === 'done') {\n // Drain remaining events\n while (events.length > 0) {\n yield events.shift()!;\n }\n done = true;\n return raceResult.result;\n }\n }\n }\n\n return await resultPromise;\n },\n };\n}\n\n/** Deduplicate contexts, keeping the latest version of each file */\nfunction deduplicateContexts(contexts: WarpGrepContext[]): WarpGrepContext[] {\n const map = new Map<string, WarpGrepContext>();\n for (const ctx of contexts) {\n const existing = map.get(ctx.file);\n if (!existing || ctx.content.length > existing.content.length) {\n map.set(ctx.file, ctx);\n }\n }\n return Array.from(map.values());\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
executeCodebaseSearch
|
|
3
|
+
} from "./chunk-EEBGEMOO.js";
|
|
1
4
|
import {
|
|
2
5
|
CODEBASE_SEARCH_DESCRIPTION,
|
|
3
6
|
CODEBASE_SEARCH_SYSTEM_PROMPT
|
|
4
7
|
} from "./chunk-YQMPVJ2L.js";
|
|
5
|
-
import {
|
|
6
|
-
executeCodebaseSearch
|
|
7
|
-
} from "./chunk-4546AOKY.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-
|
|
83
|
+
//# sourceMappingURL=chunk-MHNCFELG.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ProfilesClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7RCHQN7F.js";
|
|
4
4
|
import {
|
|
5
5
|
buildEmbedCode,
|
|
6
6
|
buildLiveIframe,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
fetchWithRetry,
|
|
12
12
|
withTimeout
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-B55ZEX4M.js";
|
|
14
14
|
|
|
15
15
|
// tools/browser/core.ts
|
|
16
16
|
var DEFAULT_CONFIG = {
|
|
@@ -609,4 +609,4 @@ export {
|
|
|
609
609
|
getWebp,
|
|
610
610
|
checkHealth
|
|
611
611
|
};
|
|
612
|
-
//# sourceMappingURL=chunk-
|
|
612
|
+
//# sourceMappingURL=chunk-NEVPVOTT.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-2HMEZZKK.js";
|
|
5
5
|
import {
|
|
6
6
|
executeBrowserTask
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NEVPVOTT.js";
|
|
8
8
|
import {
|
|
9
9
|
__export
|
|
10
10
|
} from "./chunk-PZ5AY32C.js";
|
|
@@ -93,4 +93,4 @@ export {
|
|
|
93
93
|
createBrowserTool,
|
|
94
94
|
openai_exports
|
|
95
95
|
};
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
96
|
+
//# sourceMappingURL=chunk-NGHLDI64.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
executeEditFile
|
|
3
|
-
} from "./chunk-3GEXJ6WJ.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-MTD2JOO7.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-
|
|
82
|
+
//# sourceMappingURL=chunk-OICUUS5Y.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-2HMEZZKK.js";
|
|
4
4
|
import {
|
|
5
5
|
executeBrowserTask
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NEVPVOTT.js";
|
|
7
7
|
import {
|
|
8
8
|
__export
|
|
9
9
|
} from "./chunk-PZ5AY32C.js";
|
|
@@ -54,4 +54,4 @@ export {
|
|
|
54
54
|
browserTool,
|
|
55
55
|
vercel_exports
|
|
56
56
|
};
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-TCXBKB7P.js.map
|
|
@@ -8,19 +8,19 @@ import {
|
|
|
8
8
|
toolListDirectory,
|
|
9
9
|
toolRead
|
|
10
10
|
} from "./chunk-YLT4PSXT.js";
|
|
11
|
-
import {
|
|
12
|
-
AGENT_CONFIG,
|
|
13
|
-
DEFAULT_MODEL
|
|
14
|
-
} from "./chunk-DKODF3YG.js";
|
|
15
11
|
import {
|
|
16
12
|
formatAgentToolOutput
|
|
17
13
|
} from "./chunk-QRXG5CAZ.js";
|
|
18
14
|
import {
|
|
19
15
|
LLMResponseParser
|
|
20
16
|
} from "./chunk-VCKJ22DX.js";
|
|
17
|
+
import {
|
|
18
|
+
AGENT_CONFIG,
|
|
19
|
+
DEFAULT_MODEL
|
|
20
|
+
} from "./chunk-DKODF3YG.js";
|
|
21
21
|
import {
|
|
22
22
|
SDK_VERSION
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-6W3X76KE.js";
|
|
24
24
|
|
|
25
25
|
// tools/warp_grep/agent/runner.ts
|
|
26
26
|
import OpenAI from "openai";
|
|
@@ -31,9 +31,11 @@ async function callModel(messages, model, options = {}) {
|
|
|
31
31
|
const baseUrl = options.morphApiUrl || DEFAULT_API_URL;
|
|
32
32
|
const apiKey = options.morphApiKey || process.env.MORPH_API_KEY || "";
|
|
33
33
|
const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;
|
|
34
|
+
const parsedUrl = new URL(baseUrl);
|
|
35
|
+
const baseURL = parsedUrl.pathname === "/" ? `${baseUrl}/v1` : baseUrl;
|
|
34
36
|
const client = new OpenAI({
|
|
35
37
|
apiKey,
|
|
36
|
-
baseURL
|
|
38
|
+
baseURL,
|
|
37
39
|
maxRetries: options.retryConfig?.maxRetries,
|
|
38
40
|
timeout: timeoutMs,
|
|
39
41
|
defaultHeaders: { "X-Morph-SDK-Version": SDK_VERSION }
|
|
@@ -401,4 +403,4 @@ export {
|
|
|
401
403
|
runWarpGrep,
|
|
402
404
|
runWarpGrepStreaming
|
|
403
405
|
};
|
|
404
|
-
//# sourceMappingURL=chunk-
|
|
406
|
+
//# sourceMappingURL=chunk-ULMSWACH.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 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 { SDK_VERSION } from '../../../version.js';\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 // If the URL has a custom path (e.g. /api/gateway), use it as-is as the\n // OpenAI-compatible baseURL. Otherwise append /v1 for the standard Morph API.\n const parsedUrl = new URL(baseUrl);\n const baseURL = parsedUrl.pathname === '/' ? `${baseUrl}/v1` : baseUrl;\n\n const client = new OpenAI({\n apiKey,\n baseURL,\n maxRetries: options.retryConfig?.maxRetries,\n timeout: timeoutMs,\n defaultHeaders: { 'X-Morph-SDK-Version': SDK_VERSION },\n });\n\n const MAX_EMPTY_RETRIES = 1;\n\n for (let attempt = 0; attempt <= MAX_EMPTY_RETRIES; attempt++) {\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 const defaultMsg =\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 const errorText = error.message?.trim();\n throw new Error(errorText || defaultMsg);\n }\n throw error;\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content;\n\n if (content && typeof content === 'string') {\n return content;\n }\n\n // Last attempt — throw with diagnostics\n if (attempt === MAX_EMPTY_RETRIES) {\n const finishReason = choice?.finish_reason ?? 'unknown';\n const hasToolCalls = Array.isArray(choice?.message?.tool_calls) && choice.message.tool_calls.length > 0;\n const choicesLen = data?.choices?.length ?? 0;\n const contentType = content === null ? 'null' : content === undefined ? 'undefined' : typeof content;\n\n throw new Error(\n `Invalid response from model: content=${contentType}, finish_reason=${finishReason}, ` +\n `has_tool_calls=${hasToolCalls}, choices_length=${choicesLen}`\n );\n }\n\n // Retry — brief pause before next attempt\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n\n // Unreachable, but satisfies TypeScript\n throw new Error('Invalid response from model');\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 model = config.model || DEFAULT_MODEL;\n const messages: ChatMessage[] = [];\n\n const maxTurns = AGENT_CONFIG.MAX_TURNS;\n\n const initialStateStart = Date.now();\n const initialState = await buildInitialState(repoRoot, config.searchTerm, config.provider, { search_type: config.search_type });\n timings.initial_state_ms = Date.now() - initialStateStart;\n\n messages.push({ role: 'user', content: initialState });\n\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 const errMsg = e instanceof Error ? e.message : String(e);\n console.error(`[warp_grep] Morph API call failed on turn ${turn}:`, errMsg);\n errors.push({ message: errMsg });\n return '';\n });\n turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n\n if (!assistantContent) {\n console.error(`[warp_grep] Empty response from Morph API on turn ${turn}. Errors so far:`, errors);\n timings.turns!.push(turnMetrics);\n break;\n }\n messages.push({ role: 'assistant', content: assistantContent });\n\n // parse tool calls\n const toolCalls = parser.parse(assistantContent);\n if (toolCalls.length === 0) {\n console.error(`[warp_grep] No tool calls parsed on turn ${turn}. Assistant content (first 500 chars):`, assistantContent.slice(0, 500));\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; context_lines?: number; case_sensitive?: boolean };\n allPromises.push(\n toolGrep(provider, args).then(\n ({ output }) => formatAgentToolOutput('grep', args, output),\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),\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),\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 const textResult = (fc.arguments as any)?.textResult as string | undefined;\n finishMeta = { files };\n terminationReason = 'completed';\n\n // Text-only finish: model returned a text response instead of file references\n if (files.length === 0) {\n const payload = textResult || 'No relevant code found.';\n timings.turns!.push(turnMetrics);\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta },\n timings: timings as WarpGrepExecutionMetrics,\n };\n }\n\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\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 model = config.model || DEFAULT_MODEL;\n const messages: ChatMessage[] = [];\n\n const maxTurns = AGENT_CONFIG.MAX_TURNS;\n\n const initialStateStart = Date.now();\n const initialState = await buildInitialState(repoRoot, config.searchTerm, config.provider, { search_type: config.search_type });\n timings.initial_state_ms = Date.now() - initialStateStart;\n\n messages.push({ role: 'user', content: initialState });\n\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 const errMsg = e instanceof Error ? e.message : String(e);\n console.error(`[warp_grep:stream] Morph API call failed on turn ${turn}:`, errMsg);\n errors.push({ message: errMsg });\n return '';\n });\n turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n\n if (!assistantContent) {\n console.error(`[warp_grep:stream] Empty response from Morph API on turn ${turn}. Errors so far:`, errors);\n timings.turns!.push(turnMetrics);\n break;\n }\n messages.push({ role: 'assistant', content: assistantContent });\n\n // parse tool calls\n const toolCalls = parser.parse(assistantContent);\n if (toolCalls.length === 0) {\n console.error(`[warp_grep:stream] No tool calls parsed on turn ${turn}. Assistant content (first 500 chars):`, assistantContent.slice(0, 500));\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; context_lines?: number; case_sensitive?: boolean };\n allPromises.push(\n toolGrep(provider, args).then(\n ({ output }) => formatAgentToolOutput('grep', args, output),\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),\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),\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 const textResult = (fc.arguments as any)?.textResult as string | undefined;\n finishMeta = { files };\n terminationReason = 'completed';\n\n // Text-only finish\n if (files.length === 0) {\n const payload = textResult || 'No relevant code found.';\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta },\n timings: timings as WarpGrepExecutionMetrics,\n };\n }\n\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":["payload"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
executeCodebaseSearch
|
|
3
|
+
} from "./chunk-EEBGEMOO.js";
|
|
1
4
|
import {
|
|
2
5
|
CODEBASE_SEARCH_DESCRIPTION
|
|
3
6
|
} from "./chunk-YQMPVJ2L.js";
|
|
4
|
-
import {
|
|
5
|
-
executeCodebaseSearch
|
|
6
|
-
} from "./chunk-4546AOKY.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-
|
|
58
|
+
//# sourceMappingURL=chunk-XIEU3N3R.js.map
|
|
@@ -1,45 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createGitHubSearchTool as createGitHubSearchTool2,
|
|
3
|
-
createWarpGrepTool as createWarpGrepTool2
|
|
4
|
-
} from "./chunk-AVIE6SRT.js";
|
|
5
1
|
import {
|
|
6
2
|
createGitHubSearchTool,
|
|
7
3
|
createWarpGrepTool
|
|
8
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6WSZDCGP.js";
|
|
9
5
|
import {
|
|
10
6
|
createGitHubSearchTool as createGitHubSearchTool3,
|
|
11
7
|
createWarpGrepTool as createWarpGrepTool3
|
|
12
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-EHRKLQ62.js";
|
|
13
9
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
createCodebaseSearchTool
|
|
18
|
-
} from "./chunk-HRJENFMZ.js";
|
|
10
|
+
createGitHubSearchTool as createGitHubSearchTool2,
|
|
11
|
+
createWarpGrepTool as createWarpGrepTool2
|
|
12
|
+
} from "./chunk-3J74OXN6.js";
|
|
19
13
|
import {
|
|
20
14
|
createCodebaseSearchTool as createCodebaseSearchTool3
|
|
21
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-XIEU3N3R.js";
|
|
22
16
|
import {
|
|
23
17
|
createCodebaseSearchTool as createCodebaseSearchTool2
|
|
24
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-MHNCFELG.js";
|
|
19
|
+
import {
|
|
20
|
+
createCodebaseSearchTool
|
|
21
|
+
} from "./chunk-4J5UW34J.js";
|
|
25
22
|
import {
|
|
26
23
|
CodebaseSearchClient
|
|
27
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-EEBGEMOO.js";
|
|
28
25
|
import {
|
|
29
26
|
createEditFileTool
|
|
30
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-ZYN64ZVG.js";
|
|
31
28
|
import {
|
|
32
29
|
createEditFileTool as createEditFileTool3
|
|
33
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-73ZLTWKF.js";
|
|
34
31
|
import {
|
|
35
32
|
createEditFileTool as createEditFileTool2
|
|
36
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-OICUUS5Y.js";
|
|
37
34
|
import {
|
|
38
35
|
FastApplyClient
|
|
39
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-MTD2JOO7.js";
|
|
40
37
|
import {
|
|
41
38
|
BrowserClient
|
|
42
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-NEVPVOTT.js";
|
|
40
|
+
import {
|
|
41
|
+
createExploreSubagent
|
|
42
|
+
} from "./chunk-3T5W2D2W.js";
|
|
43
|
+
import {
|
|
44
|
+
createExploreSubagent as createExploreSubagent2
|
|
45
|
+
} from "./chunk-GQX4PKXZ.js";
|
|
46
|
+
import {
|
|
47
|
+
WarpGrepClient
|
|
48
|
+
} from "./chunk-5CBMLTG5.js";
|
|
43
49
|
import {
|
|
44
50
|
CompactClient
|
|
45
51
|
} from "./chunk-AGFVQOGJ.js";
|
|
@@ -48,7 +54,7 @@ import {
|
|
|
48
54
|
GeminiRouter,
|
|
49
55
|
OpenAIRouter,
|
|
50
56
|
RawRouter
|
|
51
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-DRAQDTSR.js";
|
|
52
58
|
import {
|
|
53
59
|
MorphGit
|
|
54
60
|
} from "./chunk-LE66XCOI.js";
|
|
@@ -511,6 +517,22 @@ var AnthropicToolFactory = class {
|
|
|
511
517
|
morphApiKey: this.config.apiKey
|
|
512
518
|
});
|
|
513
519
|
}
|
|
520
|
+
/**
|
|
521
|
+
* Create an Explore subagent that searches the codebase and returns summaries
|
|
522
|
+
*
|
|
523
|
+
* @param client - Anthropic SDK client instance
|
|
524
|
+
* @param model - Model name (e.g., 'claude-haiku-4-5-20251001')
|
|
525
|
+
* @param toolConfig - Subagent configuration (morphApiKey inherited from MorphClient)
|
|
526
|
+
* @returns Explore subagent with .tool, .run(), and .stream() methods
|
|
527
|
+
*/
|
|
528
|
+
createExploreSubagent(client, model, toolConfig) {
|
|
529
|
+
return createExploreSubagent({
|
|
530
|
+
...toolConfig,
|
|
531
|
+
client,
|
|
532
|
+
model,
|
|
533
|
+
morphApiKey: this.config.apiKey
|
|
534
|
+
});
|
|
535
|
+
}
|
|
514
536
|
};
|
|
515
537
|
|
|
516
538
|
// factories/vercel.ts
|
|
@@ -566,6 +588,20 @@ var VercelToolFactory = class {
|
|
|
566
588
|
morphApiKey: this.config.apiKey
|
|
567
589
|
});
|
|
568
590
|
}
|
|
591
|
+
/**
|
|
592
|
+
* Create an Explore subagent that searches the codebase and returns summaries
|
|
593
|
+
*
|
|
594
|
+
* @param model - Vercel AI SDK model instance
|
|
595
|
+
* @param toolConfig - Subagent configuration (morphApiKey inherited from MorphClient)
|
|
596
|
+
* @returns Explore subagent with .tool, .run(), and .stream() methods
|
|
597
|
+
*/
|
|
598
|
+
createExploreSubagent(model, toolConfig) {
|
|
599
|
+
return createExploreSubagent2({
|
|
600
|
+
...toolConfig,
|
|
601
|
+
model,
|
|
602
|
+
morphApiKey: this.config.apiKey
|
|
603
|
+
});
|
|
604
|
+
}
|
|
569
605
|
};
|
|
570
606
|
|
|
571
607
|
// client.ts
|
|
@@ -694,4 +730,4 @@ export {
|
|
|
694
730
|
VercelToolFactory,
|
|
695
731
|
MorphClient
|
|
696
732
|
};
|
|
697
|
-
//# sourceMappingURL=chunk-
|
|
733
|
+
//# sourceMappingURL=chunk-XUDE6SOY.js.map
|