From bc55c2d4abe19cc5bef160aa70c1760f48cd2b95 Mon Sep 17 00:00:00 2001 From: Christian Gunderman Date: Wed, 25 Feb 2026 18:06:29 -0800 Subject: [PATCH] Fixes. --- packages/core/src/tools/edit.test.ts | 3 +++ packages/core/src/tools/edit.ts | 23 +++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/core/src/tools/edit.test.ts b/packages/core/src/tools/edit.test.ts index 9821e7bc5b..29cc6fd8de 100644 --- a/packages/core/src/tools/edit.test.ts +++ b/packages/core/src/tools/edit.test.ts @@ -415,6 +415,9 @@ describe('EditTool', () => { { start: 2, end: 3 }, { start: 5, end: 6 }, ]); + expect(result.newContent).toBe( + ' line1\n replacement\n line3\n replacement\n line5', + ); }); it('should correctly calculate matchRanges for regex replacements', async () => { diff --git a/packages/core/src/tools/edit.ts b/packages/core/src/tools/edit.ts index ffb2f18646..ffefbe245e 100644 --- a/packages/core/src/tools/edit.ts +++ b/packages/core/src/tools/edit.ts @@ -229,7 +229,7 @@ async function calculateFlexibleReplacement( let flexibleOccurrences = 0; const matchRanges: Array<{ start: number; end: number }> = []; - let lineOffset = 0; + let currentOriginalLine = 1; let i = 0; while (i <= sourceLines.length - searchLinesStripped.length) { const window = sourceLines.slice(i, i + searchLinesStripped.length); @@ -241,21 +241,24 @@ async function calculateFlexibleReplacement( if (isMatch) { flexibleOccurrences++; matchRanges.push({ - start: i + 1 - lineOffset, - end: i + searchLinesStripped.length - lineOffset, + start: currentOriginalLine, + end: currentOriginalLine + searchLinesStripped.length - 1, }); const firstLineInMatch = window[0]; const indentationMatch = firstLineInMatch.match(/^([ \t]*)/); const indentation = indentationMatch ? indentationMatch[1] : ''; const newBlockWithIndent = applyIndentation(replaceLines, indentation); - sourceLines.splice( - i, - searchLinesStripped.length, - newBlockWithIndent.join('\n'), - ); - lineOffset += replaceLines.length - searchLinesStripped.length; - i += replaceLines.length; + + let replacementText = newBlockWithIndent.join('\n'); + if (window[window.length - 1].endsWith('\n')) { + replacementText += '\n'; + } + + sourceLines.splice(i, searchLinesStripped.length, replacementText); + currentOriginalLine += searchLinesStripped.length; + i++; } else { + currentOriginalLine++; i++; } }