UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

133 lines (132 loc) • 6.93 kB
import { d as readDatabasePathIdentitySync } from "../../sqlite-worker-identity-BRNRpRyc.mjs"; import { r as runSqliteDeferredTransactionSync, t as assertTransactionUsable } from "../../sqlite-transaction-DBRLvCDM.mjs"; import { t as SessionTranscriptWriterClaimReboundError } from "../../session-transcript-writer-claim-error-eP-_sDN9.mjs"; import { n as ok, t as err } from "../../result-BQGgYouL.mjs"; import { l as resolveOpenClawAgentSqlitePath } from "../../openclaw-agent-db.paths-BbmZlEP5.mjs"; import { i as getSqliteWorkerStateContext } from "../../sqlite-worker-state-context-G3Xbcj1W.mjs"; import { c as runOpenClawAgentWriteTransaction, i as getOpenClawAgentDatabaseIfOpen } from "../../openclaw-agent-db-DWI9Bgur.mjs"; import { i as toDatabaseOptions } from "../../session-accessor.sqlite-scope-helpers-CfDTAEsL.mjs"; import "../../transcript-write-context-DwwjCPCE.mjs"; import "../../session-accessor.sqlite-scope-BkgwxatT.mjs"; import { d as readSessionEntryRow } from "../../session-accessor.sqlite-entry-read-69RuwSjJ.mjs"; import { c as readTranscriptContextVersionInTransaction } from "../../session-accessor.sqlite-transcript-state-AbdQy_JW.mjs"; import { i as requestSessionEntryCurrentAdmission } from "../../session-entry-current-admission.worker-CCmS10ef.mjs"; import "../../session-accessor.sqlite-entry-store-CIM2yoGL.mjs"; import { m as advanceCliHistoryBoundaryRangeInTransaction } from "../../session-accessor.sqlite-transcript-store-D63Niwm2.mjs"; import { i as resolveTranscriptAppendRefusal } from "../../session-accessor.sqlite-transcript-write-guard-B9tPlUJx.mjs"; import { a as prepareTranscriptReportSelection, n as appendSelectedTranscriptReportInTransaction, t as appendAbortedSessionTranscriptPartialInTransaction } from "../../session-accessor.sqlite-transcript-reports.kernel-Mo5MHvdq.mjs"; import { isDeepStrictEqual } from "node:util"; //#region src/config/sessions/session-accessor.sqlite-transcript-reports.worker.ts /** Domain binding borrows the existing SQLite broker's canonical writer. */ function bindSqliteWorkerBackend(target, context) { const { fence } = target; const resolved = { ...target.resolved, env: getSqliteWorkerStateContext().environment }; const options = toDatabaseOptions(resolved); const pathname = resolveOpenClawAgentSqlitePath(options); if (!(context.database.location() ? readDatabasePathIdentitySync(pathname).canonicalPath === context.databasePath : pathname === context.databasePath && getOpenClawAgentDatabaseIfOpen(options)?.db === context.database)) throw new Error("Transcript report target changed its database owner"); resolved.path = context.databasePath; options.path = context.databasePath; const database = getOpenClawAgentDatabaseIfOpen(options); if (!database || database.db !== context.database || database.path !== context.databasePath) throw new Error("Transcript report lost its canonical database owner"); const admit = (stage) => context.admit(stage, (request, dispatch) => requestSessionEntryCurrentAdmission(target.sessionEntryCurrentSource, request, { database }, dispatch)); let closed = false; const assertOpen = () => { if (closed || !database.db.isOpen) throw new Error("Transcript report domain is closed"); assertTransactionUsable(database.db); }; const readRefusal = () => resolveTranscriptAppendRefusal(readSessionEntryRow(database, resolved.sessionKey, "list")?.entry, resolved, { ...resolved, ...fence }); let prepared; return { execute(command) { assertOpen(); if (command.type === "prepare") return runSqliteDeferredTransactionSync(database.db, () => { prepared = void 0; const refusal = readRefusal(); if (refusal) return err(refusal); prepared = { facts: prepareTranscriptReportSelection(database, resolved, command.input), version: readTranscriptContextVersionInTransaction(database, resolved.sessionId) }; return ok(prepared.facts); }); return runOpenClawAgentWriteTransaction((current) => { if (current.db !== database.db) throw new Error("Transcript report lost its canonical database owner"); admit("transaction"); const refusal = readRefusal(); if (refusal) { admit("commit"); return err(refusal); } const firstSeq = target.cliWriter ? (readTranscriptContextVersionInTransaction(database, resolved.sessionId).rawSeq ?? -1) + 1 : void 0; let projectionNeedsReconcile = false; const projection = { scheduleProjectionReconcile: false, onProjectionReconcileNeeded: () => { projectionNeedsReconcile = true; } }; let abortedPartial; if (command.type === "abortedPartial") abortedPartial = appendAbortedSessionTranscriptPartialInTransaction(database, resolved, command.input, command.input.preparedMessage, projection); else if (command.type === "assistant") { const facts = prepareTranscriptReportSelection(database, resolved, { kind: "assistant", responseId: command.input.message.responseId }); if (!facts.suppressed) appendSelectedTranscriptReportInTransaction(database, resolved, facts.appendParentId, command.input, projection, command.input.preparedMessage); } else { const plan = prepared; prepared = void 0; if (!plan || plan.facts.suppressed) throw new Error("Transcript report append requires its prepared selection"); const currentVersion = readTranscriptContextVersionInTransaction(database, resolved.sessionId); if (!isDeepStrictEqual(currentVersion, plan.version)) { admit("commit"); return ok({ committed: false, projectionNeedsReconcile: false }); } appendSelectedTranscriptReportInTransaction(database, resolved, plan.facts.appendParentId, command.input, projection); } let commitGranted = false; const authorizeCommit = () => { if (!commitGranted) { admit("commit"); commitGranted = true; } }; const cliHistoryChanged = target.cliWriter && firstSeq !== void 0 ? advanceCliHistoryBoundaryRangeInTransaction(database, resolved, { first: firstSeq, last: readTranscriptContextVersionInTransaction(database, resolved.sessionId).rawSeq ?? -1 }, target.cliWriter, authorizeCommit) : false; const rebound = readRefusal(); if (rebound) throw new SessionTranscriptWriterClaimReboundError(rebound); authorizeCommit(); return ok({ committed: true, projectionNeedsReconcile, cliHistoryChanged, ...abortedPartial ? { abortedPartial, sessionEntryChanged: !abortedPartial.skipped && abortedPartial.append.appended } : {} }); }, options, { operationLabel: "session.transcript.report" }); }, assertSettled() { assertOpen(); if (database.db.isTransaction) throw new Error("Transcript report command left a transaction open"); }, close() { closed = true; prepared = void 0; } }; } //#endregion export { bindSqliteWorkerBackend };