UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

274 lines (273 loc) 10.5 kB
import { v as resolveSessionAgentId } from "./agent-scope-MrLta7Pq.js"; import { a as resolveAgentDir, c as resolveDefaultAgentId } from "./agent-scope-config-CgCYpZfK.js"; import { c as resolveContextConfigProviderForRuntime } from "./openai-routing-DXJmS9CT.js"; import { n as resolveAgentHarnessPolicy } from "./harness-runtimes-B7OdBY2U.js"; import { n as isThinkingLevelSupported, o as resolveSupportedThinkingLevel } from "./thinking-OG7pb4lf.js"; import { d as updateSessionStore } from "./store-Qsgtu-0y.js"; import { o as normalizeProviderId } from "./model-selection-normalize-roKDxQ9_.js"; import "./model-selection-CA_65iXi.js"; import { a as enqueueSystemEvent } from "./system-events-C5WI3S5a.js"; import { o as resolveCliRuntimeModelBackendBinding } from "./cli-backends-CcaQo9wE.js"; import { t as triggerSessionPatchHook } from "./session-patch-hooks-CZLTbSzj.js"; import { t as applyModelOverrideToSessionEntry } from "./model-overrides-D5WaLvcp.js"; import { t as resolveModelSelectionFromDirective } from "./directive-handling.model-selection-Dg075XPZ.js"; import { r as resolveContextTokens } from "./model-selection-DogVFfQv.js"; import { n as applyVerboseOverride, t as applyTraceOverride } from "./level-overrides-D6cD7r8A.js"; import { n as enqueueModeSwitchEvents, t as canPersistSessionDirectiveDefaults } from "./directive-handling.shared-hMR47f5u.js"; //#region src/auto-reply/reply/directive-handling.persist.ts const MODEL_RUNTIME_CLEAR_VALUES = new Set(["auto", "default"]); function resolveModelRuntimeOverride(params) { const rawRuntime = params.rawRuntime?.trim(); if (!rawRuntime) return; const runtime = normalizeProviderId(rawRuntime); if (MODEL_RUNTIME_CLEAR_VALUES.has(runtime)) return { kind: "clear" }; if (runtime === "openclaw") return { kind: "set", runtime: "openclaw" }; if (normalizeProviderId(params.provider) === "openai" && runtime === "codex") return { kind: "set", runtime: "codex" }; const provider = normalizeProviderId(params.provider); const backend = resolveCliRuntimeModelBackendBinding({ config: params.cfg, provider, runtime }); if (backend) return { kind: "set", runtime: backend.runtime }; return { kind: "invalid", runtime: rawRuntime }; } async function persistInlineDirectives(params) { const { directives, cfg, sessionEntry, sessionStore, sessionKey, storePath, elevatedEnabled, elevatedAllowed, defaultProvider, defaultModel, aliasIndex, allowedModelKeys, initialModelLabel, formatModelSwitchEvent, agentCfg } = params; let { provider, model } = params; let thinkingRemap; const allowInternalExecPersistence = canPersistSessionDirectiveDefaults({ messageProvider: params.messageProvider, surface: params.surface, gatewayClientScopes: params.gatewayClientScopes, commandAuthorized: params.commandAuthorized, senderIsOwner: params.senderIsOwner }); const allowInternalVerbosePersistence = canPersistSessionDirectiveDefaults({ messageProvider: params.messageProvider, surface: params.surface, gatewayClientScopes: params.gatewayClientScopes, commandAuthorized: params.commandAuthorized, senderIsOwner: params.senderIsOwner }); const thinkingCatalog = params.thinkingCatalog && params.thinkingCatalog.length > 0 ? params.thinkingCatalog : void 0; const delegatedTraceAllowed = (params.gatewayClientScopes ?? []).includes("operator.admin"); const activeAgentId = sessionKey ? resolveSessionAgentId({ sessionKey, config: cfg }) : resolveDefaultAgentId(cfg); const agentDir = resolveAgentDir(cfg, activeAgentId) ?? params.agentDir; if (sessionEntry && sessionStore && sessionKey) { const prevElevatedLevel = sessionEntry.elevatedLevel ?? agentCfg?.elevatedDefault ?? (elevatedAllowed ? "on" : "off"); const prevReasoningLevel = sessionEntry.reasoningLevel ?? "off"; let elevatedChanged = directives.hasElevatedDirective && directives.elevatedLevel !== void 0 && elevatedEnabled && elevatedAllowed; let reasoningChanged = directives.hasReasoningDirective && directives.reasoningLevel !== void 0; let updated = false; if (directives.clearThinkLevel) { if (sessionEntry.thinkingLevel) { delete sessionEntry.thinkingLevel; updated = true; } } else if (directives.hasThinkDirective && directives.thinkLevel) { sessionEntry.thinkingLevel = directives.thinkLevel; updated = true; } if (directives.clearFastMode) { if (sessionEntry.fastMode !== void 0) { delete sessionEntry.fastMode; updated = true; } } if (directives.hasVerboseDirective && directives.verboseLevel && allowInternalVerbosePersistence) { applyVerboseOverride(sessionEntry, directives.verboseLevel); updated = true; } if (directives.hasTraceDirective && directives.traceLevel && (params.senderIsOwner || delegatedTraceAllowed)) { applyTraceOverride(sessionEntry, directives.traceLevel); updated = true; } if (directives.hasReasoningDirective && directives.reasoningLevel) { if (directives.reasoningLevel === "off") sessionEntry.reasoningLevel = "off"; else sessionEntry.reasoningLevel = directives.reasoningLevel; reasoningChanged = reasoningChanged || directives.reasoningLevel !== prevReasoningLevel && directives.reasoningLevel !== void 0; updated = true; } if (directives.hasElevatedDirective && directives.elevatedLevel && elevatedEnabled && elevatedAllowed) { sessionEntry.elevatedLevel = directives.elevatedLevel; elevatedChanged = elevatedChanged || directives.elevatedLevel !== prevElevatedLevel && directives.elevatedLevel !== void 0; updated = true; } if (directives.hasExecDirective && directives.hasExecOptions && allowInternalExecPersistence) { if (directives.execHost) { sessionEntry.execHost = directives.execHost; updated = true; } if (directives.execSecurity) { sessionEntry.execSecurity = directives.execSecurity; updated = true; } if (directives.execAsk) { sessionEntry.execAsk = directives.execAsk; updated = true; } if (directives.execNode) { sessionEntry.execNode = directives.execNode; updated = true; } } const modelDirective = directives.hasModelDirective && params.effectiveModelDirective ? params.effectiveModelDirective : void 0; let modelUpdated = false; if (modelDirective) { const modelResolution = resolveModelSelectionFromDirective({ directives: { ...directives, hasModelDirective: true, rawModelDirective: modelDirective }, cfg, agentDir, defaultProvider, defaultModel, aliasIndex, allowedModelKeys, allowedModelCatalog: [], provider }); if (modelResolution.modelSelection) { const appliedModelOverride = applyModelOverrideToSessionEntry({ entry: sessionEntry, selection: modelResolution.modelSelection, profileOverride: modelResolution.profileOverride, markLiveSwitchPending: params.markLiveSwitchPending }); const runtimeOverride = resolveModelRuntimeOverride({ rawRuntime: directives.rawModelRuntime, provider: modelResolution.modelSelection.provider, cfg }); if (runtimeOverride?.kind === "clear") { if (sessionEntry.agentRuntimeOverride) { delete sessionEntry.agentRuntimeOverride; updated = true; } } else if (runtimeOverride?.kind === "set") { if (sessionEntry.agentRuntimeOverride) { delete sessionEntry.agentRuntimeOverride; updated = true; } enqueueSystemEvent(`Ignored session runtime ${runtimeOverride.runtime}; configure provider or model runtime policy instead.`, { sessionKey, contextKey: `model-runtime:${modelResolution.modelSelection.provider}:${runtimeOverride.runtime}:ignored-session-runtime` }); } else if (runtimeOverride?.kind === "invalid") { if (sessionEntry.agentRuntimeOverride) { delete sessionEntry.agentRuntimeOverride; updated = true; } enqueueSystemEvent(`Ignored unsupported runtime ${runtimeOverride.runtime} for ${modelResolution.modelSelection.provider}.`, { sessionKey, contextKey: `model-runtime:${modelResolution.modelSelection.provider}:${runtimeOverride.runtime}` }); } modelUpdated = appliedModelOverride.updated; provider = modelResolution.modelSelection.provider; model = modelResolution.modelSelection.model; const currentThinkingLevel = sessionEntry.thinkingLevel; if (currentThinkingLevel && !directives.hasThinkDirective && !isThinkingLevelSupported({ provider, model, level: currentThinkingLevel, catalog: thinkingCatalog })) { const remappedThinkingLevel = resolveSupportedThinkingLevel({ provider, model, level: currentThinkingLevel, catalog: thinkingCatalog }); if (remappedThinkingLevel !== currentThinkingLevel) { sessionEntry.thinkingLevel = remappedThinkingLevel; thinkingRemap = { from: currentThinkingLevel, to: remappedThinkingLevel, provider, model }; updated = true; } } const nextLabel = `${provider}/${model}`; if (nextLabel !== initialModelLabel) enqueueSystemEvent(formatModelSwitchEvent(nextLabel, modelResolution.modelSelection.alias), { sessionKey, contextKey: `model:${nextLabel}` }); updated = updated || modelUpdated; } } if (directives.hasQueueDirective && directives.queueReset) { delete sessionEntry.queueMode; delete sessionEntry.queueDebounceMs; delete sessionEntry.queueCap; delete sessionEntry.queueDrop; updated = true; } if (updated) { sessionEntry.updatedAt = Date.now(); sessionStore[sessionKey] = sessionEntry; if (storePath) await updateSessionStore(storePath, (store) => { store[sessionKey] = sessionEntry; }); if (modelDirective && modelUpdated) triggerSessionPatchHook({ cfg, sessionEntry, sessionKey, patch: { key: sessionKey, model: modelDirective } }); enqueueModeSwitchEvents({ enqueueSystemEvent, sessionEntry, sessionKey, elevatedChanged, reasoningChanged }); } } return { provider, model, thinkingRemap, contextTokens: resolveContextTokens({ cfg, agentCfg, provider: resolveContextConfigProviderForRuntime({ provider, runtimeId: resolveAgentHarnessPolicy({ provider, modelId: model, config: cfg, agentId: activeAgentId, sessionKey }).runtime, config: cfg }), model }) }; } //#endregion export { persistInlineDirectives };