summaryrefslogtreecommitdiff
path: root/packages/core/src/tools/write-file.ts
diff options
context:
space:
mode:
authorAkhil Appana <[email protected]>2025-08-08 04:33:42 -0700
committerGitHub <[email protected]>2025-08-08 11:33:42 +0000
commitf5e0f16157da6a0b0dbae3b4ebf920fdee81c461 (patch)
treee8f91ee92d41a5ac7280b2bad7e8cba103bc1ca7 /packages/core/src/tools/write-file.ts
parent5ab184fcaf40d4e7dec9ba6a0526cac39b602ee2 (diff)
fix: properly report tool errors in telemetry (#5688)
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Diffstat (limited to 'packages/core/src/tools/write-file.ts')
-rw-r--r--packages/core/src/tools/write-file.ts58
1 files changed, 51 insertions, 7 deletions
diff --git a/packages/core/src/tools/write-file.ts b/packages/core/src/tools/write-file.ts
index 4a9f8d35..b018d653 100644
--- a/packages/core/src/tools/write-file.ts
+++ b/packages/core/src/tools/write-file.ts
@@ -17,6 +17,7 @@ import {
ToolCallConfirmationDetails,
Icon,
} from './tools.js';
+import { ToolErrorType } from './tool-error.js';
import { Type } from '@google/genai';
import { SchemaValidator } from '../utils/schemaValidator.js';
import { makeRelative, shortenPath } from '../utils/paths.js';
@@ -230,8 +231,12 @@ export class WriteFileTool
const validationError = this.validateToolParams(params);
if (validationError) {
return {
- llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
- returnDisplay: `Error: ${validationError}`,
+ llmContent: `Could not write file due to invalid parameters: ${validationError}`,
+ returnDisplay: validationError,
+ error: {
+ message: validationError,
+ type: ToolErrorType.INVALID_TOOL_PARAMS,
+ },
};
}
@@ -243,10 +248,16 @@ export class WriteFileTool
if (correctedContentResult.error) {
const errDetails = correctedContentResult.error;
- const errorMsg = `Error checking existing file: ${errDetails.message}`;
+ const errorMsg = errDetails.code
+ ? `Error checking existing file '${params.file_path}': ${errDetails.message} (${errDetails.code})`
+ : `Error checking existing file: ${errDetails.message}`;
return {
- llmContent: `Error checking existing file ${params.file_path}: ${errDetails.message}`,
+ llmContent: errorMsg,
returnDisplay: errorMsg,
+ error: {
+ message: errorMsg,
+ type: ToolErrorType.FILE_WRITE_FAILURE,
+ },
};
}
@@ -344,10 +355,43 @@ export class WriteFileTool
returnDisplay: displayResult,
};
} catch (error) {
- const errorMsg = `Error writing to file: ${error instanceof Error ? error.message : String(error)}`;
+ // Capture detailed error information for debugging
+ let errorMsg: string;
+ let errorType = ToolErrorType.FILE_WRITE_FAILURE;
+
+ if (isNodeError(error)) {
+ // Handle specific Node.js errors with their error codes
+ errorMsg = `Error writing to file '${params.file_path}': ${error.message} (${error.code})`;
+
+ // Log specific error types for better debugging
+ if (error.code === 'EACCES') {
+ errorMsg = `Permission denied writing to file: ${params.file_path} (${error.code})`;
+ errorType = ToolErrorType.PERMISSION_DENIED;
+ } else if (error.code === 'ENOSPC') {
+ errorMsg = `No space left on device: ${params.file_path} (${error.code})`;
+ errorType = ToolErrorType.NO_SPACE_LEFT;
+ } else if (error.code === 'EISDIR') {
+ errorMsg = `Target is a directory, not a file: ${params.file_path} (${error.code})`;
+ errorType = ToolErrorType.TARGET_IS_DIRECTORY;
+ }
+
+ // Include stack trace in debug mode for better troubleshooting
+ if (this.config.getDebugMode() && error.stack) {
+ console.error('Write file error stack:', error.stack);
+ }
+ } else if (error instanceof Error) {
+ errorMsg = `Error writing to file: ${error.message}`;
+ } else {
+ errorMsg = `Error writing to file: ${String(error)}`;
+ }
+
return {
- llmContent: `Error writing to file ${params.file_path}: ${errorMsg}`,
- returnDisplay: `Error: ${errorMsg}`,
+ llmContent: errorMsg,
+ returnDisplay: errorMsg,
+ error: {
+ message: errorMsg,
+ type: errorType,
+ },
};
}
}