From 8bfb5815a089ba11040466e86a73d03c5aae29f2 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Wed, 15 Jul 2026 00:24:57 +0200 Subject: [PATCH] fix(subagents): retain dismissed tabs on reload --- .../src/server/agent/agent-manager.test.ts | 22 ++++++++++++++++++- .../server/src/server/agent/agent-manager.ts | 7 +++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/server/src/server/agent/agent-manager.test.ts b/packages/server/src/server/agent/agent-manager.test.ts index 7e3930e029..0ee1f804e6 100644 --- a/packages/server/src/server/agent/agent-manager.test.ts +++ b/packages/server/src/server/agent/agent-manager.test.ts @@ -2760,11 +2760,31 @@ test("reloadAgentSession clears provider children before rehydrating from disk", provider: "codex", event: { type: "upsert", id: "stale-child", title: "Stale child", status: "running" }, }); - await vi.waitFor(() => expect(manager.listProviderSubagents(snapshot.id)).toHaveLength(1)); + activeSession?.pushEvent({ + type: "provider_subagent", + provider: "codex", + event: { type: "upsert", id: "dismissed-child", status: "completed" }, + }); + await vi.waitFor(() => expect(manager.listProviderSubagents(snapshot.id)).toHaveLength(2)); + await manager.archiveFinishedSubagents(snapshot.id); + const events: AgentManagerEvent[] = []; + manager.subscribe((event) => events.push(event), { + agentId: snapshot.id, + replayState: false, + }); await manager.reloadAgentSession(snapshot.id, undefined, { rehydrateFromDisk: true }); expect(manager.listProviderSubagents(snapshot.id)).toEqual([]); + expect(events).toContainEqual({ + type: "provider_subagent", + event: { + type: "remove", + parentAgentId: snapshot.id, + subagentId: "dismissed-child", + retainTimeline: true, + }, + }); }); test("hydrateTimelineFromProvider restores and broadcasts provider children from session history", async () => { diff --git a/packages/server/src/server/agent/agent-manager.ts b/packages/server/src/server/agent/agent-manager.ts index d1d3eb657e..fbb8921fcc 100644 --- a/packages/server/src/server/agent/agent-manager.ts +++ b/packages/server/src/server/agent/agent-manager.ts @@ -1303,7 +1303,12 @@ export class AgentManager { await this.deleteCommittedTimeline(agentId); this.timelineStore.delete(agentId); for (const event of this.providerSubagents.deleteParent(agentId)) { - this.dispatch({ type: "provider_subagent", event }); + this.dispatch({ + type: "provider_subagent", + event: existing.dismissedProviderSubagentIds.has(event.subagentId) + ? { ...event, retainTimeline: true } + : event, + }); } }