1148 Commits
Author SHA1 Message Date
Palash Debnath da3667a369 Merge branch 'fix/review-2175' into chore/electron-0.5.4 2026-09-17 22:47:26 +05:30
Palash Debnath 77802c5f87 Merge remote-tracking branch 'origin/main' into chore/electron-0.5.4 2026-09-17 22:46:34 +05:30
Palash Debnath 6ae92dbc47 Merge remote-tracking branch 'origin/main' into fix/review-2175
# Conflicts:
#	docs/engines/mlx-audio.md
2026-09-17 22:46:11 +05:30
Palash Debnath 2aa5f38012 Merge remote-tracking branch 'origin/main' into fix/review-2175
# Conflicts:
#	CHANGELOG.md
2026-09-17 22:25:24 +05:30
Palash Debnath 86c7f6bb35 chore(release): prepare Electron 0.5.4 metadata and authored notes 2026-09-17 22:19:11 +05:30
Palash Debnath eed4632933 Merge remote-tracking branch 'origin/main' into fix/review-2174 2026-09-17 21:57:28 +05:30
Palash Debnath 2b6fd847ce fix(kokoro): accept every advertised installed language label 2026-09-17 21:52:05 +05:30
Palash Debnath 50a71fd176 Merge remote-tracking branch 'origin/main' into fix/review-2173 2026-09-17 21:32:02 +05:30
Palash Debnath f6d1e0c2df fix(kokoro): resolve the advertised British English label 2026-09-17 20:30:40 +05:30
Palash Debnath a222974568 fix(generate): localize terminal language refusals across streaming paths 2026-09-17 20:21:30 +05:30
Shivendra-CoherentandClaude Opus 5 a6113762a4 fix(generate): answer a refused language on the remote path too
Review findings from greptile on this PR.

P1 — a profile-derived language refused by a *remote* worker never
reached the new branch. The worker's ValueError travels home as
RemoteJobFailed, a GatewayError caught ahead of the ValueError handler,
so the user got a retryable 503 offering "run it on this machine
instead" — which cannot help, because the same engine refuses the same
language wherever it runs. Both handlers now build the response through
one helper, so the local and remote paths cannot drift again. Only
language refusals change class there; a genuine worker failure keeps its
retryable 503 and its "run it here" offer.

P2 — a *generic* rejection was wrapped twice. `_language_rejection_or`
adds the engine remedy before the handler sees it, and the profile
message then quoted that wrapper, repeating both the engine-switch
advice and "Engine's own message:". The wrapper now keeps the engine's
own error reachable and the profile message quotes that, once. The
Kokoro path never showed this because its wording is self-describing and
skips the first wrapper, which is why the first cut's assertion passed.

Three regression tests, each failing before this commit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 19:50:07 +05:30
Shivendra-CoherentandClaude Opus 5 fbede643c1 fix(generate): name the voice profile behind a refused language
A user on mlx-audio with the language picker on "Auto" got:

    400: mlx-audio's Kokoro model doesn't support language='Persian'.
    … Pick one of those, leave language as 'Auto', or switch to a
    multilingual engine …

They had left it on Auto. The UI omits `language` entirely while its
picker reads "Auto" (useProfiles.js only appends a non-Auto value), and
#533 fills that gap from the selected voice profile. So Auto is exactly
how 'Persian' got there: the remedy the message leads with is the state
the user was already in, and nothing points at the profile that actually
supplied the language. Three generate attempts in their action log, a
detour through Settings, then the report.

Provenance was the missing fact, and only the request scope has it — the
engine adapters are handed a language with no idea who chose it. So
_resolve_profile_conditioning now reports whether it filled the language,
and /generate uses that to answer a refused profile language by naming
the profile and the remedies that exist: change the profile's language,
pick a supported one explicitly, or switch engine.

An explicitly requested language is untouched — the user really did pick
it, so blaming the profile would be a lie — and #533 still drives
generation whenever the engine can speak the profile's language.

Recognising the refusal needed one more thing: Kokoro's wording
("doesn't support language=…") matched none of #1257's signatures, so
the engine that issue was written for was the one engine its rewrite
never fired for. That wording is now recognised, but kept out of #1257's
rewrite path — it already names its engine and its languages, and
re-wrapping it only nests "Engine's own message:" twice.

No per-model language map: #1257 weighed that and chose engine-naming
over "a brittle map that goes stale on each engine update". This follows
the same principle — say where the language came from, don't enumerate.

docs/engines/mlx-audio.md repeated the same "leave language on Auto"
advice and is corrected here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 18:04:51 +05:30
shivsin25 543f0f6f18 Merge branch 'main' into fix/2163-gated-install-token 2026-09-17 17:08:59 +05:30
paranoyouz-collab ec3e12cd6e fix(tts): name every Kokoro language from the installed table
resolve_kokoro_lang_code validates against mlx-audio's own LANG_CODES —
its docstring is explicit that the vendored table is the only source of
truth — but built the "Kokoro supports: …" list in the rejection message
from the hardcoded _KOKORO_ISO_BY_FULL_NAME instead.

