Первопричина: LocalVideoControlButton/LocalAudioControlButton на mounted() подписываются на
useDevices и держат подписку весь звонок; initializeDevices безусловно грабит камеру
(getUserMedia video:true) для превью, хотя кнопкам нужен лишь список устройств. Камера отпускалась
только по завершении звонка → индикатор горел при выключенном видео (медиа-конвейер звонка свой трек
останавливает корректно, но превью-подсистема — нет).
Фикс: разделены подписка на СПИСОК устройств и на ЖИВОЙ превью-поток. streamSubscribersCount +
единая точка контроля в updateAudio/VideoStream (без превью-подписчика поток не грабится и
останавливается — защищает и от watch). Кнопки звонка: requestStream:false. Диалог настроек —
без изменений (превью работает). enableDeviceEvents использует enumerateDevices (без камеры).
Сборка OK. НЕ деплоено — ждёт тест-фазу (docs/f7-fixes/camera-led-on-with-video-off.md).
Теперь master f7_talk = ПОЛНЫЙ деплой-артефакт: built js (наша сборка) + lib/Vendor (серверные
PHP-deps) + патч Listener + version 22.0.12.1. Готов к брендингу dev-f7 и подписи dev-appstore.
Апстрим-подписи (appinfo/signature.json) в репо нет — переподпишет dev-appstore при публикации.
- Listener.php: форс ru для push больших звонков (единственная функц. правка ядра на glb),
инкорпорирован в форк с пометкой о конфликте с З5 (мультиязычность) → вынести в config с dev-f7.
- appinfo version 22.0.12.1 (= f7.1; NC требует числовую версию).
- F7-PARITY.md: полный разбор слоёв (ядро=наше / брендинг=dev-f7 downstream), рецепт сборки glb-артефакта.
Брендинг (l10n/img/css/namespace/строки) НЕ в форке — зона dev-f7, применяется downstream.