import { type ArkmeMessageQuote } from './message-quote.js'; export interface MessageUnderline { id: string; actorId?: number; actorName: string; mine: boolean; anchor?: ArkmeMessageQuote; state: 'available' | 'stale'; pending?: boolean; } export interface MessageUnderlineSnapshot { syncNotice?: string; revision: number; accessible: boolean; items: MessageUnderline[]; } export interface MessageUnderlineCapabilities { supported: boolean; maxLength: number; storage?: 'local' | 'cloud'; maxBatchSize?: number; } export type MessageUnderlineChange = { operationId: string; kind: 'add'; anchor: ArkmeMessageQuote; } | { operationId: string; kind: 'remove'; annotationId: string; }; export declare function underlineId(value: unknown): value is string; export declare function underlineCapabilities(value: unknown): MessageUnderlineCapabilities; /** Complete, permission-checked snapshots only. The actor cannot choose whether a mark is mine. */ export declare function readUnderlineSnapshot(value: unknown, viewerId: number): { revision: number; accessible: boolean; items: { id: string; actorId: number; actorName: string; mine: boolean; anchor: ArkmeMessageQuote; state: "available" | "stale"; }[]; }; /** Newer reads never replace a pending write, and older revisions never resurrect removed marks. */ export declare function acceptUnderlineSnapshot(previous: MessageUnderlineSnapshot | undefined, next: MessageUnderlineSnapshot, pending?: boolean): MessageUnderlineSnapshot | undefined; /** Team exposes server-determined ownership and public display names, never * numeric member identities. Stale marks intentionally contain no old quote. */ export declare function readTeamUnderlineSnapshot(value: unknown): MessageUnderlineSnapshot; //# sourceMappingURL=message-annotations.d.ts.map