github nesquena/hermes-webui v0.51.75
v0.51.75 — Release AY

latest releases: v0.51.79, v0.51.78, v0.51.77...
4 hours ago

v0.51.75 — Release AY

Stage-368: 11-PR safe-lane batch + maintainer pytest-loop fix.

Composition

Test infrastructure

  • stage-368 maintainer fix — Permanent os.execv guard in tests/conftest.py to prevent pytest from self-looping on the _schedule_restart daemon thread. Tests in tests/test_update_banner_fixes.py exercise api.updates._schedule_restart(), which spawns a daemon thread that eventually calls os.execv(). Those tests monkeypatch os.execv for the test scope, but monkeypatch teardown can win the race against the daemon thread — the real os.execv is restored before the thread fires it, and the daemon re-execs the entire pytest process with the original argv. From the outside this looked like pytest hanging at 99% and then restarting the entire suite from 0% in an infinite loop. The fix shadows os.execv with a permanent no-op wrapper at conftest module-import time; tests that need to verify execv was called still patch it themselves. New tests/test_pytest_execv_guard.py pins the guard against future conftest refactors.

Added

Fixed

  • PR #2391 by @Michaelyklam (fixes #2389) — Reduce browser storage pressure: SW dual-cache window during version bumps + unbounded per-session localStorage map growth.
  • PR #2387 by @Michaelyklam (fixes #2386) — Guard localStorage.setItem('hermes-webui-session', ...) and workspace-panel writes with try/catch.
  • PR #2368 by @Michaelyklam — Hybridize background profile env routing: thread-local + os.environ.update mirror under narrow _ENV_LOCK.
  • PR #2382 by @Michaelyklam (fixes #2380) — Serve raw chat attachments from per-session inbox via api/file/raw with path-traversal guards intact.
  • PR #2385 by @franksong2702 — Keep fuller compression snapshots reachable in sidebar.
  • PR #2371 by @franksong2702 — Clarify interrupted turn recovery after WebUI restart.
  • PR #2378 by @Michaelyklam — Strip historical images in text-only mode via new cfg= kwarg on _sanitize_messages_for_api.
  • PR #2375 by @Michaelyklam — Keep Markdown tables block-level (add table to paragraph-wrap skip list).
  • PR #2372 by @mccxj — Settings → Conversation page action buttons respect locale selection.
  • PR #2381 by @Michaelyklam (fixes #2379) — German session-time labels now interpolate {n} correctly.

Verification

  • pytest: 5747 passed, 10 skipped, 1 xfailed, 2 xpassed, 8 subtests passed in 106.70s. EXIT=0. Single run, no self-loop.
  • Opus advisor: SHIP verdict. Risk areas A–G verified clean. No SHOULD-FIX items.
  • Production server health verified.

DEFER (follow-up)

  • Complete #2297 coverage in _handle_chat_sync (api/routes.py:7871) — pass cfg=_cfg to _sanitize_messages_for_api in the fallback POST /api/chat path. ~2 LOC, fallback endpoint unused by frontend. Will be filed as follow-up issue.

Auto-close issues

#2389, #2386, #2380, #2379

What's Changed

New Contributors

Full Changelog: v0.51.74...v0.51.75

Don't miss a new hermes-webui release

NewReleases is sending notifications on new releases.