openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
51 lines (50 loc) • 1.83 kB
JavaScript
import { o as isRecord } from "./record-coerce-DHZ4bFlT.js";
import { d as validateSessionId } from "./paths-NEwU8m3X.js";
//#region src/config/sessions/store-entry-shape.ts
function isSafeSessionId(value) {
if (typeof value !== "string") return false;
const trimmed = value.trim();
if (!trimmed || trimmed.length > 255) return false;
if (trimmed.includes("/") || trimmed.includes("\\") || trimmed === "." || trimmed === "..") return false;
return /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/.test(trimmed);
}
function normalizeTranscriptSessionId(value) {
try {
return validateSessionId(value);
} catch {
return;
}
}
function normalizeOptionalTimestamp(value) {
if (value === void 0) return;
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
}
/** Normalizes persisted session store entries before they reach runtime callers. */
function normalizePersistedSessionEntryShape(value) {
if (!isRecord(value)) return;
let next = value;
const sessionFile = typeof value.sessionFile === "string" ? value.sessionFile.trim() : void 0;
if (value.sessionId !== void 0) {
if (!isSafeSessionId(value.sessionId)) return;
const sessionId = value.sessionId.trim();
if (!normalizeTranscriptSessionId(sessionId) && !sessionFile) {
const { sessionId: _dropSessionId, ...rest } = next;
next = rest;
} else if (sessionId !== value.sessionId) next = {
...next,
sessionId
};
}
if (value.sessionFile !== void 0 && typeof value.sessionFile !== "string") {
if (next === value) next = { ...next };
delete next.sessionFile;
}
const updatedAt = normalizeOptionalTimestamp(value.updatedAt);
if (updatedAt !== value.updatedAt) {
if (next === value) next = { ...next };
next.updatedAt = updatedAt ?? 0;
}
return next;
}
//#endregion
export { normalizePersistedSessionEntryShape as t };