@morphllm/morphsdk 0.2.56 → 0.2.58
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-SALJ2K6S.js → chunk-2CASO3ZO.js} +60 -98
- 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-WSSSSBWU.js → chunk-7EIHYJSG.js} +18 -18
- package/dist/chunk-7EIHYJSG.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-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-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 +698 -466
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.ts +3 -2
- package/dist/client.js +14 -15
- package/dist/finish-kXAcUJyB.d.ts +33 -0
- package/dist/gemini-CE80Pbdy.d.ts +117 -0
- package/dist/index.cjs +711 -466
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +16 -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 +466 -313
- 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 -9
- 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 +656 -380
- 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 -16
- 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 +1195 -0
- package/dist/tools/warp_grep/harness.cjs.map +1 -0
- package/dist/tools/warp_grep/harness.d.ts +107 -0
- package/dist/tools/warp_grep/harness.js +68 -0
- package/dist/tools/warp_grep/harness.js.map +1 -0
- package/dist/tools/warp_grep/index.cjs +818 -466
- 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 -23
- package/dist/tools/warp_grep/openai.cjs +656 -378
- 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 -14
- 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 +668 -397
- 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 -15
- package/dist/types-a_hxdPI6.d.ts +144 -0
- package/dist/vercel-3yjvfmVB.d.ts +66 -0
- package/package.json +17 -2
- package/dist/chunk-4ZHDBKBY.js +0 -83
- package/dist/chunk-4ZHDBKBY.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-EK7OQPWD.js +0 -44
- package/dist/chunk-EK7OQPWD.js.map +0 -1
- package/dist/chunk-GJURLQ3L.js +0 -77
- package/dist/chunk-GJURLQ3L.js.map +0 -1
- package/dist/chunk-HQO45BAJ.js +0 -14
- package/dist/chunk-HQO45BAJ.js.map +0 -1
- package/dist/chunk-LVPVVLTI.js.map +0 -1
- package/dist/chunk-NDZO5IPV.js +0 -121
- package/dist/chunk-NDZO5IPV.js.map +0 -1
- package/dist/chunk-QVRXBAMM.js +0 -107
- package/dist/chunk-QVRXBAMM.js.map +0 -1
- package/dist/chunk-SALJ2K6S.js.map +0 -1
- package/dist/chunk-TICMYDII.js.map +0 -1
- package/dist/chunk-TJIUA27P.js.map +0 -1
- package/dist/chunk-UIRJE422.js +0 -70
- package/dist/chunk-UIRJE422.js.map +0 -1
- package/dist/chunk-WETRQJGU.js +0 -129
- package/dist/chunk-WETRQJGU.js.map +0 -1
- package/dist/chunk-WSSSSBWU.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/agent/grep_helpers.cjs +0 -148
- package/dist/tools/warp_grep/agent/grep_helpers.cjs.map +0 -1
- package/dist/tools/warp_grep/agent/grep_helpers.d.ts +0 -16
- package/dist/tools/warp_grep/agent/grep_helpers.js +0 -14
- 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/tools/read.js.map +0 -1
- 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/{agent/grep_helpers.js.map → client.js.map} +0 -0
- /package/dist/tools/warp_grep/{tools/analyse.js.map → gemini.js.map} +0 -0
- /package/dist/tools/warp_grep/{tools/finish.js.map → providers/remote.js.map} +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { WarpGrepProvider } from './tools/warp_grep/providers/types.js';
|
|
2
|
+
import { RetryConfig } from './tools/utils/resilience.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Remote command executors for sandbox environments.
|
|
6
|
+
* Each function returns raw stdout - SDK handles all parsing internally.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const tool = createWarpGrepTool({
|
|
11
|
+
* repoRoot: '/home/repo',
|
|
12
|
+
* remoteCommands: {
|
|
13
|
+
* grep: async (pattern, path) => {
|
|
14
|
+
* const r = await sandbox.run(`rg --no-heading '${pattern}' '${path}'`);
|
|
15
|
+
* return r.stdout;
|
|
16
|
+
* },
|
|
17
|
+
* read: async (path, start, end) => {
|
|
18
|
+
* const r = await sandbox.run(`sed -n '${start},${end}p' '${path}'`);
|
|
19
|
+
* return r.stdout;
|
|
20
|
+
* },
|
|
21
|
+
* listDir: async (path, maxDepth) => {
|
|
22
|
+
* const r = await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`);
|
|
23
|
+
* return r.stdout;
|
|
24
|
+
* },
|
|
25
|
+
* },
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
interface RemoteCommands {
|
|
30
|
+
/**
|
|
31
|
+
* Run ripgrep search. Return raw stdout.
|
|
32
|
+
* Expected format: ripgrep default output (path:line:content per line)
|
|
33
|
+
*
|
|
34
|
+
* @param pattern - Regex pattern to search for
|
|
35
|
+
* @param path - Directory or file path to search in
|
|
36
|
+
* @param glob - Optional glob pattern to filter files (e.g., "*.ts")
|
|
37
|
+
* @returns Raw stdout from ripgrep command
|
|
38
|
+
*/
|
|
39
|
+
grep: (pattern: string, path: string, glob?: string) => Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Read file lines. Return raw file content.
|
|
42
|
+
* SDK will add line numbers automatically.
|
|
43
|
+
*
|
|
44
|
+
* @param path - File path to read
|
|
45
|
+
* @param start - Start line number (1-based)
|
|
46
|
+
* @param end - End line number (1-based, inclusive)
|
|
47
|
+
* @returns Raw file content (lines between start and end)
|
|
48
|
+
*/
|
|
49
|
+
read: (path: string, start: number, end: number) => Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* List directory contents. Return one path per line.
|
|
52
|
+
* Expected format: output from `find` command (one absolute/relative path per line)
|
|
53
|
+
*
|
|
54
|
+
* @param path - Directory path to list
|
|
55
|
+
* @param maxDepth - Maximum depth to traverse
|
|
56
|
+
* @returns Raw stdout from find/ls command (one path per line)
|
|
57
|
+
*/
|
|
58
|
+
listDir: (path: string, maxDepth: number) => Promise<string>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Configuration for WarpGrepClient
|
|
62
|
+
*/
|
|
63
|
+
interface WarpGrepClientConfig {
|
|
64
|
+
/** Morph API key (defaults to MORPH_API_KEY env var) */
|
|
65
|
+
morphApiKey?: string;
|
|
66
|
+
/** Morph API base URL */
|
|
67
|
+
morphApiUrl?: string;
|
|
68
|
+
/** Enable debug logging */
|
|
69
|
+
debug?: boolean;
|
|
70
|
+
/** Request timeout in milliseconds */
|
|
71
|
+
timeout?: number;
|
|
72
|
+
/** Retry configuration */
|
|
73
|
+
retryConfig?: RetryConfig;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Input for warp grep execution
|
|
77
|
+
*/
|
|
78
|
+
interface WarpGrepInput {
|
|
79
|
+
/** Free-form repository question */
|
|
80
|
+
query: string;
|
|
81
|
+
/** Root directory of the repository to search */
|
|
82
|
+
repoRoot: string;
|
|
83
|
+
/** Remote command executors for sandbox environments */
|
|
84
|
+
remoteCommands?: RemoteCommands;
|
|
85
|
+
/** Optional custom provider (defaults to LocalRipgrepProvider). Use remoteCommands for simpler remote setup. */
|
|
86
|
+
provider?: WarpGrepProvider;
|
|
87
|
+
/** Glob patterns to exclude from search */
|
|
88
|
+
excludes?: string[];
|
|
89
|
+
/** Glob patterns to include in search */
|
|
90
|
+
includes?: string[];
|
|
91
|
+
/** Enable debug logging for this request */
|
|
92
|
+
debug?: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A single context result with file path and content
|
|
96
|
+
*/
|
|
97
|
+
interface WarpGrepContext {
|
|
98
|
+
/** File path relative to repo root */
|
|
99
|
+
file: string;
|
|
100
|
+
/** Content of the relevant code section */
|
|
101
|
+
content: string;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Result from warp grep execution
|
|
105
|
+
*/
|
|
106
|
+
interface WarpGrepResult {
|
|
107
|
+
/** Whether the search completed successfully */
|
|
108
|
+
success: boolean;
|
|
109
|
+
/** Relevant code contexts found */
|
|
110
|
+
contexts?: WarpGrepContext[];
|
|
111
|
+
/** Summary of what was found */
|
|
112
|
+
summary?: string;
|
|
113
|
+
/** Error message if search failed */
|
|
114
|
+
error?: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Configuration for creating a warp grep tool
|
|
118
|
+
*/
|
|
119
|
+
interface WarpGrepToolConfig {
|
|
120
|
+
/** Root directory of the repository to search */
|
|
121
|
+
repoRoot: string;
|
|
122
|
+
/** Remote command executors for sandbox environments. Simplest way to run in remote sandboxes. */
|
|
123
|
+
remoteCommands?: RemoteCommands;
|
|
124
|
+
/** Optional custom provider (defaults to LocalRipgrepProvider). Use remoteCommands for simpler remote setup. */
|
|
125
|
+
provider?: WarpGrepProvider;
|
|
126
|
+
/** Glob patterns to exclude from search */
|
|
127
|
+
excludes?: string[];
|
|
128
|
+
/** Glob patterns to include in search */
|
|
129
|
+
includes?: string[];
|
|
130
|
+
/** Enable debug logging */
|
|
131
|
+
debug?: boolean;
|
|
132
|
+
/** Morph API key (defaults to MORPH_API_KEY env var) */
|
|
133
|
+
morphApiKey?: string;
|
|
134
|
+
/** Morph API base URL */
|
|
135
|
+
morphApiUrl?: string;
|
|
136
|
+
/** Retry configuration */
|
|
137
|
+
retryConfig?: RetryConfig;
|
|
138
|
+
/** Custom tool name (defaults to 'warpgrep_codebase_search') */
|
|
139
|
+
name?: string;
|
|
140
|
+
/** Custom tool description */
|
|
141
|
+
description?: string;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export type { RemoteCommands as R, WarpGrepClientConfig as W, WarpGrepInput as a, WarpGrepResult as b, WarpGrepContext as c, WarpGrepToolConfig as d };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as ai from 'ai';
|
|
2
|
+
import { d as WarpGrepToolConfig, c as WarpGrepContext, b as WarpGrepResult } from './types-a_hxdPI6.js';
|
|
3
|
+
import { formatResult } from './tools/warp_grep/client.js';
|
|
4
|
+
import { getSystemPrompt } from './tools/warp_grep/agent/prompt.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Execute warp grep search
|
|
8
|
+
*
|
|
9
|
+
* @param input - Tool input with query
|
|
10
|
+
* @param config - Configuration with repoRoot and optional provider
|
|
11
|
+
* @returns Search results
|
|
12
|
+
*/
|
|
13
|
+
declare function execute(input: {
|
|
14
|
+
query: string;
|
|
15
|
+
}, config: WarpGrepToolConfig): Promise<WarpGrepResult>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create Vercel AI SDK warp grep tool
|
|
19
|
+
*
|
|
20
|
+
* @param config - Configuration options
|
|
21
|
+
* @returns Vercel AI SDK tool
|
|
22
|
+
*
|
|
23
|
+
* @example Local usage
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import { generateText } from 'ai';
|
|
26
|
+
* import { anthropic } from '@ai-sdk/anthropic';
|
|
27
|
+
* import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/vercel';
|
|
28
|
+
*
|
|
29
|
+
* const grepTool = createWarpGrepTool({ repoRoot: '.' });
|
|
30
|
+
*
|
|
31
|
+
* const result = await generateText({
|
|
32
|
+
* model: anthropic('claude-sonnet-4-5-20250929'),
|
|
33
|
+
* tools: { grep: grepTool },
|
|
34
|
+
* prompt: 'Find authentication middleware'
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @example Remote sandbox (E2B, Modal, etc.)
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const grepTool = createMorphWarpGrepTool({
|
|
41
|
+
* repoRoot: '/home/repo',
|
|
42
|
+
* remoteCommands: {
|
|
43
|
+
* grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,
|
|
44
|
+
* read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,
|
|
45
|
+
* listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,
|
|
46
|
+
* },
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
declare function createWarpGrepTool(config: WarpGrepToolConfig): ai.Tool<{
|
|
51
|
+
query: string;
|
|
52
|
+
}, {
|
|
53
|
+
success: boolean;
|
|
54
|
+
contexts: WarpGrepContext[] | undefined;
|
|
55
|
+
summary: string | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
|
|
58
|
+
declare const vercel_createWarpGrepTool: typeof createWarpGrepTool;
|
|
59
|
+
declare const vercel_execute: typeof execute;
|
|
60
|
+
declare const vercel_formatResult: typeof formatResult;
|
|
61
|
+
declare const vercel_getSystemPrompt: typeof getSystemPrompt;
|
|
62
|
+
declare namespace vercel {
|
|
63
|
+
export { vercel_createWarpGrepTool as createWarpGrepTool, createWarpGrepTool as default, vercel_execute as execute, vercel_formatResult as formatResult, vercel_getSystemPrompt as getSystemPrompt };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export { createWarpGrepTool as c, execute as e, vercel as v };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@morphllm/morphsdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.58",
|
|
4
4
|
"description": "TypeScript SDK and CLI for Morph Fast Apply integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -32,6 +32,16 @@
|
|
|
32
32
|
"import": "./dist/tools/warp_grep/vercel.js",
|
|
33
33
|
"require": "./dist/tools/warp_grep/vercel.cjs"
|
|
34
34
|
},
|
|
35
|
+
"./tools/warp-grep/gemini": {
|
|
36
|
+
"types": "./dist/tools/warp_grep/gemini.d.ts",
|
|
37
|
+
"import": "./dist/tools/warp_grep/gemini.js",
|
|
38
|
+
"require": "./dist/tools/warp_grep/gemini.cjs"
|
|
39
|
+
},
|
|
40
|
+
"./tools/warp-grep/harness": {
|
|
41
|
+
"types": "./dist/tools/warp_grep/harness.d.ts",
|
|
42
|
+
"import": "./dist/tools/warp_grep/harness.js",
|
|
43
|
+
"require": "./dist/tools/warp_grep/harness.cjs"
|
|
44
|
+
},
|
|
35
45
|
"./tools/fastapply": {
|
|
36
46
|
"types": "./dist/tools/fastapply/index.d.ts",
|
|
37
47
|
"import": "./dist/tools/fastapply/index.js",
|
|
@@ -112,7 +122,7 @@
|
|
|
112
122
|
"!dist/**/*.test.*"
|
|
113
123
|
],
|
|
114
124
|
"scripts": {
|
|
115
|
-
"build": "tsup index.ts client.ts tools/index.ts tools/fastapply/index.ts tools/fastapply/core.ts tools/fastapply/types.ts tools/fastapply/prompts.ts tools/fastapply/anthropic.ts tools/fastapply/openai.ts tools/fastapply/vercel.ts tools/codebase_search/index.ts tools/codebase_search/core.ts tools/codebase_search/types.ts tools/codebase_search/prompts.ts tools/codebase_search/anthropic.ts tools/codebase_search/openai.ts tools/codebase_search/vercel.ts tools/warp_grep/index.ts tools/warp_grep/openai.ts tools/warp_grep/anthropic.ts tools/warp_grep/vercel.ts tools/warp_grep/agent/config.ts tools/warp_grep/agent/prompt.ts tools/warp_grep/agent/parser.ts tools/warp_grep/agent/runner.ts tools/warp_grep/agent/types.ts tools/warp_grep/agent/formatter.ts tools/warp_grep/
|
|
125
|
+
"build": "tsup index.ts client.ts tools/index.ts tools/fastapply/index.ts tools/fastapply/core.ts tools/fastapply/types.ts tools/fastapply/prompts.ts tools/fastapply/anthropic.ts tools/fastapply/openai.ts tools/fastapply/vercel.ts tools/codebase_search/index.ts tools/codebase_search/core.ts tools/codebase_search/types.ts tools/codebase_search/prompts.ts tools/codebase_search/anthropic.ts tools/codebase_search/openai.ts tools/codebase_search/vercel.ts tools/warp_grep/index.ts tools/warp_grep/client.ts tools/warp_grep/openai.ts tools/warp_grep/anthropic.ts tools/warp_grep/vercel.ts tools/warp_grep/gemini.ts tools/warp_grep/harness.ts tools/warp_grep/agent/config.ts tools/warp_grep/agent/prompt.ts tools/warp_grep/agent/parser.ts tools/warp_grep/agent/runner.ts tools/warp_grep/agent/types.ts tools/warp_grep/agent/formatter.ts tools/warp_grep/providers/types.ts tools/warp_grep/providers/local.ts tools/warp_grep/providers/remote.ts tools/warp_grep/tools/grep.ts tools/warp_grep/tools/analyse.ts tools/warp_grep/tools/read.ts tools/warp_grep/tools/finish.ts tools/warp_grep/utils/paths.ts tools/warp_grep/utils/ripgrep.ts tools/warp_grep/utils/format.ts tools/warp_grep/utils/files.ts git/index.ts git/client.ts git/config.ts git/types.ts tools/browser/index.ts tools/browser/core.ts tools/browser/types.ts tools/browser/prompts.ts tools/browser/anthropic.ts tools/browser/openai.ts tools/browser/vercel.ts modelrouter/index.ts modelrouter/core.ts modelrouter/types.ts tools/utils/resilience.ts tools/browser/live.ts --format esm,cjs --sourcemap --clean --dts --dts-resolve",
|
|
116
126
|
"prepare": "npm run build",
|
|
117
127
|
"typecheck": "tsc --noEmit",
|
|
118
128
|
"lint": "eslint .",
|
|
@@ -151,6 +161,7 @@
|
|
|
151
161
|
"@ai-sdk/anthropic": "^1.0.9",
|
|
152
162
|
"@ai-sdk/openai": "^2.0.35",
|
|
153
163
|
"@anthropic-ai/sdk": "^0.30.1",
|
|
164
|
+
"@google/generative-ai": "^0.21.0",
|
|
154
165
|
"@types/diff": "^7.0.2",
|
|
155
166
|
"@types/node": "^20.14.10",
|
|
156
167
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
@@ -166,12 +177,16 @@
|
|
|
166
177
|
},
|
|
167
178
|
"peerDependencies": {
|
|
168
179
|
"@anthropic-ai/sdk": ">=0.25.0",
|
|
180
|
+
"@google/generative-ai": ">=0.21.0",
|
|
169
181
|
"openai": ">=4.0.0"
|
|
170
182
|
},
|
|
171
183
|
"peerDependenciesMeta": {
|
|
172
184
|
"@anthropic-ai/sdk": {
|
|
173
185
|
"optional": true
|
|
174
186
|
},
|
|
187
|
+
"@google/generative-ai": {
|
|
188
|
+
"optional": true
|
|
189
|
+
},
|
|
175
190
|
"openai": {
|
|
176
191
|
"optional": true
|
|
177
192
|
}
|
package/dist/chunk-4ZHDBKBY.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
WARP_GREP_DESCRIPTION,
|
|
3
|
-
WARP_GREP_TOOL_NAME,
|
|
4
|
-
formatResult
|
|
5
|
-
} from "./chunk-QVRXBAMM.js";
|
|
6
|
-
import {
|
|
7
|
-
runWarpGrep
|
|
8
|
-
} from "./chunk-SALJ2K6S.js";
|
|
9
|
-
import {
|
|
10
|
-
getSystemPrompt
|
|
11
|
-
} from "./chunk-WETRQJGU.js";
|
|
12
|
-
import {
|
|
13
|
-
LocalRipgrepProvider
|
|
14
|
-
} from "./chunk-ZJIIICRA.js";
|
|
15
|
-
|
|
16
|
-
// tools/warp_grep/openai.ts
|
|
17
|
-
var TOOL_PARAMETERS = {
|
|
18
|
-
type: "object",
|
|
19
|
-
properties: {
|
|
20
|
-
query: { type: "string", description: "Free-form repository question" }
|
|
21
|
-
},
|
|
22
|
-
required: ["query"]
|
|
23
|
-
};
|
|
24
|
-
var warpGrepTool = {
|
|
25
|
-
type: "function",
|
|
26
|
-
function: {
|
|
27
|
-
name: WARP_GREP_TOOL_NAME,
|
|
28
|
-
description: WARP_GREP_DESCRIPTION,
|
|
29
|
-
parameters: TOOL_PARAMETERS
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
async function execute(input, config) {
|
|
33
|
-
const parsed = typeof input === "string" ? JSON.parse(input) : input;
|
|
34
|
-
const provider = config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
|
|
35
|
-
const result = await runWarpGrep({
|
|
36
|
-
query: parsed.query,
|
|
37
|
-
repoRoot: config.repoRoot,
|
|
38
|
-
provider,
|
|
39
|
-
excludes: config.excludes,
|
|
40
|
-
includes: config.includes,
|
|
41
|
-
debug: config.debug ?? false,
|
|
42
|
-
apiKey: config.apiKey
|
|
43
|
-
});
|
|
44
|
-
const finish = result.finish;
|
|
45
|
-
if (result.terminationReason !== "completed" || !finish?.metadata) {
|
|
46
|
-
return { success: false, error: "Search did not complete" };
|
|
47
|
-
}
|
|
48
|
-
const contexts = (finish.resolved ?? []).map((r) => ({
|
|
49
|
-
file: r.path,
|
|
50
|
-
content: r.content
|
|
51
|
-
}));
|
|
52
|
-
return { success: true, contexts, summary: finish.payload };
|
|
53
|
-
}
|
|
54
|
-
function createMorphWarpGrepTool(config) {
|
|
55
|
-
const tool = {
|
|
56
|
-
type: "function",
|
|
57
|
-
function: {
|
|
58
|
-
name: config.name ?? WARP_GREP_TOOL_NAME,
|
|
59
|
-
description: config.description ?? WARP_GREP_DESCRIPTION,
|
|
60
|
-
parameters: TOOL_PARAMETERS
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
return Object.assign(tool, {
|
|
64
|
-
execute: async (input) => {
|
|
65
|
-
return execute(input, config);
|
|
66
|
-
},
|
|
67
|
-
formatResult: (result) => {
|
|
68
|
-
return formatResult(result);
|
|
69
|
-
},
|
|
70
|
-
getSystemPrompt: () => {
|
|
71
|
-
return getSystemPrompt();
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
var openai_default = warpGrepTool;
|
|
76
|
-
|
|
77
|
-
export {
|
|
78
|
-
warpGrepTool,
|
|
79
|
-
execute,
|
|
80
|
-
createMorphWarpGrepTool,
|
|
81
|
-
openai_default
|
|
82
|
-
};
|
|
83
|
-
//# sourceMappingURL=chunk-4ZHDBKBY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/warp_grep/openai.ts"],"sourcesContent":["/**\n * OpenAI SDK adapter for morph-warp-grep tool\n */\n\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions';\nimport { runWarpGrep } from './agent/runner.js';\nimport { LocalRipgrepProvider } from './providers/local.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, getSystemPrompt } from './prompts.js';\nimport { formatResult } from './core.js';\nimport type { WarpGrepToolConfig, WarpGrepResult, WarpGrepContext } from './types.js';\n\n/**\n * Input schema for the warp grep tool\n */\nconst TOOL_PARAMETERS = {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Free-form repository question' },\n },\n required: ['query'],\n} as const;\n\n/**\n * OpenAI-native warp grep tool definition\n * \n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { warpGrepTool, execute } from '@morphllm/morphsdk/tools/warp-grep/openai';\n * \n * const client = new OpenAI();\n * const response = await client.chat.completions.create({\n * model: 'gpt-4o',\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: ChatCompletionTool = {\n type: 'function',\n function: {\n name: WARP_GREP_TOOL_NAME,\n description: WARP_GREP_DESCRIPTION,\n parameters: TOOL_PARAMETERS,\n },\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 const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n const provider = 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 apiKey: config.apiKey,\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// 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\n * ```typescript\n * import OpenAI from 'openai';\n * import { createMorphWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/openai';\n * \n * const tool = createMorphWarpGrepTool({\n * repoRoot: '.',\n * description: 'Custom tool description'\n * });\n * \n * const client = new OpenAI();\n * const response = await client.chat.completions.create({\n * model: 'gpt-4o',\n * tools: [tool],\n * messages: [{ role: 'user', content: 'Find authentication middleware' }]\n * });\n * \n * // Execute and format\n * const result = await tool.execute(toolCallArgs);\n * const formatted = tool.formatResult(result);\n * ```\n */\nexport function createMorphWarpGrepTool(config: WarpGrepToolConfig) {\n const tool: ChatCompletionTool = {\n type: 'function',\n function: {\n name: config.name ?? WARP_GREP_TOOL_NAME,\n description: config.description ?? WARP_GREP_DESCRIPTION,\n parameters: TOOL_PARAMETERS,\n },\n };\n\n return Object.assign(tool, {\n execute: async (input: unknown): Promise<WarpGrepResult> => {\n return execute(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\nexport default warpGrepTool;\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,YAAY;AAAA,IACV,OAAO,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,EACxE;AAAA,EACA,UAAU,CAAC,OAAO;AACpB;AAqBO,IAAM,eAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;AASA,eAAsB,QACpB,OACA,QACyB;AACzB,QAAM,SAAS,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC/D,QAAM,WAAW,OAAO,YAAY,IAAI,qBAAqB,OAAO,UAAU,OAAO,QAAQ;AAE7F,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,QAAQ,OAAO;AAAA,EACjB,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;AAiCO,SAAS,wBAAwB,QAA4B;AAClE,QAAM,OAA2B;AAAA,IAC/B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,OAAO,QAAQ;AAAA,MACrB,aAAa,OAAO,eAAe;AAAA,MACnC,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,OAAO,OAAO,MAAM;AAAA,IACzB,SAAS,OAAO,UAA4C;AAC1D,aAAO,QAAQ,OAAqC,MAAM;AAAA,IAC5D;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEA,IAAO,iBAAQ;","names":[]}
|
package/dist/chunk-73RQWOQC.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// tools/warp_grep/tools/analyse.ts
|
|
2
|
-
async function toolAnalyse(provider, args) {
|
|
3
|
-
const list = await provider.analyse({
|
|
4
|
-
path: args.path,
|
|
5
|
-
pattern: args.pattern ?? null,
|
|
6
|
-
maxResults: args.maxResults ?? 100,
|
|
7
|
-
maxDepth: args.maxDepth ?? 2
|
|
8
|
-
});
|
|
9
|
-
if (!list.length) return "empty";
|
|
10
|
-
return list.map((e) => `${" ".repeat(e.depth)}- ${e.type === "dir" ? "[D]" : "[F]"} ${e.name}`).join("\n");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export {
|
|
14
|
-
toolAnalyse
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=chunk-73RQWOQC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/warp_grep/tools/analyse.ts"],"sourcesContent":["import type { WarpGrepProvider } from '../providers/types.js';\n\nexport async function toolAnalyse(\n provider: WarpGrepProvider,\n args: { path: string; pattern?: string | null; maxResults?: number; maxDepth?: number }\n): Promise<string> {\n const list = await provider.analyse({\n path: args.path,\n pattern: args.pattern ?? null,\n maxResults: args.maxResults ?? 100,\n maxDepth: args.maxDepth ?? 2,\n });\n if (!list.length) return 'empty';\n return list\n .map((e) => `${' '.repeat(e.depth)}- ${e.type === 'dir' ? '[D]' : '[F]'} ${e.name}`)\n .join('\\n');\n}\n\n\n"],"mappings":";AAEA,eAAsB,YACpB,UACA,MACiB;AACjB,QAAM,OAAO,MAAM,SAAS,QAAQ;AAAA,IAClC,MAAM,KAAK;AAAA,IACX,SAAS,KAAK,WAAW;AAAA,IACzB,YAAY,KAAK,cAAc;AAAA,IAC/B,UAAU,KAAK,YAAY;AAAA,EAC7B,CAAC;AACD,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,SAAO,KACJ,IAAI,CAAC,MAAM,GAAG,KAAK,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,QAAQ,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,EACnF,KAAK,IAAI;AACd;","names":[]}
|
package/dist/chunk-7OQOOB3R.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=chunk-7OQOOB3R.js.map
|
package/dist/chunk-EK7OQPWD.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
// tools/warp_grep/tools/finish.ts
|
|
2
|
-
function normalizeFinishFiles(files) {
|
|
3
|
-
return files.map((f) => {
|
|
4
|
-
const merged = mergeRanges(f.lines);
|
|
5
|
-
return { path: f.path, lines: merged };
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
async function readFinishFiles(repoRoot, files, reader) {
|
|
9
|
-
const out = [];
|
|
10
|
-
for (const f of files) {
|
|
11
|
-
const ranges = mergeRanges(f.lines);
|
|
12
|
-
const chunks = [];
|
|
13
|
-
for (const [s, e] of ranges) {
|
|
14
|
-
const lines = await reader(f.path, s, e);
|
|
15
|
-
chunks.push(lines.join("\n"));
|
|
16
|
-
}
|
|
17
|
-
out.push({ path: f.path, ranges, content: chunks.join("\n") });
|
|
18
|
-
}
|
|
19
|
-
return out;
|
|
20
|
-
}
|
|
21
|
-
function mergeRanges(ranges) {
|
|
22
|
-
if (!ranges.length) return [];
|
|
23
|
-
const sorted = [...ranges].sort((a, b) => a[0] - b[0]);
|
|
24
|
-
const merged = [];
|
|
25
|
-
let [cs, ce] = sorted[0];
|
|
26
|
-
for (let i = 1; i < sorted.length; i++) {
|
|
27
|
-
const [s, e] = sorted[i];
|
|
28
|
-
if (s <= ce + 1) {
|
|
29
|
-
ce = Math.max(ce, e);
|
|
30
|
-
} else {
|
|
31
|
-
merged.push([cs, ce]);
|
|
32
|
-
cs = s;
|
|
33
|
-
ce = e;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
merged.push([cs, ce]);
|
|
37
|
-
return merged;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export {
|
|
41
|
-
normalizeFinishFiles,
|
|
42
|
-
readFinishFiles
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=chunk-EK7OQPWD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/warp_grep/tools/finish.ts"],"sourcesContent":["import type { FinishFileSpec } from '../agent/types.js';\nimport fs from 'fs/promises';\n\nexport function normalizeFinishFiles(files: FinishFileSpec[]): FinishFileSpec[] {\n return files.map((f) => {\n const merged = mergeRanges(f.lines);\n return { path: f.path, lines: merged };\n });\n}\n\nexport async function readFinishFiles(\n repoRoot: string,\n files: FinishFileSpec[],\n reader: (path: string, start: number, end: number) => Promise<string[]>\n): Promise<{ path: string; ranges: Array<[number, number]>; content: string }[]> {\n const out: { path: string; ranges: Array<[number, number]>; content: string }[] = [];\n for (const f of files) {\n const ranges = mergeRanges(f.lines);\n const chunks: string[] = [];\n for (const [s, e] of ranges) {\n const lines = await reader(f.path, s, e);\n chunks.push(lines.join('\\n'));\n }\n out.push({ path: f.path, ranges, content: chunks.join('\\n') });\n }\n return out;\n}\n\nfunction mergeRanges(ranges: Array<[number, number]>): Array<[number, number]> {\n if (!ranges.length) return [];\n const sorted = [...ranges].sort((a, b) => a[0] - b[0]);\n const merged: Array<[number, number]> = [];\n let [cs, ce] = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n const [s, e] = sorted[i];\n if (s <= ce + 1) {\n ce = Math.max(ce, e);\n } else {\n merged.push([cs, ce]);\n cs = s;\n ce = e;\n }\n }\n merged.push([cs, ce]);\n return merged;\n}\n\n\n"],"mappings":";AAGO,SAAS,qBAAqB,OAA2C;AAC9E,SAAO,MAAM,IAAI,CAAC,MAAM;AACtB,UAAM,SAAS,YAAY,EAAE,KAAK;AAClC,WAAO,EAAE,MAAM,EAAE,MAAM,OAAO,OAAO;AAAA,EACvC,CAAC;AACH;AAEA,eAAsB,gBACpB,UACA,OACA,QAC+E;AAC/E,QAAM,MAA4E,CAAC;AACnF,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,YAAY,EAAE,KAAK;AAClC,UAAM,SAAmB,CAAC;AAC1B,eAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC3B,YAAM,QAAQ,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC;AACvC,aAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,IAC9B;AACA,QAAI,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,SAAS,OAAO,KAAK,IAAI,EAAE,CAAC;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAA0D;AAC7E,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAC;AAC5B,QAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACrD,QAAM,SAAkC,CAAC;AACzC,MAAI,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC;AACvB,QAAI,KAAK,KAAK,GAAG;AACf,WAAK,KAAK,IAAI,IAAI,CAAC;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACpB,WAAK;AACL,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACpB,SAAO;AACT;","names":[]}
|
package/dist/chunk-GJURLQ3L.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
WARP_GREP_DESCRIPTION,
|
|
3
|
-
WARP_GREP_TOOL_NAME,
|
|
4
|
-
formatResult
|
|
5
|
-
} from "./chunk-QVRXBAMM.js";
|
|
6
|
-
import {
|
|
7
|
-
runWarpGrep
|
|
8
|
-
} from "./chunk-SALJ2K6S.js";
|
|
9
|
-
import {
|
|
10
|
-
getSystemPrompt
|
|
11
|
-
} from "./chunk-WETRQJGU.js";
|
|
12
|
-
import {
|
|
13
|
-
LocalRipgrepProvider
|
|
14
|
-
} from "./chunk-ZJIIICRA.js";
|
|
15
|
-
|
|
16
|
-
// tools/warp_grep/anthropic.ts
|
|
17
|
-
var INPUT_SCHEMA = {
|
|
18
|
-
type: "object",
|
|
19
|
-
properties: {
|
|
20
|
-
query: { type: "string", description: "Free-form repository question" }
|
|
21
|
-
},
|
|
22
|
-
required: ["query"]
|
|
23
|
-
};
|
|
24
|
-
var warpGrepTool = {
|
|
25
|
-
name: WARP_GREP_TOOL_NAME,
|
|
26
|
-
description: WARP_GREP_DESCRIPTION,
|
|
27
|
-
input_schema: INPUT_SCHEMA
|
|
28
|
-
};
|
|
29
|
-
async function execute(input, config) {
|
|
30
|
-
const parsed = typeof input === "string" ? JSON.parse(input) : input;
|
|
31
|
-
const provider = config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
|
|
32
|
-
const result = await runWarpGrep({
|
|
33
|
-
query: parsed.query,
|
|
34
|
-
repoRoot: config.repoRoot,
|
|
35
|
-
provider,
|
|
36
|
-
excludes: config.excludes,
|
|
37
|
-
includes: config.includes,
|
|
38
|
-
debug: config.debug ?? false,
|
|
39
|
-
apiKey: config.apiKey
|
|
40
|
-
});
|
|
41
|
-
const finish = result.finish;
|
|
42
|
-
if (result.terminationReason !== "completed" || !finish?.metadata) {
|
|
43
|
-
return { success: false, error: "Search did not complete" };
|
|
44
|
-
}
|
|
45
|
-
const contexts = (finish.resolved ?? []).map((r) => ({
|
|
46
|
-
file: r.path,
|
|
47
|
-
content: r.content
|
|
48
|
-
}));
|
|
49
|
-
return { success: true, contexts, summary: finish.payload };
|
|
50
|
-
}
|
|
51
|
-
function createMorphWarpGrepTool(config) {
|
|
52
|
-
const tool = {
|
|
53
|
-
name: config.name ?? WARP_GREP_TOOL_NAME,
|
|
54
|
-
description: config.description ?? WARP_GREP_DESCRIPTION,
|
|
55
|
-
input_schema: INPUT_SCHEMA
|
|
56
|
-
};
|
|
57
|
-
return Object.assign(tool, {
|
|
58
|
-
execute: async (input) => {
|
|
59
|
-
return execute(input, config);
|
|
60
|
-
},
|
|
61
|
-
formatResult: (result) => {
|
|
62
|
-
return formatResult(result);
|
|
63
|
-
},
|
|
64
|
-
getSystemPrompt: () => {
|
|
65
|
-
return getSystemPrompt();
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
var anthropic_default = warpGrepTool;
|
|
70
|
-
|
|
71
|
-
export {
|
|
72
|
-
warpGrepTool,
|
|
73
|
-
execute,
|
|
74
|
-
createMorphWarpGrepTool,
|
|
75
|
-
anthropic_default
|
|
76
|
-
};
|
|
77
|
-
//# sourceMappingURL=chunk-GJURLQ3L.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 { runWarpGrep } from './agent/runner.js';\nimport { LocalRipgrepProvider } from './providers/local.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, getSystemPrompt } from './prompts.js';\nimport { formatResult } from './core.js';\nimport type { WarpGrepToolConfig, WarpGrepResult, WarpGrepContext } 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 const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n const provider = 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 apiKey: config.apiKey,\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// 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\n * ```typescript\n * import Anthropic from '@anthropic-ai/sdk';\n * import { createMorphWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/anthropic';\n * \n * const tool = createMorphWarpGrepTool({\n * repoRoot: '.',\n * description: 'Custom tool description'\n * });\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 * // Execute and format\n * const result = await tool.execute(toolUseBlock.input);\n * const formatted = tool.formatResult(result);\n * ```\n */\nexport function createMorphWarpGrepTool(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 execute(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\nexport default warpGrepTool;\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,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,QAAM,SAAS,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC/D,QAAM,WAAW,OAAO,YAAY,IAAI,qBAAqB,OAAO,UAAU,OAAO,QAAQ;AAE7F,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,QAAQ,OAAO;AAAA,EACjB,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;AAiCO,SAAS,wBAAwB,QAA4B;AAClE,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,QAAQ,OAAqC,MAAM;AAAA,IAC5D;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEA,IAAO,oBAAQ;","names":[]}
|
package/dist/chunk-HQO45BAJ.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// tools/warp_grep/tools/read.ts
|
|
2
|
-
async function toolRead(provider, args) {
|
|
3
|
-
const res = await provider.read({ path: args.path, start: args.start, end: args.end });
|
|
4
|
-
if (res.error) {
|
|
5
|
-
return res.error;
|
|
6
|
-
}
|
|
7
|
-
if (!res.lines.length) return "(empty file)";
|
|
8
|
-
return res.lines.join("\n");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export {
|
|
12
|
-
toolRead
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=chunk-HQO45BAJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/warp_grep/tools/read.ts"],"sourcesContent":["import type { WarpGrepProvider } from '../providers/types.js';\n\nexport async function toolRead(\n provider: WarpGrepProvider,\n args: { path: string; start?: number; end?: number }\n): Promise<string> {\n const res = await provider.read({ path: args.path, start: args.start, end: args.end });\n // Return error message if present (graceful handling)\n if (res.error) {\n return res.error;\n }\n if (!res.lines.length) return '(empty file)';\n return res.lines.join('\\n');\n}\n\n\n"],"mappings":";AAEA,eAAsB,SACpB,UACA,MACiB;AACjB,QAAM,MAAM,MAAM,SAAS,KAAK,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,KAAK,KAAK,IAAI,CAAC;AAErF,MAAI,IAAI,OAAO;AACb,WAAO,IAAI;AAAA,EACb;AACA,MAAI,CAAC,IAAI,MAAM,OAAQ,QAAO;AAC9B,SAAO,IAAI,MAAM,KAAK,IAAI;AAC5B;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/warp_grep/agent/parser.ts"],"sourcesContent":["// Parses assistant lines into structured tool calls\nimport type { ToolCall } from './types.js';\n\n// Keep for backwards compatibility - no longer thrown, but exported for tests\nexport class LLMResponseParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LLMResponseParseError';\n }\n}\n\n// Valid tool command names\nconst VALID_COMMANDS = ['analyse', 'grep', 'read', 'finish'];\n\n/**\n * Preprocesses text to handle XML tags:\n * 1. Removes <think>...</think> blocks entirely\n * 2. Extracts content from <tool>...</tool> or <tool_call>...</tool_call> tags\n * 3. Passes through raw tool calls (lines starting with valid commands)\n * 4. Discards unclosed <tool...> tags\n */\nfunction preprocessText(text: string): string[] {\n // Step 1: Remove <think>...</think> blocks (including multiline)\n let processed = text.replace(/<think>[\\s\\S]*?<\\/think>/gi, '');\n \n // Step 2: Check for unclosed <tool or <tool_call tags and discard them\n // Find all opening tags and their positions\n const openingTagRegex = /<tool_call>|<tool>/gi;\n const closingTagRegex = /<\\/tool_call>|<\\/tool>/gi;\n \n // Count opening and closing tags\n const openingMatches = processed.match(openingTagRegex) || [];\n const closingMatches = processed.match(closingTagRegex) || [];\n \n // If there are more opening than closing tags, we have unclosed tags\n // In that case, only process complete tag pairs\n if (openingMatches.length > closingMatches.length) {\n // Remove any content after the last complete closing tag\n const lastClosingMatch = /<\\/tool_call>|<\\/tool>/gi;\n let lastClosingIndex = -1;\n let match;\n while ((match = lastClosingMatch.exec(processed)) !== null) {\n lastClosingIndex = match.index + match[0].length;\n }\n if (lastClosingIndex > 0) {\n processed = processed.slice(0, lastClosingIndex);\n }\n }\n \n // Step 3: Extract content from <tool_call>...</tool_call> and <tool>...</tool> tags\n const toolCallLines: string[] = [];\n const toolTagRegex = /<tool_call>([\\s\\S]*?)<\\/tool_call>|<tool>([\\s\\S]*?)<\\/tool>/gi;\n let tagMatch;\n \n while ((tagMatch = toolTagRegex.exec(processed)) !== null) {\n const content = (tagMatch[1] || tagMatch[2] || '').trim();\n if (content) {\n // Split content by newlines in case there are multiple tool calls in one tag\n const lines = content.split(/\\r?\\n/).map(l => l.trim()).filter(l => l);\n toolCallLines.push(...lines);\n }\n }\n \n // Step 4: Also extract raw tool calls (lines starting with valid commands)\n // This provides backwards compatibility\n const allLines = processed.split(/\\r?\\n/).map(l => l.trim());\n for (const line of allLines) {\n if (!line) continue;\n \n // Skip lines that are inside XML tags (already processed above)\n if (line.startsWith('<')) continue;\n \n // Check if line starts with a valid command\n const firstWord = line.split(/\\s/)[0];\n if (VALID_COMMANDS.includes(firstWord)) {\n // Avoid duplicates\n if (!toolCallLines.includes(line)) {\n toolCallLines.push(line);\n }\n }\n }\n \n return toolCallLines;\n}\n\nexport class LLMResponseParser {\n private readonly finishSpecSplitRe = /,(?=[^,\\s]+:)/;\n\n parse(text: string): ToolCall[] {\n if (typeof text !== 'string') {\n // no way we hit this, but sure, we can throw here\n throw new TypeError('Command text must be a string.');\n }\n \n // Preprocess to handle XML tags\n const lines = preprocessText(text);\n \n const commands: ToolCall[] = [];\n let finishAccumulator: Map<string, number[][]> | null = null;\n\n lines.forEach((line) => {\n if (!line || line.startsWith('#')) return;\n const parts = this.splitLine(line);\n if (parts.length === 0) return;\n const cmd = parts[0];\n switch (cmd) {\n case 'analyse':\n this.handleAnalyse(parts, line, commands);\n break;\n case 'grep':\n this.handleGrep(parts, line, commands);\n break;\n case 'read':\n this.handleRead(parts, line, commands);\n break;\n case 'finish':\n finishAccumulator = this.handleFinish(parts, line, commands, finishAccumulator);\n break;\n default:\n // Silently ignore unknown commands after preprocessing\n // (they might be remnants of XML or other content)\n break;\n }\n });\n\n if (finishAccumulator) {\n const map = finishAccumulator as Map<string, number[][]>;\n const entries = [...map.entries()];\n const filesPayload = entries.map(([path, ranges]) => ({\n path,\n lines: [...ranges].sort((a, b) => a[0] - b[0]) as Array<[number, number]>,\n }));\n commands.push({ name: 'finish', arguments: { files: filesPayload } });\n }\n return commands;\n }\n\n private splitLine(line: string): string[] {\n // Split by whitespace but keep quoted blocks as one\n const parts: string[] = [];\n let current = '';\n let inSingle = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === \"'\" && line[i - 1] !== '\\\\') {\n inSingle = !inSingle;\n current += ch;\n } else if (!inSingle && /\\s/.test(ch)) {\n if (current) {\n parts.push(current);\n current = '';\n }\n } else {\n current += ch;\n }\n }\n if (current) parts.push(current);\n return parts;\n }\n\n /** Helper to create a _skip tool call with an error message */\n private skip(message: string): ToolCall {\n return { name: '_skip', arguments: { message } };\n }\n\n private handleAnalyse(parts: string[], rawLine: string, commands: ToolCall[]) {\n // analyse <path> [pattern]\n if (parts.length < 2) {\n commands.push(this.skip(\n `[SKIPPED] Your command \"${rawLine}\" is missing a path. ` +\n `Correct format: analyse <path> [pattern]. Example: analyse src/`\n ));\n return;\n }\n const path = parts[1];\n const pattern = parts[2]?.replace(/^\"|\"$/g, '') ?? null;\n commands.push({ name: 'analyse', arguments: { path, pattern } });\n }\n\n // no glob tool in MCP\n\n private handleGrep(parts: string[], rawLine: string, commands: ToolCall[]) {\n // grep '<pattern>' <path>\n if (parts.length < 3) {\n commands.push(this.skip(\n `[SKIPPED] Your command \"${rawLine}\" is missing arguments. ` +\n `Correct format: grep '<pattern>' <path>. Example: grep 'TODO' src/`\n ));\n return;\n }\n let pat = parts[1];\n // Be lenient: accept unquoted patterns by treating the first arg as the pattern\n if (pat.startsWith(\"'\") && pat.endsWith(\"'\")) {\n pat = pat.slice(1, -1);\n }\n // If pattern is empty after processing, skip\n if (!pat) {\n commands.push(this.skip(\n `[SKIPPED] Your command \"${rawLine}\" has an empty pattern. ` +\n `Provide a non-empty search pattern. Example: grep 'function' src/`\n ));\n return;\n }\n commands.push({ name: 'grep', arguments: { pattern: pat, path: parts[2] } });\n }\n\n private handleRead(parts: string[], rawLine: string, commands: ToolCall[]) {\n // read <path>[:start-end]\n if (parts.length < 2) {\n commands.push(this.skip(\n `[SKIPPED] Your command \"${rawLine}\" is missing a path. ` +\n `Correct format: read <path> or read <path>:<start>-<end>. Example: read src/index.ts:1-50`\n ));\n return;\n }\n const spec = parts[1];\n const rangeIdx = spec.indexOf(':');\n if (rangeIdx === -1) {\n commands.push({ name: 'read', arguments: { path: spec } });\n return;\n }\n const filePath = spec.slice(0, rangeIdx);\n const range = spec.slice(rangeIdx + 1);\n const [s, e] = range.split('-').map(v => parseInt(v, 10));\n // If range is invalid, fallback to reading the whole file\n if (!Number.isFinite(s) || !Number.isFinite(e)) {\n commands.push({ name: 'read', arguments: { path: filePath } });\n return;\n }\n commands.push({ name: 'read', arguments: { path: filePath, start: s, end: e } });\n }\n\n private handleFinish(parts: string[], rawLine: string, commands: ToolCall[], acc: Map<string, number[][]> | null) {\n // finish file1:1-10,20-30 file2:5-7\n const map = acc ?? new Map<string, number[][]>();\n const args = parts.slice(1);\n for (const token of args) {\n const [filePath, rangesText] = token.split(':', 2);\n if (!filePath || !rangesText) {\n // Skip this malformed token, continue processing others\n commands.push(this.skip(\n `[SKIPPED] Invalid finish token \"${token}\". ` +\n `Correct format: finish <path>:<start>-<end>. Example: finish src/index.ts:1-50`\n ));\n continue;\n }\n const rangeSpecs = rangesText.split(',').filter(Boolean);\n for (const spec of rangeSpecs) {\n const [s, e] = spec.split('-').map(v => parseInt(v, 10));\n if (!Number.isFinite(s) || !Number.isFinite(e) || e < s) {\n // Skip this invalid range, continue with others\n commands.push(this.skip(\n `[SKIPPED] Invalid range \"${spec}\" in \"${token}\". ` +\n `Ranges must be <start>-<end> where start <= end. Example: 1-50`\n ));\n continue;\n }\n const arr = map.get(filePath) ?? [];\n arr.push([s, e]);\n map.set(filePath, arr);\n }\n }\n return map;\n }\n}\n"],"mappings":"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","names":[]}
|