@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.
- package/README.md +1 -0
- 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 -2
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
[](https://codecov.io/gh/johanneslatzel/llm-chat-file)
|
|
9
9
|
[](https://github.com/johanneslatzel/llm-chat-file/actions/workflows/ci.yml)
|
|
10
10
|
[](https://badge.socket.dev/npm/package/@johannes.latzel/llm-chat-file/latest)
|
|
11
|
+
[](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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -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) {
|
package/dist/lib/config.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/lib/workspace.d.ts
CHANGED
|
@@ -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"}
|
package/dist/lib/workspace.js
CHANGED
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-folder.d.ts","sourceRoot":"","sources":["../../src/tools/create-folder.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,
|
|
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
|
|
11
|
-
|
|
12
|
-
}, ['
|
|
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
|
|
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: '
|
|
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:
|
|
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,
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-file.d.ts","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,
|
|
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
|
|
11
|
-
|
|
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
|
-
}, ['
|
|
13
|
+
}, ['paths']));
|
|
14
14
|
this.ws = workspace;
|
|
15
15
|
}
|
|
16
16
|
async onExecute(args) {
|
|
17
|
-
const
|
|
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: '
|
|
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:
|
|
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);
|