|
1 | | -import { describe, expect, test } from "bun:test"; |
| 1 | +import { describe, expect, spyOn, test } from "bun:test"; |
| 2 | +import { getLogger } from "@intx/log"; |
| 3 | +import { LOG_NAMESPACE_ROOT } from "../branding.js"; |
2 | 4 |
|
3 | 5 | import { |
4 | 6 | createSubAgentSessionStore, |
@@ -656,24 +658,36 @@ describe("CL-6943 reusable worker sessions", () => { |
656 | 658 | }); |
657 | 659 |
|
658 | 660 | test("rejected followup restores strip status so interrupt_agent fails closed", async () => { |
659 | | - const store = createSubAgentSessionStore(); |
660 | | - const session = retainedSession(store, { |
661 | | - interrupt: true, |
662 | | - followup: async () => { |
663 | | - throw new Error("send failed"); |
664 | | - }, |
665 | | - complete: "## Summary\nDone.", |
666 | | - }); |
667 | | - resumeCompleted(store, session.id); |
668 | | - await new Promise((resolve) => setTimeout(resolve, 0)); |
669 | | - |
670 | | - const after = store.get(session.id); |
671 | | - expect(after?.status).toBe("done"); |
672 | | - expect(after?.lifecycleStatus).toBe("completed"); |
673 | | - expect(store.interruptOne(session.id)).toEqual({ |
674 | | - ok: false, |
675 | | - status: "completed", |
676 | | - }); |
| 661 | + const errorLog = spyOn( |
| 662 | + getLogger([LOG_NAMESPACE_ROOT, "subagent", "session-store"]), |
| 663 | + "error", |
| 664 | + ); |
| 665 | + try { |
| 666 | + const store = createSubAgentSessionStore(); |
| 667 | + const session = retainedSession(store, { |
| 668 | + interrupt: true, |
| 669 | + followup: async () => { |
| 670 | + throw new Error("send failed"); |
| 671 | + }, |
| 672 | + complete: "## Summary\nDone.", |
| 673 | + }); |
| 674 | + resumeCompleted(store, session.id); |
| 675 | + await new Promise((resolve) => setTimeout(resolve, 0)); |
| 676 | + |
| 677 | + const after = store.get(session.id); |
| 678 | + expect(after?.status).toBe("done"); |
| 679 | + expect(after?.lifecycleStatus).toBe("completed"); |
| 680 | + expect(store.interruptOne(session.id)).toEqual({ |
| 681 | + ok: false, |
| 682 | + status: "completed", |
| 683 | + }); |
| 684 | + expect(errorLog).toHaveBeenCalledWith( |
| 685 | + "followup turn failed for {id}: {error}", |
| 686 | + { id: session.id, error: "send failed" }, |
| 687 | + ); |
| 688 | + } finally { |
| 689 | + errorLog.mockRestore(); |
| 690 | + } |
677 | 691 | }); |
678 | 692 |
|
679 | 693 | test("rejected followup after interrupt restamps stopReason interrupted", async () => { |
|
0 commit comments