@vinhnt-sdk/tools 1.0.0
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/LICENSE +21 -0
- package/dist/arity.d.ts +22 -0
- package/dist/arity.d.ts.map +1 -0
- package/dist/arity.js +96 -0
- package/dist/arity.js.map +1 -0
- package/dist/context.d.ts +43 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/define-tool.d.ts +45 -0
- package/dist/define-tool.d.ts.map +1 -0
- package/dist/define-tool.js +120 -0
- package/dist/define-tool.js.map +1 -0
- package/dist/definitions.d.ts +24 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +2 -0
- package/dist/definitions.js.map +1 -0
- package/dist/description-lint.d.ts +25 -0
- package/dist/description-lint.d.ts.map +1 -0
- package/dist/description-lint.js +90 -0
- package/dist/description-lint.js.map +1 -0
- package/dist/diff.d.ts +7 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +26 -0
- package/dist/diff.js.map +1 -0
- package/dist/domain.d.ts +39 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +20 -0
- package/dist/domain.js.map +1 -0
- package/dist/file-history.d.ts +43 -0
- package/dist/file-history.d.ts.map +1 -0
- package/dist/file-history.js +55 -0
- package/dist/file-history.js.map +1 -0
- package/dist/file-tools.d.ts +56 -0
- package/dist/file-tools.d.ts.map +1 -0
- package/dist/file-tools.js +542 -0
- package/dist/file-tools.js.map +1 -0
- package/dist/git-tools.d.ts +8 -0
- package/dist/git-tools.d.ts.map +1 -0
- package/dist/git-tools.js +114 -0
- package/dist/git-tools.js.map +1 -0
- package/dist/history-hook.d.ts +4 -0
- package/dist/history-hook.d.ts.map +1 -0
- package/dist/history-hook.js +62 -0
- package/dist/history-hook.js.map +1 -0
- package/dist/image-tools.d.ts +11 -0
- package/dist/image-tools.d.ts.map +1 -0
- package/dist/image-tools.js +55 -0
- package/dist/image-tools.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/json-schema.d.ts +22 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +2 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/lazy-registry.d.ts +23 -0
- package/dist/lazy-registry.d.ts.map +1 -0
- package/dist/lazy-registry.js +64 -0
- package/dist/lazy-registry.js.map +1 -0
- package/dist/policy.d.ts +5 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +2 -0
- package/dist/policy.js.map +1 -0
- package/dist/provider-helpers.d.ts +26 -0
- package/dist/provider-helpers.d.ts.map +1 -0
- package/dist/provider-helpers.js +46 -0
- package/dist/provider-helpers.js.map +1 -0
- package/dist/provider.d.ts +80 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +96 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/agent-provider.d.ts +32 -0
- package/dist/providers/agent-provider.d.ts.map +1 -0
- package/dist/providers/agent-provider.js +35 -0
- package/dist/providers/agent-provider.js.map +1 -0
- package/dist/providers/builtin-provider.d.ts +36 -0
- package/dist/providers/builtin-provider.d.ts.map +1 -0
- package/dist/providers/builtin-provider.js +86 -0
- package/dist/providers/builtin-provider.js.map +1 -0
- package/dist/providers/file-loader.d.ts +47 -0
- package/dist/providers/file-loader.d.ts.map +1 -0
- package/dist/providers/file-loader.js +120 -0
- package/dist/providers/file-loader.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/skill-provider.d.ts +23 -0
- package/dist/providers/skill-provider.d.ts.map +1 -0
- package/dist/providers/skill-provider.js +28 -0
- package/dist/providers/skill-provider.js.map +1 -0
- package/dist/question-tool.d.ts +15 -0
- package/dist/question-tool.d.ts.map +1 -0
- package/dist/question-tool.js +51 -0
- package/dist/question-tool.js.map +1 -0
- package/dist/read-tracker.d.ts +8 -0
- package/dist/read-tracker.d.ts.map +1 -0
- package/dist/read-tracker.js +33 -0
- package/dist/read-tracker.js.map +1 -0
- package/dist/registry.d.ts +58 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +128 -0
- package/dist/registry.js.map +1 -0
- package/dist/sandbox.d.ts +85 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +409 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/search-tools.d.ts +11 -0
- package/dist/search-tools.d.ts.map +1 -0
- package/dist/search-tools.js +124 -0
- package/dist/search-tools.js.map +1 -0
- package/dist/shell-parser.d.ts +9 -0
- package/dist/shell-parser.d.ts.map +1 -0
- package/dist/shell-parser.js +68 -0
- package/dist/shell-parser.js.map +1 -0
- package/dist/shell-tool.d.ts +22 -0
- package/dist/shell-tool.d.ts.map +1 -0
- package/dist/shell-tool.js +100 -0
- package/dist/shell-tool.js.map +1 -0
- package/dist/todo-tool.d.ts +2 -0
- package/dist/todo-tool.d.ts.map +1 -0
- package/dist/todo-tool.js +121 -0
- package/dist/todo-tool.js.map +1 -0
- package/dist/tool-search.d.ts +14 -0
- package/dist/tool-search.d.ts.map +1 -0
- package/dist/tool-search.js +46 -0
- package/dist/tool-search.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +9 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +26 -0
- package/dist/validate.js.map +1 -0
- package/dist/web-search-tool.d.ts +84 -0
- package/dist/web-search-tool.d.ts.map +1 -0
- package/dist/web-search-tool.js +134 -0
- package/dist/web-search-tool.js.map +1 -0
- package/dist/web-tools.d.ts +10 -0
- package/dist/web-tools.d.ts.map +1 -0
- package/dist/web-tools.js +62 -0
- package/dist/web-tools.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir, stat, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join, relative, resolve, sep, dirname } from "node:path";
|
|
3
|
+
import { generateDiff } from "./diff.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { defineTool } from "./define-tool.js";
|
|
6
|
+
import { sanitizeForLLM } from "@vinhnt-sdk/security";
|
|
7
|
+
const filePathField = z.string().min(1);
|
|
8
|
+
const ReadFileSchema = z.object({
|
|
9
|
+
filePath: filePathField,
|
|
10
|
+
stripTrailingNewline: z.boolean().optional().default(false),
|
|
11
|
+
});
|
|
12
|
+
const WriteFileSchema = z.object({
|
|
13
|
+
filePath: filePathField,
|
|
14
|
+
content: z.string(),
|
|
15
|
+
});
|
|
16
|
+
const EditBlockSchema = z.object({
|
|
17
|
+
oldString: z.string().min(1, "oldString is required"),
|
|
18
|
+
newString: z.string(),
|
|
19
|
+
});
|
|
20
|
+
const EditFileSchema = z.object({
|
|
21
|
+
filePath: filePathField,
|
|
22
|
+
oldString: z.string().min(1).optional(),
|
|
23
|
+
newString: z.string().optional(),
|
|
24
|
+
edits: z.array(EditBlockSchema).min(1).optional(),
|
|
25
|
+
}).refine((data) => (data.oldString !== undefined && data.newString !== undefined) || (data.edits !== undefined), { message: "Either oldString+newString or edits array is required" });
|
|
26
|
+
const ApplyPatchSchema = z.object({
|
|
27
|
+
filePath: filePathField,
|
|
28
|
+
patch: z.string().min(1),
|
|
29
|
+
});
|
|
30
|
+
const ListDirectorySchema = z.object({
|
|
31
|
+
dirPath: z.string().min(1),
|
|
32
|
+
});
|
|
33
|
+
const READ_FILE_SCHEMA = {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
filePath: { type: "string", description: "Path relative to workspace root (or use 'path' alias)" },
|
|
37
|
+
path: { type: "string", description: "Alias for filePath" },
|
|
38
|
+
stripTrailingNewline: { type: "boolean", description: "If true, strip trailing newline", default: false },
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
const WRITE_FILE_SCHEMA = {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
filePath: { type: "string", description: "Path relative to workspace root (or use 'path' alias)" },
|
|
45
|
+
path: { type: "string", description: "Alias for filePath" },
|
|
46
|
+
content: { type: "string", description: "File content to write" },
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
const EDIT_FILE_SCHEMA = {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
filePath: { type: "string", description: "Path relative to workspace root (or use 'path' alias)" },
|
|
53
|
+
path: { type: "string", description: "Alias for filePath" },
|
|
54
|
+
oldString: { type: "string", description: "Text to search for (supports fuzzy matching). Required unless edits is provided." },
|
|
55
|
+
newString: { type: "string", description: "Replacement text. Required unless edits is provided." },
|
|
56
|
+
edits: { type: "array", items: { type: "object", properties: { oldString: { type: "string" }, newString: { type: "string" } }, required: ["oldString", "newString"] }, description: "Array of search-replace blocks for multi-hunk edits" },
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const APPLY_PATCH_SCHEMA = {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
filePath: { type: "string", description: "Path relative to workspace root (or use 'path' alias)" },
|
|
63
|
+
path: { type: "string", description: "Alias for filePath" },
|
|
64
|
+
patch: { type: "string", description: "Search/replace patch with one or more SEARCH/REPLACE blocks" },
|
|
65
|
+
},
|
|
66
|
+
required: ["patch"],
|
|
67
|
+
};
|
|
68
|
+
const LIST_DIRECTORY_SCHEMA = {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
dirPath: { type: "string", description: "Directory path relative to workspace root (or use 'path' alias)" },
|
|
72
|
+
path: { type: "string", description: "Alias for dirPath" },
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
function resolveRoot(r) {
|
|
76
|
+
return typeof r === "function" ? r() : r;
|
|
77
|
+
}
|
|
78
|
+
const DEFAULT_MAX_FILE_SIZE = 1_048_576;
|
|
79
|
+
function isWithinWorkspace(target, workspace) {
|
|
80
|
+
const rel = relative(workspace, resolve(target));
|
|
81
|
+
if (rel === "")
|
|
82
|
+
return true;
|
|
83
|
+
return !rel.startsWith("..") && !rel.split(sep).includes("..");
|
|
84
|
+
}
|
|
85
|
+
async function ensurePathAccess(target, root, pathLabel, ctx, externalDirAccess) {
|
|
86
|
+
if (isWithinWorkspace(target, root))
|
|
87
|
+
return;
|
|
88
|
+
if (externalDirAccess)
|
|
89
|
+
return;
|
|
90
|
+
const reply = await ctx.ask({
|
|
91
|
+
permission: "external_directory_access",
|
|
92
|
+
resource: target,
|
|
93
|
+
reason: `Access path outside workspace: ${pathLabel}`,
|
|
94
|
+
});
|
|
95
|
+
if (reply === "reject") {
|
|
96
|
+
throw new Error(`Path "${pathLabel}" is outside workspace — access rejected`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function normalizeInput(input) {
|
|
100
|
+
const v = input;
|
|
101
|
+
if (!v || typeof v !== "object")
|
|
102
|
+
return {};
|
|
103
|
+
const result = {};
|
|
104
|
+
for (const [key, value] of Object.entries(v)) {
|
|
105
|
+
result[key] = value;
|
|
106
|
+
}
|
|
107
|
+
if (!v.filePath && v.path && typeof v.path === "string") {
|
|
108
|
+
result.filePath = v.path;
|
|
109
|
+
}
|
|
110
|
+
if (!v.dirPath && v.path && typeof v.path === "string") {
|
|
111
|
+
result.dirPath = v.path;
|
|
112
|
+
}
|
|
113
|
+
if (!v.oldString && v.old_content && typeof v.old_content === "string") {
|
|
114
|
+
result.oldString = v.old_content;
|
|
115
|
+
}
|
|
116
|
+
if (!v.newString && v.new_content && typeof v.new_content === "string") {
|
|
117
|
+
result.newString = v.new_content;
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
export function createReadFileTool(workspaceRoot, tracker, externalDirAccess, maxFileSize) {
|
|
122
|
+
return defineTool({
|
|
123
|
+
name: "read_file",
|
|
124
|
+
description: "Read the contents of a file from the workspace.",
|
|
125
|
+
risk: "read",
|
|
126
|
+
input: ReadFileSchema,
|
|
127
|
+
jsonSchema: READ_FILE_SCHEMA,
|
|
128
|
+
normalize: normalizeInput,
|
|
129
|
+
async execute(v, ctx) {
|
|
130
|
+
const root = resolveRoot(workspaceRoot);
|
|
131
|
+
const target = resolve(root, v.filePath);
|
|
132
|
+
await ensurePathAccess(target, root, v.filePath, ctx, externalDirAccess);
|
|
133
|
+
const st = await stat(target);
|
|
134
|
+
const mfs = maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
|
|
135
|
+
if (st.size > mfs) {
|
|
136
|
+
throw new Error(`File too large (${st.size} bytes). Max: ${mfs} bytes`);
|
|
137
|
+
}
|
|
138
|
+
tracker?.trackRead(target, st.mtimeMs);
|
|
139
|
+
const content = await readFile(target, "utf-8");
|
|
140
|
+
const result = v.stripTrailingNewline ? content.replace(/\n$/, "") : content;
|
|
141
|
+
return sanitizeForLLM(result, "read_file");
|
|
142
|
+
},
|
|
143
|
+
}).toDefinition();
|
|
144
|
+
}
|
|
145
|
+
export function createWriteFileTool(workspaceRoot, tracker, externalDirAccess) {
|
|
146
|
+
return defineTool({
|
|
147
|
+
name: "write_file",
|
|
148
|
+
description: "Write content to a file (creates parents dirs if needed). Overwrites existing content.",
|
|
149
|
+
risk: "write",
|
|
150
|
+
input: WriteFileSchema,
|
|
151
|
+
jsonSchema: WRITE_FILE_SCHEMA,
|
|
152
|
+
normalize: normalizeInput,
|
|
153
|
+
async execute(v, ctx) {
|
|
154
|
+
const root = resolveRoot(workspaceRoot);
|
|
155
|
+
const target = resolve(root, v.filePath);
|
|
156
|
+
await ensurePathAccess(target, root, v.filePath, ctx, externalDirAccess);
|
|
157
|
+
await tracker?.assertWasRead(target);
|
|
158
|
+
await mkdir(dirname(target), { recursive: true });
|
|
159
|
+
const oldContent = await readFile(target, "utf-8").catch(() => "");
|
|
160
|
+
ctx.setCompensation(async () => {
|
|
161
|
+
if (oldContent) {
|
|
162
|
+
await writeFile(target, oldContent, "utf-8");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const { rm } = await import("node:fs/promises");
|
|
166
|
+
await rm(target, { force: true });
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
await writeFile(target, v.content, "utf-8");
|
|
170
|
+
const diff = generateDiff(v.filePath, oldContent, v.content);
|
|
171
|
+
return { written: v.filePath, bytes: v.content.length, diff: diff.diff, additions: diff.additions, removals: diff.removals };
|
|
172
|
+
},
|
|
173
|
+
}).toDefinition();
|
|
174
|
+
}
|
|
175
|
+
function charSimilarity(a, b) {
|
|
176
|
+
const longer = a.length >= b.length ? a : b;
|
|
177
|
+
const shorter = a.length < b.length ? a : b;
|
|
178
|
+
if (longer.length === 0)
|
|
179
|
+
return 1;
|
|
180
|
+
let matches = 0;
|
|
181
|
+
for (let i = 0; i < shorter.length; i++) {
|
|
182
|
+
if (shorter.charAt(i) === longer.charAt(i))
|
|
183
|
+
matches++;
|
|
184
|
+
}
|
|
185
|
+
const diffs = longer.length - matches;
|
|
186
|
+
return 1 - diffs / longer.length;
|
|
187
|
+
}
|
|
188
|
+
function findBestMatch(content, oldString) {
|
|
189
|
+
const lines = content.split("\n");
|
|
190
|
+
const oldLines = oldString.split("\n");
|
|
191
|
+
const windowLen = oldLines.length;
|
|
192
|
+
if (windowLen === 0 || lines.length < windowLen)
|
|
193
|
+
return undefined;
|
|
194
|
+
let bestIdx = -1;
|
|
195
|
+
let bestRatio = 0;
|
|
196
|
+
for (let i = 0; i <= lines.length - windowLen; i++) {
|
|
197
|
+
const window = lines.slice(i, i + windowLen).join("\n");
|
|
198
|
+
const ratio = charSimilarity(window, oldString);
|
|
199
|
+
if (ratio > bestRatio) {
|
|
200
|
+
bestRatio = ratio;
|
|
201
|
+
bestIdx = i;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (bestRatio > 0.4) {
|
|
205
|
+
const index = lines.slice(0, bestIdx).join("\n").length + (bestIdx > 0 ? 1 : 0);
|
|
206
|
+
return { index, ratio: bestRatio };
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
/** Tokenize into words and non-word separators */
|
|
211
|
+
function tokenize(s) {
|
|
212
|
+
return s.split(/(\s+)/).filter(Boolean);
|
|
213
|
+
}
|
|
214
|
+
/** Token-level similarity ratio */
|
|
215
|
+
function tokenSimilarity(a, b) {
|
|
216
|
+
const aTok = tokenize(a);
|
|
217
|
+
const bTok = tokenize(b);
|
|
218
|
+
if (aTok.length === 0 && bTok.length === 0)
|
|
219
|
+
return 1;
|
|
220
|
+
let matches = 0;
|
|
221
|
+
const limit = Math.min(aTok.length, bTok.length);
|
|
222
|
+
for (let i = 0; i < limit; i++) {
|
|
223
|
+
if (aTok[i] === bTok[i])
|
|
224
|
+
matches++;
|
|
225
|
+
}
|
|
226
|
+
const total = Math.max(aTok.length, bTok.length);
|
|
227
|
+
return matches / total;
|
|
228
|
+
}
|
|
229
|
+
function findMatchMultiLayer(content, oldString) {
|
|
230
|
+
const layers = [
|
|
231
|
+
{ name: "exact", fn: (c, o) => {
|
|
232
|
+
const idx = c.indexOf(o);
|
|
233
|
+
return idx >= 0 ? { start: idx, end: idx + o.length } : undefined;
|
|
234
|
+
} },
|
|
235
|
+
{ name: "trimmed", fn: (c, o) => {
|
|
236
|
+
const trimmed = o.split("\n").map((l) => l.trim()).join("\n");
|
|
237
|
+
const idx = c.indexOf(trimmed);
|
|
238
|
+
return idx >= 0 ? { start: idx, end: idx + trimmed.length } : undefined;
|
|
239
|
+
} },
|
|
240
|
+
{ name: "indent-agnostic", fn: (c, o) => {
|
|
241
|
+
const strip = (s) => s.replace(/^[ \t]+/gm, "").replace(/\r\n/g, "\n");
|
|
242
|
+
const tLines = strip(o).split("\n");
|
|
243
|
+
const cLines = strip(c).split("\n");
|
|
244
|
+
if (tLines.length < 1 || tLines.length > cLines.length)
|
|
245
|
+
return undefined;
|
|
246
|
+
for (let i = 0; i <= cLines.length - tLines.length; i++) {
|
|
247
|
+
let match = true;
|
|
248
|
+
for (let j = 0; j < tLines.length; j++) {
|
|
249
|
+
if (cLines[i + j] !== tLines[j]) {
|
|
250
|
+
match = false;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (match) {
|
|
255
|
+
const origLines = c.split("\n");
|
|
256
|
+
const beforeLen = origLines.slice(0, i).join("\n").length;
|
|
257
|
+
const start = beforeLen + (i > 0 ? 1 : 0);
|
|
258
|
+
const end = origLines.slice(0, i + tLines.length).join("\n").length;
|
|
259
|
+
return { start, end };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return undefined;
|
|
263
|
+
} },
|
|
264
|
+
{ name: "fuzzy", fn: (c, o) => {
|
|
265
|
+
const fb = findBestMatch(c, o);
|
|
266
|
+
return fb ? { start: fb.index, end: fb.index + o.length } : undefined;
|
|
267
|
+
} },
|
|
268
|
+
{ name: "case-insensitive", fn: (c, o) => {
|
|
269
|
+
const lower = o.toLowerCase();
|
|
270
|
+
const idx = c.toLowerCase().indexOf(lower);
|
|
271
|
+
if (idx < 0)
|
|
272
|
+
return undefined;
|
|
273
|
+
// Find the actual match boundaries in original content
|
|
274
|
+
const end = idx + o.length;
|
|
275
|
+
// Validate we're not cutting a multi-byte char
|
|
276
|
+
if (end > c.length)
|
|
277
|
+
return undefined;
|
|
278
|
+
return { start: idx, end };
|
|
279
|
+
} },
|
|
280
|
+
{ name: "normalized-whitespace", fn: (c, o) => {
|
|
281
|
+
const norm = (s) => s.replace(/\s+/g, " ").trim();
|
|
282
|
+
const cn = norm(c);
|
|
283
|
+
const on = norm(o);
|
|
284
|
+
if (on.length < 5)
|
|
285
|
+
return undefined;
|
|
286
|
+
const idx = cn.indexOf(on);
|
|
287
|
+
if (idx < 0)
|
|
288
|
+
return undefined;
|
|
289
|
+
// Map normalized position back to original content
|
|
290
|
+
const mapToOrig = (normPos) => {
|
|
291
|
+
let i = 0, ni = 0;
|
|
292
|
+
while (i < c.length && ni < normPos) {
|
|
293
|
+
if (c[i] === " " || c[i] === "\n" || c[i] === "\t") {
|
|
294
|
+
i++;
|
|
295
|
+
while (i < c.length && (c[i] === " " || c[i] === "\n" || c[i] === "\t"))
|
|
296
|
+
i++;
|
|
297
|
+
ni++;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
i++;
|
|
301
|
+
ni++;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return i;
|
|
305
|
+
};
|
|
306
|
+
const start = mapToOrig(idx);
|
|
307
|
+
const end = mapToOrig(idx + on.length);
|
|
308
|
+
if (end - start < 3)
|
|
309
|
+
return undefined;
|
|
310
|
+
return { start, end };
|
|
311
|
+
} },
|
|
312
|
+
{ name: "token-fuzzy", fn: (c, o) => {
|
|
313
|
+
const lines = c.split("\n");
|
|
314
|
+
const oldLines = o.split("\n");
|
|
315
|
+
const windowLen = oldLines.length;
|
|
316
|
+
if (windowLen < 1 || lines.length < windowLen)
|
|
317
|
+
return undefined;
|
|
318
|
+
let bestIdx = -1;
|
|
319
|
+
let bestRatio = 0;
|
|
320
|
+
for (let i = 0; i <= lines.length - windowLen; i++) {
|
|
321
|
+
const window = lines.slice(i, i + windowLen).join("\n");
|
|
322
|
+
const ratio = tokenSimilarity(window, o);
|
|
323
|
+
if (ratio > bestRatio) {
|
|
324
|
+
bestRatio = ratio;
|
|
325
|
+
bestIdx = i;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (bestRatio > 0.5) {
|
|
329
|
+
const start = lines.slice(0, bestIdx).join("\n").length + (bestIdx > 0 ? 1 : 0);
|
|
330
|
+
const end = lines.slice(0, bestIdx + windowLen).join("\n").length;
|
|
331
|
+
return { start, end };
|
|
332
|
+
}
|
|
333
|
+
return undefined;
|
|
334
|
+
} },
|
|
335
|
+
{ name: "context-recovery", fn: (c, o) => {
|
|
336
|
+
// Try to find key phrases (longest non-whitespace parts) individually,
|
|
337
|
+
// then reconstruct the span covering all found parts
|
|
338
|
+
const phrases = o.split(/\s+/).filter((p) => p.length > 3 && p.length < 50);
|
|
339
|
+
if (phrases.length < 2)
|
|
340
|
+
return undefined;
|
|
341
|
+
const positions = [];
|
|
342
|
+
const cLower = c.toLowerCase();
|
|
343
|
+
for (const phrase of phrases) {
|
|
344
|
+
const idx = cLower.indexOf(phrase.toLowerCase());
|
|
345
|
+
if (idx >= 0)
|
|
346
|
+
positions.push(idx);
|
|
347
|
+
}
|
|
348
|
+
if (positions.length < 2)
|
|
349
|
+
return undefined;
|
|
350
|
+
const startPos = Math.min(...positions);
|
|
351
|
+
const endPos = Math.max(...positions) + o.length;
|
|
352
|
+
// Verify the span is reasonable
|
|
353
|
+
if (endPos - startPos > o.length * 2.5)
|
|
354
|
+
return undefined;
|
|
355
|
+
return { start: startPos, end: Math.min(endPos, c.length) };
|
|
356
|
+
} },
|
|
357
|
+
];
|
|
358
|
+
for (let i = 0; i < layers.length; i++) {
|
|
359
|
+
const layer = layers[i];
|
|
360
|
+
const result = layer.fn(content, oldString);
|
|
361
|
+
if (result) {
|
|
362
|
+
// For layers 5+, verify the match is reasonable
|
|
363
|
+
if (i >= 4) {
|
|
364
|
+
const matched = content.slice(result.start, result.end);
|
|
365
|
+
// Use normalized comparison for whitespace-agnostic layers
|
|
366
|
+
const norm = (s) => s.replace(/\s+/g, " ").trim();
|
|
367
|
+
const mNorm = layer.name === "normalized-whitespace" ? norm(matched) : matched;
|
|
368
|
+
const oNorm = layer.name === "normalized-whitespace" ? norm(oldString) : oldString;
|
|
369
|
+
const ratio = charSimilarity(mNorm, oNorm);
|
|
370
|
+
if (ratio < 0.3)
|
|
371
|
+
continue;
|
|
372
|
+
return { ...result, ratio, layer: i + 1 };
|
|
373
|
+
}
|
|
374
|
+
return { ...result, ratio: 1, layer: i + 1 };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return undefined;
|
|
378
|
+
}
|
|
379
|
+
function applySingleEdit(filePath, content, oldString, newString) {
|
|
380
|
+
const result = findMatchMultiLayer(content, oldString);
|
|
381
|
+
if (!result) {
|
|
382
|
+
const snippet = content.length > 400 ? content.slice(0, 200) + "\n...\n" + content.slice(-200) : content;
|
|
383
|
+
let msg = `oldString not found in ${filePath}. Content (${content.length} chars):\n---\n${snippet}\n---\n`;
|
|
384
|
+
const fuzzyTry = findBestMatch(content, oldString);
|
|
385
|
+
if (fuzzyTry) {
|
|
386
|
+
const matchSnippet = content.slice(fuzzyTry.index, fuzzyTry.index + Math.min(200, oldString.length));
|
|
387
|
+
msg += `Closest match (${Math.round(fuzzyTry.ratio * 100)}% character similarity) at position ${fuzzyTry.index}:\n---\n${matchSnippet}\n---\n`;
|
|
388
|
+
}
|
|
389
|
+
throw new Error(msg);
|
|
390
|
+
}
|
|
391
|
+
if (result.layer === 1) {
|
|
392
|
+
const first = content.indexOf(oldString);
|
|
393
|
+
const last = content.lastIndexOf(oldString);
|
|
394
|
+
if (first !== last) {
|
|
395
|
+
const count = content.split(oldString).length - 1;
|
|
396
|
+
throw new Error(`oldString found ${count} times in ${filePath} — replace must match exactly once`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const newContent = content.slice(0, result.start) + newString + content.slice(result.end);
|
|
400
|
+
return { newContent, diff: generateDiff(filePath, content, newContent) };
|
|
401
|
+
}
|
|
402
|
+
function applyMultiEdit(filePath, content, edits) {
|
|
403
|
+
let current = content;
|
|
404
|
+
const diffs = [];
|
|
405
|
+
for (const edit of edits) {
|
|
406
|
+
const result = applySingleEdit(filePath, current, edit.oldString, edit.newString);
|
|
407
|
+
current = result.newContent;
|
|
408
|
+
diffs.push(result.diff);
|
|
409
|
+
}
|
|
410
|
+
return { newContent: current, diffs };
|
|
411
|
+
}
|
|
412
|
+
export function createEditFileTool(workspaceRoot, tracker, externalDirAccess) {
|
|
413
|
+
return defineTool({
|
|
414
|
+
name: "edit_file",
|
|
415
|
+
description: "Apply search-and-replace edits to an existing file. Supports exact and fuzzy matching (9 layers). Pass edits[] for multiple edits in one call.",
|
|
416
|
+
risk: "write",
|
|
417
|
+
input: EditFileSchema,
|
|
418
|
+
jsonSchema: EDIT_FILE_SCHEMA,
|
|
419
|
+
normalize: normalizeInput,
|
|
420
|
+
async execute(v, ctx) {
|
|
421
|
+
const root = resolveRoot(workspaceRoot);
|
|
422
|
+
const target = resolve(root, v.filePath);
|
|
423
|
+
await ensurePathAccess(target, root, v.filePath, ctx, externalDirAccess);
|
|
424
|
+
await tracker?.assertWasRead(target);
|
|
425
|
+
const content = await readFile(target, "utf-8");
|
|
426
|
+
if (v.edits && v.edits.length > 0) {
|
|
427
|
+
const result = applyMultiEdit(v.filePath, content, v.edits);
|
|
428
|
+
ctx.setCompensation(async () => {
|
|
429
|
+
await writeFile(target, content, "utf-8");
|
|
430
|
+
});
|
|
431
|
+
await writeFile(target, result.newContent, "utf-8");
|
|
432
|
+
const totalAdditions = result.diffs.reduce((s, d) => s + d.additions, 0);
|
|
433
|
+
const totalRemovals = result.diffs.reduce((s, d) => s + d.removals, 0);
|
|
434
|
+
const combinedDiff = result.diffs.map((d) => d.diff).join("\n");
|
|
435
|
+
return {
|
|
436
|
+
edited: v.filePath, diff: combinedDiff,
|
|
437
|
+
hunkCount: result.diffs.length,
|
|
438
|
+
additions: totalAdditions, removals: totalRemovals,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
const result = applySingleEdit(v.filePath, content, v.oldString, v.newString);
|
|
442
|
+
ctx.setCompensation(async () => {
|
|
443
|
+
await writeFile(target, content, "utf-8");
|
|
444
|
+
});
|
|
445
|
+
await writeFile(target, result.newContent, "utf-8");
|
|
446
|
+
return { edited: v.filePath, diff: result.diff.diff, additions: result.diff.additions, removals: result.diff.removals };
|
|
447
|
+
},
|
|
448
|
+
}).toDefinition();
|
|
449
|
+
}
|
|
450
|
+
function parsePatch(patch) {
|
|
451
|
+
const blocks = [];
|
|
452
|
+
const regex = /<<<<<<< SEARCH\n([\s\S]*?)=======\n([\s\S]*?)>>>>>>>\n?/g;
|
|
453
|
+
let match;
|
|
454
|
+
while ((match = regex.exec(patch)) !== null) {
|
|
455
|
+
blocks.push({ oldString: match[1], newString: match[2] });
|
|
456
|
+
}
|
|
457
|
+
if (blocks.length === 0) {
|
|
458
|
+
throw new Error("No valid search/replace blocks found in patch");
|
|
459
|
+
}
|
|
460
|
+
return blocks;
|
|
461
|
+
}
|
|
462
|
+
export function createApplyPatchTool(workspaceRoot, tracker, externalDirAccess) {
|
|
463
|
+
return defineTool({
|
|
464
|
+
name: "apply_patch",
|
|
465
|
+
description: "Apply a search/replace patch to an existing file. The patch must contain one or more search/replace blocks in the format: <<<<<<< SEARCH followed by the exact text to find, then =======, then the replacement text, then >>>>>>>. Each search string must match exactly once in the file.",
|
|
466
|
+
risk: "write",
|
|
467
|
+
input: ApplyPatchSchema,
|
|
468
|
+
jsonSchema: APPLY_PATCH_SCHEMA,
|
|
469
|
+
normalize: normalizeInput,
|
|
470
|
+
async execute(v, ctx) {
|
|
471
|
+
const root = resolveRoot(workspaceRoot);
|
|
472
|
+
const target = resolve(root, v.filePath);
|
|
473
|
+
await ensurePathAccess(target, root, v.filePath, ctx, externalDirAccess);
|
|
474
|
+
await tracker?.assertWasRead(target);
|
|
475
|
+
const oldContent = await readFile(target, "utf-8");
|
|
476
|
+
const blocks = parsePatch(v.patch);
|
|
477
|
+
let content = oldContent;
|
|
478
|
+
const totalAdditions = [];
|
|
479
|
+
const totalRemovals = [];
|
|
480
|
+
for (const block of blocks) {
|
|
481
|
+
if (!content.includes(block.oldString)) {
|
|
482
|
+
const snippet = content.length > 400 ? content.slice(0, 200) + "\n...\n" + content.slice(-200) : content;
|
|
483
|
+
throw new Error(`Search string not found in ${v.filePath} (${content.length} chars). ` +
|
|
484
|
+
`File content:\n---\n${snippet}\n---\n` +
|
|
485
|
+
`Searched for:\n---\n${block.oldString.slice(0, 200)}${block.oldString.length > 200 ? "..." : ""}\n---`);
|
|
486
|
+
}
|
|
487
|
+
const firstIdx = content.indexOf(block.oldString);
|
|
488
|
+
const lastIdx = content.lastIndexOf(block.oldString);
|
|
489
|
+
if (firstIdx !== lastIdx) {
|
|
490
|
+
const count = content.split(block.oldString).length - 1;
|
|
491
|
+
throw new Error(`Search string found ${count} times in ${v.filePath} — each block must match exactly once`);
|
|
492
|
+
}
|
|
493
|
+
const newContent = content.replace(block.oldString, block.newString);
|
|
494
|
+
content = newContent;
|
|
495
|
+
totalAdditions.push(block.newString.length);
|
|
496
|
+
totalRemovals.push(block.oldString.length);
|
|
497
|
+
}
|
|
498
|
+
ctx.setCompensation(async () => {
|
|
499
|
+
await writeFile(target, oldContent, "utf-8");
|
|
500
|
+
});
|
|
501
|
+
await writeFile(target, content, "utf-8");
|
|
502
|
+
const diff = generateDiff(v.filePath, oldContent, content);
|
|
503
|
+
return {
|
|
504
|
+
patched: v.filePath,
|
|
505
|
+
blocks: blocks.length,
|
|
506
|
+
diff: diff.diff,
|
|
507
|
+
additions: totalAdditions.reduce((a, b) => a + b, 0),
|
|
508
|
+
removals: totalRemovals.reduce((a, b) => a + b, 0),
|
|
509
|
+
};
|
|
510
|
+
},
|
|
511
|
+
}).toDefinition();
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Default excluded directories — convenience only.
|
|
515
|
+
* User tự extend: `config.excludedDirs = [...DEFAULT_EXCLUDED_DIRS, "my-dir"]`
|
|
516
|
+
*/
|
|
517
|
+
export const DEFAULT_EXCLUDED_DIRS = ["node_modules", ".git"];
|
|
518
|
+
export function createListDirectoryTool(workspaceRoot, externalDirAccess, excludedDirs) {
|
|
519
|
+
const dirsToExlude = excludedDirs ?? DEFAULT_EXCLUDED_DIRS;
|
|
520
|
+
return defineTool({
|
|
521
|
+
name: "list_directory",
|
|
522
|
+
description: `List files and directories in a path (non-recursive). Skips ${dirsToExlude.join(", ")}.`,
|
|
523
|
+
risk: "read",
|
|
524
|
+
input: ListDirectorySchema,
|
|
525
|
+
jsonSchema: LIST_DIRECTORY_SCHEMA,
|
|
526
|
+
normalize: normalizeInput,
|
|
527
|
+
async execute(v, ctx) {
|
|
528
|
+
const root = resolveRoot(workspaceRoot);
|
|
529
|
+
const target = resolve(root, v.dirPath);
|
|
530
|
+
await ensurePathAccess(target, root, v.dirPath, ctx, externalDirAccess);
|
|
531
|
+
const entries = await readdir(target, { withFileTypes: true });
|
|
532
|
+
return entries
|
|
533
|
+
.filter((e) => !dirsToExlude.includes(e.name))
|
|
534
|
+
.map((e) => ({
|
|
535
|
+
name: e.name,
|
|
536
|
+
type: e.isDirectory() ? "directory" : "file",
|
|
537
|
+
path: join(v.dirPath, e.name),
|
|
538
|
+
}));
|
|
539
|
+
},
|
|
540
|
+
}).toDefinition();
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=file-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-tools.js","sourceRoot":"","sources":["../src/file-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from "./definitions.js";
|
|
2
|
+
type RootGetter = string | (() => string);
|
|
3
|
+
export declare function createGitStatusTool(workspaceRoot: RootGetter): ToolDefinition;
|
|
4
|
+
export declare function createGitDiffTool(workspaceRoot: RootGetter): ToolDefinition;
|
|
5
|
+
export declare function createGitLogTool(workspaceRoot: RootGetter): ToolDefinition;
|
|
6
|
+
export declare function createGitCommitTool(workspaceRoot: RootGetter): ToolDefinition;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=git-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-tools.d.ts","sourceRoot":"","sources":["../src/git-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAgBvD,KAAK,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;AAwB1C,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,UAAU,GAAG,cAAc,CAa7E;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,UAAU,GAAG,cAAc,CAoB3E;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,UAAU,GAAG,cAAc,CAmB1E;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,UAAU,GAAG,cAAc,CAoB7E"}
|