Two gaps in the chat composer:
- The microphone button only opened a file dialog for audio files; there
was no way to speak a message. Add a dictation button: the first click
records from the microphone, the second stops and sends the recording
to /v1/audio/transcriptions with the first installed transcription
model; the text is appended to the message box for review. The button
is hidden without a transcription model or without a microphone API.
The audio attach button keeps its function and gets the music icon.
- A PDF without a text layer (a scan) was rejected with a toast. Render
its first ten pages to PNG with pdf.js and attach them as images, so a
vision model can read them; a toast says how many pages went along.
PDFs that cannot be parsed at all are still rejected.
Strings for all eight locales, docs in features/chat.md, Playwright
specs for both (with negative cases: no transcription model, failed
transcription, unparsable PDF).
Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Stefan Walcz <stefan.walcz@walcz.de>