( filePath: string, currentContent: string, originalParams: EditToolParams, // This is the EditToolParams from edit.ts, without \'corrected\' client: AnusClient, abortSignal: AbortSignal, )
| 156 | * EditToolParams (as CorrectedEditParams) and the final occurrences count. |
| 157 | */ |
| 158 | export async function ensureCorrectEdit( |
| 159 | filePath: string, |
| 160 | currentContent: string, |
| 161 | originalParams: EditToolParams, // This is the EditToolParams from edit.ts, without \'corrected\' |
| 162 | client: AnusClient, |
| 163 | abortSignal: AbortSignal, |
| 164 | ): Promise<CorrectedEditResult> { |
| 165 | const cacheKey = `${currentContent}---${originalParams.old_string}---${originalParams.new_string}`; |
| 166 | const cachedResult = editCorrectionCache.get(cacheKey); |
| 167 | if (cachedResult) { |
| 168 | return cachedResult; |
| 169 | } |
| 170 | |
| 171 | let finalNewString = originalParams.new_string; |
| 172 | const newStringPotentiallyEscaped = |
| 173 | unescapeStringForAnusBug(originalParams.new_string) !== |
| 174 | originalParams.new_string; |
| 175 | |
| 176 | const expectedReplacements = originalParams.expected_replacements ?? 1; |
| 177 | |
| 178 | let finalOldString = originalParams.old_string; |
| 179 | let occurrences = countOccurrences(currentContent, finalOldString); |
| 180 | |
| 181 | if (occurrences === expectedReplacements) { |
| 182 | if (newStringPotentiallyEscaped) { |
| 183 | finalNewString = await correctNewStringEscaping( |
| 184 | client, |
| 185 | finalOldString, |
| 186 | originalParams.new_string, |
| 187 | abortSignal, |
| 188 | ); |
| 189 | } |
| 190 | } else if (occurrences > expectedReplacements) { |
| 191 | const expectedReplacements = originalParams.expected_replacements ?? 1; |
| 192 | |
| 193 | // If user expects multiple replacements, return as-is |
| 194 | if (occurrences === expectedReplacements) { |
| 195 | const result: CorrectedEditResult = { |
| 196 | params: { ...originalParams }, |
| 197 | occurrences, |
| 198 | }; |
| 199 | editCorrectionCache.set(cacheKey, result); |
| 200 | return result; |
| 201 | } |
| 202 | |
| 203 | // If user expects 1 but found multiple, try to correct (existing behavior) |
| 204 | if (expectedReplacements === 1) { |
| 205 | const result: CorrectedEditResult = { |
| 206 | params: { ...originalParams }, |
| 207 | occurrences, |
| 208 | }; |
| 209 | editCorrectionCache.set(cacheKey, result); |
| 210 | return result; |
| 211 | } |
| 212 | |
| 213 | // If occurrences don't match expected, return as-is (will fail validation later) |
| 214 | const result: CorrectedEditResult = { |
| 215 | params: { ...originalParams }, |
no test coverage detected