@skroyc/librarian 0.1.0 → 0.2.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/README.md +4 -16
- package/dist/agents/context-schema.d.ts +1 -1
- package/dist/agents/context-schema.d.ts.map +1 -1
- package/dist/agents/context-schema.js +5 -2
- package/dist/agents/context-schema.js.map +1 -1
- package/dist/agents/react-agent.d.ts.map +1 -1
- package/dist/agents/react-agent.js +36 -27
- package/dist/agents/react-agent.js.map +1 -1
- package/dist/agents/tool-runtime.d.ts.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -49
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +115 -69
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +246 -150
- package/dist/index.js.map +1 -1
- package/dist/tools/file-finding.tool.d.ts +1 -1
- package/dist/tools/file-finding.tool.d.ts.map +1 -1
- package/dist/tools/file-finding.tool.js +70 -130
- package/dist/tools/file-finding.tool.js.map +1 -1
- package/dist/tools/file-listing.tool.d.ts +7 -1
- package/dist/tools/file-listing.tool.d.ts.map +1 -1
- package/dist/tools/file-listing.tool.js +96 -80
- package/dist/tools/file-listing.tool.js.map +1 -1
- package/dist/tools/file-reading.tool.d.ts +4 -1
- package/dist/tools/file-reading.tool.d.ts.map +1 -1
- package/dist/tools/file-reading.tool.js +107 -45
- package/dist/tools/file-reading.tool.js.map +1 -1
- package/dist/tools/grep-content.tool.d.ts +13 -1
- package/dist/tools/grep-content.tool.d.ts.map +1 -1
- package/dist/tools/grep-content.tool.js +186 -144
- package/dist/tools/grep-content.tool.js.map +1 -1
- package/dist/utils/error-utils.d.ts +9 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +61 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/file-utils.d.ts +1 -0
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +81 -9
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/format-utils.d.ts +25 -0
- package/dist/utils/format-utils.d.ts.map +1 -0
- package/dist/utils/format-utils.js +111 -0
- package/dist/utils/format-utils.js.map +1 -0
- package/dist/utils/gitignore-service.d.ts +10 -0
- package/dist/utils/gitignore-service.d.ts.map +1 -0
- package/dist/utils/gitignore-service.js +91 -0
- package/dist/utils/gitignore-service.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +35 -34
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path-utils.js +3 -3
- package/dist/utils/path-utils.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/context-schema.ts +5 -2
- package/src/agents/react-agent.ts +667 -641
- package/src/agents/tool-runtime.ts +4 -4
- package/src/cli.ts +95 -57
- package/src/config.ts +192 -90
- package/src/index.ts +402 -180
- package/src/tools/file-finding.tool.ts +198 -310
- package/src/tools/file-listing.tool.ts +245 -202
- package/src/tools/file-reading.tool.ts +225 -138
- package/src/tools/grep-content.tool.ts +387 -307
- package/src/utils/error-utils.ts +95 -0
- package/src/utils/file-utils.ts +104 -19
- package/src/utils/format-utils.ts +190 -0
- package/src/utils/gitignore-service.ts +123 -0
- package/src/utils/logger.ts +112 -77
- package/src/utils/path-utils.ts +3 -3
|
@@ -1,121 +1,127 @@
|
|
|
1
|
-
import { tool } from "langchain";
|
|
2
|
-
import { z } from "zod";
|
|
3
1
|
import fs from "node:fs/promises";
|
|
4
2
|
import path from "node:path";
|
|
3
|
+
import { tool } from "langchain";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { formatToolError, getToolSuggestion } from "../utils/error-utils.js";
|
|
6
|
+
import { getFileLineCount } from "../utils/file-utils.js";
|
|
7
|
+
import { formatDirectoryTree, } from "../utils/format-utils.js";
|
|
8
|
+
import { GitIgnoreService } from "../utils/gitignore-service.js";
|
|
5
9
|
import { logger } from "../utils/logger.js";
|
|
6
|
-
async function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const ignoredItems = [
|
|
10
|
-
"node_modules",
|
|
11
|
-
".git",
|
|
12
|
-
".DS_Store",
|
|
13
|
-
".idea",
|
|
14
|
-
".vscode",
|
|
15
|
-
".pytest_cache",
|
|
16
|
-
];
|
|
17
|
-
if (ignoredItems.includes(basename)) {
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
10
|
+
async function listDirectoryDFS(dirPath, includeHidden = false, recursive = false, maxDepth = 1, currentDepth = 0, gitignore) {
|
|
11
|
+
if (currentDepth >= maxDepth) {
|
|
12
|
+
return [];
|
|
20
13
|
}
|
|
21
|
-
const commonBuildDirs = ["dist", "build", "out", "target", "coverage"];
|
|
22
|
-
if (commonBuildDirs.includes(basename) &&
|
|
23
|
-
(await fs
|
|
24
|
-
.stat(filePath)
|
|
25
|
-
.then((s) => s.isDirectory())
|
|
26
|
-
.catch(() => false))) {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
async function listDirectory(dirPath, includeHidden = false) {
|
|
32
14
|
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
33
|
-
const
|
|
15
|
+
const filteredEntries = [];
|
|
34
16
|
for (const entry of entries) {
|
|
17
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
35
18
|
if (!includeHidden && entry.name.startsWith(".")) {
|
|
36
19
|
continue;
|
|
37
20
|
}
|
|
21
|
+
if (gitignore?.shouldIgnore(fullPath, entry.isDirectory())) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
filteredEntries.push(entry);
|
|
25
|
+
}
|
|
26
|
+
filteredEntries.sort((a, b) => {
|
|
27
|
+
if (a.isDirectory() !== b.isDirectory()) {
|
|
28
|
+
return a.isDirectory() ? -1 : 1;
|
|
29
|
+
}
|
|
30
|
+
return a.name.localeCompare(b.name);
|
|
31
|
+
});
|
|
32
|
+
const fileEntries = [];
|
|
33
|
+
for (const entry of filteredEntries) {
|
|
38
34
|
const fullPath = path.join(dirPath, entry.name);
|
|
39
35
|
try {
|
|
40
|
-
if (!includeHidden && (await shouldIgnoreFile(fullPath))) {
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
36
|
const stats = await fs.stat(fullPath);
|
|
44
|
-
const name = path.basename(fullPath);
|
|
45
|
-
logger.debug("TOOL", "Processing file entry", {
|
|
46
|
-
name,
|
|
47
|
-
isDirectory: stats.isDirectory(),
|
|
48
|
-
});
|
|
49
37
|
const metadata = {
|
|
50
|
-
name,
|
|
38
|
+
name: entry.name,
|
|
51
39
|
path: fullPath,
|
|
52
40
|
isDirectory: stats.isDirectory(),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
permissions: stats.mode?.toString(8),
|
|
41
|
+
...(stats.isFile() && { size: stats.size }),
|
|
42
|
+
depth: currentDepth,
|
|
56
43
|
};
|
|
57
44
|
fileEntries.push(metadata);
|
|
58
45
|
}
|
|
59
46
|
catch {
|
|
60
47
|
}
|
|
61
48
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
49
|
+
const CONCURRENCY_LIMIT = 50;
|
|
50
|
+
const files = fileEntries.filter((e) => !e.isDirectory);
|
|
51
|
+
for (let i = 0; i < files.length; i += CONCURRENCY_LIMIT) {
|
|
52
|
+
const batch = files.slice(i, i + CONCURRENCY_LIMIT);
|
|
53
|
+
let retries = 3;
|
|
54
|
+
while (retries > 0) {
|
|
55
|
+
try {
|
|
56
|
+
await Promise.all(batch.map(async (e) => {
|
|
57
|
+
e.lineCount = await getFileLineCount(e.path);
|
|
58
|
+
}));
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.code === "EMFILE" && retries > 0) {
|
|
63
|
+
retries--;
|
|
64
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
65
70
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
}
|
|
72
|
+
const resultEntries = [];
|
|
73
|
+
for (const entry of fileEntries) {
|
|
74
|
+
const willRecurse = entry.isDirectory && recursive && currentDepth + 1 < maxDepth;
|
|
75
|
+
if (!(entry.isDirectory && recursive) ||
|
|
76
|
+
willRecurse ||
|
|
77
|
+
(entry.isDirectory && currentDepth === 0)) {
|
|
78
|
+
resultEntries.push(entry);
|
|
79
|
+
}
|
|
80
|
+
if (willRecurse) {
|
|
81
|
+
const subEntries = await listDirectoryDFS(entry.path, includeHidden, recursive, maxDepth, currentDepth + 1, gitignore);
|
|
82
|
+
resultEntries.push(...subEntries);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return resultEntries;
|
|
73
86
|
}
|
|
74
|
-
export const
|
|
75
|
-
const timingId = logger.timingStart("
|
|
76
|
-
logger.info("TOOL", "
|
|
87
|
+
export const listTool = tool(async ({ directoryPath = ".", includeHidden = false, recursive = false, maxDepth = 1, }, config) => {
|
|
88
|
+
const timingId = logger.timingStart("list");
|
|
89
|
+
logger.info("TOOL", "list called", {
|
|
90
|
+
directoryPath,
|
|
91
|
+
includeHidden,
|
|
92
|
+
recursive,
|
|
93
|
+
maxDepth,
|
|
94
|
+
});
|
|
77
95
|
try {
|
|
78
96
|
const workingDir = config?.context?.workingDir;
|
|
79
97
|
if (!workingDir) {
|
|
80
98
|
throw new Error("Context with workingDir is required for file operations");
|
|
81
99
|
}
|
|
82
|
-
logger.debug("TOOL", "Working directory", {
|
|
83
|
-
workingDir: workingDir.replace(Bun.env.HOME || "", "~"),
|
|
84
|
-
});
|
|
85
100
|
const resolvedPath = path.resolve(workingDir, directoryPath);
|
|
86
101
|
const resolvedWorkingDir = path.resolve(workingDir);
|
|
87
102
|
const relativePath = path.relative(resolvedWorkingDir, resolvedPath);
|
|
88
|
-
logger.debug("TOOL", "Path validation", {
|
|
89
|
-
resolvedPath: resolvedPath.replace(Bun.env.HOME || "", "~"),
|
|
90
|
-
resolvedWorkingDir: resolvedWorkingDir.replace(Bun.env.HOME || "", "~"),
|
|
91
|
-
relativePath,
|
|
92
|
-
validated: !relativePath.startsWith(".."),
|
|
93
|
-
});
|
|
94
103
|
if (relativePath.startsWith("..")) {
|
|
95
|
-
logger.error("PATH", "Directory path escapes working directory sandbox", undefined, { directoryPath, relativePath });
|
|
96
104
|
throw new Error(`Directory path "${directoryPath}" attempts to escape working directory sandbox`);
|
|
97
105
|
}
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
logger.timingEnd(timingId, "TOOL", "file_list completed");
|
|
108
|
-
logger.debug("TOOL", "Directory listing successful", {
|
|
109
|
-
directoryPath,
|
|
110
|
-
entryCount: listing.totalCount,
|
|
111
|
-
dirCount: listing.entries.filter((e) => e.isDirectory).length,
|
|
112
|
-
fileCount: listing.entries.filter((e) => !e.isDirectory).length,
|
|
113
|
-
});
|
|
106
|
+
const gitignore = new GitIgnoreService(workingDir);
|
|
107
|
+
await gitignore.initialize();
|
|
108
|
+
const entries = await listDirectoryDFS(resolvedPath, includeHidden, recursive, maxDepth, 0, gitignore);
|
|
109
|
+
const treeOutput = formatDirectoryTree(entries);
|
|
110
|
+
const displayPath = relativePath === "" ? "." : relativePath;
|
|
111
|
+
let result = `Contents of directory: ${displayPath}\n\n`;
|
|
112
|
+
result += `Total entries: ${entries.length}\n\n`;
|
|
113
|
+
result += treeOutput;
|
|
114
|
+
logger.timingEnd(timingId, "TOOL", "list completed");
|
|
114
115
|
return result;
|
|
115
116
|
}
|
|
116
117
|
catch (error) {
|
|
117
118
|
logger.error("TOOL", "list failed", error instanceof Error ? error : new Error(String(error)), { directoryPath });
|
|
118
|
-
return
|
|
119
|
+
return formatToolError({
|
|
120
|
+
operation: "list",
|
|
121
|
+
path: directoryPath,
|
|
122
|
+
cause: error,
|
|
123
|
+
suggestion: getToolSuggestion("list", directoryPath),
|
|
124
|
+
});
|
|
119
125
|
}
|
|
120
126
|
}, {
|
|
121
127
|
name: "list",
|
|
@@ -127,6 +133,16 @@ export const fileListTool = tool(async ({ directoryPath = ".", includeHidden = f
|
|
|
127
133
|
.optional()
|
|
128
134
|
.default(false)
|
|
129
135
|
.describe("Whether to include hidden files and directories. Defaults to `false`"),
|
|
136
|
+
recursive: z
|
|
137
|
+
.boolean()
|
|
138
|
+
.optional()
|
|
139
|
+
.default(false)
|
|
140
|
+
.describe("Whether to list subdirectories recursively. Defaults to `false`"),
|
|
141
|
+
maxDepth: z
|
|
142
|
+
.number()
|
|
143
|
+
.optional()
|
|
144
|
+
.default(1)
|
|
145
|
+
.describe("Maximum depth for recursive listing. Defaults to 1"),
|
|
130
146
|
}),
|
|
131
147
|
});
|
|
132
148
|
//# sourceMappingURL=file-listing.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-listing.tool.js","sourceRoot":"","sources":["../../src/tools/file-listing.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"file-listing.tool.js","sourceRoot":"","sources":["../../src/tools/file-listing.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const viewTool: import("langchain").DynamicStructuredTool<z.ZodObject<{
|
|
3
3
|
filePath: z.ZodString;
|
|
4
|
+
viewRange: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
4
5
|
}, z.core.$strip>, {
|
|
5
6
|
filePath: string;
|
|
7
|
+
viewRange?: [number, number] | undefined;
|
|
6
8
|
}, {
|
|
7
9
|
filePath: string;
|
|
10
|
+
viewRange?: [number, number] | undefined;
|
|
8
11
|
}, string>;
|
|
9
12
|
//# sourceMappingURL=file-reading.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-reading.tool.d.ts","sourceRoot":"","sources":["../../src/tools/file-reading.tool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-reading.tool.d.ts","sourceRoot":"","sources":["../../src/tools/file-reading.tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyIxB,eAAO,MAAM,QAAQ;;;;;;;;;UAqGpB,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { tool } from "langchain";
|
|
2
3
|
import { z } from "zod";
|
|
3
|
-
import
|
|
4
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { formatToolError, getToolSuggestion } from "../utils/error-utils.js";
|
|
5
5
|
import { isTextFile } from "../utils/file-utils.js";
|
|
6
|
+
import { withLineNumbers } from "../utils/format-utils.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
6
8
|
function isImageFile(filePath) {
|
|
7
9
|
const imageExtensions = new Set([
|
|
8
10
|
".png",
|
|
@@ -34,79 +36,139 @@ function isAudioFile(filePath) {
|
|
|
34
36
|
const ext = path.extname(filePath).toLowerCase();
|
|
35
37
|
return audioExtensions.has(ext);
|
|
36
38
|
}
|
|
37
|
-
|
|
39
|
+
function isBinaryFile(filePath) {
|
|
40
|
+
const binaryExtensions = new Set([
|
|
41
|
+
".pdf",
|
|
42
|
+
".zip",
|
|
43
|
+
".gz",
|
|
44
|
+
".tar",
|
|
45
|
+
".rar",
|
|
46
|
+
".7z",
|
|
47
|
+
".exe",
|
|
48
|
+
".dll",
|
|
49
|
+
".so",
|
|
50
|
+
".dylib",
|
|
51
|
+
".class",
|
|
52
|
+
".jar",
|
|
53
|
+
".war",
|
|
54
|
+
".ear",
|
|
55
|
+
]);
|
|
56
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
57
|
+
return binaryExtensions.has(ext);
|
|
58
|
+
}
|
|
59
|
+
async function readLinesInRange(filePath, viewRange) {
|
|
60
|
+
const file = Bun.file(filePath);
|
|
61
|
+
const stream = file.stream();
|
|
62
|
+
const reader = stream.getReader();
|
|
63
|
+
const decoder = new TextDecoder();
|
|
64
|
+
const lines = [];
|
|
65
|
+
let currentLine = 1;
|
|
66
|
+
const startLine = viewRange ? viewRange[0] : 1;
|
|
67
|
+
const endLine = viewRange ? viewRange[1] : -1;
|
|
68
|
+
let totalLines = 0;
|
|
69
|
+
let partialLine = "";
|
|
38
70
|
try {
|
|
39
|
-
|
|
71
|
+
while (true) {
|
|
72
|
+
let chunk;
|
|
73
|
+
try {
|
|
74
|
+
const { done, value } = await reader.read();
|
|
75
|
+
if (done) {
|
|
76
|
+
if (partialLine) {
|
|
77
|
+
totalLines++;
|
|
78
|
+
if (currentLine >= startLine &&
|
|
79
|
+
(endLine === -1 || currentLine <= endLine)) {
|
|
80
|
+
lines.push(partialLine);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
chunk = decoder.decode(value, { stream: true });
|
|
86
|
+
}
|
|
87
|
+
catch (readError) {
|
|
88
|
+
reader.releaseLock();
|
|
89
|
+
throw new Error(`Failed to read file ${filePath}: ${readError.message}`);
|
|
90
|
+
}
|
|
91
|
+
const chunkLines = (partialLine + chunk).split("\n");
|
|
92
|
+
partialLine = chunkLines.pop() || "";
|
|
93
|
+
for (const line of chunkLines) {
|
|
94
|
+
if (currentLine >= startLine &&
|
|
95
|
+
(endLine === -1 || currentLine <= endLine)) {
|
|
96
|
+
lines.push(line);
|
|
97
|
+
}
|
|
98
|
+
currentLine++;
|
|
99
|
+
totalLines++;
|
|
100
|
+
if (endLine !== -1 && currentLine > endLine) {
|
|
101
|
+
await reader.cancel();
|
|
102
|
+
return { lines, totalLines: -1 };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
40
106
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
throw new Error(`Failed to read file: ${errorMessage}`);
|
|
107
|
+
finally {
|
|
108
|
+
reader.releaseLock();
|
|
44
109
|
}
|
|
110
|
+
return { lines, totalLines };
|
|
45
111
|
}
|
|
46
|
-
export const
|
|
47
|
-
const timingId = logger.timingStart("
|
|
48
|
-
logger.info("TOOL", "
|
|
112
|
+
export const viewTool = tool(async ({ filePath, viewRange }, config) => {
|
|
113
|
+
const timingId = logger.timingStart("view");
|
|
114
|
+
logger.info("TOOL", "view called", { filePath, viewRange });
|
|
49
115
|
try {
|
|
116
|
+
if (viewRange) {
|
|
117
|
+
const [start, end] = viewRange;
|
|
118
|
+
if (start < 1) {
|
|
119
|
+
throw new Error(`Invalid viewRange: start must be >= 1, got ${start}`);
|
|
120
|
+
}
|
|
121
|
+
if (end !== -1 && end < start) {
|
|
122
|
+
throw new Error(`Invalid viewRange: end (${end}) must be >= start (${start}) or -1 for end of file`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
50
125
|
const workingDir = config?.context?.workingDir;
|
|
51
126
|
if (!workingDir) {
|
|
52
127
|
throw new Error("Context with workingDir is required for file operations");
|
|
53
128
|
}
|
|
54
|
-
logger.debug("TOOL", "Working directory", {
|
|
55
|
-
workingDir: workingDir.replace(Bun.env.HOME || "", "~"),
|
|
56
|
-
});
|
|
57
129
|
const resolvedPath = path.resolve(workingDir, filePath);
|
|
58
130
|
const resolvedWorkingDir = path.resolve(workingDir);
|
|
59
131
|
const relativePath = path.relative(resolvedWorkingDir, resolvedPath);
|
|
60
|
-
logger.debug("TOOL", "Path validation", {
|
|
61
|
-
resolvedPath: resolvedPath.replace(Bun.env.HOME || "", "~"),
|
|
62
|
-
resolvedWorkingDir: resolvedWorkingDir.replace(Bun.env.HOME || "", "~"),
|
|
63
|
-
relativePath,
|
|
64
|
-
validated: !relativePath.startsWith(".."),
|
|
65
|
-
});
|
|
66
132
|
if (relativePath.startsWith("..")) {
|
|
67
|
-
logger.error("PATH", "File path escapes working directory sandbox", undefined, { filePath, relativePath });
|
|
68
133
|
throw new Error(`File path "${filePath}" attempts to escape the working directory sandbox`);
|
|
69
134
|
}
|
|
70
135
|
if (isImageFile(resolvedPath) || isAudioFile(resolvedPath)) {
|
|
71
|
-
logger.debug("TOOL", "File is media file", {
|
|
72
|
-
filePath,
|
|
73
|
-
fileType: isImageFile(resolvedPath) ? "image" : "audio",
|
|
74
|
-
});
|
|
75
136
|
return `This is a media file (${isImageFile(resolvedPath) ? "image" : "audio"}). Media files cannot be read as text. Path: ${filePath}`;
|
|
76
137
|
}
|
|
138
|
+
if (isBinaryFile(resolvedPath)) {
|
|
139
|
+
return `This is a binary file (${path.extname(filePath)}). Binary files cannot be read as text. Path: ${filePath}`;
|
|
140
|
+
}
|
|
77
141
|
const isText = await isTextFile(resolvedPath);
|
|
78
142
|
if (!isText) {
|
|
79
|
-
logger.debug("TOOL", "File is not a text file", { filePath });
|
|
80
143
|
return `This file is not a text file and cannot be read as text. Path: ${filePath}`;
|
|
81
144
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (content.length > maxContentLength) {
|
|
86
|
-
logger.debug("TOOL", "File content truncated", {
|
|
87
|
-
filePath,
|
|
88
|
-
originalSize: content.length,
|
|
89
|
-
maxSize: maxContentLength,
|
|
90
|
-
});
|
|
91
|
-
logger.timingEnd(timingId, "TOOL", "file_read completed (truncated)");
|
|
92
|
-
return `File content is too large (${content.length} characters). First ${maxContentLength} characters:\n\n${content.substring(0, maxContentLength)}\n\n[Content truncated due to length]`;
|
|
145
|
+
const { lines } = await readLinesInRange(resolvedPath, viewRange);
|
|
146
|
+
if (lines.length === 0) {
|
|
147
|
+
return "[File is empty]";
|
|
93
148
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
return `Content of file: ${filePath}\n\n${content}`;
|
|
149
|
+
const startLine = viewRange ? Math.max(1, viewRange[0]) : 1;
|
|
150
|
+
const formattedContent = withLineNumbers(lines, startLine);
|
|
151
|
+
logger.timingEnd(timingId, "TOOL", "view completed");
|
|
152
|
+
return formattedContent;
|
|
100
153
|
}
|
|
101
154
|
catch (error) {
|
|
102
|
-
logger.error("TOOL", "
|
|
103
|
-
return
|
|
155
|
+
logger.error("TOOL", "view failed", error instanceof Error ? error : new Error(String(error)), { filePath });
|
|
156
|
+
return formatToolError({
|
|
157
|
+
operation: "view",
|
|
158
|
+
path: filePath,
|
|
159
|
+
cause: error,
|
|
160
|
+
suggestion: getToolSuggestion("view", filePath),
|
|
161
|
+
});
|
|
104
162
|
}
|
|
105
163
|
}, {
|
|
106
|
-
name: "
|
|
164
|
+
name: "view",
|
|
107
165
|
description: "Read the contents of a file. Use this to examine the content of a specific file.",
|
|
108
166
|
schema: z.object({
|
|
109
167
|
filePath: z.string().describe("The path to the file to read"),
|
|
168
|
+
viewRange: z
|
|
169
|
+
.tuple([z.number(), z.number()])
|
|
170
|
+
.optional()
|
|
171
|
+
.describe("Optional tuple of [start, end] line numbers to display. Use -1 for end of file."),
|
|
110
172
|
}),
|
|
111
173
|
});
|
|
112
174
|
//# sourceMappingURL=file-reading.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-reading.tool.js","sourceRoot":"","sources":["../../src/tools/file-reading.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"file-reading.tool.js","sourceRoot":"","sources":["../../src/tools/file-reading.tool.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;QAC9B,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;KACP,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAGD,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;QAC9B,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;KACR,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAGD,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;QAC/B,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;QACN,MAAM;QACN,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,MAAM;QACN,MAAM;KACP,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAMD,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,SAA4B;IAE5B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,KAAa,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,WAAW,EAAE,CAAC;wBAChB,UAAU,EAAE,CAAC;wBACb,IACE,WAAW,IAAI,SAAS;4BACxB,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC,EAC1C,CAAC;4BACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wBAC1B,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,KAAM,SAAmB,CAAC,OAAO,EAAE,CACnE,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAErC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,IACE,WAAW,IAAI,SAAS;oBACxB,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC,EAC1C,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBACD,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,CAAC;gBAGb,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,GAAG,OAAO,EAAE,CAAC;oBAC5C,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;oBACtB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE5C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC;QAEH,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;YAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,8CAA8C,KAAK,EAAE,CACtD,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,uBAAuB,KAAK,yBAAyB,CACpF,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,MAAM,UAAU,GAAG,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAGD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAErE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,cAAc,QAAQ,oDAAoD,CAC3E,CAAC;QACJ,CAAC;QAGD,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,OAAO,yBAAyB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,gDAAgD,QAAQ,EAAE,CAAC;QAC1I,CAAC;QAGD,IAAI,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,OAAO,0BAA0B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iDAAiD,QAAQ,EAAE,CAAC;QACrH,CAAC;QAGD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,kEAAkE,QAAQ,EAAE,CAAC;QACtF,CAAC;QAGD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAGD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE3D,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAErD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV,MAAM,EACN,aAAa,EACb,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzD,EAAE,QAAQ,EAAE,CACb,CAAC;QAEF,OAAO,eAAe,CAAC;YACrB,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;AACH,CAAC,EACD;IACE,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,kFAAkF;IACpF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC7D,SAAS,EAAE,CAAC;aACT,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CACP,iFAAiF,CAClF;KACJ,CAAC;CACH,CACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const grepTool: import("langchain").DynamicStructuredTool<z.ZodObject<{
|
|
3
3
|
searchPath: z.ZodString;
|
|
4
4
|
query: z.ZodString;
|
|
5
5
|
patterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
@@ -7,6 +7,10 @@ export declare const grepContentTool: import("langchain").DynamicStructuredTool<
|
|
|
7
7
|
regex: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8
8
|
recursive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
9
9
|
maxResults: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
10
|
+
contextBefore: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
11
|
+
contextAfter: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
12
|
+
exclude: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
13
|
+
includeHidden: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
10
14
|
}, z.core.$strip>, {
|
|
11
15
|
searchPath: string;
|
|
12
16
|
query: string;
|
|
@@ -15,6 +19,10 @@ export declare const grepContentTool: import("langchain").DynamicStructuredTool<
|
|
|
15
19
|
regex: boolean;
|
|
16
20
|
recursive: boolean;
|
|
17
21
|
maxResults: number;
|
|
22
|
+
contextBefore: number;
|
|
23
|
+
contextAfter: number;
|
|
24
|
+
exclude: string[];
|
|
25
|
+
includeHidden: boolean;
|
|
18
26
|
}, {
|
|
19
27
|
searchPath: string;
|
|
20
28
|
query: string;
|
|
@@ -23,5 +31,9 @@ export declare const grepContentTool: import("langchain").DynamicStructuredTool<
|
|
|
23
31
|
regex?: boolean | undefined;
|
|
24
32
|
recursive?: boolean | undefined;
|
|
25
33
|
maxResults?: number | undefined;
|
|
34
|
+
contextBefore?: number | undefined;
|
|
35
|
+
contextAfter?: number | undefined;
|
|
36
|
+
exclude?: string[] | undefined;
|
|
37
|
+
includeHidden?: boolean | undefined;
|
|
26
38
|
}, string>;
|
|
27
39
|
//# sourceMappingURL=grep-content.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep-content.tool.d.ts","sourceRoot":"","sources":["../../src/tools/grep-content.tool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grep-content.tool.d.ts","sourceRoot":"","sources":["../../src/tools/grep-content.tool.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4KxB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAoOpB,CAAC"}
|