Commit graph

6236 commits

Author SHA1 Message Date
akay64
87404d76f0 fix: scan providers: in resolve_model_provider() for user-defined provider matching
Mirrors the existing custom_providers: scan immediately above. User-defined
providers declared under config.yaml's providers: section with explicit
models: lists were invisible to model-to-provider resolution — bare model
IDs fell through to the stale config_provider, routing through the wrong
endpoint.

The insertion site sits after custom_providers: (unchanged) and before
all heuristics (@provider:model, slash, fallback — all unchanged).
2026-07-04 08:59:21 +04:00
nesquena-hermes
9e0f0259cf
Merge pull request #5443 from nesquena/release/stage-5404
Release — hide inactive approval/clarify dialogs from screen readers (#5404)
2026-07-02 13:09:13 -07:00
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-hermes
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-hermes
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-hermes
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-hermes
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-hermes
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-hermes
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-hermes
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-hermes
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-hermes
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-hermes
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