summaryrefslogtreecommitdiff
path: root/packages/server/src/tools/write-file.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/server/src/tools/write-file.ts')
-rw-r--r--packages/server/src/tools/write-file.ts25
1 files changed, 21 insertions, 4 deletions
diff --git a/packages/server/src/tools/write-file.ts b/packages/server/src/tools/write-file.ts
index 2979ffb8..c628ce75 100644
--- a/packages/server/src/tools/write-file.ts
+++ b/packages/server/src/tools/write-file.ts
@@ -86,12 +86,29 @@ export class WriteFileTool extends BaseTool<WriteFileToolParams, ToolResult> {
) {
return 'Parameters failed schema validation.';
}
- if (!path.isAbsolute(params.file_path)) {
- return `File path must be absolute: ${params.file_path}`;
+ const filePath = params.file_path;
+ if (!path.isAbsolute(filePath)) {
+ return `File path must be absolute: ${filePath}`;
}
- if (!this.isWithinRoot(params.file_path)) {
- return `File path must be within the root directory (${this.config.getTargetDir()}): ${params.file_path}`;
+ if (!this.isWithinRoot(filePath)) {
+ return `File path must be within the root directory (${this.config.getTargetDir()}): ${filePath}`;
}
+
+ try {
+ // This check should be performed only if the path exists.
+ // If it doesn't exist, it's a new file, which is valid for writing.
+ if (fs.existsSync(filePath)) {
+ const stats = fs.lstatSync(filePath);
+ if (stats.isDirectory()) {
+ return `Path is a directory, not a file: ${filePath}`;
+ }
+ }
+ } catch (statError: unknown) {
+ // If fs.existsSync is true but lstatSync fails (e.g., permissions, race condition where file is deleted)
+ // this indicates an issue with accessing the path that should be reported.
+ return `Error accessing path properties for validation: ${filePath}. Reason: ${statError instanceof Error ? statError.message : String(statError)}`;
+ }
+
return null;
}