/** Centralized error/warning text for the hashline parser, applier, and patcher. */
/** Lines of context shown either side of a hash mismatch. */
export declare const MISMATCH_CONTEXT = 2;
/**
 * Numbered `LINE:TEXT` rows around `anchorLines` (±{@link MISMATCH_CONTEXT}),
 * `*`-marking anchors, `...` between non-adjacent runs. Out-of-range anchors
 * contribute no rows.
 */
export declare function formatAnchoredContext(anchorLines: readonly number[], fileLines: readonly string[]): string[];
/** Optional patch envelope start marker; silently consumed. */
export declare const BEGIN_PATCH_MARKER = "*** Begin Patch";
/** Optional patch envelope end marker; terminates parsing. */
export declare const END_PATCH_MARKER = "*** End Patch";
/**
 * Truncation sentinel emitted by an agent loop mid-call. Ends parsing like
 * {@link END_PATCH_MARKER}, without a warning.
 */
export declare const ABORT_MARKER = "*** Abort";
/** Two consecutive hunks targeted the exact same concrete range. */
export declare const REPLACE_PAIR_COALESCED_WARNING = "Two hunks targeted the same range; kept only the second. One `replace N..M:` hunk per range \u2014 the body is the final content, never old+new.";
/** Bare bodyless hunk followed by an overlapping concrete hunk. */
export declare const REPLACE_PAIR_COALESCED_OVERLAP_WARNING = "Dropped a bare hunk overlapped by the concrete hunk after it. One `replace N..M:` hunk per range \u2014 the body is the final content, never old+new.";
/** Bare body rows auto-converted to literal `+` rows. */
export declare const BARE_BODY_AUTO_PIPED_WARNING = "Auto-prefixed bare body row(s) with `+`. Body rows must be `+TEXT` literal lines.";
/** Unified-diff-style `-` row in a hunk body. */
export declare const MINUS_ROW_REJECTED = "`-` rows are not valid; the range already names the lines being changed. For a literal `-` line, write `+-\u2026`.";
/** Replace hunk with no body. */
export declare const EMPTY_REPLACE = "`replace N..M:` needs at least one `+TEXT` body row. To delete lines, use `delete N..M`.";
/** `replace block N:` hunk with no body. */
export declare const EMPTY_BLOCK = "`replace block N:` needs at least one `+TEXT` body row. To delete a block, use `delete block N`.";
/**
 * Block-anchored replace/delete could not resolve to a syntactic block
 * (unsupported language, blank/out-of-range line, no node beginning on N, or
 * parse error). Appends a {@link formatAnchoredContext} preview when
 * `fileLines` is given. `insert after block N:` never reaches this — it is
 * lowered to plain `insert after N:` instead (see
 * {@link insertAfterBlockUnresolvedLoweredWarning}).
 */
export declare function blockUnresolvedMessage(line: number, op?: "replace" | "delete", fileLines?: readonly string[]): string;
/** Block-anchored edit reached a path with no {@link BlockResolver} wired in — a host-configuration bug. */
export declare const BLOCK_RESOLVER_UNAVAILABLE = "`replace block`/`delete block`/`insert after block` are not available here (no block resolver configured). Use a concrete line range.";
/**
 * `insert after block N:` anchored on a closing-delimiter line, lowered to
 * plain `insert after N:` — the closer ends a block, and inserting after it
 * is exactly what the plain form does.
 */
export declare function insertAfterBlockCloserLoweredWarning(line: number): string;
/**
 * `insert after block N:` anchor unresolvable (unsupported language, blank
 * line, parse error, or no resolver), lowered to plain `insert after N:` —
 * applying with a warning beats failing the patch.
 */
export declare function insertAfterBlockUnresolvedLoweredWarning(line: number): string;
/**
 * Internal invariant: `applyEdits` received an unresolved `replace block N:`
 * edit; `resolveBlockEdits` must run first. Wiring bug, not authored input.
 */
export declare const UNRESOLVED_BLOCK_INTERNAL = "internal error: unresolved `replace block` edit reached the applier (resolveBlockEdits was not run).";
/** Delete hunk received a body row. */
export declare const DELETE_TAKES_NO_BODY = "`delete N..M` does not take body rows. Remove the body, or use `replace N..M:`.";
/** `delete block N` hunk received a body row. */
export declare const DELETE_BLOCK_TAKES_NO_BODY = "`delete block N` does not take body rows. Remove the body, or use `replace block N:`.";
/** Insert hunk with no body. */
export declare const EMPTY_INSERT = "`insert` needs at least one `+TEXT` body row.";
/**
 * `insert after` body indented shallower than the anchor: the landing slid
 * forward past trailing closer lines — the common "anchored on the last line
 * I read instead of after the block" mistake.
 */
export declare function afterInsertLandingShiftWarning(anchorLine: number, landingLine: number, crossed: number): string;
/**
 * `insert after block N:` body indented deeper than the block's closer: the
 * landing was pulled inside the block — a deeper body almost always means
 * "append inside the block's body".
 */
export declare function blockInsertLandingShiftWarning(blockStart: number, closerLine: number, landingLine: number): string;
/** `Recovery`: an external write matched a cached snapshot. */
export declare const RECOVERY_EXTERNAL_WARNING = "Recovered from a stale file hash using a previous read snapshot (file changed externally between read and edit).";
/** `Recovery`: a prior in-session edit advanced the hash. */
export declare const RECOVERY_SESSION_CHAIN_WARNING = "Recovered from a stale file hash using an earlier in-session snapshot (a prior edit in this session advanced the hash).";
/**
 * `Recovery`: session-chain replay fast-path. Less certain than
 * {@link RECOVERY_SESSION_CHAIN_WARNING} — the 3-way merge refused, the
 * anchor-content gate passed, but a coincidental insert+delete earlier in
 * the chain could still misplace an anchor — hence the verify hedge.
 */
export declare const RECOVERY_SESSION_REPLAY_WARNING = "Recovered by replaying your edits onto the current file content (a prior in-session edit changed the lines you re-targeted with a stale hash). Verify the diff matches your intent.";
/**
 * `insert head:`/`insert tail:` applied despite a stale snapshot tag.
 * Head/tail position is content-independent, so drift is non-fatal: apply
 * onto live content and warn instead of hard-failing.
 */
export declare const HEADTAIL_DRIFT_WARNING = "Applied the `insert head:`/`insert tail:` edit despite a stale snapshot tag (file changed since your read) \u2014 head/tail position is content-independent. Re-read if the drift was unexpected.";
/**
 * Section omitted the mandatory snapshot tag. Shared by the apply
 * ({@link Patcher.prepare}) and preview/diff paths so both stay in lockstep.
 */
export declare function missingSnapshotTagMessage(sectionPath: string): string;
//# sourceMappingURL=messages.d.ts.map