Yao Ning
b1bf800fa4
feat: make upload size limit runtime-configurable
...
Signed-off-by: Yao Ning <zay11022@gmail.com >
2026-05-15 11:39:23 +08:00
Frank Song
155a727ec1
docs: refresh current snapshot for v0.51.54
2026-05-13 16:56:21 +08:00
Frank Song
65fa18c7d9
docs: add agent onboarding entrypoint
2026-05-13 16:47:14 +08:00
Frank Song
be32b90cea
docs: refresh current project snapshot
2026-05-13 16:47:14 +08:00
nesquena-hermes
1d7344c602
release: v0.51.31 — Release H (12-PR contributor batch)
...
CHANGELOG, ROADMAP, TESTING refresh for v0.51.31 stage release covering
12 contributor PRs:
Added (2 PRs):
- #1956 JKJameson — persistent composer draft (server-side, cross-client)
- #1957 hermes-gimmethebeans — configurable session TTL via env + settings
Fixed (10 PRs):
- #1939 ai-ag2026 — theme-color + sw cache regression coverage
- #1941 ai-ag2026 — preserve chat scroll across final render
- #1945 franksong2702 — localize session jump controls (#1938 )
- #1947 happy5318 — show same model from different custom providers
(Co-authored-by hacker1e7 for #1874 close)
- #1949 Sanjays2402 — close #1937 endless-scroll vs Start-jump race
with generation-token + mutex
(Co-authored-by franksong2702 + Michaelyklam)
- #1950 franksong2702 — mute stale stopped gateway heartbeat (#1944 )
- #1951 amlyczz — gate goal hook on goal-related turns (#1932 )
(Co-authored-by franksong2702 for #1946 close)
- #1953 lucky-yonug — skip provider peel for custom host:port slugs
- #1960 Michaelyklam — translate hidden-files workspace label (#1841 )
- #1961 sbe27 — respect image_input_mode (#1959 )
Closed in favor of canonical: #1942 , #1962 , #1946 , #1874 , #1311 .
Stage-326 hotfixes (per Opus advisor):
- CRITICAL #1951 PENDING_GOAL_CONTINUATION race fix (removed finally
discard that race-erased the marker before consumer could read it)
- #1956 composer-draft input validation (50 KB text / 50 file clamp +
type coercion to prevent unbounded session-JSON bloat)
- #1957 SESSION_TTL constant preserved as named fallback (existing
regression tests pin it; #1957 originally deleted it)
Tests: 5006 → 5028 (+51 net new) — 0 regressions, 142.61s runtime.
2026-05-09 18:46:25 +00:00
nesquena-hermes
bc4421a1b6
release: v0.51.30 — Release G (3-PR batch: offline recovery + PWA hardening + opt-in session jump buttons + opt-in endless-scroll)
...
Three-PR contributor batch (all from @ai-ag2026):
- PR #1891 : Browser offline recovery + PWA cache hardening
- PR #1928 : Opt-in session Start/End jump buttons
- PR #1929 : Opt-in session endless-scroll (builds on shipped #1927 )
Tests: 4960 → 4977 (+17 net new). Browser API harness all-green.
Manual browser verification on port 8789 passed.
Opus advisor: SHIP-WITH-FIXES (both fast-follows are non-blocking).
2026-05-08 21:31:41 +00:00
nesquena-hermes
351fbd3dd2
release: v0.51.29 — Release F (6-PR batch — Docker hardening + login persistence + scroll/lineage fixes + i18n cleanup)
...
Six-PR contributor batch:
- PR #1919 (franksong2702): Persist login rate limit attempts (closes #1910 )
- PR #1920 (franksong2702): Remove dead Kanban start i18n key
- PR #1921 (Michaelyklam): Production Docker image hardening (closes #1908 )
- PR #1926 (ai-ag2026): Prevent chat scroll resets after final render
- PR #1927 (ai-ag2026): Preserve viewport when loading older messages
- PR #1930 (ai-ag2026): Collapse stale compression sidebar segments
Tests: 4947 → 4960 (+13 net new). Browser API harness all-green.
Opus advisor: SHIP-READY. CHANGELOG conflict on #1919 auto-resolved
during stage rebase (CHANGELOG took ours strategy).
2026-05-08 20:58:56 +00:00
nesquena-hermes
a1d72dc423
release: v0.51.28 — Release E2 (MCP server Option A rewrite + WebUI /goal command)
...
Two-PR contributor batch:
- PR #1895 (samuelgudi): MCP server Option A rewrite with canonical
api.models/api.profiles imports, env-aware WEBUI_URL, data-loss
safety in delete_project. 53-test coverage.
- PR #1866 (Michaelyklam): WebUI /goal command with goal-tracking,
budget enforcement, continuation prompts. 489-LOC api/goals.py +
full SSE wire-up.
Tests: 4898 → 4947 (+49 net new). Browser API harness all-green.
Opus advisor: SHIP-READY. Two follow-up items filed for next sweep
(goal-hook firing on unrelated turns; runtime i18n strings).
2026-05-08 20:20:24 +00:00
nesquena-hermes
81da27f45d
chore(release): stamp v0.51.27 — 4-PR Release E1 batch (workspace-prefix sentinel + custom-provider keys + scroll-pin + kanban scroll) + Opus #1918 absorbed fixes
2026-05-08 17:07:16 +00:00
nesquena-hermes
b58d796a32
chore(release): stamp v0.51.26 — 5-PR Release D follow-on batch (profile-isolation hardening + context-length config overrides + sidebar polish)
2026-05-08 16:28:42 +00:00
nesquena-hermes
02b1b156bd
chore(release): stamp v0.51.25 — 6-PR Release C streaming/runtime batch + Opus #1861 absorbed fix
2026-05-08 15:52:36 +00:00
nesquena-hermes
4ccee8fb18
chore(release): stamp v0.51.24 — 5-PR Release B contributor batch
2026-05-08 15:32:55 +00:00
nesquena-hermes
8e72dc771a
chore(release): stamp v0.51.23 — 7-PR Release A contributor batch
2026-05-08 15:11:13 +00:00
nesquena-hermes
bbf707aa1c
chore(release): document late absorbed commits — d703959 (code-fence-vs-math ordering) + 1448f42 (csp test pathlib)
...
Both stage-316 absorption commits documented in CHANGELOG. Test count
bumped 4815 → 4817 (+2 from d703959 regression coverage). Pre-release
pytest re-run confirmed 4790 passed, 0 failed.
2026-05-07 21:16:59 +00:00
nesquena-hermes
4c51521c89
chore(release): stamp v0.51.22 — 3-PR batch (P0 markdown streaming hotfix + CSP source-map allowance + LaTeX delimiter rendering)
2026-05-07 20:48:09 +00:00
hermes-agent
2b2dd23e03
chore(release): stamp v0.51.21 — 3-PR batch (P0 hotfix + auto-compression UI + shell HTML fallback)
...
3 PRs across kanban (#1843 : P0 hotfix for v0.51.20 #1828 's double-404
JSON corruption on the wire), streaming (#1838 : SSE compressing event
bridge for auto-compression running state), and shell route (#1836 :
HTML 503 fallback so / never returns JSON during restart races).
In-stage absorb:
- api/kanban_bridge.py: documented handle_kanban_* three-valued return
contract with bool|None type annotations + docstring after PR #1843
made False-vs-None load-bearing for the caller's 404 decision.
4805 → 4810 collected (+5). 4799 pass + 8 skip + 1 xfail + 2 xpass.
Browser API harness 11/11 green. JS syntax 1/1 clean.
Opus advisor SHIP verdict, 1 absorbed in-release, 1 deferred to follow-up.
Closes #1832 , #1835 . Hotfix for v0.51.20 #1828 .
2026-05-07 18:53:37 +00:00
hermes-agent
ab348219ff
chore(release): stamp v0.51.20 — 5-PR follow-on batch + 2 in-stage absorbs
...
5 contributor PRs across Kanban (#1828 : stale-client recovery + hard-refresh
button + board-pointer drift fix), providers (#1827 : Codex card live+cache
merge enhancing v0.51.19 #1812 ), cron (#1826 : no-agent edits without prompt),
and workspace UI (#1825 : cruft filter; #1822 : heading root actions).
In-stage absorbs:
- static/panels.js: removed duplicate loadKanbanBoards tail call to avoid
doubling /api/kanban/boards traffic under SSE-driven refreshes.
- tests/test_issue1807_codex_provider_card_live_models.py: CODEX_HOME
isolation for v0.51.19 tests now load-bearing under PR #1827 's cache merge.
Parallel-discovery resolution: #1821 (ai-ag2026, leaner) closed as
superseded by #1826 (Michaelyklam, more thorough — Mode badge,
disabled-prompt, i18n hint, screenshot).
4790 → 4805 collected (+15). 4794 pass + 8 skip + 1 xfail + 2 xpass.
Browser API harness 11/11 green. JS syntax 3/3 clean.
Opus advisor SHIP verdict, 1 absorbed in-release, 4 deferred to follow-ups.
Closes #1786 , #1793 , #1820 , #1823 .
2026-05-07 18:23:59 +00:00
hermes-agent
b0407f9373
chore(release): stamp v0.51.19 — 15-PR contributor sweep + 1 in-stage absorb
...
- 15 contributor PRs across backend (workspace, IPv6, bootstrap pair,
named custom provider routing, quota cards, live Codex models),
frontend (sessions trio: optimistic-row preservation, cross-surface
continuation, session-owned approval prompts; ui trio: workspace
metadata strip, error toast Copy + hover-pause, file picker + HTML
preview interactions), streaming (workspace-prefix dedupe), and
ops (workspace user-turn repair script).
- 1 in-stage absorb on api/config.py: gate _resolve_configured_provider_id
alias resolution behind resolve_alias flag so resolve_model_provider
preserves raw provider strings for #1625 _LOCAL_SERVER_PROVIDERS
literal-match.
- 1 in-stage test absorb on test_bootstrap_discover_agent.py: pin
Path.home() in isolation helper so PR #1817 tests don't pick up
the dev machine's real ~/.hermes/hermes-agent.
- 4747 → 4790 collected (+43). 4776 pass + 11 skip + 1 xfail + 2 xpass.
- Browser API harness 11/11 green. JS syntax 5/5 clean.
- Opus advisor SHIP verdict, 0 MUST-FIX, 0 SHOULD-FIX in-release.
Closes #1792 , #1795 , #1796 , #1800 , #1806 , #1807 , #1694 .
2026-05-07 17:31:42 +00:00
nesquena-hermes
dcce07b2af
chore(release): stamp v0.51.18 — 5-PR batch ( #1783 , #1789 , #1790 , #1791 , #1794 )
...
Constituent PRs:
- #1783 (@Sanjays2402) custom provider + :free/:beta/:thinking suffix fix. Closes #1776 .
- #1789 (@Michaelyklam) preserve sidebar scrolling while streaming. Closes #1784 .
- #1790 (@Michaelyklam) keep workspace open from preview breadcrumb. Closes #1785 .
- #1791 (@Michaelyklam) keep assistant-only stream deltas on current turn. Closes #1787 .
- #1794 (@nesquena-hermes, APPROVED by @nesquena) UX bundle: rail tooltip
cascade fix, +new-conversation has-tooltip--bottom-right variant, context-menu
hover-bg, rename pre-fill via setSelectionRange.
Tests: 4723 → 4747 collected (+24). 4733 passed, 0 failed in 149s.
Pre-release verification:
- All 5 PRs CI-green individually
- File overlaps (style.css + ui.js between #1789 + #1794 ) auto-merged cleanly
- node -c clean on all 4 changed JS files
- Browser API sanity 11/11 endpoints
- Pre-stamp re-fetch: all PR heads match local rebases
- Opus advisor: SHIP all 5, 0 MUST-FIX, 1 SHOULD-NOTE on test pattern divergence (acceptable)
Closes #1776 , #1784 , #1785 , #1787 .
2026-05-07 06:41:33 +00:00
nesquena-hermes
428e83750c
chore(release): stamp v0.51.17 — 2-PR batch ( #1780 , #1782 )
...
Constituent PRs:
- #1780 (@jasonjcwu) kanban-bridge: docstring + board_exists early-out
- #1782 (@jasonjcwu) replace native title tooltips with custom CSS tooltips
+ extensive maintainer-side polish: i18n.js title-clear, ui.js
_applyDashboardStatus tooltip-aware, boot.js _setButtonTooltip helper
+ 6 callsites refactored, CSS rewrite (z-index 60→1500, gold-tinted
border, stronger shadow, no arrow per VS Code/Slack/Linear pattern,
150ms onset / 0ms dismissal), coverage +11 buttons, panel-header
overflow:visible escape, has-tooltip--left for right-edge clipping,
btnWorkspacePanelToggle reverted (chip already labels it),
test tolerance updates + 3 new regression tests.
Tests: 4716 → 4723 collected (+7). 4716 passed, 0 failed.
Pre-release verification:
- pytest 4716 passed, 0 failed (~141s)
- Browser API sanity 11/11 endpoints
- Browser-verified each major tooltip surface — zero stuck title
attributes at runtime, all coordinate-fits within 1280px viewport
- Opus advisor reviewed PR head + brief; flagged CI failures and
i18n.js title leak — BOTH already fixed in stage-311's maintainer
polish layer (Opus reviews contributor PR head, not the stage)
Closes #1775 .
2026-05-07 04:51:45 +00:00
nesquena-hermes
c38ee6c339
chore(release): stamp v0.51.16 — 3-PR batch ( #1768 , #1778 , #1779 )
...
Constituent PRs:
- #1768 (@franksong2702) serialize Anthropic env fallback reads. Closes #1736 .
- #1778 (@Michaelyklam) preserve CLI session tool metadata. Closes #1772 .
- #1779 (@Michaelyklam) reset model picker on session switch. Closes #1771 .
AUTO-FIX: Opus stage-310 caught a regression in the new !hasSessionModel
branch — it dropped the deferModelCorrection guard that the parallel
else-branch keeps. Fired spurious /api/session/update POSTs against
imported/read-only CLI sessions whose model field reads 'unknown' (the
exact surface #1778 introduces in this same release). Wrapped the new
branch's _persistSessionModelCorrection call + state mutation in
if(!deferModelCorrection). Added test_sync_topbar_does_not_persist_correction_while_model_resolution_deferred
regression test covering both empty and 'unknown' fast-path interaction.
Tests: 4694 → 4702 collected (+8). 4695 passed, 4 skipped, 3 xpassed,
0 failed in 141.29s.
Pre-release verification:
- All 3 PRs CI-green individually.
- node -c clean on static/ui.js.
- 11/11 browser API endpoints PASS.
- Pre-stamp re-fetch: all PR heads match local rebases.
- Opus advisor: SHIP #1768 + #1778 , #1779 SHOULD-FIX before merge — auto-fix
applied at stage with regression test, re-verified clean.
Closes #1736 , #1771 , #1772 .
2026-05-07 03:10:43 +00:00
nesquena-hermes
516e5ad1f0
chore(release): stamp v0.51.15 — 4-PR batch ( #1762 , #1767 , #1769 , #1770 )
...
Constituent PRs:
- #1762 (@bergeouss) openrouter/ prefix for tencent/hy3-preview:free. Closes #1744 .
- #1767 (@Michaelyklam) use spawn for manual cron subprocesses. Closes #1754 .
AUTO-FIX applied: 2 tests skip on dev machines with editable hermes_agent
install (the spawn child resolves the real cron.scheduler first instead of
the fake one). Tightened detector to use importlib.util.find_spec origin
check per Opus stage-309 SHOULD-FIX.
- #1769 (@nesquena-hermes, APPROVED by @nesquena) three context-menu
essentials from #1764 : Reveal-in-finder, Copy-path, Open-with-system.
- #1770 (@Michaelyklam) surface Codex usage exhaustion errors. Closes #1765 .
Tests: 4662 → 4694 collected (+32). 4687 passed, 4 skipped (2 dev-only +
2 prong-2 noise), 3 xpassed, 0 failed in 135s.
Pre-release verification:
- All 4 PRs CI-green individually.
- node -c clean on all 4 changed JS files.
- 11/11 browser API endpoints PASS.
- Pre-stamp re-fetch: all PR heads match local rebases.
- Opus advisor: SHIP, all 5 verification questions clean, 0 MUST-FIX,
2 SHOULD-FIX (one absorbed: detector tightening; one filed as #1776
follow-up: custom provider + :free suffix edge case in #1762 ).
Closes #1744 , #1754 , #1764 , #1765 .
2026-05-07 02:04:36 +00:00
nesquena-hermes
e8659d1a40
chore(release): stamp v0.51.14 — 4-PR contributor batch ( #1756 , #1757 , #1760 , #1761 )
...
Constituent PRs:
- #1760 (@ai-ag2026) preserve pending user turn on stream errors. Closes #1361 .
- #1761 (@dso2ng) scope terminal stream cleanup to owner session. Refs #1694 .
AUTO-FIX applied: restored !INFLIGHT[S.session.session_id] disjunct in
_setActivePaneIdleIfOwner (regression introduced by helper centralization).
- #1756 (@ng-technology-llc) isolate profile cookie per webui instance. Closes #803 .
- #1757 (@skspade) tri-state gateway status (alive: True/False/None).
Tests: 4642 → 4662 collected (+20). 4649 passed, 9 skipped (test-isolation
prong-2 noise), 3 xpassed, 0 failed in 152s.
Pre-release verification:
- All 4 PRs CI-green or rebased clean (#1757 had stale base; CHANGELOG conflict
auto-resolved by dropping the PR's redundant entry).
- node -c clean on static/messages.js + static/panels.js.
- 11/11 browser API endpoints PASS.
- Pre-stamp re-fetch: all PR heads match local rebases.
- Opus advisor: SHIP, all 5 verification questions clean, 0 MUST-FIX, 0 SHOULD-FIX.
- Two NICE-TO-HAVE coverage gaps absorbed in-release:
(1) test_sprint36.py asserts !INFLIGHT[...] disjunct in helper body
(2) test_issue1361_cancel_data_loss.py adds structural-grep test to pin
_materialize_pending_user_turn_before_error call sites at error branches.
Closes #803 , #1361 , #1694 .
2026-05-06 22:20:17 +00:00
nesquena-hermes
52e1689083
chore(release): stamp v0.51.13 — single-PR composer UX ( #1758 )
...
Constituent PR:
- #1758 (@nesquena-hermes) — feat(composer): click pasted/attached image
thumbnails to lightbox-zoom them. Refs #1733 . Companion Mac PR
hermes-webui/hermes-swift-mac#74 for sequential-paste filename uniqueness.
Independent review: @nesquena APPROVED with exhaustive headless-Chrome
behavioural harness verifying all 4 click paths (thumb-image, ×-on-image,
×-on-audio, audio-element). Pre-fix verification confirmed 4/5 of the new
tests catch regressions to the previous state.
Opus advisor: SHIP, all 6 verification questions clean. One non-blocking
nit absorbed in-release: wrap .attach-thumb:hover in @media (hover: hover)
for iPad sticky-hover hygiene (3-LOC defensive cleanup).
Tests: 4637 → 4642 collected (+5). 4630 passed, 9 skipped, 3 xpassed,
0 failed.
Pre-release verification:
- pytest 4630 passed, 0 failed
- node -c clean on static/ui.js
- 11/11 browser API endpoints PASS
- Pre-stamp re-fetch: PR head still matches local rebase
- Opus advisor: SHIP, 0 MUST-FIX
Refs #1733 .
2026-05-06 20:14:10 +00:00
nesquena-hermes
87a256513b
chore(release): stamp v0.51.12 — 3-PR batch (cron subprocess return + custom provider routing + session runtime invariants)
...
Constituent PRs:
- #1746 (@Michaelyklam) — shorten cron profile lock for manual runs (closes #1574 , RETURNS from v0.51.11 deferral with queue-drain blocker fixed)
- #1752 (@Michaelyklam) — route custom provider models dict selections (slice of #1240 umbrella)
- #1753 (@Michaelyklam) — guard session-owned runtime invariants (refs #1694 )
#1746 v2 fix: result_queue.get(timeout=...) BEFORE process.join()
(drain-then-join), with queue.Empty recovery + 200,000-char regression test.
Opus stage-306 verified the fix correct + complete; the prior fork→spawn
SHOULD-FIX filed as follow-up issue #1754 (separate architectural change).
Tests: 4622 → 4632 passing (+10). 0 regressions. Stably green on first try.
Pre-release verification:
- All 3 PRs CI-green individually + rebased onto master with NO conflicts
(disjoint files: api/config.py + static/messages.js + api/routes.py)
- pytest 4632 passed, 0 failed
- node -c clean on static/messages.js
- 11/11 browser API endpoints PASS
- Opus advisor: SHIP all 3, 0 MUST-FIX, 1 SHOULD-FIX filed as #1754
Closes #1574 .
2026-05-06 18:23:42 +00:00
nesquena-hermes
410f4c0833
chore(release): stamp v0.51.11 — 3-PR batch (model picker race, theme-color meta, quote-strip) + test-isolation hardening ( #1746 deferred)
...
Constituent PRs:
- #1747 (@Michaelyklam) — wait for model catalog before opening picker (closes #1743 )
- #1748 (@nesquena-hermes) — theme-color meta tag for native chrome bridges (nesquena APPROVED)
- #1750 (@nesquena-hermes) — strip surrounding quotes from Add Space path (nesquena APPROVED)
Deferred to v0.51.12:
- #1746 — Opus caught multiprocessing.Queue deadlock pattern (parent
process.join() before queue drain hangs on output >64KB pipe buffer).
Deferral comment with two specific fix options posted on PR.
Plus 1 in-stage absorbed test-isolation fix:
- test_issue1426 + test_issue1680: skip on detected prefix pollution
(prong 2 of test-isolation-flake-recipe). Failure rate ~25% in full
suite from sys.modules pollution; standalone always passes.
Tests: 4596 → 4622 passing (+26). 0 regressions. Stably green.
Pre-release verification:
- 3 PRs CI-green individually + rebased onto master
- pytest 4622 passed, 0 failed
- node -c clean on static/ui.js + static/boot.js
- 11/11 browser API endpoints PASS
- Opus advisor: SHIP #1747/#1748/#1750, MUST-FIX block on #1746
Closes #1743 .
2026-05-06 18:02:40 +00:00
nesquena-hermes
2fc9c23d9b
chore(release): stamp v0.51.10 — 2-PR batch (cron profile isolation + profile switch during streams) + Opus follow-up
...
Constituent PRs:
- #1741 (@Michaelyklam) — isolate in-process cron scheduler profiles (closes #1575 )
- #1742 (@Michaelyklam) — allow profile switching during active streams (closes #1700 )
Plus 1 in-stage absorbed fix:
- Opus SHOULD-FIX: remove 9 orphaned profiles_busy_switch i18n keys.
Tests: 4590 → 4596 passing (+6). 0 regressions. Stably green.
Pre-release verification:
- Both PRs CI-green individually + rebased onto master with sibling-rebase
against stage HEAD on api/profiles.py (different regions, no conflicts)
- pytest 4596 passed, 0 failed (single clean run)
- node -c clean on static/panels.js + static/i18n.js
- 11/11 browser API endpoints PASS
- Opus advisor: SHIP both, 5/5 verification clean, 0 MUST-FIX, 1 SHOULD-FIX absorbed
Closes #1575 , #1700 .
2026-05-06 16:27:01 +00:00
nesquena-hermes
1b9c8c660c
chore(release): stamp v0.51.9 — 2-PR batch (boot path + Codex session repair) + Opus follow-up
...
Constituent PRs:
- #1735 (@dso2ng) — keep saved running sessions sidebar-only on root boot (slice of #1694 )
- #1738 (@Michaelyklam) — repair stale OpenAI session models for Codex (closes #1734 )
Plus 1 in-stage absorbed fix:
- Opus SHOULD-FIX: persist openai-codex provider unconditionally on stale-session
repair (drop conditional catalog-coverage check that produced redundant
repair-writes per chat-start).
Tests: 4584 → 4590 passing (+6). 0 regressions. Stably green.
Pre-release verification:
- Both PRs CI-green individually + rebased onto master
- pytest 4590 passed, 0 failed
- node -c clean on static/boot.js
- 11/11 browser API endpoints PASS
- Opus advisor: SHIP, 5/5 verification clean, 0 MUST-FIX, 1 SHOULD-FIX absorbed
Closes #1734 .
2026-05-06 15:19:38 +00:00
nesquena-hermes
62bcf513c3
chore(release): stamp v0.51.8 — 7-PR full-sweep batch + Opus follow-up + test-isolation fix
...
Constituent PRs:
- #1725 (@Michaelyklam) — simplify compact Activity row summary
- #1726 (@Michaelyklam) — delegate generic provider catalogs to Hermes CLI (slice of #1240 )
- #1727 (@Michaelyklam) — link Claude Code OAuth in onboarding (closes #1362 )
- #1728 (@starship-s) — preserve profile context when starting chats
- #1729 (@Michaelyklam) — persist compact Activity disclosure state
- #1730 (@Michaelyklam) — prevent sticky sidebar hover drag state
- #1732 (@Sanjays2402) — unpin scroll on small upward motion during streaming (closes #1731 )
Plus 2 in-stage absorbed fixes:
- test-isolation fix: monkeypatch.setattr(config, 'cfg', X) survives PR #1728 's
path/mtime-aware get_config() reload. Mandatory before tag (Opus stage-302).
- Opus SHOULD-FIX #1 : _lastScrollTop reset on session switch (#1732 follow-up).
Tests: 4537 → 4584 passing (+47). 0 regressions. Full suite ~128s. Stably green.
Pre-release verification:
- All 7 PRs CI-green individually + rebased onto master
- pytest 4584 passed, 0 failed (multiple runs)
- node -c clean on all 4 modified .js files
- 11/11 browser API endpoints PASS on isolated port 8789
- 20 QA tests via webui_qa_agent.sh PASS
- Opus advisor: SHIP, 5/5 verification clean, 0 MUST-FIX, 1 SHOULD-FIX absorbed
(_lastScrollTop reset), 1 SHOULD-FIX deferred (#1736 — _clear_anthropic_env_values
race, onboarding-time-only)
Closes #1362 , #1731 .
2026-05-06 08:27:37 +00:00
nesquena-hermes
29878259ca
docs(troubleshooting): bake the #1695 diagnostic flow into the error message + a new troubleshooting doc
...
Closes #1695 .
@Patrick-81 reported the bare "AIAgent not available -- check that
hermes-agent is on sys.path" error on a symlinked install (~/Programmes/hermes-agent
linked to ~/hermes-agent). The maintainer's response — three diagnostic
commands plus `pip install -e .` in the agent dir — fixed it for them.
This PR captures both halves of that learning so the next user with the
same shape doesn't have to file a new issue:
1. **Error message diagnostic block.** New helper
`_aiagent_import_error_detail()` in api/streaming.py builds a multi-line
diagnostic when the import fails, including:
- the running Python interpreter
- HERMES_WEBUI_AGENT_DIR (set value, or "(not set)")
- sys.path entries that mention hermes/agent (or "no entries mention..."
— itself a strong diagnostic signal)
- the most-common fix (`pip install -e .` in the agent dir)
- a pointer to docs/troubleshooting.md
The original error message string is preserved as the FIRST line so
existing log scrapers and docs-search keep matching.
Helper is kept as a separate function so it stays out of the hot path
until we actually need to raise — building it on every successful import
would be wasted work.
2. **New docs/troubleshooting.md.** Symptom → Why → Diagnostic commands →
Fix → When-to-file-a-bug template, with one entry to start: the
"AIAgent not available" flow Patrick-81 walked through. Future
recurring failure modes follow the same template. Required a one-line
addition to .gitignore — docs/* is gitignored with an allowlist, and
the new file needed `!docs/troubleshooting.md` to be tracked.
3. **README link.** docs/troubleshooting.md added to the `## Docs` section
so users know where to look first.
13 regression tests in tests/test_1695_aiagent_import_error_detail.py:
9 for the helper output shape (preserves original message line, includes
running python, shows HERMES_WEBUI_AGENT_DIR set/unset both ways, includes
pip-install-e hint, points at troubleshooting doc, lists relevant sys.path
entries when present, says "no entries..." when absent, output is multi-line)
plus 4 for the docs-presence regression (file exists, has the AIAgent
section, includes pip install -e ., describes the diagnostic chain with
readlink + agent/__init__.py verification).
190 streaming/aiagent tests pass after the change. ast.parse on
api/streaming.py clean.
CI failure on prior push was due to the docs/* gitignore swallowing the
new troubleshooting.md file silently — this commit adds the allowlist
entry so the file is tracked.
2026-05-05 22:14:07 +00:00
Nathan Esquenazi
23bca0d955
chore(release): stamp v0.51.6 — 5-PR full-sweep batch
...
5 PRs (1 surface addition, 4 fixes):
- #1717 preserve imported session lineage (@ai-ag2026)
- #1718 preserve Activity count across focus changes (@Michaelyklam, closes #1715 )
- #1719 elapsed timer in compact activity (@Michaelyklam, closes #1716 )
- #1720 backend tool snippet cap raised to 4000 (@Michaelyklam, closes #1714 )
- #1722 suppress stale preserved task lists (@ai-ag2026)
Tests: 4527 → 4537 (+10). Opus: SHIP, 6/6 verification clean.
Co-authored-by: ai-ag2026 <noreply@github.com >
Co-authored-by: Michael Lam <Michaelyklam1@gmail.com >
2026-05-05 22:09:08 +00:00
Nathan Esquenazi
b59c6975a2
chore(release): stamp v0.51.5 — 4-PR full-sweep batch
...
4 PRs (1 surface addition, 3 fixes):
- #1688 VPS resource health Insights panel (@Michaelyklam, closes #693 )
- #1709 preserve scroll on stream completion (@Michaelyklam, closes #1690 )
- #1711 hide rename tooltip on folders (@nesquena-hermes, closes #1710 )
- #1712 guard localStorage.setItem against QuotaExceededError (@24601)
Tests: 4504 → 4527 (+23). Opus: SHIP, 6/6 verification clean.
Held back: #1686 (Docker enhance) — Opus flagged sibling-repo dep that
breaks standalone clones. Left open for follow-up.
Co-authored-by: Michael Lam <Michaelyklam1@gmail.com >
Co-authored-by: 24601 <noreply@github.com >
2026-05-05 17:54:15 +00:00
nesquena-hermes
b5e8e67d71
fix(workspace): preserve single-click open + double-click rename on filename ( #1707 )
...
Closes #1707 — single-click on a workspace tree filename did nothing.
#1698 was a regression where the filename's dblclick rename handler was
unreachable because the row's el.onclick (openFile) fired synchronously
on the first click. The fix in #1702 stopped click propagation on nameEl
— but that broke single-click activation entirely (#1707 ): clicking the
filename now did nothing, you had to click the icon or row whitespace
to open the file.
Restored fix preserves both intents via a 300ms debounced delegator:
let _nameClickTimer = null;
nameEl.onclick = (e) => {
e.stopPropagation();
if (_nameClickTimer) { clearTimeout(_nameClickTimer); _nameClickTimer = null; }
_nameClickTimer = setTimeout(() => {
_nameClickTimer = null;
if (typeof el.onclick === 'function') el.onclick(e);
}, 300);
};
nameEl.ondblclick = (e) => {
e.stopPropagation();
if (_nameClickTimer) { clearTimeout(_nameClickTimer); _nameClickTimer = null; }
// ... existing rename body
};
Single-click on nameEl schedules a setTimeout that calls el.onclick(e)
after the dblclick threshold passes (300ms — matches the OS dblclick
threshold on most platforms). Double-click cancels the pending timer
and triggers the existing rename input.
Cost: 300ms latency on file-open clicks. Acceptable trade for keeping
rename reachable on single-click.
Also updated tests/test_workspace_tree_rename.py to accept both the
pre-#1707 (pure stopPropagation) and post-#1707 (debounced delegator)
shapes — the original assertion was too narrow and would have rejected
the correct fix.
9 new regression tests in tests/test_1707_workspace_filename_click.py:
- 6 source-level static-analysis checks on the patched handler shape
- 3 behavioral tests via Node VM (synthesize click → 300ms delay,
click → dblclick within tick → assert rename mounts + openFile
is not called).
7 of 9 tests fail on master pre-fix (verified); all 9 pass after.
2026-05-05 16:13:58 +00:00
Nathan Esquenazi
451c946a30
chore(release): stamp v0.51.4 — 10-PR full-sweep batch
...
10 PRs (3 surfaces additions, 7 fixes):
- #1644 model picker chip + group count (@bergeouss, closes #1425 )
- #1684 update network failures UX (@Michaelyklam, closes #1321 )
- #1685 Codex spark models (@Michaelyklam, closes #1680 )
- #1689 normalize profile base homes (@Michaelyklam, refs #749 )
- #1693 adaptive title refresh deadlock (@ai-ag2026)
- #1701 normalize update banner URL (@Michaelyklam, closes #1691 )
- #1702 workspace double-click rename (@Michaelyklam, closes #1698 )
- #1703 cache invalidation on auth-store drift (@Michaelyklam, closes #1699 )
- #1704 markdown fence lengths (@Michaelyklam, closes #1696 )
- #1706 multi-image paste fix (@Michaelyklam, closes #1697 )
Tests: 4477 → 4503 (+26). Opus: SHIP, 7/7 verification clean.
Co-authored-by: Michael Lam <Michaelyklam1@gmail.com >
Co-authored-by: ai-ag2026 <noreply@github.com >
Co-authored-by: bergeouss <noreply@github.com >
2026-05-05 15:54:12 +00:00
Nathan Esquenazi
353033eb8d
chore(release): stamp v0.51.3 — 3-PR follow-up batch ( #1671 , #1673 , #1676 )
...
CHANGELOG.md: full v0.51.3 entry covering 3 PRs + test-fragility fix
ROADMAP.md: bump version + test count to 4477
TESTING.md: bump version + test count to 4477
Independent review: Opus advisor on stage-300 diff (1050 LOC).
7/7 verification questions verified clean. Verdict: SHIP.
0 MUST-FIX, 0 SHOULD-FIX.
2026-05-05 02:41:24 +00:00
Nathan Esquenazi
e095ed90be
chore(release): stamp v0.51.2 — 3-PR follow-up + #1669 scroll hotfix
...
CHANGELOG.md: full v0.51.2 entry covering 3 PRs + sidebar scroll hotfix
ROADMAP.md: bump version + test count to 4457
TESTING.md: bump version + test count to 4457
Independent review: Opus advisor on stage-299 diff (1336 LOC).
6/6 verification questions verified clean. Verdict: SHIP.
0 MUST-FIX, 2 SHOULD-FIX absorbed in-release (bounded WIKI walk +
URL scheme guard).
2026-05-05 02:19:56 +00:00
Nathan Esquenazi
58d141b8d6
chore(release): stamp v0.51.1 — 11-PR @Michaelyklam batch + Opus pass
...
CHANGELOG.md: full v0.51.1 entry covering all 11 constituent PRs
ROADMAP.md: bump version + test count to 4429
TESTING.md: bump version + test count to 4429
Independent review: Opus advisor on stage-298 diff (4749 LOC).
6/6 security/correctness questions verified clean. Verdict: SHIP.
0 MUST-FIX, 0 SHOULD-FIX. Two polish notes deferred to follow-up.
2026-05-05 01:40:36 +00:00
Nathan Esquenazi
8c7e263bf6
release: stamp v0.51.0 — Kanban v1 launch
...
CHANGELOG.md: full v0.51.0 entry covering the 12-commit Kanban stack
(#1645 , #1646 , #1647 , #1649 , #1654 , #1655 , #1660 , #1675 ) including
multi-board management, SSE event stream, dispatcher contract enforcement,
CSS-injection fix, archive race fix, mobile responsive, and 35 new
Kanban-specific tests (33 -> 68).
ROADMAP.md, TESTING.md: bumped to v0.51.0 / 4356 tests / 'Kanban v1 launch'.
Major version bump from 0.50.x -> 0.51.0 reflects the size and significance
of the feature: first-party-compatible Kanban surface (CRUD on /api/kanban/boards
+ real-time SSE event stream) parity-verified against the Hermes Agent
dashboard plugin. Independent review APPROVED, Opus advisor SHIP, all
SHOULD-FIX absorbed in-release with regression tests.
2026-05-05 00:55:02 +00:00
Hermes Agent
3005bfc491
chore(release): stamp v0.50.297 — 3-PR batch + Opus pass + 2 follow-ups absorbed
...
Constituent PRs:
#1659 by @bergeouss — Docker readonly false-positive (closes #1658 , fixes v0.50.295 regression)
#1653 by @nesquena — OAuth cancel race fix (follow-up to v0.50.296 #1652 )
#1657 by @Michaelyklam — health diagnostics + watchdog hardening (refs #1458 Bug #3 )
Opus advisor SHIP verdict on stage-297. Two follow-ups absorbed in-release:
- _deep_health_checks(stream_check=...) reuses pre-computed lock probe
- _handle_request_noblock docstring documents single-thread safety
PR #1656 closed as superseded by #1657 (same author, both target #1458 ,
#1657 is functional superset).
4284 → 4288 tests passing (+4).
2026-05-04 22:50:57 +00:00
Hermes Agent
db54dc594e
chore(release): stamp v0.50.296 — 3-PR batch + Opus pass + 2 follow-ups absorbed
...
Constituent PRs (all by @Michaelyklam):
#1640 — show TPS in assistant message headers (closes #1617 ) — Aaron UX APPROVED
#1648 — session save mode config (closes #1406 )
#1650 — Codex OAuth onboarding flow (refs #1362 )
Opus advisor SHIP verdict on stage-296. 14-question audit passed including
focused OAuth security review on #1650 . Two minor follow-ups absorbed:
- _get_active_hermes_home() exception fallback now logs warning
- Codex credential pool find-loop accepts both legacy and current source values
#1640 has @aronprins UX gate APPROVED (default-off TPS toggle in Preferences).
#1650 ships first in-app OAuth flow — server-owned device-code lifecycle,
profile-scoped credential storage, atomic chmod-before-rename writes.
4255 → 4284 tests passing (+29).
2026-05-04 21:38:26 +00:00
Hermes Agent
9aad249e5a
chore(release): stamp v0.50.295 — 3-PR batch + Opus pass
...
Constituent PRs:
#1637 by @Michaelyklam — protect raw pre from glued-bold lift (closes #1451 )
#1639 by @bergeouss — macOS auto-scroll race + custom:* provider list (closes #1360 , #1619 )
#1642 by @nesquena-hermes — YAML/JSON/diff code block newlines (closes #1618 , #1463 )
Opus advisor SHIP verdict on stage-295. One observation absorbed:
- api/config.py:2533 dead-code comment per Opus (defensive belt-and-braces
for #1619 fallback; load-bearing fix is in routes.py /api/models/live)
PR #1641 (Michaelyklam parallel-discovery duplicate of #1642 ) closed as
superseded; UI media adopted with co-author trailer.
4245 → 4255 tests passing (+10).
2026-05-04 18:37:52 +00:00
Hermes Agent
326c7d0daf
chore(release): stamp v0.50.294 — 3-PR batch + Opus pass
...
Constituent PRs:
#1631 by @nesquena-hermes — streaming stability trio (closes #1623 , #1624 , #1625 )
#1635 by @bergeouss — session list race + readonly fs guard (closes #1430 , #1470 )
#1636 by @nesquena-hermes — models cache version stamp (closes #1633 )
Opus advisor SHIP verdict on stage-294 (combined diff). All 9 verification
questions cleared. Two #1636 minor observations absorbed in-release:
- DEBUG logger calls in _is_loadable_disk_cache when rejecting
- Docstring clarification on string-vs-semver and schema-version axis
#1631 in-PR Opus pass already absorbed: rate-limited telemetry,
expanded _LOCAL_SERVER_PROVIDERS, RFC1918 CHANGELOG callout.
4180 → 4245 tests passing (+65).
2026-05-04 17:23:32 +00:00
Hermes Agent
f3e066b53c
chore(release): stamp v0.50.293 — 3-PR batch + 2 Opus follow-ups absorbed
...
Constituent PRs:
#1627 by @franksong2702 — show Hermes Agent version (closes #1606 )
#1629 by @nesquena-hermes — profile isolation trio (closes #1611 , #1612 , #1614 )
#1630 by @Michaelyklam — provider config cleanup regression test (#1597 follow-up)
Opus advisor SHIP verdict + 2 SHOULD-FIX absorbed in-release:
- load_projects() re-reads from disk inside lock to close migration startup race
- _detect_agent_version() uses --dirty for symmetry with _detect_webui_version()
4142 → 4180 tests passing.
2026-05-04 16:33:57 +00:00
Hermes Agent
1549a10510
chore(release): stamp v0.50.292 — 12-PR batch + Opus follow-ups absorbed
...
Constituent PRs:
#1597 by @Michaelyklam — pytest config-path isolation
#1598 by @Michaelyklam — multi-tab SSE broadcast (closes #1584 )
#1599 by @Sanjays2402 — _pending_started_at truthy-check (closes #1595 )
#1600 by @Michaelyklam — streaming markdown subpath/fallback
#1601 by @Michaelyklam — subpath frontend routes
#1602 by @ai-ag2026 — cross-source continuation
#1603 by @ai-ag2026 — git remote name preservation
#1605 by @ai-ag2026 — update banner branch labels
#1608 by @franksong2702 — cron broad-except removal (closes #1578 )
#1609 by @franksong2702 — server.py socket cleanup (closes #1583 )
#1621 by @franksong2702 — fork indicator polish (fixes #1613 )
#1622 by @s905060 — paste text-with-image (closes #1620 )
Opus advisor SHIP verdict + 2 SHOULD-FIX absorbed in-release:
• #1598 ordering race fixed (offline-buffer replay moved inside lock)
• #1601 sessions.js:1440 gateway SSE probe baseURI parity fix
4117 → 4142 tests passing.
2026-05-04 15:45:41 +00:00
nesquena-hermes
3369a08f37
fix(updates): use merge-base for compare URL so 'What's new?' link resolves
...
Closes #1579 .
api/updates.py was building the GitHub compare URL from local HEAD short SHA:
repoUrl + '/compare/' + curSha + '...' + newSha
where curSha = `git rev-parse --short HEAD`
Whenever local HEAD diverges from upstream — unpushed work, dirty stage
branches, forks, in-flight rebases, release-time merge commits whose SHA
only lives in the maintainer's local history — the compare URL points at
a SHA github.com has never seen and returns the standard 404 page.
Reporter (@ai-ag2026) observed:
https://github.com/nesquena/hermes-webui/compare/c660c7f...86cb22e
→ 404 because c660c7f was an unpushed local commit.
The right base is `git merge-base HEAD <compare_ref>` — the most recent
commit local and upstream share. Since `git fetch` succeeded just before,
the merge-base is guaranteed to exist on the upstream GitHub repo.
Behavior matrix:
Pure-behind clone (no local commits): merge-base == HEAD; URL unchanged.
Behind + local-only commits (#1579 ): merge-base != HEAD; URL points at
public ancestor instead of local HEAD.
merge-base failure (shallow clone): current_sha=None; JS link guard
suppresses link rather than emitting
a known-broken URL.
Also hardens static/ui.js: reset the link's href and display:none on every
banner render, so a stale link from a prior render can't survive a re-render
where the new payload has current_sha=null.
Tests:
- test_current_sha_is_merge_base_not_local_HEAD — reporter's scenario
- test_current_sha_equals_HEAD_when_no_local_commits — backward compat
- test_current_sha_falls_back_to_None_when_merge_base_fails — defensive
- test_whats_new_link_resets_display_and_href_on_every_render
- test_whats_new_link_suppressed_when_curSha_falsy
- test_reporter_url_shape_no_longer_produces_invalid_compare_url
4094 → 4100 passing. 0 regressions.
2026-05-04 05:26:19 +00:00
Hermes Release Agent
1636ab9ef9
release: stamp v0.50.290 — 5-PR batch (#1586+#1590+#1591+#1592+#1464) — 4094→4111 tests
...
- #1586 (Michaelyklam): login asset SW cache exemption
- #1590 (Michaelyklam): hot-apply compact tool activity setting
- #1591 (Michaelyklam): first-turn sidebar visibility (optimistic upserts)
- #1592 (Michaelyklam): turn duration display (Done in 1m 12s) + Opus follow-up (truthy-check on _pending_started_at)
- #1464 (JKJameson, maintainer-augmented): workspace dropdown sort+search+chip-sync (rebased + ternary fix + regression test)
Maintainer-side test fixes in stage:
- tests/test_465_session_branching.py: widen compact() search window 1500→3000
- tests/test_regressions.py: anchor on api('/api/chat/start' instead of comment line
Browser API sanity: 11/11 passed. Live UX verification: vision-confirmed dropdown sort+search+empty-state on test server. Opus advisor: SHIP AS-IS.
2026-05-04 05:10:29 +00:00
Hermes Release Agent
59a6c6bc15
release: stamp v0.50.289 — TCP keepalive on accepted connections ( #1581 ) — 4094 tests
2026-05-03 23:50:09 +00:00
Hermes Bot
59afbdb3ce
release: stamp v0.50.288 — 3-PR batch ( #1569 + #1571 + #1572 ) (4053 \u2192 4094 tests)
2026-05-03 22:54:34 +00:00
Hermes Bot
de412cef0e
release: stamp v0.50.287 — PR #1565 self-update active-stream guard (4051 → 4053 tests)
2026-05-03 21:18:58 +00:00
Hermes Bot
b852096dad
release: stamp v0.50.286 — PR #1561 password env-var lock UI (4028 → 4051 tests)
2026-05-03 21:09:08 +00:00