UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

149 lines (148 loc) 6.46 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { u as resolveAgentDir, y as resolveDefaultAgentId } from "./agent-scope-config-DcbEhP0R.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { t as modelKey } from "./model-key-CMdQNkZf.js"; import { y as resolveModelRefFromString } from "./model-selection-shared-BlLyx1r2.js"; import "./agent-scope-DbtJyKUL.js"; import { i as ModelSelectionLockedError } from "./model-overrides-Bm7jo7Di.js"; import { a as SessionWorkStartInvalidatedError } from "./lifecycle-BaroCBMc.js"; import { t as applyModelOverrideWithAuthProfileCompatibility } from "./auth-profile-preservation-DCNwoc5M.js"; import { n as createModelVisibilityPolicy } from "./model-visibility-policy-mYoB7nkk.js"; import { n as isKnownModelSelectionProvider } from "./model-runtime-normalization-CVjCcJkR.js"; import { a as sessionModelOverrideChangesApplied, n as adoptPersistedSessionSnapshot, t as SESSION_MODEL_OVERRIDE_TRANSACTION_FIELDS } from "./session-snapshot-merge-Cf1TdJBp.js"; import { t as resolveModelDirectiveSelection } from "./model-selection-directive-B3DZzVk6.js"; //#region src/auto-reply/reply/session-reset-model.ts /** Applies model override tokens embedded in reset/new command text. */ async function loadResetModelCatalog(params) { const { loadPreparedModelCatalog } = await import("./prepared-model-catalog-BH7NC_p8.js"); return loadPreparedModelCatalog({ config: params.cfg, ...params.agentId ? { agentId: params.agentId } : {}, ...params.agentDir ? { agentDir: params.agentDir } : {}, ...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {}, readOnly: true }); } async function applySelectionToSession(params) { const { selection, sessionEntryHandle, sessionStore, sessionKey, storePath } = params; const sessionEntry = sessionEntryHandle?.getCurrent() ?? params.sessionEntry; if (!sessionEntry || !sessionKey) return true; const initialSessionEntry = { ...sessionEntry }; const nextSessionEntry = { ...sessionEntry }; applyModelOverrideWithAuthProfileCompatibility({ cfg: params.cfg, agentDir: params.agentDir, entry: nextSessionEntry, currentProvider: sessionEntry.providerOverride?.trim() || sessionEntry.modelProvider?.trim() || params.defaultProvider, selection }); let appliedEntry = nextSessionEntry; let selectionApplied = true; if (storePath) { const { persistReplySessionEntry } = await import("./session-entry-persistence-DLekbNEV.js"); const persistence = await persistReplySessionEntry({ storePath, sessionKey, initialEntry: initialSessionEntry, entry: nextSessionEntry, touchedFields: SESSION_MODEL_OVERRIDE_TRANSACTION_FIELDS, requireModelSelectionUnlocked: true }); if (persistence.status === "lifecycle-invalidated") throw new SessionWorkStartInvalidatedError(persistence.error); if (persistence.status === "model-selection-locked") throw new ModelSelectionLockedError(); const persistedEntry = persistence.entry; appliedEntry = persistedEntry; selectionApplied = sessionModelOverrideChangesApplied({ initial: initialSessionEntry, next: nextSessionEntry, current: persistedEntry }); } adoptPersistedSessionSnapshot(sessionEntry, appliedEntry); if (sessionEntryHandle) sessionEntryHandle.replaceCurrent(sessionEntry); else if (sessionStore) sessionStore[sessionKey] = sessionEntry; return selectionApplied; } /** Applies a valid reset model override to session state and returns the cleaned body. */ async function applyResetModelOverride(params) { if (!params.resetTriggered) return {}; const rawBody = normalizeOptionalString(params.bodyStripped); if (!rawBody) return {}; const tokens = rawBody.split(/\s+/).filter(Boolean); const [first, second] = tokens; if (!first) return {}; const catalog = params.modelCatalog ?? await loadResetModelCatalog({ cfg: params.cfg, agentId: params.agentId, agentDir: params.agentDir, workspaceDir: params.workspaceDir }); const modelPolicy = createModelVisibilityPolicy({ cfg: params.cfg, catalog, defaultProvider: params.defaultProvider, defaultModel: params.defaultModel, agentId: params.agentId }); const allowedModelKeys = modelPolicy.allowedKeys; const providers = new Set([...allowedModelKeys].map((key) => key.split("/", 1)[0])); const resolveSelection = (raw, explicitRef = false) => { const parsed = resolveModelRefFromString({ cfg: params.cfg, agentId: params.agentId, raw, defaultProvider: params.defaultProvider, aliasIndex: params.aliasIndex }); if (!parsed) return; const exact = explicitRef || parsed.alias || allowedModelKeys.has(modelKey(parsed.ref.provider, parsed.ref.model)); if (exact && !modelPolicy.allows(parsed.ref) || !exact && !providers.has(normalizeProviderId(raw)) && raw.length < 6) return; const resolved = resolveModelDirectiveSelection({ raw, defaultProvider: params.defaultProvider, defaultModel: params.defaultModel, aliasIndex: params.aliasIndex, allowedModelKeys, modelPolicy, cfg: params.cfg, agentId: params.agentId }).selection; return resolved && (exact || allowedModelKeys.has(modelKey(resolved.provider, resolved.model))) && isKnownModelSelectionProvider({ cfg: params.cfg, catalog, provider: resolved.provider }) ? resolved : void 0; }; let selection; let consumed = 0; if (providers.has(normalizeProviderId(first)) && second) { selection = resolveSelection(`${normalizeProviderId(first)}/${second}`); if (selection) consumed = 2; } if (!selection) { selection = resolveSelection(first, first.includes("/")); if (selection) consumed = 1; } if (!selection) return {}; const cleanedBody = tokens.slice(consumed).join(" ").trim(); params.sessionCtx.commandText = cleanedBody; params.sessionCtx.agentText = cleanedBody; params.sessionCtx.BodyStripped = cleanedBody; params.sessionCtx.BodyForCommands = cleanedBody; return { selection: await applySelectionToSession({ cfg: params.cfg, agentDir: params.agentDir ?? resolveAgentDir(params.cfg, params.agentId ?? resolveDefaultAgentId(params.cfg)), defaultProvider: params.defaultProvider, selection, sessionEntry: params.sessionEntry, sessionEntryHandle: params.sessionEntryHandle, sessionStore: params.sessionStore, sessionKey: params.sessionKey, storePath: params.storePath }) ? selection : void 0, cleanedBody }; } //#endregion export { applyResetModelOverride };