v0.50.290 — 5-PR batch (login cache + sidebar UX + workspace dropdown polish)
5 PRs. 4 from @Michaelyklam (login SW cache, compact hot-apply, first-turn visibility, turn duration display) + maintainer-pickup of @JKJameson's workspace dropdown PR.
What's fixed
#1586 by @Michaelyklam — Login asset SW cache exemption
Service worker now bypasses /login and /static/login.js (network-only); navigation requests are network-first; cache-first scoped to explicit SHELL_ASSETS allowlist. static/login.js versioned via ?v=<WEBUI_VERSION>. Closes the auth-stuck-in-cache class — a stale cached login.js was making valid passwords fail until manual cache clear (especially confusing for PWA installs). Two new test files lock the SW behavior including a fetch_idx < cache_idx ordering check.
#1590 by @Michaelyklam — Hot-apply compact tool activity (6 LOC)
Toggling Compact tool activity in Settings now hot-applies: updates window._simplifiedToolCalling, clears render cache, re-renders messages. No browser refresh needed.
#1591 by @Michaelyklam — First-turn sidebar visibility
First user message now promotes the session into the sidebar immediately, before the model produces an assistant response. Three optimistic-upsert passes through send() plus Session.compact() exposing has_pending_user_message: bool so the empty-Untitled filter respects pending sessions. Users can switch into a just-started conversation and inspect live tool calls before the agent has even responded.
#1592 by @Michaelyklam — Turn duration display ("Done in 1m 12s")
Backend captures pending_started_at, calculates duration, persists as _turnDuration on the assistant message dict (so reloads keep the display), includes in streaming done SSE payload. Frontend renders as compact Activity row chip and expanded-mode footer chip.
#1464 by @JKJameson — Workspace dropdown sort+search+chip-sync (MAINTAINER-AUGMENTED)
Workspace chip syncs immediately on chat switch via syncTopbar() after S.session = data.session (mirrors model-chip handling). Search input filters dropdown by name or path in real-time. Alphabetical sort frontend-only via localeCompare — backend load_workspaces() preserves user-defined order so drag-to-reorder #492 keeps working. Class-based CSS, 9-locale i18n parity for ws_search_placeholder + ws_no_results.
Maintainer in-stage actions: rebased onto current master (was 124 commits behind v0.50.275); flipped inverted ternary on panels.js:1683 (visible?'':'none' → visible?'none':'') — contributor's own PR-thread screenshot demonstrated the bug live (rendered "No workspaces found" alongside valid filtered results); added tests/test_issue1464_workspace_dropdown_filter.py to lock the visibility relationship.
Maintainer-side test fixes in stage (auto-rebase + auto-fix policy)
Two stale source-string assertions broken by #1591's structural changes — both real test-side fixes, no production code modified:
tests/test_465_session_branching.py::test_session_compact_includes_parent— widened search window 1500→3000 chars afterdef compact(self,.tests/test_regressions.py::test_send_uses_session_model_as_authoritative_source— anchored onapi('/api/chat/start'instead of/api/chat/start.
Tests
4094 → 4111 passing (+17 net). 0 regressions. Full suite in 107s.
Pre-release verification
- Browser API sanity: 11/11 endpoints verified.
- All modified JS files pass
node -c. - Stage diff scanned for merge-conflict markers: none.
- Live UX verification on test server (#1464): seeded 10-workspace test environment, vision-confirmed dropdown sort + search filter + zero-match noResults rendering.
- Opus advisor: SHIP AS-IS — no MUST-FIX. All 5 verification questions cleared.
Known follow-up (deferred, non-blocking)
- #1464 mobile (390px) screenshot review — desktop verified live; mobile responsive verification deferred to maintainer @aronprins's hands-on review.
_pending_started_at == 0falsy-guard tightening considered for in-release absorption but reverted — the contributor's regression test pins the explicitis not Noneform. Filed as follow-up for separate consideration.
Thanks to @Michaelyklam for the 4-PR contributor burst and to @JKJameson for the workspace dropdown design.
Full changelog: https://github.com/nesquena/hermes-webui/blob/master/CHANGELOG.md