import type { ArkmeMemberEvent, ArkmeMemberEventPage, ArkmeMemberEventQuery } from '../types.js'; export interface MemberEventTimelineSnapshot { events: ArkmeMemberEvent[]; gaps: Array<{ id: string; at: number; }>; loading: boolean; unavailable: boolean; } /** One account/group cache, with a selected display window. No expiry timer or polling. */ export declare class MemberEventTimeline { private readonly read; private readonly changed; private events; private ranges; private lower; private upper; private sequence; private disposed; private denied; private active; private jobs; private foreground; private dirty; private hintAt; private seen; private timer; private lastRefresh; private revision; private mode; private latestUpper; private latestFetchedAt; private latestRevision; private retryAt; constructor(read: (query: ArkmeMemberEventQuery, signal: AbortSignal) => Promise, changed?: () => void, seed?: readonly ArkmeMemberEvent[]); snapshot(lower?: number | undefined, upper?: number): MemberEventTimelineSnapshot; /** Pure render-time projection: never enters a window, expires data, or starts a read. */ cachedSnapshot(mode: 'latest' | 'around', window?: { from: number; to?: number; }): MemberEventTimelineSnapshot | undefined; windowUpper(): number; /** Re-entry is the only place that checks cache age. Pending reads remain shared. */ enterWindow(from: number, to: number, mode: 'latest' | 'around'): Promise; setWindow(from: number, to: number): Promise; private addRange; loadGap(id: string): Promise; invalidate(eventId: string, occurredAt: number): void; setForeground(value: boolean): void; revoke(): void; private scheduleRefresh; private enqueue; private pump; /** Bound inactive caches without claiming coverage for evicted rows or pages. */ trim(): void; dispose(): void; } export declare function memberEventsUnavailable(error: unknown): boolean; //# sourceMappingURL=member-event-timeline.d.ts.map