@johannes.latzel/llm-chat-file 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 +2 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +8 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/file-pool.d.ts +48 -0
- package/dist/lib/file-pool.d.ts.map +1 -0
- package/dist/lib/file-pool.js +105 -0
- package/dist/lib/file-pool.js.map +1 -0
- package/dist/lib/workspace.d.ts +9 -0
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +14 -0
- package/dist/lib/workspace.js.map +1 -1
- package/dist/packages/tool-package.d.ts +29 -0
- package/dist/packages/tool-package.d.ts.map +1 -0
- package/dist/packages/tool-package.js +83 -0
- package/dist/packages/tool-package.js.map +1 -0
- package/dist/tools/create-folder.d.ts +1 -0
- package/dist/tools/create-folder.d.ts.map +1 -1
- package/dist/tools/create-folder.js +16 -7
- package/dist/tools/create-folder.js.map +1 -1
- package/dist/tools/delete-file.d.ts +1 -0
- package/dist/tools/delete-file.d.ts.map +1 -1
- package/dist/tools/delete-file.js +17 -8
- package/dist/tools/delete-file.js.map +1 -1
- package/dist/tools/entry-info.d.ts +5 -1
- package/dist/tools/entry-info.d.ts.map +1 -1
- package/dist/tools/entry-info.js +23 -8
- package/dist/tools/entry-info.js.map +1 -1
- package/dist/tools/insert-file-content.d.ts +24 -0
- package/dist/tools/insert-file-content.d.ts.map +1 -0
- package/dist/tools/insert-file-content.js +112 -0
- package/dist/tools/insert-file-content.js.map +1 -0
- package/dist/tools/list-directory.d.ts.map +1 -1
- package/dist/tools/list-directory.js +6 -3
- package/dist/tools/list-directory.js.map +1 -1
- package/dist/tools/move-file.d.ts.map +1 -1
- package/dist/tools/move-file.js +5 -5
- package/dist/tools/move-file.js.map +1 -1
- package/dist/tools/read-file.d.ts +5 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +33 -17
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/replace-file-content.d.ts +27 -0
- package/dist/tools/replace-file-content.d.ts.map +1 -0
- package/dist/tools/replace-file-content.js +138 -0
- package/dist/tools/replace-file-content.js.map +1 -0
- package/dist/tools/replace-file-lines.d.ts +23 -0
- package/dist/tools/replace-file-lines.d.ts.map +1 -0
- package/dist/tools/replace-file-lines.js +128 -0
- package/dist/tools/replace-file-lines.js.map +1 -0
- package/dist/tools/search.d.ts +8 -3
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +166 -128
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/write-file.d.ts +4 -1
- package/dist/tools/write-file.d.ts.map +1 -1
- package/dist/tools/write-file.js +11 -4
- package/dist/tools/write-file.js.map +1 -1
- package/package.json +4 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-file.js","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,YAAY,EACZ,IAAI,EACJ,qBAAqB,EACrB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAGxC,wFAAwF;AACxF,MAAM,OAAO,cAAe,SAAQ,IAAI;IAC5B,EAAE,CAAY;IAEtB;;OAEG;IACH,YAAY,SAAoB;QAC5B,KAAK,CACD,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"delete-file.js","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { PartialToolResult, Tool } from '@johannes.latzel/llm-chat';
|
|
2
2
|
import type { Workspace } from '../lib/workspace.js';
|
|
3
|
-
/** Tool that returns metadata about
|
|
3
|
+
/** Tool that returns metadata about one or more filesystem entries. */
|
|
4
4
|
export declare class EntryInfoTool extends Tool {
|
|
5
5
|
private ws;
|
|
6
|
+
/**
|
|
7
|
+
* @param workspace - The workspace for path resolution and access checks.
|
|
8
|
+
*/
|
|
6
9
|
constructor(workspace: Workspace);
|
|
7
10
|
protected onExecute(args: Record<string, unknown>): Promise<PartialToolResult>;
|
|
11
|
+
private infoSingle;
|
|
8
12
|
}
|
|
9
13
|
//# sourceMappingURL=entry-info.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-info.d.ts","sourceRoot":"","sources":["../../src/tools/entry-info.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,
|
|
1
|
+
{"version":3,"file":"entry-info.d.ts","sourceRoot":"","sources":["../../src/tools/entry-info.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAIjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAoDrD,uEAAuE;AACvE,qBAAa,aAAc,SAAQ,IAAI;IACnC,OAAO,CAAC,EAAE,CAAY;IAEtB;;OAEG;gBACS,SAAS,EAAE,SAAS;cAiBhB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAYtE,UAAU;CA6C3B"}
|
package/dist/tools/entry-info.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ResultStatus, Tool, ToolParameterProperty, ToolParameters } from '@johannes.latzel/llm-chat';
|
|
1
|
+
import { PropertyType, ResultBuilder, ResultStatus, Tool, ToolParameterProperty, ToolParameters } from '@johannes.latzel/llm-chat';
|
|
2
2
|
import * as fsp from 'node:fs/promises';
|
|
3
3
|
import * as fs from 'node:fs';
|
|
4
4
|
/**
|
|
@@ -53,23 +53,38 @@ function entryType(stats) {
|
|
|
53
53
|
return EntryType.BlockDevice;
|
|
54
54
|
return EntryType.Unknown;
|
|
55
55
|
}
|
|
56
|
-
/** Tool that returns metadata about
|
|
56
|
+
/** Tool that returns metadata about one or more filesystem entries. */
|
|
57
57
|
export class EntryInfoTool extends Tool {
|
|
58
58
|
ws;
|
|
59
|
+
/**
|
|
60
|
+
* @param workspace - The workspace for path resolution and access checks.
|
|
61
|
+
*/
|
|
59
62
|
constructor(workspace) {
|
|
60
|
-
super('entry_info', 'Returns metadata about
|
|
61
|
-
|
|
62
|
-
}, ['
|
|
63
|
+
super('entry_info', 'Returns metadata about one or more filesystem entries (files, directories, symlinks, etc.) including type, size, timestamps, permissions, and symlink target if applicable. Paths can be absolute or relative to workspace root.', new ToolParameters({
|
|
64
|
+
paths: new ToolParameterProperty('Array of paths to get info for (absolute, or relative to workspace root)', PropertyType.Array)
|
|
65
|
+
}, ['paths']));
|
|
63
66
|
this.ws = workspace;
|
|
64
67
|
}
|
|
65
68
|
async onExecute(args) {
|
|
66
|
-
const
|
|
69
|
+
const rawPaths = args.paths;
|
|
70
|
+
if (!Array.isArray(rawPaths)) {
|
|
71
|
+
return { result: '"paths" must be an array of strings', status: ResultStatus.Error };
|
|
72
|
+
}
|
|
73
|
+
if (rawPaths.length === 0) {
|
|
74
|
+
return { result: '"paths" must be a non-empty array', status: ResultStatus.Error };
|
|
75
|
+
}
|
|
76
|
+
return await ResultBuilder.resolveAll(rawPaths.map((p) => this.infoSingle(p)));
|
|
77
|
+
}
|
|
78
|
+
async infoSingle(raw) {
|
|
67
79
|
if (typeof raw !== 'string' || !raw.trim()) {
|
|
68
|
-
return { result: '
|
|
80
|
+
return { result: 'Path must be a non-empty string', status: ResultStatus.Error };
|
|
69
81
|
}
|
|
70
82
|
const resolved = this.ws.normalize(raw.trim());
|
|
71
83
|
if (!this.ws.canRead(resolved)) {
|
|
72
|
-
return {
|
|
84
|
+
return {
|
|
85
|
+
result: `Invalid or inaccessible path${this.ws.pathHint(raw, resolved)}`,
|
|
86
|
+
status: ResultStatus.Error
|
|
87
|
+
};
|
|
73
88
|
}
|
|
74
89
|
let stats;
|
|
75
90
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-info.js","sourceRoot":"","sources":["../../src/tools/entry-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,YAAY,EACZ,IAAI,EACJ,qBAAqB,EACrB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B;;;GAGG;AACH,IAAK,SAiBJ;AAjBD,WAAK,SAAS;IACV,oBAAoB;IACpB,0BAAa,CAAA;IACb,iBAAiB;IACjB,oCAAuB,CAAA;IACvB,qBAAqB;IACrB,gCAAmB,CAAA;IACnB,yBAAyB;IACzB,0BAAa,CAAA;IACb,0BAA0B;IAC1B,8BAAiB,CAAA;IACjB,wBAAwB;IACxB,iDAAoC,CAAA;IACpC,oBAAoB;IACpB,yCAA4B,CAAA;IAC5B,8CAA8C;IAC9C,gCAAmB,CAAA;AACvB,CAAC,EAjBI,SAAS,KAAT,SAAS,QAiBb;AAED,SAAS,UAAU,CAAC,IAAY;IAC5B,MAAM,GAAG,GACL,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GACL,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GACL,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,SAAS,CAAC,KAAY;IAC3B,IAAI,KAAK,CAAC,cAAc,EAAE;QAAE,OAAO,SAAS,CAAC,OAAO,CAAC;IACrD,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,SAAS,CAAC,SAAS,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,EAAE;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC;IAC9C,IAAI,KAAK,CAAC,iBAAiB,EAAE;QAAE,OAAO,SAAS,CAAC,eAAe,CAAC;IAChE,IAAI,KAAK,CAAC,aAAa,EAAE;QAAE,OAAO,SAAS,CAAC,WAAW,CAAC;IACxD,OAAO,SAAS,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"entry-info.js","sourceRoot":"","sources":["../../src/tools/entry-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PartialToolResult, Tool } from '@johannes.latzel/llm-chat';
|
|
2
|
+
import { FileConfiguration } from '../lib/config.js';
|
|
3
|
+
import { FilePool } from '../lib/file-pool.js';
|
|
4
|
+
import type { Workspace } from '../lib/workspace.js';
|
|
5
|
+
/**
|
|
6
|
+
* Tool that inserts new text content at a specific line in an existing text file
|
|
7
|
+
* without overwriting existing content.
|
|
8
|
+
*
|
|
9
|
+
* Use "line" (1-indexed) to insert before a given line. Omit line to append at
|
|
10
|
+
* end of file. File must already exist.
|
|
11
|
+
*/
|
|
12
|
+
export declare class InsertFileContentTool extends Tool {
|
|
13
|
+
private ws;
|
|
14
|
+
private fc;
|
|
15
|
+
private filePool;
|
|
16
|
+
/**
|
|
17
|
+
* @param workspace - The workspace for path resolution and access checks.
|
|
18
|
+
* @param fileConfig - Configuration for file size and character limits.
|
|
19
|
+
* @param filePool - Optional pool for enforcing read-before-write checks.
|
|
20
|
+
*/
|
|
21
|
+
constructor(workspace: Workspace, fileConfig?: FileConfiguration, filePool?: FilePool);
|
|
22
|
+
protected onExecute(args: Record<string, unknown>): Promise<PartialToolResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=insert-file-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-file-content.d.ts","sourceRoot":"","sources":["../../src/tools/insert-file-content.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAGjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,IAAI;IAC3C,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;OAIG;gBACS,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,QAAQ;cAuBrE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAqFvF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { PropertyType, ResultStatus, Tool, ToolParameterProperty, ToolParameters } from '@johannes.latzel/llm-chat';
|
|
2
|
+
import * as fsp from 'node:fs/promises';
|
|
3
|
+
import { FileConfiguration } from '../lib/config.js';
|
|
4
|
+
import { isBinary } from '../lib/helpers.js';
|
|
5
|
+
/**
|
|
6
|
+
* Tool that inserts new text content at a specific line in an existing text file
|
|
7
|
+
* without overwriting existing content.
|
|
8
|
+
*
|
|
9
|
+
* Use "line" (1-indexed) to insert before a given line. Omit line to append at
|
|
10
|
+
* end of file. File must already exist.
|
|
11
|
+
*/
|
|
12
|
+
export class InsertFileContentTool extends Tool {
|
|
13
|
+
ws;
|
|
14
|
+
fc;
|
|
15
|
+
filePool;
|
|
16
|
+
/**
|
|
17
|
+
* @param workspace - The workspace for path resolution and access checks.
|
|
18
|
+
* @param fileConfig - Configuration for file size and character limits.
|
|
19
|
+
* @param filePool - Optional pool for enforcing read-before-write checks.
|
|
20
|
+
*/
|
|
21
|
+
constructor(workspace, fileConfig, filePool) {
|
|
22
|
+
super('insert_file_content', 'Inserts new text content at a specific line in an existing text file without overwriting existing content. Use "line" (1-indexed) to insert before a given line. Omit line to append at end of file. File must already exist.', new ToolParameters({
|
|
23
|
+
path: new ToolParameterProperty('File path (absolute, or relative to workspace root)'),
|
|
24
|
+
content: new ToolParameterProperty('Text content to insert'),
|
|
25
|
+
line: new ToolParameterProperty('Insert content before this line number (1-indexed). Omit to append at end of file.', PropertyType.Integer)
|
|
26
|
+
}, ['path', 'content']));
|
|
27
|
+
this.ws = workspace;
|
|
28
|
+
this.fc = fileConfig ?? new FileConfiguration();
|
|
29
|
+
this.filePool = filePool;
|
|
30
|
+
}
|
|
31
|
+
async onExecute(args) {
|
|
32
|
+
const raw = args.path;
|
|
33
|
+
if (typeof raw !== 'string' || !raw.trim()) {
|
|
34
|
+
return { result: 'Path must be a non-empty string', status: ResultStatus.Error };
|
|
35
|
+
}
|
|
36
|
+
const resolved = this.ws.normalize(raw.trim());
|
|
37
|
+
if (!this.ws.canWrite(resolved)) {
|
|
38
|
+
return {
|
|
39
|
+
result: `Invalid or inaccessible path (must be within writable directory)${this.ws.pathHint(raw, resolved)}`,
|
|
40
|
+
status: ResultStatus.Error
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const content = args.content;
|
|
44
|
+
if (typeof content !== 'string') {
|
|
45
|
+
return { result: 'content must be a string', status: ResultStatus.Error };
|
|
46
|
+
}
|
|
47
|
+
let stat;
|
|
48
|
+
try {
|
|
49
|
+
stat = await fsp.stat(resolved);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return {
|
|
53
|
+
result: `File not found: ${e.message}`,
|
|
54
|
+
status: ResultStatus.Error
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (!stat.isFile()) {
|
|
58
|
+
return { result: 'Path is not a file', status: ResultStatus.Error };
|
|
59
|
+
}
|
|
60
|
+
if (stat.size > this.fc.maxFileSize) {
|
|
61
|
+
return {
|
|
62
|
+
result: `File too large (${stat.size} bytes, max ${this.fc.maxFileSize})`,
|
|
63
|
+
status: ResultStatus.Error
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (await isBinary(resolved)) {
|
|
67
|
+
return {
|
|
68
|
+
result: 'File appears to be binary; this tool works with text files only',
|
|
69
|
+
status: ResultStatus.Error
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const readCheck = await this.filePool?.verifyWrite(resolved);
|
|
73
|
+
if (readCheck)
|
|
74
|
+
return readCheck;
|
|
75
|
+
try {
|
|
76
|
+
const fileContent = await fsp.readFile(resolved, 'utf-8');
|
|
77
|
+
const lines = fileContent.split('\n');
|
|
78
|
+
const line = typeof args.line === 'number' ? Math.floor(args.line) : lines.length + 1;
|
|
79
|
+
if (line < 1 || line > lines.length + 1) {
|
|
80
|
+
return {
|
|
81
|
+
result: `line (${line}) out of range: file has ${lines.length} lines, must be between 1 and ${lines.length + 1}`,
|
|
82
|
+
status: ResultStatus.Error
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const insertLines = content.split('\n');
|
|
86
|
+
const result = [
|
|
87
|
+
...lines.slice(0, line - 1),
|
|
88
|
+
...insertLines,
|
|
89
|
+
...lines.slice(line - 1)
|
|
90
|
+
].join('\n');
|
|
91
|
+
if (result.length > this.fc.maxCharsPerFile) {
|
|
92
|
+
return {
|
|
93
|
+
result: `Result exceeds max length of ${this.fc.maxCharsPerFile}`,
|
|
94
|
+
status: ResultStatus.Error
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
await fsp.writeFile(resolved, result, 'utf-8');
|
|
98
|
+
await this.filePool?.recordWrite(resolved);
|
|
99
|
+
return {
|
|
100
|
+
result: `Inserted content at line ${line} in ${resolved}`,
|
|
101
|
+
status: ResultStatus.Success
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return {
|
|
106
|
+
result: `Error inserting content: ${e.message}`,
|
|
107
|
+
status: ResultStatus.Error
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=insert-file-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-file-content.js","sourceRoot":"","sources":["../../src/tools/insert-file-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-directory.d.ts","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAGjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,IAAI;IACvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,EAAE,CAAsB;IAEhC;;;OAGG;gBACS,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"list-directory.d.ts","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAGjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,IAAI;IACvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,EAAE,CAAsB;IAEhC;;;OAGG;gBACS,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,mBAAmB;cAqB9C,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAgHvF"}
|
|
@@ -11,8 +11,8 @@ export class ListDirectoryTool extends Tool {
|
|
|
11
11
|
* @param config - Optional search configuration (display/total entry limits). Defaults to a new `SearchConfiguration`.
|
|
12
12
|
*/
|
|
13
13
|
constructor(workspace, config) {
|
|
14
|
-
super('list_directory', 'Lists files and directories in a path. Returns one entry per line; directories are suffixed with "/".', new ToolParameters({
|
|
15
|
-
path: new ToolParameterProperty('Directory path'),
|
|
14
|
+
super('list_directory', 'Lists files and directories in a path. Returns one entry per line; directories are suffixed with "/". Paths can be absolute or relative to workspace root.', new ToolParameters({
|
|
15
|
+
path: new ToolParameterProperty('Directory path (absolute, or relative to workspace root)'),
|
|
16
16
|
recursive: new ToolParameterProperty('Set to true to list recursively depth-first', PropertyType.Boolean)
|
|
17
17
|
}, ['path']));
|
|
18
18
|
this.ws = workspace;
|
|
@@ -25,7 +25,10 @@ export class ListDirectoryTool extends Tool {
|
|
|
25
25
|
}
|
|
26
26
|
const resolved = this.ws.normalize(raw.trim());
|
|
27
27
|
if (!this.ws.canRead(resolved)) {
|
|
28
|
-
return {
|
|
28
|
+
return {
|
|
29
|
+
result: `Invalid or inaccessible path${this.ws.pathHint(raw.trim(), resolved)}`,
|
|
30
|
+
status: ResultStatus.Error
|
|
31
|
+
};
|
|
29
32
|
}
|
|
30
33
|
let stat;
|
|
31
34
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-directory.js","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,qBAAqB,EACrB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,kFAAkF;AAClF,MAAM,OAAO,iBAAkB,SAAQ,IAAI;IAC/B,EAAE,CAAY;IACd,EAAE,CAAsB;IAEhC;;;OAGG;IACH,YAAY,SAAoB,EAAE,MAA4B;QAC1D,KAAK,CACD,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"list-directory.js","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-file.d.ts","sourceRoot":"","sources":["../../src/tools/move-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAEjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,iGAAiG;AACjG,qBAAa,YAAa,SAAQ,IAAI;IAClC,OAAO,CAAC,EAAE,CAAY;IAEtB;;OAEG;gBACS,SAAS,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"move-file.d.ts","sourceRoot":"","sources":["../../src/tools/move-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAEjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,iGAAiG;AACjG,qBAAa,YAAa,SAAQ,IAAI;IAClC,OAAO,CAAC,EAAE,CAAY;IAEtB;;OAEG;gBACS,SAAS,EAAE,SAAS;cAmBhB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAsDvF"}
|
package/dist/tools/move-file.js
CHANGED
|
@@ -8,9 +8,9 @@ export class MoveFileTool extends Tool {
|
|
|
8
8
|
* @param workspace - Workspace instance for path resolution and access control.
|
|
9
9
|
*/
|
|
10
10
|
constructor(workspace) {
|
|
11
|
-
super('move_file', 'Moves or renames a file or directory.', new ToolParameters({
|
|
12
|
-
source: new ToolParameterProperty('Source path'),
|
|
13
|
-
destination: new ToolParameterProperty('Destination path')
|
|
11
|
+
super('move_file', 'Moves or renames a file or directory. Paths can be absolute or relative to workspace root.', new ToolParameters({
|
|
12
|
+
source: new ToolParameterProperty('Source path (absolute, or relative to workspace root)'),
|
|
13
|
+
destination: new ToolParameterProperty('Destination path (absolute, or relative to workspace root)')
|
|
14
14
|
}, ['source', 'destination']));
|
|
15
15
|
this.ws = workspace;
|
|
16
16
|
}
|
|
@@ -25,7 +25,7 @@ export class MoveFileTool extends Tool {
|
|
|
25
25
|
const src = this.ws.normalize(srcRaw.trim());
|
|
26
26
|
if (!this.ws.canWrite(src)) {
|
|
27
27
|
return {
|
|
28
|
-
result:
|
|
28
|
+
result: `Invalid or inaccessible source path (must be within writable directory)${this.ws.pathHint(srcRaw.trim(), src)}`,
|
|
29
29
|
status: ResultStatus.Error
|
|
30
30
|
};
|
|
31
31
|
}
|
|
@@ -39,7 +39,7 @@ export class MoveFileTool extends Tool {
|
|
|
39
39
|
const dest = this.ws.normalize(destRaw.trim());
|
|
40
40
|
if (!this.ws.canWrite(dest)) {
|
|
41
41
|
return {
|
|
42
|
-
result:
|
|
42
|
+
result: `Invalid or inaccessible destination path (must be within writable directory)${this.ws.pathHint(destRaw.trim(), dest)}`,
|
|
43
43
|
status: ResultStatus.Error
|
|
44
44
|
};
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-file.js","sourceRoot":"","sources":["../../src/tools/move-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,YAAY,EACZ,IAAI,EACJ,qBAAqB,EACrB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,iGAAiG;AACjG,MAAM,OAAO,YAAa,SAAQ,IAAI;IAC1B,EAAE,CAAY;IAEtB;;OAEG;IACH,YAAY,SAAoB;QAC5B,KAAK,CACD,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"move-file.js","sourceRoot":"","sources":["../../src/tools/move-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { PartialToolResult, Tool } from '@johannes.latzel/llm-chat';
|
|
2
2
|
import { FileConfiguration } from '../lib/config.js';
|
|
3
|
+
import { FilePool } from '../lib/file-pool.js';
|
|
3
4
|
import type { Workspace } from '../lib/workspace.js';
|
|
4
5
|
export declare class ReadFileTool extends Tool {
|
|
5
6
|
private ws;
|
|
6
7
|
private fc;
|
|
8
|
+
private filePool;
|
|
7
9
|
/**
|
|
8
10
|
* @param workspace - Workspace instance for path resolution and access control.
|
|
9
11
|
* @param fileConfig - Optional file configuration (character limits). Defaults to a new `FileConfiguration`.
|
|
12
|
+
* @param filePool - Optional shared file pool for read-before-write tracking.
|
|
10
13
|
*/
|
|
11
|
-
constructor(workspace: Workspace, fileConfig?: FileConfiguration);
|
|
14
|
+
constructor(workspace: Workspace, fileConfig?: FileConfiguration, filePool?: FilePool);
|
|
12
15
|
protected onExecute(args: Record<string, unknown>): Promise<PartialToolResult>;
|
|
16
|
+
private readSingleFile;
|
|
13
17
|
}
|
|
14
18
|
//# sourceMappingURL=read-file.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,
|
|
1
|
+
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAIjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,qBAAa,YAAa,SAAQ,IAAI;IAClC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;OAIG;gBACS,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,QAAQ;cA+BrE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAwBtE,cAAc;CAkE/B"}
|
package/dist/tools/read-file.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PropertyType, ResultStatus, Tool, ToolParameterProperty, ToolParameters } from '@johannes.latzel/llm-chat';
|
|
1
|
+
import { PropertyType, ResultBuilder, ResultStatus, Tool, ToolParameterProperty, ToolParameters } from '@johannes.latzel/llm-chat';
|
|
2
2
|
import * as fsp from 'node:fs/promises';
|
|
3
3
|
import { FileConfiguration } from '../lib/config.js';
|
|
4
4
|
import { isBinary } from '../lib/helpers.js';
|
|
@@ -7,28 +7,48 @@ const TRUNCATION_SUFFIX = '\n... [truncated]';
|
|
|
7
7
|
export class ReadFileTool extends Tool {
|
|
8
8
|
ws;
|
|
9
9
|
fc;
|
|
10
|
+
filePool;
|
|
10
11
|
/**
|
|
11
12
|
* @param workspace - Workspace instance for path resolution and access control.
|
|
12
13
|
* @param fileConfig - Optional file configuration (character limits). Defaults to a new `FileConfiguration`.
|
|
14
|
+
* @param filePool - Optional shared file pool for read-before-write tracking.
|
|
13
15
|
*/
|
|
14
|
-
constructor(workspace, fileConfig) {
|
|
15
|
-
super('read_file', 'Reads the contents of
|
|
16
|
-
|
|
16
|
+
constructor(workspace, fileConfig, filePool) {
|
|
17
|
+
super('read_file', 'Reads the full contents of one or more text files. Supports optional line ranges (start_line/end_line, 1-indexed) to read specific sections only. Pass an array of file paths ("paths"). Paths can be absolute or relative to workspace root.', new ToolParameters({
|
|
18
|
+
paths: new ToolParameterProperty('Array of file paths to read (absolute, or relative to workspace root)', PropertyType.Array),
|
|
17
19
|
max_chars: new ToolParameterProperty('Maximum number of characters to return (default: config max)', PropertyType.Integer),
|
|
18
20
|
start_line: new ToolParameterProperty('First line number to read (1-indexed, inclusive)', PropertyType.Integer),
|
|
19
21
|
end_line: new ToolParameterProperty('Last line number to read (1-indexed, inclusive)', PropertyType.Integer)
|
|
20
|
-
}, ['
|
|
22
|
+
}, ['paths']));
|
|
21
23
|
this.ws = workspace;
|
|
22
24
|
this.fc = fileConfig ?? new FileConfiguration();
|
|
25
|
+
this.filePool = filePool;
|
|
23
26
|
}
|
|
24
27
|
async onExecute(args) {
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
28
|
+
const rawPaths = args.paths;
|
|
29
|
+
if (!Array.isArray(rawPaths)) {
|
|
30
|
+
return { result: '"paths" must be an array of strings', status: ResultStatus.Error };
|
|
31
|
+
}
|
|
32
|
+
if (rawPaths.length === 0) {
|
|
33
|
+
return { result: '"paths" must be a non-empty array', status: ResultStatus.Error };
|
|
34
|
+
}
|
|
35
|
+
const maxChars = typeof args.max_chars === 'number'
|
|
36
|
+
? Math.max(1, Math.min(args.max_chars, this.fc.maxCharsPerFile))
|
|
37
|
+
: this.fc.maxCharsPerFile;
|
|
38
|
+
const startLine = typeof args.start_line === 'number' ? Math.max(1, args.start_line) : undefined;
|
|
39
|
+
const endLine = typeof args.end_line === 'number' && args.end_line > 0 ? args.end_line : undefined;
|
|
40
|
+
return await ResultBuilder.resolveAll(rawPaths.map((p) => this.readSingleFile(p, maxChars, startLine, endLine)));
|
|
41
|
+
}
|
|
42
|
+
async readSingleFile(rawPath, maxChars, startLine, endLine) {
|
|
43
|
+
if (typeof rawPath !== 'string' || !rawPath.trim()) {
|
|
27
44
|
return { result: 'Path must be a non-empty string', status: ResultStatus.Error };
|
|
28
45
|
}
|
|
29
|
-
const resolved = this.ws.normalize(
|
|
46
|
+
const resolved = this.ws.normalize(rawPath.trim());
|
|
30
47
|
if (!this.ws.canRead(resolved)) {
|
|
31
|
-
return {
|
|
48
|
+
return {
|
|
49
|
+
result: `Invalid or inaccessible path${this.ws.pathHint(rawPath, resolved)}`,
|
|
50
|
+
status: ResultStatus.Error
|
|
51
|
+
};
|
|
32
52
|
}
|
|
33
53
|
let stat;
|
|
34
54
|
try {
|
|
@@ -41,25 +61,20 @@ export class ReadFileTool extends Tool {
|
|
|
41
61
|
};
|
|
42
62
|
}
|
|
43
63
|
if (!stat.isFile()) {
|
|
44
|
-
return { result:
|
|
64
|
+
return { result: `Path is not a file: ${resolved}`, status: ResultStatus.Error };
|
|
45
65
|
}
|
|
46
66
|
if (stat.size > this.fc.maxFileSize) {
|
|
47
67
|
return {
|
|
48
|
-
result: `File too large (${stat.size} bytes, max ${this.fc.maxFileSize})`,
|
|
68
|
+
result: `File too large (${stat.size} bytes, max ${this.fc.maxFileSize}): ${resolved}`,
|
|
49
69
|
status: ResultStatus.Error
|
|
50
70
|
};
|
|
51
71
|
}
|
|
52
72
|
if (await isBinary(resolved)) {
|
|
53
73
|
return {
|
|
54
|
-
result:
|
|
74
|
+
result: `File appears to be binary; use read_file for text files only: ${resolved}`,
|
|
55
75
|
status: ResultStatus.Error
|
|
56
76
|
};
|
|
57
77
|
}
|
|
58
|
-
const maxChars = typeof args.max_chars === 'number'
|
|
59
|
-
? Math.max(1, Math.min(args.max_chars, this.fc.maxCharsPerFile))
|
|
60
|
-
: this.fc.maxCharsPerFile;
|
|
61
|
-
const startLine = typeof args.start_line === 'number' ? Math.max(1, args.start_line) : undefined;
|
|
62
|
-
const endLine = typeof args.end_line === 'number' && args.end_line > 0 ? args.end_line : undefined;
|
|
63
78
|
try {
|
|
64
79
|
const content = await fsp.readFile(resolved, 'utf-8');
|
|
65
80
|
const lines = content.split('\n');
|
|
@@ -70,6 +85,7 @@ export class ReadFileTool extends Tool {
|
|
|
70
85
|
if (result.length > maxChars) {
|
|
71
86
|
result = result.slice(0, maxChars - TRUNCATION_SUFFIX.length) + TRUNCATION_SUFFIX;
|
|
72
87
|
}
|
|
88
|
+
await this.filePool?.recordRead(resolved);
|
|
73
89
|
return {
|
|
74
90
|
result: `--- ${resolved} (lines ${sliceStart + 1}-${Math.min(sliceEnd, lines.length)} of ${lines.length}) ---\n${result}`,
|
|
75
91
|
status: ResultStatus.Success
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,qBAAqB,EACrB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PartialToolResult, Tool } from '@johannes.latzel/llm-chat';
|
|
2
|
+
import { FileConfiguration } from '../lib/config.js';
|
|
3
|
+
import { FilePool } from '../lib/file-pool.js';
|
|
4
|
+
import type { Workspace } from '../lib/workspace.js';
|
|
5
|
+
/**
|
|
6
|
+
* Tool that replaces an exact substring in one or more existing text files
|
|
7
|
+
* with new content (partial edit, unlike write_file which overwrites the
|
|
8
|
+
* whole file).
|
|
9
|
+
*
|
|
10
|
+
* Use replace_all to replace all occurrences vs only the first.
|
|
11
|
+
* Works like find-and-replace. Files must already exist.
|
|
12
|
+
* The same old_content/new_content is applied to every file in paths.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ReplaceFileContentTool extends Tool {
|
|
15
|
+
private ws;
|
|
16
|
+
private fc;
|
|
17
|
+
private filePool;
|
|
18
|
+
/**
|
|
19
|
+
* @param workspace - The workspace for path resolution and access checks.
|
|
20
|
+
* @param fileConfig - Configuration for file size and character limits.
|
|
21
|
+
* @param filePool - Optional pool for enforcing read-before-write checks.
|
|
22
|
+
*/
|
|
23
|
+
constructor(workspace: Workspace, fileConfig?: FileConfiguration, filePool?: FilePool);
|
|
24
|
+
protected onExecute(args: Record<string, unknown>): Promise<PartialToolResult>;
|
|
25
|
+
private replaceInFile;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=replace-file-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace-file-content.d.ts","sourceRoot":"","sources":["../../src/tools/replace-file-content.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAIjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,IAAI;IAC5C,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;OAIG;gBACS,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,QAAQ;cA6BrE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;YA0BtE,aAAa;CA2F9B"}
|