| 34-voice |
02 |
ui, onboarding |
| voice |
| onboarding |
| tts |
| stt |
| piper |
| whisper |
| personal-assistant |
|
| phase |
provides |
| 34-voice/34-01 |
usePiperTts, TtsButton, VoiceRecordButton, voiceEnabled nexus-settings |
|
| phase |
provides |
| 33-persistent-memory |
PersonalAssistant page, chatApi streaming |
|
| phase |
provides |
| 32-multi-step-onboarding-wizard |
NexusOnboardingWizard 5-step base |
|
|
| VoiceStep onboarding component with mic detection (enumerateDevices) |
| 6-step NexusOnboardingWizard with voice opt-in at step 4 |
| voiceEnabled persisted in nexus-settings on workspace creation |
| PersonalAssistant with VoiceRecordButton (STT) in input bar |
| PersonalAssistant with TtsButton next to each assistant message (TTS) |
|
| ui/src/components/NexusOnboardingWizard.tsx |
| ui/src/pages/PersonalAssistant.tsx |
|
| added |
patterns |
|
|
| VoiceStep probes microphone with navigator.mediaDevices.enumerateDevices() — async, graceful fallback to false |
| voiceEnabled captured in wizard state, persisted via updateNexusSettings after createWorkspace() |
| TtsButton rendered inline in messages.map (no prop drilling) — pl-10 aligns under message bubble |
| VoiceRecordButton appends transcription to textarea (not auto-send) — user reviews before sending |
|
|
| created |
modified |
| ui/src/components/onboarding/VoiceStep.tsx |
|
| ui/src/components/NexusOnboardingWizard.tsx |
| ui/src/pages/PersonalAssistant.tsx |
|
|
| VoiceStep inserted at step 4; rootDir shifts to step 5, summary to step 6 — clean sequential numbering |
| voiceEnabled persisted after mode save in createWorkspace() — non-blocking try/catch wrapper |
| TtsButton rendered inline in messages.map rather than inside MessageBubble — avoids prop drilling usePiperTts through MessageBubble |
| VoiceRecordButton appends (not replaces) transcription to textarea — user can combine typed + spoken input |
| No TTS auto-prewarm on mount — triggered only on first TtsButton click to avoid unexpected WASM downloads |
|
|
4min |
2026-04-03 |
2 |
3 |