@@ -2,10 +2,15 @@
|
2 | 2 | import { describe, expect, it } from "vitest"; |
3 | 3 | import { CommandLaneTaskTimeoutError } from "../../process/command-queue.js"; |
4 | 4 | import { |
| 5 | +makeIsolatedAgentTurnJob, |
5 | 6 | makeIsolatedAgentTurnParams, |
6 | 7 | setupRunCronIsolatedAgentTurnSuite, |
7 | 8 | } from "./run.suite-helpers.js"; |
8 | | -import { loadRunCronIsolatedAgentTurn, runWithModelFallbackMock } from "./run.test-harness.js"; |
| 9 | +import { |
| 10 | +cleanupDirectCronSessionMock, |
| 11 | +loadRunCronIsolatedAgentTurn, |
| 12 | +runWithModelFallbackMock, |
| 13 | +} from "./run.test-harness.js"; |
9 | 14 | |
10 | 15 | const runCronIsolatedAgentTurn = await loadRunCronIsolatedAgentTurn(); |
11 | 16 | |
@@ -54,6 +59,36 @@ describe("runCronIsolatedAgentTurn - meta.error status propagation", () => {
|
54 | 59 | expect(result.outputText).toBe("cron isolated run failed: retry limit exceeded"); |
55 | 60 | }); |
56 | 61 | |
| 62 | +it("marks an aborted embedded agent run without a run-level error as a cron error", async () => { |
| 63 | +runWithModelFallbackMock.mockResolvedValueOnce({ |
| 64 | +result: { |
| 65 | +payloads: [], |
| 66 | +meta: { |
| 67 | +aborted: true, |
| 68 | +agentMeta: { usage: { input: 0, output: 0 } }, |
| 69 | +}, |
| 70 | +}, |
| 71 | +provider: "openai", |
| 72 | +model: "gpt-5.4", |
| 73 | +attempts: [], |
| 74 | +}); |
| 75 | + |
| 76 | +const result = await runCronIsolatedAgentTurn( |
| 77 | +makeIsolatedAgentTurnParams({ |
| 78 | +job: makeIsolatedAgentTurnJob({ deleteAfterRun: true }), |
| 79 | +}), |
| 80 | +); |
| 81 | + |
| 82 | +expect(result.status).toBe("error"); |
| 83 | +expect(result.error).toBe("cron isolated agent run aborted"); |
| 84 | +expect(cleanupDirectCronSessionMock).toHaveBeenCalledWith({ |
| 85 | +job: expect.objectContaining({ deleteAfterRun: true }), |
| 86 | +agentSessionKey: "agent:default:cron:test", |
| 87 | +sessionId: "test-session-id", |
| 88 | +retireReason: "cron-delete-after-run-aborted", |
| 89 | +}); |
| 90 | +}); |
| 91 | + |
57 | 92 | it("surfaces cron timeout result when the cron-nested lane watchdog fires", async () => { |
58 | 93 | runWithModelFallbackMock.mockRejectedValueOnce( |
59 | 94 | new CommandLaneTaskTimeoutError("cron-nested", 330_000), |
|