UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

506 lines (505 loc) 24.4 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { t as createLazyImportLoader } from "./lazy-promise-DGqyc4Y4.js"; import { c as resolveAgentConfig, u as resolveAgentDir } from "./agent-scope-config-DcbEhP0R.js"; import { t as isDiagnosticFlagEnabled } from "./diagnostic-flags-qVPAqdVk.js"; import { a as legacyModelKey, c as normalizeProviderId, s as normalizeModelRef } from "./model-ref-shared-Dz7QU0Lx.js"; import { t as modelKey } from "./model-key-CMdQNkZf.js"; import { r as buildConfiguredModelCatalog, v as resolveModelAliasFromPair } from "./model-selection-shared-BlLyx1r2.js"; import { E as hasSessionAutoModelFallbackProvenance, r as hasLegacyAutoFallbackWithoutOrigin } from "./agent-scope-DbtJyKUL.js"; import { s as normalizeThinkLevel } from "./thinking.shared-bHYuuc1L.js"; import { a as listOpenAIAuthProfileProvidersForAgentRuntime } from "./openai-routing-Ex_3E9TF.js"; import { i as isUserModelAuthProfileId } from "./profile-usage-stats-dkZh2v8y.js"; import { t as resolveAgentHarnessPolicy } from "./policy-D9i1QMuw.js"; import { n as isStoredCredentialCompatibleWithAuthProvider } from "./order-CC2RBzI5.js"; import { a as applyModelOverrideToSessionEntry } from "./model-overrides-Bm7jo7Di.js"; import { a as resolveCliRuntimeCanonicalProvider } from "./cli-backends-Bs_a4MW0.js"; import { a as resolveReasoningDefault, l as normalizeStoredOverrideModel, u as resolvePersistedOverrideModelRef } from "./model-selection-di2kjKCB.js"; import { n as resolveThinkingDefault } from "./model-thinking-default-1g_x1V4J.js"; import { a as SessionWorkStartInvalidatedError } from "./lifecycle-BaroCBMc.js"; import { n as createModelVisibilityPolicy, t as RUNTIME_MODEL_VISIBILITY_NORMALIZATION } from "./model-visibility-policy-mYoB7nkk.js"; import { n as resolveStoredModelOverride, t as resolveDirectStoredModelOverride } from "./stored-model-overrides-j_gQYbkA.js"; import { i as normalizeRuntimeRef, o as resolveRuntimeNormalization, r as mergePreparedConfiguredCatalog, t as findSelectedCatalogEntry } from "./model-runtime-normalization-CVjCcJkR.js"; import { t as clearSessionAuthProfileOverride } from "./session-override-ClC-ppNe.js"; import { a as sessionModelOverrideChangesApplied, n as adoptPersistedSessionSnapshot } from "./session-snapshot-merge-Cf1TdJBp.js"; import "./model-selection-directive-B3DZzVk6.js"; import "./model-selection-context-BUKuYlr-.js"; //#region src/auto-reply/reply/stored-model-override.ts /** Normalizes a stored model ref, resolving runtime aliases only for CLI-bound sessions. */ function normalizeStoredRuntimeModelRef(provider, model, cfg, sessionEntry, normalization = RUNTIME_MODEL_VISIBILITY_NORMALIZATION) { const normalized = normalizeModelRef(provider, model, normalization); const hasCliSessionBinding = sessionEntry?.cliSessionBindings?.[normalized.provider] !== void 0; const canonicalProvider = cfg && hasCliSessionBinding ? resolveCliRuntimeCanonicalProvider({ runtime: normalized.provider, config: cfg, includeSetupRegistry: true }) : void 0; return canonicalProvider ? { ...normalized, provider: canonicalProvider } : normalized; } function resolveModelRefKey(params) { const normalizedOverride = normalizeStoredOverrideModel({ providerOverride: params.overrideProvider, modelOverride: params.overrideModel }); const ref = resolvePersistedOverrideModelRef({ defaultProvider: params.defaultProvider, overrideProvider: normalizedOverride.providerOverride, overrideModel: normalizedOverride.modelOverride }); if (!ref) return null; const normalizedRef = normalizeModelRef(ref.provider, ref.model); return modelKey(normalizedRef.provider, normalizedRef.model); } /** Detects heartbeat auto-fallback overrides that no longer match the primary model. */ function isStaleHeartbeatAutoFallbackOverride(params) { if (params.isHeartbeat !== true || params.hasResolvedHeartbeatModelOverride === true) return false; if (params.storedOverride?.source !== "session") return false; const entry = params.sessionEntry; const recoveredAutoFallbackOverride = entry !== void 0 && entry.modelOverrideSource === void 0 && hasSessionAutoModelFallbackProvenance(entry); if (entry?.modelOverrideSource !== "auto" && !recoveredAutoFallbackOverride) return false; if (!entry) return false; const primaryKey = resolveModelRefKey({ defaultProvider: params.defaultProvider, overrideProvider: params.primaryProvider ?? params.defaultProvider, overrideModel: params.primaryModel ?? params.defaultModel }); if (!primaryKey) return false; const originKey = resolveModelRefKey({ defaultProvider: params.defaultProvider, overrideProvider: entry.modelOverrideFallbackOriginProvider, overrideModel: entry.modelOverrideFallbackOriginModel }); if (originKey) return originKey !== primaryKey; const noticeSelectedKey = resolveModelRefKey({ defaultProvider: params.defaultProvider, overrideModel: normalizeOptionalString(entry.fallbackNotice?.selectedModel) }); if (noticeSelectedKey) return noticeSelectedKey !== primaryKey; const storedOverrideKey = resolveModelRefKey({ defaultProvider: params.defaultProvider, overrideProvider: params.storedOverride.provider, overrideModel: params.storedOverride.model }); return storedOverrideKey !== null && storedOverrideKey !== primaryKey; } //#endregion //#region src/auto-reply/reply/model-selection.ts /** Model selection state for reply runs, including catalog and override handling. */ function resolveConfiguredModelThinkingDefault(raw) { if (raw === false || raw === "disabled" || raw === "none") return "off"; return typeof raw === "string" ? normalizeThinkLevel(raw) : void 0; } /** Creates minimal model-selection state for fast test mode. */ function createFastTestModelSelectionState(params) { return { provider: params.provider, model: params.model, requestedRouteResolution: "resolved", modelPolicy: createModelVisibilityPolicy({ cfg: { agents: { defaults: params.agentCfg } }, catalog: [], defaultProvider: params.provider, defaultModel: params.model }), allowedModelKeys: /* @__PURE__ */ new Set(), allowedModelCatalog: [], policyAliasIndex: { byAlias: /* @__PURE__ */ new Map(), byKey: /* @__PURE__ */ new Map() }, resetModelOverride: false, resetModelOverrideRef: void 0, resetModelOverrideReason: void 0, modelPolicyConfigPath: void 0, modelPolicyRepairConfigPath: void 0, resolveThinkingCatalog: async () => [], resolveDefaultThinkingLevel: async () => params.agentCfg?.thinkingDefault, hasConfiguredThinkingDefault: params.agentCfg?.thinkingDefault !== void 0, resolveDefaultReasoningLevel: async () => "off", needsModelCatalog: false, modelContextWindow: void 0, modelContextTokens: void 0 }; } const modelCatalogRuntimeLoader = createLazyImportLoader(() => import("./agents/model-catalog.runtime.js")); const sessionPersistenceRuntimeLoader = createLazyImportLoader(() => import("./session-entry-persistence-DLekbNEV.js")); function loadPreparedModelCatalogRuntime() { return modelCatalogRuntimeLoader.load(); } function loadSessionPersistenceRuntime() { return sessionPersistenceRuntimeLoader.load(); } /** Resolves provider/model, allowlist, catalog, and thinking defaults for a reply run. */ async function createModelSelectionState(params) { const timingEnabled = isDiagnosticFlagEnabled("ingress.timing", params.cfg); const startMs = timingEnabled ? Date.now() : 0; const logStage = (stage, extra) => { if (!timingEnabled) return; const suffix = extra ? ` ${extra}` : ""; console.log(`[model-selection] session=${params.sessionKey ?? "(no-session)"} stage=${stage} elapsedMs=${Date.now() - startMs}${suffix}`); }; const { cfg, agentCfg, sessionEntry, sessionStore, sessionKey, parentSessionKey, storePath, defaultProvider, defaultModel } = params; const loadRuntimeCatalogSnapshot = async () => params.preparedModelCatalog ?? await (await loadPreparedModelCatalogRuntime()).loadPreparedModelCatalogSnapshot({ config: cfg, ...params.agentId ? { agentId: params.agentId } : {} }); const runtimeModelNormalization = resolveRuntimeNormalization(cfg); const { manifestPlugins } = runtimeModelNormalization; let provider = params.provider; let model = params.model; let requestedRouteResolution = "resolved"; const primaryProvider = params.primaryProvider ?? defaultProvider; const primaryModel = params.primaryModel ?? defaultModel; const hasOneTurnModelOverride = params.hasOneTurnModelOverride === true; const modelSelectionLocked = sessionEntry?.modelSelectionLocked === true; const agentEntry = params.agentId ? resolveAgentConfig(cfg, params.agentId) : void 0; let visibilityPolicy = createModelVisibilityPolicy({ cfg, catalog: [], defaultProvider, defaultModel, agentId: params.agentId, ...runtimeModelNormalization }); const hasAllowlist = !visibilityPolicy.allowAny; const hasConfiguredModels = Object.keys(agentCfg?.models ?? {}).length > 0 || Object.keys(agentEntry?.models ?? {}).length > 0; const defaultModelVisibleByWildcard = visibilityPolicy.allowsByWildcard({ provider: defaultProvider, model: defaultModel }); const configuredModelCatalog = mergePreparedConfiguredCatalog({ configured: buildConfiguredModelCatalog({ cfg, manifestPlugins }), prepared: params.preparedModelCatalog?.entries }); const needsModelCatalog = params.hasModelDirective || hasAllowlist && visibilityPolicy.hasProviderWildcards && !defaultModelVisibleByWildcard; let allowedModelKeys = /* @__PURE__ */ new Set(); let allowedModelCatalog = configuredModelCatalog; let modelCatalog = null; let catalogAuthoritative = true; let resetModelOverride = false; let resetModelOverrideRef; let resetModelOverrideReason; const directStoredModelOverride = resolveDirectStoredModelOverride({ sessionEntry, defaultProvider }); const staleHeartbeatAutoFallbackOverride = isStaleHeartbeatAutoFallbackOverride({ isHeartbeat: params.isHeartbeat, hasResolvedHeartbeatModelOverride: params.hasResolvedHeartbeatModelOverride, sessionEntry, storedOverride: directStoredModelOverride, defaultProvider, defaultModel, primaryProvider: params.primaryProvider, primaryModel: params.primaryModel }); const primaryHarnessPolicy = resolveAgentHarnessPolicy({ provider: primaryProvider, modelId: primaryModel, config: cfg, agentId: params.agentId, sessionKey }); const staleLegacyOpenAICodexAutoOverride = directStoredModelOverride?.source === "session" && sessionEntry?.modelOverrideSource === "auto" && normalizeProviderId(directStoredModelOverride.provider ?? "") === "openai" && normalizeProviderId(primaryProvider) === "openai" && primaryHarnessPolicy.runtime === "codex" && normalizeRuntimeRef("openai", directStoredModelOverride.model, runtimeModelNormalization).model === normalizeRuntimeRef("openai", primaryModel, runtimeModelNormalization).model; const normalizedCurrentSelection = normalizeRuntimeRef(provider, model, runtimeModelNormalization); const normalizedDirectOverride = directStoredModelOverride ? normalizeRuntimeRef(directStoredModelOverride.provider ?? defaultProvider, directStoredModelOverride.model, runtimeModelNormalization) : null; const staleLegacyAutoFallbackWithoutOrigin = directStoredModelOverride?.source === "session" && hasLegacyAutoFallbackWithoutOrigin(sessionEntry) && normalizedDirectOverride !== null && modelKey(normalizedCurrentSelection.provider, normalizedCurrentSelection.model) !== modelKey(normalizedDirectOverride.provider, normalizedDirectOverride.model); const staleDirectStoredOverride = staleHeartbeatAutoFallbackOverride || staleLegacyOpenAICodexAutoOverride || staleLegacyAutoFallbackWithoutOrigin; if (needsModelCatalog) { const catalogSnapshot = await loadRuntimeCatalogSnapshot(); modelCatalog = catalogSnapshot.entries; catalogAuthoritative = catalogSnapshot.authoritative !== false; logStage("catalog-loaded", `entries=${modelCatalog.length} authoritative=${catalogAuthoritative}`); visibilityPolicy = createModelVisibilityPolicy({ cfg, catalog: modelCatalog, defaultProvider, defaultModel, agentId: params.agentId, ...runtimeModelNormalization }); allowedModelCatalog = visibilityPolicy.allowedCatalog; allowedModelKeys = visibilityPolicy.allowedKeys; logStage("allowlist-built", `allowed=${allowedModelCatalog.length} keys=${allowedModelKeys.size}`); } else if (hasAllowlist || hasConfiguredModels) { visibilityPolicy = createModelVisibilityPolicy({ cfg, catalog: configuredModelCatalog, defaultProvider, defaultModel, agentId: params.agentId, ...runtimeModelNormalization }); allowedModelCatalog = visibilityPolicy.allowedCatalog; allowedModelKeys = visibilityPolicy.allowedKeys; logStage("configured-allowlist-built", `allowed=${allowedModelCatalog.length} keys=${allowedModelKeys.size}`); } else if (configuredModelCatalog.length > 0) logStage("configured-catalog-ready", `entries=${configuredModelCatalog.length}`); if (sessionEntry && sessionStore && sessionKey && directStoredModelOverride && !hasOneTurnModelOverride) { const normalizedOverride = normalizeStoredRuntimeModelRef(directStoredModelOverride.provider ?? defaultProvider, directStoredModelOverride.model, cfg, sessionEntry, runtimeModelNormalization); const key = modelKey(normalizedOverride.provider, normalizedOverride.model); const overrideAllowed = visibilityPolicy.allowsKey(key); const shouldResetOverride = (staleDirectStoredOverride || !overrideAllowed) && !modelSelectionLocked; if (shouldResetOverride && !staleDirectStoredOverride && !catalogAuthoritative) { resetModelOverrideRef = key; resetModelOverrideReason = "temporarily-unavailable"; } else if (shouldResetOverride) { const initialSessionEntry = { ...sessionEntry }; const nextSessionEntry = { ...sessionEntry }; const { updated } = applyModelOverrideToSessionEntry({ entry: nextSessionEntry, selection: { provider: primaryProvider, model: primaryModel, isDefault: true }, preserveAuthProfileOverride: staleDirectStoredOverride }); let resetApplied = updated; if (updated) { if (storePath) { const { persistReplySessionEntry } = await loadSessionPersistenceRuntime(); const persistence = await persistReplySessionEntry({ storePath, sessionKey, initialEntry: initialSessionEntry, entry: nextSessionEntry }); if (persistence.status === "lifecycle-invalidated") throw new SessionWorkStartInvalidatedError(persistence.error); const persistedEntry = persistence.entry; resetApplied = sessionModelOverrideChangesApplied({ initial: initialSessionEntry, next: nextSessionEntry, current: persistedEntry }); adoptPersistedSessionSnapshot(sessionEntry, persistedEntry); } else adoptPersistedSessionSnapshot(sessionEntry, nextSessionEntry); sessionStore[sessionKey] = sessionEntry; } resetModelOverride = resetApplied; if (resetApplied) { resetModelOverrideRef = key; resetModelOverrideReason = staleDirectStoredOverride ? "stale" : "disallowed"; } } } if (staleDirectStoredOverride) { if (modelKey(normalizedCurrentSelection.provider, normalizedCurrentSelection.model) === (normalizedDirectOverride ? modelKey(normalizedDirectOverride.provider, normalizedDirectOverride.model) : void 0)) { provider = primaryProvider; model = primaryModel; requestedRouteResolution = "resolved"; } } const storedOverride = resolveStoredModelOverride({ sessionEntry, sessionStore, sessionKey, parentSessionKey, defaultProvider }); const skipStoredOverride = params.skipStoredModelOverride === true || hasOneTurnModelOverride || params.hasResolvedHeartbeatModelOverride === true || resetModelOverride && staleDirectStoredOverride && storedOverride?.source === "session"; if (storedOverride?.model && !skipStoredOverride) { const storedProvider = storedOverride.provider || defaultProvider; const storedRouteCataloged = Boolean(findSelectedCatalogEntry({ catalog: modelCatalog ?? allowedModelCatalog, provider: storedProvider, model: storedOverride.model })); const storedAlias = storedOverride.routeResolution === "raw" && !storedRouteCataloged ? resolveModelAliasFromPair({ cfg, provider: storedProvider, model: storedOverride.model, defaultProvider, aliasIndex: visibilityPolicy.selectionAliasIndex, ...runtimeModelNormalization }) : null; const normalizedStoredOverride = normalizeStoredRuntimeModelRef(storedAlias?.provider ?? storedProvider, storedAlias?.model ?? storedOverride.model, cfg, sessionEntry, runtimeModelNormalization); const key = modelKey(normalizedStoredOverride.provider, normalizedStoredOverride.model); if (modelSelectionLocked || visibilityPolicy.allowsKey(key)) { provider = normalizedStoredOverride.provider; model = normalizedStoredOverride.model; requestedRouteResolution = storedAlias || storedRouteCataloged ? "resolved" : storedOverride.routeResolution; } } if (!(params.hasModelDirective || hasOneTurnModelOverride || modelSelectionLocked)) { const unresolvedSelectionKey = modelKey(provider, model); const allowedInitialSelection = visibilityPolicy.resolveSelection({ provider, model }); if (!allowedInitialSelection) { const policyPath = visibilityPolicy.allowConfigPath ?? "modelPolicy.allow"; throw new Error(`Configured default model "${modelKey(provider, model)}" is not allowed by ${policyPath}, and no allowed model is available.`); } provider = allowedInitialSelection.provider; model = allowedInitialSelection.model; if (modelKey(provider, model) !== unresolvedSelectionKey) requestedRouteResolution = "resolved"; } if (!params.skipStoredModelOverride && sessionEntry && sessionStore && sessionKey && sessionEntry.authProfileOverride) { const { ensureAuthProfileStore } = await import("./agents/auth-profiles.runtime.js"); const store = ensureAuthProfileStore(params.agentId ? resolveAgentDir(cfg, params.agentId) : void 0, { allowKeychainPrompt: false, profileId: sessionEntry.authProfileOverride }); logStage("auth-profile-store-loaded", `profiles=${Object.keys(store.profiles).length}`); const profile = store.profiles[sessionEntry.authProfileOverride]; const harnessPolicy = resolveAgentHarnessPolicy({ provider, modelId: model, config: cfg, agentId: params.agentId, sessionKey }); const acceptedAuthProviders = listOpenAIAuthProfileProvidersForAgentRuntime({ provider, harnessRuntime: harnessPolicy.runtime, config: cfg }).map(normalizeProviderId); const overrideStillEligible = profile != null && acceptedAuthProviders.some((accepted) => isStoredCredentialCompatibleWithAuthProvider({ cfg, provider: accepted, credential: profile })); const missingPersonalProfile = !profile && isUserModelAuthProfileId(sessionEntry.authProfileOverride); if (!overrideStillEligible && !missingPersonalProfile) await clearSessionAuthProfileOverride({ sessionEntry, sessionStore, sessionKey, storePath }); } let manifestModelCatalog = null; const buildThinkingCatalog = (catalog) => createModelVisibilityPolicy({ cfg, catalog, defaultProvider, defaultModel, agentId: params.agentId, ...runtimeModelNormalization }).allowedCatalog; const loadManifestCatalog = async () => { if (manifestModelCatalog) return manifestModelCatalog; const { loadManifestModelCatalog } = await loadPreparedModelCatalogRuntime(); manifestModelCatalog = loadManifestModelCatalog({ config: cfg, fallbackToMetadataScan: false }); logStage("manifest-catalog-loaded", `entries=${manifestModelCatalog.length}`); return manifestModelCatalog; }; const thinkingCatalogs = /* @__PURE__ */ new Map(); const resolveThinkingCatalog = async (selection = { provider, model }) => { const key = modelKey(selection.provider, selection.model); const cached = thinkingCatalogs.get(key); if (cached) return cached.length > 0 ? cached : void 0; let catalog = allowedModelCatalog; const hasReasoning = (entries) => findSelectedCatalogEntry({ catalog: entries, provider: selection.provider, model: selection.model })?.reasoning !== void 0; if (!hasReasoning(catalog)) { const manifestCatalog = buildThinkingCatalog(await loadManifestCatalog()); if (hasReasoning(manifestCatalog)) catalog = manifestCatalog; else { const { loadProviderScopedThinkingCatalog } = await loadPreparedModelCatalogRuntime(); const scopedCatalog = buildThinkingCatalog(await loadProviderScopedThinkingCatalog({ config: cfg, agentId: params.agentId, provider: selection.provider, model: selection.model })); if (findSelectedCatalogEntry({ catalog: scopedCatalog, ...selection })) catalog = scopedCatalog; } } thinkingCatalogs.set(key, catalog); return catalog.length > 0 ? catalog : void 0; }; const defaultThinkingLevels = /* @__PURE__ */ new Map(); const resolveDefaultThinkingLevel = async (selection) => { const selectedProvider = selection?.provider ?? provider; const selectedModel = selection?.model ?? model; const cacheKey = `${modelKey(selectedProvider, selectedModel)}\0${selection?.agentRuntime ?? ""}`; const cached = defaultThinkingLevels.get(cacheKey); if (cached) return cached; const agentThinkingDefault = agentEntry?.thinkingDefault; if (agentThinkingDefault) { defaultThinkingLevels.set(cacheKey, agentThinkingDefault); return agentThinkingDefault; } const configuredModels = cfg.agents?.defaults?.models; const canonicalKey = modelKey(selectedProvider, selectedModel); const legacyKey = legacyModelKey(selectedProvider, selectedModel); const resolvedConfiguredModelThinkingDefault = resolveConfiguredModelThinkingDefault(configuredModels?.[canonicalKey]?.params?.thinking ?? (legacyKey ? configuredModels?.[legacyKey]?.params?.thinking : void 0)); if (resolvedConfiguredModelThinkingDefault) { defaultThinkingLevels.set(cacheKey, resolvedConfiguredModelThinkingDefault); return resolvedConfiguredModelThinkingDefault; } const configuredThinkingDefault = agentCfg?.thinkingDefault; if (configuredThinkingDefault) { defaultThinkingLevels.set(cacheKey, configuredThinkingDefault); return configuredThinkingDefault; } const catalogForThinking = await resolveThinkingCatalog(selection); const defaultThinkingLevel = resolveThinkingDefault({ cfg, provider: selectedProvider, model: selectedModel, catalog: catalogForThinking, agentRuntime: selection?.agentRuntime }) ?? "off"; defaultThinkingLevels.set(cacheKey, defaultThinkingLevel); return defaultThinkingLevel; }; const resolveDefaultReasoningLevel = async (selection = { provider, model }) => resolveReasoningDefault({ provider: selection.provider, model: selection.model, catalog: await resolveThinkingCatalog(selection) }); const selectedCatalogEntry = findSelectedCatalogEntry({ catalog: modelCatalog ?? allowedModelCatalog, provider, model }); const configuredModels = cfg.agents?.defaults?.models; const canonicalKey = modelKey(provider, model); const legacyKey = legacyModelKey(provider, model); const configuredModelThinkingDefault = configuredModels?.[canonicalKey]?.params?.thinking ?? (legacyKey ? configuredModels?.[legacyKey]?.params?.thinking : void 0); const hasConfiguredThinkingDefault = agentEntry?.thinkingDefault !== void 0 || resolveConfiguredModelThinkingDefault(configuredModelThinkingDefault) !== void 0 || agentCfg?.thinkingDefault !== void 0; return { provider, model, requestedRouteResolution, modelPolicy: visibilityPolicy, allowedModelKeys, allowedModelCatalog, policyAliasIndex: visibilityPolicy.policyAliasIndex, resetModelOverride, resetModelOverrideRef, resetModelOverrideReason, modelPolicyConfigPath: visibilityPolicy.allowConfigPath ?? void 0, modelPolicyRepairConfigPath: visibilityPolicy.allowRepairConfigPath, resolveThinkingCatalog, resolveDefaultThinkingLevel, hasConfiguredThinkingDefault, resolveDefaultReasoningLevel, needsModelCatalog, modelContextWindow: selectedCatalogEntry?.contextWindow, modelContextTokens: selectedCatalogEntry?.contextTokens }; } //#endregion export { createModelSelectionState as n, isStaleHeartbeatAutoFallbackOverride as r, createFastTestModelSelectionState as t };