Firefox supports audio/webm;codecs=opus in MediaSource API,
enabling true streaming playback. Remove broken progressive
playback (partial blobs don't stream). Simplified fallback
to full buffer for any browser without MSE support.
Progressive playback was silently failing if response.body was null
or if the reader threw. Now falls back to full buffer if body isn't
streamable, logs chunk progress, and properly unblocks callers on
error instead of hanging forever.
Firefox can't use MediaSource for streaming. Instead of buffering
the entire response before playing, progressively read chunks and
start playback after ~8KB arrives. Replaces audio src with complete
blob when download finishes for seeking support.
Update text-to-speech.html to document Qwen3-TTS as the default
5th engine with 20 cloned voices and 10-language support.
Firefox on Linux reports canPlayType('audio/mpeg') as supported
but then fails to decode mp3. Use user-agent detection instead:
Firefox always gets opus (ogg), Chromium browsers get mp3.
Firefox on Linux lacks mp3 decoders. Detect browser capabilities
at load time: use mp3 for Chrome, opus (ogg) for Firefox.
MediaSource streaming only works with mp3 (Chrome); Firefox
falls back to buffered playback with opus format.
Sends response_format parameter to TTS server.
- speakChatText now uses handleTTS instead of speakTextDirect
so embed modal TTS (intro, chat messages) respects streaming mode
- Streaming result updates blobUrl on completion so existing
download click handlers work without changes
- speakTextStreaming now returns immediately with the audio element
already playing, plus a done promise for when the stream completes
- Modal wires up controls immediately using the live audio element
- Pause/play works during streaming (stream continues in background)
- Button shows "Streaming..." while receiving, switches to "Pause" when done
- Download button enables only after stream completes
- All TTS functions now return consistent done promise interface
Default to streaming mode which plays audio as chunks arrive
from the server instead of buffering the entire response.
Adds a Buffered/Streaming toggle in the TTS modal.
Falls back to buffered if MediaSource doesn't support audio/mpeg.
- Add vault.js: encrypted settings with AES-256 + 7-day session persistence
- Integrate vault UI in settings modal with friendly messaging
- Update config.js and un.js to use vault for credentials
- Add translation strings for vault UI (en.js)
- Show "Logged in" status with Lock button instead of session info
- Vault password only asked when opening settings
- Add public/src/unsandbox.js browser SDK with HMAC-SHA256 auth
- Add settings UI for unsandbox public/secret keys in modal
- Refactor code-execution.js to use SDK when keys configured
- Falls back to unauthenticated endpoint when not configured
- Add English translations for new settings