Commit Graph
100 Commits
Author SHA1 Message Date
Palash Debnath 8114132a72 Merge remote-tracking branch 'origin/feat/voxcpm2-isolated' into feat/moss-tts-nano-isolated 2026-09-10 09:45:33 -07:00
Palash Debnath 63a1c1791a fix(engines): an own-venv engine needs a finished install, and VoxCPM2 PCM is 48 kHz
engine_venv_python() accepted any venv interpreter, so a reinstall that
failed partway made the resolver pick the sidecar and report it ready,
hiding the working in-process engine. It now also requires the completion
marker, which the import probe writes only after the engine imported in
that venv and which a new dependency step removes. That covers VoxCPM2
here and PocketTTS / Supertonic-3 from #2016.

The parent reads sidecar PCM at the engine's fixed 48 kHz, so the VoxCPM2
sidecar resamples a model that reports another rate instead of passing its
samples through mislabelled. The retry test now proves a permanent error
runs once.
2026-09-10 09:45:20 -07:00
Palash Debnath a88c39eac1 test: register the MOSS-TTS-Nano sidecar with the stdout guard and STRUCTURE.md 2026-09-10 09:21:58 -07:00
Palash Debnath 3f19b2e9a7 Merge remote-tracking branch 'origin/feat/voxcpm2-isolated' into feat/moss-tts-nano-isolated 2026-09-10 09:21:40 -07:00
Palash Debnath 172a142825 test: register the VoxCPM2 sidecar with the stdout guard and STRUCTURE.md
The #1428 guard pins the exact set of sidecars it scans, and
docs/STRUCTURE.md must list every engine adapter; both failed CI on the
new engines/voxcpm2_subprocess.
2026-09-10 09:21:32 -07:00
Palash Debnath 61a5418c6a Merge remote-tracking branch 'origin/feat/voxcpm2-isolated' into feat/moss-tts-nano-isolated 2026-09-10 09:08:38 -07:00
Palash Debnath b28390af30 test(voxcpm2): patch the base class the engine really inherits
Other suites purge services from sys.modules, so importing
subprocess_backend inside the test can yield a different module than the
one VoxCPM2SubprocessBackend subclassed, and the patch then misses: the
real generate() ran and failed. Patch VoxCPM2SubprocessBackend's own base.
2026-09-10 09:07:59 -07:00
Palash Debnath 4280157407 docs(changelog): link the MOSS-TTS-Nano entry to #2022 2026-09-10 08:21:06 -07:00
Palash Debnath 240a64f086 feat(engines): MOSS-TTS-Nano installs into its own venv, pinned upstream
The in-process MOSS-TTS-Nano engine needs moss_tts_nano installed into the
app's own environment, with upstream's exact pins (torch 2.7.0,
transformers 4.57.1) landing there too. It also cannot work with today's
upstream: moss_tts_nano now exports only __version__, and the model class
the engine looks for is gone. The entry point is the top-level
moss_tts_nano_runtime.NanoTTSService.

The one-click installer now clones a reviewed commit (8b7bcc93,
2026-09-06) into DATA_DIR/engines/moss-tts-nano/ with its own venv. A
self-contained sidecar drives NanoTTSService there: it preloads the model,
heartbeats through the downloads (the model on load, the audio tokenizer on
the first synthesis) and never after, downmixes to mono as the in-process
engine did, resamples to the reported 48 kHz if needed, and reuses one
output file instead of leaving one per call.

The resolver becomes a table (_OWN_VENV_SIDECARS) now that two engines use
it, with a test that each entry's env var is the one its installer sets.
The three identical Intel-Mac gates become one factory.
2026-09-10 08:20:58 -07:00
Palash Debnath 388d554ba0 docs(changelog): link the VoxCPM2 entry to #2021 2026-09-10 08:13:57 -07:00
Palash Debnath 21105b24a5 feat(engines): VoxCPM2 installs into its own venv and runs in a sidecar
VoxCPM2 ran only in-process, so using it meant installing voxcpm, and a
torch of its choosing, into the app's own environment. It now has a
one-click install into DATA_DIR/engines/voxcpm2/.venv and a self-contained
sidecar (engines/voxcpm2_subprocess) that imports nothing from the app.
tts_backend resolves the voxcpm2 id to the sidecar once that venv exists,
and to the in-process class otherwise, so an existing pip install keeps
working.

