

























@@ -468,6 +468,7 @@ describe("runCopilotAttempt", () => {
468468469469releaseBeforeCompaction.resolve();
470470activeSession?.emit("session.compaction_complete", { success: true });
471+activeSession?.emit("session.idle", {});
471472await vi.waitFor(() => {
472473expect(activeSession?.disconnect).toHaveBeenCalledTimes(1);
473474});
@@ -1814,6 +1815,10 @@ describe("runCopilotAttempt", () => {
18141815}),
18151816expect.anything(),
18161817);
1818+sdk.sessions[0]?.emit("session.idle", {});
1819+await vi.waitFor(() => {
1820+expect(sdk.sessions[0]?.disconnect).toHaveBeenCalledTimes(1);
1821+});
18171822});
1818182318191824it("marks a timeout during active SDK compaction", async () => {
@@ -1837,6 +1842,7 @@ describe("runCopilotAttempt", () => {
18371842expect(sdk.sessions[0]?.disconnect).not.toHaveBeenCalled();
1838184318391844sdk.sessions[0]?.emit("session.compaction_complete", { messagesRemoved: 3, success: true });
1845+sdk.sessions[0]?.emit("session.idle", {});
18401846await vi.waitFor(() => {
18411847expect(sdk.sessions[0]?.disconnect).toHaveBeenCalledTimes(1);
18421848});
@@ -1848,12 +1854,54 @@ describe("runCopilotAttempt", () => {
18481854);
18491855});
185018561857+it("retains a timed-out session until later compaction reaches session.idle", async () => {
1858+const afterCompaction = vi.fn();
1859+const onDeferredCompaction = vi.fn();
1860+initializeGlobalHookRunner(
1861+createMockPluginRegistry([{ hookName: "after_compaction", handler: afterCompaction }]),
1862+);
1863+let activeSession: FakeSession | undefined;
1864+const sdk = makeFakeSdk({
1865+onCreateSession: (session) => {
1866+activeSession = session;
1867+session.sendAndWait.mockRejectedValueOnce(
1868+new Error("Timeout after 60000ms waiting for session.idle"),
1869+);
1870+},
1871+});
1872+1873+const result = await runCopilotAttempt(makeParams(), {
1874+ onDeferredCompaction,
1875+pool: makeFakePool(sdk),
1876+});
1877+1878+expect(result.timedOut).toBe(true);
1879+expect(result.timedOutDuringCompaction).toBe(false);
1880+expect(onDeferredCompaction).toHaveBeenCalledWith(
1881+expect.objectContaining({ sdkSessionId: "sess-1" }),
1882+);
1883+expect(activeSession?.disconnect).not.toHaveBeenCalled();
1884+1885+activeSession?.emit("session.compaction_start", {});
1886+activeSession?.emit("session.compaction_complete", { messagesRemoved: 3, success: true });
1887+await vi.waitFor(() => {
1888+expect(afterCompaction).toHaveBeenCalledTimes(1);
1889+});
1890+expect(activeSession?.disconnect).not.toHaveBeenCalled();
1891+1892+activeSession?.emit("session.idle", {});
1893+await vi.waitFor(() => {
1894+expect(activeSession?.disconnect).toHaveBeenCalledTimes(1);
1895+});
1896+});
1897+18511898it("does not mark a timeout after SDK compaction has completed as active compaction", async () => {
18521899const sdk = makeFakeSdk({
18531900onCreateSession: (session) => {
18541901session.sendAndWait.mockImplementationOnce(async () => {
18551902session.emit("session.compaction_start", {});
18561903session.emit("session.compaction_complete", { success: true });
1904+session.emit("session.idle", {});
18571905return undefined;
18581906});
18591907},
@@ -1935,6 +1983,7 @@ describe("runCopilotAttempt", () => {
19351983expect(dualWriteMock.dualWriteCopilotTranscriptBestEffort).toHaveBeenCalledTimes(1);
19361984});
19371985sdk.sessions[0]?.emit("session.compaction_complete", { success: true });
1986+sdk.sessions[0]?.emit("session.idle", {});
19381987mirror.resolve();
1939198819401989const result = await attempt;
@@ -1978,6 +2027,10 @@ describe("runCopilotAttempt", () => {
19782027// replay-shim incorrectly treated the attempt as side-effect-safe.
19792028expect(result.replayMetadata?.hadPotentialSideEffects).toBe(true);
19802029expect(result.replayMetadata?.replaySafe).toBe(false);
2030+sdk.sessions[0]?.emit("session.idle", {});
2031+await vi.waitFor(() => {
2032+expect(sdk.sessions[0]?.disconnect).toHaveBeenCalledTimes(1);
2033+});
19812034});
1982203519832036it("G1: SDK timeout flushes the in-flight delta chain before snapshot so assistant text is preserved", async () => {
@@ -2019,6 +2072,10 @@ describe("runCopilotAttempt", () => {
20192072expect(result.timedOut).toBe(true);
20202073expect(onAssistantDelta).toHaveBeenCalledTimes(1);
20212074expect(result.assistantTexts?.join("")).toContain("partial-");
2075+session.emit("session.idle", {});
2076+await vi.waitFor(() => {
2077+expect(session.disconnect).toHaveBeenCalledTimes(1);
2078+});
20222079});
2023208020242081it("model translation: unsupported provider", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。