fix(checkpoint): fail closed on pause queries

This commit is contained in:
ZacharyZhang-NY committed 2026-04-23 18:58:06 -04:00
1 parent a99bcb97c6
commit f8a90f4402
3 files changed
+32 -6

No files matched your search

+1 -1
View File
@@ -157,7 +157,7 @@ export function createCheckpointEngine(deps: CheckpointDeps) {
return db.core.approvals.hasPendingReviewApprovalForAgent(companyId, agentId);
} catch (err) {
logger.error(`[checkpoint] shouldPauseHeartbeat failed: ${err instanceof Error ? err.message : String(err)}`);
return false;
return true;
}
},
+4 -4
View File
@@ -324,8 +324,8 @@ export function createThreadIntegration({ db, logger, emitEvent, publishDomainCh
const waitStates = db.core.threads.listThreadWaitStates(companyId);
return waitStates.length > 0;
} catch (err) {
logger.warn(`[thread-integration] hasUnresolvedWaitStates query failed for company ${companyId}:`, err instanceof Error ? err.message : String(err));
return false;
logger.warn(`[thread-integration] hasUnresolvedWaitStates query failed for company ${companyId}; treating as blocked:`, err instanceof Error ? err.message : String(err));
return true;
}
},
@@ -339,8 +339,8 @@ export function createThreadIntegration({ db, logger, emitEvent, publishDomainCh
try {
return db.core.threads.hasUnresolvedWaitStateForAgent(companyId, agentId);
} catch (err) {
logger.warn(`[thread-integration] hasUnresolvedWaitStatesForAgent query failed (company=${companyId} agent=${agentId}):`, err instanceof Error ? err.message : String(err));
return false;
logger.warn(`[thread-integration] hasUnresolvedWaitStatesForAgent query failed (company=${companyId} agent=${agentId}); treating as blocked:`, err instanceof Error ? err.message : String(err));
return true;
}
},
@@ -1,7 +1,7 @@
import { mkdtemp, rm } from "node:fs/promises";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { afterEach, describe, expect, it } from "vitest";
import { afterEach, describe, expect, it, vi } from "vitest";
import { AppDatabase } from "../../src/main/database";
import { createThreadIntegration } from "../../src/main/thread-integration";
import { createCheckpointEngine } from "../../src/main/checkpoint-engine";
@@ -250,4 +250,30 @@ describe("thread wait + heartbeat integration", () => {
db.close();
});
it("keeps co-founder heartbeat paused when wait-state lookup fails", async () => {
const profileDir = await createTempDir("agentcompany-wait-query-fail-");
const db = new AppDatabase(profileDir);
db.init();
const { companyId, engineerId } = createScaffold(db);
const threadIntegration = createThreadIntegration({
db,
logger: createNoopLogger(),
});
const checkpointEngine = createCheckpointEngine({
db,
logger: createNoopLogger(),
threadIntegration,
publishDomainChanged: () => {},
notify: () => {},
});
vi.spyOn(db.core.threads, "hasUnresolvedWaitStateForAgent").mockImplementation(() => {
throw new Error("wait-state query failed");
});
expect(checkpointEngine.shouldPauseHeartbeat(companyId, engineerId)).toBe(true);
db.close();
});
});