import type { RealtimeServerEvent } from '../types/realtime-model'; export type RealtimeSessionState = { delegationMode?: 'client' | 'provider'; sessionId?: string; transcripts: Extract[]; delegations: Extract[]; usage?: { seconds: number }; finalization: 'pending' | 'confirmed' | 'unconfirmed'; terminationReason?: string; isInputMuted: boolean; }; export function createSessionState(): RealtimeSessionState { return { transcripts: [], delegations: [], isInputMuted: false, finalization: 'pending', }; } export function reduceSessionState( state: RealtimeSessionState, event: RealtimeServerEvent, limit: number, muted?: boolean, ): RealtimeSessionState { switch (event.type) { case 'session-started': return { ...state, sessionId: event.sessionId, delegationMode: event.delegationMode, }; case 'session-usage': return { ...state, usage: event.usage }; case 'session-closed': return { ...state, sessionId: event.sessionId ?? state.sessionId, usage: event.usage, terminationReason: event.reason, finalization: 'confirmed', }; case 'transcript-fragment': return { ...state, transcripts: [...state.transcripts, event].slice(-limit), }; case 'delegation-created': return state.delegations.some( item => item.delegationId === event.delegationId, ) ? state : { ...state, delegations: [...state.delegations, event].slice(-limit), }; case 'command-acknowledged': return muted == null ? state : { ...state, isInputMuted: muted }; default: return state; } }