Loading workspace insights... Statistics interval
7 days30 daysLatest CI Pipeline Executions
f4ac4837 fix: address CodeRabbit review feedback — SSE types, mime normalization, voice validation, etc.
Applies the reviewer-flagged changes that weren't load-bearing for the merge:
- event-client: AudioRequestCompletedEvent.audio is now a mutually-exclusive
{url; never b64Json} | {b64Json; never url} union so consumers can't read
both fields simultaneously, mirroring the GeneratedAudio contract in core.
- fal utils: extractUrlExtension now strips URL fragments and trailing
slashes, parses via the URL API so a TLD like `.com` isn't mistaken for
an extension, and only inspects the final path segment.
- fal utils: deriveAudioContentType returns `audio/aac` for aac, separated
from the `m4a`/`mp4` → `audio/mp4` case.
- fal speech: prefer URL-derived extension when deriving `format`, and
normalize `mpeg` → `mp3` so the field is a usable file extension.
- gemini audio: drop `negativePrompt` (not accepted by GenerateContentConfig)
and `responseMimeType` (Lyria Clip rejects it, Pro returns MP3 by default)
from the public provider options surface, and document that the generic
`duration` option is ignored by Lyria (Clip is fixed at 30s, Pro takes
duration via the natural-language prompt).
- gemini tts: multiSpeakerVoiceConfig.speakerVoiceConfigs length is now
validated (1 or 2 speakers), partial user-supplied voiceConfig correctly
falls back to the standard voice/'Kore' default, parsePcmMimeType tightens
detection to exclude subtypes containing "wav" so containerized
`audio/wav;codec=pcm` is no longer re-wrapped, and createGeminiSpeech /
createGeminiAudio factory functions now spread config before the explicit
apiKey argument so caller config can't silently override the API key.
- ts-react-chat API routes: replace zod 4's removed `.flatten()` with
`z.treeifyError()` for validation error details.
- ts-react-chat audio route: `toAudioOutput` returns `null` per the
`onResult` hook contract instead of throwing synchronously — failures
are still surfaced via the hook's error state.
- Updates the tests affected by the above behavior changes. f4ac4837 fix: address CodeRabbit review feedback — SSE types, mime normalization, voice validation, etc.
Applies the reviewer-flagged changes that weren't load-bearing for the merge:
- event-client: AudioRequestCompletedEvent.audio is now a mutually-exclusive
{url; never b64Json} | {b64Json; never url} union so consumers can't read
both fields simultaneously, mirroring the GeneratedAudio contract in core.
- fal utils: extractUrlExtension now strips URL fragments and trailing
slashes, parses via the URL API so a TLD like `.com` isn't mistaken for
an extension, and only inspects the final path segment.
- fal utils: deriveAudioContentType returns `audio/aac` for aac, separated
from the `m4a`/`mp4` → `audio/mp4` case.
- fal speech: prefer URL-derived extension when deriving `format`, and
normalize `mpeg` → `mp3` so the field is a usable file extension.
- gemini audio: drop `negativePrompt` (not accepted by GenerateContentConfig)
and `responseMimeType` (Lyria Clip rejects it, Pro returns MP3 by default)
from the public provider options surface, and document that the generic
`duration` option is ignored by Lyria (Clip is fixed at 30s, Pro takes
duration via the natural-language prompt).
- gemini tts: multiSpeakerVoiceConfig.speakerVoiceConfigs length is now
validated (1 or 2 speakers), partial user-supplied voiceConfig correctly
falls back to the standard voice/'Kore' default, parsePcmMimeType tightens
detection to exclude subtypes containing "wav" so containerized
`audio/wav;codec=pcm` is no longer re-wrapped, and createGeminiSpeech /
createGeminiAudio factory functions now spread config before the explicit
apiKey argument so caller config can't silently override the API key.
- ts-react-chat API routes: replace zod 4's removed `.flatten()` with
`z.treeifyError()` for validation error details.
- ts-react-chat audio route: `toAudioOutput` returns `null` per the
`onResult` hook contract instead of throwing synchronously — failures
are still surfaced via the hook's error state.
- Updates the tests affected by the above behavior changes.