@johannes.latzel/llm-chat-file 0.1.1 → 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 +1 -0
  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 -2
package/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
  [![codecov](https://codecov.io/gh/johanneslatzel/llm-chat-file/graph/badge.svg)](https://codecov.io/gh/johanneslatzel/llm-chat-file)
9
9
  [![CI](https://github.com/johanneslatzel/llm-chat-file/actions/workflows/ci.yml/badge.svg)](https://github.com/johanneslatzel/llm-chat-file/actions/workflows/ci.yml)
10
10
  [![Socket Badge](https://badge.socket.dev/npm/package/@johannes.latzel/llm-chat-file/latest)](https://badge.socket.dev/npm/package/@johannes.latzel/llm-chat-file/latest)
11
+ [![AI Assisted Yes](https://img.shields.io/badge/AI%20Assisted-Yes-green)](https://github.com/mefengl/made-by-ai)
11
12
 
12
13
  Filesystem tools for the llm-chat package
13
14
 
package/dist/index.d.ts CHANGED
@@ -12,4 +12,8 @@ export { MoveFileTool } from './tools/move-file.js';
12
12
  export { SwitchWorkspaceTool } from './tools/switch-workspace.js';
13
13
  export { FileAccessInfoTool } from './tools/file-access-info.js';
14
14
  export { EntryInfoTool } from './tools/entry-info.js';
15
+ export { ReplaceFileLinesTool } from './tools/replace-file-lines.js';
16
+ export { InsertFileContentTool } from './tools/insert-file-content.js';
17
+ export { ReplaceFileContentTool } from './tools/replace-file-content.js';
18
+ export { FileToolPackage } from './packages/tool-package.js';
15
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -11,4 +11,8 @@ export { MoveFileTool } from './tools/move-file.js';
11
11
  export { SwitchWorkspaceTool } from './tools/switch-workspace.js';
12
12
  export { FileAccessInfoTool } from './tools/file-access-info.js';
13
13
  export { EntryInfoTool } from './tools/entry-info.js';
14
+ export { ReplaceFileLinesTool } from './tools/replace-file-lines.js';
15
+ export { InsertFileContentTool } from './tools/insert-file-content.js';
16
+ export { ReplaceFileContentTool } from './tools/replace-file-content.js';
17
+ export { FileToolPackage } from './packages/tool-package.js';
14
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
@@ -80,10 +80,17 @@ export declare class FileConfiguration {
80
80
  * Falls back to the `LLM_CHAT_FS_MAX_FILE_SIZE` environment variable, or `10485760` (10 MB) if not set.
81
81
  */
82
82
  maxFileSize: number;
83
+ /**
84
+ * When `true`, write/edit tools require the file to have been read via `read_file`
85
+ * before modifications are allowed. Falls back to the `LLM_CHAT_FS_REQUIRE_READ_BEFORE_WRITE`
86
+ * environment variable, or `false` if not set.
87
+ */
88
+ requireReadBeforeWrite: boolean;
83
89
  /**
84
90
  * @param maxCharsPerFile - Maximum chars. Defaults to env `LLM_CHAT_FS_MAX_CHARS_PER_FILE` or `10000`.
85
91
  * @param maxFileSize - Maximum file size in bytes. Defaults to env `LLM_CHAT_FS_MAX_FILE_SIZE` or `10485760` (10 MB).
92
+ * @param requireReadBeforeWrite - Require read before write. Defaults to env `LLM_CHAT_FS_REQUIRE_READ_BEFORE_WRITE` or `true`.
86
93
  */
87
- constructor(maxCharsPerFile?: number, maxFileSize?: number);
94
+ constructor(maxCharsPerFile?: number, maxFileSize?: number, requireReadBeforeWrite?: boolean);
88
95
  }
89
96
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,sGAAsG;AACtG,qBAAa,mBAAmB;IAC5B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;gBAEC,gBAAgB,CAAC,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,eAAe,CAAC,EAAE,MAAM,EACxB,SAAS,CAAC,EAAE,MAAM;CAUzB;AAED,gGAAgG;AAChG,qBAAa,sBAAsB;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE/C,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC;;;;;;;;;OASG;gBAEC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,eAAe,CAAC,EAAE,OAAO,EACzB,aAAa,CAAC,EAAE,MAAM;IA8B1B;;;;;OAKG;IACH,WAAW,IAAI,sBAAsB;CAgBxC;AAED,6EAA6E;AAC7E,qBAAa,iBAAiB;IAC1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;gBACS,eAAe,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAM7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,sGAAsG;AACtG,qBAAa,mBAAmB;IAC5B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;gBAEC,gBAAgB,CAAC,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,eAAe,CAAC,EAAE,MAAM,EACxB,SAAS,CAAC,EAAE,MAAM;CAUzB;AAED,gGAAgG;AAChG,qBAAa,sBAAsB;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE/C,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC;;;;;;;;;OASG;gBAEC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,eAAe,CAAC,EAAE,OAAO,EACzB,aAAa,CAAC,EAAE,MAAM;IA8B1B;;;;;OAKG;IACH,WAAW,IAAI,sBAAsB;CAgBxC;AAED,6EAA6E;AAC7E,qBAAa,iBAAiB;IAC1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAEhC;;;;OAIG;gBACS,eAAe,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,OAAO;CAQ/F"}
@@ -120,15 +120,24 @@ export class FileConfiguration {
120
120
  * Falls back to the `LLM_CHAT_FS_MAX_FILE_SIZE` environment variable, or `10485760` (10 MB) if not set.
121
121
  */
122
122
  maxFileSize;
123
+ /**
124
+ * When `true`, write/edit tools require the file to have been read via `read_file`
125
+ * before modifications are allowed. Falls back to the `LLM_CHAT_FS_REQUIRE_READ_BEFORE_WRITE`
126
+ * environment variable, or `false` if not set.
127
+ */
128
+ requireReadBeforeWrite;
123
129
  /**
124
130
  * @param maxCharsPerFile - Maximum chars. Defaults to env `LLM_CHAT_FS_MAX_CHARS_PER_FILE` or `10000`.
125
131
  * @param maxFileSize - Maximum file size in bytes. Defaults to env `LLM_CHAT_FS_MAX_FILE_SIZE` or `10485760` (10 MB).
132
+ * @param requireReadBeforeWrite - Require read before write. Defaults to env `LLM_CHAT_FS_REQUIRE_READ_BEFORE_WRITE` or `true`.
126
133
  */
127
- constructor(maxCharsPerFile, maxFileSize) {
134
+ constructor(maxCharsPerFile, maxFileSize, requireReadBeforeWrite) {
128
135
  this.maxCharsPerFile =
129
136
  maxCharsPerFile ?? parseEnvInt('LLM_CHAT_FS_MAX_CHARS_PER_FILE', 10000);
130
137
  this.maxFileSize =
131
138
  maxFileSize ?? parseEnvInt('LLM_CHAT_FS_MAX_FILE_SIZE', 10 * 1024 * 1024);
139
+ this.requireReadBeforeWrite =
140
+ requireReadBeforeWrite ?? parseEnvBool('LLM_CHAT_FS_REQUIRE_READ_BEFORE_WRITE', true);
132
141
  }
133
142
  }
134
143
  function parseEnvInt(key, fallback, min = 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,sGAAsG;AACtG,MAAM,OAAO,mBAAmB;IAC5B;;;OAGG;IACH,gBAAgB,CAAS;IAEzB;;;OAGG;IACH,iBAAiB,CAAS;IAE1B;;;OAGG;IACH,eAAe,CAAS;IAExB;;;OAGG;IACH,SAAS,CAAS;IAElB;;;;;OAKG;IACH,YACI,gBAAyB,EACzB,iBAA0B,EAC1B,eAAwB,EACxB,SAAkB;QAElB,IAAI,CAAC,gBAAgB;YACjB,gBAAgB,IAAI,WAAW,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,iBAAiB;YAClB,iBAAiB,IAAI,WAAW,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;QAC7E,IAAI,CAAC,eAAe;YAChB,eAAe,IAAI,WAAW,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,WAAW,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnF,CAAC;CACJ;AAED,gGAAgG;AAChG,MAAM,OAAO,sBAAsB;IAC/B,+DAA+D;IAC/D,QAAQ,CAAuC;IAE/C,0FAA0F;IAC1F,QAAQ,CAAW;IAEnB;;;;OAIG;IACH,eAAe,CAAU;IAEzB,sFAAsF;IACtF,aAAa,CAAsB;IAEnC;;;;;;;;;OASG;IACH,YACI,QAA+C,EAC/C,QAAmB,EACnB,eAAyB,EACzB,aAAsB;QAEtB,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI,KAAK,CAAC;YAChD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACvC,CAAC;aAAM,CAAC;YACJ,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAChF,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAC1D,CAAC;YACF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC7D,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YAC3E,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAChC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,WAAW;QACP,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,QAAQ,KAAK,UAAU,CAAC,KAAK;gBAAE,SAAS;YAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,OAAO,IAAI,sBAAsB,CAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAClE,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,aAAa,CACrB,CAAC;IACN,CAAC;CACJ;AAED,6EAA6E;AAC7E,MAAM,OAAO,iBAAiB;IAC1B;;;OAGG;IACH,eAAe,CAAS;IAExB;;;OAGG;IACH,WAAW,CAAS;IAEpB;;;OAGG;IACH,YAAY,eAAwB,EAAE,WAAoB;QACtD,IAAI,CAAC,eAAe;YAChB,eAAe,IAAI,WAAW,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW;YACZ,WAAW,IAAI,WAAW,CAAC,2BAA2B,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IAClF,CAAC;CACJ;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,QAAgB,EAAE,GAAG,GAAG,CAAC;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG;SACL,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,QAAiB;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrD,OAAO,GAAG,KAAK,MAAM,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type PartialToolResult } from '@johannes.latzel/llm-chat';
2
+ import { FileConfiguration } from './config.js';
3
+ /**
4
+ * Tracks file reads and writes to enforce a "require read before write" policy.
5
+ *
6
+ * When enabled via {@link FileConfiguration.requireReadBeforeWrite}, files must be
7
+ * read before they can be modified. A write also counts as a read, so the sequence
8
+ * read -> write -> write is allowed. This ensures the tool knows the current file
9
+ * content before applying edits.
10
+ */
11
+ export declare class FilePool {
12
+ private mutex;
13
+ private _timestamps;
14
+ private fc;
15
+ /**
16
+ * @param fileConfig - Configuration that controls whether the read-before-write
17
+ * check is enabled.
18
+ */
19
+ constructor(fileConfig: FileConfiguration);
20
+ /**
21
+ * Records that a file was read at the current time.
22
+ * This timestamp is later checked by {@link verifyWrite} to detect concurrent
23
+ * modifications.
24
+ *
25
+ * @param resolved - The resolved absolute path to the file.
26
+ */
27
+ recordRead(resolved: string): Promise<void>;
28
+ /**
29
+ * Verifies that a file is safe to write: it must have been read after the last
30
+ * on-disk modification, or (if {@link allowNew} is true) must not exist yet.
31
+ *
32
+ * @param resolved - The resolved absolute path to the file.
33
+ * @param allowNew - When true, allows writing to a path that has no read
34
+ * timestamp as long as the path does not currently exist.
35
+ * @returns An error {@link PartialToolResult} if the write should be blocked,
36
+ * or `null` if the write is allowed.
37
+ */
38
+ verifyWrite(resolved: string, allowNew?: boolean): Promise<PartialToolResult | null>;
39
+ /**
40
+ * Records that a file was written at the current time.
41
+ * A write also counts as a read, so subsequent writes are allowed without
42
+ * an intervening read_file call.
43
+ *
44
+ * @param resolved - The resolved absolute path to the file.
45
+ */
46
+ recordWrite(resolved: string): Promise<void>;
47
+ }
48
+ //# sourceMappingURL=file-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-pool.d.ts","sourceRoot":"","sources":["../../src/lib/file-pool.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACjB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,EAAE,CAAoB;IAE9B;;;OAGG;gBACS,UAAU,EAAE,iBAAiB;IAIzC;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD;;;;;;;;;OASG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAmCxF;;;;;;OAMG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CASrD"}
@@ -0,0 +1,105 @@
1
+ import { Mutex } from 'async-mutex';
2
+ import { ResultStatus } from '@johannes.latzel/llm-chat';
3
+ import * as fsp from 'node:fs/promises';
4
+ /**
5
+ * Tracks file reads and writes to enforce a "require read before write" policy.
6
+ *
7
+ * When enabled via {@link FileConfiguration.requireReadBeforeWrite}, files must be
8
+ * read before they can be modified. A write also counts as a read, so the sequence
9
+ * read -> write -> write is allowed. This ensures the tool knows the current file
10
+ * content before applying edits.
11
+ */
12
+ export class FilePool {
13
+ mutex = new Mutex();
14
+ _timestamps = new Map();
15
+ fc;
16
+ /**
17
+ * @param fileConfig - Configuration that controls whether the read-before-write
18
+ * check is enabled.
19
+ */
20
+ constructor(fileConfig) {
21
+ this.fc = fileConfig;
22
+ }
23
+ /**
24
+ * Records that a file was read at the current time.
25
+ * This timestamp is later checked by {@link verifyWrite} to detect concurrent
26
+ * modifications.
27
+ *
28
+ * @param resolved - The resolved absolute path to the file.
29
+ */
30
+ async recordRead(resolved) {
31
+ if (!this.fc.requireReadBeforeWrite)
32
+ return;
33
+ await this.mutex.runExclusive(() => {
34
+ // +1 provides a 1ms buffer so that filesystem mtime (which may have
35
+ // sub-ms precision) does not trigger a false "changed since last read"
36
+ // when the read and a subsequent write fall within the same clock tick.
37
+ this._timestamps.set(resolved, Date.now() + 1);
38
+ });
39
+ }
40
+ /**
41
+ * Verifies that a file is safe to write: it must have been read after the last
42
+ * on-disk modification, or (if {@link allowNew} is true) must not exist yet.
43
+ *
44
+ * @param resolved - The resolved absolute path to the file.
45
+ * @param allowNew - When true, allows writing to a path that has no read
46
+ * timestamp as long as the path does not currently exist.
47
+ * @returns An error {@link PartialToolResult} if the write should be blocked,
48
+ * or `null` if the write is allowed.
49
+ */
50
+ async verifyWrite(resolved, allowNew = false) {
51
+ if (!this.fc.requireReadBeforeWrite)
52
+ return null;
53
+ return this.mutex.runExclusive(async () => {
54
+ const lastRead = this._timestamps.get(resolved);
55
+ if (lastRead === undefined) {
56
+ if (allowNew) {
57
+ try {
58
+ await fsp.stat(resolved);
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ return {
65
+ result: `File must be read before writing: ${resolved}`,
66
+ status: ResultStatus.Error
67
+ };
68
+ }
69
+ try {
70
+ const st = await fsp.stat(resolved);
71
+ if (st.mtime.getTime() > lastRead) {
72
+ return {
73
+ result: `File has changed since last read: ${resolved}`,
74
+ status: ResultStatus.Error
75
+ };
76
+ }
77
+ }
78
+ catch {
79
+ return {
80
+ result: `File must be read before writing: ${resolved}`,
81
+ status: ResultStatus.Error
82
+ };
83
+ }
84
+ return null;
85
+ });
86
+ }
87
+ /**
88
+ * Records that a file was written at the current time.
89
+ * A write also counts as a read, so subsequent writes are allowed without
90
+ * an intervening read_file call.
91
+ *
92
+ * @param resolved - The resolved absolute path to the file.
93
+ */
94
+ async recordWrite(resolved) {
95
+ if (!this.fc.requireReadBeforeWrite)
96
+ return;
97
+ await this.mutex.runExclusive(() => {
98
+ // Same +1 buffer as recordRead — ensures a write that lands in the same
99
+ // millisecond as verifyWrite's mtime check isn't mistaken for external
100
+ // modification.
101
+ this._timestamps.set(resolved, Date.now() + 1);
102
+ });
103
+ }
104
+ }
105
+ //# sourceMappingURL=file-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-pool.js","sourceRoot":"","sources":["../../src/lib/file-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,YAAY,EAA0B,MAAM,2BAA2B,CAAC;AACjF,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAGxC;;;;;;;GAOG;AACH,MAAM,OAAO,QAAQ;IACT,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IACpB,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,EAAE,CAAoB;IAE9B;;;OAGG;IACH,YAAY,UAA6B;QACrC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC7B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB;YAAE,OAAO;QAC5C,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAC/B,oEAAoE;YACpE,uEAAuE;YACvE,wEAAwE;YACxE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,QAAQ,GAAG,KAAK;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,QAAQ,EAAE,CAAC;oBACX,IAAI,CAAC;wBACD,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7B,CAAC;oBAAC,MAAM,CAAC;wBACL,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,OAAO;oBACH,MAAM,EAAE,qCAAqC,QAAQ,EAAE;oBACvD,MAAM,EAAE,YAAY,CAAC,KAAK;iBAC7B,CAAC;YACN,CAAC;YACD,IAAI,CAAC;gBACD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;oBAChC,OAAO;wBACH,MAAM,EAAE,qCAAqC,QAAQ,EAAE;wBACvD,MAAM,EAAE,YAAY,CAAC,KAAK;qBAC7B,CAAC;gBACN,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO;oBACH,MAAM,EAAE,qCAAqC,QAAQ,EAAE;oBACvD,MAAM,EAAE,YAAY,CAAC,KAAK;iBAC7B,CAAC;YACN,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB;YAAE,OAAO;QAC5C,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAC/B,wEAAwE;YACxE,uEAAuE;YACvE,gBAAgB;YAChB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
@@ -55,6 +55,15 @@ export declare class Workspace {
55
55
  * Returns the list of directory names to skip when walking (e.g. `node_modules`, `.git`).
56
56
  */
57
57
  get skipDirs(): string[];
58
+ /**
59
+ * Returns a diagnostic hint when a path fails access checks due to
60
+ * possible confusion between workspace root and filesystem root.
61
+ *
62
+ * @param raw - The raw user-supplied path string.
63
+ * @param resolved - The resolved absolute path.
64
+ * @returns A hint string (empty if no hint applies).
65
+ */
66
+ pathHint(raw: string, resolved: string): string;
58
67
  /** Whether symlink resolution is enabled for access checks. */
59
68
  get resolveSymlinks(): boolean;
60
69
  private resolvePath;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAarD;;;;;;GAMG;AACH,qBAAa,SAAS;IAClB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,KAAK,CAAQ;IAErB;;;OAGG;gBACS,MAAM,EAAE,sBAAsB;IAoB1C;;;;;OAKG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIhC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAWjC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQlC;;OAEG;IACH,WAAW,IAAI;QAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;IAIzD;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED,+DAA+D;IAC/D,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,OAAO,CAAC,WAAW;IAUnB;;;;;;;;OAQG;IACI,IAAI,CACP,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAClD,cAAc,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAqB5E"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAarD;;;;;;GAMG;AACH,qBAAa,SAAS;IAClB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,KAAK,CAAQ;IAErB;;;OAGG;gBACS,MAAM,EAAE,sBAAsB;IAoB1C;;;;;OAKG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIhC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAWjC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQlC;;OAEG;IACH,WAAW,IAAI;QAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;IAIzD;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO/C,+DAA+D;IAC/D,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,OAAO,CAAC,WAAW;IAUnB;;;;;;;;OAQG;IACI,IAAI,CACP,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAClD,cAAc,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAqB5E"}
@@ -115,6 +115,20 @@ export class Workspace {
115
115
  get skipDirs() {
116
116
  return this.cfg.skipDirs;
117
117
  }
118
+ /**
119
+ * Returns a diagnostic hint when a path fails access checks due to
120
+ * possible confusion between workspace root and filesystem root.
121
+ *
122
+ * @param raw - The raw user-supplied path string.
123
+ * @param resolved - The resolved absolute path.
124
+ * @returns A hint string (empty if no hint applies).
125
+ */
126
+ pathHint(raw, resolved) {
127
+ if (raw.startsWith('/') && !this.canRead(resolved)) {
128
+ return ' (Tip: paths starting with "/" resolve to filesystem root; use "." or a relative path for workspace root)';
129
+ }
130
+ return '';
131
+ }
118
132
  /** Whether symlink resolution is enabled for access checks. */
119
133
  get resolveSymlinks() {
120
134
  return this.cfg.resolveSymlinks;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { ToolPackage } from '@johannes.latzel/llm-chat';
2
+ import { Workspace } from '../lib/workspace.js';
3
+ import { SearchConfiguration, FileConfiguration } from '../lib/config.js';
4
+ import { FilePool } from '../lib/file-pool.js';
5
+ /**
6
+ * Aggregates all filesystem tools into a single {@link ToolPackage} for use with
7
+ * an LLM chat agent.
8
+ *
9
+ * Provides tools for reading, writing, searching, listing, creating, deleting,
10
+ * and moving files and directories within a configured workspace.
11
+ */
12
+ export declare class FileToolPackage extends ToolPackage {
13
+ private fileConfig;
14
+ /**
15
+ * @param workspace - The workspace for path resolution and access checks.
16
+ * @param searchConfig - Configuration for search limits.
17
+ * @param fileConfig - Configuration for file size, character limits, and
18
+ * the read-before-write policy.
19
+ * @param filePool - Optional pool for enforcing read-before-write checks.
20
+ * Created from {@link fileConfig} if not provided.
21
+ */
22
+ constructor(workspace: Workspace, searchConfig?: SearchConfiguration, fileConfig?: FileConfiguration, filePool?: FilePool);
23
+ /**
24
+ * Returns a tutorial string that describes the available filesystem tools,
25
+ * path resolution rules, and (when enabled) the read-before-write policy.
26
+ */
27
+ tutorial(): string | null;
28
+ }
29
+ //# sourceMappingURL=tool-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-package.d.ts","sourceRoot":"","sources":["../../src/packages/tool-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAe/C;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC5C,OAAO,CAAC,UAAU,CAAoB;IAEtC;;;;;;;OAOG;gBAEC,SAAS,EAAE,SAAS,EACpB,YAAY,CAAC,EAAE,mBAAmB,EAClC,UAAU,CAAC,EAAE,iBAAiB,EAC9B,QAAQ,CAAC,EAAE,QAAQ;IAsBvB;;;OAGG;IACH,QAAQ,IAAI,MAAM,GAAG,IAAI;CA0C5B"}
@@ -0,0 +1,83 @@
1
+ import { ToolPackage } from '@johannes.latzel/llm-chat';
2
+ import { FileConfiguration } from '../lib/config.js';
3
+ import { FilePool } from '../lib/file-pool.js';
4
+ import { ReadFileTool } from '../tools/read-file.js';
5
+ import { WriteFileTool } from '../tools/write-file.js';
6
+ import { SearchEntriesTool } from '../tools/search.js';
7
+ import { ListDirectoryTool } from '../tools/list-directory.js';
8
+ import { CreateFolderTool } from '../tools/create-folder.js';
9
+ import { DeleteFileTool } from '../tools/delete-file.js';
10
+ import { MoveFileTool } from '../tools/move-file.js';
11
+ import { SwitchWorkspaceTool } from '../tools/switch-workspace.js';
12
+ import { FileAccessInfoTool } from '../tools/file-access-info.js';
13
+ import { EntryInfoTool } from '../tools/entry-info.js';
14
+ import { ReplaceFileLinesTool } from '../tools/replace-file-lines.js';
15
+ import { InsertFileContentTool } from '../tools/insert-file-content.js';
16
+ import { ReplaceFileContentTool } from '../tools/replace-file-content.js';
17
+ /**
18
+ * Aggregates all filesystem tools into a single {@link ToolPackage} for use with
19
+ * an LLM chat agent.
20
+ *
21
+ * Provides tools for reading, writing, searching, listing, creating, deleting,
22
+ * and moving files and directories within a configured workspace.
23
+ */
24
+ export class FileToolPackage extends ToolPackage {
25
+ fileConfig;
26
+ /**
27
+ * @param workspace - The workspace for path resolution and access checks.
28
+ * @param searchConfig - Configuration for search limits.
29
+ * @param fileConfig - Configuration for file size, character limits, and
30
+ * the read-before-write policy.
31
+ * @param filePool - Optional pool for enforcing read-before-write checks.
32
+ * Created from {@link fileConfig} if not provided.
33
+ */
34
+ constructor(workspace, searchConfig, fileConfig, filePool) {
35
+ const safeConfig = fileConfig ?? new FileConfiguration();
36
+ filePool ??= new FilePool(safeConfig);
37
+ super([
38
+ new SearchEntriesTool(workspace, searchConfig, fileConfig),
39
+ new ListDirectoryTool(workspace, searchConfig),
40
+ new ReadFileTool(workspace, safeConfig, filePool),
41
+ new WriteFileTool(workspace, safeConfig, filePool),
42
+ new ReplaceFileLinesTool(workspace, safeConfig, filePool),
43
+ new InsertFileContentTool(workspace, safeConfig, filePool),
44
+ new ReplaceFileContentTool(workspace, safeConfig, filePool),
45
+ new EntryInfoTool(workspace),
46
+ new DeleteFileTool(workspace),
47
+ new CreateFolderTool(workspace),
48
+ new MoveFileTool(workspace),
49
+ new FileAccessInfoTool(workspace),
50
+ new SwitchWorkspaceTool(workspace)
51
+ ]);
52
+ this.fileConfig = safeConfig;
53
+ }
54
+ /**
55
+ * Returns a tutorial string that describes the available filesystem tools,
56
+ * path resolution rules, and (when enabled) the read-before-write policy.
57
+ */
58
+ tutorial() {
59
+ const lines = [
60
+ 'Filesystem tools for reading, writing, searching, and managing files and directories.',
61
+ '',
62
+ 'Path resolution:',
63
+ ' - Relative paths (e.g. ".", "src/index.ts") resolve against the current workspace root.',
64
+ ' - Absolute paths starting with "/" refer to the filesystem root, not workspace root.',
65
+ ' - Use "." for the workspace root itself.',
66
+ ' - Call file_access_info first to see which directories are accessible.',
67
+ '',
68
+ 'Writing vs editing:',
69
+ ' - write_file: Creates a new file or replaces the entire content of an existing file.',
70
+ ' - replace_file_lines: Replaces a specific range of lines (partial edit).',
71
+ ' - insert_file_content: Inserts new lines at a specific position without deletion.',
72
+ ' - replace_file_content: Find-and-replace an exact substring.',
73
+ ' - The three edit tools require the file to already exist; write_file can also create new files.',
74
+ ''
75
+ ];
76
+ if (this.fileConfig.requireReadBeforeWrite) {
77
+ lines.push('Read before write:', ' - Files must be read with read_file before they can be modified.', ' - A write also counts as a read, so read -> write -> write is allowed.', ' - This ensures the current file content is known before edits are applied.', '');
78
+ }
79
+ lines.push('Reading:', ' - read_file: Reads the full content of one or more files.', ' - read_file with start_line/end_line: Reads a specific range of lines only.', '', 'Tips:', ' - Start by listing the workspace root (list_directory with path ".") to explore.', ' - Use search_entries with name_pattern or content_pattern to find files.', ' - Directories are suffixed with "/" in listings and search results.');
80
+ return lines.join('\n');
81
+ }
82
+ }
83
+ //# sourceMappingURL=tool-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-package.js","sourceRoot":"","sources":["../../src/packages/tool-package.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,6 @@ export declare class CreateFolderTool extends Tool {
8
8
  */
9
9
  constructor(workspace: Workspace);
10
10
  protected onExecute(args: Record<string, unknown>): Promise<PartialToolResult>;
11
+ private createSingle;
11
12
  }
12
13
  //# sourceMappingURL=create-folder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-folder.d.ts","sourceRoot":"","sources":["../../src/tools/create-folder.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAEjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,8EAA8E;AAC9E,qBAAa,gBAAiB,SAAQ,IAAI;IACtC,OAAO,CAAC,EAAE,CAAY;IAEtB;;OAEG;gBACS,SAAS,EAAE,SAAS;cAchB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuBvF"}
1
+ {"version":3,"file":"create-folder.d.ts","sourceRoot":"","sources":["../../src/tools/create-folder.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAIjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,8EAA8E;AAC9E,qBAAa,gBAAiB,SAAQ,IAAI;IACtC,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,YAAY;CAsB7B"}
@@ -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
  /** Tool that creates directories within the allowed workspace directories. */
4
4
  export class CreateFolderTool extends Tool {
@@ -7,20 +7,29 @@ export class CreateFolderTool extends Tool {
7
7
  * @param workspace - Workspace instance for path resolution and access control.
8
8
  */
9
9
  constructor(workspace) {
10
- super('create_folder', 'Creates a directory and any necessary parent directories.', new ToolParameters({
11
- path: new ToolParameterProperty('Directory path')
12
- }, ['path']));
10
+ super('create_folder', 'Creates directories and any necessary parent directories. Paths can be absolute or relative to workspace root.', new ToolParameters({
11
+ paths: new ToolParameterProperty('Array of directory paths to create', PropertyType.Array)
12
+ }, ['paths']));
13
13
  this.ws = workspace;
14
14
  }
15
15
  async onExecute(args) {
16
- const raw = args.path;
16
+ const rawPaths = args.paths;
17
+ if (!Array.isArray(rawPaths)) {
18
+ return { result: '"paths" must be an array of strings', status: ResultStatus.Error };
19
+ }
20
+ if (rawPaths.length === 0) {
21
+ return { result: '"paths" must be a non-empty array', status: ResultStatus.Error };
22
+ }
23
+ return await ResultBuilder.resolveAll(rawPaths.map((p) => this.createSingle(p)));
24
+ }
25
+ async createSingle(raw) {
17
26
  if (typeof raw !== 'string' || !raw.trim()) {
18
- return { result: 'Invalid or inaccessible path', status: ResultStatus.Error };
27
+ return { result: 'Path must be a non-empty string', status: ResultStatus.Error };
19
28
  }
20
29
  const resolved = this.ws.normalize(raw.trim());
21
30
  if (!this.ws.canWrite(resolved)) {
22
31
  return {
23
- result: 'Invalid or inaccessible path (must be within writable directory)',
32
+ result: `Invalid or inaccessible path (must be within writable directory)${this.ws.pathHint(raw, resolved)}`,
24
33
  status: ResultStatus.Error
25
34
  };
26
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-folder.js","sourceRoot":"","sources":["../../src/tools/create-folder.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,8EAA8E;AAC9E,MAAM,OAAO,gBAAiB,SAAQ,IAAI;IAC9B,EAAE,CAAY;IAEtB;;OAEG;IACH,YAAY,SAAoB;QAC5B,KAAK,CACD,eAAe,EACf,2DAA2D,EAC3D,IAAI,cAAc,CACd;YACI,IAAI,EAAE,IAAI,qBAAqB,CAAC,gBAAgB,CAAC;SACpD,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,CAAC;YACD,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,sBAAsB,QAAQ,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;QACvF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO;gBACH,MAAM,EAAE,6BAA8B,CAAW,CAAC,OAAO,EAAE;gBAC3D,MAAM,EAAE,YAAY,CAAC,KAAK;aAC7B,CAAC;QACN,CAAC;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"create-folder.js","sourceRoot":"","sources":["../../src/tools/create-folder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,IAAI,EACJ,qBAAqB,EACrB,cAAc,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAGxC,8EAA8E;AAC9E,MAAM,OAAO,gBAAiB,SAAQ,IAAI;IAC9B,EAAE,CAAY;IAEtB;;OAEG;IACH,YAAY,SAAoB;QAC5B,KAAK,CACD,eAAe,EACf,gHAAgH,EAChH,IAAI,cAAc,CACd;YACI,KAAK,EAAE,IAAI,qBAAqB,CAC5B,oCAAoC,EACpC,YAAY,CAAC,KAAK,CACrB;SACJ,EACD,CAAC,OAAO,CAAC,CACZ,CACJ,CAAC;QACF,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;IACxB,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,IAA6B;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,qCAAqC,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QACzF,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,mCAAmC,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QACvF,CAAC;QAED,OAAO,MAAM,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAY;QACnC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,OAAO,EAAE,MAAM,EAAE,iCAAiC,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QACrF,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,mEAAmE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE;gBAC5G,MAAM,EAAE,YAAY,CAAC,KAAK;aAC7B,CAAC;QACN,CAAC;QAED,IAAI,CAAC;YACD,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,sBAAsB,QAAQ,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;QACvF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO;gBACH,MAAM,EAAE,6BAA8B,CAAW,CAAC,OAAO,EAAE;gBAC3D,MAAM,EAAE,YAAY,CAAC,KAAK;aAC7B,CAAC;QACN,CAAC;IACL,CAAC;CACJ"}
@@ -8,5 +8,6 @@ export declare class DeleteFileTool extends Tool {
8
8
  */
9
9
  constructor(workspace: Workspace);
10
10
  protected onExecute(args: Record<string, unknown>): Promise<PartialToolResult>;
11
+ private deleteSingle;
11
12
  }
12
13
  //# sourceMappingURL=delete-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-file.d.ts","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAEjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,wFAAwF;AACxF,qBAAa,cAAe,SAAQ,IAAI;IACpC,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;CAqCvF"}
1
+ {"version":3,"file":"delete-file.d.ts","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAIjB,IAAI,EAGP,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,wFAAwF;AACxF,qBAAa,cAAe,SAAQ,IAAI;IACpC,OAAO,CAAC,EAAE,CAAY;IAEtB;;OAEG;gBACS,SAAS,EAAE,SAAS;cAoBhB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAatE,YAAY;CAkC7B"}
@@ -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
  /** Tool that deletes files and directories within the allowed workspace directories. */
4
4
  export class DeleteFileTool extends Tool {
@@ -7,21 +7,31 @@ export class DeleteFileTool extends Tool {
7
7
  * @param workspace - Workspace instance for path resolution and access control.
8
8
  */
9
9
  constructor(workspace) {
10
- super('delete_file', 'Deletes a file or empty directory. Use recursive=true to delete non-empty directories and their contents.', new ToolParameters({
11
- path: new ToolParameterProperty('File or directory path'),
10
+ super('delete_file', 'Deletes files or empty directories. Use recursive=true to delete non-empty directories and their contents. Paths can be absolute or relative to workspace root.', new ToolParameters({
11
+ paths: new ToolParameterProperty('Array of file or directory paths to delete', PropertyType.Array),
12
12
  recursive: new ToolParameterProperty('Delete directories and their contents recursively')
13
- }, ['path']));
13
+ }, ['paths']));
14
14
  this.ws = workspace;
15
15
  }
16
16
  async onExecute(args) {
17
- const raw = args.path;
17
+ const rawPaths = args.paths;
18
+ if (!Array.isArray(rawPaths)) {
19
+ return { result: '"paths" must be an array of strings', status: ResultStatus.Error };
20
+ }
21
+ if (rawPaths.length === 0) {
22
+ return { result: '"paths" must be a non-empty array', status: ResultStatus.Error };
23
+ }
24
+ const recursive = args.recursive === true;
25
+ return await ResultBuilder.resolveAll(rawPaths.map((p) => this.deleteSingle(p, recursive)));
26
+ }
27
+ async deleteSingle(raw, recursive) {
18
28
  if (typeof raw !== 'string' || !raw.trim()) {
19
- return { result: 'Invalid or inaccessible path', status: ResultStatus.Error };
29
+ return { result: 'Path must be a non-empty string', status: ResultStatus.Error };
20
30
  }
21
31
  const resolved = this.ws.normalize(raw.trim());
22
32
  if (!this.ws.canWrite(resolved)) {
23
33
  return {
24
- result: 'Invalid or inaccessible path (must be within writable directory)',
34
+ result: `Invalid or inaccessible path (must be within writable directory)${this.ws.pathHint(raw, resolved)}`,
25
35
  status: ResultStatus.Error
26
36
  };
27
37
  }
@@ -33,7 +43,6 @@ export class DeleteFileTool extends Tool {
33
43
  return { result: 'Path does not exist', status: ResultStatus.Error };
34
44
  }
35
45
  const label = stat.isDirectory() ? 'directory' : 'file';
36
- const recursive = args.recursive === true;
37
46
  try {
38
47
  if (stat.isDirectory() && !recursive) {
39
48
  await fsp.rmdir(resolved);