diff --git a/extensions/copilot/src/event-bridge.test.ts b/extensions/copilot/src/event-bridge.test.ts index f205f8e81cbb..38e48907ec70 100644 --- a/extensions/copilot/src/event-bridge.test.ts +++ b/extensions/copilot/src/event-bridge.test.ts @@ -678,6 +678,26 @@ describe("attachEventBridge", () => { expect(bridge.hasObservedSessionIdle()).toBe(true); }); + it("ignores subagent idle events while waiting for the root session", async () => { + const session = createFakeSession(); + const bridge = attachEventBridge(session, { + getSdkSessionId: () => "sdk-session-id", + isAborted: () => false, + }); + + const idle = bridge.awaitSessionIdle(); + session.emit("session.idle", { + ...makeEvent("session.idle", {}), + agentId: "subagent-1", + }); + await flushAsync(); + expect(bridge.hasObservedSessionIdle()).toBe(false); + + session.emit("session.idle", makeEvent("session.idle", {})); + await idle; + expect(bridge.hasObservedSessionIdle()).toBe(true); + }); + it("keeps compaction pending after an abort until the SDK reports completion", async () => { const session = createFakeSession(); const bridge = attachEventBridge(session, { diff --git a/extensions/copilot/src/event-bridge.ts b/extensions/copilot/src/event-bridge.ts index d4610e591796..22ffb44256db 100644 --- a/extensions/copilot/src/event-bridge.ts +++ b/extensions/copilot/src/event-bridge.ts @@ -224,7 +224,10 @@ export function attachEventBridge( } }); - registerListener(session, unsubscribeFns, "session.idle", () => { + registerListener(session, unsubscribeFns, "session.idle", (event) => { + if (!isRootCompactionEvent(event)) { + return; + } observedSessionIdle = true; resolveSessionIdle?.(); resolveSessionIdle = undefined;