@curie-agent/tools 0.3.0 → 0.3.4
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/.tsbuildinfo +1 -1
- package/dist/src/bash.d.ts.map +1 -1
- package/dist/src/bash.js +6 -1
- package/dist/src/bash.js.map +1 -1
- package/dist/src/edit.d.ts.map +1 -1
- package/dist/src/edit.js +48 -20
- package/dist/src/edit.js.map +1 -1
- package/dist/src/glob.d.ts +4 -0
- package/dist/src/glob.d.ts.map +1 -1
- package/dist/src/glob.js +21 -11
- package/dist/src/glob.js.map +1 -1
- package/dist/src/grep.d.ts +3 -2
- package/dist/src/grep.d.ts.map +1 -1
- package/dist/src/grep.js +203 -47
- package/dist/src/grep.js.map +1 -1
- package/dist/src/index.d.ts +24 -25
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/read.d.ts +0 -1
- package/dist/src/read.d.ts.map +1 -1
- package/dist/src/read.js +37 -16
- package/dist/src/read.js.map +1 -1
- package/dist/src/todo.d.ts +1 -1
- package/dist/src/tool.d.ts +9 -1
- package/dist/src/tool.d.ts.map +1 -1
- package/dist/src/tool.js +83 -17
- package/dist/src/tool.js.map +1 -1
- package/dist/src/wiki.d.ts +1 -1
- package/dist/src/write.d.ts.map +1 -1
- package/dist/src/write.js +15 -3
- package/dist/src/write.js.map +1 -1
- package/package.json +3 -3
package/dist/src/glob.js
CHANGED
|
@@ -13,11 +13,11 @@ const GlobSchema = z.object({
|
|
|
13
13
|
.optional()
|
|
14
14
|
.describe('Directory to search in. Defaults to cwd. Accepts forward or backward slashes.'),
|
|
15
15
|
});
|
|
16
|
-
function minimatch(pattern, str) {
|
|
16
|
+
export function minimatch(pattern, str) {
|
|
17
17
|
const regex = globToRegex(pattern);
|
|
18
18
|
return regex.test(str);
|
|
19
19
|
}
|
|
20
|
-
function globToRegex(pattern) {
|
|
20
|
+
export function globToRegex(pattern) {
|
|
21
21
|
// Use unique Unicode placeholders instead of backslash-escaping to avoid conflicts
|
|
22
22
|
// between the ** protection and single-* replacement steps.
|
|
23
23
|
const placeholder = '';
|
|
@@ -29,7 +29,7 @@ function globToRegex(pattern) {
|
|
|
29
29
|
.replace(/\?/g, '[^/]');
|
|
30
30
|
return new RegExp(`^${regex}$`);
|
|
31
31
|
}
|
|
32
|
-
function readGitignore(cwd) {
|
|
32
|
+
export function readGitignore(cwd) {
|
|
33
33
|
const gitignorePath = path.join(cwd, '.gitignore');
|
|
34
34
|
if (!fs.existsSync(gitignorePath))
|
|
35
35
|
return [];
|
|
@@ -39,19 +39,29 @@ function readGitignore(cwd) {
|
|
|
39
39
|
.map((l) => l.trim())
|
|
40
40
|
.filter((l) => l && !l.startsWith('#'));
|
|
41
41
|
}
|
|
42
|
-
function shouldIgnore(relPath, patterns) {
|
|
42
|
+
export function shouldIgnore(relPath, patterns) {
|
|
43
43
|
for (const p of patterns) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
const clean = p.replace(/\/$/, '');
|
|
45
|
+
if (!clean)
|
|
46
|
+
continue;
|
|
47
|
+
if (clean.includes('/')) {
|
|
48
|
+
// Anchored pattern: match the relative path itself or as a directory prefix.
|
|
49
|
+
if (minimatch(clean, relPath))
|
|
50
|
+
return true;
|
|
51
|
+
if (relPath.startsWith(clean + '/'))
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Bare pattern (gitignore semantics): matches any path segment at any depth,
|
|
56
|
+
// e.g. "dist" ignores dist/ and packages/foo/dist/.
|
|
57
|
+
if (relPath.split('/').some((segment) => minimatch(clean, segment)))
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
50
60
|
}
|
|
51
61
|
return false;
|
|
52
62
|
}
|
|
53
63
|
export const globTool = createTool('Glob', [
|
|
54
|
-
'Fast, gitignore-aware recursive file search by glob pattern.',
|
|
64
|
+
'Fast, gitignore-aware recursive file search by glob pattern (finds files by NAME — use Grep to search file contents).',
|
|
55
65
|
'Pattern syntax: `*` matches anything within one directory level; `**` matches across any depth.',
|
|
56
66
|
'Always use forward slashes in patterns, even on Windows (e.g., `src/**/*.ts`).',
|
|
57
67
|
'When `path` is supplied, the pattern matches relative to that directory.',
|
package/dist/src/glob.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AAErE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CACP,uEAAuE;QACrE,uFAAuF,CAC1F;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+EAA+E,CAAC;CAC7F,CAAC,CAAC;AAEH,
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"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"}
|
package/dist/src/grep.d.ts
CHANGED
|
@@ -4,9 +4,10 @@ export declare const grepTool: import("./tool.js").Tool & {
|
|
|
4
4
|
path?: string | undefined;
|
|
5
5
|
glob?: string | undefined;
|
|
6
6
|
type?: string | undefined;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
case_insensitive?: boolean | undefined;
|
|
8
|
+
line_numbers?: boolean | undefined;
|
|
9
9
|
context?: number | undefined;
|
|
10
|
+
head_limit?: number | undefined;
|
|
10
11
|
};
|
|
11
12
|
};
|
|
12
13
|
//# sourceMappingURL=grep.d.ts.map
|
package/dist/src/grep.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/grep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/grep.ts"],"names":[],"mappings":"AAkFA,eAAO,MAAM,QAAQ;;;;;;;;;;;CAmLpB,CAAC"}
|
package/dist/src/grep.js
CHANGED
|
@@ -2,28 +2,77 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { isPathAllowed, parseAllowlist } from '@curie-agent/core/safety/path-guard.js';
|
|
5
|
+
import { minimatch, readGitignore, shouldIgnore } from './glob.js';
|
|
5
6
|
import { createTool, expandPath } from './tool.js';
|
|
6
|
-
const GrepSchema = z.object({
|
|
7
|
-
pattern: z.string().describe('The regular expression pattern to search for'),
|
|
8
|
-
path: z.string().optional().describe('File or directory to search in'),
|
|
9
|
-
glob: z.string().optional().describe('Glob pattern to filter files'),
|
|
10
|
-
type: z.string().optional().describe('File type to search (js, py, ts, etc.)'),
|
|
11
|
-
'-i': z.boolean().optional().describe('Case insensitive search'),
|
|
12
|
-
'-n': z.boolean().optional().describe('Show line numbers'),
|
|
13
|
-
context: z.number().optional().describe('Lines of context before and after'),
|
|
14
|
-
});
|
|
15
7
|
const EXT_MAP = {
|
|
16
|
-
js: ['.js', '.jsx', '.mjs'],
|
|
17
|
-
ts: ['.ts', '.tsx'],
|
|
8
|
+
js: ['.js', '.jsx', '.mjs', '.cjs'],
|
|
9
|
+
ts: ['.ts', '.tsx', '.mts', '.cts'],
|
|
18
10
|
py: ['.py'],
|
|
19
11
|
rust: ['.rs'],
|
|
12
|
+
rs: ['.rs'],
|
|
20
13
|
go: ['.go'],
|
|
21
14
|
java: ['.java'],
|
|
22
15
|
rb: ['.rb'],
|
|
23
|
-
|
|
16
|
+
c: ['.c', '.h'],
|
|
17
|
+
cpp: ['.cpp', '.cc', '.cxx', '.hpp', '.hh'],
|
|
18
|
+
cs: ['.cs'],
|
|
19
|
+
php: ['.php'],
|
|
20
|
+
swift: ['.swift'],
|
|
21
|
+
kotlin: ['.kt', '.kts'],
|
|
22
|
+
scala: ['.scala'],
|
|
23
|
+
sh: ['.sh', '.bash'],
|
|
24
|
+
md: ['.md', '.markdown'],
|
|
25
|
+
json: ['.json', '.jsonc'],
|
|
26
|
+
yaml: ['.yml', '.yaml'],
|
|
27
|
+
html: ['.html', '.htm'],
|
|
28
|
+
css: ['.css', '.scss', '.less'],
|
|
29
|
+
sql: ['.sql'],
|
|
30
|
+
toml: ['.toml'],
|
|
31
|
+
xml: ['.xml'],
|
|
24
32
|
};
|
|
25
|
-
|
|
26
|
-
|
|
33
|
+
const FILE_TYPES = Object.keys(EXT_MAP);
|
|
34
|
+
const MAX_FILE_SIZE = 1_000_000; // skip files larger than 1 MB
|
|
35
|
+
const MAX_LINE_LENGTH = 300;
|
|
36
|
+
const DEFAULT_HEAD_LIMIT = 250;
|
|
37
|
+
const GrepSchema = z.object({
|
|
38
|
+
pattern: z
|
|
39
|
+
.string()
|
|
40
|
+
.describe('The regular expression to search for (JavaScript RegExp syntax). ' +
|
|
41
|
+
'Escape literal characters like ( ) [ ] { } . + * ? with a backslash.'),
|
|
42
|
+
path: z
|
|
43
|
+
.string()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe('File or directory to search in. Defaults to the current working directory.'),
|
|
46
|
+
glob: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Glob pattern to filter which files are searched (e.g. "*.ts", "src/**/*.tsx"). ' +
|
|
50
|
+
'Patterns without "/" match against the file name only.'),
|
|
51
|
+
type: z
|
|
52
|
+
.enum(FILE_TYPES)
|
|
53
|
+
.optional()
|
|
54
|
+
.describe(`File type to search, one of: ${FILE_TYPES.join(', ')}`),
|
|
55
|
+
case_insensitive: z.boolean().optional().describe('Case-insensitive search (default false)'),
|
|
56
|
+
line_numbers: z.boolean().optional().describe('Include 1-based line numbers in results (default true)'),
|
|
57
|
+
context: z.number().optional().describe('Number of lines to include before and after each match'),
|
|
58
|
+
head_limit: z
|
|
59
|
+
.number()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe(`Maximum number of match rows to return (default ${String(DEFAULT_HEAD_LIMIT)})`),
|
|
62
|
+
});
|
|
63
|
+
function truncateLine(line) {
|
|
64
|
+
return line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '…' : line;
|
|
65
|
+
}
|
|
66
|
+
export const grepTool = createTool('Grep', [
|
|
67
|
+
'Searches file CONTENTS for a regular expression (use Glob to find files by NAME).',
|
|
68
|
+
'Gitignore-aware: files ignored by .gitignore (plus node_modules/.git) are skipped,',
|
|
69
|
+
'unless `path` points directly inside an ignored directory (e.g. deliberately searching dist/).',
|
|
70
|
+
'Filter files with `glob` (e.g. "*.ts") or `type` (e.g. "ts"). `path` may be a directory or a single file.',
|
|
71
|
+
'Results are grouped by file with cwd-relative forward-slash paths and 1-based line numbers,',
|
|
72
|
+
'capped at `head_limit` rows (default 250) with an explicit truncation notice — narrow the search when you see one.',
|
|
73
|
+
].join(' '), GrepSchema, async (input, ctx) => {
|
|
74
|
+
const rawPath = input.path ? input.path.replace(/\\/g, '/') : undefined;
|
|
75
|
+
const searchPath = rawPath ? path.resolve(ctx.cwd, expandPath(rawPath)) : ctx.cwd;
|
|
27
76
|
// Safety: refuse searches outside allowed directories.
|
|
28
77
|
if (ctx.settings.safety?.path_guard !== 'off') {
|
|
29
78
|
const allowlist = parseAllowlist(ctx.settings.safety?.path_allowlist ?? '');
|
|
@@ -31,12 +80,113 @@ export const grepTool = createTool('Grep', 'Content search with regex support. S
|
|
|
31
80
|
return { output: null, error: 'PathGuard: grep blocked — path is outside allowed directories' };
|
|
32
81
|
}
|
|
33
82
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
83
|
+
let regex;
|
|
84
|
+
try {
|
|
85
|
+
regex = new RegExp(input.pattern, input.case_insensitive ? 'i' : '');
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
89
|
+
return {
|
|
90
|
+
output: null,
|
|
91
|
+
error: `Invalid regular expression "${input.pattern}": ${msg}. ` +
|
|
92
|
+
'Escape literal characters like ( ) [ ] { } . + * ? with a backslash.',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
let stat;
|
|
96
|
+
try {
|
|
97
|
+
stat = fs.statSync(searchPath);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return { output: null, error: `Path not found: ${searchPath}` };
|
|
101
|
+
}
|
|
102
|
+
const searchDir = stat.isDirectory() ? searchPath : path.dirname(searchPath);
|
|
103
|
+
const searchRel = path.relative(ctx.cwd, searchPath).replace(/\\/g, '/');
|
|
104
|
+
const insideCwd = searchRel === '' || (!searchRel.startsWith('..') && !path.isAbsolute(searchRel));
|
|
105
|
+
// Gitignore filtering: cwd patterns plus local patterns from the search dir.
|
|
106
|
+
// When the caller explicitly targets a path that is itself gitignored
|
|
107
|
+
// (e.g. grepping dist/ on purpose), respect that intent and skip filtering.
|
|
108
|
+
const cwdPatterns = insideCwd ? readGitignore(ctx.cwd) : [];
|
|
109
|
+
const localPatterns = searchDir !== ctx.cwd ? readGitignore(searchDir) : [];
|
|
110
|
+
// Check both "dist" and "dist/" forms so a directory target matches "dist/" patterns.
|
|
111
|
+
const explicitlyIgnored = searchRel !== '' &&
|
|
112
|
+
insideCwd &&
|
|
113
|
+
(shouldIgnore(searchRel, cwdPatterns) || shouldIgnore(searchRel + '/', cwdPatterns));
|
|
114
|
+
const ignoreBase = insideCwd ? ctx.cwd : searchDir;
|
|
115
|
+
const ignorePatterns = explicitlyIgnored ? [] : insideCwd ? [...cwdPatterns, ...localPatterns] : localPatterns;
|
|
116
|
+
const allowedExts = input.type ? EXT_MAP[input.type] : undefined;
|
|
117
|
+
const globPattern = input.glob;
|
|
118
|
+
const headLimit = input.head_limit ?? DEFAULT_HEAD_LIMIT;
|
|
119
|
+
const includeLineNumbers = input.line_numbers !== false;
|
|
120
|
+
const contextLines = input.context ?? 0;
|
|
121
|
+
const files = [];
|
|
122
|
+
let totalMatches = 0;
|
|
123
|
+
let emitted = 0;
|
|
124
|
+
function toRelative(fullPath) {
|
|
125
|
+
const rel = path.relative(ctx.cwd, fullPath).replace(/\\/g, '/');
|
|
126
|
+
return rel === '' || rel.startsWith('..') ? fullPath.replace(/\\/g, '/') : rel;
|
|
127
|
+
}
|
|
128
|
+
function matchesGlob(fullPath) {
|
|
129
|
+
if (!globPattern)
|
|
130
|
+
return true;
|
|
131
|
+
if (globPattern.includes('/')) {
|
|
132
|
+
const rel = path.relative(searchDir, fullPath).replace(/\\/g, '/');
|
|
133
|
+
return minimatch(globPattern, rel);
|
|
134
|
+
}
|
|
135
|
+
return minimatch(globPattern, path.basename(fullPath));
|
|
136
|
+
}
|
|
137
|
+
function scanFile(fullPath) {
|
|
138
|
+
let content;
|
|
139
|
+
try {
|
|
140
|
+
const fileStat = fs.statSync(fullPath);
|
|
141
|
+
if (fileStat.size > MAX_FILE_SIZE)
|
|
142
|
+
return;
|
|
143
|
+
const buf = fs.readFileSync(fullPath);
|
|
144
|
+
if (buf.subarray(0, 8192).includes(0))
|
|
145
|
+
return; // binary file
|
|
146
|
+
content = buf.toString('utf-8');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return; // unreadable file
|
|
150
|
+
}
|
|
151
|
+
const lines = content.split('\n');
|
|
152
|
+
let group;
|
|
153
|
+
for (let i = 0; i < lines.length; i++) {
|
|
154
|
+
const line = lines[i];
|
|
155
|
+
if (line === undefined || line === '' || !regex.test(line))
|
|
156
|
+
continue;
|
|
157
|
+
totalMatches++;
|
|
158
|
+
if (emitted >= headLimit)
|
|
159
|
+
continue; // keep counting, stop emitting
|
|
160
|
+
if (!group) {
|
|
161
|
+
group = { file: toRelative(fullPath), matches: [] };
|
|
162
|
+
files.push(group);
|
|
163
|
+
}
|
|
164
|
+
const row = { text: truncateLine(line) };
|
|
165
|
+
if (includeLineNumbers)
|
|
166
|
+
row.line = i + 1;
|
|
167
|
+
if (contextLines > 0) {
|
|
168
|
+
row.before = lines.slice(Math.max(0, i - contextLines), i).map(truncateLine);
|
|
169
|
+
row.after = lines.slice(i + 1, i + 1 + contextLines).map(truncateLine);
|
|
170
|
+
}
|
|
171
|
+
group.matches.push(row);
|
|
172
|
+
emitted++;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Track visited real directories to prevent symlink cycle loops.
|
|
176
|
+
const visitedDirs = new Set();
|
|
177
|
+
function walk(dir, depth) {
|
|
178
|
+
if (depth > 100)
|
|
179
|
+
return; // Safety limit
|
|
180
|
+
let realDir;
|
|
181
|
+
try {
|
|
182
|
+
realDir = fs.realpathSync(dir);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (visitedDirs.has(realDir))
|
|
188
|
+
return;
|
|
189
|
+
visitedDirs.add(realDir);
|
|
40
190
|
let entries;
|
|
41
191
|
try {
|
|
42
192
|
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
@@ -46,41 +196,47 @@ export const grepTool = createTool('Grep', 'Content search with regex support. S
|
|
|
46
196
|
}
|
|
47
197
|
for (const entry of entries) {
|
|
48
198
|
const fullPath = path.join(dir, entry.name);
|
|
199
|
+
const relPath = path.relative(ignoreBase, fullPath).replace(/\\/g, '/');
|
|
49
200
|
if (entry.isDirectory()) {
|
|
50
201
|
if (entry.name === 'node_modules' || entry.name === '.git')
|
|
51
202
|
continue;
|
|
52
|
-
|
|
203
|
+
if (shouldIgnore(relPath, ignorePatterns))
|
|
204
|
+
continue;
|
|
205
|
+
walk(fullPath, depth + 1);
|
|
53
206
|
}
|
|
54
207
|
else if (entry.isFile()) {
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const lines = content.split('\n');
|
|
63
|
-
for (let i = 0; i < lines.length; i++) {
|
|
64
|
-
regex.lastIndex = 0;
|
|
65
|
-
const line = lines[i];
|
|
66
|
-
if (line && regex.test(line)) {
|
|
67
|
-
results.push({ file: fullPath, line: i + 1, text: line });
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
// skip binary files
|
|
73
|
-
}
|
|
208
|
+
if (shouldIgnore(relPath, ignorePatterns))
|
|
209
|
+
continue;
|
|
210
|
+
if (allowedExts && !allowedExts.includes(path.extname(entry.name).toLowerCase()))
|
|
211
|
+
continue;
|
|
212
|
+
if (!matchesGlob(fullPath))
|
|
213
|
+
continue;
|
|
214
|
+
scanFile(fullPath);
|
|
74
215
|
}
|
|
75
216
|
}
|
|
76
217
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
218
|
+
if (stat.isFile()) {
|
|
219
|
+
scanFile(searchPath);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
walk(searchPath, 0);
|
|
223
|
+
}
|
|
224
|
+
const output = {
|
|
225
|
+
pattern: input.pattern,
|
|
226
|
+
total_matches: totalMatches,
|
|
227
|
+
files,
|
|
84
228
|
};
|
|
229
|
+
if (totalMatches > emitted) {
|
|
230
|
+
output.truncated =
|
|
231
|
+
`Showing first ${String(emitted)} of ${String(totalMatches)} matches. ` +
|
|
232
|
+
'Narrow the search with glob, path, type, or a more specific pattern, or raise head_limit.';
|
|
233
|
+
}
|
|
234
|
+
return { output };
|
|
235
|
+
}, undefined, {
|
|
236
|
+
aliases: {
|
|
237
|
+
'-i': 'case_insensitive',
|
|
238
|
+
'-n': 'line_numbers',
|
|
239
|
+
regex: 'pattern',
|
|
240
|
+
},
|
|
85
241
|
});
|
|
86
242
|
//# sourceMappingURL=grep.js.map
|
package/dist/src/grep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/grep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AAErE,MAAM,
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/grep.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -15,23 +15,9 @@ export { todoTool } from './todo.js';
|
|
|
15
15
|
export { wikiTool } from './wiki.js';
|
|
16
16
|
export declare const allTools: ((import("./tool.js").Tool & {
|
|
17
17
|
validate: (raw: Record<string, unknown>) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
query?: string | undefined;
|
|
22
|
-
title?: string | undefined;
|
|
23
|
-
summary?: string | undefined;
|
|
24
|
-
category?: string | undefined;
|
|
25
|
-
date?: string | undefined;
|
|
26
|
-
prefix?: "INGEST" | "QUERY" | "LINT" | "EDIT" | undefined;
|
|
27
|
-
line?: string | undefined;
|
|
28
|
-
};
|
|
29
|
-
}) | (import("./tool.js").Tool & {
|
|
30
|
-
validate: (raw: Record<string, unknown>) => {
|
|
31
|
-
file_path: string;
|
|
32
|
-
offset?: number | undefined;
|
|
33
|
-
limit?: number | undefined;
|
|
34
|
-
pages?: string | undefined;
|
|
18
|
+
command: string;
|
|
19
|
+
timeout?: number | undefined;
|
|
20
|
+
description?: string | undefined;
|
|
35
21
|
};
|
|
36
22
|
}) | (import("./tool.js").Tool & {
|
|
37
23
|
validate: (raw: Record<string, unknown>) => {
|
|
@@ -42,19 +28,19 @@ export declare const allTools: ((import("./tool.js").Tool & {
|
|
|
42
28
|
};
|
|
43
29
|
}) | (import("./tool.js").Tool & {
|
|
44
30
|
validate: (raw: Record<string, unknown>) => {
|
|
45
|
-
|
|
46
|
-
|
|
31
|
+
pattern: string;
|
|
32
|
+
path?: string | undefined;
|
|
47
33
|
};
|
|
48
34
|
}) | (import("./tool.js").Tool & {
|
|
49
35
|
validate: (raw: Record<string, unknown>) => {
|
|
50
|
-
|
|
51
|
-
|
|
36
|
+
file_path: string;
|
|
37
|
+
offset?: number | undefined;
|
|
38
|
+
limit?: number | undefined;
|
|
52
39
|
};
|
|
53
40
|
}) | (import("./tool.js").Tool & {
|
|
54
41
|
validate: (raw: Record<string, unknown>) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
description?: string | undefined;
|
|
42
|
+
file_path: string;
|
|
43
|
+
content: string;
|
|
58
44
|
};
|
|
59
45
|
}) | (import("./tool.js").Tool & {
|
|
60
46
|
validate: (raw: Record<string, unknown>) => {
|
|
@@ -84,7 +70,7 @@ export declare const allTools: ((import("./tool.js").Tool & {
|
|
|
84
70
|
};
|
|
85
71
|
}) | (import("./tool.js").Tool & {
|
|
86
72
|
validate: (raw: Record<string, unknown>) => {
|
|
87
|
-
action: "
|
|
73
|
+
action: "edit" | "list" | "add" | "remove" | "complete" | "cancel" | "start" | "reorder";
|
|
88
74
|
scope: "personal" | "project";
|
|
89
75
|
id?: string | undefined;
|
|
90
76
|
title?: string | undefined;
|
|
@@ -96,5 +82,18 @@ export declare const allTools: ((import("./tool.js").Tool & {
|
|
|
96
82
|
filter_status?: "backlog" | "todo" | "in_progress" | "done" | "canceled" | undefined;
|
|
97
83
|
filter_priority?: "low" | "medium" | "high" | "critical" | undefined;
|
|
98
84
|
};
|
|
85
|
+
}) | (import("./tool.js").Tool & {
|
|
86
|
+
validate: (raw: Record<string, unknown>) => {
|
|
87
|
+
op: "search" | "page_get" | "page_put" | "index_upsert" | "init" | "list_sources" | "list_pages" | "index_get" | "log_append" | "graph" | "lint_report";
|
|
88
|
+
slug?: string | undefined;
|
|
89
|
+
content?: string | undefined;
|
|
90
|
+
query?: string | undefined;
|
|
91
|
+
title?: string | undefined;
|
|
92
|
+
summary?: string | undefined;
|
|
93
|
+
category?: string | undefined;
|
|
94
|
+
date?: string | undefined;
|
|
95
|
+
prefix?: "INGEST" | "QUERY" | "LINT" | "EDIT" | undefined;
|
|
96
|
+
line?: string | undefined;
|
|
97
|
+
};
|
|
99
98
|
}))[];
|
|
100
99
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjI,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAgBrC,eAAO,MAAM,QAAQ
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjI,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAgBrC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAA6J,CAAC"}
|
package/dist/src/read.d.ts
CHANGED
package/dist/src/read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/read.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/read.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,QAAQ;;;;;;CAwFpB,CAAC"}
|
package/dist/src/read.js
CHANGED
|
@@ -3,13 +3,23 @@ import path from 'node:path';
|
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { isPathAllowed, parseAllowlist } from '@curie-agent/core/safety/path-guard.js';
|
|
5
5
|
import { createTool, expandPath } from './tool.js';
|
|
6
|
+
const DEFAULT_LINE_LIMIT = 2000;
|
|
7
|
+
const MAX_LINE_LENGTH = 2000;
|
|
6
8
|
const ReadSchema = z.object({
|
|
7
|
-
file_path: z
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
file_path: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe('The path to the file to read (absolute, or relative to the working directory)'),
|
|
12
|
+
offset: z.number().optional().describe('The 1-based line number to start reading from'),
|
|
13
|
+
limit: z
|
|
14
|
+
.number()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe(`The number of lines to read (default ${String(DEFAULT_LINE_LIMIT)})`),
|
|
11
17
|
});
|
|
12
|
-
export const readTool = createTool('Read',
|
|
18
|
+
export const readTool = createTool('Read', [
|
|
19
|
+
'Reads a text or image file from the local filesystem and returns numbered lines (`<line>\\t<text>`).',
|
|
20
|
+
`Reads up to ${String(DEFAULT_LINE_LIMIT)} lines by default; use offset/limit to page through larger files.`,
|
|
21
|
+
'Reading a directory returns its entries. PDFs are not supported.',
|
|
22
|
+
].join(' '), ReadSchema, async (input, ctx) => {
|
|
13
23
|
const filePath = path.resolve(ctx.cwd, expandPath(input.file_path));
|
|
14
24
|
// Safety: refuse reads outside allowed directories (project cwd + user allowlist).
|
|
15
25
|
if (ctx.settings.safety?.path_guard !== 'off') {
|
|
@@ -45,24 +55,35 @@ export const readTool = createTool('Read', 'Reads a file from the local filesyst
|
|
|
45
55
|
};
|
|
46
56
|
}
|
|
47
57
|
if (ext === '.pdf') {
|
|
48
|
-
return {
|
|
58
|
+
return {
|
|
59
|
+
output: null,
|
|
60
|
+
error: `PDF files are not supported by this tool: ${filePath}. Use Bash with a converter, or ask the user for a text export.`,
|
|
61
|
+
};
|
|
49
62
|
}
|
|
50
63
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
51
64
|
const lines = content.split('\n');
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
resultLines = lines.slice(start);
|
|
56
|
-
}
|
|
57
|
-
if (input.limit !== undefined) {
|
|
58
|
-
resultLines = resultLines.slice(0, input.limit);
|
|
59
|
-
}
|
|
65
|
+
const start = input.offset !== undefined ? Math.max(0, input.offset - 1) : 0;
|
|
66
|
+
const limit = input.limit ?? DEFAULT_LINE_LIMIT;
|
|
67
|
+
const resultLines = lines.slice(start, start + limit);
|
|
60
68
|
const numbered = resultLines
|
|
61
69
|
.map((line, i) => {
|
|
62
|
-
const ln =
|
|
63
|
-
|
|
70
|
+
const ln = start + i + 1;
|
|
71
|
+
const text = line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '… [line truncated]' : line;
|
|
72
|
+
return `${String(ln)}\t${text}`;
|
|
64
73
|
})
|
|
65
74
|
.join('\n');
|
|
75
|
+
const end = start + resultLines.length;
|
|
76
|
+
if (end < lines.length) {
|
|
77
|
+
const footer = `\n[Showing lines ${String(start + 1)}-${String(end)} of ${String(lines.length)}. Use offset/limit to read more.]`;
|
|
78
|
+
return { output: numbered + footer };
|
|
79
|
+
}
|
|
66
80
|
return { output: numbered };
|
|
81
|
+
}, undefined, {
|
|
82
|
+
aliases: {
|
|
83
|
+
path: 'file_path',
|
|
84
|
+
filename: 'file_path',
|
|
85
|
+
filepath: 'file_path',
|
|
86
|
+
file: 'file_path',
|
|
87
|
+
},
|
|
67
88
|
});
|
|
68
89
|
//# sourceMappingURL=read.js.map
|
package/dist/src/read.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AAErE,MAAM,
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/read.ts"],"names":[],"mappings":"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"}
|