@openharness/core 0.4.4 → 0.5.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/dist/__tests__/conversation.test.js +81 -0
- package/dist/__tests__/conversation.test.js.map +1 -1
- package/dist/__tests__/middleware/compaction.test.js +105 -0
- package/dist/__tests__/middleware/compaction.test.js.map +1 -1
- package/dist/__tests__/middleware/hooks.test.js +68 -0
- package/dist/__tests__/middleware/hooks.test.js.map +1 -1
- package/dist/__tests__/middleware/persistence.test.js +19 -0
- package/dist/__tests__/middleware/persistence.test.js.map +1 -1
- package/dist/__tests__/middleware/retry.test.js +67 -0
- package/dist/__tests__/middleware/retry.test.js.map +1 -1
- package/dist/__tests__/middleware/turn-tracking.test.js +23 -0
- package/dist/__tests__/middleware/turn-tracking.test.js.map +1 -1
- package/dist/__tests__/providers/node.test.d.ts +2 -0
- package/dist/__tests__/providers/node.test.d.ts.map +1 -0
- package/dist/__tests__/providers/node.test.js +135 -0
- package/dist/__tests__/providers/node.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +37 -0
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/stream.test.js +46 -0
- package/dist/__tests__/stream.test.js.map +1 -1
- package/dist/__tests__/tools/create-bash-tool.test.d.ts +2 -0
- package/dist/__tests__/tools/create-bash-tool.test.d.ts.map +1 -0
- package/dist/__tests__/tools/create-bash-tool.test.js +25 -0
- package/dist/__tests__/tools/create-bash-tool.test.js.map +1 -0
- package/dist/__tests__/tools/create-fs-tools.test.d.ts +2 -0
- package/dist/__tests__/tools/create-fs-tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools/create-fs-tools.test.js +200 -0
- package/dist/__tests__/tools/create-fs-tools.test.js.map +1 -0
- package/dist/__tests__/utils.test.d.ts +2 -0
- package/dist/__tests__/utils.test.d.ts.map +1 -0
- package/dist/__tests__/utils.test.js +149 -0
- package/dist/__tests__/utils.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/node.d.ts +51 -0
- package/dist/providers/node.d.ts.map +1 -0
- package/dist/providers/node.js +130 -0
- package/dist/providers/node.js.map +1 -0
- package/dist/providers/types.d.ts +52 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +8 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/tools/create-bash-tool.d.ts +8 -0
- package/dist/tools/create-bash-tool.d.ts.map +1 -0
- package/dist/tools/create-bash-tool.js +27 -0
- package/dist/tools/create-bash-tool.js.map +1 -0
- package/dist/tools/create-fs-tools.d.ts +100 -0
- package/dist/tools/create-fs-tools.d.ts.map +1 -0
- package/dist/tools/create-fs-tools.js +361 -0
- package/dist/tools/create-fs-tools.js.map +1 -0
- package/dist/tools/create-local-tools.d.ts +97 -0
- package/dist/tools/create-local-tools.d.ts.map +1 -0
- package/dist/tools/create-local-tools.js +9 -0
- package/dist/tools/create-local-tools.js.map +1 -0
- package/package.json +4 -8
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { tool } from "ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
// ── Defaults ────────────────────────────────────────────────────────
|
|
4
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 50 * 1024; // 50 KB
|
|
5
|
+
const DEFAULT_MAX_LINES = 2000;
|
|
6
|
+
const DEFAULT_MAX_LINE_LENGTH = 2000;
|
|
7
|
+
// Binary file extensions that should never be read as text
|
|
8
|
+
const BINARY_EXTENSIONS = new Set([
|
|
9
|
+
".zip",
|
|
10
|
+
".tar",
|
|
11
|
+
".gz",
|
|
12
|
+
".bz2",
|
|
13
|
+
".xz",
|
|
14
|
+
".7z",
|
|
15
|
+
".rar",
|
|
16
|
+
".exe",
|
|
17
|
+
".dll",
|
|
18
|
+
".so",
|
|
19
|
+
".dylib",
|
|
20
|
+
".bin",
|
|
21
|
+
".obj",
|
|
22
|
+
".o",
|
|
23
|
+
".a",
|
|
24
|
+
".lib",
|
|
25
|
+
".png",
|
|
26
|
+
".jpg",
|
|
27
|
+
".jpeg",
|
|
28
|
+
".gif",
|
|
29
|
+
".bmp",
|
|
30
|
+
".ico",
|
|
31
|
+
".webp",
|
|
32
|
+
".tiff",
|
|
33
|
+
".tif",
|
|
34
|
+
".mp3",
|
|
35
|
+
".mp4",
|
|
36
|
+
".avi",
|
|
37
|
+
".mov",
|
|
38
|
+
".wav",
|
|
39
|
+
".flac",
|
|
40
|
+
".ogg",
|
|
41
|
+
".webm",
|
|
42
|
+
".mkv",
|
|
43
|
+
".pdf",
|
|
44
|
+
".wasm",
|
|
45
|
+
".class",
|
|
46
|
+
".jar",
|
|
47
|
+
".pyc",
|
|
48
|
+
".pyd",
|
|
49
|
+
".pyo",
|
|
50
|
+
".whl",
|
|
51
|
+
".egg",
|
|
52
|
+
".ttf",
|
|
53
|
+
".otf",
|
|
54
|
+
".woff",
|
|
55
|
+
".woff2",
|
|
56
|
+
".eot",
|
|
57
|
+
".sqlite",
|
|
58
|
+
".db",
|
|
59
|
+
".DS_Store",
|
|
60
|
+
]);
|
|
61
|
+
export function createFsTools(fs, options) {
|
|
62
|
+
const maxOutputBytes = options?.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
|
|
63
|
+
const maxLines = options?.maxLines ?? DEFAULT_MAX_LINES;
|
|
64
|
+
const maxLineLength = options?.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH;
|
|
65
|
+
// ── readFile ────────────────────────────────────────────────────
|
|
66
|
+
const readFile = tool({
|
|
67
|
+
description: "Read the contents of a file. Returns the text content with line numbers. " +
|
|
68
|
+
"For large files, use offset and limit to read specific line ranges.",
|
|
69
|
+
inputSchema: z.object({
|
|
70
|
+
filePath: z.string().describe("Absolute or relative path to the file"),
|
|
71
|
+
offset: z
|
|
72
|
+
.number()
|
|
73
|
+
.int()
|
|
74
|
+
.min(1)
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("1-based line number to start reading from"),
|
|
77
|
+
limit: z
|
|
78
|
+
.number()
|
|
79
|
+
.int()
|
|
80
|
+
.min(1)
|
|
81
|
+
.optional()
|
|
82
|
+
.describe(`Maximum number of lines to return (default ${DEFAULT_MAX_LINES})`),
|
|
83
|
+
}),
|
|
84
|
+
execute: async ({ filePath, offset, limit }) => {
|
|
85
|
+
const resolved = fs.resolvePath(filePath);
|
|
86
|
+
// Binary check by extension
|
|
87
|
+
if (isBinaryPath(resolved)) {
|
|
88
|
+
return { error: `Cannot read binary file: ${resolved}` };
|
|
89
|
+
}
|
|
90
|
+
let content;
|
|
91
|
+
try {
|
|
92
|
+
content = await fs.readFile(resolved);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error && typeof error === "object" && "name" in error && error.name === "FileTooLargeError") {
|
|
96
|
+
return { error: error.message };
|
|
97
|
+
}
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
const allLines = content.split("\n");
|
|
101
|
+
const totalLines = allLines.length;
|
|
102
|
+
const lineLimit = limit ?? maxLines;
|
|
103
|
+
const start = (offset ?? 1) - 1; // convert 1-based to 0-based
|
|
104
|
+
if (start > 0 && start >= totalLines) {
|
|
105
|
+
return {
|
|
106
|
+
error: `Offset ${offset} is out of range (file has ${totalLines} lines)`,
|
|
107
|
+
filePath: resolved,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const end = Math.min(start + lineLimit, totalLines);
|
|
111
|
+
const slice = allLines.slice(start, end);
|
|
112
|
+
// Truncate long lines and cap total bytes
|
|
113
|
+
let totalBytes = 0;
|
|
114
|
+
let truncatedByBytes = false;
|
|
115
|
+
const outputLines = [];
|
|
116
|
+
for (let i = 0; i < slice.length; i++) {
|
|
117
|
+
let line = slice[i];
|
|
118
|
+
if (line.length > maxLineLength) {
|
|
119
|
+
line = line.slice(0, maxLineLength) + `... (line truncated at ${maxLineLength} chars)`;
|
|
120
|
+
}
|
|
121
|
+
const lineBytes = Buffer.byteLength(line, "utf-8");
|
|
122
|
+
if (totalBytes + lineBytes > maxOutputBytes) {
|
|
123
|
+
truncatedByBytes = true;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
totalBytes += lineBytes;
|
|
127
|
+
outputLines.push(`${start + i + 1}: ${line}`);
|
|
128
|
+
}
|
|
129
|
+
const lastLine = start + outputLines.length;
|
|
130
|
+
const hasMore = lastLine < totalLines;
|
|
131
|
+
let status;
|
|
132
|
+
if (truncatedByBytes) {
|
|
133
|
+
status =
|
|
134
|
+
`Output capped at ${Math.round(maxOutputBytes / 1024)} KB. ` +
|
|
135
|
+
`Showing lines ${start + 1}-${lastLine} of ${totalLines}. ` +
|
|
136
|
+
`Use offset=${lastLine + 1} to continue.`;
|
|
137
|
+
}
|
|
138
|
+
else if (hasMore) {
|
|
139
|
+
status =
|
|
140
|
+
`Showing lines ${start + 1}-${lastLine} of ${totalLines}. ` +
|
|
141
|
+
`Use offset=${lastLine + 1} to continue.`;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
status = `End of file — ${totalLines} lines total.`;
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
filePath: resolved,
|
|
148
|
+
totalLines,
|
|
149
|
+
fromLine: start + 1,
|
|
150
|
+
toLine: lastLine,
|
|
151
|
+
status,
|
|
152
|
+
content: outputLines.join("\n"),
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
// ── writeFile ───────────────────────────────────────────────────
|
|
157
|
+
const writeFile = tool({
|
|
158
|
+
description: "Write content to a file. Creates the file (and parent directories) " +
|
|
159
|
+
"if they don't exist, or overwrites the existing file.",
|
|
160
|
+
inputSchema: z.object({
|
|
161
|
+
filePath: z.string().describe("Absolute or relative path to the file"),
|
|
162
|
+
content: z.string().describe("The full content to write"),
|
|
163
|
+
}),
|
|
164
|
+
execute: async ({ filePath, content }) => {
|
|
165
|
+
const resolved = fs.resolvePath(filePath);
|
|
166
|
+
await fs.mkdir(dirname(resolved), { recursive: true });
|
|
167
|
+
await fs.writeFile(resolved, content);
|
|
168
|
+
return { filePath: resolved, bytesWritten: Buffer.byteLength(content) };
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
// ── editFile ────────────────────────────────────────────────────
|
|
172
|
+
const editFile = tool({
|
|
173
|
+
description: "Edit a file by replacing exact string matches. The oldString must " +
|
|
174
|
+
"appear in the file. Set replaceAll to true to replace every occurrence.",
|
|
175
|
+
inputSchema: z.object({
|
|
176
|
+
filePath: z.string().describe("Absolute or relative path to the file"),
|
|
177
|
+
oldString: z.string().describe("The exact text to find"),
|
|
178
|
+
newString: z.string().describe("The replacement text"),
|
|
179
|
+
replaceAll: z
|
|
180
|
+
.boolean()
|
|
181
|
+
.optional()
|
|
182
|
+
.default(false)
|
|
183
|
+
.describe("Replace all occurrences instead of just the first"),
|
|
184
|
+
}),
|
|
185
|
+
execute: async ({ filePath, oldString, newString, replaceAll }) => {
|
|
186
|
+
const resolved = fs.resolvePath(filePath);
|
|
187
|
+
const content = await fs.readFile(resolved);
|
|
188
|
+
if (!content.includes(oldString)) {
|
|
189
|
+
return { error: "oldString not found in file", filePath: resolved };
|
|
190
|
+
}
|
|
191
|
+
const updated = replaceAll ? content.replaceAll(oldString, newString) : content.replace(oldString, newString);
|
|
192
|
+
await fs.writeFile(resolved, updated);
|
|
193
|
+
const occurrences = content.split(oldString).length - 1;
|
|
194
|
+
const replacements = replaceAll ? occurrences : 1;
|
|
195
|
+
return { filePath: resolved, replacements };
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
// ── listFiles ───────────────────────────────────────────────────
|
|
199
|
+
const listFiles = tool({
|
|
200
|
+
description: "List files and directories at the given path. " + "Set recursive to true to walk subdirectories.",
|
|
201
|
+
inputSchema: z.object({
|
|
202
|
+
dirPath: z
|
|
203
|
+
.string()
|
|
204
|
+
.optional()
|
|
205
|
+
.default(".")
|
|
206
|
+
.describe("Directory path to list (defaults to cwd)"),
|
|
207
|
+
recursive: z.boolean().optional().default(false).describe("Recursively list all entries"),
|
|
208
|
+
}),
|
|
209
|
+
execute: async ({ dirPath, recursive }) => {
|
|
210
|
+
const resolved = fs.resolvePath(dirPath);
|
|
211
|
+
let items;
|
|
212
|
+
if (recursive) {
|
|
213
|
+
const walked = await walkDir(fs, resolved, resolved);
|
|
214
|
+
items = walked.map((entry) => ({
|
|
215
|
+
name: entry.relativePath,
|
|
216
|
+
type: entry.isDirectory ? "directory" : "file",
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const entries = await fs.readdir(resolved);
|
|
221
|
+
items = entries.map((e) => ({
|
|
222
|
+
name: e.name,
|
|
223
|
+
type: e.isDirectory ? "directory" : "file",
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
return { dirPath: resolved, count: items.length, entries: items };
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
// ── grep ────────────────────────────────────────────────────────
|
|
230
|
+
const grep = tool({
|
|
231
|
+
description: "Search file contents with a regex pattern. Searches recursively " +
|
|
232
|
+
"from the given directory, skipping node_modules and .git. " +
|
|
233
|
+
"Returns matching lines with file paths and line numbers.",
|
|
234
|
+
inputSchema: z.object({
|
|
235
|
+
pattern: z.string().describe("Regex pattern to search for"),
|
|
236
|
+
dirPath: z
|
|
237
|
+
.string()
|
|
238
|
+
.optional()
|
|
239
|
+
.default(".")
|
|
240
|
+
.describe("Root directory to search from (defaults to cwd)"),
|
|
241
|
+
glob: z
|
|
242
|
+
.string()
|
|
243
|
+
.optional()
|
|
244
|
+
.describe("Only search files matching this glob suffix (e.g. '.ts')"),
|
|
245
|
+
ignoreCase: z.boolean().optional().default(false).describe("Case-insensitive matching"),
|
|
246
|
+
}),
|
|
247
|
+
execute: async ({ pattern, dirPath, glob: fileSuffix, ignoreCase }) => {
|
|
248
|
+
const resolved = fs.resolvePath(dirPath);
|
|
249
|
+
const regex = new RegExp(pattern, ignoreCase ? "i" : undefined);
|
|
250
|
+
const allFiles = await walkFiles(fs, resolved);
|
|
251
|
+
const files = fileSuffix ? allFiles.filter((f) => f.endsWith(fileSuffix)) : allFiles;
|
|
252
|
+
const matches = [];
|
|
253
|
+
for (const file of files) {
|
|
254
|
+
let content;
|
|
255
|
+
try {
|
|
256
|
+
content = await fs.readFile(file);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
continue; // skip binary / unreadable / too-large files
|
|
260
|
+
}
|
|
261
|
+
const lines = content.split("\n");
|
|
262
|
+
for (let i = 0; i < lines.length; i++) {
|
|
263
|
+
if (regex.test(lines[i])) {
|
|
264
|
+
matches.push({
|
|
265
|
+
file: relativePath(resolved, file),
|
|
266
|
+
line: i + 1,
|
|
267
|
+
content: lines[i],
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return { dirPath: resolved, pattern, matchCount: matches.length, matches };
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
// ── deleteFile ──────────────────────────────────────────────────
|
|
276
|
+
const deleteFile = tool({
|
|
277
|
+
description: "Delete a file or directory. For directories, set recursive to true.",
|
|
278
|
+
inputSchema: z.object({
|
|
279
|
+
filePath: z.string().describe("Path to the file or directory to delete"),
|
|
280
|
+
recursive: z
|
|
281
|
+
.boolean()
|
|
282
|
+
.optional()
|
|
283
|
+
.default(false)
|
|
284
|
+
.describe("Recursively delete directory contents"),
|
|
285
|
+
}),
|
|
286
|
+
execute: async ({ filePath, recursive }) => {
|
|
287
|
+
const resolved = fs.resolvePath(filePath);
|
|
288
|
+
const stat = await fs.stat(resolved);
|
|
289
|
+
if (stat.isDirectory && !recursive) {
|
|
290
|
+
return {
|
|
291
|
+
error: "Path is a directory. Set recursive to true to delete it.",
|
|
292
|
+
filePath: resolved,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
await fs.remove(resolved, { recursive });
|
|
296
|
+
return { deleted: resolved };
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
return { readFile, writeFile, editFile, listFiles, grep, deleteFile };
|
|
300
|
+
}
|
|
301
|
+
// ── Helpers ─────────────────────────────────────────────────────────
|
|
302
|
+
const SKIP_DIRS = new Set(["node_modules", ".git"]);
|
|
303
|
+
/** Recursively walk a directory, returning all entries with relative paths. */
|
|
304
|
+
async function walkDir(fs, root, dir) {
|
|
305
|
+
const entries = await fs.readdir(dir);
|
|
306
|
+
const results = [];
|
|
307
|
+
for (const entry of entries) {
|
|
308
|
+
const absPath = joinPath(dir, entry.name);
|
|
309
|
+
const relPath = relativePath(root, absPath);
|
|
310
|
+
results.push({ relativePath: relPath, absolutePath: absPath, isDirectory: entry.isDirectory });
|
|
311
|
+
if (entry.isDirectory && !SKIP_DIRS.has(entry.name)) {
|
|
312
|
+
results.push(...(await walkDir(fs, root, absPath)));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return results;
|
|
316
|
+
}
|
|
317
|
+
/** Recursively walk a directory, returning absolute paths of files only. Skips node_modules and .git. */
|
|
318
|
+
async function walkFiles(fs, dir) {
|
|
319
|
+
const entries = await fs.readdir(dir);
|
|
320
|
+
const files = [];
|
|
321
|
+
for (const entry of entries) {
|
|
322
|
+
const full = joinPath(dir, entry.name);
|
|
323
|
+
if (entry.isDirectory) {
|
|
324
|
+
if (!SKIP_DIRS.has(entry.name)) {
|
|
325
|
+
files.push(...(await walkFiles(fs, full)));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
files.push(full);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return files;
|
|
333
|
+
}
|
|
334
|
+
function isBinaryPath(filePath) {
|
|
335
|
+
const lastDot = filePath.lastIndexOf(".");
|
|
336
|
+
if (lastDot === -1)
|
|
337
|
+
return false;
|
|
338
|
+
return BINARY_EXTENSIONS.has(filePath.slice(lastDot).toLowerCase());
|
|
339
|
+
}
|
|
340
|
+
/** Simple path join that works with forward slashes. */
|
|
341
|
+
function joinPath(base, name) {
|
|
342
|
+
if (base.endsWith("/"))
|
|
343
|
+
return base + name;
|
|
344
|
+
return base + "/" + name;
|
|
345
|
+
}
|
|
346
|
+
/** Compute a relative path from root to target. */
|
|
347
|
+
function relativePath(root, target) {
|
|
348
|
+
const normalizedRoot = root.endsWith("/") ? root : root + "/";
|
|
349
|
+
if (target.startsWith(normalizedRoot)) {
|
|
350
|
+
return target.slice(normalizedRoot.length);
|
|
351
|
+
}
|
|
352
|
+
return target;
|
|
353
|
+
}
|
|
354
|
+
/** Extract directory portion of a path. */
|
|
355
|
+
function dirname(filePath) {
|
|
356
|
+
const lastSlash = filePath.lastIndexOf("/");
|
|
357
|
+
if (lastSlash === -1)
|
|
358
|
+
return ".";
|
|
359
|
+
return filePath.slice(0, lastSlash);
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=create-fs-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-fs-tools.js","sourceRoot":"","sources":["../../src/tools/create-fs-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { Environment } from "../providers/types.js";
|
|
2
|
+
import { type CreateFsToolsOptions } from "./create-fs-tools.js";
|
|
3
|
+
export declare function createLocalTools(env: Environment, options?: CreateFsToolsOptions): {
|
|
4
|
+
bash: import("ai").Tool<{
|
|
5
|
+
command: string;
|
|
6
|
+
timeout: number;
|
|
7
|
+
}, import("../providers/types.js").ShellResult>;
|
|
8
|
+
readFile: import("ai").Tool<{
|
|
9
|
+
filePath: string;
|
|
10
|
+
offset?: number | undefined;
|
|
11
|
+
limit?: number | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
error: string;
|
|
14
|
+
filePath?: undefined;
|
|
15
|
+
totalLines?: undefined;
|
|
16
|
+
fromLine?: undefined;
|
|
17
|
+
toLine?: undefined;
|
|
18
|
+
status?: undefined;
|
|
19
|
+
content?: undefined;
|
|
20
|
+
} | {
|
|
21
|
+
error: string;
|
|
22
|
+
filePath: string;
|
|
23
|
+
totalLines?: undefined;
|
|
24
|
+
fromLine?: undefined;
|
|
25
|
+
toLine?: undefined;
|
|
26
|
+
status?: undefined;
|
|
27
|
+
content?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
filePath: string;
|
|
30
|
+
totalLines: number;
|
|
31
|
+
fromLine: number;
|
|
32
|
+
toLine: number;
|
|
33
|
+
status: string;
|
|
34
|
+
content: string;
|
|
35
|
+
error?: undefined;
|
|
36
|
+
}>;
|
|
37
|
+
writeFile: import("ai").Tool<{
|
|
38
|
+
filePath: string;
|
|
39
|
+
content: string;
|
|
40
|
+
}, {
|
|
41
|
+
filePath: string;
|
|
42
|
+
bytesWritten: number;
|
|
43
|
+
}>;
|
|
44
|
+
editFile: import("ai").Tool<{
|
|
45
|
+
filePath: string;
|
|
46
|
+
oldString: string;
|
|
47
|
+
newString: string;
|
|
48
|
+
replaceAll: boolean;
|
|
49
|
+
}, {
|
|
50
|
+
error: string;
|
|
51
|
+
filePath: string;
|
|
52
|
+
replacements?: undefined;
|
|
53
|
+
} | {
|
|
54
|
+
filePath: string;
|
|
55
|
+
replacements: number;
|
|
56
|
+
error?: undefined;
|
|
57
|
+
}>;
|
|
58
|
+
listFiles: import("ai").Tool<{
|
|
59
|
+
dirPath: string;
|
|
60
|
+
recursive: boolean;
|
|
61
|
+
}, {
|
|
62
|
+
dirPath: string;
|
|
63
|
+
count: number;
|
|
64
|
+
entries: {
|
|
65
|
+
name: string;
|
|
66
|
+
type: "file" | "directory";
|
|
67
|
+
}[];
|
|
68
|
+
}>;
|
|
69
|
+
grep: import("ai").Tool<{
|
|
70
|
+
pattern: string;
|
|
71
|
+
dirPath: string;
|
|
72
|
+
ignoreCase: boolean;
|
|
73
|
+
glob?: string | undefined;
|
|
74
|
+
}, {
|
|
75
|
+
dirPath: string;
|
|
76
|
+
pattern: string;
|
|
77
|
+
matchCount: number;
|
|
78
|
+
matches: {
|
|
79
|
+
file: string;
|
|
80
|
+
line: number;
|
|
81
|
+
content: string;
|
|
82
|
+
}[];
|
|
83
|
+
}>;
|
|
84
|
+
deleteFile: import("ai").Tool<{
|
|
85
|
+
filePath: string;
|
|
86
|
+
recursive: boolean;
|
|
87
|
+
}, {
|
|
88
|
+
error: string;
|
|
89
|
+
filePath: string;
|
|
90
|
+
deleted?: undefined;
|
|
91
|
+
} | {
|
|
92
|
+
deleted: string;
|
|
93
|
+
error?: undefined;
|
|
94
|
+
filePath?: undefined;
|
|
95
|
+
}>;
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=create-local-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-local-tools.d.ts","sourceRoot":"","sources":["../../src/tools/create-local-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKhF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createFsTools } from "./create-fs-tools.js";
|
|
2
|
+
import { createBashTool } from "./create-bash-tool.js";
|
|
3
|
+
export function createLocalTools(env, options) {
|
|
4
|
+
return {
|
|
5
|
+
...createFsTools(env.fs, options),
|
|
6
|
+
...createBashTool(env.shell),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=create-local-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-local-tools.js","sourceRoot":"","sources":["../../src/tools/create-local-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA6B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,GAAgB,EAAE,OAA8B;IAC/E,OAAO;QACL,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC;QACjC,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;KAC7B,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openharness/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Building blocks for capable, general-purpose agents",
|
|
6
6
|
"exports": {
|
|
@@ -8,13 +8,9 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"import": "./dist/index.js"
|
|
10
10
|
},
|
|
11
|
-
"./
|
|
12
|
-
"types": "./dist/
|
|
13
|
-
"import": "./dist/
|
|
14
|
-
},
|
|
15
|
-
"./tools/bash": {
|
|
16
|
-
"types": "./dist/tools/bash.d.ts",
|
|
17
|
-
"import": "./dist/tools/bash.js"
|
|
11
|
+
"./providers": {
|
|
12
|
+
"types": "./dist/providers/index.d.ts",
|
|
13
|
+
"import": "./dist/providers/index.js"
|
|
18
14
|
}
|
|
19
15
|
},
|
|
20
16
|
"files": [
|