diff --git a/src/plugin/event.test.ts b/src/plugin/event.test.ts index 49ed2c031..8b10a5950 100644 --- a/src/plugin/event.test.ts +++ b/src/plugin/event.test.ts @@ -335,7 +335,7 @@ describe("createEventHandler - idle deduplication", () => { expect(spawnTmuxPane).toHaveBeenCalledTimes(1) }) - it("dedups real-idle-after-synthetic-idle within 500ms", async () => { + it("does NOT dedup real-idle-after-synthetic-idle within 500ms", async () => { //#given const dispatchCalls: EventInput[] = [] const eventHandler = createIdleTrackingEventHandler(dispatchCalls) @@ -359,9 +359,11 @@ describe("createEventHandler - idle deduplication", () => { })) //#then - expect(dispatchCalls).toHaveLength(1) + expect(dispatchCalls).toHaveLength(2) expect(dispatchCalls[0]?.event.type).toBe("session.idle") expect((dispatchCalls[0]?.event.properties as { sessionID?: string } | undefined)?.sessionID).toBe(sessionId) + expect(dispatchCalls[1]?.event.type).toBe("session.idle") + expect((dispatchCalls[1]?.event.properties as { sessionID?: string } | undefined)?.sessionID).toBe(sessionId) }) it("dedups back-to-back real session.idle events for the same sessionID within 500ms", async () => { diff --git a/src/plugin/event.ts b/src/plugin/event.ts index 265244f29..e8bb49a7d 100644 --- a/src/plugin/event.ts +++ b/src/plugin/event.ts @@ -415,6 +415,9 @@ export function createEventHandler(args: { const emittedAt = recentSyntheticIdles.get(sessionID); if (emittedAt !== undefined && now - emittedAt < DEDUP_WINDOW_MS) { recentSyntheticIdles.delete(sessionID); + // Let real idle events through even when a synthetic idle fired moments earlier. + // OpenCode diagnostics expect a concrete session.idle event signal. + recentAnyIdles.delete(sessionID); } recentRealIdles.set(sessionID, now); if (!shouldDispatchIdleEvent(sessionID, now)) {