openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
37 lines (36 loc) • 1.89 kB
JavaScript
import { a as getNodeSqliteKysely, i as executeSqliteQueryTakeFirstSync, r as executeSqliteQuerySync } from "./kysely-sync-K7ftY-g4.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;
executeSqliteQuerySync(db, agentDb.insertInto("heartbeat_outcomes").values(values).onConflict((conflict) => conflict.column("session_key").doUpdateSet({
run_session_key: values.run_session_key,
outcome: values.outcome,
summary: values.summary,
response_reason: values.response_reason,
priority: values.priority,
next_check: values.next_check,
task_names_json: values.task_names_json,
wake_source: values.wake_source,
wake_reason: values.wake_reason,
occurred_at: values.occurred_at,
context_run_id: null,
context_claimed_at: null,
updated_at: values.updated_at
})));
}
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 };