diff --git a/src/gateway/server-methods/system-agent-session-lifecycle.test.ts b/src/gateway/server-methods/system-agent-session-lifecycle.test.ts index b2c11557678a..d263fbf159b2 100644 --- a/src/gateway/server-methods/system-agent-session-lifecycle.test.ts +++ b/src/gateway/server-methods/system-agent-session-lifecycle.test.ts @@ -39,6 +39,37 @@ describe("system-agent session lifecycle", () => { await expect(disposal).resolves.toBeUndefined(); }); + it("reports owner cleanup failure once when retirement joins the same disposal", async () => { + const release = createDeferred(); + const cleanupError = new Error("connection cleanup failed"); + const sessions = new Map([ + [ + "connection-session", + session("connection:one", async () => { + await release.promise; + throw cleanupError; + }), + ], + ]) as Sessions; + const wizardSessions = new Map() as GatewayRequestContext["wizardSessions"]; + + const ownerCleanup = disposeSystemAgentSessionsForOwner({ + sessions, + ownerKey: "connection:one", + }); + const retirement = retireAndDisposeSystemAgentSessions({ sessions, wizardSessions }); + const ownerSettlement = expect(ownerCleanup).rejects.toMatchObject({ + errors: [cleanupError], + }); + const retirementSettlement = expect(retirement).rejects.toMatchObject({ + errors: [cleanupError], + }); + release.resolve(); + + await ownerSettlement; + await retirementSettlement; + }); + it("retires admission before cancelling and joining every setup owner", async () => { const dispose = vi.fn(async () => undefined); const cancel = vi.fn(() => true); diff --git a/src/gateway/server-methods/system-agent-session-lifecycle.ts b/src/gateway/server-methods/system-agent-session-lifecycle.ts index 14e03dc98592..2381c98c7671 100644 --- a/src/gateway/server-methods/system-agent-session-lifecycle.ts +++ b/src/gateway/server-methods/system-agent-session-lifecycle.ts @@ -256,11 +256,10 @@ export function disposeSystemAgentSessionsForOwner(params: { }), ); } - const disposal = settleCleanupTasks( + return settleCleanupTasks( disposals, (errorCount) => `Failed to dispose ${errorCount} OpenClaw session(s)`, ); - return trackSessionSettlement(params.sessions, disposal); } export function retireAndDisposeSystemAgentSessions(params: {