fix: bypass empty-heartbeat-file check for cron jobs

Cron jobs with wakeMode: 'now' were being skipped when HEARTBEAT.md
was empty, even though they had pending system events to process.

This adds cron jobs to the bypass list alongside exec events, since
both have the same need: they've already enqueued system events and
need the agent to wake up and process them.

Fixes #4224
This commit is contained in:
radling005 2026-01-29 17:57:24 -06:00
parent 4583f88626
commit 694b029fa9

View File

@ -459,13 +459,14 @@ export async function runHeartbeatOnce(opts: {
// Skip heartbeat if HEARTBEAT.md exists but has no actionable content.
// This saves API calls/costs when the file is effectively empty (only comments/headers).
// EXCEPTION: Don't skip for exec events - they have pending system events to process.
// EXCEPTION: Don't skip for exec events or cron jobs - they have pending system events to process.
const isExecEventReason = opts.reason === "exec-event";
const isCronReason = opts.reason?.startsWith("cron:");
const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId);
const heartbeatFilePath = path.join(workspaceDir, DEFAULT_HEARTBEAT_FILENAME);
try {
const heartbeatFileContent = await fs.readFile(heartbeatFilePath, "utf-8");
if (isHeartbeatContentEffectivelyEmpty(heartbeatFileContent) && !isExecEventReason) {
if (isHeartbeatContentEffectivelyEmpty(heartbeatFileContent) && !isExecEventReason && !isCronReason) {
emitHeartbeatEvent({
status: "skipped",
reason: "empty-heartbeat-file",