v0.51.19 — 15-PR contributor sweep + 1 in-stage absorb
Single-commit release rolling up 15 contributor PRs spanning workspace robustness, IPv6 server bind, bootstrap path discovery, named custom provider routing, quota cards (Codex/Anthropic), live Codex model listing, sidebar/composer/approval correctness, and historical-transcript repair tooling.
Constituent PRs
Backend / config
- #1798 by @Michaelyklam — Workspace path inaccessibility (closes #1795 P0/M1).
_clean_workspace_list()was destructive on macOS TCC denial; replaced with non-destructive_safe_resolve()+_workspace_access_error()that distinguishes missing/inaccessible. - #1818 by @franksong2702 — Named custom provider routing (closes #1806).
model.provider: <custom_providers[].name>now normalizes tocustom:<name>slug at config-resolution time. Three new helpers + base-url-to-named-slug fallback + dedup of stale base-url-derivedcustom:*slugs. - #1816 by @MacLeodMike — IPv6 bind support.
QuietHTTPServer.__init__flipsaddress_family = socket.AF_INET6when host string contains':'. Loopback warning gate adds::1. - #1815 by @Saik0s —
bootstrap.pyvenvsymlinks=True. Fixes SIGABRT-on-import for shared-library mise/asdf Python on macOS. - #1817 by @Saik0s —
bootstrap.pydiscover agent dir viahermesCLI shebang. Last-resort fallback for non-standard agent install paths.
Backend / providers
- #1805 by @franksong2702 — Provider account quota cards. Extends
/api/provider/quotato OAuth-backed providers (openai-codex,anthropic) viacron_profile_context_for_home-wrapped agent calls. - #1812 by @franksong2702 — Live Codex models in provider card (closes #1807). Calls
hermes_cli.models.provider_model_ids("openai-codex")instead of static_PROVIDER_MODELSsnapshot.
Frontend / sessions
- #1797 by @Michaelyklam — Preserve first-turn sidebar row during refresh (closes #1792).
_mergeOptimisticFirstTurnSessionsgated on_isOptimisticFirstTurnSessionRow. - #1802 by @ai-ag2026 — Cross-surface session continuations stay visible. Backend marks
_cross_surface_child_session; frontend keeps marked rows top-level instead of nesting. - #1819 by @dso2ng — Approval/clarify prompts session-owned (closes #1694). Per-session caches; background-session prompts cache but don't paint; switch back re-renders.
Frontend / ui
- #1813 by @ai-ag2026 — Hide workspace metadata in user bubbles. Display-only strip;
m.contentunchanged. - #1801 by @Michaelyklam — Error toasts copy-friendly (closes #1796). 20s default + Copy button + hover/focus pause.
- #1803 by @franksong2702 — File picker + HTML preview interactions (closes #1800). Visually-hidden file input + non-submit btnAttach + CSP sandbox HTML inline path.
Streaming
- #1809 by @ai-ag2026 — Dedupe workspace-prefixed user turns after compaction.
Ops
- #1811 by @ai-ag2026 — Workspace user turn repair script. Manual operator-invoked migration tool; cleans sidecar JSON + optional SQLite.
In-stage absorbs (during pre-release gate)
api/config.py— Addedresolve_alias=Falseflag to_resolve_configured_provider_id()soresolve_model_provider()preserves raw'ollama'/'lm-studio'/'vllm'etc. provider strings for_LOCAL_SERVER_PROVIDERSset membership in #1625's full-model-id-preservation contract. PR #1818's swap was correct for active-provider/badge surfaces but broke this branch via_resolve_provider_aliascollapsing'ollama' → 'custom'.tests/test_bootstrap_discover_agent.py— PinnedPath.home()in_isolate_discover_agent_dirso PR #1817's tests don't pick up the dev machine's real~/.hermes/hermes-agent. Test-only.
Tests
- 4747 → 4790 collected (+43)
- 4776 passed, 11 skipped, 1 xfailed, 2 xpassed, 0 failed in 145.9s
- Browser API harness 11/11 endpoints green
- JS syntax check 5/5 modified files green (
node -c) - Python syntax check 25/25 files green
- No file deletions, no merge-conflict markers
Pre-release verification
- All 15 PRs CI-green individually
- File overlaps resolved via stage-HEAD rebase for sibling PRs (sessions.js trio: 1797/1802/1819; ui.js trio: 1801/1803/1813; api/providers.py pair: 1805/1812; bootstrap.py pair: 1815/1817; CHANGELOG.md stripped from contributor branches before merge)
- Pre-stamp re-fetch: all 15 PR heads still match local rebases (no mid-sweep force-pushes)
- Opus advisor: SHIP verdict, 0 MUST-FIX, 0 SHOULD-FIX in-release. Two narrow follow-ups deferred to new issues:
custom_providers[].name == "ollama"+ non-loopback base_url combo (partial #1625 regression for narrow config)_cron_env_lockprocess-wide serialization on quota fetches across profiles
Maintainer triage
- PR #1814 by @hualong1009 →
maintainer-review. Targets same #1806 root as #1818 but at runtime layer with 96 LOC of branchy logic and zero tests; complementary in principle but needs tests + dedup with #1818's helpers post-merge before mergeable. Posted structured comment with three actionable asks.