import type { VcsOp } from '../vcs/types.js';
import type { PeerId, SyncMessage } from './types.js';
export interface SyncRoomAppendRejection {
    op: VcsOp;
    reason: 'invalid-kind' | 'hash-mismatch' | 'missing-dependency';
    message: string;
}
export interface SyncRoomAppendResult {
    applied: number;
    skipped: number;
    rejected: SyncRoomAppendRejection[];
    acceptedOps: VcsOp[];
}
export interface SyncRoomDelivery {
    peerId: string;
    message: SyncMessage;
}
/** Default max ops returned for snapshot / tail catch-up. */
export declare const DEFAULT_SNAPSHOT_MAX_OPS = 500;
export interface SyncRoomSnapshot {
    headHash?: string;
    opCount: number;
    truncated: boolean;
    ops: VcsOp[];
}
/**
 * Canonical room log and catch-up protocol shared by room transports.
 */
export declare class SyncRoomCore {
    private roomPeer;
    private peers;
    private ops;
    constructor(roomId?: string, roomName?: string);
    connectPeer(peerId: string, peerName?: string): void;
    disconnectPeer(peerId: string): void;
    getRoomPeer(): PeerId;
    peersFor(peerId: string): PeerId[];
    getOps(): VcsOp[];
    getOpCount(): number;
    /** Build a tail snapshot for late-joiner catch-up. */
    buildSnapshot(maxOps?: number): SyncRoomSnapshot;
    /** Deliver a snapshot message to a connected peer. */
    snapshotDeliveries(peerId: string, maxOps?: number): SyncRoomDelivery[];
    receive(fromPeerId: string, message: SyncMessage): Promise<SyncRoomDelivery[]>;
    private handleHave;
    private handleWant;
    private handleOps;
    appendOps(incomingOps: VcsOp[]): Promise<SyncRoomAppendResult>;
    private roomOpsDeliveries;
    private opsDelivery;
    private broadcastOps;
}
//# sourceMappingURL=room-core.d.ts.map