import { type Api, type Model, type ModelRefreshStrategy } from "@gajae-code/ai/core"; export interface DiscoveryProvider { provider: string; optional?: boolean; } export type ProviderDiscoveryStatus = "idle" | "ok" | "empty" | "cached" | "unavailable" | "unauthenticated"; export interface ProviderDiscoveryState { provider: string; status: ProviderDiscoveryStatus; optional: boolean; stale: boolean; fetchedAt?: number; models: string[]; error?: string; } export interface DiscoveryRefreshToken { provider: string; generation: number; } /** A generation-guarded, immutable result for the registry to merge into its catalog. */ export interface DiscoveryMergeInput { provider: string; token: DiscoveryRefreshToken; current: boolean; models: readonly Model[]; state: ProviderDiscoveryState; warning?: string; authGeneration?: string; fetched?: boolean; } export interface ProviderDiscoveryCallbacks { cacheDbPath?: string; requiresAuth: (provider: TProvider) => boolean; peekApiKey: (provider: TProvider) => Promise; isAuthenticated: (apiKey: string | undefined) => boolean; fetchModels: (provider: TProvider, apiKey: string | undefined) => Promise[]>; getEvidenceGeneration?: (provider: TProvider) => string; canPublishCache?: (provider: TProvider) => boolean; /** * Stable fingerprint of the discovery fetch context (credential evidence + * endpoint). When supplied, the published cache row records it alongside the * discovered model ids so a later `online-if-uncached` refresh can trust a * fresh cache instead of treating the ids as provenance-less and re-fetching. */ cacheDynamicModelProvenance?: string; } /** Owns configured discovery inputs, status, cache lifecycle, and refresh generations. */ export declare class ModelDiscoveryManager { #private; reset(): void; setProviders(providers: readonly TProvider[]): void; addProvider(provider: TProvider): void; get providers(): readonly TProvider[]; providerIds(): Set; getState(provider: string): ProviderDiscoveryState | undefined; invalidate(provider: string): void; loadCached(provider: TProvider, cacheDbPath?: string, expectedProvenance?: string): readonly Model[]; beginRefresh(provider: string): DiscoveryRefreshToken; isCurrent(token: DiscoveryRefreshToken): boolean; discover(provider: TProvider, strategy: ModelRefreshStrategy, callbacks: ProviderDiscoveryCallbacks): Promise; }