UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

88 lines (87 loc) • 4.1 kB
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs"; import { r as normalizeProviderId } from "./provider-id-D1VImdKk.mjs"; //#region src/config/sessions/cli-session-binding.ts const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/; function normalizeCliSessionReseedReceipt(value) { const promptHash = normalizeOptionalString(value?.promptHash); const localSessionId = normalizeOptionalString(value?.localSessionId); const userTurnDisposition = value?.userTurnDisposition; if (value?.version !== 1 || !promptHash || !SHA256_HEX_PATTERN.test(promptHash) || !localSessionId || userTurnDisposition !== "persisted" && userTurnDisposition !== "omitted") return; return { version: 1, promptHash, localSessionId, userTurnDisposition }; } /** * Re-own omitted reseed receipts when a reset intentionally preserves the * native CLI conversation. Persisted turns keep their old owner and fail open * because their canonical user row belongs to the archived local transcript. */ function rebindCliSessionReseedReceiptsForReset(bindings, localSessionId) { const normalizedLocalSessionId = normalizeOptionalString(localSessionId); if (!bindings || !normalizedLocalSessionId) return bindings; let rebound; for (const [provider, binding] of Object.entries(bindings)) { const receipt = normalizeCliSessionReseedReceipt(binding.reseedReceipt); if (!receipt || receipt.userTurnDisposition !== "omitted") continue; rebound ??= { ...bindings }; rebound[provider] = { ...binding, reseedReceipt: { ...receipt, localSessionId: normalizedLocalSessionId } }; } return rebound ?? bindings; } /** Read the stored provider-keyed CLI session binding. */ function getCliSessionBinding(entry, provider) { if (!entry) return; const normalized = normalizeProviderId(provider); const fromBindings = entry.cliSessionBindings?.[normalized]; const bindingSessionId = normalizeOptionalString(fromBindings?.sessionId); if (bindingSessionId) return { sessionId: bindingSessionId, resumeCheckpointId: normalizeOptionalString(fromBindings?.resumeCheckpointId), ...fromBindings?.forceReuse === true ? { forceReuse: true } : {}, ...fromBindings?.forkNextResume === true ? { forkNextResume: true } : {}, authProfileId: normalizeOptionalString(fromBindings?.authProfileId), authEpoch: normalizeOptionalString(fromBindings?.authEpoch), authEpochVersion: fromBindings?.authEpochVersion, extraSystemPromptHash: normalizeOptionalString(fromBindings?.extraSystemPromptHash), messageToolPolicyHash: normalizeOptionalString(fromBindings?.messageToolPolicyHash), promptToolNamesHash: normalizeOptionalString(fromBindings?.promptToolNamesHash), cwdHash: normalizeOptionalString(fromBindings?.cwdHash), mcpConfigHash: normalizeOptionalString(fromBindings?.mcpConfigHash), mcpResumeHash: normalizeOptionalString(fromBindings?.mcpResumeHash), reseedReceipt: normalizeCliSessionReseedReceipt(fromBindings?.reseedReceipt) }; const fromMap = entry.cliSessionIds?.[normalized]; const normalizedFromMap = normalizeOptionalString(fromMap); if (normalizedFromMap) return { sessionId: normalizedFromMap }; } function forkCliSessionBindings(parent, supportsFork) { const providers = /* @__PURE__ */ new Set([...Object.keys(parent?.cliSessionBindings ?? {}), ...Object.keys(parent?.cliSessionIds ?? {})]); const forked = {}; for (const provider of providers) { const binding = getCliSessionBinding(parent, provider); if (binding?.resumeCheckpointId && supportsFork(provider)) { const { reseedReceipt: _reseedReceipt, forceReuse: _forceReuse, ...inherited } = binding; forked[normalizeProviderId(provider)] = { ...inherited, forkNextResume: true }; } } return Object.keys(forked).length > 0 ? forked : void 0; } function clearAllCliSessions(entry) { entry.cliSessionBindings = void 0; entry.cliSessionIds = void 0; entry.claudeCliSessionId = void 0; } //#endregion export { rebindCliSessionReseedReceiptsForReset as a, normalizeCliSessionReseedReceipt as i, forkCliSessionBindings as n, getCliSessionBinding as r, clearAllCliSessions as t };