import type { SpeakerDirectoryAvatar, SpeakerDirectoryDetail, SpeakerDirectoryListInput, SpeakerDirectoryPage, SpeakerDirectoryQuery, SpeakerDirectorySeen, SpeakerDirectorySummary } from '../speaker-directory-contract.js'; export interface DirectoryLoaders { summary(input: { snapshotVersion?: string; seenVersion?: number; }, signal: AbortSignal): Promise; list(input: SpeakerDirectoryListInput, signal: AbortSignal): Promise; seen(throughCursor: string, signal: AbortSignal): Promise; open(detailRef: string, signal: AbortSignal): Promise; avatars(detailRefs: string[], signal: AbortSignal): Promise; } export declare class SpeakerReadDeferred extends Error { readonly retryAt: number; constructor(retryAt: number, cause: unknown); } export declare function directoryErrorCode(error: unknown): string; export declare function speakerRetryDelay(error: unknown): number | undefined; export declare const directoryVisible: () => boolean; export declare const normalizeDirectoryQuery: (query: string) => string; export declare function directoryQueryValid(query: string): boolean; export interface DirectorySnapshot { summary?: SpeakerDirectorySummary; error?: string; refreshPending?: boolean; } export interface DirectoryList extends SpeakerDirectoryPage { query: SpeakerDirectoryQuery; requestedCursors: string[]; summary: SpeakerDirectorySummary; } /** Shared summary and immutable same-version pages. No traversal or local new-person inference. */ export declare class RecognizedSpeakerDirectory { private readonly api; private readonly now; private accounts; private listeners; constructor(api?: DirectoryLoaders, now?: () => number); subscribe: (listener: () => void) => () => void; get: (account?: string) => DirectorySnapshot; private emit; private account; private current; private request; summary(account: string, force?: boolean): Promise; peek(account: string, query: SpeakerDirectoryQuery): DirectoryList | undefined; first(account: string, query: SpeakerDirectoryQuery, signal: AbortSignal, force?: boolean): Promise; more(account: string, previous: DirectoryList, signal: AbortSignal): Promise; confirmDisplayed(account: string, list: DirectoryList): Promise; private flushSeen; hasPendingSeen(account: string): boolean; needsReload(account: string, list: DirectoryList): boolean; open(account: string, ref: string, signal: AbortSignal): Promise<{ type: "candidate"; candidateRef: string; } | { type: "speaker"; speakerRef: string; expectedVersion?: string; }>; avatars(account: string, detailRefs: string[], signal: AbortSignal): Promise; /** Visible consumers share one lightweight summary request, including online/focus recovery. */ watch(account: string, changed?: () => void): () => void; invalidate(account: string): void; clear(): void; } export declare const recognizedSpeakerDirectory: RecognizedSpeakerDirectory; //# sourceMappingURL=recognized-speaker-directory.d.ts.map