2842 Commits
Author SHA1 Message Date
Palash Debnath 8c6cb9a9ac Merge pull request #2186 from debpalash/chore/electron-0.5.4
chore(release): prepare Electron 0.5.4 reliability update
2026-09-17 23:57:12 +05:30
Palash Debnath da05973f78 test(release): enforce concise Highlights and repair guide anchor 2026-09-17 23:33:00 +05:30
Palash Debnath 860f62a9a0 docs(release): reconcile introduction and change-entry ordering 2026-09-17 23:21:30 +05:30
Palash Debnath e63e0a6634 docs(release): sync owner presentation and contributor-credit requirements 2026-09-17 23:18:41 +05:30
Palash Debnath c38b7d0bbb docs(release): use the contributor current GitHub handle 2026-09-17 23:13:09 +05:30
Palash Debnath 1746868fc7 Merge remote-tracking branch 'origin/main' into chore/electron-0.5.4 2026-09-17 23:11:41 +05:30
Palash Debnath 3b9ca6401d Merge pull request #2175 from shivsin25/fix/2156-auto-language-profile-override
fix(generate): name the voice profile behind a refused language
2026-09-17 10:41:36 -07:00
Palash Debnath 07e9b8dc84 docs(release): explain the runtime refresh after upgrading 2026-09-17 22:55:02 +05:30
Palash Debnath 478590b689 docs(release): describe 0.5.4 fixes and verified community credits 2026-09-17 22:47:44 +05:30
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 9dc41252c1 Merge pull request #2174 from paranoyouz-collab/fix/kokoro-supported-language-list
fix(tts): name every Kokoro language from the installed table
2026-09-17 10:15:40 -07:00
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 082d7260d5 docs: credit Kokoro fix author alongside the bug reporter 2026-09-17 22:23:44 +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 1fd321d145 Merge pull request #2173 from shivsin25/fix/2163-gated-install-token
fix(setup): send the HF token when installing a gated model
2026-09-17 09:27:20 -07:00
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 750e81bcf7 Merge pull request #2179 from debpalash/fix/runtime-validation-2176
fix(electron): validate reused runtimes before startup
2026-09-17 09:01:54 -07:00
Palash Debnath 8a7ab51784 fix(electron): isolate runtime probes and reuse healthy fallback 2026-09-17 21:06:12 +05:30
Palash Debnath 7ed58cb5b7 Merge remote-tracking branch 'origin/main' into fix/runtime-validation-2176
# Conflicts:
#	CHANGELOG.md
2026-09-17 20:42:36 +05:30
Palash Debnath 20f7329f59 Merge pull request #2172 from debpalash/fix/voice-conversion-capability-2147
fix(electron): check cloning capability before voice conversion
2026-09-17 08:12:07 -07:00
Palash Debnath c52441188e fix(electron): retain fresh custom runtime destinations 2026-09-17 20:36:10 +05:30
Palash Debnath 49f9fe3b06 docs: explain recovery from gated installer token failures 2026-09-17 20:31:30 +05:30
Palash Debnath f6d1e0c2df fix(kokoro): resolve the advertised British English label 2026-09-17 20:30:40 +05:30
Palash Debnath d217553e2e fix(electron): preserve unowned roots without project folders 2026-09-17 20:30:38 +05:30
Palash Debnath d6efb14849 fix(electron): preserve selected runtime ownership during repair 2026-09-17 20:23:05 +05:30
Palash Debnath a222974568 fix(generate): localize terminal language refusals across streaming paths 2026-09-17 20:21:30 +05:30
Palash Debnath ed9e40253c Merge remote-tracking branch 'origin/main' into fix/review-2175
# Conflicts:
#	CHANGELOG.md
2026-09-17 20:15:20 +05:30
Palash Debnath 86c37c8d04 style: format engine retry guidance 2026-09-17 20:14:09 +05:30
Palash Debnath a4ffd5229b Merge remote-tracking branch 'origin/main' into fix/review-2174 2026-09-17 20:13:54 +05:30
Palash Debnath 4b3e998de3 test(setup): validate file lists and isolate token fixtures 2026-09-17 20:13:38 +05:30
Palash Debnath 8b2ec7ba51 Merge remote-tracking branch 'origin/main' into fix/voice-conversion-capability-2147
# Conflicts:
#	CHANGELOG.md
2026-09-17 20:13:37 +05:30
Palash Debnath af8810be53 fix(electron): offer retry when engine capability lookup fails 2026-09-17 20:13:18 +05:30
Palash Debnath 1ef42a6b21 Merge remote-tracking branch 'origin/main' into fix/review-2173 2026-09-17 20:12:15 +05:30
Palash Debnath 31baa43650 Merge remote-tracking branch 'origin/main' into fix/runtime-validation-2176
# Conflicts:
#	CHANGELOG.md
2026-09-17 20:12:01 +05:30
Palash Debnath 834b305c05 fix(electron): validate reused Python runtimes before startup 2026-09-17 20:11:38 +05:30
Palash Debnath 418b1b271d Merge pull request #2171 from debpalash/fix/signal-diagnostic-ci
test(lifecycle): handle both valid SIGKILL diagnostics
2026-09-17 07:41:16 -07:00
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 ad6dae49cd docs(changelog): correct this PR's number to #2175
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 19:34:14 +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
Claude 743f4918cb test(tts): document the Kokoro label tests
Raises docstring coverage on the changed files past the threshold the PR
check enforces; the reasoning each test carried in a leading comment now
lives where the checker and a reader both find it.
2026-09-17 11:43:08 +00:00
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 b1f900c996 test: accept startup and supervisor SIGKILL diagnostics 2026-09-17 16:28:42 +05:30
Palash Debnath a8581f899e Merge pull request #2170 from debpalash/fix/community-integration
fix(runtime): integrate reviewed engine, transcription, and import reliability fixes
2026-09-17 03:40:31 -07:00