UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

186 lines (185 loc) 6.67 kB
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js"; import { t as loadSessionStore } from "./store-load-C4uq6Lrq.js"; import { d as updateSessionStore } from "./store-Qsgtu-0y.js"; import { t as loadCombinedSessionStoreForGateway } from "./combined-store-gateway-Drfj1Kad.js"; import "./sessions-D6zZvoxX.js"; import { d as migrateAndPruneGatewaySessionStoreKey, g as resolveGatewaySessionStoreTarget, i as filterAndSortSessionEntries, p as resolveDeletedAgentIdFromSessionKey, s as listSessionsFromStore } from "./session-utils-CHNCuY8a.js"; import { r as parseSessionLabel } from "./openclaw-tools-C0nKaVVY.js"; import { n as resolveSessionIdMatchSelection } from "./session-id-resolution-CcSU7jfY.js"; import { in as errorShape, rn as ErrorCodes } from "./schema-BwaBORnA.js"; import "./src-oj0IwW6K.js"; //#region src/gateway/sessions-resolve.ts function resolveSessionVisibilityFilterOptions(p) { return { includeGlobal: p.includeGlobal === true, includeUnknown: p.includeUnknown === true, spawnedBy: p.spawnedBy, agentId: p.agentId }; } function noSessionFoundResult(key) { return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, `No session found: ${key}`) }; } /** Rejects sessions whose owning agent no longer exists in config (#65524). */ function validateSessionAgentExists(cfg, key, entry, options) { const deletedAgentId = resolveDeletedAgentIdFromSessionKey(cfg, key, entry, options); if (deletedAgentId === null) return null; return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, `Agent "${deletedAgentId}" no longer exists in configuration`) }; } function isResolvedSessionKeyVisible(params) { if (typeof params.p.spawnedBy !== "string" || params.p.spawnedBy.trim().length === 0) return true; return filterAndSortSessionEntries({ cfg: params.cfg, store: params.store, now: Date.now(), opts: resolveSessionVisibilityFilterOptions(params.p) }).some(([key]) => key === params.key); } function findVisibleSessionIdMatches(params) { const now = Date.now(); return filterAndSortSessionEntries({ cfg: params.cfg, store: params.store, now, opts: resolveSessionVisibilityFilterOptions(params.p) }).filter(([key, entry]) => entry?.sessionId === params.sessionId || key === params.sessionId); } async function resolveSessionKeyFromResolveParams(params) { const { cfg, p } = params; const key = normalizeOptionalString(p.key) ?? ""; const hasKey = key.length > 0; const sessionId = normalizeOptionalString(p.sessionId) ?? ""; const hasSessionId = sessionId.length > 0; const selectionCount = [ hasKey, hasSessionId, (normalizeOptionalString(p.label) ?? "").length > 0 ].filter(Boolean).length; if (selectionCount > 1) return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, "Provide either key, sessionId, or label (not multiple)") }; if (selectionCount === 0) return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, "Either key, sessionId, or label is required") }; if (hasKey) { const target = resolveGatewaySessionStoreTarget({ cfg, key }); const store = loadSessionStore(target.storePath); if (store[target.canonicalKey]) { if (!isResolvedSessionKeyVisible({ cfg, p, storePath: target.storePath, store, key: target.canonicalKey })) return noSessionFoundResult(key); const agentCheck = validateSessionAgentExists(cfg, target.canonicalKey, store[target.canonicalKey], { acpMetadataSessionKey: target.canonicalKey }); if (agentCheck) return agentCheck; return { ok: true, key: target.canonicalKey }; } const legacyKey = target.storeKeys.find((candidate) => store[candidate]); if (!legacyKey) return noSessionFoundResult(key); await updateSessionStore(target.storePath, (s) => { const { primaryKey } = migrateAndPruneGatewaySessionStoreKey({ cfg, key, store: s }); if (!s[primaryKey] && s[legacyKey]) s[primaryKey] = s[legacyKey]; }); const migratedStore = loadSessionStore(target.storePath); if (!isResolvedSessionKeyVisible({ cfg, p, storePath: target.storePath, store: migratedStore, key: target.canonicalKey })) return noSessionFoundResult(key); const agentCheckLegacy = validateSessionAgentExists(cfg, target.canonicalKey, migratedStore[target.canonicalKey], { acpMetadataSessionKey: target.canonicalKey }); if (agentCheckLegacy) return agentCheckLegacy; return { ok: true, key: target.canonicalKey }; } if (hasSessionId) { const { store } = loadCombinedSessionStoreForGateway(cfg, { agentId: p.agentId }); const matches = findVisibleSessionIdMatches({ cfg, store, p, sessionId }); const selection = resolveSessionIdMatchSelection(matches, sessionId); if (selection.kind === "none") return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, `No session found: ${sessionId}`) }; if (selection.kind === "ambiguous") { const keys = selection.sessionKeys.join(", "); return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, `Multiple sessions found for sessionId: ${sessionId} (${keys})`) }; } const selectedEntry = matches.find(([matchKey]) => matchKey === selection.sessionKey)?.[1]; const agentCheckSessionId = validateSessionAgentExists(cfg, selection.sessionKey, selectedEntry); if (agentCheckSessionId) return agentCheckSessionId; return { ok: true, key: selection.sessionKey }; } const parsedLabel = parseSessionLabel(p.label); if (!parsedLabel.ok) return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, parsedLabel.error) }; const { storePath, store } = loadCombinedSessionStoreForGateway(cfg, { agentId: p.agentId }); const list = listSessionsFromStore({ cfg, storePath, store, opts: { includeGlobal: p.includeGlobal === true, includeUnknown: p.includeUnknown === true, label: parsedLabel.label, agentId: p.agentId, spawnedBy: p.spawnedBy, limit: 2 } }); if (list.sessions.length === 0) return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, `No session found with label: ${parsedLabel.label}`) }; if (list.sessions.length > 1) { const keys = list.sessions.map((s) => s.key).join(", "); return { ok: false, error: errorShape(ErrorCodes.INVALID_REQUEST, `Multiple sessions found with label: ${parsedLabel.label} (${keys})`) }; } const labelKey = list.sessions[0].key; const agentCheckLabel = validateSessionAgentExists(cfg, labelKey, store[labelKey]); if (agentCheckLabel) return agentCheckLabel; return { ok: true, key: list.sessions[0].key }; } //#endregion export { resolveSessionKeyFromResolveParams as t };