@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,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.59",
|
|
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,11 @@
|
|
|
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
|
+
},
|
|
35
40
|
"./tools/warp-grep/harness": {
|
|
36
41
|
"types": "./dist/tools/warp_grep/harness.d.ts",
|
|
37
42
|
"import": "./dist/tools/warp_grep/harness.js",
|
|
@@ -117,7 +122,7 @@
|
|
|
117
122
|
"!dist/**/*.test.*"
|
|
118
123
|
],
|
|
119
124
|
"scripts": {
|
|
120
|
-
"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/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/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",
|
|
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",
|
|
121
126
|
"prepare": "npm run build",
|
|
122
127
|
"typecheck": "tsc --noEmit",
|
|
123
128
|
"lint": "eslint .",
|
|
@@ -156,6 +161,7 @@
|
|
|
156
161
|
"@ai-sdk/anthropic": "^1.0.9",
|
|
157
162
|
"@ai-sdk/openai": "^2.0.35",
|
|
158
163
|
"@anthropic-ai/sdk": "^0.30.1",
|
|
164
|
+
"@google/generative-ai": "^0.21.0",
|
|
159
165
|
"@types/diff": "^7.0.2",
|
|
160
166
|
"@types/node": "^20.14.10",
|
|
161
167
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
@@ -171,12 +177,16 @@
|
|
|
171
177
|
},
|
|
172
178
|
"peerDependencies": {
|
|
173
179
|
"@anthropic-ai/sdk": ">=0.25.0",
|
|
180
|
+
"@google/generative-ai": ">=0.21.0",
|
|
174
181
|
"openai": ">=4.0.0"
|
|
175
182
|
},
|
|
176
183
|
"peerDependenciesMeta": {
|
|
177
184
|
"@anthropic-ai/sdk": {
|
|
178
185
|
"optional": true
|
|
179
186
|
},
|
|
187
|
+
"@google/generative-ai": {
|
|
188
|
+
"optional": true
|
|
189
|
+
},
|
|
180
190
|
"openai": {
|
|
181
191
|
"optional": true
|
|
182
192
|
}
|
|
@@ -1 +0,0 @@
|
|
|
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, ToolCall, AgentFinish } from './types.js';\nimport { LLMResponseParser } from './parser.js';\nimport type { WarpGrepProvider } from '../providers/types.js';\nimport { toolRead } from '../tools/read.js';\nimport { toolAnalyse } from '../tools/analyse.js';\nimport { fetchWithRetry, withTimeout } from '../../utils/resilience.js';\nimport { formatAgentToolOutput } from './formatter.js';\nimport { readFinishFiles } from '../tools/finish.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\nasync function buildInitialState(repoRoot: string, query: string, provider: WarpGrepProvider): Promise<string> {\n // Summarize top-level directories and file counts using the provider\n // This works for both local and remote filesystems (Modal, E2B, etc.)\n try {\n const entries = await provider.analyse({ path: '.', maxResults: 100 });\n const dirs = entries.filter(e => e.type === 'dir').map(d => d.name).slice(0, 50);\n const files = entries.filter(e => e.type === 'file').map(f => f.name).slice(0, 50);\n const parts = [\n `<repo_root>${repoRoot}</repo_root>`,\n `<top_dirs>${dirs.join(', ')}</top_dirs>`,\n `<top_files>${files.join(', ')}</top_files>`,\n ];\n return parts.join('\\n');\n } catch {\n return `<repo_root>${repoRoot}</repo_root>`;\n }\n}\n\nfunction formatAssistantToolBlock(name: string, args: Record<string, unknown>, payload: string, isError = false): string {\n const argStr = Object.entries(args)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(' ');\n const prefix = isError ? 'error' : 'result';\n return `<${prefix} name=\"${name}\" ${argStr}>\\n${payload}\\n</${prefix}>`;\n}\n\nasync function callModel(messages: ChatMessage[], model: string, apiKey?: string): Promise<string> {\n const api = 'https://api.morphllm.com/v1/chat/completions';\n const fetchPromise = fetchWithRetry(\n api,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey || process.env.MORPH_API_KEY || ''}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0.0,\n max_tokens: 1024,\n messages,\n }),\n },\n {}\n );\n const resp = await withTimeout(fetchPromise, AGENT_CONFIG.TIMEOUT_MS, 'morph-warp-grep request timed out');\n if (!resp.ok) {\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 // system\n const systemMessage = { role: 'system' as const, content: getSystemPrompt() };\n messages.push(systemMessage);\n // user query\n const queryContent = `<query>${config.query}</query>`;\n messages.push({ role: 'user', content: queryContent });\n // initial state\n const initialState = await buildInitialState(repoRoot, config.query, config.provider);\n messages.push({ role: 'user', content: initialState });\n\n const maxRounds = AGENT_CONFIG.MAX_ROUNDS;\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 round = 1; round <= maxRounds; round += 1) {\n // call model\n const assistantContent = await callModel(messages, model, config.apiKey).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.' });\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 analyseCalls = toolCalls.filter(c => c.name === 'analyse');\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 // Execute ALL tools in parallel (grep, analyse, read)\n const allPromises: Array<Promise<string | { terminate: true; error: string }>> = [];\n \n // Grep calls\n for (const c of grepCalls) {\n const args = (c.arguments ?? {}) as { pattern: string; path: string };\n allPromises.push(\n provider.grep({ pattern: args.pattern, path: args.path }).then(\n grepRes => {\n // Check for ripgrep availability error\n if (grepRes.error) {\n return { terminate: true, error: grepRes.error };\n }\n const output = grepRes.lines.join('\\n') || 'no matches';\n return formatAgentToolOutput('grep', args, output, { isError: false });\n },\n err => formatAgentToolOutput('grep', args, String(err), { isError: true })\n )\n );\n }\n \n // Analyse calls\n for (const c of analyseCalls) {\n const args = (c.arguments ?? {}) as { path: string; pattern?: string | null };\n allPromises.push(\n toolAnalyse(provider, args).then(\n p => formatAgentToolOutput('analyse', args, p, { isError: false }),\n err => formatAgentToolOutput('analyse', args, String(err), { isError: true })\n )\n );\n }\n \n // Read calls\n for (const c of readCalls) {\n const args = (c.arguments ?? {}) as { path: string; start?: number; end?: 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 \n // Check for termination signals (e.g., ripgrep not available)\n for (const result of allResults) {\n if (typeof result === 'object' && 'terminate' in result) {\n errors.push({ message: result.error });\n return {\n terminationReason: 'terminated',\n messages,\n errors,\n };\n }\n formatted.push(result as string);\n }\n\n if (formatted.length > 0) {\n // Add turn counter message\n const turnsUsed = round;\n const turnsRemaining = 4 - turnsUsed;\n let turnMessage: string;\n if (turnsRemaining === 0) {\n turnMessage = `\\n\\n[Turn ${turnsUsed}/4] This is your LAST turn. You MUST call the finish tool now.`;\n } else if (turnsRemaining === 1) {\n turnMessage = `\\n\\n[Turn ${turnsUsed}/4] You have 1 turn remaining. Next turn you MUST call the finish tool.`;\n } else {\n turnMessage = `\\n\\n[Turn ${turnsUsed}/4] You have ${turnsRemaining} turns remaining.`;\n }\n messages.push({ role: 'user', content: formatted.join('\\n') + turnMessage });\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\n\n"],"mappings":"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","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-CFF636UC.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
WARP_GREP_DESCRIPTION
|
|
3
|
-
} from "./chunk-GJ5TYNRD.js";
|
|
4
|
-
import {
|
|
5
|
-
runWarpGrep
|
|
6
|
-
} from "./chunk-6X5UOY7B.js";
|
|
7
|
-
import {
|
|
8
|
-
LocalRipgrepProvider
|
|
9
|
-
} from "./chunk-ZJIIICRA.js";
|
|
10
|
-
|
|
11
|
-
// tools/warp_grep/vercel.ts
|
|
12
|
-
import { tool } from "ai";
|
|
13
|
-
import { z } from "zod";
|
|
14
|
-
var warpGrepSchema = z.object({
|
|
15
|
-
query: z.string().describe("Free-form repository question")
|
|
16
|
-
});
|
|
17
|
-
async function execute(input, config) {
|
|
18
|
-
const provider = config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
|
|
19
|
-
const result = await runWarpGrep({
|
|
20
|
-
query: input.query,
|
|
21
|
-
repoRoot: config.repoRoot,
|
|
22
|
-
provider,
|
|
23
|
-
excludes: config.excludes,
|
|
24
|
-
includes: config.includes,
|
|
25
|
-
debug: config.debug ?? false,
|
|
26
|
-
apiKey: config.apiKey
|
|
27
|
-
});
|
|
28
|
-
const finish = result.finish;
|
|
29
|
-
if (result.terminationReason !== "completed" || !finish?.metadata) {
|
|
30
|
-
return { success: false, error: "Search did not complete" };
|
|
31
|
-
}
|
|
32
|
-
const contexts = (finish.resolved ?? []).map((r) => ({
|
|
33
|
-
file: r.path,
|
|
34
|
-
content: r.content
|
|
35
|
-
}));
|
|
36
|
-
return { success: true, contexts, summary: finish.payload };
|
|
37
|
-
}
|
|
38
|
-
function createMorphWarpGrepTool(config) {
|
|
39
|
-
return tool({
|
|
40
|
-
description: config.description ?? WARP_GREP_DESCRIPTION,
|
|
41
|
-
inputSchema: warpGrepSchema,
|
|
42
|
-
execute: async (params) => {
|
|
43
|
-
const provider = config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);
|
|
44
|
-
const result = await runWarpGrep({
|
|
45
|
-
query: params.query,
|
|
46
|
-
repoRoot: config.repoRoot,
|
|
47
|
-
provider,
|
|
48
|
-
excludes: config.excludes,
|
|
49
|
-
includes: config.includes,
|
|
50
|
-
debug: config.debug ?? false,
|
|
51
|
-
apiKey: config.apiKey
|
|
52
|
-
});
|
|
53
|
-
const finish = result.finish;
|
|
54
|
-
if (result.terminationReason !== "completed" || !finish?.metadata) {
|
|
55
|
-
return { success: false, error: "Search did not complete" };
|
|
56
|
-
}
|
|
57
|
-
const contexts = (finish.resolved ?? []).map((r) => ({
|
|
58
|
-
file: r.path,
|
|
59
|
-
content: r.content
|
|
60
|
-
}));
|
|
61
|
-
return { success: true, contexts, summary: finish.payload };
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export {
|
|
67
|
-
execute,
|
|
68
|
-
createMorphWarpGrepTool
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=chunk-CFF636UC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 { runWarpGrep } from './agent/runner.js';\nimport { LocalRipgrepProvider } from './providers/local.js';\nimport { WARP_GREP_DESCRIPTION, getSystemPrompt } from './prompts.js';\nimport { formatResult } from './core.js';\nimport type { WarpGrepToolConfig, WarpGrepResult, WarpGrepContext } from './types.js';\n\n/**\n * Zod schema for warp grep input\n */\nconst warpGrepSchema = z.object({\n query: z.string().describe('Free-form repository question'),\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 },\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n const provider = config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);\n \n const result = await runWarpGrep({\n query: input.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 Vercel AI SDK warp grep tool\n * \n * @param config - Configuration options\n * @returns Vercel AI SDK tool\n * \n * @example\n * ```typescript\n * import { generateText } from 'ai';\n * import { anthropic } from '@ai-sdk/anthropic';\n * import { createMorphWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/vercel';\n * \n * const grepTool = createMorphWarpGrepTool({ 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 */\nexport function createMorphWarpGrepTool(config: WarpGrepToolConfig) {\n return tool({\n description: config.description ?? WARP_GREP_DESCRIPTION,\n inputSchema: warpGrepSchema,\n execute: async (params) => {\n const provider = config.provider ?? new LocalRipgrepProvider(config.repoRoot, config.excludes);\n const result = await runWarpGrep({\n query: params.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}\n"],"mappings":";;;;;;;;;;;AAIA,SAAS,YAAY;AACrB,SAAS,SAAS;AAUlB,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,OAAO,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAC5D,CAAC;AASD,eAAsB,QACpB,OACA,QACyB;AACzB,QAAM,WAAW,OAAO,YAAY,IAAI,qBAAqB,OAAO,UAAU,OAAO,QAAQ;AAE7F,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,OAAO,MAAM;AAAA,IACb,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;AA0BO,SAAS,wBAAwB,QAA4B;AAClE,SAAO,KAAK;AAAA,IACV,aAAa,OAAO,eAAe;AAAA,IACnC,aAAa;AAAA,IACb,SAAS,OAAO,WAAW;AACzB,YAAM,WAAW,OAAO,YAAY,IAAI,qBAAqB,OAAO,UAAU,OAAO,QAAQ;AAC7F,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B,OAAO,OAAO;AAAA,QACd,UAAU,OAAO;AAAA,QACjB;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO,SAAS;AAAA,QACvB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAED,YAAM,SAAS,OAAO;AACtB,UAAI,OAAO,sBAAsB,eAAe,CAAC,QAAQ,UAAU;AACjE,eAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B;AAAA,MAC5D;AAEA,YAAM,YAA+B,OAAO,YAAY,CAAC,GAAG,IAAI,QAAM;AAAA,QACpE,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,MACb,EAAE;AAEF,aAAO,EAAE,SAAS,MAAM,UAAU,SAAS,OAAO,QAAQ;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;","names":[]}
|
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-GJ5TYNRD.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
runWarpGrep
|
|
3
|
-
} from "./chunk-6X5UOY7B.js";
|
|
4
|
-
import {
|
|
5
|
-
LocalRipgrepProvider
|
|
6
|
-
} from "./chunk-ZJIIICRA.js";
|
|
7
|
-
|
|
8
|
-
// tools/warp_grep/core.ts
|
|
9
|
-
var WarpGrepClient = class {
|
|
10
|
-
config;
|
|
11
|
-
constructor(config = {}) {
|
|
12
|
-
this.config = {
|
|
13
|
-
apiKey: config.apiKey,
|
|
14
|
-
debug: config.debug,
|
|
15
|
-
timeout: config.timeout,
|
|
16
|
-
retryConfig: config.retryConfig
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Execute a code search query
|
|
21
|
-
*
|
|
22
|
-
* @param input - Search parameters including query, repoRoot, and optional provider
|
|
23
|
-
* @returns Search results with relevant code contexts
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* const result = await client.execute({
|
|
28
|
-
* query: 'Find authentication middleware',
|
|
29
|
-
* repoRoot: '.'
|
|
30
|
-
* });
|
|
31
|
-
*
|
|
32
|
-
* if (result.success) {
|
|
33
|
-
* for (const ctx of result.contexts) {
|
|
34
|
-
* console.log(`File: ${ctx.file}`);
|
|
35
|
-
* console.log(ctx.content);
|
|
36
|
-
* }
|
|
37
|
-
* }
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
async execute(input) {
|
|
41
|
-
const provider = input.provider ?? new LocalRipgrepProvider(input.repoRoot, input.excludes);
|
|
42
|
-
const result = await runWarpGrep({
|
|
43
|
-
query: input.query,
|
|
44
|
-
repoRoot: input.repoRoot,
|
|
45
|
-
provider,
|
|
46
|
-
excludes: input.excludes,
|
|
47
|
-
includes: input.includes,
|
|
48
|
-
debug: input.debug ?? this.config.debug ?? false,
|
|
49
|
-
apiKey: this.config.apiKey
|
|
50
|
-
});
|
|
51
|
-
const finish = result.finish;
|
|
52
|
-
if (result.terminationReason !== "completed" || !finish?.metadata) {
|
|
53
|
-
return {
|
|
54
|
-
success: false,
|
|
55
|
-
error: "Search did not complete"
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
const contexts = (finish.resolved ?? []).map((r) => ({
|
|
59
|
-
file: r.path,
|
|
60
|
-
content: r.content
|
|
61
|
-
}));
|
|
62
|
-
return {
|
|
63
|
-
success: true,
|
|
64
|
-
contexts,
|
|
65
|
-
summary: finish.payload
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
async function executeWarpGrep(input, config) {
|
|
70
|
-
const client = new WarpGrepClient(config);
|
|
71
|
-
return client.execute(input);
|
|
72
|
-
}
|
|
73
|
-
function formatResult(result) {
|
|
74
|
-
if (!result.success) {
|
|
75
|
-
return `Search failed: ${result.error}`;
|
|
76
|
-
}
|
|
77
|
-
if (!result.contexts || result.contexts.length === 0) {
|
|
78
|
-
return "No relevant code found. Try rephrasing your query.";
|
|
79
|
-
}
|
|
80
|
-
const lines = [];
|
|
81
|
-
lines.push(`Found ${result.contexts.length} relevant code sections:
|
|
82
|
-
`);
|
|
83
|
-
result.contexts.forEach((ctx, i) => {
|
|
84
|
-
lines.push(`${i + 1}. ${ctx.file}`);
|
|
85
|
-
lines.push("```");
|
|
86
|
-
lines.push(ctx.content);
|
|
87
|
-
lines.push("```");
|
|
88
|
-
lines.push("");
|
|
89
|
-
});
|
|
90
|
-
if (result.summary) {
|
|
91
|
-
lines.push(`Summary: ${result.summary}`);
|
|
92
|
-
}
|
|
93
|
-
return lines.join("\n");
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// tools/warp_grep/prompts.ts
|
|
97
|
-
var WARP_GREP_TOOL_NAME = "warpgrep_codebase_search";
|
|
98
|
-
var WARP_GREP_DESCRIPTION = 'IMPORTANT: If you need to explore the codebase to gather context, and the task does not involve a single file or function which is provided by name, you should ALWAYS use the warpgrep codebase search tool first instead of running search commands. When the task requires exploration beyond a single known file, invoke warpgrep first with a natural-language query describing the target functionality, bug, or architectural concern. Warp Grep is a fast and accurate tool that can search for all relevant context in a codebase. Keep queries action-oriented (e.g., "Find where billing invoices are generated and emailed"), and after reviewing the summarized results, you may verify important findings with other search tools or direct file reads to ensure completeness. Warp Grep can be used for query types like: find function responsible for <small feature>; find code that does <description>; find code path for <big feature>; Where does <minimal error message> come from?; or any query of that type. When a task requires exploration beyond a single known file, ALWAYS default to warpgrep codebase search before other search mechanisms.';
|
|
99
|
-
|
|
100
|
-
export {
|
|
101
|
-
WarpGrepClient,
|
|
102
|
-
executeWarpGrep,
|
|
103
|
-
formatResult,
|
|
104
|
-
WARP_GREP_TOOL_NAME,
|
|
105
|
-
WARP_GREP_DESCRIPTION
|
|
106
|
-
};
|
|
107
|
-
//# sourceMappingURL=chunk-GJ5TYNRD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/warp_grep/core.ts","../tools/warp_grep/prompts.ts"],"sourcesContent":["/**\n * Core implementation for morph-warp-grep\n * Provides a client class for programmatic code search\n */\n\nimport { runWarpGrep } from './agent/runner.js';\nimport { LocalRipgrepProvider } from './providers/local.js';\nimport type { \n WarpGrepClientConfig, \n WarpGrepInput, \n WarpGrepResult,\n WarpGrepContext,\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({ apiKey: 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 apiKey: config.apiKey,\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 // Default to LocalRipgrepProvider if no provider specified\n const provider = input.provider ?? new LocalRipgrepProvider(input.repoRoot, input.excludes);\n \n const result = await runWarpGrep({\n query: input.query,\n repoRoot: input.repoRoot,\n provider,\n excludes: input.excludes,\n includes: input.includes,\n debug: input.debug ?? this.config.debug ?? false,\n apiKey: this.config.apiKey,\n });\n\n const finish = result.finish;\n if (result.terminationReason !== 'completed' || !finish?.metadata) {\n return { \n success: false, \n error: 'Search did not complete',\n };\n }\n\n const contexts: WarpGrepContext[] = (finish.resolved ?? []).map(r => ({\n file: r.path,\n content: r.content,\n }));\n\n return { \n success: true, \n contexts, \n summary: finish.payload,\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\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","/**\n * Prompts and descriptions for warpgrep_codebase_search\n */\n\n/**\n * Default tool name for the warp grep tool\n */\nexport const WARP_GREP_TOOL_NAME = 'warpgrep_codebase_search';\n\n/**\n * Default tool description for the warp grep tool\n */\nexport const WARP_GREP_DESCRIPTION = \n 'IMPORTANT: If you need to explore the codebase to gather context, and the task does not involve a single file or function which is provided by name, you should ALWAYS use the warpgrep codebase search tool first instead of running search commands. ' +\n 'When the task requires exploration beyond a single known file, invoke warpgrep first with a natural-language query describing the target functionality, bug, or architectural concern. ' +\n 'Warp Grep is a fast and accurate tool that can search for all relevant context in a codebase. ' +\n 'Keep queries action-oriented (e.g., \"Find where billing invoices are generated and emailed\"), and after reviewing the summarized results, you may verify important findings with other search tools or direct file reads to ensure completeness. ' +\n 'Warp Grep can be used for query types like: find function responsible for <small feature>; find code that does <description>; find code path for <big feature>; Where does <minimal error message> come from?; or any query of that type. ' +\n 'When a task requires exploration beyond a single known file, ALWAYS default to warpgrep codebase search before other search mechanisms.'\n\n/**\n * System prompt for the warp grep agent\n * Re-exported from agent/prompt.ts for convenience\n */\nexport { SYSTEM_PROMPT as WARP_GREP_SYSTEM_PROMPT, getSystemPrompt } from './agent/prompt.js';\n"],"mappings":";;;;;;;;AAqCO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,SAA+B,CAAC,GAAG;AAC7C,SAAK,SAAS;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,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;AAE3D,UAAM,WAAW,MAAM,YAAY,IAAI,qBAAqB,MAAM,UAAU,MAAM,QAAQ;AAE1F,UAAM,SAAS,MAAM,YAAY;AAAA,MAC/B,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM,SAAS,KAAK,OAAO,SAAS;AAAA,MAC3C,QAAQ,KAAK,OAAO;AAAA,IACtB,CAAC;AAED,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,sBAAsB,eAAe,CAAC,QAAQ,UAAU;AACjE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,YAA+B,OAAO,YAAY,CAAC,GAAG,IAAI,QAAM;AAAA,MACpE,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,IACb,EAAE;AAEF,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAmBA,eAAsB,gBACpB,OACA,QACyB;AACzB,QAAM,SAAS,IAAI,eAAe,MAAM;AACxC,SAAO,OAAO,QAAQ,KAAK;AAC7B;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;;;AC1JO,IAAM,sBAAsB;AAK5B,IAAM,wBACX;","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":[]}
|