Merge pull request #386 from domocarroll/fix/heartbeat-budget-enforcement

fix: route heartbeat cost recording through costService
This commit is contained in:
Dotta
2026-03-11 21:30:09 -05:00
committed by GitHub

View File

@@ -9,7 +9,6 @@ import {
agentWakeupRequests,
heartbeatRunEvents,
heartbeatRuns,
costEvents,
issues,
projects,
projectWorkspaces,
@@ -22,6 +21,7 @@ import { getServerAdapter, runningProcesses } from "../adapters/index.js";
import type { AdapterExecutionResult, AdapterInvocationMeta, AdapterSessionCodec } from "../adapters/index.js";
import { createLocalAgentJwt } from "../agent-auth-jwt.js";
import { parseObject, asBoolean, asNumber, appendWithCap, MAX_EXCERPT_BYTES } from "../adapters/utils.js";
import { costService } from "./costs.js";
import { secretService } from "./secrets.js";
import { resolveDefaultAgentWorkspaceDir } from "../home-paths.js";
import { summarizeHeartbeatRunResultJson } from "./heartbeat-run-summary.js";
@@ -1025,8 +1025,8 @@ export function heartbeatService(db: Db) {
.where(eq(agentRuntimeState.agentId, agent.id));
if (additionalCostCents > 0 || hasTokenUsage) {
await db.insert(costEvents).values({
companyId: agent.companyId,
const costs = costService(db);
await costs.createEvent(agent.companyId, {
agentId: agent.id,
provider: result.provider ?? "unknown",
model: result.model ?? "unknown",
@@ -1036,16 +1036,6 @@ export function heartbeatService(db: Db) {
occurredAt: new Date(),
});
}
if (additionalCostCents > 0) {
await db
.update(agents)
.set({
spentMonthlyCents: sql`${agents.spentMonthlyCents} + ${additionalCostCents}`,
updatedAt: new Date(),
})
.where(eq(agents.id, agent.id));
}
}
async function startNextQueuedRunForAgent(agentId: string) {