UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

28 lines (27 loc) • 1.58 kB
import { a as executeSqliteQueryTakeFirstSync, i as executeSqliteQuerySync, o as getNodeSqliteKysely } from "./kysely-sync-DUWzQvCU.mjs"; //#region src/infra/heartbeat-outcome-store.kernel.ts /** The caller owns the synchronous transaction and its current admission. */ function persistHeartbeatOutcomeInDatabase(db, values) { const agentDb = getNodeSqliteKysely(db); if (!executeSqliteQueryTakeFirstSync(db, agentDb.selectFrom("session_nodes").select("session_key").where("session_key", "=", values.session_key))) return; const { session_key: _sessionKey, ...replacement } = values; executeSqliteQuerySync(db, agentDb.insertInto("heartbeat_outcomes").values(values).onConflict((conflict) => conflict.column("session_key").doUpdateSet({ ...replacement, context_run_id: null, context_claimed_at: null }))); } function claimHeartbeatOutcomeRowInDatabase(db, params) { const agentDb = getNodeSqliteKysely(db); const row = executeSqliteQuerySync(db, agentDb.selectFrom("heartbeat_outcomes").selectAll().where("session_key", "=", params.sessionKey)).rows[0]; if (!row || row.context_run_id !== null && row.context_run_id !== params.runId) return; if (row.context_run_id === null) { if (executeSqliteQuerySync(db, agentDb.updateTable("heartbeat_outcomes").set({ context_run_id: params.runId, context_claimed_at: Date.now() }).where("session_key", "=", params.sessionKey).where("context_run_id", "is", null)).numAffectedRows !== 1n) return; } return row; } //#endregion export { persistHeartbeatOutcomeInDatabase as n, claimHeartbeatOutcomeRowInDatabase as t };