|
6 | 6 | } from "./run.suite-helpers.js"; |
7 | 7 | import { |
8 | 8 | buildWorkspaceSkillSnapshotMock, |
| 9 | + dispatchCronDeliveryMock, |
9 | 10 | getCliSessionIdMock, |
10 | 11 | isCliProviderMock, |
11 | 12 | lookupContextTokensMock, |
@@ -257,6 +258,40 @@ describe("runCronIsolatedAgentTurn — skill filter", () => { |
257 | 258 | }); |
258 | 259 |
|
259 | 260 | describe("CLI session handoff (issue #29774)", () => { |
| 261 | + it("passes the cron abort signal to CLI runs and drops late CLI results", async () => { |
| 262 | + const abortController = new AbortController(); |
| 263 | + let markCliStarted!: () => void; |
| 264 | + const cliStarted = new Promise<void>((resolve) => { |
| 265 | + markCliStarted = resolve; |
| 266 | + }); |
| 267 | + |
| 268 | + isCliProviderMock.mockReturnValue(true); |
| 269 | + runCliAgentMock.mockImplementationOnce(async (params: { abortSignal?: AbortSignal }) => { |
| 270 | + expect(params.abortSignal).toBe(abortController.signal); |
| 271 | + markCliStarted(); |
| 272 | + await new Promise<void>((resolve) => { |
| 273 | + params.abortSignal?.addEventListener("abort", () => resolve(), { once: true }); |
| 274 | + }); |
| 275 | + return { |
| 276 | + payloads: [{ text: "late cli output" }], |
| 277 | + meta: { agentMeta: { sessionId: "late-cli-session", usage: { input: 5, output: 10 } } }, |
| 278 | + }; |
| 279 | + }); |
| 280 | + mockCliFallbackInvocation(); |
| 281 | + |
| 282 | + const runPromise = runCronIsolatedAgentTurn( |
| 283 | + makeSkillParams({ abortSignal: abortController.signal }), |
| 284 | + ); |
| 285 | + await cliStarted; |
| 286 | + abortController.abort("cron: job execution timed out"); |
| 287 | + |
| 288 | + const result = await runPromise; |
| 289 | + |
| 290 | + expect(result.status).toBe("error"); |
| 291 | + expect(result.error).toBe("cron: job execution timed out"); |
| 292 | + expect(dispatchCronDeliveryMock).not.toHaveBeenCalled(); |
| 293 | + }); |
| 294 | + |
260 | 295 | it("does not pass stored cliSessionId on fresh isolated runs (isNewSession=true)", async () => { |
261 | 296 | // Simulate a persisted CLI session ID from a previous run. |
262 | 297 | getCliSessionIdMock.mockReturnValue("prev-cli-session-abc"); |
|
0 commit comments