import { ThinkingLevel } from "@gajae-code/agent-core"; import type { Api, Model } from "@gajae-code/ai/core"; import type { AgentSession, DefaultFallbackRuntimeState } from "../session/agent-session"; export { resolveModelProfileName } from "./model-profile-contract"; import { type GjcModelAssignmentTargetId, type ModelRegistry } from "./model-registry"; import { type ModelSelectorValue } from "./model-selector-value"; import type { Settings } from "./settings"; type ModelProfileActivationSession = Pick & { credentialSessionId?: string; setModelTemporary?: AgentSession["setModelTemporary"]; setActiveModelProfile?: (name: string | undefined) => void; getActiveModelProfile?: () => string | undefined; /** Record which runtime override keys this activation installed (session-scoped). */ noteProfileInstalledOverrides?: (modelRoles: readonly string[], agentModelOverrides: readonly string[], preProfileModel: Model | undefined) => void; /** Drop the recorded profile-installed override keys (e.g. after materialization). */ clearProfileInstalledOverrides?: () => void; /** Current profile-installed override keys, for deriving the activation base. */ getProfileInstalledOverrideKeys?: () => { modelRoles: readonly string[]; agentModelOverrides: readonly string[]; }; /** Re-apply vendor-separated delegation (task tool + prompt) after the role layer changed. */ syncEagerDelegation?: () => Promise; getSessionDefaultModelSelector?: () => string | undefined; recordResumeDefaultModel?: (selector: string | undefined) => void; seedDefaultFallbackResolution?: (activeIndex: number, skips: Array<{ selector: string; reason: string; }>) => void; getDefaultFallbackRuntimeState?: () => DefaultFallbackRuntimeState; restoreDefaultFallbackRuntimeState?: (state: DefaultFallbackRuntimeState) => void; restoreModelSelectionForRollback?: AgentSession["restoreModelSelectionForRollback"]; modelRegistry?: Pick; getConfiguredModelChainState?: (role: string) => ConfiguredModelChainState | undefined; }; type ConfiguredModelChainState = { entries: readonly string[]; origin: string; identity?: string; explicitHead: boolean; }; export interface PrepareModelProfileActivationOptions { session: ModelProfileActivationSession; modelRegistry: Pick & Partial> & { getError?: ModelRegistry["getError"]; }; settings: Pick; profileName: string; } export interface ApplyModelProfileActivationOptions { persistDefault?: boolean; thinkingLevelOverride?: ThinkingLevel; } export interface PreparedModelProfileActivation { profileName: string; session: ModelProfileActivationSession & { setModelTemporary: AgentSession["setModelTemporary"]; }; settings: Pick; previousModel: Model | undefined; previousThinkingLevel: ThinkingLevel | undefined; previousAgentModelOverrides: Record; previousModelRoles: Record; previousPersistedModelRoles: Record | undefined; previousPersistedAgentModelOverrides: Record | undefined; previousModelRolesOverride: Record | undefined; previousAgentModelOverridesOverride: Record | undefined; previousDefaultProfileOverride: string | undefined; previousPersistedDefaultProfile: string | undefined; previousPersistedDefaultThinkingLevel: Exclude | undefined; previousDefaultThinkingLevelOverride: ThinkingLevel | undefined; baseAgentModelOverrides: Record; baseModelRoles: Record; previousDefaultChain: readonly string[] | undefined; previousDefaultChainState: ConfiguredModelChainState | undefined; previousDefaultFallbackRuntimeState: DefaultFallbackRuntimeState | undefined; defaultModel: Model | undefined; defaultThinkingLevel: ThinkingLevel | undefined; /** Full configured default fallback chain with resolvable entries clamped. */ defaultChain: readonly string[]; /** Index of the authenticated default-chain entry selected for activation. */ defaultActiveIndex: number | undefined; /** Resolution-time skips that occurred before selecting the default entry. */ defaultResolutionSkips: Array<{ selector: string; reason: string; }>; modelRoles: Record; agentModelOverrides: Record; previousActiveModelProfile: string | undefined; /** * The session resume default ("provider/id") captured BEFORE activation — * the model resume would restore prior to this profile. Snapshotted * separately from `previousModel` (the live runtime model, which may be a * transient switch) so a failed-activation rollback restores the correct * resume default without promoting a transient model to it. */ previousSessionDefaultModel: string | undefined; /** * Exact concrete sticky selector ("provider/id") snapshotted from the * registry BEFORE the session sticky canonical variant is invalidated during * prepare. Captured verbatim — never re-derived from the live model — so a * transient live-model switch cannot corrupt the restored sticky. Rollback * restores this exact selector when present; otherwise the sticky is cleared * so a stale provider cannot silently resurrect. */ previousCanonicalVariant: string | undefined; /** Registry used to resolve and restore the session sticky canonical variant. */ modelRegistry: PrepareModelProfileActivationOptions["modelRegistry"]; } export interface MaterializeModelProfileAssignmentOptions { session: Pick; settings: Pick; role: GjcModelAssignmentTargetId; selector: string; } export interface MaterializeModelProfileAssignmentsOptions { session: Pick; settings: Pick; assignments: ReadonlyMap | Partial>; } export declare function materializeActiveModelProfileAssignment(options: MaterializeModelProfileAssignmentOptions): boolean; export declare function materializeActiveModelProfileAssignments(options: MaterializeModelProfileAssignmentsOptions): boolean; export declare class ModelProfileCredentialError extends Error { readonly code = "authentication_failed"; readonly profileLabel: string; readonly providers: readonly string[]; readonly role: string | undefined; constructor(profileLabel: string, providers: readonly string[], role?: string); } export declare function formatModelProfileCredentialError(profileLabel: string, providers: readonly string[]): string; export declare function prepareModelProfileActivation(options: PrepareModelProfileActivationOptions): Promise; export declare function applyPreparedModelProfileActivation(prepared: PreparedModelProfileActivation, options?: ApplyModelProfileActivationOptions): Promise; export interface MaterializeModelProfileForDeletionResult { modelRoles: Record; agentModelOverrides: Record; previousModelRoles: Record; previousAgentModelOverrides: Record; previousPersistedModelRoles: Record | undefined; previousPersistedAgentModelOverrides: Record | undefined; previousModelRolesOverride: Record | undefined; previousAgentModelOverridesOverride: Record | undefined; previousDefaultProfileOverride: string | undefined; previousDefaultProfile: string | undefined; previousPersistedDefaultProfile: string | undefined; previousActiveModelProfile: string | undefined; previousDefaultChainState: ConfiguredModelChainState | undefined; previousDefaultFallbackRuntimeState: DefaultFallbackRuntimeState | undefined; /** * Restores the session sticky canonical variant that was snapshotted before * materialization cleared it. Internal closure capturing the registry, * session, and exact pre-clear selector — avoids threading a registry * through the restore options. Optional so callers that never materialized * (or use a registry without sticky support) can still restore settings. */ restoreSessionCanonicalVariant?: () => void; } export declare function materializeModelProfileForDeletion(options: PrepareModelProfileActivationOptions & { settings: Pick; }): Promise; export declare function restoreMaterializedModelProfileForDeletion(options: { settings: Pick; session: Pick; snapshot: MaterializeModelProfileForDeletionResult; }): Promise; export declare function activateModelProfile(options: PrepareModelProfileActivationOptions, applyOptions?: ApplyModelProfileActivationOptions): Promise;