UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

69 lines (68 loc) • 3.55 kB
import { t as hasErrnoCode } from "./errno-FR4CRyya.mjs"; import { r as hasOpenClawStateTablesBeyondStartupCheckpoint } from "./openclaw-state-db-schema-helpers-DKz5xGgh.mjs"; import { i as isSqliteSchemaVersionError } from "./sqlite-user-version-DLMl1A7W.mjs"; import { c as resolveOpenClawStateSqlitePath, r as resolveDatabasePath } from "./openclaw-state-db.paths-CmKkMYdo.mjs"; import { u as PluginStateStoreError } from "./openclaw-state-worker-error-Bi-BnNrV.mjs"; import { s as isTerminalSqliteIntegrityError } from "./sqlite-integrity-D3yHPOet.mjs"; import { f as isOpenClawStateDatabaseOpen } from "./openclaw-state-db-cache-CmYLFRSt.mjs"; import { l as runOpenClawStateWriteTransaction, r as openOpenClawStateDatabase } from "./openclaw-state-db-DJZ7EKoI.mjs"; import { u as withExistingOpenClawStateDatabaseReadOnly } from "./openclaw-state-db-readonly-ywwvuxdQ.mjs"; import { s as createPluginStateError } from "./plugin-state-store.kernel-tvf2UnQN.mjs"; //#region src/plugin-state/plugin-state-store.database.ts function wrapPluginStateError(error, operation, fallbackCode, message, pathname = resolveOpenClawStateSqlitePath(process.env)) { if (error instanceof PluginStateStoreError) return error; let publicMessage = message; if (fallbackCode === "PLUGIN_STATE_OPEN_FAILED") { if (isSqliteSchemaVersionError(error)) publicMessage += "\nThe state database uses a newer schema. Run an OpenClaw build that supports it."; else if (error instanceof Error && isTerminalSqliteIntegrityError(error)) publicMessage += "\nDatabase integrity verification failed. Restore or repair the state database, then run openclaw doctor --fix."; } return createPluginStateError({ code: fallbackCode, operation, message: publicMessage, path: pathname, cause: error }); } function openPluginStateDatabase(operation = "open", options = {}) { const env = options.env ?? process.env; const pathname = resolveOpenClawStateSqlitePath(env); try { return openOpenClawStateDatabase(options); } catch (error) { throw wrapPluginStateError(error, operation, "PLUGIN_STATE_OPEN_FAILED", "Failed to open the plugin state database.", pathname); } } function isMissingPluginStateTableError(error) { return error instanceof Error && hasErrnoCode(error, "ERR_SQLITE_ERROR") && error.message === "no such table: plugin_state_entries"; } /** Read plugin state without joining the shared writable database lifecycle. */ function withPluginStateDatabaseReadOnly(operationName, operation, options = {}) { const pathname = resolveDatabasePath(options); let operationStarted = false; try { return withExistingOpenClawStateDatabaseReadOnly(({ db, path }) => { operationStarted = true; try { return operation({ db, path }); } catch (error) { if (isMissingPluginStateTableError(error)) { if (!hasOpenClawStateTablesBeyondStartupCheckpoint(db)) return; } throw error; } }, options); } catch (error) { if (!operationStarted) throw wrapPluginStateError(error, operationName, "PLUGIN_STATE_OPEN_FAILED", "Failed to open the plugin state database.", pathname); throw error; } } function runWriteTransaction(operation, write, options = {}) { if (!isOpenClawStateDatabaseOpen(resolveOpenClawStateSqlitePath(options.env ?? process.env))) openPluginStateDatabase(operation, options); return runOpenClawStateWriteTransaction(write, options, { operationLabel: `pluginState.${operation}` }); } //#endregion export { withPluginStateDatabaseReadOnly as n, wrapPluginStateError as r, runWriteTransaction as t };