@@ -1551,6 +1551,51 @@ describe("createCopilotAgentHarness", () => {
|
1551 | 1551 | await flushAsyncWork(); |
1552 | 1552 | }); |
1553 | 1553 | |
| 1554 | +it("clears the reset block when storing a replacement session fails", async () => { |
| 1555 | +const cleanup = createDeferred<"aborted" | "completed" | "deadline">(); |
| 1556 | +const sessionStore = makeSessionStoreMock(); |
| 1557 | +sessionStore.store.register.mockImplementation(() => { |
| 1558 | +throw new Error("sqlite register failed"); |
| 1559 | +}); |
| 1560 | +mocks.runCopilotAttempt.mockImplementation(async (_params, deps) => { |
| 1561 | +const sdkSessionId = |
| 1562 | +mocks.runCopilotAttempt.mock.calls.length === 1 |
| 1563 | + ? "sdk-sess-background" |
| 1564 | + : "sdk-sess-replacement"; |
| 1565 | +deps.onSessionEstablished?.({ |
| 1566 | + sdkSessionId, |
| 1567 | +pooledClient: { key: {} as any, client: {} as any }, |
| 1568 | +sessionConfig: TEST_SESSION_CONFIG, |
| 1569 | +}); |
| 1570 | +if (sdkSessionId === "sdk-sess-background") { |
| 1571 | +deps.onDeferredCompaction?.({ |
| 1572 | +abort: () => undefined, |
| 1573 | +cleanup: cleanup.promise, |
| 1574 | + sdkSessionId, |
| 1575 | +}); |
| 1576 | +} |
| 1577 | +return ATTEMPT_RESULT; |
| 1578 | +}); |
| 1579 | +const harness = createCopilotAgentHarness({ |
| 1580 | +pool: makePoolMock(), |
| 1581 | +sessionStore: sessionStore.store, |
| 1582 | +}); |
| 1583 | +const params = makeCompactParams({ sessionId: "oc-sess-store-failure" }); |
| 1584 | + |
| 1585 | +await harness.runAttempt(params); |
| 1586 | +await harness.runAttempt(params); |
| 1587 | +await harness.runAttempt(params); |
| 1588 | + |
| 1589 | +expect(mocks.runCopilotAttempt.mock.calls[1]?.[0]).not.toMatchObject({ |
| 1590 | +initialReplayState: expect.objectContaining({ sdkSessionId: "sdk-sess-background" }), |
| 1591 | +}); |
| 1592 | +expect(mocks.runCopilotAttempt.mock.calls[2]?.[0]).toMatchObject({ |
| 1593 | +initialReplayState: expect.objectContaining({ sdkSessionId: "sdk-sess-replacement" }), |
| 1594 | +}); |
| 1595 | +cleanup.resolve("completed"); |
| 1596 | +await flushAsyncWork(); |
| 1597 | +}); |
| 1598 | + |
1554 | 1599 | it("calls the SDK history compaction RPC without requiring a workspace sidecar", async () => { |
1555 | 1600 | const beforeCompaction = vi.fn(); |
1556 | 1601 | const afterCompaction = vi.fn(); |
|