fix(cron): clean up aborted isolated sessions

This commit is contained in:
Vincent Koc
2026-06-16 14:25:54 +08:00
parent 93ed31e4d6
commit dfbba9aa40
2 changed files with 24 additions and 2 deletions

View File

@@ -2,10 +2,15 @@
import { describe, expect, it } from "vitest";
import { CommandLaneTaskTimeoutError } from "../../process/command-queue.js";
import {
makeIsolatedAgentTurnJob,
makeIsolatedAgentTurnParams,
setupRunCronIsolatedAgentTurnSuite,
} from "./run.suite-helpers.js";
import { loadRunCronIsolatedAgentTurn, runWithModelFallbackMock } from "./run.test-harness.js";
import {
cleanupDirectCronSessionMock,
loadRunCronIsolatedAgentTurn,
runWithModelFallbackMock,
} from "./run.test-harness.js";
const runCronIsolatedAgentTurn = await loadRunCronIsolatedAgentTurn();
@@ -68,10 +73,20 @@ describe("runCronIsolatedAgentTurn - meta.error status propagation", () => {
attempts: [],
});
const result = await runCronIsolatedAgentTurn(makeIsolatedAgentTurnParams());
const result = await runCronIsolatedAgentTurn(
makeIsolatedAgentTurnParams({
job: makeIsolatedAgentTurnJob({ deleteAfterRun: true }),
}),
);
expect(result.status).toBe("error");
expect(result.error).toBe("cron isolated agent run aborted");
expect(cleanupDirectCronSessionMock).toHaveBeenCalledWith({
job: expect.objectContaining({ deleteAfterRun: true }),
agentSessionKey: "agent:default:cron:test",
sessionId: "test-session-id",
retireReason: "cron-delete-after-run-aborted",
});
});
it("surfaces cron timeout result when the cron-nested lane watchdog fires", async () => {

View File

@@ -1081,6 +1081,13 @@ async function finalizeCronRun(params: {
if (finalRunResult.meta?.aborted === true && !cronPayloadOutcome.hasFatalErrorPayload) {
const metaErrorMessage = normalizeOptionalString(finalRunResult.meta.error?.message);
const error = metaErrorMessage ?? "cron isolated agent run aborted";
const { cleanupDirectCronSession } = await loadCronDeliveryRuntime();
await cleanupDirectCronSession({
job: prepared.input.job,
agentSessionKey: prepared.agentSessionKey,
sessionId: prepared.currentRunSessionId(),
retireReason: "cron-delete-after-run-aborted",
});
return prepared.withRunSession({
status: "error",
error,