fix(desktop): respect voice.auto_tts setting in voice conversation mode (fixes #44263) - #44277
fix(desktop): respect voice.auto_tts setting in voice conversation mode (fixes #44263)#44277Morad37 wants to merge 3 commits into
Conversation
|
Thanks for taking a look. This PR is the fix for the bug portion of #44263 (auto_tts ignored in voice mode). The streaming feature request is separate — I'd leave that for another PR once the API supports it. |
|
Nice — gating on 1. Default to off. 2. Don't cache for the hook's lifetime. It's read once via For (2), one option is to hydrate a small shared value from A test asserting |
- Change default from \!== false (fails open) to === true (fails closed) - Stop caching auto_tts at the ref level for the hook's lifetime - Store auto_tts in a nanostore () updated by useHermesConfig whenever config refreshes (boot, settings-save, profile-change) Co-authored-by: harjothkhara <harjothkhara@users.noreply.github.com>
|
Good catches on both points. Fixed both in the push I just made:
The approach with a shared store felt cleaner than re-reading config on every Let me know if you'd prefer a different shape for the store integration. |
Label correction on re-triage: this PR was previously tagged |
teknium1
left a comment
There was a problem hiding this comment.
Thanks for targeting the voice-conversation path specifically. The bug remains on current main: apps/desktop/src/app/chat/composer/hooks/use-voice-conversation.ts:228 still unconditionally calls playSpeechText, while hermes_cli/config.py:2153 defaults voice.auto_tts to False.
Problems
- The PR's new
$autoTtsmirror now overlaps with main's canonical desktop store:apps/desktop/src/store/voice-prefs.ts:8owns$autoSpeakReplies, andapps/desktop/src/app/session/hooks/use-hermes-config.ts:90hydrates it from config. Use that existing store for the conversation gate rather than adding a second atom and refresh path. - The PR adds no regression coverage for this contract. Add a voice-conversation test proving disabled/unset config never invokes
playSpeechText, while enabled config still does and the loop continues.
Suggested changes
- Gate
speak()with$autoSpeakReplies.get()fromvoice-prefsand retain the existing skip-to-idle/listening behavior.
Automated hermes-sweeper review.
| } | ||
|
|
||
| /** Whether auto-TTS is enabled. Defaults to false (fail-closed). Updated | ||
| * when config refreshes so toggling the setting takes effect immediately. */ |
There was a problem hiding this comment.
Current main already has the fail-closed voice.auto_tts mirror in apps/desktop/src/store/voice-prefs.ts:8, hydrated by useHermesConfig at apps/desktop/src/app/session/hooks/use-hermes-config.ts:90. Please use that existing $autoSpeakReplies store for the voice-conversation gate instead of introducing a second mirror that can diverge.
Adversarial verification (Vox Lockin lane 02 — auto-TTS / voice-mode reply class)Verified against Verdict: logic is correct and matches house conventions for #44263; the branch needs a rebase before merge. No duplicate PR opened. What I checked
Recommended path for the authorRebase |
Voice chat was calling playSpeechText without checking voice.auto_tts. Now it reads the config once on first use and skips TTS when disabled. The response still appears as text either way.