@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.
Files changed (64) hide show
  1. package/README.md +2 -1
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/config.d.ts +8 -1
  7. package/dist/lib/config.d.ts.map +1 -1
  8. package/dist/lib/config.js +10 -1
  9. package/dist/lib/config.js.map +1 -1
  10. package/dist/lib/file-pool.d.ts +48 -0
  11. package/dist/lib/file-pool.d.ts.map +1 -0
  12. package/dist/lib/file-pool.js +105 -0
  13. package/dist/lib/file-pool.js.map +1 -0
  14. package/dist/lib/workspace.d.ts +9 -0
  15. package/dist/lib/workspace.d.ts.map +1 -1
  16. package/dist/lib/workspace.js +14 -0
  17. package/dist/lib/workspace.js.map +1 -1
  18. package/dist/packages/tool-package.d.ts +29 -0
  19. package/dist/packages/tool-package.d.ts.map +1 -0
  20. package/dist/packages/tool-package.js +83 -0
  21. package/dist/packages/tool-package.js.map +1 -0
  22. package/dist/tools/create-folder.d.ts +1 -0
  23. package/dist/tools/create-folder.d.ts.map +1 -1
  24. package/dist/tools/create-folder.js +16 -7
  25. package/dist/tools/create-folder.js.map +1 -1
  26. package/dist/tools/delete-file.d.ts +1 -0
  27. package/dist/tools/delete-file.d.ts.map +1 -1
  28. package/dist/tools/delete-file.js +17 -8
  29. package/dist/tools/delete-file.js.map +1 -1
  30. package/dist/tools/entry-info.d.ts +5 -1
  31. package/dist/tools/entry-info.d.ts.map +1 -1
  32. package/dist/tools/entry-info.js +23 -8
  33. package/dist/tools/entry-info.js.map +1 -1
  34. package/dist/tools/insert-file-content.d.ts +24 -0
  35. package/dist/tools/insert-file-content.d.ts.map +1 -0
  36. package/dist/tools/insert-file-content.js +112 -0
  37. package/dist/tools/insert-file-content.js.map +1 -0
  38. package/dist/tools/list-directory.d.ts.map +1 -1
  39. package/dist/tools/list-directory.js +6 -3
  40. package/dist/tools/list-directory.js.map +1 -1
  41. package/dist/tools/move-file.d.ts.map +1 -1
  42. package/dist/tools/move-file.js +5 -5
  43. package/dist/tools/move-file.js.map +1 -1
  44. package/dist/tools/read-file.d.ts +5 -1
  45. package/dist/tools/read-file.d.ts.map +1 -1
  46. package/dist/tools/read-file.js +33 -17
  47. package/dist/tools/read-file.js.map +1 -1
  48. package/dist/tools/replace-file-content.d.ts +27 -0
  49. package/dist/tools/replace-file-content.d.ts.map +1 -0
  50. package/dist/tools/replace-file-content.js +138 -0
  51. package/dist/tools/replace-file-content.js.map +1 -0
  52. package/dist/tools/replace-file-lines.d.ts +23 -0
  53. package/dist/tools/replace-file-lines.d.ts.map +1 -0
  54. package/dist/tools/replace-file-lines.js +128 -0
  55. package/dist/tools/replace-file-lines.js.map +1 -0
  56. package/dist/tools/search.d.ts +8 -3
  57. package/dist/tools/search.d.ts.map +1 -1
  58. package/dist/tools/search.js +166 -128
  59. package/dist/tools/search.js.map +1 -1
  60. package/dist/tools/write-file.d.ts +4 -1
  61. package/dist/tools/write-file.d.ts.map +1 -1
  62. package/dist/tools/write-file.js +11 -4
  63. package/dist/tools/write-file.js.map +1 -1
  64. 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,2GAA2G,EAC3G,IAAI,cAAc,CACd;YACI,IAAI,EAAE,IAAI,qBAAqB,CAAC,wBAAwB,CAAC;YACzD,SAAS,EAAE,IAAI,qBAAqB,CAChC,mDAAmD,CACtD;SACJ,EACD,CAAC,MAAM,CAAC,CACX,CACJ,CAAC;QACF,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;IACxB,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,IAA6B;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QAClF,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACH,MAAM,EAAE,kEAAkE;gBAC1E,MAAM,EAAE,YAAY,CAAC,KAAK;aAC7B,CAAC;QACN,CAAC;QAED,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACD,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;QAE1C,IAAI,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnC,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,WAAW,KAAK,KAAK,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;QACrF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO;gBACH,MAAM,EAAE,kBAAkB,KAAK,KAAM,CAAW,CAAC,OAAO,EAAE;gBAC1D,MAAM,EAAE,YAAY,CAAC,KAAK;aAC7B,CAAC;QACN,CAAC;IACL,CAAC;CACJ"}
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 a filesystem entry (file, directory, symlink, etc.). */
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,EAEjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAoDrD,4FAA4F;AAC5F,qBAAa,aAAc,SAAQ,IAAI;IACnC,OAAO,CAAC,EAAE,CAAY;gBAEV,SAAS,EAAE,SAAS;cAchB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA2CvF"}
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"}
@@ -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 a filesystem entry (file, directory, symlink, etc.). */
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 a filesystem entry (file, directory, symlink, etc.) including its type, size, timestamps, permissions, and symlink target if applicable.', new ToolParameters({
61
- path: new ToolParameterProperty('File system path')
62
- }, ['path']));
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 raw = args.path;
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: 'Invalid or inaccessible path', status: ResultStatus.Error };
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 { result: 'Invalid or inaccessible path', status: ResultStatus.Error };
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":"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"}
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;cAmB9C,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA6GvF"}
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 { result: 'Invalid or inaccessible path', status: ResultStatus.Error };
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":"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"}
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;cAehB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAsDvF"}
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"}
@@ -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: 'Invalid or inaccessible source path (must be within writable directory)',
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: 'Invalid or inaccessible destination path (must be within writable directory)',
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":"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"}
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,EAGjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,qBAAa,YAAa,SAAQ,IAAI;IAClC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,EAAE,CAAoB;IAE9B;;;OAGG;gBACS,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,iBAAiB;cA2BhD,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAmEvF"}
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"}
@@ -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 a text file. Supports optional max characters and line ranges (start_line/end_line, 1-indexed).', new ToolParameters({
16
- path: new ToolParameterProperty('File path'),
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
- }, ['path']));
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 raw = args.path;
26
- if (typeof raw !== 'string' || !raw.trim()) {
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(raw.trim());
46
+ const resolved = this.ws.normalize(rawPath.trim());
30
47
  if (!this.ws.canRead(resolved)) {
31
- return { result: 'Invalid or inaccessible path', status: ResultStatus.Error };
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: 'Path is not a file', status: ResultStatus.Error };
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: 'File appears to be binary; use read_file for text files only',
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":"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"}
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"}