Commit Graph
4132 Commits
Author SHA1 Message Date
Rod Boev 6c7d551b41 fix(commands): keep slash command ownership ahead of bundles (#4087) 2026-06-13 14:06:35 -04:00
Rod Boev 840f12a74e fix(commands): keep bundle profile scoping strict (#4087) 2026-06-13 14:06:35 -04:00
Rod Boev 5a3c6c6f05 fix(commands): surface skill bundles in WebUI slash commands (#4087) 2026-06-13 14:06:35 -04:00
nesquena-hermes bba5631a69 Merge pull request #4125 from nesquena/stage-4103
Release NB (v0.51.389): surface dirty-install state in update check (#4085)
2026-06-13 10:48:38 -07:00
nesquena-hermes 465d229800 Merge #4103 (surface dirty install state in update-check, #4085) onto master
# Conflicts:
#	CHANGELOG.md
2026-06-13 17:38:48 +00:00
nesquena-hermes c76e219076 Merge pull request #4122 from nesquena/stage-4120
Release NA (v0.51.388): Stable Assistant Turn Anchors dual-run reconciler (inert) (#4120)
2026-06-13 10:35:22 -07:00
nesquena-hermes 33b7517b81 docs(changelog): stamp #4120 anchor dual-run reconciler (inert, slice 7) as v0.51.388 (Release NA) 2026-06-13 17:24:12 +00:00
nesquena-hermes 3e6309d8a8 Merge #4120 (assistant turn anchor dual-run reconciler, slice 7, inert) onto master 2026-06-13 17:22:56 +00:00
Frank Song c52c832d05 Add assistant turn anchor dual-run reconciler 2026-06-14 01:04:29 +08:00
nesquena-hermes e3d8a3dc30 Merge pull request #4115 from nesquena/stage-4108
Release MZ (v0.51.387): Stable Assistant Turn Anchors live shadow feed (inert) (#4108)
2026-06-13 09:36:44 -07:00
nesquena-hermes 310edac58e fix(#4108): add creation-time backstop cleanup to bound the registry-leak class
Codex found leak paths across 3 rounds (settled-restore, stream-end-fallback, reconnect-
preflight-inactive, stale-bailout, non-current-pane error, external cancelSessionStream).
Rather than chase every current+future teardown route, schedule an identity-guarded cleanup
at registry CREATION (600s) so window._liveAnchorRegistries self-expires no matter how the
stream ends — including external paths (boot.js cancelSessionStream) that bypass the SSE
handlers. Explicit terminal-path calls just expire it sooner. Shadow-only + identity-guarded,
so a rare >10min active stream only loses reconnect-continuity of an unconsumed registry.
2026-06-13 16:19:18 +00:00
nesquena-hermes 3cf96b1293 fix(#4108): cleanup anchor registry on reconnect-preflight-inactive + stale-stream-bailout paths (Codex round 2)
Two more early-return paths created the registry (early in attachLiveStream) then
returned without scheduling cleanup: (1) reconnect preflight when /api/chat/stream/status
is inactive/no-replay (~3966); (2) _bailOutOfTerminalEventsFromStaleStream (~1490) when a
stale stream's terminal event arrives after a newer stream owns the session. Both now
schedule identity-guarded cleanup (map.get(streamId)===registry, keyed on the stale
closure's own streamId so the newer registry is untouched).
2026-06-13 16:13:55 +00:00
nesquena-hermes 9594b97223 fix(#4108): schedule anchor registry cleanup on settled-restore + stream-end-fallback terminal paths (Codex leak catch)
Codex found window._liveAnchorRegistries retained registries for streams ending via
_restoreSettledSession() and _finalizeStreamEndFallback() (both terminal-close without
cleanup). Added _flushReasoningToAnchor()+_scheduleAnchorRegistryCleanup() to both —
identity-guarded delete already prevents clobbering a newer registry. All anchor helpers
are nested in attachLiveStream's closure (hoisted), ESLint runtime gate clean.
2026-06-13 16:09:20 +00:00
nesquena-hermes fcad7d6db2 docs(changelog): stamp #4108 anchor live shadow feed (inert) as v0.51.387 (Release MZ) 2026-06-13 16:05:06 +00:00
nesquena-hermes 30dd5647ed Merge #4108 (Stable Assistant Turn Anchors: live shadow feed, slice 6) onto master 2026-06-13 16:03:35 +00:00
Frank Song aa96bc52bc Add assistant turn anchor live shadow feed 2026-06-13 16:26:52 +08:00
nesquena-hermes ae90cf620b Merge pull request #4106 from nesquena/stage-4016b
Release MY (v0.51.386): voice mode survives dropped speechSynthesis onend (#3983)
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
Release MX (v0.51.385): profile-cookie env var aligned to HERMES_WEBUI_ prefix (#803)
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
Release MW (v0.51.384): no false streaming / activity-timer reset on session switch (#3900)
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
Release MV (v0.51.383): desktop tab title keeps active session name (#4086)
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
b3nw 9bb1dc8573 fix(#4085): surface dirty install state in update-check payload
The update-check payload now carries a `dirty: bool` reflecting the
working-tree state vs HEAD, computed via the same `git diff-index
--quiet HEAD --` primitive already used by `_dirty_suffix()`. A dirty
install at-or-past the latest release tag used to silently report
"Up to date" with no remediation affordance; the Settings panel
can now read this flag to offer `apply_force_update` (which already
does `git checkout .` + `git reset --hard` to reset to a clean
latest).

The probe is conservatively clean on real errors (timeout, missing
git, fatal) so a transient probe failure never produces a false-
positive "local changes" alert.

Closes #4085
2026-06-13 06:05:06 +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
Release MU (v0.51.382): Stable Assistant Turn Anchors activity-scene projection (inert) (#4093)
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
Release MT (v0.51.381): Stable Assistant Turn Anchors settled final-answer projection (#4092)
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
Release MS (v0.51.380): tool-iteration-limit stops surfaced explicitly (#3821)
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
Release MR (v0.51.379): Worklog detail collapse survives live refresh (#4062)
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
Release MQ (v0.51.378): scroll auto-follow toggle + don't-yank-while-reading (#4006)
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