/**
 * Event Sourcing with CRDTs
 * Complete state reconstruction with event replay, snapshots, and compaction
 */
import { CRDT } from '../crdt';
import { StreamingSignal } from './coalgebra';
export interface Event {
    id: string;
    type: string;
    timestamp: number;
    nodeId: string;
    data: any;
    version: number;
}
export interface CRDTSnapshot<T> {
    timestamp: number;
    version: number;
    state: T;
    eventCount: number;
    checksum: string;
}
export interface EventStore {
    append(events: Event[]): Promise<void>;
    getEvents(fromVersion?: number, toVersion?: number): Promise<Event[]>;
    getSnapshot(beforeVersion?: number): Promise<CRDTSnapshot<any> | null>;
    saveSnapshot(snapshot: CRDTSnapshot<any>): Promise<void>;
    compact(beforeVersion: number): Promise<void>;
}
export type CompactionStrategy = 'sliding-window' | 'time-based' | 'event-count' | 'manual';
export interface EventSourcedConfig {
    eventStore: EventStore;
    snapshotInterval: number;
    compactionStrategy: CompactionStrategy;
    maxEvents?: number;
    maxAge?: number;
}
export interface EventSourcedCRDT<T, E extends Event> extends CRDT<T> {
    events(): StreamingSignal<E>;
    replayFrom(timestamp: number): Promise<T>;
    snapshot(): Promise<CRDTSnapshot<T>>;
    compact(): Promise<void>;
    getEventCount(): number;
    getVersion(): number;
    clone(): EventSourcedCRDT<T, E>;
    toJSON(): any;
    fromJSON(data: any): EventSourcedCRDT<T, E>;
}
export declare class MemoryEventStore implements EventStore {
    private events;
    private snapshots;
    append(events: Event[]): Promise<void>;
    getEvents(fromVersion?: number, toVersion?: number): Promise<Event[]>;
    getSnapshot(beforeVersion?: number): Promise<CRDTSnapshot<any> | null>;
    saveSnapshot(snapshot: CRDTSnapshot<any>): Promise<void>;
    compact(beforeVersion: number): Promise<void>;
}
export declare class IndexedDBEventStore implements EventStore {
    private db;
    private dbName;
    constructor(dbName: string);
    private getDB;
    append(events: Event[]): Promise<void>;
    getEvents(fromVersion?: number, toVersion?: number): Promise<Event[]>;
    getSnapshot(beforeVersion?: number): Promise<CRDTSnapshot<any> | null>;
    saveSnapshot(snapshot: CRDTSnapshot<any>): Promise<void>;
    compact(beforeVersion: number): Promise<void>;
}
export declare const createEventSourcedCRDT: <T, E extends Event>(baseCRDT: CRDT<T>, config: EventSourcedConfig, nodeId?: string) => EventSourcedCRDT<T, E>;
export declare const eventSourcedORSet: (nodeId: string, config: EventSourcedConfig) => EventSourcedCRDT<Set<unknown>, Event>;
export declare const eventSourcedGCounter: (nodeId: string, config: EventSourcedConfig) => EventSourcedCRDT<number, Event>;
export declare const indexedDBEventStore: (dbName: string) => IndexedDBEventStore;
