UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

78 lines (77 loc) 3.68 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; //#region src/config/sessions/cli-session-binding.ts const CLAUDE_CLI_BACKEND_ID = "claude-cli"; 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 CLI session binding for a provider, including legacy Claude state. */ 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 }; if (normalized === CLAUDE_CLI_BACKEND_ID) { const legacy = normalizeOptionalString(entry.claudeCliSessionId); if (legacy) return { sessionId: legacy }; } } function clearAllCliSessions(entry) { entry.cliSessionBindings = void 0; entry.cliSessionIds = void 0; entry.claudeCliSessionId = void 0; } //#endregion export { rebindCliSessionReseedReceiptsForReset as i, getCliSessionBinding as n, normalizeCliSessionReseedReceipt as r, clearAllCliSessions as t };