From a8137ff21c77a6bc19a8128cbdff303082741e3a Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Thu, 11 Jun 2026 19:24:57 -0400 Subject: [PATCH] Guard watchdog recovery from duplicate voice-mode resume --- static/boot.js | 2 +- tests/test_issue3983_browser_tts_watchdog.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/static/boot.js b/static/boot.js index 1fffefa8..16e70941 100644 --- a/static/boot.js +++ b/static/boot.js @@ -1101,7 +1101,7 @@ window._micPendingSend=window._micPendingSend||false; _browserTtsSuppressNextErrorRearm=false; _clearBrowserTtsRecovery(); // After speaking, go back to listening - if(_voiceModeActive) setTimeout(()=>_startListening(),500); + if(_voiceModeActive&&_voiceModeState==='speaking') setTimeout(()=>_startListening(),500); }; utter.onerror=()=>{ _clearBrowserTtsRecovery(); diff --git a/tests/test_issue3983_browser_tts_watchdog.py b/tests/test_issue3983_browser_tts_watchdog.py index 4008e17a..d515c804 100644 --- a/tests/test_issue3983_browser_tts_watchdog.py +++ b/tests/test_issue3983_browser_tts_watchdog.py @@ -40,6 +40,7 @@ def test_browser_tts_callbacks_and_deactivate_clear_recovery_handles(): "Both browser TTS completion callbacks must clear watchdog/keep-alive handles." ) assert "_browserTtsSuppressNextErrorRearm=false;" in speak_body + assert "_voiceModeActive&&_voiceModeState==='speaking'" in speak_body assert "if(_browserTtsSuppressNextErrorRearm){" in speak_body assert "_armBrowserTtsRecovery(clean, utter.rate);" in speak_body