github nesquena/hermes-webui v0.51.20
v0.51.20 — 5-PR contributor follow-on batch

latest releases: v0.51.22, v0.51.21
4 hours ago

v0.51.20 — 5-PR contributor follow-on batch + 2 in-stage absorbs

Single-commit release rolling up 5 contributor PRs filed since v0.51.19, with one parallel-discovery resolution and two in-stage absorbs.

Constituent PRs

  • #1828 by @Michaelyklam — Surface stale Kanban client recovery (closes #1823). Server-side 404 handler for unknown /api/kanban/* routes, client-side stale-bundle UI with Hard refresh now button (unregisters service workers + clears Cache-API + reloads), board-pointer drift recovery (loadKanban resolves boards before scoped requests; clears stale saved slug to default).
  • #1827 by @Michaelyklam — Sync Codex provider card models with picker (follow-up to v0.51.19 #1812). Replaces #1812's pure-live-fetch hook with a richer live + Codex-local-cache merge so the providers card matches the picker (which already shows gpt-5.3-codex-spark from #1680 via the local cache path).
  • #1826 by @Michaelyklam — Allow no-agent cron edits without prompt (closes #1820). Cron editor now distinguishes agent vs no-agent jobs: Mode badge in detail view, disabled prompt textarea in edit form, validation/payload-skip for no-agent saves.
  • #1825 by @ai-ag2026 — Hide workspace file tree cruft by default (closes #1793). 21 default-hidden patterns (.DS_Store, Thumbs.db, .git, node_modules, pycache, etc.) with a "Show hidden files" toggle persisted in localStorage.
  • #1822 by @ai-ag2026 — Workspace heading root actions (closes #1786). The "Workspace" panel heading is now interactive: click → root, right-click → Reveal in Finder / Copy file path.

Parallel-discovery resolution

  • #1821 by @ai-ag2026 → closed as superseded by #1826. Same fix shape (cron form required removal + validation skip + payload omission), but #1826 covers more surface (Mode badge, disabled-prompt, i18n hint, screenshot, 4 tests vs 2). Convergent diagnosis acknowledged in close comment.

In-stage absorbs (during pre-release gate)

  1. static/panels.js — Removed duplicate await loadKanbanBoards() tail call in loadKanban(). PR #1828 added a pre-fetch at the start; the existing tail call was now redundant and doubled /api/kanban/boards traffic under SSE-driven refreshes (250ms debounce). The 30-second _kanbanStartPolling() interval already picks up subsequent changes.
  2. tests/test_issue1807_codex_provider_card_live_models.py — Added CODEX_HOME isolation in _configure_codex helper. v0.51.19's tests didn't isolate the Codex local model cache, but PR #1827's new _read_visible_codex_cache_model_ids() merging makes this load-bearing — without it the dev's real ~/.codex/models_cache.json leaks into test output. Test-only.

Tests

  • 4790 → 4805 collected (+15)
  • 4794 passed, 8 skipped, 1 xfailed, 2 xpassed, 0 failed in 156.7s
  • Browser API harness 11/11 endpoints green
  • JS syntax check 3/3 modified files green (node -c on i18n.js, panels.js, ui.js)
  • No file deletions, no merge-conflict markers

Pre-release verification

  • All 5 PRs CI-green individually
  • Sibling rebase needed for #1822 + #1825 (both touched ui.js after renderBreadcrumb() and adjacent index.html/style.css blocks). ui.js conflict resolved by concatenation (node -c clean).
  • Pre-stamp re-fetch: all 5 PR heads still match local rebases (no mid-sweep force-pushes).
  • Opus advisor: SHIP. 1 fix absorbed in-release (loadKanbanBoards perf cleanup). 4 narrow follow-ups deferred to issues:
    • Lowercase 'not found' 404 string match could fire stale-client UI for genuine 404s (bounded false-positive).
    • PR #1826 _currentCronDetail.no_agent works but _cronPreFormDetail.no_agent would be more semantically precise.
    • PR #1825 i18n debt: workspace_show_hidden_files only translated for de (7 locales English passthrough).
    • PR #1822 heading silently no-ops when S.session.workspace is falsy (cursor:pointer always set).

Closes #1786, #1793, #1820, #1823.

Don't miss a new hermes-webui release

NewReleases is sending notifications on new releases.