openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
28 lines (27 loc) • 1.58 kB
JavaScript
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 };