diff --git a/src/renderer/lib/sessionActivity.ts b/src/renderer/lib/sessionActivity.ts index 434d99b..0a67a14 100644 --- a/src/renderer/lib/sessionActivity.ts +++ b/src/renderer/lib/sessionActivity.ts @@ -46,6 +46,10 @@ export function applySessionEventActivity( if (event.status === 'running') { return removeSessionActivity(current, event.sessionId); } + + if (event.status === 'idle') { + return clearActiveSessionActivity(current, event.sessionId); + } } if ( diff --git a/tests/renderer/sessionActivity.test.ts b/tests/renderer/sessionActivity.test.ts index abc3b66..b7217a1 100644 --- a/tests/renderer/sessionActivity.test.ts +++ b/tests/renderer/sessionActivity.test.ts @@ -149,7 +149,7 @@ describe('session activity helpers', () => { }); }); - test('keeps the last observed status after completion or error', () => { + test('preserves completed activity on idle and error', () => { const current: SessionActivityMap = { 'session-1': { architect: { @@ -179,6 +179,40 @@ describe('session activity helpers', () => { ).toEqual(current); }); + test('clears only active agent states when a session becomes idle', () => { + const current: SessionActivityMap = { + 'session-1': { + architect: { + agentId: 'architect', + agentName: 'Architect', + activityType: 'completed', + }, + reviewer: { + agentId: 'reviewer', + agentName: 'Reviewer', + activityType: 'thinking', + }, + }, + }; + + expect( + applySessionEventActivity(current, { + sessionId: 'session-1', + kind: 'status', + occurredAt: '2026-03-23T00:00:01.000Z', + status: 'idle', + }), + ).toEqual({ + 'session-1': { + architect: { + agentId: 'architect', + agentName: 'Architect', + activityType: 'completed', + }, + }, + }); + }); + test('clears only active agent states when a run is cancelled', () => { const current: SessionActivityMap = { 'session-1': {