import { afterEach, describe, expect, it } from 'vitest'; import { createSessionRuntime } from './session-runtime.js'; describe('session runtime', () => { const runtimes = []; afterEach(() => { for (const runtime of runtimes) { runtime.dispose(); } runtimes.length = 0; }); it('broadcasts attention clears through the shared broadcaster', () => { const events = []; const runtime = createSessionRuntime({ writeSseEvent() { throw new Error('SSE fallback should not be used when broadcastEvent is provided'); }, getNotificationClients: () => new Set(), broadcastEvent: (payload) => { events.push(payload); }, }); runtimes.push(runtime); runtime.processOpenCodeSsePayload({ type: 'session.status', properties: { sessionID: 'session-1', info: { type: 'busy', }, }, }); runtime.markUserMessageSent('session-1'); runtime.processOpenCodeSsePayload({ type: 'session.status', properties: { sessionID: 'session-1', info: { type: 'idle', }, }, }); runtime.markSessionViewed('session-1', 'client-1'); expect(events).toContainEqual({ type: 'openchamber:session-status', properties: expect.objectContaining({ sessionId: 'session-1', status: 'idle', needsAttention: true, }), }); expect(events.at(-1)).toEqual({ type: 'openchamber:session-status', properties: { sessionId: 'session-1', status: 'idle', timestamp: expect.any(Number), metadata: {}, needsAttention: false, }, }); }); });