@morphllm/morphsdk 0.2.57 → 0.2.59
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/anthropic-CaFUHxBW.d.ts +89 -0
- package/dist/{chunk-6X5UOY7B.js → chunk-2CASO3ZO.js} +46 -79
- package/dist/chunk-2CASO3ZO.js.map +1 -0
- package/dist/chunk-374N3GIA.js +118 -0
- package/dist/chunk-374N3GIA.js.map +1 -0
- package/dist/chunk-3IQIT6MC.js +65 -0
- package/dist/chunk-3IQIT6MC.js.map +1 -0
- package/dist/chunk-4VGOBA2J.js +57 -0
- package/dist/chunk-4VGOBA2J.js.map +1 -0
- package/dist/chunk-527P5X2E.js +98 -0
- package/dist/chunk-527P5X2E.js.map +1 -0
- package/dist/chunk-6N6ZYZYD.js +74 -0
- package/dist/chunk-6N6ZYZYD.js.map +1 -0
- package/dist/chunk-6Y5JB4JC.js +195 -0
- package/dist/chunk-6Y5JB4JC.js.map +1 -0
- package/dist/{chunk-TICMYDII.js → chunk-APP75CBN.js} +33 -16
- package/dist/chunk-APP75CBN.js.map +1 -0
- package/dist/{chunk-QFIHUCTF.js → chunk-FN4EP3WY.js} +19 -19
- package/dist/chunk-FN4EP3WY.js.map +1 -0
- package/dist/chunk-ILJ3J5IA.js +72 -0
- package/dist/chunk-ILJ3J5IA.js.map +1 -0
- package/dist/chunk-ISWL67SF.js +1 -0
- package/dist/chunk-KW7OEGZK.js +9 -0
- package/dist/chunk-KW7OEGZK.js.map +1 -0
- package/dist/chunk-Q5AHGIQO.js +205 -0
- package/dist/chunk-Q5AHGIQO.js.map +1 -0
- package/dist/{chunk-OXHGFHEU.js → chunk-VJU3BRET.js} +3 -3
- package/dist/chunk-VJU3BRET.js.map +1 -0
- package/dist/{chunk-TJIUA27P.js → chunk-XT5ZO6ES.js} +9 -5
- package/dist/chunk-XT5ZO6ES.js.map +1 -0
- package/dist/{chunk-LVPVVLTI.js → chunk-YV75OQTE.js} +105 -17
- package/dist/chunk-YV75OQTE.js.map +1 -0
- package/dist/{chunk-ZJIIICRA.js → chunk-ZO4PPFCZ.js} +60 -29
- package/dist/chunk-ZO4PPFCZ.js.map +1 -0
- package/dist/{client-CFoR--IU.d.ts → client-CextMMm9.d.ts} +10 -15
- package/dist/client.cjs +689 -343
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.ts +3 -2
- package/dist/client.js +15 -15
- package/dist/finish-kXAcUJyB.d.ts +33 -0
- package/dist/gemini-CE80Pbdy.d.ts +117 -0
- package/dist/git/client.cjs +2 -2
- package/dist/git/client.cjs.map +1 -1
- package/dist/git/client.d.ts +1 -1
- package/dist/git/client.js +1 -1
- package/dist/git/index.cjs +2 -2
- package/dist/git/index.cjs.map +1 -1
- package/dist/git/index.js +1 -1
- package/dist/git/types.cjs.map +1 -1
- package/dist/git/types.d.ts +1 -1
- package/dist/index.cjs +702 -343
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +17 -16
- package/dist/openai-Fvpqln7F.d.ts +89 -0
- package/dist/tools/warp_grep/agent/config.cjs +8 -4
- package/dist/tools/warp_grep/agent/config.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/config.d.ts +7 -2
- package/dist/tools/warp_grep/agent/config.js +1 -1
- package/dist/tools/warp_grep/agent/formatter.cjs +32 -15
- package/dist/tools/warp_grep/agent/formatter.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/formatter.d.ts +1 -1
- package/dist/tools/warp_grep/agent/formatter.js +1 -1
- package/dist/tools/warp_grep/agent/parser.cjs +104 -17
- package/dist/tools/warp_grep/agent/parser.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/parser.d.ts +3 -5
- package/dist/tools/warp_grep/agent/parser.js +1 -3
- package/dist/tools/warp_grep/agent/prompt.cjs +132 -56
- package/dist/tools/warp_grep/agent/prompt.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/prompt.d.ts +1 -1
- package/dist/tools/warp_grep/agent/prompt.js +1 -1
- package/dist/tools/warp_grep/agent/runner.cjs +459 -192
- package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/runner.d.ts +1 -0
- package/dist/tools/warp_grep/agent/runner.js +6 -8
- package/dist/tools/warp_grep/agent/types.cjs.map +1 -1
- package/dist/tools/warp_grep/agent/types.d.ts +9 -2
- package/dist/tools/warp_grep/anthropic.cjs +650 -260
- package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
- package/dist/tools/warp_grep/anthropic.d.ts +4 -74
- package/dist/tools/warp_grep/anthropic.js +13 -15
- package/dist/tools/warp_grep/client.cjs +1593 -0
- package/dist/tools/warp_grep/client.cjs.map +1 -0
- package/dist/tools/warp_grep/client.d.ts +87 -0
- package/dist/tools/warp_grep/client.js +26 -0
- package/dist/tools/warp_grep/gemini.cjs +1587 -0
- package/dist/tools/warp_grep/gemini.cjs.map +1 -0
- package/dist/tools/warp_grep/gemini.d.ts +7 -0
- package/dist/tools/warp_grep/gemini.js +34 -0
- package/dist/tools/warp_grep/harness.cjs +556 -220
- package/dist/tools/warp_grep/harness.cjs.map +1 -1
- package/dist/tools/warp_grep/harness.d.ts +50 -119
- package/dist/tools/warp_grep/harness.js +33 -41
- package/dist/tools/warp_grep/harness.js.map +1 -1
- package/dist/tools/warp_grep/index.cjs +812 -346
- package/dist/tools/warp_grep/index.cjs.map +1 -1
- package/dist/tools/warp_grep/index.d.ts +11 -6
- package/dist/tools/warp_grep/index.js +43 -22
- package/dist/tools/warp_grep/openai.cjs +650 -258
- package/dist/tools/warp_grep/openai.cjs.map +1 -1
- package/dist/tools/warp_grep/openai.d.ts +4 -74
- package/dist/tools/warp_grep/openai.js +13 -13
- package/dist/tools/warp_grep/providers/local.cjs +66 -27
- package/dist/tools/warp_grep/providers/local.cjs.map +1 -1
- package/dist/tools/warp_grep/providers/local.d.ts +4 -9
- package/dist/tools/warp_grep/providers/local.js +2 -2
- package/dist/tools/warp_grep/providers/remote.cjs +211 -0
- package/dist/tools/warp_grep/providers/remote.cjs.map +1 -0
- package/dist/tools/warp_grep/providers/remote.d.ts +67 -0
- package/dist/tools/warp_grep/providers/remote.js +9 -0
- package/dist/tools/warp_grep/providers/types.cjs.map +1 -1
- package/dist/tools/warp_grep/providers/types.d.ts +7 -15
- package/dist/tools/warp_grep/vercel.cjs +662 -277
- package/dist/tools/warp_grep/vercel.cjs.map +1 -1
- package/dist/tools/warp_grep/vercel.d.ts +4 -51
- package/dist/tools/warp_grep/vercel.js +16 -14
- package/dist/types-a_hxdPI6.d.ts +144 -0
- package/dist/vercel-3yjvfmVB.d.ts +66 -0
- package/package.json +12 -2
- package/dist/chunk-6X5UOY7B.js.map +0 -1
- package/dist/chunk-73RQWOQC.js +0 -16
- package/dist/chunk-73RQWOQC.js.map +0 -1
- package/dist/chunk-7OQOOB3R.js +0 -1
- package/dist/chunk-CFF636UC.js +0 -70
- package/dist/chunk-CFF636UC.js.map +0 -1
- package/dist/chunk-EK7OQPWD.js +0 -44
- package/dist/chunk-EK7OQPWD.js.map +0 -1
- package/dist/chunk-GJ5TYNRD.js +0 -107
- package/dist/chunk-GJ5TYNRD.js.map +0 -1
- package/dist/chunk-HQO45BAJ.js +0 -14
- package/dist/chunk-HQO45BAJ.js.map +0 -1
- package/dist/chunk-IMYQOKFO.js +0 -83
- package/dist/chunk-IMYQOKFO.js.map +0 -1
- package/dist/chunk-KBQWGT5L.js +0 -77
- package/dist/chunk-KBQWGT5L.js.map +0 -1
- package/dist/chunk-LVPVVLTI.js.map +0 -1
- package/dist/chunk-OXHGFHEU.js.map +0 -1
- package/dist/chunk-QFIHUCTF.js.map +0 -1
- package/dist/chunk-TICMYDII.js.map +0 -1
- package/dist/chunk-TJIUA27P.js.map +0 -1
- package/dist/chunk-WETRQJGU.js +0 -129
- package/dist/chunk-WETRQJGU.js.map +0 -1
- package/dist/chunk-ZJIIICRA.js.map +0 -1
- package/dist/core-CpkYEi_T.d.ts +0 -158
- package/dist/tools/warp_grep/tools/analyse.cjs +0 -40
- package/dist/tools/warp_grep/tools/analyse.cjs.map +0 -1
- package/dist/tools/warp_grep/tools/analyse.d.ts +0 -10
- package/dist/tools/warp_grep/tools/analyse.js +0 -8
- package/dist/tools/warp_grep/tools/finish.cjs +0 -69
- package/dist/tools/warp_grep/tools/finish.cjs.map +0 -1
- package/dist/tools/warp_grep/tools/finish.d.ts +0 -10
- package/dist/tools/warp_grep/tools/finish.js +0 -10
- package/dist/tools/warp_grep/tools/grep.cjs +0 -38
- package/dist/tools/warp_grep/tools/grep.cjs.map +0 -1
- package/dist/tools/warp_grep/tools/grep.d.ts +0 -8
- package/dist/tools/warp_grep/tools/grep.js +0 -15
- package/dist/tools/warp_grep/tools/grep.js.map +0 -1
- package/dist/tools/warp_grep/tools/read.cjs +0 -38
- package/dist/tools/warp_grep/tools/read.cjs.map +0 -1
- package/dist/tools/warp_grep/tools/read.d.ts +0 -9
- package/dist/tools/warp_grep/tools/read.js +0 -8
- package/dist/tools/warp_grep/utils/format.cjs +0 -42
- package/dist/tools/warp_grep/utils/format.cjs.map +0 -1
- package/dist/tools/warp_grep/utils/format.d.ts +0 -4
- package/dist/tools/warp_grep/utils/format.js +0 -18
- package/dist/tools/warp_grep/utils/format.js.map +0 -1
- /package/dist/{chunk-7OQOOB3R.js.map → chunk-ISWL67SF.js.map} +0 -0
- /package/dist/tools/warp_grep/{tools/analyse.js.map → client.js.map} +0 -0
- /package/dist/tools/warp_grep/{tools/finish.js.map → gemini.js.map} +0 -0
- /package/dist/tools/warp_grep/{tools/read.js.map → providers/remote.js.map} +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Tool } from '@anthropic-ai/sdk/resources/messages';
|
|
2
|
+
import { formatResult } from './tools/warp_grep/client.js';
|
|
3
|
+
import { getSystemPrompt } from './tools/warp_grep/agent/prompt.js';
|
|
4
|
+
import { d as WarpGrepToolConfig, b as WarpGrepResult } from './types-a_hxdPI6.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Anthropic SDK adapter for morph-warp-grep tool
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Anthropic-native warp grep tool definition
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
16
|
+
* import { warpGrepTool, execute } from '@morphllm/morphsdk/tools/warp-grep/anthropic';
|
|
17
|
+
*
|
|
18
|
+
* const client = new Anthropic();
|
|
19
|
+
* const response = await client.messages.create({
|
|
20
|
+
* model: 'claude-sonnet-4-5-20250929',
|
|
21
|
+
* tools: [warpGrepTool],
|
|
22
|
+
* messages: [{ role: 'user', content: 'Find authentication middleware' }]
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Execute the tool call
|
|
26
|
+
* const result = await execute({ query: '...' }, { repoRoot: '.' });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare const warpGrepTool: Tool;
|
|
30
|
+
/**
|
|
31
|
+
* Execute warp grep search
|
|
32
|
+
*
|
|
33
|
+
* @param input - Tool input with query
|
|
34
|
+
* @param config - Configuration with repoRoot and optional provider
|
|
35
|
+
* @returns Search results
|
|
36
|
+
*/
|
|
37
|
+
declare function execute(input: {
|
|
38
|
+
query: string;
|
|
39
|
+
} | string, config: WarpGrepToolConfig): Promise<WarpGrepResult>;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Create a custom warp grep tool with configuration and methods
|
|
43
|
+
*
|
|
44
|
+
* @param config - Configuration options
|
|
45
|
+
* @returns Tool definition with execute and formatResult methods
|
|
46
|
+
*
|
|
47
|
+
* @example Local usage
|
|
48
|
+
* ```typescript
|
|
49
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
50
|
+
* import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/anthropic';
|
|
51
|
+
*
|
|
52
|
+
* const tool = createWarpGrepTool({ repoRoot: '.' });
|
|
53
|
+
*
|
|
54
|
+
* const client = new Anthropic();
|
|
55
|
+
* const response = await client.messages.create({
|
|
56
|
+
* model: 'claude-sonnet-4-5-20250929',
|
|
57
|
+
* tools: [tool],
|
|
58
|
+
* messages: [{ role: 'user', content: 'Find authentication middleware' }]
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @example Remote sandbox (E2B, Modal, etc.)
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const tool = createMorphWarpGrepTool({
|
|
65
|
+
* repoRoot: '/home/repo',
|
|
66
|
+
* remoteCommands: {
|
|
67
|
+
* grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,
|
|
68
|
+
* read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,
|
|
69
|
+
* listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,
|
|
70
|
+
* },
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
declare function createWarpGrepTool(config: WarpGrepToolConfig): Tool & {
|
|
75
|
+
execute: (input: unknown) => Promise<WarpGrepResult>;
|
|
76
|
+
formatResult: (result: WarpGrepResult) => string;
|
|
77
|
+
getSystemPrompt: () => string;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
declare const anthropic_createWarpGrepTool: typeof createWarpGrepTool;
|
|
81
|
+
declare const anthropic_execute: typeof execute;
|
|
82
|
+
declare const anthropic_formatResult: typeof formatResult;
|
|
83
|
+
declare const anthropic_getSystemPrompt: typeof getSystemPrompt;
|
|
84
|
+
declare const anthropic_warpGrepTool: typeof warpGrepTool;
|
|
85
|
+
declare namespace anthropic {
|
|
86
|
+
export { anthropic_createWarpGrepTool as createWarpGrepTool, anthropic_execute as execute, anthropic_formatResult as formatResult, anthropic_getSystemPrompt as getSystemPrompt, anthropic_warpGrepTool as warpGrepTool };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { anthropic as a, createWarpGrepTool as c, execute as e, warpGrepTool as w };
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
|
+
buildInitialState,
|
|
3
|
+
calculateContextBudget,
|
|
4
|
+
enforceContextLimit,
|
|
5
|
+
formatTurnMessage,
|
|
6
|
+
readFinishFiles,
|
|
7
|
+
toolGrep,
|
|
8
|
+
toolListDirectory,
|
|
2
9
|
toolRead
|
|
3
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6Y5JB4JC.js";
|
|
4
11
|
import {
|
|
5
|
-
|
|
6
|
-
} from "./chunk-
|
|
12
|
+
formatAgentToolOutput
|
|
13
|
+
} from "./chunk-APP75CBN.js";
|
|
7
14
|
import {
|
|
8
15
|
LLMResponseParser
|
|
9
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-YV75OQTE.js";
|
|
10
17
|
import {
|
|
11
18
|
getSystemPrompt
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import {
|
|
14
|
-
readFinishFiles
|
|
15
|
-
} from "./chunk-EK7OQPWD.js";
|
|
19
|
+
} from "./chunk-Q5AHGIQO.js";
|
|
16
20
|
import {
|
|
17
21
|
AGENT_CONFIG,
|
|
18
22
|
DEFAULT_MODEL
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import {
|
|
21
|
-
formatAgentToolOutput
|
|
22
|
-
} from "./chunk-TICMYDII.js";
|
|
23
|
+
} from "./chunk-XT5ZO6ES.js";
|
|
23
24
|
import {
|
|
24
25
|
fetchWithRetry,
|
|
25
26
|
withTimeout
|
|
@@ -28,30 +29,17 @@ import {
|
|
|
28
29
|
// tools/warp_grep/agent/runner.ts
|
|
29
30
|
import path from "path";
|
|
30
31
|
var parser = new LLMResponseParser();
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const files = entries.filter((e) => e.type === "file").map((f) => f.name).slice(0, 50);
|
|
36
|
-
const parts = [
|
|
37
|
-
`<repo_root>${repoRoot}</repo_root>`,
|
|
38
|
-
`<top_dirs>${dirs.join(", ")}</top_dirs>`,
|
|
39
|
-
`<top_files>${files.join(", ")}</top_files>`
|
|
40
|
-
];
|
|
41
|
-
return parts.join("\n");
|
|
42
|
-
} catch {
|
|
43
|
-
return `<repo_root>${repoRoot}</repo_root>`;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
async function callModel(messages, model, apiKey) {
|
|
47
|
-
const api = "https://api.morphllm.com/v1/chat/completions";
|
|
32
|
+
var DEFAULT_API_URL = "https://api.morphllm.com";
|
|
33
|
+
async function callModel(messages, model, options = {}) {
|
|
34
|
+
const baseUrl = DEFAULT_API_URL;
|
|
35
|
+
const apiKey = options.morphApiKey || process.env.MORPH_API_KEY || "";
|
|
48
36
|
const fetchPromise = fetchWithRetry(
|
|
49
|
-
|
|
37
|
+
`${baseUrl}/v1/chat/completions`,
|
|
50
38
|
{
|
|
51
39
|
method: "POST",
|
|
52
40
|
headers: {
|
|
53
41
|
"Content-Type": "application/json",
|
|
54
|
-
Authorization: `Bearer ${apiKey
|
|
42
|
+
Authorization: `Bearer ${apiKey}`
|
|
55
43
|
},
|
|
56
44
|
body: JSON.stringify({
|
|
57
45
|
model,
|
|
@@ -60,10 +48,15 @@ async function callModel(messages, model, apiKey) {
|
|
|
60
48
|
messages
|
|
61
49
|
})
|
|
62
50
|
},
|
|
63
|
-
|
|
51
|
+
options.retryConfig
|
|
64
52
|
);
|
|
65
53
|
const resp = await withTimeout(fetchPromise, AGENT_CONFIG.TIMEOUT_MS, "morph-warp-grep request timed out");
|
|
66
54
|
if (!resp.ok) {
|
|
55
|
+
if (resp.status === 404) {
|
|
56
|
+
throw new Error(
|
|
57
|
+
"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"
|
|
58
|
+
);
|
|
59
|
+
}
|
|
67
60
|
const t = await resp.text();
|
|
68
61
|
throw new Error(`morph-warp-grep error ${resp.status}: ${t}`);
|
|
69
62
|
}
|
|
@@ -77,20 +70,22 @@ async function callModel(messages, model, apiKey) {
|
|
|
77
70
|
async function runWarpGrep(config) {
|
|
78
71
|
const repoRoot = path.resolve(config.repoRoot || process.cwd());
|
|
79
72
|
const messages = [];
|
|
80
|
-
|
|
81
|
-
messages.push(systemMessage);
|
|
82
|
-
const queryContent = `<query>${config.query}</query>`;
|
|
83
|
-
messages.push({ role: "user", content: queryContent });
|
|
73
|
+
messages.push({ role: "system", content: getSystemPrompt() });
|
|
84
74
|
const initialState = await buildInitialState(repoRoot, config.query, config.provider);
|
|
85
75
|
messages.push({ role: "user", content: initialState });
|
|
86
|
-
const
|
|
76
|
+
const maxTurns = AGENT_CONFIG.MAX_TURNS;
|
|
87
77
|
const model = config.model || DEFAULT_MODEL;
|
|
88
78
|
const provider = config.provider;
|
|
89
79
|
const errors = [];
|
|
90
80
|
let finishMeta;
|
|
91
81
|
let terminationReason = "terminated";
|
|
92
|
-
for (let
|
|
93
|
-
|
|
82
|
+
for (let turn = 1; turn <= maxTurns; turn += 1) {
|
|
83
|
+
enforceContextLimit(messages);
|
|
84
|
+
const assistantContent = await callModel(messages, model, {
|
|
85
|
+
morphApiKey: config.morphApiKey,
|
|
86
|
+
morphApiUrl: config.morphApiUrl,
|
|
87
|
+
retryConfig: config.retryConfig
|
|
88
|
+
}).catch((e) => {
|
|
94
89
|
errors.push({ message: e instanceof Error ? e.message : String(e) });
|
|
95
90
|
return "";
|
|
96
91
|
});
|
|
@@ -98,13 +93,13 @@ async function runWarpGrep(config) {
|
|
|
98
93
|
messages.push({ role: "assistant", content: assistantContent });
|
|
99
94
|
const toolCalls = parser.parse(assistantContent);
|
|
100
95
|
if (toolCalls.length === 0) {
|
|
101
|
-
errors.push({ message: "No tool calls produced by the model." });
|
|
96
|
+
errors.push({ message: "No tool calls produced by the model. Your MCP is likely out of date! Update it by running: npm cache clean --force && npx -y @morphllm/morphmcp@latest" });
|
|
102
97
|
terminationReason = "terminated";
|
|
103
98
|
break;
|
|
104
99
|
}
|
|
105
100
|
const finishCalls = toolCalls.filter((c) => c.name === "finish");
|
|
106
101
|
const grepCalls = toolCalls.filter((c) => c.name === "grep");
|
|
107
|
-
const
|
|
102
|
+
const listDirCalls = toolCalls.filter((c) => c.name === "list_directory");
|
|
108
103
|
const readCalls = toolCalls.filter((c) => c.name === "read");
|
|
109
104
|
const skipCalls = toolCalls.filter((c) => c.name === "_skip");
|
|
110
105
|
const formatted = [];
|
|
@@ -116,24 +111,18 @@ async function runWarpGrep(config) {
|
|
|
116
111
|
for (const c of grepCalls) {
|
|
117
112
|
const args = c.arguments ?? {};
|
|
118
113
|
allPromises.push(
|
|
119
|
-
provider
|
|
120
|
-
(
|
|
121
|
-
if (grepRes.error) {
|
|
122
|
-
return { terminate: true, error: grepRes.error };
|
|
123
|
-
}
|
|
124
|
-
const output = grepRes.lines.join("\n") || "no matches";
|
|
125
|
-
return formatAgentToolOutput("grep", args, output, { isError: false });
|
|
126
|
-
},
|
|
114
|
+
toolGrep(provider, args).then(
|
|
115
|
+
({ output }) => formatAgentToolOutput("grep", args, output, { isError: false }),
|
|
127
116
|
(err) => formatAgentToolOutput("grep", args, String(err), { isError: true })
|
|
128
117
|
)
|
|
129
118
|
);
|
|
130
119
|
}
|
|
131
|
-
for (const c of
|
|
120
|
+
for (const c of listDirCalls) {
|
|
132
121
|
const args = c.arguments ?? {};
|
|
133
122
|
allPromises.push(
|
|
134
|
-
|
|
135
|
-
(p) => formatAgentToolOutput("
|
|
136
|
-
(err) => formatAgentToolOutput("
|
|
123
|
+
toolListDirectory(provider, args).then(
|
|
124
|
+
(p) => formatAgentToolOutput("list_directory", args, p, { isError: false }),
|
|
125
|
+
(err) => formatAgentToolOutput("list_directory", args, String(err), { isError: true })
|
|
137
126
|
)
|
|
138
127
|
);
|
|
139
128
|
}
|
|
@@ -148,34 +137,12 @@ async function runWarpGrep(config) {
|
|
|
148
137
|
}
|
|
149
138
|
const allResults = await Promise.all(allPromises);
|
|
150
139
|
for (const result of allResults) {
|
|
151
|
-
if (typeof result === "object" && "terminate" in result) {
|
|
152
|
-
errors.push({ message: result.error });
|
|
153
|
-
return {
|
|
154
|
-
terminationReason: "terminated",
|
|
155
|
-
messages,
|
|
156
|
-
errors
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
140
|
formatted.push(result);
|
|
160
141
|
}
|
|
161
142
|
if (formatted.length > 0) {
|
|
162
|
-
const
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
if (turnsRemaining === 0) {
|
|
166
|
-
turnMessage = `
|
|
167
|
-
|
|
168
|
-
[Turn ${turnsUsed}/4] This is your LAST turn. You MUST call the finish tool now.`;
|
|
169
|
-
} else if (turnsRemaining === 1) {
|
|
170
|
-
turnMessage = `
|
|
171
|
-
|
|
172
|
-
[Turn ${turnsUsed}/4] You have 1 turn remaining. Next turn you MUST call the finish tool.`;
|
|
173
|
-
} else {
|
|
174
|
-
turnMessage = `
|
|
175
|
-
|
|
176
|
-
[Turn ${turnsUsed}/4] You have ${turnsRemaining} turns remaining.`;
|
|
177
|
-
}
|
|
178
|
-
messages.push({ role: "user", content: formatted.join("\n") + turnMessage });
|
|
143
|
+
const turnMessage = formatTurnMessage(turn, maxTurns);
|
|
144
|
+
const contextBudget = calculateContextBudget(messages);
|
|
145
|
+
messages.push({ role: "user", content: formatted.join("\n") + turnMessage + "\n" + contextBudget });
|
|
179
146
|
}
|
|
180
147
|
if (finishCalls.length) {
|
|
181
148
|
const fc = finishCalls[0];
|
|
@@ -226,4 +193,4 @@ async function runWarpGrep(config) {
|
|
|
226
193
|
export {
|
|
227
194
|
runWarpGrep
|
|
228
195
|
};
|
|
229
|
-
//# sourceMappingURL=chunk-
|
|
196
|
+
//# sourceMappingURL=chunk-2CASO3ZO.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 } 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 { fetchWithRetry, withTimeout, type RetryConfig } from '../../utils/resilience.js';\nimport { formatAgentToolOutput } from './formatter.js';\nimport { formatTurnMessage, calculateContextBudget, buildInitialState, enforceContextLimit } from './helpers.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}\n\nasync function callModel(\n messages: ChatMessage[],\n model: string,\n options: CallModelOptions = {}\n): Promise<string> {\n const baseUrl = DEFAULT_API_URL;\n const apiKey = options.morphApiKey || process.env.MORPH_API_KEY || '';\n \n const fetchPromise = fetchWithRetry(\n `${baseUrl}/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,\n temperature: 0.0,\n max_tokens: 1024,\n messages,\n }),\n },\n options.retryConfig\n );\n const resp = await withTimeout(fetchPromise, AGENT_CONFIG.TIMEOUT_MS, 'morph-warp-grep request timed out');\n if (!resp.ok) {\n if (resp.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 // keeping these cases are real throws, if this happens retry will likely not help, so best we just throw here, notice the error and fix\n const t = await resp.text();\n throw new Error(`morph-warp-grep error ${resp.status}: ${t}`);\n }\n const data = await resp.json();\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 repoRoot = path.resolve(config.repoRoot || process.cwd());\n const messages: ChatMessage[] = [];\n\n messages.push({ role: 'system' as const, content: getSystemPrompt() });\n const initialState = await buildInitialState(repoRoot, config.query, config.provider);\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 // Enforce hard context limit before calling model\n enforceContextLimit(messages);\n \n // call model\n const assistantContent = await callModel(messages, model, {\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n }).catch((e: unknown) => {\n errors.push({ message: e instanceof Error ? e.message : String(e) });\n return '';\n });\n if (!assistantContent) break;\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: npm cache clean --force && npx -y @morphllm/morphmcp@latest' });\n terminationReason = 'terminated';\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 allResults = await Promise.all(allPromises);\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 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 return { terminationReason, messages, errors };\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.map(([s, e]) => `${s}-${e}`).join(', ');\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 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 // 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 return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta, resolved },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runWarpGrep
|
|
3
|
+
} from "./chunk-2CASO3ZO.js";
|
|
4
|
+
import {
|
|
5
|
+
RemoteCommandsProvider
|
|
6
|
+
} from "./chunk-527P5X2E.js";
|
|
7
|
+
import {
|
|
8
|
+
LocalRipgrepProvider
|
|
9
|
+
} from "./chunk-ZO4PPFCZ.js";
|
|
10
|
+
|
|
11
|
+
// tools/warp_grep/client.ts
|
|
12
|
+
var WarpGrepClient = class {
|
|
13
|
+
config;
|
|
14
|
+
constructor(config = {}) {
|
|
15
|
+
this.config = {
|
|
16
|
+
morphApiKey: config.morphApiKey,
|
|
17
|
+
morphApiUrl: config.morphApiUrl,
|
|
18
|
+
debug: config.debug,
|
|
19
|
+
timeout: config.timeout,
|
|
20
|
+
retryConfig: config.retryConfig
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Execute a code search query
|
|
25
|
+
*
|
|
26
|
+
* @param input - Search parameters including query, repoRoot, and optional provider
|
|
27
|
+
* @returns Search results with relevant code contexts
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const result = await client.execute({
|
|
32
|
+
* query: 'Find authentication middleware',
|
|
33
|
+
* repoRoot: '.'
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* if (result.success) {
|
|
37
|
+
* for (const ctx of result.contexts) {
|
|
38
|
+
* console.log(`File: ${ctx.file}`);
|
|
39
|
+
* console.log(ctx.content);
|
|
40
|
+
* }
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
async execute(input) {
|
|
45
|
+
return executeToolCall(
|
|
46
|
+
{ query: input.query },
|
|
47
|
+
{
|
|
48
|
+
repoRoot: input.repoRoot,
|
|
49
|
+
remoteCommands: input.remoteCommands,
|
|
50
|
+
provider: input.provider,
|
|
51
|
+
excludes: input.excludes,
|
|
52
|
+
includes: input.includes,
|
|
53
|
+
debug: input.debug ?? this.config.debug,
|
|
54
|
+
morphApiKey: this.config.morphApiKey,
|
|
55
|
+
morphApiUrl: this.config.morphApiUrl,
|
|
56
|
+
retryConfig: this.config.retryConfig
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
async function executeWarpGrep(input, config) {
|
|
62
|
+
const client = new WarpGrepClient(config);
|
|
63
|
+
return client.execute(input);
|
|
64
|
+
}
|
|
65
|
+
async function executeToolCall(input, config) {
|
|
66
|
+
const parsed = typeof input === "string" ? JSON.parse(input) : input;
|
|
67
|
+
const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
|
|
68
|
+
const result = await runWarpGrep({
|
|
69
|
+
query: parsed.query,
|
|
70
|
+
repoRoot: config.repoRoot,
|
|
71
|
+
provider,
|
|
72
|
+
excludes: config.excludes,
|
|
73
|
+
includes: config.includes,
|
|
74
|
+
debug: config.debug ?? false,
|
|
75
|
+
morphApiKey: config.morphApiKey,
|
|
76
|
+
morphApiUrl: config.morphApiUrl,
|
|
77
|
+
retryConfig: config.retryConfig
|
|
78
|
+
});
|
|
79
|
+
const finish = result.finish;
|
|
80
|
+
if (result.terminationReason !== "completed" || !finish?.metadata) {
|
|
81
|
+
return { success: false, error: "Search did not complete" };
|
|
82
|
+
}
|
|
83
|
+
const contexts = (finish.resolved ?? []).map((r) => ({
|
|
84
|
+
file: r.path,
|
|
85
|
+
content: r.content
|
|
86
|
+
}));
|
|
87
|
+
return { success: true, contexts, summary: finish.payload };
|
|
88
|
+
}
|
|
89
|
+
function formatResult(result) {
|
|
90
|
+
if (!result.success) {
|
|
91
|
+
return `Search failed: ${result.error}`;
|
|
92
|
+
}
|
|
93
|
+
if (!result.contexts || result.contexts.length === 0) {
|
|
94
|
+
return "No relevant code found. Try rephrasing your query.";
|
|
95
|
+
}
|
|
96
|
+
const lines = [];
|
|
97
|
+
lines.push(`Found ${result.contexts.length} relevant code sections:
|
|
98
|
+
`);
|
|
99
|
+
result.contexts.forEach((ctx, i) => {
|
|
100
|
+
lines.push(`${i + 1}. ${ctx.file}`);
|
|
101
|
+
lines.push("```");
|
|
102
|
+
lines.push(ctx.content);
|
|
103
|
+
lines.push("```");
|
|
104
|
+
lines.push("");
|
|
105
|
+
});
|
|
106
|
+
if (result.summary) {
|
|
107
|
+
lines.push(`Summary: ${result.summary}`);
|
|
108
|
+
}
|
|
109
|
+
return lines.join("\n");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
WarpGrepClient,
|
|
114
|
+
executeWarpGrep,
|
|
115
|
+
executeToolCall,
|
|
116
|
+
formatResult
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=chunk-374N3GIA.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 } from './agent/runner.js';\nimport { LocalRipgrepProvider } from './providers/local.js';\nimport { RemoteCommandsProvider } from './providers/remote.js';\nimport type { \n WarpGrepClientConfig, \n WarpGrepInput, \n WarpGrepResult,\n WarpGrepContext,\n WarpGrepToolConfig,\n} from './types.js';\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\n * \n * @example\n * ```typescript\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 */\n async execute(input: WarpGrepInput): Promise<WarpGrepResult> {\n return executeToolCall(\n { query: input.query },\n {\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 }\n );\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\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 */\nexport async function executeWarpGrep(\n input: WarpGrepInput,\n config?: WarpGrepClientConfig\n): Promise<WarpGrepResult> {\n const client = new WarpGrepClient(config);\n return client.execute(input);\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\n const provider = config.remoteCommands\n ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n : config.provider ?? new LocalRipgrepProvider(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 });\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 * 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":";;;;;;;;;;;AAsCO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,SAA+B,CAAC,GAAG;AAC7C,SAAK,SAAS;AAAA,MACZ,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,QAAQ,OAA+C;AAC3D,WAAO;AAAA,MACL,EAAE,OAAO,MAAM,MAAM;AAAA,MACrB;AAAA,QACE,UAAU,MAAM;AAAA,QAChB,gBAAgB,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM,SAAS,KAAK,OAAO;AAAA,QAClC,aAAa,KAAK,OAAO;AAAA,QACzB,aAAa,KAAK,OAAO;AAAA,QACzB,aAAa,KAAK,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;AAmBA,eAAsB,gBACpB,OACA,QACyB;AACzB,QAAM,SAAS,IAAI,eAAe,MAAM;AACxC,SAAO,OAAO,QAAQ,KAAK;AAC7B;AAEA,eAAsB,gBACpB,OACA,QACyB;AACzB,QAAM,SAAS,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAG/D,QAAM,WAAW,OAAO,iBACpB,IAAI,uBAAuB,OAAO,UAAU,OAAO,cAAc,IACjE,OAAO,YAAY,IAAI,qBAAqB,OAAO,UAAU,OAAO,QAAQ;AAEhF,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO,SAAS;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,EACtB,CAAC;AAED,QAAM,SAAS,OAAO;AACtB,MAAI,OAAO,sBAAsB,eAAe,CAAC,QAAQ,UAAU;AACjE,WAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B;AAAA,EAC5D;AAEA,QAAM,YAA+B,OAAO,YAAY,CAAC,GAAG,IAAI,QAAM;AAAA,IACpE,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,EACb,EAAE;AAEF,SAAO,EAAE,SAAS,MAAM,UAAU,SAAS,OAAO,QAAQ;AAC5D;AAQO,SAAS,aAAa,QAAgC;AAC3D,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,kBAAkB,OAAO,KAAK;AAAA,EACvC;AAEA,MAAI,CAAC,OAAO,YAAY,OAAO,SAAS,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,SAAS,OAAO,SAAS,MAAM;AAAA,CAA4B;AAEtE,SAAO,SAAS,QAAQ,CAAC,KAAK,MAAM;AAClC,UAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;AAClC,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,IAAI,OAAO;AACtB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf,CAAC;AAED,MAAI,OAAO,SAAS;AAClB,UAAM,KAAK,YAAY,OAAO,OAAO,EAAE;AAAA,EACzC;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WARP_GREP_DESCRIPTION,
|
|
3
|
+
WARP_GREP_TOOL_NAME
|
|
4
|
+
} from "./chunk-KW7OEGZK.js";
|
|
5
|
+
import {
|
|
6
|
+
executeToolCall,
|
|
7
|
+
formatResult
|
|
8
|
+
} from "./chunk-374N3GIA.js";
|
|
9
|
+
import {
|
|
10
|
+
getSystemPrompt
|
|
11
|
+
} from "./chunk-Q5AHGIQO.js";
|
|
12
|
+
import {
|
|
13
|
+
__export
|
|
14
|
+
} from "./chunk-PZ5AY32C.js";
|
|
15
|
+
|
|
16
|
+
// tools/warp_grep/anthropic.ts
|
|
17
|
+
var anthropic_exports = {};
|
|
18
|
+
__export(anthropic_exports, {
|
|
19
|
+
createWarpGrepTool: () => createWarpGrepTool,
|
|
20
|
+
execute: () => execute,
|
|
21
|
+
formatResult: () => formatResult,
|
|
22
|
+
getSystemPrompt: () => getSystemPrompt,
|
|
23
|
+
warpGrepTool: () => warpGrepTool
|
|
24
|
+
});
|
|
25
|
+
var INPUT_SCHEMA = {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
query: { type: "string", description: "Free-form repository question" }
|
|
29
|
+
},
|
|
30
|
+
required: ["query"]
|
|
31
|
+
};
|
|
32
|
+
var warpGrepTool = {
|
|
33
|
+
name: WARP_GREP_TOOL_NAME,
|
|
34
|
+
description: WARP_GREP_DESCRIPTION,
|
|
35
|
+
input_schema: INPUT_SCHEMA
|
|
36
|
+
};
|
|
37
|
+
async function execute(input, config) {
|
|
38
|
+
return executeToolCall(input, config);
|
|
39
|
+
}
|
|
40
|
+
function createWarpGrepTool(config) {
|
|
41
|
+
const tool = {
|
|
42
|
+
name: config.name ?? WARP_GREP_TOOL_NAME,
|
|
43
|
+
description: config.description ?? WARP_GREP_DESCRIPTION,
|
|
44
|
+
input_schema: INPUT_SCHEMA
|
|
45
|
+
};
|
|
46
|
+
return Object.assign(tool, {
|
|
47
|
+
execute: async (input) => {
|
|
48
|
+
return executeToolCall(input, config);
|
|
49
|
+
},
|
|
50
|
+
formatResult: (result) => {
|
|
51
|
+
return formatResult(result);
|
|
52
|
+
},
|
|
53
|
+
getSystemPrompt: () => {
|
|
54
|
+
return getSystemPrompt();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export {
|
|
60
|
+
warpGrepTool,
|
|
61
|
+
execute,
|
|
62
|
+
createWarpGrepTool,
|
|
63
|
+
anthropic_exports
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=chunk-3IQIT6MC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../tools/warp_grep/anthropic.ts"],"sourcesContent":["/**\n * Anthropic SDK adapter for morph-warp-grep tool\n */\n\nimport type { Tool } from '@anthropic-ai/sdk/resources/messages';\nimport { executeToolCall, formatResult } from './client.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, getSystemPrompt } from './prompts.js';\nimport type { WarpGrepToolConfig, WarpGrepResult } from './types.js';\n\n/**\n * Input schema for the warp grep tool\n */\nconst INPUT_SCHEMA = {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Free-form repository question' },\n },\n required: ['query'],\n} as const;\n\n/**\n * Anthropic-native warp grep tool definition\n * \n * @example\n * ```typescript\n * import Anthropic from '@anthropic-ai/sdk';\n * import { warpGrepTool, execute } from '@morphllm/morphsdk/tools/warp-grep/anthropic';\n * \n * const client = new Anthropic();\n * const response = await client.messages.create({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [warpGrepTool],\n * messages: [{ role: 'user', content: 'Find authentication middleware' }]\n * });\n * \n * // Execute the tool call\n * const result = await execute({ query: '...' }, { repoRoot: '.' });\n * ```\n */\nexport const warpGrepTool: Tool = {\n name: WARP_GREP_TOOL_NAME,\n description: WARP_GREP_DESCRIPTION,\n input_schema: INPUT_SCHEMA,\n};\n\n/**\n * Execute warp grep search\n * \n * @param input - Tool input with query\n * @param config - Configuration with repoRoot and optional provider\n * @returns Search results\n */\nexport async function execute(\n input: { query: string } | string,\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n return executeToolCall(input, config);\n}\n\n// Re-export formatResult and getSystemPrompt for convenience\nexport { formatResult, getSystemPrompt };\n\n/**\n * Create a custom warp grep tool with configuration and methods\n * \n * @param config - Configuration options\n * @returns Tool definition with execute and formatResult methods\n * \n * @example Local usage\n * ```typescript\n * import Anthropic from '@anthropic-ai/sdk';\n * import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/anthropic';\n * \n * const tool = createWarpGrepTool({ repoRoot: '.' });\n * \n * const client = new Anthropic();\n * const response = await client.messages.create({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [tool],\n * messages: [{ role: 'user', content: 'Find authentication middleware' }]\n * });\n * ```\n * \n * @example Remote sandbox (E2B, Modal, etc.)\n * ```typescript\n * const tool = createMorphWarpGrepTool({\n * repoRoot: '/home/repo',\n * remoteCommands: {\n * grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,\n * read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,\n * listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,\n * },\n * });\n * ```\n */\nexport function createWarpGrepTool(config: WarpGrepToolConfig) {\n const tool: Tool = {\n name: config.name ?? WARP_GREP_TOOL_NAME,\n description: config.description ?? WARP_GREP_DESCRIPTION,\n input_schema: INPUT_SCHEMA,\n };\n\n return Object.assign(tool, {\n execute: async (input: unknown): Promise<WarpGrepResult> => {\n return executeToolCall(input as { query: string } | string, config);\n },\n formatResult: (result: WarpGrepResult): string => {\n return formatResult(result);\n },\n getSystemPrompt: (): string => {\n return getSystemPrompt();\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,IAAM,eAAe;AAAA,EACnB,MAAM;AAAA,EACN,YAAY;AAAA,IACV,OAAO,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,EACxE;AAAA,EACA,UAAU,CAAC,OAAO;AACpB;AAqBO,IAAM,eAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAChB;AASA,eAAsB,QACpB,OACA,QACyB;AACzB,SAAO,gBAAgB,OAAO,MAAM;AACtC;AAsCO,SAAS,mBAAmB,QAA4B;AAC7D,QAAM,OAAa;AAAA,IACjB,MAAM,OAAO,QAAQ;AAAA,IACrB,aAAa,OAAO,eAAe;AAAA,IACnC,cAAc;AAAA,EAChB;AAEA,SAAO,OAAO,OAAO,MAAM;AAAA,IACzB,SAAS,OAAO,UAA4C;AAC1D,aAAO,gBAAgB,OAAqC,MAAM;AAAA,IACpE;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WARP_GREP_DESCRIPTION
|
|
3
|
+
} from "./chunk-KW7OEGZK.js";
|
|
4
|
+
import {
|
|
5
|
+
executeToolCall,
|
|
6
|
+
formatResult
|
|
7
|
+
} from "./chunk-374N3GIA.js";
|
|
8
|
+
import {
|
|
9
|
+
getSystemPrompt
|
|
10
|
+
} from "./chunk-Q5AHGIQO.js";
|
|
11
|
+
import {
|
|
12
|
+
__export
|
|
13
|
+
} from "./chunk-PZ5AY32C.js";
|
|
14
|
+
|
|
15
|
+
// tools/warp_grep/vercel.ts
|
|
16
|
+
var vercel_exports = {};
|
|
17
|
+
__export(vercel_exports, {
|
|
18
|
+
createWarpGrepTool: () => createWarpGrepTool,
|
|
19
|
+
default: () => vercel_default,
|
|
20
|
+
execute: () => execute,
|
|
21
|
+
formatResult: () => formatResult,
|
|
22
|
+
getSystemPrompt: () => getSystemPrompt
|
|
23
|
+
});
|
|
24
|
+
import { tool } from "ai";
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
async function execute(input, config) {
|
|
27
|
+
return executeToolCall(input, config);
|
|
28
|
+
}
|
|
29
|
+
function createWarpGrepTool(config) {
|
|
30
|
+
const schema = z.object({
|
|
31
|
+
query: z.string().describe("Free-form repository question")
|
|
32
|
+
});
|
|
33
|
+
return tool({
|
|
34
|
+
description: config.description ?? WARP_GREP_DESCRIPTION,
|
|
35
|
+
inputSchema: schema,
|
|
36
|
+
execute: async (params) => {
|
|
37
|
+
const result = await executeToolCall(params, config);
|
|
38
|
+
if (!result.success) {
|
|
39
|
+
throw new Error(`Failed to search codebase: ${result.error}`);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
contexts: result.contexts,
|
|
44
|
+
summary: result.summary
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
var vercel_default = createWarpGrepTool;
|
|
50
|
+
|
|
51
|
+
export {
|
|
52
|
+
execute,
|
|
53
|
+
createWarpGrepTool,
|
|
54
|
+
vercel_default,
|
|
55
|
+
vercel_exports
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=chunk-4VGOBA2J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../tools/warp_grep/vercel.ts"],"sourcesContent":["/**\n * Vercel AI SDK adapter for morph-warp-grep tool\n */\n\nimport { tool } from 'ai';\nimport { z } from 'zod';\nimport { executeToolCall, formatResult } from './client.js';\nimport { WARP_GREP_DESCRIPTION, getSystemPrompt } from './prompts.js';\nimport type { WarpGrepToolConfig, WarpGrepResult } from './types.js';\n\n/**\n * Execute warp grep search\n * \n * @param input - Tool input with query\n * @param config - Configuration with repoRoot and optional provider\n * @returns Search results\n */\nexport async function execute(\n input: { query: string },\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n return executeToolCall(input, config);\n}\n\n// Re-export formatResult and getSystemPrompt for convenience\nexport { formatResult, getSystemPrompt };\n\n/**\n * Create Vercel AI SDK warp grep tool\n * \n * @param config - Configuration options\n * @returns Vercel AI SDK tool\n * \n * @example Local usage\n * ```typescript\n * import { generateText } from 'ai';\n * import { anthropic } from '@ai-sdk/anthropic';\n * import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/vercel';\n * \n * const grepTool = createWarpGrepTool({ repoRoot: '.' });\n * \n * const result = await generateText({\n * model: anthropic('claude-sonnet-4-5-20250929'),\n * tools: { grep: grepTool },\n * prompt: 'Find authentication middleware'\n * });\n * ```\n * \n * @example Remote sandbox (E2B, Modal, etc.)\n * ```typescript\n * const grepTool = createMorphWarpGrepTool({\n * repoRoot: '/home/repo',\n * remoteCommands: {\n * grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,\n * read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,\n * listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,\n * },\n * });\n * ```\n */\nexport function createWarpGrepTool(config: WarpGrepToolConfig) {\n const schema = z.object({\n query: z.string().describe('Free-form repository question'),\n });\n\n return tool({\n description: config.description ?? WARP_GREP_DESCRIPTION,\n inputSchema: schema,\n execute: async (params) => {\n const result = await executeToolCall(params, config);\n \n if (!result.success) {\n throw new Error(`Failed to search codebase: ${result.error}`);\n }\n \n return {\n success: true,\n contexts: result.contexts,\n summary: result.summary,\n };\n },\n });\n}\n\n// Default export for convenience\nexport default createWarpGrepTool;\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAS,YAAY;AACrB,SAAS,SAAS;AAYlB,eAAsB,QACpB,OACA,QACyB;AACzB,SAAO,gBAAgB,OAAO,MAAM;AACtC;AAsCO,SAAS,mBAAmB,QAA4B;AAC7D,QAAM,SAAS,EAAE,OAAO;AAAA,IACtB,OAAO,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EAC5D,CAAC;AAED,SAAO,KAAK;AAAA,IACV,aAAa,OAAO,eAAe;AAAA,IACnC,aAAa;AAAA,IACb,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,gBAAgB,QAAQ,MAAM;AAEnD,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,8BAA8B,OAAO,KAAK,EAAE;AAAA,MAC9D;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAGA,IAAO,iBAAQ;","names":[]}
|