voxcpm leaves torch unpinned. Resolved with the CUDA index, that paired
PyPI's newest torch (CPU-only on Windows) with a +cu128 torchaudio, and
uv's --torch-backend fell back to voxcpm 1.5.0 on Windows. A new
torch_pins spec field pins the pair, and the host picks the build: +cu128
on CUDA hosts, +cpu on other Windows and Linux hosts, plain on macOS. Each
was resolved with voxcpm==2.0.3. Not offered on Intel Macs, where torch
2.11 has no build.

The parent keeps the reference-clip preparation and the trailing-silence
trim, so output matches the in-process engine. The sidecar retries a
transient weight download like the app's loader does.
2026-09-10 08:13:57 -07:00
Palash Debnath ae68dd5bfd fix(engines): a half-finished install is repaired, not reported installed
An engine with no weights download counted as installed once its venv
interpreter existed, so a dependency install that died halfway made the
next attempt answer already_installed and the engine failed at its first
import. The import probe now writes a completion marker, and a fresh
dependency step removes the old one. IndexTTS keeps its weights check, so
no existing install is asked to reinstall.

The MOSS bootstrap no longer blames a non-CUDA host for an install
failure; the index is always supplied, and uv's error says what failed.
The PocketTTS and Supertonic guides now say where the sidecar runs, and
the three repository-engine guides say what to do if the first weight
download outlasts the compute-time budget.
2026-09-10 08:12:17 -07:00
Palash Debnath 5516750a4f fix(engines): accept Confucius4's requirements.txt-only source layout
Source validation demanded a pyproject.toml in every checkout, and
Confucius4 ships none, so its install could never get past fetching the
source. The manifest file is now per spec. The regression test fabricates
each pinned upstream's real root files.
2026-09-10 07:48:52 -07:00
Palash Debnath c079b721ed feat(engines): Supertonic-3 and PocketTTS install into their own venvs
Both engines ran with the app's interpreter, installed as optional extras
into the app's own environment (`uv sync --extra`). They now get one-click
installs like the sidecar engines: a PyPI-only spec (no source to fetch)
creates DATA_DIR/engines/<id>/.venv and installs the app's own pinned wheel
there, so nothing they install can touch the app or another engine.

Each engine prefers its own venv and falls back to the app's interpreter,
so an existing `uv sync --extra` install keeps working and is never
provisioned over: the spec counts a package found in the app environment
as installed.

PocketTTS installs from PyTorch's CPU index: it never uses a GPU, and
PyPI's Linux torch pulls ~15 NVIDIA packages. It stays unoffered on Intel
Macs, where no usable torch exists.

Supertonic's sidecar loads its constants by path when the revision env var
is absent, instead of importing the engines package, whose __init__
imports the app backend that its own venv does not have.

The Install button is hidden once only the license review stands between
the user and the engine. The installer tests' autouse fixture now removes
every spec's env var on teardown: a bare delenv of an unset var restored
nothing, and a persisted path leaked into later suites.
2026-09-10 07:44:42 -07:00
Palash Debnath faa3d39836 feat(engines): isolated one-click installs for MOSS-TTS-v1.5, Confucius4 and dots.tts
Three engines that shipped as terminal-only setups now install from Model
Catalogue → Engines with the existing sidecar installer, which is
generalised to take a per-engine venv interpreter, install target, import
probe and host gate.

Each engine gets DATA_DIR/engines/<id>/ with its own checkout and .venv;
every uv pip install passes --python for that venv, never the app's
interpreter. Switching the active engine only changes a pref, so moving
between engines and back cannot corrupt a working one, and uninstalling one
removes only its own folder. Tests pin both invariants for every spec.

