Connection Lifecycle
- WebSocket connect
- Server →
ready{ id, protocolVersion } - Client →
offer(SDP) - Server →
signal(SDP answer) - WebRTC data channel established
- Heartbeats:
ping/pong - Reconnect: client sends
reconnectwith previous sessionId; server repliesreconnect-ack
Payload messages (transcripts, llm, tts, etc.) are sent on both channels; client should process from data channel when available, fallback to WebSocket otherwise.