fix(f11): address code review — insertion anchoring, turnId, accept-all coverage (#43)
Code-review follow-up on the F11 branch (5966907..1564ef5). Three real findings: - CRITICAL — pure-insertion hunks were born-orphaned. A document rewrite that INSERTS text produced a zero-width hunk (start==end) → buildFingerprint yields empty fp.text → anchorer.resolve orphans an empty needle → the proposal could never be accepted (silently). diffToHunks now anchors every zero-width insertion to an adjacent source token (anchorInsertion): the range absorbs the token and the replacement keeps it, so net text is identical but fp.text is non-empty and resolvable. New unit tests: applying hunks always reconstructs the rewrite (substitute/delete/insert/multi); insertions are never zero-width. New host E2E ACCEPTS a rewrite-with-insertion end to end and asserts accept-all reconstructs the intended document (also covers sequential multi-hunk accept). - IMPORTANT — renderPlain cross-block fidelity. The per-block off-mode rendering (SLICE-2) can't resolve a reference-link definition in a separate block. Documented as a conscious tradeoff of the operator-locked block-level mapping (§6.7) — renderReview already rendered per-block, so this keeps both modes consistent — with a characterization test + a docstring note. - MINOR — F11 proposals now carry a turnId (one per Ask-Claude gesture, shared across a document rewrite's N hunks), matching the editor-menu editSelection path so a rewrite groups as one agent turn. 208 unit + 9/9 F11 host E2E green. (The lone red E2E is a pre-existing, F11-independent undoMarks timing flake — proven by isolation: it fails identically with all F11 tests removed.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -56,6 +56,11 @@ export class TrackChangesPreviewController implements vscode.Disposable {
|
||||
const { runEditTurn } = await import("./liveTurn");
|
||||
return runEditTurn(instruction, text);
|
||||
};
|
||||
/** Monotonic per-session counter minting a stable turnId for each Ask-Claude gesture. */
|
||||
private turnSeq = 0;
|
||||
private nextTurnSeq(): number {
|
||||
return ++this.turnSeq;
|
||||
}
|
||||
|
||||
constructor(
|
||||
private readonly diffView: DiffViewController,
|
||||
@@ -219,6 +224,9 @@ export class TrackChangesPreviewController implements vscode.Disposable {
|
||||
instruction: string,
|
||||
): Promise<string[]> {
|
||||
const full = document.getText();
|
||||
// One turnId per gesture — the document case's N hunk-proposals all share it,
|
||||
// so a single rewrite groups as one agent turn (parity with editSelection).
|
||||
const turnId = `turn-${this.nextTurnSeq()}`;
|
||||
const provenance = (turn: EditTurnResult) =>
|
||||
({ kind: "agent" as const, id: "claude", agent: { sdk: "@cline/sdk", model: turn.model, sessionId: turn.sessionId } });
|
||||
if (target.kind === "range") {
|
||||
@@ -226,14 +234,14 @@ export class TrackChangesPreviewController implements vscode.Disposable {
|
||||
const turn = await this.editTurn(instruction, selected);
|
||||
if (turn.replacement === "" || turn.replacement === selected) return [];
|
||||
const fp = buildFingerprint(full, { start: target.start, end: target.end });
|
||||
const id = await this.proposals.propose(document, fp, turn.replacement, provenance(turn), { instruction });
|
||||
const id = await this.proposals.propose(document, fp, turn.replacement, provenance(turn), { turnId, instruction });
|
||||
return id ? [id] : [];
|
||||
}
|
||||
const turn = await this.editTurn(instruction, full);
|
||||
const ids: string[] = [];
|
||||
for (const h of diffToHunks(full, turn.replacement)) {
|
||||
const fp = buildFingerprint(full, { start: h.start, end: h.end });
|
||||
const id = await this.proposals.propose(document, fp, h.replacement, provenance(turn), { instruction });
|
||||
const id = await this.proposals.propose(document, fp, h.replacement, provenance(turn), { turnId, instruction });
|
||||
if (id) ids.push(id);
|
||||
}
|
||||
return ids;
|
||||
|
||||
Reference in New Issue
Block a user