- Agent disconnects custom room when all real participants leave
(prevents zombie participants blocking auto-dispatch)
- Bot sends m.call.member state event on call detection
(Element Call shows bot as joined)
- Use RoomInputOptions(participant_identity=...) to target real user
audio input (framework agent-AJ_xxx participant was confusing RoomIO)
- Removed incorrect bot dispatch (Matrix room ID != LiveKit room name)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- STT: elevenlabs.STT() (Scribe) instead of Whisper via LiteLLM
- TTS: elevenlabs.TTS() (already direct)
- LLM: still routed through LiteLLM/OpenRouter
- No extra API accounts needed — only ElevenLabs + OpenRouter
CF-1147
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>