UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

83 lines (82 loc) • 3.84 kB
import { c as isRecord } from "../record-coerce-TIsquoVR.mjs"; import { c as withSqlitePostCommitPublications } from "../sqlite-post-commit-DENvzR6w.mjs"; import { s as runSqliteWorkerTransactionSync, t as assertTransactionUsable } from "../sqlite-transaction-DBRLvCDM.mjs"; import { i as sessionChanges } from "../session-row-changes-Dj2yVWo-.mjs"; import { i as getSqliteWorkerStateContext } from "../sqlite-worker-state-context-G3Xbcj1W.mjs"; import { i as getOpenClawAgentDatabaseIfOpen } from "../openclaw-agent-db-DWI9Bgur.mjs"; import { r as BoardValidationError } from "../board-layout-6DyK3jbx.mjs"; import { t as readSessionSourceValidation } from "../session-source-predicate.worker-BPzqDAQ2.mjs"; import { a as putBoardWidgetInDatabase, i as hasBoardSession, l as normalizeBoardWidgetPutParams, n as ensureBoardSchema, r as grantBoardWidgetInDatabase, t as applyBoardOpsToDatabase } from "../sqlite-board-store.kernel-DgDGNaxo.mjs"; //#region src/boards/sqlite-board-store.worker.ts function bindSqliteWorkerBackend(input, context) { const database = { db: context.database, path: context.databasePath }; const canonical = input && getOpenClawAgentDatabaseIfOpen({ agentId: input.agentId, path: context.databasePath, env: getSqliteWorkerStateContext().environment }); if (input && (!canonical || canonical.db !== context.database)) throw new Error("Board publication lost its canonical database owner"); const admission = { ...context, admit(stage) { const validation = input && canonical && readSessionSourceValidation(canonical, input.sources); context.admit(stage, validation ? (request, dispatch) => { if (!isRecord(request.facts)) throw new Error("Board admission omitted its database identity"); dispatch({ ...request, facts: { ...request.facts, boardSourceValidation: validation } }); } : void 0); if (validation?.refusedSource) throw new Error("Board source refusal was not rejected"); } }; ensureBoardSchema(database); let closed = false; return { execute(command) { if (closed) throw new Error("Board publication scope is closed"); const assertSessionCurrent = () => { if (input && (command.input.sessionKey !== input.sessionKey || !hasBoardSession(database, input.sessionKey, input.expectedSession))) throw new BoardValidationError("invalid_operation", "board session changed; retry"); }; const changes = []; const unsubscribe = sessionChanges.subscribeFacts((change) => { if ("sessionKey" in change && change.sessionKey === command.input.sessionKey && change.storePath === database.path) changes.push(change); }); try { return { value: withSqlitePostCommitPublications(database.db, () => runSqliteWorkerTransactionSync(admission, () => { assertSessionCurrent(); if (command.type === "boards.applyOps") return applyBoardOpsToDatabase(database, command.input.sessionKey, command.input.ops); if (command.type === "boards.putWidget") return putBoardWidgetInDatabase(database, command.input.sessionKey, normalizeBoardWidgetPutParams(command.input.params, command.input.sessionKey), command.input.viewGeneration); return grantBoardWidgetInDatabase(database, command.input.sessionKey, command.input.name, command.input.decision, command.input.revision, command.input.instanceId); }, { databaseLabel: database.path, operationLabel: command.type, withCommit(commit) { assertSessionCurrent(); return commit(); } })), changes }; } finally { unsubscribe(); } }, assertSettled() { assertTransactionUsable(database.db); if (database.db.isTransaction) throw new Error("Board publication left an unsettled transaction"); }, close() { closed = true; } }; } //#endregion export { bindSqliteWorkerBackend };