@kenkaiiii/ggcoder 4.3.175 → 4.3.177

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,17 @@
1
1
  import path from "node:path";
2
2
  import { z } from "zod";
3
3
  import { resolvePath, rejectSymlink } from "./path-utils.js";
4
- import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet } from "./edit-diff.js";
4
+ import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet, findOccurrenceLines, stripLeadingBlankLine, applyDotdotdots, applyMissingLeadingWhitespace, } from "./edit-diff.js";
5
5
  import { localOperations } from "./operations.js";
6
6
  import { assertFresh, recordWrite } from "./read-tracker.js";
7
7
  const EditItem = z.object({
8
8
  old_text: z.string().describe("The exact text to find and replace"),
9
9
  new_text: z.string().describe("The replacement text"),
10
+ replace_all: z
11
+ .boolean()
12
+ .optional()
13
+ .describe("Replace every occurrence of old_text instead of requiring a unique match. " +
14
+ "Use for renames or repeated tokens. Defaults to false."),
10
15
  });
11
16
  // Some models (Opus 4.6, GLM-5.1) occasionally send `edits` as a JSON string
12
17
  // instead of a real array, which trips Zod and makes the model fall back to
@@ -26,19 +31,44 @@ const EditParams = z.object({
26
31
  file_path: z.string().describe("The file path to edit"),
27
32
  edits: z
28
33
  .preprocess(coerceStringifiedEdits, z.array(EditItem).min(1))
29
- .describe("One or more edits applied in order. Each edit operates on the result of the previous one. " +
30
- "Every old_text must uniquely match exactly one location in the file at the time it is applied."),
34
+ .describe("One or more edits applied in order. Each edit operates on the result of the previous one."),
35
+ atomic: z
36
+ .boolean()
37
+ .optional()
38
+ .describe("If true, fail the whole batch when any edit fails — no changes written. " +
39
+ "Default false: partial-apply, keep every successful edit and report failures " +
40
+ "for retry. Use atomic only when later edits depend on earlier ones in a way " +
41
+ "where a half-applied state would be worse than nothing."),
31
42
  });
