Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion packages/core/src/tools/edit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ interface CalculatedEdit {
occurrences: number;
error?: { display: string; raw: string; type: ToolErrorType };
isNewFile: boolean;
originalLineEnding: 'CRLF' | 'LF';
}

class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {
Expand All @@ -124,6 +125,7 @@ class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {
const finalNewString = params.new_string;
const finalOldString = params.old_string;
let occurrences = 0;
let originalLineEnding: 'CRLF' | 'LF' = 'LF';
let error:
| { display: string; raw: string; type: ToolErrorType }
| undefined = undefined;
Expand All @@ -132,6 +134,7 @@ class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {
currentContent = await this.config
.getFileSystemService()
.readTextFile(params.file_path);
originalLineEnding = currentContent.includes('\r\n') ? 'CRLF' : 'LF';
// Normalize line endings to LF for consistent processing.
currentContent = currentContent.replace(/\r\n/g, '\n');
fileExists = true;
Expand Down Expand Up @@ -217,6 +220,7 @@ class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {
occurrences,
error,
isNewFile,
originalLineEnding,
};
}

Expand Down Expand Up @@ -361,9 +365,13 @@ class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {

try {
this.ensureParentDirectoriesExist(this.params.file_path);
let contentToWrite = editData.newContent;
if (editData.originalLineEnding === 'CRLF') {
contentToWrite = contentToWrite.replace(/\n/g, '\r\n');
}
await this.config
.getFileSystemService()
.writeTextFile(this.params.file_path, editData.newContent);
.writeTextFile(this.params.file_path, contentToWrite);

let displayResult: ToolResultDisplay;
const fileName = path.basename(this.params.file_path);
Expand Down