4116 Commits

Author SHA1 Message Date
Botomir
8d8a88680e fix: record fallback routing metadata
Some checks failed
Browser smoke / browser-smoke (push) Has been cancelled
Tests / lint (push) Has been cancelled
Tests / test (3.11, 0) (push) Has been cancelled
Tests / test (3.11, 1) (push) Has been cancelled
Tests / test (3.11, 2) (push) Has been cancelled
Tests / test (3.12, 0) (push) Has been cancelled
Tests / test (3.12, 1) (push) Has been cancelled
Tests / test (3.12, 2) (push) Has been cancelled
Tests / test (3.13, 0) (push) Has been cancelled
Tests / test (3.13, 1) (push) Has been cancelled
Tests / test (3.13, 2) (push) Has been cancelled
2026-07-10 08:07:32 +02:00
nesquena-hermes
ae90cf620b Merge pull request #4106 from nesquena/stage-4016b
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MY (v0.51.386): voice mode survives dropped speechSynthesis onend (#3983)
v0.51.386
2026-06-13 00:47:20 -07:00
nesquena-hermes
8b5c8e32fd docs(changelog): stamp #3983 voice-mode watchdog as v0.51.386 (Release MY) 2026-06-13 07:38:19 +00:00
nesquena-hermes
f61f88f16b Merge #4016 (re-arm browser voice mode when speechSynthesis drops, #3983) onto master 2026-06-13 07:37:31 +00:00
nesquena-hermes
1ae56799cb Merge pull request #4105 from nesquena/stage-4028
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MX (v0.51.385): profile-cookie env var aligned to HERMES_WEBUI_ prefix (#803)
v0.51.385
2026-06-13 00:36:33 -07:00
nesquena-hermes
a31466b1a3 docs(changelog): stamp #803 profile-cookie env var rename as v0.51.385 (Release MX) 2026-06-13 07:21:34 +00:00
nesquena-hermes
6e6931a8c3 Merge #4028 (align profile cookie env var with HERMES_WEBUI_ prefix) onto master 2026-06-13 07:20:58 +00:00
nesquena-hermes
abe89f3afa Merge pull request #4104 from nesquena/stage-3899
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MW (v0.51.384): no false streaming / activity-timer reset on session switch (#3900)
v0.51.384
2026-06-13 00:19:07 -07:00
nesquena-hermes
e129203854 test(#3899): re-anchor 4 test_inflight_stream_reuse tests to post-#3899 loadSession shape
rfind for the Phase-2 INFLIGHT branch (idle-reset added an earlier if(INFLIGHT[sid]){);
and test_load_session_attaches_sse_before_auxiliary_work now asserts each auxiliary call
individually (the old contiguous syncTopbar();renderMessages();appendThinking();loadDir
literal was legitimately broken up by the new restoreLiveTurnHtmlForSession insertion +
renderMessages(preserveScroll) arg — all calls still run after attachLiveStream). Behavior unchanged.
2026-06-13 07:10:15 +00:00
nesquena-hermes
377a1889aa test(#3899): widen 2 more fixed-window loadSession slices displaced by idle-reset block
test_issue3306 _load_session_clear_block (4000->6500) + test_issue_new_chat_draft_restore
body window (4000->6500): #3899's idle-reset + live-turn-snapshot blocks pushed the
carry-forward snapshot + destructive S.messages clear past the old fixed windows. Behavior
+ ordering unchanged; windows widened to contain them.
2026-06-13 06:55:36 +00:00
nesquena-hermes
5f3e0ab8d9 test(#3899): re-anchor 5 brittle source-window tests displaced by the idle-reset block
#3899's new idle-reset added an EARLIER if(INFLIGHT[sid]){ block in loadSession, so
4 test_regressions tests' src.find('if(INFLIGHT[sid]){') grabbed the wrong (idle-cleanup)
occurrence instead of the Phase-2 restore branch → switched to rfind (the substantive
branch). And the idle-cleanup comment changed from 'discard any browser-side inflight'
to 'reset browser-side streaming flags' → re-anchored test_frontend_drops_inflight_cache
on the new comment + nested if(!activeStreamId){...if(INFLIGHT[sid]){ form (behavior
preserved + enhanced). No production code changed.
2026-06-13 06:48:21 +00:00
nesquena-hermes
5bbddbad1e fix(#3900): false streaming + activity-timer reset on session switch (absorb #3899) + re-anchor regression tests
Production fixes (Tamaz-sujashvili, reviewed sound by maintainer):
- loadSession clears S.busy/S.activeStreamId as soon as metadata confirms no active_stream_id, before the async message-load gap (idle session no longer shows streaming chrome).
- Snapshots the live turn before wiping msgInner + seeds INFLIGHT, restores on the active-stream return path (timer/trace survive switch-back).

Re-anchored the 2 brittle regression tests per maintainer review: test_..snapshots.. now anchors on the unique 'Loading conversation...' marker (was matching the no-space 'Session not available' error path); test_..restores.. now asserts the LIVE Phase 2a restore (after loadInflightState) instead of the unreachable Phase-2b/1184 branch. CHANGELOG stamped v0.51.384 (MW).
2026-06-13 06:39:22 +00:00
nesquena-hermes
0f9b62370b Merge pull request #4102 from nesquena/stage-4094
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MV (v0.51.383): desktop tab title keeps active session name (#4086)
v0.51.383
2026-06-12 23:21:13 -07:00
nesquena-hermes
8c54973ed4 docs(changelog): stamp #4086 document-title-owner fix as v0.51.383 (Release MV) 2026-06-13 06:12:28 +00:00
nesquena-hermes
d85fd2c967 Merge #4094 (preserve session document title during bot-name refresh) onto master 2026-06-13 06:11:24 +00:00
Lynn-Lee
46a5ce1b1a fix tab title clobber during bot name refresh 2026-06-13 14:03:02 +08:00
nesquena-hermes
3f2eb8d362 Merge pull request #4101 from nesquena/stage-4093
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MU (v0.51.382): Stable Assistant Turn Anchors activity-scene projection (inert) (#4093)
v0.51.382
2026-06-12 23:02:04 -07:00
nesquena-hermes
4eec21c434 docs(changelog): stamp #4093 activity-scene projection (inert) as v0.51.382 (Release MU) 2026-06-13 05:56:53 +00:00
nesquena-hermes
9cf67cbeb2 Merge #4093 (anchor activity scene projection + tool_limit_reached stream label) onto master 2026-06-13 05:56:09 +00:00
nesquena-hermes
2847bd98a0 Merge pull request #4100 from nesquena/stage-4092
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MT (v0.51.381): Stable Assistant Turn Anchors settled final-answer projection (#4092)
v0.51.381
2026-06-12 22:40:31 -07:00
nesquena-hermes
f230a16f4d docs(changelog): stamp #4092 settled final-answer projection as v0.51.381 (Release MT) 2026-06-13 05:36:35 +00:00
nesquena-hermes
841d78d4e5 Merge #4092 (assistant turn anchor settled final projection) onto master 2026-06-13 05:36:00 +00:00
Frank Song
59c2ccd9cf feat(anchor): project activity scene rows 2026-06-13 13:23:27 +08:00
Frank Song
b990bd09dd feat(anchor): project settled final answer through anchor 2026-06-13 13:23:15 +08:00
nesquena-hermes
c2ecb47554 Merge pull request #4099 from nesquena/stage-3823
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MS (v0.51.380): tool-iteration-limit stops surfaced explicitly (#3821)
v0.51.380
2026-06-12 22:19:06 -07:00
nesquena-hermes
e4bdcbfeae Merge #3823 (tool iteration limit terminal state) onto master
# Conflicts:
#	CHANGELOG.md
2026-06-13 05:06:46 +00:00
nesquena-hermes
da70ea47f8 Merge pull request #4097 from nesquena/stage-4063
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MR (v0.51.379): Worklog detail collapse survives live refresh (#4062)
v0.51.379
2026-06-12 21:56:30 -07:00
nesquena-hermes
2bd8b40b15 harden(#4063): stamp disclosure-state snapshot with session id (Opus belt-and-suspenders)
_captureWorklogDetailDisclosureState stamps state._sid; _restoreWorklogDetailDisclosureState
skips restore on sid mismatch. Cross-session isolation no longer depends solely on the
sessions.js #msgInner wipe invariant — a future change to that loading-placeholder
behavior can't silently replay one session's collapse state onto another.
2026-06-13 04:47:36 +00:00
nesquena-hermes
c9930d2a3d Merge #4063 (preserve Worklog detail disclosure across rebuilds) onto master
# Conflicts:
#	CHANGELOG.md
#	static/ui.js
2026-06-13 04:41:17 +00:00
nesquena-hermes
d1b6e62eb6 Merge pull request #4095 from nesquena/stage-4006
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MQ (v0.51.378): scroll auto-follow toggle + don't-yank-while-reading (#4006)
v0.51.378
2026-06-12 21:37:07 -07:00
nesquena-hermes
f5fb50983b fix(#4006): defensive !==false at the 2 remaining settings-hydration sites (Opus note)
panels.js _autosaveAppearanceSettings (6309) + _applySavedSettingsUi (7837) read
auto_scroll_follow from a settings/body object — use !==false (default True) for
consistency with boot.js + the checkbox render, so a future partial-body refactor
can't silently default the True setting OFF. The .checked reads (6223/8170) keep !!
(a real bool).
2026-06-13 04:27:01 +00:00
nesquena-hermes
9f6ed5a61b test(#4006): re-anchor scroll tests to the explicit-settle signature + new snapshot-capture condition
scrollToBottom now calls _settleMessageScrollToBottom(false, true); renderMessages
captures scrollSnapshot when (preserveScroll || (!_autoScrollFollow && _messageUserUnpinned)).
Updated the 4 change-detector assertions in test_tars_scroll_reset_regressions.py +
test_issue1690_scroll_completion.py to the new strings; behavioral intent unchanged.
2026-06-13 04:20:25 +00:00
nesquena-hermes
6ced477822 fix(#4006): explicit-settle flag + pre-wipe snapshot capture (Codex r3)
1. _settleMessageScrollToBottom(force, explicit): when explicit (End-button /
   scrollToBottom), late-layout settling runs even with Auto-follow OFF — the
   setting only suppresses AUTOMATIC follow, not a deliberate jump. The RO + 2s
   fallback guards now bail on (!_autoScrollFollow && !explicit). scrollToBottom()
   passes explicit=true; the automatic scrollIfPinned() path stays guarded.
2. renderMessages now captures the pre-wipe scrollSnapshot when (Auto-follow off
   && user unpinned) too, so the non-preserve restore lands the reader where they
   were instead of receiving a null snapshot (no-op).
2026-06-13 04:16:48 +00:00
nesquena-hermes
36239700e6 i18n(#4006): add auto-follow setting label+desc to the remaining 11 locales (Opus note)
The keys shipped only in en+zh; added it/ja/ru/es/de/zh-Hant/pt/ko/fr/tr/pl so the
Settings → Appearance auto-follow toggle isn't English-only outside those two.
2026-06-13 04:12:11 +00:00
nesquena-hermes
2bdef4166f fix(#4006): gate the #3920 RO settle + render fall-through on _autoScrollFollow (Codex cross-PR catch)
Codex found that with Auto-follow OFF the #3920 ResizeObserver settle + 2s fallback
+ the non-preserve render path still force-scrolled to bottom (the setting was
incomplete vs the scroll machinery shipped in #3920). Fixes:
1. RO settle guard (ui.js:3153): bail when !_autoScrollFollow.
2. 2s static fallback guard (ui.js:3186): bail when !_autoScrollFollow.
3. non-preserve render fall-through (ui.js:8653): when Auto-follow off AND the user
   has unpinned, restore the scroll snapshot instead of scrollToBottom() — also
   closes the send() race (renderMessages runs before S.activeStreamId is set).
   A fresh session load (not unpinned) still lands at the bottom. Explicit
   user-initiated scrollToBottom() (End button) is untouched.
2026-06-13 04:09:58 +00:00
nesquena-hermes
00ea7766db feat(#4006): default auto-follow ON (Codex/Claude-Code parity) + fix default-hydration mismatch + CHANGELOG v0.51.378
Per maintainer decision, auto_scroll_follow defaults TRUE (sticky-bottom: follow
new output while streaming, scroll-up unpins and is respected) — matching Codex
CLI / Claude Code. The PR shipped it default-False.

Default-mismatch bug fixed (would have shown the True default as OFF for existing
users with no saved value):
- boot.js settings path: !!s.auto_scroll_follow -> s.auto_scroll_follow!==false
- boot.js no-settings fallback: false -> true
- panels.js checkbox render: !!settings.auto_scroll_follow -> !==false

Resolved the config.py + panels.js merge conflicts (kept both the Transparent
Stream setting and auto_scroll_follow). Added test_issue4006_auto_scroll_follow_default.py
pinning the True default across config/boot/panels + the follow-gate references.
2026-06-13 03:55:28 +00:00
nesquena-hermes
c02c31c837 Merge #4006 (scroll auto-follow setting + pin guards) onto master
# Conflicts:
#	api/config.py
#	static/panels.js
2026-06-13 03:54:11 +00:00
nesquena-hermes
d60fa993fc Merge pull request #4091 from nesquena/stage-3920
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MP (v0.51.377): Firefox post-stream scroll jitter (#3920)
v0.51.377
2026-06-12 20:47:38 -07:00
nesquena-hermes
d3c694251f test(#3920): re-anchor tars scroll regression tests to the ResizeObserver settle
The 2 failing assertions pinned the removed implementation (const passes=[0,16,80,180]
setTimeout fan-out + _settleMessageScrollToBottom(true) in scrollToBottom). Updated to
assert the new behavior contract: ResizeObserver on #msgInner + 2s static fallback +
force=false so the observer runs. Behavioral intent (settle survives late markdown
growth; sync write before settle scheduling) preserved.
2026-06-13 03:39:11 +00:00
nesquena-hermes
b5eabe1494 fix(#3920): apply Codex gate findings — observe #msgInner, instance-owned RO cleanup, restore .messages overflow-anchor
Codex SHIP-ONLY-WITH-FIXES (3 real issues; Codex+Opus disagreed on #1, stricter wins):
1. CORE — .messages lost overflow-anchor:none, reopening the #1360 (d21c9720) streaming-scroll-anchor regression. Restored it (native anchoring stays OFF; the RO does the settle). Opus had judged this removal acceptable; took Codex's stricter call.
2. SILENT — the ResizeObserver observed #messages (the scroll container, fixed by flex layout, never resizes) instead of #msgInner (.messages-inner, the growing transcript node) → callback would never fire. Now observes #msgInner.
3. SILENT — stale RO callbacks mutated the global _settleRO, which could disconnect a newer active observer after settle re-entry. Now instance-owned: close over const ro, only clear the global when _settleRO===ro.
2026-06-13 03:32:16 +00:00
nesquena-hermes
f9055c5d97 fix(#3920): address review — restore sidebar overflow-anchor, wire _settleFinalScroll via 2s fallback, + CHANGELOG v0.51.377
3 maintainer-review items the contributor hadn't addressed:
1. (blocking) restored .session-list overflow-anchor:none — the PR accidentally reverted the deliberate Firefox sidebar fix (2dfe765b); only the on-topic .messages removal is kept.
2/3. _settleFinalScroll was dead code + the promised 2s static-content safety timeout was missing — wired _settleFinalScroll(token) via a single 2s top-level fallback after _settleRO.observe(el), declared _settleFinalTimer + cleared it in _cancelBottomSettle and at settle re-entry.
2026-06-13 03:25:48 +00:00
nesquena-hermes
965baeb78c Merge #3920 (Firefox scroll ResizeObserver) onto master 2026-06-13 03:23:49 +00:00
nesquena-hermes
b2c41658d6 Merge pull request #4090 from nesquena/stage-3971
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MO (v0.51.376): Hide Thinking also hides Worklog reasoning (#3903)
v0.51.376
2026-06-12 20:22:48 -07:00
nesquena-hermes
02e201fcf1 docs(changelog): stamp #3903 Worklog-reasoning-hide as v0.51.376 (Release MO) 2026-06-13 03:19:44 +00:00
nesquena-hermes
35877dab1b fix(#3971): move show-thinking gate to the real Worklog render paths (Opus catch)
Opus final gate caught that the staged re-implementation placed the
window._showThinking===false gate in _worklogReasonNodeFromText, which has
ZERO callers — so live/settled reasoning rows (built by _syncWorklogReasonFromAnchor
and _appendWorklogReason) were never actually hidden, and removeThinking swept
data-worklog-reason-source=reasoning which the real rows (data-worklog-anchor-reason=1)
don't carry. The string-match tests passed against the dead function = green-suite blind spot.

Fix:
- Gate _syncWorklogReasonFromAnchor (live + settled): when _showThinking===false, remove any
  existing reasoning row and bail before building.
- Gate _appendWorklogReason (settled rebuild): return null when _showThinking===false.
- removeThinking + the settled-rebuild cleanup now sweep BOTH data-worklog-anchor-reason=1
  (the real attribute) and the legacy data-worklog-reason-source=reasoning.
- Re-anchor the tests to assert against the real render functions + the correct attribute.
2026-06-13 03:09:50 +00:00
nesquena-hermes
52c502a984 Merge #3971 (hide Worklog reasoning when Thinking disabled) onto master 2026-06-13 02:52:31 +00:00
nesquena-hermes
d1a9e9ffbb Merge pull request #4037 from franksong2702/franksong2702/stable-assistant-turn-anchors-slice3-registry
Add assistant turn anchor registry and shadow source harness
2026-06-12 19:45:46 -07:00
nesquena-hermes
dc909043cf Merge branch 'master' into franksong2702/stable-assistant-turn-anchors-slice3-registry 2026-06-12 19:41:20 -07:00
nesquena-hermes
bb33e76568 Merge pull request #4084 from nesquena/stage-4024
Some checks failed
Release & Docker / release (push) Has been cancelled
Release MN (v0.51.375): Transparent Stream activity display (#3820 / #4024)
v0.51.375
2026-06-12 19:19:57 -07:00
nesquena-hermes
9f1933f81e chore(#4024): drop docs/ui-ux/review-shots/ trifecta scratch from the release diff
These 5 PNGs (722K) are the agent trifecta review-pass screenshots copied into
the worktree so the Opus gate could read them — review scratch, not durable UX
evidence. The intended evidence lives in docs/ui-ux/evidence/pr4024-*.png and is
kept. Mirrors the .review-crops/ cleanup; gitignore the dir so review scratch
can't leak into a release diff. No code or test change.
2026-06-13 02:15:01 +00:00