43
+ function tryMatch(working, old, next, replaceAll) {
44
+ if (old.length === 0)
45
+ return { ok: false, reason: "not_found" };
46
+ if (replaceAll && working.includes(old)) {
47
+ return { ok: true, newWorking: working.split(old).join(next) };
48
+ }
49
+ const occurrences = countOccurrences(working, old);
50
+ if (occurrences === 0)
51
+ return { ok: false, reason: "not_found" };
52
+ if (occurrences > 1)
53
+ return { ok: false, reason: "ambiguous", occurrences };
54
+ const match = fuzzyFindText(working, old);
55
+ if (!match.found)
56
+ return { ok: false, reason: "not_found" };
57
+ return {
58
+ ok: true,
59
+ newWorking: working.slice(0, match.index) + next + working.slice(match.index + match.matchLength),
60
+ };
61
+ }
32
62
  export function createEditTool(cwd, readFiles, ops = localOperations, planModeRef) {
33
63
  return {
34
64
  name: "edit",
35
- description: "Replace one or more text strings in a file. The file must be read first before editing. " +
36
- "Pass `edits` as an array of { old_text, new_text } pairs; edits are applied sequentially " +
37
- "so each subsequent match runs against the result of the prior edits. " +
38
- "Every old_text must uniquely match exactly one location in the file when applied. " +
39
- "Returns a unified diff of the combined change.",
65
+ description: "Replace text in a file via { old_text, new_text } edits applied sequentially. Read the file first. " +
66
+ "Each old_text must uniquely match exactly one location set replace_all: true to swap every occurrence (renames). " +
67
+ "For long blocks, a line containing only `...` in BOTH old_text and new_text elides a middle preserved verbatim. " +
68
+ "Partial-apply by default: failed edits are listed for retry, successful ones are still written — " +
69
+ "re-issue ONLY the listed failures, not the whole batch. Returns a unified diff.",
40
70
  parameters: EditParams,
41
- async execute({ file_path, edits }) {
71
+ async execute({ file_path, edits, atomic = false }) {
42
72
  if (planModeRef?.current) {
43
73
  return "Error: edit is restricted in plan mode. Use read-only tools to explore the codebase, then write your plan to .gg/plans/.";
44
74
  }
@@ -50,55 +80,148 @@ export function createEditTool(cwd, readFiles, ops = localOperations, planModeRe
50
80
  const originalNormalized = hasCRLF ? original.replace(/\r\n/g, "\n") : original;
51
81
  let working = originalNormalized;
52
82
  const fileName = path.basename(resolved);
53
- const errors = [];
83
+ const outcomes = new Array(edits.length);
54
84
  for (let i = 0; i < edits.length; i++) {
55
- const { old_text, new_text } = edits[i];
85
+ const { old_text, new_text, replace_all } = edits[i];
56
86
  const normalizedOld = hasCRLF ? old_text.replace(/\r\n/g, "\n") : old_text;
57
87
  const normalizedNew = hasCRLF ? new_text.replace(/\r\n/g, "\n") : new_text;
58
- const label = edits.length > 1 ? ` (edit ${i + 1}/${edits.length})` : "";
59
- const occurrences = countOccurrences(working, normalizedOld);
60
- if (occurrences === 0) {
61
- const hint = findClosestSnippet(working, normalizedOld);
62
- const hintLine = hint ? `\nClosest match in file:\n${hint}` : "";
63
- errors.push(`old_text not found in ${fileName}${label}. ` +
64
- "Text must match verbatim — do not paraphrase. Re-read the file if unsure." +
65
- hintLine);
88
+ const replaceAll = replace_all ?? false;
89
+ // Reject no-op edits before they consume a write or silently "succeed"
90
+ // usually the model paraphrased the new_text to be identical to old.
91
+ if (normalizedOld === normalizedNew) {
92
+ outcomes[i] = { ok: false, failure: { reason: "noop" } };
66
93
  continue;
67
94
  }
68
- if (occurrences > 1) {
69
- errors.push(`old_text found ${occurrences} times in ${fileName}${label}. ` +
70
- "Include more surrounding context to make the match unique.");
71
- continue;
95
+ // Aider's full fallback ladder, run only when the primary match
96
+ // returns "not_found". Ambiguous matches deliberately don't fall
97
+ // through the model needs to add context, not paraphrase further.
98
+ // Order mirrors aider/coders/editblock_coder.py:
99
+ // 1. exact + smart-quote/dash fuzzy (in tryMatch)
100
+ // 2. indent-flex (model omitted/shortened leading whitespace)
101
+ // 3. drop leading blank line, retry 1+2
102
+ // 4. dotdotdots (`...` elision with preserved middle)
103
+ let result = tryMatch(working, normalizedOld, normalizedNew, replaceAll);
104
+ const tryFallbacks = (oldText) => {
105
+ const flexed = applyMissingLeadingWhitespace(working, oldText, normalizedNew);
106
+ if (flexed !== null)
107
+ return flexed;
108
+ // Re-run primary matcher on the stripped variant as a cheap retry.
109
+ const exact = tryMatch(working, oldText, normalizedNew, replaceAll);
110
+ if (exact.ok)
111
+ return exact.newWorking;
112
+ return null;
113
+ };
114
+ if (!result.ok && result.reason === "not_found") {
115
+ const indentFlexed = applyMissingLeadingWhitespace(working, normalizedOld, normalizedNew);
116
+ if (indentFlexed !== null) {
117
+ result = { ok: true, newWorking: indentFlexed };
118
+ }
119
+ }
120
+ if (!result.ok && result.reason === "not_found") {
121
+ const stripped = stripLeadingBlankLine(normalizedOld);
122
+ if (stripped !== null) {
123
+ const candidate = tryFallbacks(stripped);
124
+ if (candidate !== null)
125
+ result = { ok: true, newWorking: candidate };
126
+ }
72
127
  }
73
- const match = fuzzyFindText(working, normalizedOld);
74
- if (!match.found) {
75
- errors.push(`old_text not found in ${fileName}${label}.`);
128
+ if (!result.ok && result.reason === "not_found") {
129
+ const elided = applyDotdotdots(working, normalizedOld, normalizedNew);
130
+ if (elided !== null)
131
+ result = { ok: true, newWorking: elided };
132
+ }
133
+ if (result.ok) {
134
+ working = result.newWorking;
135
+ outcomes[i] = { ok: true };
76
136
  continue;
77
137
  }
78
- working =
79
- working.slice(0, match.index) +
80
- normalizedNew +
81
- working.slice(match.index + match.matchLength);
138
+ if (result.reason === "not_found") {
139
+ // Capture the closest-match snippet eagerly against the current
140
+ // working buffer; we'll decide whether to render it post-loop based
141
+ // on whether other edits in this batch succeeded.
142
+ outcomes[i] = {
143
+ ok: false,
144
+ failure: {
145
+ reason: "not_found",
146
+ closestSnippet: findClosestSnippet(working, normalizedOld),
147
+ },
148
+ };
149
+ }
150
+ else {
151
+ const occurrences = result.occurrences ?? 0;
152
+ const matches = findOccurrenceLines(working, normalizedOld);
153
+ const matchLines = matches.map((m) => ` line ${m.line}: ${m.preview}`).join("\n");
154
+ const more = occurrences > matches.length ? `\n …and ${occurrences - matches.length} more` : "";
155
+ outcomes[i] = {
156
+ ok: false,
157
+ failure: { reason: "ambiguous", occurrences, matchLines, more },
158
+ };
159
+ }
82
160
  }
83
- if (errors.length > 0) {
84
- const header = errors.length === 1
85
- ? errors[0]
86
- : `${errors.length} of ${edits.length} edits failed; no changes written.\n\n` +
87
- errors.map((e, i) => `[${i + 1}] ${e}`).join("\n\n");
88
- throw new Error(header);
161
+ const failures = outcomes
162
+ .map((o, i) => (o.ok || !o.failure ? null : { index: i, failure: o.failure }))
163
+ .filter((x) => x !== null);
164
+ const successCount = outcomes.length - failures.length;
165
+ // Closest-match snippets only get suppressed when successes will ACTUALLY
166
+ // be persisted (partial-apply with at least one win). In atomic mode we
167
+ // throw before writing, so the model retries against an unchanged file
168
+ // and the snippet is its only guidance — keep it.
169
+ const willPersistSuccesses = successCount > 0 && !atomic;
170
+ const formatFailureMessage = (f) => {
171
+ if (f.reason === "noop") {
172
+ return `old_text and new_text are identical in ${fileName} — this edit would be a no-op. Either fix new_text or drop this edit.`;
173
+ }
174
+ if (f.reason === "ambiguous") {
175
+ return (`old_text found ${f.occurrences} times in ${fileName}. ` +
176
+ "Include more surrounding context to make the match unique, " +
177
+ "or set replace_all: true to swap every occurrence.\n" +
178
+ "Matches at:\n" +
179
+ f.matchLines +
180
+ f.more);
181
+ }
182
+ const base = `old_text not found in ${fileName}. ` +
183
+ "Text must match verbatim — do not paraphrase. Re-read the file if unsure.";
184
+ if (willPersistSuccesses || !f.closestSnippet)
185
+ return base;
186
+ return `${base}\nClosest match in file:\n${f.closestSnippet}`;
187
+ };
188
+ const formatFailures = () => {
189
+ if (failures.length === 1 && edits.length === 1) {
190
+ return formatFailureMessage(failures[0].failure);
191
+ }
192
+ return failures
193
+ .map((f) => `[edit ${f.index + 1}/${edits.length}] ${formatFailureMessage(f.failure)}`)
194
+ .join("\n\n");
195
+ };
196
+ // Atomic-mode failure, OR partial-mode failure where literally nothing
197
+ // succeeded. Either way nothing should be written and we throw to make
198
+ // the model retry the whole batch.
199
+ if (failures.length > 0 && (atomic || successCount === 0)) {
200
+ const header = atomic && failures.length > 0
201
+ ? `${failures.length} of ${edits.length} edit${edits.length === 1 ? "" : "s"} failed; no changes written (atomic).\n\n`
202
+ : edits.length > 1
203
+ ? `${failures.length} of ${edits.length} edits failed; no changes written.\n\n`
204
+ : "";
205
+ throw new Error(header + formatFailures());
89
206
  }
90
207
  const finalContent = hasCRLF ? working.replace(/\n/g, "\r\n") : working;
91
208
  await ops.writeFile(resolved, finalContent);
92
209
  await recordWrite(readFiles, resolved, finalContent, ops);
93
210
  const relPath = path.relative(cwd, resolved);
94
211
  const diff = generateDiff(originalNormalized, working, relPath);
95
- const summary = edits.length > 1
96
- ? `Successfully applied ${edits.length} edits to ${relPath}.`
97
- : `Successfully replaced text in ${relPath}.`;
98
- return {
99
- content: summary,
100
- details: { diff },
101
- };
212
+ if (failures.length === 0) {
213
+ const summary = edits.length > 1
214
+ ? `Successfully applied ${edits.length} edits to ${relPath}.`
215
+ : `Successfully replaced text in ${relPath}.`;
216
+ return { content: summary, details: { diff } };
217
+ }
218
+ // Partial success — the loud header is deliberate: the model has to know
219
+ // that work was saved AND that only the listed edits need to be retried.
220
+ const noun = failures.length === 1 ? "edit" : "edits";
221
+ const content = `Applied ${successCount} of ${edits.length} edits to ${relPath}.\n` +
222
+ `${failures.length} ${noun} skipped — re-issue ONLY these (the rest are already done, do not redo them):\n\n` +
223
+ formatFailures();
224
+ return { content, details: { diff } };
102
225
  },
103
226
  };
104
227
  }
@@ -1 +1 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}