import { beforeEach, describe, expect, test } from 'bun:test' import { notifyAutomationStateChanged, notifySessionStateChanged, notifySessionMetadataChanged, resetSessionStateForTests, setSessionMetadataChangedListener, } from '../sessionState' describe('sessionState metadata replay', () => { beforeEach(() => { resetSessionStateForTests() }) test('replays cached automation state to listeners that attach later', () => { const seen: Array> = [] notifyAutomationStateChanged({ enabled: true, phase: 'standby', next_tick_at: 123, sleep_until: null, }) setSessionMetadataChangedListener( metadata => { seen.push(metadata as Record) }, { replayCurrent: true }, ) expect(seen).toEqual([ { automation_state: { enabled: true, phase: 'standby', next_tick_at: 123, sleep_until: null, }, }, ]) }) test('dedupes identical automation states after replay but forwards changes', () => { const seen: Array> = [] notifyAutomationStateChanged({ enabled: true, phase: 'standby', next_tick_at: 123, sleep_until: null, }) setSessionMetadataChangedListener( metadata => { seen.push(metadata as Record) }, { replayCurrent: true }, ) notifyAutomationStateChanged({ enabled: true, phase: 'standby', next_tick_at: 123, sleep_until: null, }) notifyAutomationStateChanged({ enabled: true, phase: 'sleeping', next_tick_at: null, sleep_until: 456, }) expect(seen).toEqual([ { automation_state: { enabled: true, phase: 'standby', next_tick_at: 123, sleep_until: null, }, }, { automation_state: { enabled: true, phase: 'sleeping', next_tick_at: null, sleep_until: 456, }, }, ]) }) test('replays merged metadata snapshots instead of only the latest delta', () => { const seen: Array> = [] notifySessionMetadataChanged({ model: 'claude-sonnet-4-6' }) notifyAutomationStateChanged({ enabled: true, phase: 'sleeping', next_tick_at: null, sleep_until: 456, }) setSessionMetadataChangedListener( metadata => { seen.push(metadata as Record) }, { replayCurrent: true }, ) expect(seen).toEqual([ { model: 'claude-sonnet-4-6', automation_state: { enabled: true, phase: 'sleeping', next_tick_at: null, sleep_until: 456, }, }, ]) }) test('replays pending_action metadata cached through session-state transitions', () => { const seen: Array> = [] notifySessionStateChanged('requires_action', { tool_name: 'Edit', action_description: 'Edit src/utils/sessionState.ts', tool_use_id: 'toolu_123', request_id: 'req_123', input: { path: 'src/utils/sessionState.ts' }, }) setSessionMetadataChangedListener( metadata => { seen.push(metadata as Record) }, { replayCurrent: true }, ) expect(seen).toEqual([ { pending_action: { tool_name: 'Edit', action_description: 'Edit src/utils/sessionState.ts', tool_use_id: 'toolu_123', request_id: 'req_123', input: { path: 'src/utils/sessionState.ts' }, }, }, ]) }) test('replays cleared task_summary metadata after returning to idle', () => { const seen: Array> = [] notifySessionMetadataChanged({ task_summary: 'Running regression suite' }) notifySessionStateChanged('idle') setSessionMetadataChangedListener( metadata => { seen.push(metadata as Record) }, { replayCurrent: true }, ) expect(seen).toEqual([ { task_summary: null, }, ]) }) })