Releases: moonstarsky37/Sublume
Releases · moonstarsky37/Sublume
Release list
v2026.08.10-tw.1
docs(readme): keep reader sections jargon-free, move maintenance note…
v2026.08.09-tw.2
refactor(ui): split dialogs.py into a package, add README architectur…
v2026.08.09-tw.1
refactor(model-manager): split into registry, cache and download (#21)
* fix(test): undo the wizard's global side effects in teardown
SetupWizardDialog._start_download() installs a handler on the root logger and
replaces sys.stderr, both bound to that dialog's Qt signals. Production removes
them in _check_done(); the tests that stub out the download thread never reach
it, so the handler outlived the dialog. Once the dialog was garbage collected,
the next test that logged anything at all wrote into a deleted C++ object and
took the whole pytest process down:
Windows fatal exception: access violation
dialogs.py line 52 in emit <- the wizard's handler, object dead
logging/__init__.py line 1551 in warning
translator.py line 249 <- an unrelated test writing a log line
The suite only survived this by luck: nothing had logged between that test and
the end of the run. Reordering the files was enough to expose it.
The fixture now removes the handler and restores sys.stderr on the way out.
* refactor(model-manager): split into registry, cache and download
model_manager.py had grown to 845 lines holding three unrelated jobs with very
different failure modes: looking things up in a table (cannot fail), inspecting
the models directory (permissions, half-finished downloads), and fetching over
the network (timeouts). Changing any one of them meant locating it inside 845
lines, and the module sat in mypy's baseline exemption, so none of it was type
checked.
registry.py 174 lines ids, profiles, display names, normalization.
Touches neither the filesystem nor the network.
cache.py 491 lines MODELS_DIR, cache env, completeness checks, sizes.
download.py 225 lines proxy plumbing and the fetch routines. The only
module here that opens a socket.
__init__.py 101 lines re-exports everything, so no call site changed.
Dependencies run one way, registry <- cache <- download.
Every node was moved by walking the AST rather than by hand-picked line ranges,
taking each node's exact span plus the comment block directly above it, so what
landed is byte-identical to what left. Acceptance was a public API snapshot
diffed before and after: 56 names, 36 signatures and every constant value, with
CHANGED required to be empty. It is. The six names that disappeared are os,
logging, Path, ROOT, contextlib and log - imports that leaked into the namespace,
never part of the API, and confirmed unused from outside.
Two things fell out of the move:
- Four tests patched model_manager.MODELS_DIR, which after the split is the
re-exported binding rather than the one cache.py's functions read. They failed
loudly, which is the good outcome - had they passed quietly they would have
been running against the real models/ directory. They now patch
mm.cache.MODELS_DIR.
- The old baseline entry covered only the flat module, so the new submodules
surfaced two real type errors (a comprehension returning object instead of str,
and an unannotated dict). Project policy is to shrink that list when splitting,
so both are fixed and livetranslate.model_manager is no longer exempt.
ruff clean, mypy clean over 84 files, pytest 301 passed.
* fix(test): patch is_silero_cached on the module that reads it
Same class of mistake as the MODELS_DIR patches fixed in the split commit, and
the one I missed there: get_missing_models reads its own module global, so
patching the re-exported livetranslate.model_manager name does nothing.
It passed locally for the wrong reason. This machine has the silero-vad package
installed, so the unpatched function returns True regardless and the assertion
held. CI installs no such package, the real function returned False, and
"silero-vad" appeared in a list the test expected to hold only the engine.
Patching mm.cache makes it bite. A companion test patches it to False and
expects silero-vad in the list, so if the target ever drifts again the failure
shows up on any machine instead of waiting for one without the package.
v2026.08.08-tw.5
feat(asr): add a SenseVoice ONNX backend that starts in ~2s without t…
v2026.08.08-tw.4
feat(overlay): action-verb run button, selectable header layouts, rea…
v2026.08.08-tw.3
fix: runtime UX batch (ASR status, pause, warm-up, density) + uv inst…
v2026.08.08-tw.2
docs: add fork-differences section, clarify install paths and HF_TOKE…
v2026.08.08-tw.1
fix: replace upstream-inherited API defaults and survive empty API ke…
v2026.08.07-tw.2
fix(ux): harden model downloads and de-scare the wizard (field feedba…
v2026.08.07-tw.1
chore(release): prepare first fork release v2026.08.07-tw.1 (#13) - Add the fork's first changelog entry (2026-08-07) to all three locale changelogs: HF-only downloads, wizard redesign, zh-TW first-class, VAD tail-flush fix, pysbd requirements fix, Phase 1-3 refactor, CI quality gate. - Fix release.yml: build_release.ps1 moved to scripts/ in the repo-tidy commit, but the workflow still called it at the repo root, so any tag push would have failed the release build. - Drop the now-redundant standalone pysbd install from the portable bootstrap (requirements.txt declares it since the pysbd fix).