MOSS-TTS-v1.5's [torch-runtime] extra pins torch==2.9.1+cu128, which exists
only on PyTorch's index, so its manual install and its bootstrap could never
resolve (#2015). core.torch_indexes defines the index once for the
installer and the bootstrap, and a test ties it to the app's own
pytorch-cuda index.

Install buttons appear only where the install can work: MOSS on CUDA hosts,
dots.tts off Windows (upstream publishes no Windows install). A direct POST
on an unsupported host gets a 409 with the reason. An engine with no
one-click install now points at its guide, not at a page with no Install
button.
2026-09-10 07:28:42 -07:00
Palash Debnath dea884a22d Merge pull request #2006 from debpalash/fix/worker-artifact-id-posix
fix(worker): identify a staged input the same way on every OS (#2005)
2026-09-10 05:31:39 -07:00
Palash Debnath bee9fa25ff Merge remote-tracking branch 'origin/main' into fix/worker-artifact-id-posix
# Conflicts:
#	CHANGELOG.md
2026-09-10 05:02:02 -07:00
Palash Debnath 06c15ce37f fix(worker): identify a staged input the same way on every OS (#2005)
A staged task input's artifact id was built with os.path.join, so a Windows
control plane produced `inputs\<sha256>.wav`. That id is not a local path. It
is persisted into remote_tasks.params_json, shipped to remote workers over
gRPC as the identifier for the input they must fetch, and compared against a
later disk sweep to decide whether a staged file is still referenced.

So a Windows host hands a Linux worker `inputs\abc.wav`, where the backslash is
an ordinary filename character and no such file exists. Remote GPU workers are
a shipped feature; this broke them for every Windows control plane. The same
ids also stop matching when an omnivoice_data/ directory moves between
operating systems.

artifact_id_for() makes it canonical POSIX — resolve_within already treats both
separators as structural, so resolution is unchanged. normalize_artifact_id()
covers the upgrade: rows written by the old code carry a backslash, and the
sweeper decides "unreferenced" by comparing ids, so without it an upgraded
install reads every legacy row as garbage and deletes inputs that surviving
tasks still point at.

Two other tests in this run asserted POSIX-only behaviour rather than product
behaviour, and are corrected here too:

  - the durability-barrier test required a directory fsync, which
    _fsync_parent_directory deliberately skips without os.O_DIRECTORY. It now
    gates on that same attribute rather than on the OS name, so the test and
    the code it checks cannot drift apart.
  - the read-only-cache test built its scenario with chmod(0o500), which on
    Windows only toggles a read-only FILE attribute and does not stop a file
    being created inside the directory. It verifies its premise by probing and
    skips when the host writes anyway — which also covers root and anything
    holding CAP_DAC_OVERRIDE, replacing a geteuid check that named only one of
    them.

Then the reason none of this was visible: CI runs tests/ on Linux only. The two
worker suites join the existing Windows step in the smoke matrix. They need no
ffmpeg, so they cost seconds. Verified green on Windows first — 244 tests
across the four suites in that step.

Fails before, passes after, both directions: a staged id containing a
backslash, and a legacy-id input deleted by the sweeper.
2026-09-10 04:51:36 -07:00
Palash Debnath bb9149ce1f Merge pull request #2004 from debpalash/fix/grpc-loop-budget
test(worker): size the loop-responsiveness budget against what it measures
2026-09-10 04:40:54 -07:00
Palash Debnath 4c10e802ab test(worker): size the loop-responsiveness budget against what it measures
main is red. Smoke (Windows) failed on
test_upload_durability_barrier_does_not_block_the_grpc_loop with

    assert 0.20299999999997453 < 0.2

Three milliseconds of scheduling noise on a shared runner, and a red build
that says nothing about the product.

The three tests here prove a blocking filesystem call does NOT stall the gRPC
event loop: they park the call on a barrier and check the loop still ran their
own coroutine promptly. That is a wall clock on shared hardware, so the two
numbers have to be chosen against each other. The discriminator was a 0.5 s
watchdog — a stalled loop could not proceed until it fired — while the budget
sat at 0.2 s. Responsive measured ~0.2. The line was drawn exactly where the
noise lives.

Both numbers are named constants now, with the reasoning next to them:
a 1.5 s hold, a 0.75 s budget. Responsive lands near 0.2, stalled lands at 1.5,
and the line sits between them with room on both sides. The waiter's own cap
moved above the hold too, so a genuinely stalled loop is reported by the budget
assertion that names the problem rather than by a bare TimeoutError.

Verified the assertion is still worth having: with the blocking call made to
stall the loop for real, the test fails. It is a wider net, not a hole.

55 tests in the file, three runs in a row.
2026-09-10 04:15:06 -07:00
Palash Debnath c021fac1d8 Merge pull request #2003 from debpalash/land/2002-inert-badge
feat(pronunciation): badge a stored-but-inert entry in the list (#1949)
2026-09-10 04:05:28 -07:00
Palash Debnath 24e0737e0d fix(pronunciation): badge only the entries the backend calls inert
Both review bots found the same thing independently: `e.type !== 'respelling'`
badged rows the user had switched OFF. A disabled entry is indeed not applied,
but for a reason the toggle already shows — labelling it "not applied yet"
reads as a defect rather than their own choice. `inert_entries_for_language`
excludes disabled rows for exactly that reason, so the badge now matches it.

Not taken: the suggestion to name `ipa` and `cmu` explicitly instead of testing
against respelling. The backend's rule is that everything which is not
respelling is inert today, and mirroring it keeps the two in step. An explicit
list would silently stop badging a notation added later — an entry that saves,
validates, toggles on and quietly does nothing, which is the invisibility #1949
exists to remove. A test pins that direction with an unfamiliar type.

Two tests, one per direction. The disabled case fails without the enabled gate.
2860 vitest tests green.
2026-09-10 03:38:44 -07:00
Palash Debnath 06f7c4af7b feat(pronunciation): badge a stored-but-inert entry in the list (#1949)
Takes the part of #2002 by @utkarsha741 that #1984 did not already cover.

An IPA or CMU row saves, validates and toggles on, and is then dropped before
term matching — Phase 1 only substitutes respelling. #1984 made that visible in
the "Test a sentence" preview, which the user sees only if they run a test. The
entry LIST is where they look at what they have saved, and there it still
looked like every other working row.

So the row carries the same fact: a warning badge next to the type and scope
badges, on IPA and CMU only. Badging a respelling row would be the opposite
lie — those do take effect.

The rest of #2002 is already on main under a different name: it re-added the
backend skip detection and the test-preview line as `skipped_terms`, where
`inert_entries_for_language` and `inert_entries` have shipped since #1984.
Landing that half would have been a second implementation of one behaviour with
two response fields for it.

String added to all 21 locales, not just en, so the badge is not an English
island in a translated panel. Fails before, passes after: with the badge
condition disabled the new test cannot find it. 2858 vitest tests, 529 locale
and CJK guard tests green.
2026-09-10 03:26:44 -07:00
Palash Debnath c9a587ea75 Merge pull request #2000 from debpalash/land/1998-powershell-key
docs(docker): make the PowerShell key URL-safe too (#1998)
2026-09-10 03:21:39 -07:00
Palash Debnath 50b1184df3 Merge pull request #1996 from debpalash/fix/1933-port-holder
fix(backend): name who actually holds port 3900 (#1933)
2026-09-10 02:52:16 -07:00
Palash Debnath b6a0f96e90 Merge pull request #1992 from debpalash/fix/1900-attempt-id
fix(bootstrap): emit an attempt id so the splash stops guessing (#1900)
2026-09-10 02:22:28 -07:00
Palash Debnath 93771a0201 Merge pull request #2001 from debpalash/fix/worker-barrier-flake
test(worker): stop spinning the loop the awaited work needs
2026-09-10 02:22:22 -07:00
Palash Debnath 9a7f5fd7ed Merge pull request #1994 from debpalash/fix/1850-crash-tail
fix(crash): capture the dying backend's last words, not the log so far (#1850)
2026-09-10 01:52:06 -07:00
Palash Debnath e3efe4a39a Merge pull request #1999 from debpalash/fix/windows-backend-tests
test: make the isolated backend session pass on Windows, and gate it there
2026-09-10 01:07:27 -07:00
Palash Debnath 5b842280c8 Merge pull request #1997 from debpalash/fix/1931-blackwell-docs
docs+test: finish the RTX 50-series story (#1931)
2026-09-10 00:56:32 -07:00
Palash Debnath 770fe35da9 Merge pull request #1995 from debpalash/fix/1927-crash-hint
fix(crash): say what the exit code means in the crash details (#1927)
2026-09-10 00:36:16 -07:00
Palash Debnath 924172e012 Merge pull request #1986 from debpalash/fix/1960-name-the-language
fix(dub): name the source language code that was rejected
2026-09-10 00:04:53 -07:00
Palash Debnath 2bf922d9e5 Merge pull request #1993 from debpalash/land/1987-followup
docs(docker): finish the ARM64 Compose guidance (#1987)
2026-09-10 00:00:11 -07:00
Palash Debnath d52a4c89a7 Merge pull request #1991 from debpalash/fix/windows-symlink-tests
test: let a stock Windows checkout run the symlink tests (#1990)
2026-09-09 23:59:58 -07:00
Palash Debnath 525a2809eb Merge pull request #1989 from debpalash/land/1981-structure
docs: refresh STRUCTURE.md and pin its counts to the tree (#1981)
2026-09-09 23:48:11 -07:00
Palash Debnath 5e4f863c4d Merge pull request #1988 from debpalash/land/1987-docker-arch
docs(docker): document the amd64-only images and the ARM64 workaround (#1987)
2026-09-09 23:39:41 -07:00
Palash Debnath 12794f3dae Merge pull request #1985 from debpalash/fix/1773-classic-error-class
fix(errors): carry the backend error class onto a classic 500
2026-09-09 23:39:30 -07:00
Palash Debnath 60b696f37f Merge pull request #1984 from debpalash/fix/1949-phoneme-visible
fix(pronunciation): say when an IPA/CMU entry is stored but not applied
2026-09-09 23:23:18 -07:00
Palash Debnath 0f237a9b25 Merge pull request #1983 from debpalash/fix/1847-bootstrap-log-file
fix(bootstrap): keep the first-run install log after setup finishes
2026-09-09 22:57:53 -07:00
Palash Debnath f905230fd8 Merge pull request #1982 from debpalash/fix/1974-dev-port-ownership
fix(dev): reclaim the port from a backend the app itself left running
2026-09-09 22:39:58 -07:00
Palash Debnath 8e2928ca56 Merge pull request #1980 from debpalash/fix/1858-shortcut-registration
fix(dictation): say when another app already owns the shortcut
2026-09-09 22:22:01 -07:00
Palash Debnath 3013cdc241 Merge pull request #1979 from debpalash/fix/1898-windows-quit
fix(windows): stop reporting every deliberate quit as a crash
2026-09-09 22:04:19 -07:00
Palash Debnath 939bdc7248 Merge pull request #1978 from debpalash/fix/1857-reduced-motion
feat(a11y): add an in-app Reduce motion switch
2026-09-09 21:44:50 -07:00
Palash Debnath 7d1f44f8bd Merge pull request #1977 from debpalash/land/1975-light-theme
fix(a11y): land the light theme, with one token raised to clear WCAG AA
2026-09-09 21:26:39 -07:00
Palash Debnath d0ab15c376 Merge pull request #1972 from debpalash/fix/1826-input-too-short
fix(errors): explain a too-short input instead of quoting torch's conv error
2026-09-09 20:59:29 -07:00
Palash Debnath 9426006d3c Merge pull request #1971 from debpalash/fix/1849-uiscale-order
fix(setup): offer the text-size control before first run, not after it
2026-09-09 16:28:44 -07:00
Palash Debnath c6d7a19f42 Merge pull request #1970 from debpalash/fix/1879-clone-reference
fix(errors): say 'no reference clip' instead of naming library parameters
2026-09-09 16:10:58 -07:00
Palash Debnath ac63eff33d Merge pull request #1969 from debpalash/fix/1931-torchaudio-backend
fix(startup): guard the torchaudio API removed in 2.9, and document the Blackwell path
2026-09-09 15:52:29 -07:00
Palash Debnath 7b7b491ba0 Merge pull request #1968 from debpalash/fix/small-batch-1
fix(errors): point a generation timeout at Settings, not an environment variable
2026-09-09 15:36:25 -07:00
Palash Debnath 42b4bf856f Merge pull request #1967 from debpalash/fix/1866-engine-reason
fix(engines): say why an engine is unavailable instead of reporting a failed check
2026-09-09 15:19:40 -07:00
Palash Debnath 5069872752 Merge pull request #1966 from debpalash/fix/1845-setup-pill
fix(dictation): stop the Accessibility prompt owning the screen indefinitely
2026-09-09 15:02:45 -07:00
Palash Debnath a4cb4afe37 Merge pull request #1965 from debpalash/fix/1856-dictation-step
fix(setup): stop the last onboarding step failing three times with no model
2026-09-09 14:45:32 -07:00
Palash Debnath bb4e99a336 Merge pull request #1964 from debpalash/fix/1957-untrusted-mount
fix(errors): explain a Windows untrusted-mount failure instead of echoing WinError 448
2026-09-09 14:26:49 -07:00
Palash Debnath 6a44733297 Merge pull request #1962 from debpalash/land/queue2
Land the reviewed PR queue, part two: log panel, bootstrap mirror, setup diagnostics
2026-09-09 13:58:18 -07:00
Palash Debnath f82f35ee97 Merge pull request #1963 from debpalash/land/queue3
Land the reviewed PR queue, part three: zh-CN locale and null capture timings
2026-09-09 13:43:45 -07:00
Palash Debnath 854609e459 Merge pull request #1952 from debpalash/feat/local-workspace-dictation-polish
Improve dictation controls and creative workspace layouts
2026-09-09 13:41:19 -07:00
Palash Debnath a68f85c51b Merge pull request #1958 from debpalash/land/queue1
Land the reviewed PR queue: audiobook, engines, bootstrap, setup and download fixes
2026-09-09 13:13:25 -07:00
Palash Debnath e0309be21f Merge pull request #1955 from debpalash/fix/windows-backend-watchdog-hang
fix(backend): stop Windows desktop launches freezing at "Loading ML runtime"
2026-09-09 12:56:20 -07:00
Palash Debnath cea6678ea7 Merge pull request #1956 from debpalash/fix/1800-stream-error-class
fix(errors): make an unclassified failure report say something true and specific
2026-09-09 12:30:09 -07:00
Palash Debnath cea00a4889 Merge pull request #1908 from psiberfunk/codex/fix-synthesis-progress-indeterminate
fix(studio): show honest synthesis progress
2026-09-09 12:22:07 -07:00
Palash Debnath 6268eacf35 Merge pull request #1903 from psiberfunk/codex/fix-transcriptions-dictation
fix(dictation): make Transcriptions capture actionable
2026-09-09 12:22:01 -07:00
Palash Debnath a2653824ce Merge pull request #1896 from psiberfunk/fix/bootstrap-splash-observed-stages-1894
fix(bootstrap): stop showing first-run install steps on warm starts
2026-09-09 12:21:55 -07:00
Palash Debnath 71056bcdb4 Merge pull request #1890 from psiberfunk/fix/widget-pill-shadow-clip
fix(dictation): stop clipping the widget pill's drop shadow into a rectangle
2026-09-09 12:21:49 -07:00
Palash Debnath b5441bea36 Merge pull request #1888 from psiberfunk/fix/macos-dock-reopen
fix(desktop): handle Dock-icon reopen on macOS
2026-09-09 12:21:44 -07:00
Palash Debnath d7751ad7ce Merge pull request #1885 from psiberfunk/fix/capture-pill-setup-tooltip
fix(dictation): give the setup-state pill label a hover tooltip
2026-09-09 12:21:38 -07:00
Palash Debnath 2b027cb54a Merge branch 'main' into fix/1859-launchpad-scroll-shrink 2026-09-09 12:20:27 -07:00
Palash Debnath d2fb292217 Merge pull request #1938 from debpalash/dependabot/npm_and_yarn/frontend/vitest-4.1.11
chore(deps-dev): bump vitest from 4.1.9 to 4.1.11 in /frontend
2026-09-09 12:18:24 -07:00
Palash Debnath a754faec04 docs: link dictation changes to PR 1952 2026-09-09 18:58:27 +05:30
Palash Debnath 8fc003ad7c Merge remote-tracking branch 'origin/main' into feat/local-workspace-dictation-polish 2026-09-09 18:55:28 +05:30
Palash Debnath 99a534882c feat: improve dictation controls and creative workspaces 2026-09-09 18:55:19 +05:30
Palash Debnath 18f56a7940 Merge pull request #1926 from debpalash/feat/audiocpp-gpu-routing
feat(audiocpp): route native GPU backends
2026-09-08 23:53:34 +05:30
Palash Debnath 870b6f93ba fix(audiocpp): harden GPU runtime routing 2026-09-08 23:33:40 +05:30
Palash Debnath 4f4dc7e068 fix(audiocpp): budget unknown GPU memory safely 2026-09-08 21:02:44 +05:30
Palash Debnath d5c0fa6f75 fix(worker): derive every engine capacity 2026-09-08 20:52:24 +05:30
Palash Debnath fe53e02693 fix(audiocpp): harden async and worker routing 2026-09-08 19:45:48 +05:30
Palash Debnath 56f8b616cc test(audiocpp): make CPU thread assertion portable 2026-09-08 19:10:44 +05:30
Palash Debnath f1016cdedd fix(audiocpp): budget low-memory Vulkan GPUs 2026-09-08 18:42:32 +05:30
Palash Debnath 68194c004d docs(changelog): note audio.cpp GPU routing 2026-09-08 18:32:46 +05:30
Palash Debnath 23dd8728d1 fix(audiocpp): preserve GPU routing across workers 2026-09-08 18:30:12 +05:30
Palash Debnath fc237d3929 fix(audiocpp): harden native GPU routing 2026-09-08 18:10:51 +05:30
Palash Debnath 260519d4ee Merge branch 'main' into feat/audiocpp-gpu-routing
# Conflicts:
#	CHANGELOG.md
#	backend/engines/audiocpp/__init__.py
#	backend/engines/audiocpp/bootstrap.py
2026-09-08 17:29:25 +05:30
Palash Debnath 8f140e550d Merge pull request #1891 from debpalash/work/local-audiocpp-catalogue
feat(audiocpp): add CPU Breeze-TTS-2 backend and responsive catalogue rows
2026-09-08 16:43:12 +05:30
Palash Debnath 25c41e630c fix(audiocpp): gate readiness on model 2026-09-08 16:29:28 +05:30
Palash Debnath ffc5c07949 fix(audiocpp): require explicit model install 2026-09-08 16:21:08 +05:30
Palash Debnath 503407272e feat(audiocpp): route native GPU backends 2026-09-08 15:05:23 +05:30
Palash Debnath 6b2683eb32 fix(audiocpp): replace stale model aliases 2026-09-08 14:51:42 +05:30
Palash Debnath 132fdf313e fix(audiocpp): support cross-filesystem model aliases 2026-09-08 14:34:00 +05:30
Palash Debnath 9bfa3ec751 fix(audiocpp): ship verified CPU runtime 2026-09-08 14:27:19 +05:30
Palash Debnath c6fbedbecb fix(audiocpp): resolve security review findings 2026-09-08 13:09:56 +05:30
Palash Debnath e2b5b3d6ed fix(audiocpp): validate the real pinned runtime 2026-09-08 13:02:35 +05:30
Palash Debnath af216d8411 docs: reference local work draft PR in changelog 2026-09-07 20:21:47 +05:30
Palash Debnath 65ea0dc376 feat: preserve audio.cpp backend and responsive catalogue work 2026-09-07 20:20:54 +05:30
Palash Debnath 9790d28922 Merge pull request #1883 from debpalash/codex/fix-windows-nonadmin-smoke
fix(ci): prepare hosted Windows policy for non-admin MSI smoke
2026-09-07 18:43:14 +05:30
Palash Debnath 6a733a4c52 docs: reference installer smoke fix in changelog 2026-09-07 18:21:21 +05:30
Palash Debnath 5cde34c113 fix(ci): prepare hosted Windows policy for non-admin MSI smoke 2026-09-07 18:20:43 +05:30
Palash Debnath bd84169ff2 Merge pull request #1881 from debpalash/codex/fix-per-user-resource-snapshot
fix(windows): preserve frontend resources during per-user MSI build
2026-09-07 17:13:27 +05:30
Palash Debnath 4486b479a1 test: run generated asset hook inside MSI fixture 2026-09-07 16:44:14 +05:30
Palash Debnath 74aa444485 docs: reference installer resource fix PR 2026-09-07 16:43:01 +05:30
Palash Debnath e1e96ae5a2 fix: preserve frontend resources during per-user MSI build 2026-09-07 16:41:20 +05:30
Palash Debnath 0d39a5b283 test: exercise MSI build hooks with changing resource filenames 2026-09-07 16:40:12 +05:30