openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
186 lines (185 loc) • 6.67 kB
JavaScript
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 };