diff --git a/.env.example b/.env.example index 938f023b12f..19dff7dc1cd 100644 --- a/.env.example +++ b/.env.example @@ -16,7 +16,7 @@ # HERMES_WEBUI_PORT=8787 # Where to store sessions, workspaces, and other state (default: ~/.hermes/webui-mvp) -# HERMES_WEBUI_STATE_DIR=~/.hermes/webui-mvp +# HERMES_WEBUI_STATE_DIR=~/.hermes/webui # Default workspace directory shown on first launch # HERMES_WEBUI_DEFAULT_WORKSPACE=~/workspace diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d40ac1c250..5ff8b6e4c9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,19 @@ ## [Unreleased] -### Fixed +## [v0.50.245] — 2026-04-30 + +### Fixed +- **Cron `Run Now` no longer crashes with `NameError: run_job is not defined`** — `_run_cron_tracked()` runs in a worker thread but referenced `run_job` only via a local import inside `_handle_cron_run()` (a different scope). Manual cron execution now imports `run_job` inside the worker function itself, and the redundant import is removed from the route handler. Adds AST-based regression tests so future refactors can't silently re-break the worker-thread scope. (`api/routes.py`, `tests/test_cron_run_job_import.py`) @fxd-jason — PR #1317, fixes #1310 (also addressed by #1312/#1329, closed as duplicates) +- **Context auto-compressed banner no longer repeats every turn after first compression** — the fallback compression detector compared cumulative `compression_count > 0`, which stays true forever after the first compression event, so the banner re-fired on every subsequent turn. Now snapshots `compression_count` before `run_conversation()` and compares against the snapshot, so the banner only fires when compression actually happens during the current turn. (`api/streaming.py`) @qxxaa — PR #1316 +- **Mobile workspace panel sliver and composer footer overlap (#1300)** — saved desktop workspace-panel widths leaked into compact/mobile layouts, leaving a thin right-edge workspace sliver and a stale shadow on closed panels. Composer footer controls also showed icon/text overlap at intermediate widths when sidebars constrained the chat column. The fix clears/reapplies the rightpanel inline width only when the viewport is outside the compact/mobile breakpoint, hides the closed off-canvas shadow, and adds staged composer-footer container queries so workspace/model labels collapse before they overlap. (`static/boot.js`, `static/style.css`, `tests/test_mobile_layout.py`) @franksong2702 — PR #1328, fixes #1300 +- **Streaming sessions stay visible in the sidebar during their first turn** — the `Untitled + 0-messages` filter (#1171) hid sessions during the initial streaming turn because PR #1184 deferred the first `save()` until the first message landed. Navigating away during a long first turn made the active conversation disappear from the sidebar (looked like data loss to users). The filter now exempts sessions with `active_stream_id` (index path) or with `active_stream_id` plus `pending_user_message` (full-scan path), so in-progress conversations remain visible while truly empty scratch sessions are still hidden. 7 new regression tests cover both filter paths and edge cases. (`api/models.py`, `tests/test_streaming_session_sidebar.py`) @franksong2702 — PR #1330, fixes #1327 +- **Default model rehydration when providers share slash-qualified IDs (#1313)** — `_deduplicate_model_ids()` only de-duplicated bare IDs and skipped slash-qualified IDs entirely, so when two providers exposed the same `vendor/model` (e.g. two custom providers both listing `google/gemma-4-27b`), the dropdown contained duplicate `