import type { SnapshotStore } from "./snapshots.js"; import type { Edit } from "./types.js"; export interface RecoveryArgs { path: string; currentText: string; fileHash: string; edits: readonly Edit[]; } export interface RecoveryResult { /** Post-recovery text. */ text: string; /** First changed line (1-indexed) relative to the live `currentText`, or `undefined`. */ firstChangedLine: number | undefined; /** Warnings collected during recovery, including the user-facing recovery banner. */ warnings: string[]; } /** * Stateless recovery driver over a {@link SnapshotStore}. Construct once and * call {@link Recovery.tryRecover} per stale-tag incident. The default * implementation tries two strategies in order: * * 1. Apply the edits on the full-file version the tag names, then 3-way-merge * the resulting patch onto the live content (handles external writes). * 2. (Session chain) If that version wasn't the head, replay the edits onto * the live content directly when line counts match AND every edit's anchor * line content is unchanged between version and current — a prior in-session * edit advanced the tag and the model's anchors still name the same logical * rows. Emits a dedicated {@link RECOVERY_SESSION_REPLAY_WARNING} because * even with both guards a coincidental insert+delete pair on duplicate rows * can still land the edit on the wrong row; see {@link replaySessionChainOnCurrent}. */ export declare class Recovery { readonly store: SnapshotStore; constructor(store: SnapshotStore); /** * Attempt recovery. Returns `null` when no path forward is found — the * caller should then surface a {@link MismatchError}. */ tryRecover(args: RecoveryArgs): RecoveryResult | null; } //# sourceMappingURL=recovery.d.ts.map