/**
 * Server-side validation for dataset cell-anchored comments.
 *
 * The full anchor model + the (pure, client-side) resolver live in the web
 * app at `web/src/lib/utils/cell-anchor.ts` — resolution recomputes
 * `{row, col}` against the live grid on every render and never runs on the
 * server. The server's only job is to guard the write path: a cell comment
 * stores its anchor JSON in the existing `anchor_relpos` column, so we must
 * make sure (a) only datasets receive cell (JSON) anchors and (b) the JSON is
 * structurally well-formed, so a markdown comment's base64 relpos is never
 * confused for a cell anchor and a cell anchor is never fed to the text
 * resolver. The two copies are intentionally small and independent (the web
 * app does not import from `src/`).
 */
export interface CellAnchor {
    kind: 'cell';
    /** The commented row's cells at creation; absent when the snapshot was
     *  dropped to fit `MAX_ANCHOR_RELPOS_LENGTH` (rowHash fallback). */
    rowCells?: string[];
    rowHash: string;
    columnIndex: number;
    headerName: string;
}
/** Cheap discriminator: a cell anchor is JSON (`{…}`); a markdown comment's
 *  anchor is a base64 relpos blob, which never starts with `{`. */
export declare function looksLikeCellAnchor(relpos: string | null | undefined): boolean;
export declare function isValidCellAnchor(value: unknown): value is CellAnchor;
/** Parse + validate a stored anchor string as a cell anchor, or null. */
export declare function parseCellAnchor(relpos: string | null | undefined): CellAnchor | null;
