AGENT.md 7.14:
- POST /api/v1/livekit/webhook: подпись проверяется JWT-токеном, подписанным
API-секретом, с проверкой sha256 тела (иначе 401), при выключенном голосе —
503; обработка идемпотентна по event.id (повторная доставка → duplicate);
- события: participant_joined восстанавливает состояние после рестарта
приложения, participant_left и participant_connection_aborted убирают
участника, room_finished очищает комнату целиком, track_published и
track_unpublished обновляют флаги камеры и демонстрации экрана; каждое
изменение рассылает VOICE_STATE_UPDATE участникам сервера;
- сторож `StartVoiceWatchdog` раз в 15 минут удаляет состояния без обновлений
дольше шести часов (сбои без вебхука) и уведомляет клиентов;
- тесты: подпись (чужой секрет, другое тело, отсутствие заголовка), полный
цикл событий SFU и идемпотентность повторной доставки.