export declare function normalizeAgentEngineStatusModel(entry: { name: string; defaultModel: string; supportedModels: readonly string[]; } | undefined, model: string | null | undefined): string; type AgentEngineStatusEntry = { name: string; defaultModel: string; supportedModels: readonly string[]; requiredEnvVars: readonly string[]; }; export interface AgentEngineStatusResult { configured: boolean; engine?: string; model?: string; source?: "settings" | "env" | "app_secrets" | "app-default"; selectionSource?: "configuration" | "app-default" | "shared-default" | "app_secrets" | "env"; envVar?: string; openAiBaseUrlConfigured?: boolean; } export interface AgentEngineStatusResponse extends AgentEngineStatusResult { /** Fast chat setup snapshot; dispatch rechecks credentials before model use. */ chatEligible: boolean; /** The deploy's Builder.io credits pair is set but this runtime refuses it. */ builderCreditsRefused?: true; } export interface AgentEngineStatusDeps { readStoredEngine: () => Promise<{ engine?: string; model?: string; } | null>; readAppDefault?: () => Promise<{ engine: string; model: string; } | null>; readOpenAiBaseUrlConfigured: () => boolean | Promise; isStoredEngineUsable: (stored: unknown, entry: E) => boolean | Promise; detectFromUserSecrets: () => Promise; detectFromEnv: () => E | null | Promise; lookupEntry?: (engine: string) => E | undefined; } /** * Resolve "does this request have a usable AI provider" for one identity. * * Every call site pays for these lookups on a user-visible path (the agent * composer blocks on the status probe), so the two identity-independent reads * start together and the expensive `app_secrets` sweep only runs when the * cheaper sources have not already answered. */ export declare function resolveAgentEngineStatus(deps: AgentEngineStatusDeps): Promise; export {};