UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

70 lines (69 loc) • 3.27 kB
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 };