Skip to content

Releases: moonstarsky37/Sublume

v2026.08.10-tw.1

Choose a tag to compare

@github-actions github-actions released this 10 Aug 11:45
2660ab5
docs(readme): keep reader sections jargon-free, move maintenance note…

v2026.08.09-tw.2

Choose a tag to compare

@github-actions github-actions released this 09 Aug 15:53
b2b3fee
refactor(ui): split dialogs.py into a package, add README architectur…

v2026.08.09-tw.1

Choose a tag to compare

@github-actions github-actions released this 08 Aug 16:58
54bb07a
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

Choose a tag to compare

@github-actions github-actions released this 08 Aug 15:02
436b140
feat(asr): add a SenseVoice ONNX backend that starts in ~2s without t…

v2026.08.08-tw.4

Choose a tag to compare

@github-actions github-actions released this 08 Aug 09:57
050fe79
feat(overlay): action-verb run button, selectable header layouts, rea…

v2026.08.08-tw.3

Choose a tag to compare

@github-actions github-actions released this 08 Aug 06:41
ed5395f
fix: runtime UX batch (ASR status, pause, warm-up, density) + uv inst…

v2026.08.08-tw.2

Choose a tag to compare

@github-actions github-actions released this 07 Aug 18:41
2eb10ea
docs: add fork-differences section, clarify install paths and HF_TOKE…

v2026.08.08-tw.1

Choose a tag to compare

@github-actions github-actions released this 07 Aug 17:37
f3d8383
fix: replace upstream-inherited API defaults and survive empty API ke…

v2026.08.07-tw.2

Choose a tag to compare

@github-actions github-actions released this 07 Aug 16:06
9c1f46a
fix(ux): harden model downloads and de-scare the wizard (field feedba…

v2026.08.07-tw.1

Choose a tag to compare

@github-actions github-actions released this 07 Aug 14:45
6640c08
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).