openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
171 lines (170 loc) • 9.24 kB
JavaScript
import { r as createLazyRuntimeModule } from "../lazy-runtime-CJrzFzqU.mjs";
import { t as assertNoActiveSqliteReaders } from "../sqlite-reader-lifecycle-CYQdd96B.mjs";
import { t as assertExistingDatabaseIdentity } from "../sqlite-worker-identity-B_aK_kcL.mjs";
import { t as assertTransactionUsable } from "../sqlite-transaction-DlnLAQiX.mjs";
import { S as assertOpenClawStateDatabaseOwner } from "../openclaw-state-db-existing-schema-CUJtAJx4.mjs";
import { b as retainOpenClawStateDatabase, f as openClawStateDatabaseCache } from "../openclaw-state-db-cache-BEArcjbO.mjs";
import { i as requestSqliteWorkerOperationAdmission, m as SQLITE_WORKER_PREPARE_COMMAND } from "../sqlite-worker-operation-admission-DqFz0WIG.mjs";
import { o as withSqliteWorkerExistingDatabase, r as getSqliteWorkerStateContext } from "../sqlite-worker-state-context-ifl-DKqr.mjs";
import { r as openOpenClawStateDatabase } from "../openclaw-state-db-VZFEEleX.mjs";
import { n as readPluginMetadataStateRowSync } from "../installed-plugin-index-row-N2FcBpmU.mjs";
import { n as pluginStateWorkerOperations, t as isPluginStateWorkerCommand } from "../plugin-state-worker-contract-jJNqV2rs.mjs";
import { n as loadDeviceIdentityIfPresent, r as loadOrCreateDeviceIdentity } from "../device-identity-BsahGUrh.mjs";
import { i as executeOpenClawStateLeaseCommand, t as acquireOpenClawStateLeaseInWorker } from "../openclaw-state-lease-worker-BLSJkljd.mjs";
//#region src/state/openclaw-state.worker.ts
const loadAgentCleanup = createLazyRuntimeModule(() => import("../openclaw-agent-execution-cleanup.worker-C_WKKLa5.mjs"));
let agentCleanup;
const loadPluginState = createLazyRuntimeModule(() => import("../plugin-state.worker-BCt8GcNX.mjs"));
let pluginState;
const loadCapture = createLazyRuntimeModule(() => import("../store.worker-CWbclVfU.mjs"));
let capture;
const loadRuntime = createLazyRuntimeModule(() => import("../openclaw-state-worker-runtime-BMhMVwM7.mjs"));
let runtime;
function stateDatabaseInitializationEnvironment() {
const context = getSqliteWorkerStateContext();
return context.initializationEnvironment ?? context.environment;
}
function createSqliteWorkerBackend(_input, context) {
if (context.preparation?.type === "deviceIdentity") loadOrCreateDeviceIdentity({
path: context.databasePath,
env: stateDatabaseInitializationEnvironment(),
identityKey: context.preparation.identityKey
});
return createSharedStateWorkerBackend(context, openOpenClawStateDatabase({
path: context.databasePath,
env: stateDatabaseInitializationEnvironment(),
initializationAgentPaths: getSqliteWorkerStateContext().initializationAgentPaths
}));
}
function openExistingSqliteWorkerBackend(_input, context) {
const identity = context.existingIdentity;
assertExistingDatabaseIdentity(context.databasePath, identity);
const backend = createSharedStateWorkerBackend(context, void 0, identity);
return {
...backend,
execute(command) {
return withSqliteWorkerExistingDatabase(context.databasePath, identity, () => backend.execute(command));
}
};
}
function createSharedStateWorkerBackend(context, initialDatabase, existingIdentity) {
let nativeDatabase = initialDatabase;
let borrow = nativeDatabase ? retainOpenClawStateDatabase(nativeDatabase) : void 0;
let closed = false;
const open = () => {
if (!nativeDatabase) {
const opened = openOpenClawStateDatabase({
path: context.databasePath,
env: stateDatabaseInitializationEnvironment(),
initializationAgentPaths: getSqliteWorkerStateContext().initializationAgentPaths
});
borrow = retainOpenClawStateDatabase(opened);
nativeDatabase = opened;
}
if (!nativeDatabase.db.isOpen || openClawStateDatabaseCache.getCachedOpenClawStateDatabase(nativeDatabase.path) !== nativeDatabase) throw new Error("Shared-state worker lost its retained native database");
return openOpenClawStateDatabase({
database: nativeDatabase,
path: context.databasePath,
env: getSqliteWorkerStateContext().environment
});
};
return {
[SQLITE_WORKER_PREPARE_COMMAND](commandType) {
if (commandType.startsWith("capture.")) {
if (capture) return;
return loadCapture().then((loaded) => {
capture = loaded;
});
}
if (commandType === "agentDatabases.releaseExitedLease") {
if (agentCleanup) return;
return loadAgentCleanup().then((loaded) => {
agentCleanup = loaded;
});
}
if (Object.hasOwn(pluginStateWorkerOperations, commandType)) {
if (pluginState) return;
return loadPluginState().then((loaded) => {
pluginState = loaded;
});
}
if (commandType === "plugins.metadata.read" || commandType === "database.inspectIdle" || commandType === "database.walMaintenance" || commandType === "stateLease.acquire" || commandType === "deviceIdentity.read" || commandType === "deviceIdentity.load" || commandType === "stateLease.verify" || commandType === "stateLease.renew" || commandType === "stateLease.release") return;
if (runtime) return runtime.prepareSharedStateCommand(commandType);
return loadRuntime().then((loaded) => {
runtime = loaded;
return runtime.prepareSharedStateCommand(commandType);
});
},
execute(command) {
if (closed) throw new Error("Shared-state worker is closed");
if (command.type === "capture.upsertSession" || command.type === "capture.endSession" || command.type === "capture.persistPayload" || command.type === "capture.recordEvent" || command.type === "capture.recordEventWithPayload" || command.type === "capture.listSessions" || command.type === "capture.getSessionEvents" || command.type === "capture.summarizeSessionCoverage" || command.type === "capture.readBlob" || command.type === "capture.queryPreset" || command.type === "capture.deleteSessions" || command.type === "capture.purgeAll") {
if (!capture) throw new Error("Capture worker command runtime is not prepared");
return capture.executeCaptureCommand(command, open());
}
if (command.type === "deviceIdentity.read") return loadDeviceIdentityIfPresent({
path: context.databasePath,
identityKey: command.input.identityKey,
env: getSqliteWorkerStateContext().environment
});
if (command.type === "deviceIdentity.load") try {
return loadOrCreateDeviceIdentity({
path: context.databasePath,
identityKey: command.input.identityKey,
env: stateDatabaseInitializationEnvironment()
});
} finally {
const database = openClawStateDatabaseCache.getCachedOpenClawStateDatabase(context.databasePath);
if (!nativeDatabase && database) {
borrow = retainOpenClawStateDatabase(database);
nativeDatabase = database;
}
}
if (command.type === "agentDatabases.releaseExitedLease") {
if (!agentCleanup) throw new Error("Agent database cleanup runtime is not prepared");
return agentCleanup.executeAgentDatabaseCleanupCommand(command, open(), getSqliteWorkerStateContext().environment);
}
if (command.type === "stateLease.acquire") {
if (command.input.schemaPolicy === "existing" && existingIdentity) assertExistingDatabaseIdentity(context.databasePath, existingIdentity);
return acquireOpenClawStateLeaseInWorker(command.input, context.databasePath, open);
}
if (command.type === "stateLease.verify" || command.type === "stateLease.renew" || command.type === "stateLease.release") return executeOpenClawStateLeaseCommand(command, open());
if (command.type === "plugins.metadata.read") return readPluginMetadataStateRowSync(command.input.selector, {
path: context.databasePath,
env: getSqliteWorkerStateContext().environment
}, command.input.artifactPreservingReadOnly);
if (command.type === "database.walMaintenance") return open().walMaintenance.maintainPeriodic?.(command.input, (stage) => {
requestSqliteWorkerOperationAdmission({
stage,
facts: void 0
});
}) ?? { reclaimedPages: 0 };
if (command.type === "database.inspectIdle") {
if (!nativeDatabase?.db.isOpen || openClawStateDatabaseCache.getCachedOpenClawStateDatabase(nativeDatabase.path) !== nativeDatabase) return "retire";
assertOpenClawStateDatabaseOwner(nativeDatabase.db, { pathname: nativeDatabase.path });
return nativeDatabase.walMaintenance.inspectIdle?.() ?? "retire";
}
if (isPluginStateWorkerCommand(command)) {
if (!pluginState) throw new Error("Plugin-state worker command runtime is not prepared");
return pluginState.executePluginStateCommand(command, {
path: context.databasePath,
env: getSqliteWorkerStateContext().environment
}, open, nativeDatabase?.db.isOpen === true);
}
if (!runtime) throw new Error("Shared-state worker command runtime is not prepared");
return runtime.executeSharedStateCommand(command, context, open);
},
assertSettled() {
if (nativeDatabase) {
assertTransactionUsable(nativeDatabase.db);
if (nativeDatabase.db.isOpen && nativeDatabase.db.isTransaction) throw new Error("Shared-state worker retained an unsettled transaction");
if (nativeDatabase.db.isOpen) assertNoActiveSqliteReaders(nativeDatabase.db, "Shared-state worker");
}
},
close() {
closed = true;
borrow?.release();
}
};
}
//#endregion
export { createSqliteWorkerBackend, openExistingSqliteWorkerBackend };