Commit Graph
6234 Commits
Author SHA1 Message Date
nesquena-hermes 4e57aed491 docs(changelog): #5404 hide inactive prompt flyouts from screen readers 2026-07-02 19:52:48 +00:00
nesquena-hermes 517419f18a Merge #5404: hide inactive prompt flyouts from screen readers [sheldon-im] 2026-07-02 19:52:19 +00:00
nesquena-hermes 7cddabbb8c Merge pull request #5440 from nesquena/release/stage-5392
Release — mobile transcript jump-back root fix (#5392, residual #4856)
2026-07-02 12:50:02 -07:00
nesquena-hermes 75891eac90 docs(changelog): #5392 mobile overflow-anchor defer (residual #4856 jump-back) 2026-07-02 19:36:18 +00:00
nesquena-hermes 2839c16ab7 Merge #5392: defer mobile overflow-anchor suppression across height-churn window (#4856) [allenliang2022] 2026-07-02 19:35:40 +00:00
nesquena-hermes 7ee6a12e44 Merge pull request #5436 from nesquena/release/stage-5402
Release — sidebar action menu stays open during chat scroll (#5402, closes #5347)
2026-07-02 12:26:40 -07:00
nesquena-hermes 82dbb8d35e docs(changelog): #5402 sidebar action menu stays open on chat scroll 2026-07-02 19:10:40 +00:00
nesquena-hermes 76f31a5478 Merge #5402: keep sidebar action menu open during chat scroll (#5347) [nankingjing] 2026-07-02 19:10:24 +00:00
nesquena-hermes 6fe063fe23 Merge pull request #5433 from nesquena/release/stage-5400
Release — Transparent Stream flicker/row-drop fix (#5400, closes #5367)
2026-07-02 12:01:33 -07:00
nesquena-hermes 5fe110afd5 docs(changelog): #5400 transparent-stream live-row reconcile 2026-07-02 18:44:52 +00:00
nesquena-hermes 3763f60646 Merge #5400: preserve transparent stream live rows on rerender (#5367) [rodboev] 2026-07-02 18:44:30 +00:00
nesquena-hermes 4130b91988 Merge pull request #5432 from nesquena/release/stage-5412
Release — instant profile-dropdown open (#5412) + gate-found brick fix
2026-07-02 11:42:22 -07:00
nesquena-hermes 176720b55a fix(profiles): guard non-string cached model in dropdown render + purge from cache predicate (Codex gate finding on #5412)
A poisoned cache row {name:'x', model:{}} passed the name-only cache predicate
but threw 'p.model.split is not a function' synchronously on profile-chip click,
bricking profile switching until localStorage was cleared. Guard both render
sites (typeof p.model==='string') and reject unsafe model types in
_profileDropdownDataCacheUsable; regression covers {model:{}} and {model:123}.
2026-07-02 18:27:27 +00:00
nesquena-hermes cd5cb02635 docs(changelog): #5412 instant profile-dropdown open 2026-07-02 18:20:18 +00:00
nesquena-hermes b5bd4465b6 Merge #5412: speed up profile dropdown opening [ruizanthony] 2026-07-02 18:19:57 +00:00
nesquena-hermes 1e1a3dd6f0 Merge pull request #5429 from nesquena/release/stage-5407
Release — TTS DNS-rebinding SSRF hardening (#5407) + CGNAT/Tailscale blocklist follow-up
2026-07-02 11:16:29 -07:00
nesquena-hermes bf1ca227dd fix(tts): block non-globally-routable addrs (CGNAT/Tailscale 100.64.0.0/10) via not-is_global backstop + tests (Opus follow-up on #5407) 2026-07-02 18:04:28 +00:00
nesquena-hermes 15dc671c0a docs(changelog): #5407 TTS DNS-rebind SSRF hardening 2026-07-02 17:45:49 +00:00
nesquena-hermes 24eb618571 Merge #5407: pin OpenAI TTS proxy connect target vs DNS-rebind TOCTOU (#5291) [rodboev] 2026-07-02 17:45:04 +00:00
nesquena-hermes 8c69382a01 Merge pull request #5426 from nesquena/release/stage-p1a
Release p1a — profile-switch new-session 404 (#5423) + health Bearer auth (#5424)
2026-07-02 10:22:20 -07:00
nesquena-hermes 27df663246 docs(changelog): #5423 profile-switch new-session 404 + #5424 health Bearer auth 2026-07-02 17:08:16 +00:00
nesquena-hermes b184588e8a Merge #5424: Bearer auth on remote /health/detailed probe (#5418) [nankingjing] 2026-07-02 17:07:51 +00:00
nesquena-hermes 2f353e7a16 Merge #5423: unblock session/new after profile switch (#5420) [nankingjing] 2026-07-02 17:07:51 +00:00
nesquena-hermesandnankingjing 32baf1302b fix(routes): unblock session/new after profile switch (#5420)
Clean rebase of nankingjing's #5423 (rebase-first).

Co-authored-by: nankingjing <nankingjing@users.noreply.github.com>
2026-07-02 16:34:37 +00:00
nesquena-hermesandnankingjing 4d7fad06e6 fix(health): send Bearer auth on remote /health/detailed probe (#5418)
Clean rebase of nankingjing's #5424 (rebase-first).

Co-authored-by: nankingjing <nankingjing@users.noreply.github.com>
2026-07-02 16:24:39 +00:00
nesquena-hermesandrodboev 4e74de45f8 fix(#5367): preserve transparent stream live rows on rerender (rehydrate controls)
Clean rebase of rodboev's #5400 (rebase-first).

Co-authored-by: rodboev <rodboev@users.noreply.github.com>
2026-07-02 14:49:05 +00:00
nesquena-hermesandrodboev 56889fa35e fix(#5291): pin OpenAI TTS proxy + iterate vetted RRset (DNS-rebind TOCTOU)
Clean rebase of rodboev's #5407 (rebase-first).

Co-authored-by: rodboev <rodboev@users.noreply.github.com>
2026-07-02 14:38:09 +00:00
nesquena-hermesandruizanthony 2032ac079e fix: speed up profile dropdown opening (preserve shared single-profile cache)
Clean rebase of ruizanthony's #5412 (rebase-first).

Co-authored-by: ruizanthony <ruizanthony@users.noreply.github.com>
2026-07-02 13:38:43 +00:00
nesquena-hermesandnankingjing 791523dffa fix(ux): keep sidebar action menu open during chat scroll + close on anchor detach (#5347)
Clean rebase of nankingjing's #5402 (rebase-first).

Co-authored-by: nankingjing <nankingjing@users.noreply.github.com>
2026-07-02 10:09:55 +00:00
nesquena-hermesandsheldon-im 012c66d12c Hide inactive flyouts from screen readers (+ visual-hide CSS)
Clean rebase of sheldon-im's #5404 (rebase-first).

Co-authored-by: sheldon-im <sheldon-im@users.noreply.github.com>
2026-07-02 07:15:53 +00:00
nesquena-hermes d096b5f5d9 Merge pull request #5405 from nesquena/gate-rebase/5162-steer-v3
Release v0.51.823: #5162 default message mode rename + steer default (#5145)
2026-07-01 22:54:32 -07:00
nesquena-hermes 9714122c98 chore(changelog): #5162 default message mode rename + steer default 2026-07-02 05:45:54 +00:00
nesquena-hermesandRod Boev b931ae2f9b fix(settings): reconcile #5145 rename+steer-flip onto master's #5170 mirror
Rebase PR #5162 (rename busy_input_mode -> default_message_mode; flip the
default from 'queue' to 'steer') onto current origin/master WITHOUT dropping
the shipped #5170 localStorage persistence mirror.

Rename the mirror machinery to the new setting name for consistency:
  _BUSY_INPUT_MODES        -> _DEFAULT_MESSAGE_MODES        (values unchanged)
  _normalizeBusyInputMode  -> _normalizeDefaultMessageMode  (fallback now 'steer')
  _persistBusyInputMode    -> _persistDefaultMessageMode
  _readPersistedBusyInputMode -> _readPersistedDefaultMessageMode
  window._busyInputMode    -> window._defaultMessageMode (+ renamed exports)

localStorage: write the new 'hermes-default-message-mode' key; read it with a
fallback to the legacy 'hermes-busy-input-mode' key so an existing user's
persisted preference survives the rename.

Preserve #5170 behavior at every mirror site under the new names:
  - boot success  -> window._defaultMessageMode=_persistDefaultMessageMode(...)
  - boot FAILURE  -> window._defaultMessageMode=_readPersistedDefaultMessageMode()
    (NOT a hardcoded 'steer' — a saved 'interrupt'/'queue' must still apply when
    the server is unreachable; do not regress #5167/#5132)
  - preferences autosave, settings-panel load, and _applySavedSettingsUi all
    persist through _persistDefaultMessageMode(...)

Tests updated for the rename while keeping the persistence-behavior assertions
(test_1062, test_5145, test_5167); test_5167 gains explicit guards that the
load-failure path reads the persisted pref and never hardcodes a literal mode,
plus autosave/panel-load mirror-write coverage.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-02 05:44:48 +00:00
nesquena-hermes 1f2dac90df Merge pull request #5403 from nesquena/stage-batch-5399-5209
Release v0.51.822: #5399 session-list 502 retry + #5209 update-summary expand
2026-07-01 22:26:39 -07:00
nesquena-hermes 404585a831 chore(changelog): #5399 session-list 502 retry + #5209 update-summary expand 2026-07-02 05:23:01 +00:00
nankingjing cabbb9a841 fix(ux): add expand control for update summary panel (#4705)
Move scrolling to an inner container and add an Expand/Collapse toggle
so long generated summaries are readable on narrow viewports.

Fixes #4705
2026-07-02 05:14:00 +00:00
nesquena-hermesandweidzhou 3fde698232 fix(sessions): always retry sidebar session-list GET on 502/503/504 (#5394)
The sidebar session-list GET had 502/503/504 retry logic, but it was gated
to cold boot only. Once `_sessionListHasLoadedOnce` flipped true, every later
refresh (profile switch, focus/visible/reconnect) shipped no retryStatuses, so
a transient 502 during an nginx->backend restart window failed on the first
attempt and left the sidebar stale until a hard reload (Ctrl+F5).

The session-list GET is idempotent, so retrying it is safe unconditionally.
This moves `retries:1` + `retryStatuses:[502,503,504]` into the base request
options so they apply to every refresh, while keeping the larger boot timeout
(`_SESSION_LIST_BOOT_TIMEOUT_MS`) and `retryTimeouts` boot-only. The api()
wrapper in static/workspace.js already retries when the error status is in
retryStatuses, so no other change is needed.

Extends the existing source-string regression test to assert the retry
options are now always present (declared before the boot-only gate) while the
boot path still carries the timeout + timeout retry.

Reported and root-caused by @weidzhou, who traced the boot-only retry gate.

Co-authored-by: weidzhou <weidzhou@users.noreply.github.com>
2026-07-02 05:13:59 +00:00
nesquena-hermes daed2da7c1 Merge pull request #5401 from nesquena/gate-rebase/5398-cron-optin
Release: #5398 — stop auto-creating Cron Jobs project without opt-in (#5379)
2026-07-01 21:44:48 -07:00
nesquena-hermes da33f1e3d8 chore(changelog): #5398 stop auto-creating Cron Jobs project without opt-in 2026-07-02 04:37:11 +00:00
Rod Boev 581bd3044b test(cron): isolate legacy mocks from PROJECTS_FILE reads (#5379) 2026-07-02 04:36:45 +00:00
Rod Boev fd4d57b6da test(cron): align the legacy fixture with PROJECTS_FILE (#5379) 2026-07-02 04:36:45 +00:00
Rod Boev 8e398cd1b3 fix(cron): stop auto-creating the Cron Jobs project without project opt-in (#5379) 2026-07-02 04:36:45 +00:00
nesquena-hermesandallenliang2022 9fd349898f fix(chat): defer mobile overflow-anchor suppression (re-arm reachable + independent hard cap) #4856
Clean rebase of allenliang2022's #5392 (rebase-first).

Co-authored-by: allenliang2022 <allenliang2022@users.noreply.github.com>
2026-07-02 04:01:38 +00:00
nesquena-hermes 4a46c834e2 Merge pull request #5397 from nesquena/feat-export-html-sidebar-menu
Export-to-HTML: move to the sidebar conversation menu (#4968 follow-up)
2026-07-01 20:38:07 -07:00
nesquena-hermes 21f321c06c test: update read-only action-menu shape assertion for the appended Export item 2026-07-02 03:34:36 +00:00
nesquena-hermes f50b1d84e1 feat(sessions): move Export-to-HTML into the sidebar conversation menu
Follow-up to v0.51.819 which removed the export button from the composer footer
(it tripped the footer overflow-collapse, hiding model/workspace labels). Per
design consult (Fable) + ChatGPT/Open-WebUI convention, export now lives in the
per-conversation sidebar three-dot action menu, right after Duplicate:
- exportSessionHTML(session) parameterized (was active-session-only); Settings
  button now wired ()=>exportSessionHTML() and still exports the active session
- new _appendSessionExportHtmlAction() added after Duplicate + in the read-only
  early-return branch (export is non-mutating; imported sessions re-exportable)
- exports THAT row's conversation, not just the active one
- download icon added to ICONS; session_export_html[_desc] added to 14 locales
- Settings HTML button retained as secondary data-management entry
2026-07-02 03:21:18 +00:00
nesquena-hermes ca939cd006 Merge pull request #5396 from nesquena/fix-composer-export-footer
Hotfix — remove Export-to-HTML button from composer footer (restores model/workspace labels)
2026-07-01 19:58:52 -07:00
nesquena-hermes efe72238bc chore(changelog): composer-footer export-button removal hotfix 2026-07-02 02:51:42 +00:00
nesquena-hermes 219615b5a7 fix(composer): remove Export-to-HTML button from composer footer (keep settings-panel export)
The #4968 export button was hard-inserted into the composer footer .composer-left
row, bypassing the configurable composer-control framework. On desktop it pushed the
footer over its overflow threshold, tripping _fitComposerFooter into cf-icons mode
which HIDES the model/workspace/profile text labels. Removing it restores label
visibility. Export stays available via the settings-panel HTML button (#btnExportHTML).
2026-07-02 02:48:45 +00:00
nesquena-hermes d505b5b54a Merge pull request #5395 from nesquena/gate-rebase/4968-export-html2
Release — export chat to self-contained themed HTML (#4968)
2026-07-01 19:41:31 -07:00