openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
70 lines (69 loc) • 3.27 kB
JavaScript
import { a as asOptionalRecord, c as isRecord, u as readStringField } from "./record-coerce-TIsquoVR.mjs";
import { r as runSqliteDeferredTransactionSync } from "./sqlite-transaction-DBRLvCDM.mjs";
import "./session-key-DY3MOX4N.mjs";
import { h as parseAgentSessionKey } from "./session-key-utils-CDyBC9Gn.mjs";
import { d as readWithCanonicalSessionReaderContinuation } from "./session-canonical-key-BTldoZ8u.mjs";
import { w as shouldPreserveMaintenanceEntry } from "./session-accessor.sqlite-entry-worker-publication-BNeFwCVE.mjs";
import { n as listSqliteSessionEntriesFromDatabase } from "./session-accessor.sqlite-entry-list.read-yRt0ntMz.mjs";
import { n as readSessionStateDeleteSnapshot } from "./session-accessor.sqlite-delete-snapshot-B_yPRYd8.mjs";
import { S as readTranscriptSnapshot } from "./session-accessor.sqlite-read-UBWmiUlC.mjs";
//#region src/config/sessions/cleanup-service-read.kernel.ts
function isTranscriptMessageRole(role) {
return role === "user" || role === "assistant" || role === "tool" || role === "toolResult" || role === "system";
}
function isTranscriptMessageRecord(entry) {
if (!isRecord(entry)) return false;
const record = entry;
if (record.type === "message") return true;
if (record.type === void 0 && isRecord(record.message) && isTranscriptMessageRole(record.message.role)) return true;
return record.type === void 0 && isTranscriptMessageRole(record.role);
}
/** Entries and positive deletion classifications share one admitted read snapshot. */
function readSessionCleanupSnapshotInDatabase(database, request) {
const read = () => {
const entries = listSqliteSessionEntriesFromDatabase(database, {
agentId: database.agentId,
path: database.path,
env: request.env,
sessionKey: ""
}, {});
const store = Object.fromEntries(entries.map(({ sessionKey, entry }) => [sessionKey, entry]));
const missing = [];
if (request.fixMissing) for (const { sessionKey, entry } of entries) {
if ((entry.modelSelectionLocked === true || entry.archivedAt !== void 0) && shouldPreserveMaintenanceEntry({
key: sessionKey,
entry
})) continue;
const legacySessionFile = readStringField(asOptionalRecord(entry), "sessionFile");
if (parseAgentSessionKey(sessionKey) && (entry.initializationPending === true || entry.sessionId === sessionKey && !legacySessionFile?.trim())) continue;
if (!entry.sessionId) {
if (!parseAgentSessionKey(sessionKey)) missing.push({
sessionKey,
expectedEntry: entry,
archiveRemovedTranscript: true
});
continue;
}
try {
const { events } = readTranscriptSnapshot(database, entry.sessionId);
if (events.some(isTranscriptMessageRecord)) continue;
missing.push({
sessionKey,
expectedEntry: entry,
archiveRemovedTranscript: true,
expectedTranscriptSnapshot: readSessionStateDeleteSnapshot(database.db, entry.sessionId)
});
} catch {
continue;
}
}
return {
kind: "session-cleanup",
store,
missing
};
};
return readWithCanonicalSessionReaderContinuation(database, request.continuation, () => request.fixMissing && !database.db.isTransaction ? runSqliteDeferredTransactionSync(database.db, read) : read());
}
//#endregion
export { readSessionCleanupSnapshotInDatabase as t };