That map exists to translate full names into Kokoro's codes, and it has
no entry that produces "b". British English is reachable as en-gb, and
the existing test asserts resolve("en-gb") == "b", yet the message never
mentioned it: the installed table lists nine languages and the message
named eight. Any language a later mlx-audio adds would be dropped the
same way, telling a user to switch engines when they need not.

Derives the labels from ALIASES and LANG_CODES instead, preferring the
full name a caller can actually pass and falling back to the table's own
description for codes no full name reaches.

The derivation takes the tables as arguments, so its tests run on every
platform. The resolution tests around it need the Apple-Silicon-only
package and skip on every CI runner, which is why a message drifting
from the table it documents went unnoticed.

Fixes #2156
2026-09-17 11:22:09 +00:00
Shivendra-CoherentandClaude Opus 5 37b498c891 fix(setup): send the HF token when installing a gated model
Installing a gated model failed the fast download path with "401
Unauthorized" even with a valid token and the licence accepted, then fell
back to snapshot_download and logged a 401 that reads like the token or
the licence grant is at fault when it is neither (#2163).

`token_resolver.resolve()` returns a ResolvedToken record, not the bearer
string. Two call sites handed that record straight to consumers typed
`token: str | None`, and both fail silently rather than loudly:

- `_segmented_snapshot` passes it to HfApi, get_hf_file_metadata and our
  own segmented_download. huggingface_hub's build_hf_headers ignores a
  non-str token and falls back to its own ambient discovery, so a token
  held only in VoiceStudio's Settings produces NO Authorization header
  and every gated file 401s. segmented_download instead interpolates it
  into `f"Bearer {token}"`, sending a malformed header that also inlines
  the raw secret into the request.
- `_step_fetch_weights` passes it to snapshot_download, so gated engine
  weights 401 the same way.

Every other resolve() caller already unwraps `.token`; these two were the
outliers. Both now unwrap once, at the seam.

The existing weights tests all stubbed resolve() to return None, so no
test ever exercised a resolved token — which is why this went unnoticed.
The new tests drive a real ResolvedToken through both seams and assert a
`str` reaches every consumer, plus an integration test that installs the
pyannote diarisation pipeline end to end: a weightless config_only repo
validates, both dependency repos are fetched, and every call carries the
bearer string.

Two catalogue invariants keep the rest of #2163 from returning by edit:
dependency repos must be revision-pinned (revision_for raises otherwise,
so an unpinned one ships an always-failing install), and a config_only
entry must declare config_required_files (without them the completeness
check can never pass and the error lists no files at all — the shape the
report hit on 0.5.2).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 16:50:16 +05:30
Palash Debnath e6e8f16f55 fix: guard voice conversion with active model cloning capability 2026-09-17 16:29:51 +05:30
Palash Debnath d2e2d6073a Merge branch 'fix/review-2138' into fix/community-integration
# Conflicts:
#	docs/dubbing/translation-engines.md
2026-09-17 15:40:36 +05:30
Palash Debnath 0f13d49363 fix(dubbing): guard diarization lifetime and task stream delivery 2026-09-17 15:40:23 +05:30
Palash Debnath 5b01b65d1e Merge branch 'fix/review-2107' into fix/community-integration 2026-09-17 15:14:01 +05:30
Palash Debnath fecde7fca5 fix(media): require successful tool version probes 2026-09-17 15:13:49 +05:30
Palash Debnath 39cdd4b4db Merge branch 'fix/review-2106' into fix/community-integration 2026-09-17 15:03:56 +05:30
Palash Debnath 8d903eed8e Merge branch 'fix/review-2107' into fix/community-integration 2026-09-17 15:03:56 +05:30
Palash Debnath e477251b35 Merge branch 'fix/review-2138' into fix/community-integration 2026-09-17 15:03:56 +05:30
Palash Debnath 57501ef8ef Merge branch 'fix/review-2109' into fix/community-integration 2026-09-17 15:03:56 +05:30
Palash Debnath 8b1b1e9b51 Merge branch 'fix/review-2165' into fix/community-integration 2026-09-17 15:03:56 +05:30
Palash Debnath 7a7a1d379d test(sidecar): isolate imports and await process termination 2026-09-17 15:03:22 +05:30
Palash Debnath 65044b6cfd test(asr): resolve repair module at runtime 2026-09-17 15:03:18 +05:30
Palash Debnath 06c675fbc8 fix(mlx): retain resampling context between chunks 2026-09-17 15:03:15 +05:30
Palash Debnath 737f04f42d fix(media): reject unusable sibling ffprobe 2026-09-17 15:03:11 +05:30
Palash Debnath 9ee1f9c1ed fix(dubbing): make disconnect cleanup single-shot 2026-09-17 15:03:03 +05:30
Palash Debnath fa16980938 Merge branch 'fix/review-2109' into fix/community-integration 2026-09-17 14:40:22 +05:30
Palash Debnath 6450fd931f Merge branch 'fix/review-2165' into fix/community-integration 2026-09-17 14:40:22 +05:30
Palash Debnath a0154778a4 test: keep long-text case IDs within Windows environment limits 2026-09-17 14:40:20 +05:30
Palash Debnath 1c5c16e21e fix: select native file locking by host capability 2026-09-17 14:36:57 +05:30
Palash Debnath 05a8b58b53 Merge branch 'fix/review-2077' into fix/community-integration 2026-09-17 14:01:28 +05:30
Palash Debnath 1f17560cde fix: normalize blank separators before WebVTT metadata classification 2026-09-17 14:01:25 +05:30
Palash Debnath e3d3913f52 Merge branch 'fix/review-2077' into fix/community-integration
# Conflicts:
#	CHANGELOG.md
#	docs/dubbing/translation-engines.md
2026-09-17 13:57:07 +05:30
Palash Debnath ad52d32760 fix: distinguish WebVTT identifiers and empty cue boundaries 2026-09-17 13:57:05 +05:30
Palash Debnath 1ddf79a6de Merge branch 'fix/review-2077' into fix/community-integration
# Conflicts:
#	docs/dubbing/translation-engines.md
2026-09-17 13:48:47 +05:30
Palash Debnath 308dda0cac fix: exclude WebVTT metadata before scanning cue timestamps 2026-09-17 13:48:45 +05:30
Palash Debnath 6a15030e31 Merge branch 'fix/review-2077' into fix/community-integration 2026-09-17 13:15:43 +05:30
Palash Debnath cef375e700 Merge branch 'fix/review-2165' into fix/community-integration
# Conflicts:
#	docs/dubbing/translation-engines.md
#	electron/src/renderer/src/i18n/locales/ar.json
#	electron/src/renderer/src/i18n/locales/de.json
#	electron/src/renderer/src/i18n/locales/en.json
#	electron/src/renderer/src/i18n/locales/es.json
#	electron/src/renderer/src/i18n/locales/fr.json
#	electron/src/renderer/src/i18n/locales/hi.json
#	electron/src/renderer/src/i18n/locales/id.json
#	electron/src/renderer/src/i18n/locales/it.json
#	electron/src/renderer/src/i18n/locales/ja.json
#	electron/src/renderer/src/i18n/locales/ko.json
#	electron/src/renderer/src/i18n/locales/nl.json
#	electron/src/renderer/src/i18n/locales/pl.json
#	electron/src/renderer/src/i18n/locales/pt.json
#	electron/src/renderer/src/i18n/locales/ru.json
#	electron/src/renderer/src/i18n/locales/sv.json
#	electron/src/renderer/src/i18n/locales/th.json
#	electron/src/renderer/src/i18n/locales/tr.json
#	electron/src/renderer/src/i18n/locales/uk.json
#	electron/src/renderer/src/i18n/locales/vi.json
#	electron/src/renderer/src/i18n/locales/zh-CN.json
#	electron/src/renderer/src/i18n/locales/zh-TW.json
#	frontend/src/i18n/locales/ar.json
#	frontend/src/i18n/locales/de.json
#	frontend/src/i18n/locales/en.json
#	frontend/src/i18n/locales/es.json
#	frontend/src/i18n/locales/fr.json
#	frontend/src/i18n/locales/hi.json
#	frontend/src/i18n/locales/id.json
#	frontend/src/i18n/locales/it.json
#	frontend/src/i18n/locales/ja.json
#	frontend/src/i18n/locales/ko.json
#	frontend/src/i18n/locales/nl.json
#	frontend/src/i18n/locales/pl.json
#	frontend/src/i18n/locales/pt.json
#	frontend/src/i18n/locales/ru.json
#	frontend/src/i18n/locales/sv.json
#	frontend/src/i18n/locales/th.json
#	frontend/src/i18n/locales/tr.json
#	frontend/src/i18n/locales/uk.json
#	frontend/src/i18n/locales/vi.json
#	frontend/src/i18n/locales/zh-CN.json
#	frontend/src/i18n/locales/zh-TW.json
#	tests/test_dub_translate.py
2026-09-17 13:15:43 +05:30
Palash Debnath 84290db784 fix: localize Argos runtime recovery across desktop and browser 2026-09-17 13:15:15 +05:30
Palash Debnath 810e5e350b fix: preserve numeric-only subtitle dialogue after skipped cues 2026-09-17 13:14:05 +05:30
Palash Debnath c9fefe39f3 Merge branch 'fix/review-2077' into fix/community-integration 2026-09-17 12:56:48 +05:30
Palash Debnath c3137da680 fix(subtitles): advance index state across invalid cues 2026-09-17 12:56:29 +05:30
Palash Debnath 281287d3e7 Merge branch 'fix/review-2165' into fix/community-integration 2026-09-17 12:52:33 +05:30
Palash Debnath 5c6d0f7f8f test(asr): isolate OOM recovery from host free VRAM 2026-09-17 12:52:31 +05:30
Palash Debnath 819fd6e4a3 Merge branch 'fix/review-2109' into fix/community-integration 2026-09-17 12:51:55 +05:30
Palash Debnath ebc03bb117 chore: clarify timeout metadata fallback and remove unused import 2026-09-17 12:51:20 +05:30