Commit graph

5663 commits

Author SHA1 Message Date
nesquena-hermes
d0be66f2d1 docs(changelog): composer footer fit-by-overflow (#4657) 2026-06-29 01:19:34 +00:00
nesquena-hermes
c6370235be feat(composer): fit footer controls by overflow (#4657, rebased onto master)
Rebased Paladin173's #4657 onto current master. The per-control visibility
toggles half already shipped via his own #4598, so this rebase carries only the
net-new JS fit-by-overflow engine (_fitComposerFooter: ResizeObserver +
MutationObserver measure .composer-left overflow, step full -> cf-icons ->
cf-burger). Co-authored-by: Paladin173 <Paladin173@users.noreply.github.com>
2026-06-29 01:19:02 +00:00
nesquena-hermes
1c4096aa9d
Merge pull request #5174 from nesquena/stage/5136-p0-sessions
perf(#5132): bound /api/sessions state.db overrides (source uncapped, count capped) [P0]
2026-06-28 18:17:39 -07:00
nesquena-hermes
c344844766 fix(#5132): split state.db sidebar override — source uncapped, count capped
Codex deep-gate caught a CORE regression in the original top-N cap: capping
_apply_sidebar_state_db_overrides also capped the SOURCE classification that
/api/sessions filters on BEFORE the lazy lineage correction, so a stale-CLI JSON
row whose state.db source is webui could be silently filtered out of a WebUI-only
sidebar once it fell beyond the cap. Split the read: the indexed sessions-table
source/title lookup runs for ALL rows; only the expensive messages COUNT/MAX
aggregation (the actual 5-18s bottleneck) is capped to top-N. Added a 500-row
end-to-end regression with a real state.db proving the beyond-cap stale-CLI row
stays webui.
2026-06-29 00:54:15 +00:00
nesquena-hermes
c646d92206 perf(#5132): cap /api/sessions state.db source/title overrides to top-N
On power-user instances with thousands of sessions, GET /api/sessions
blocked 5-18s in the all_sessions.state_db_overrides stage:
_apply_sidebar_state_db_overrides read state.db for every row (2400+ ids)
on every concurrent poll. With the gateway-watcher reading and the agent
writing the same state.db, this became lock/IO contention that piled up
concurrent polls and flapped the UI to 'Connection lost'.

Cap the override lookup to the top-N most-recent (paint-priority) rows
that are actually visible, mirroring the existing lineage-enrichment cap
(#4638). The caller passes an already pinned-first/newest-first sorted
list, so the top-N covers the visible window; rows beyond the cap keep
their JSON source/title and are corrected lazily on history-panel open.
Cap defaults to 300, env-configurable via
HERMES_WEBUI_STATE_DB_OVERRIDE_TOP_N (0 disables). Fails open.

Reported by @latipun, reproduced by @b3nw.

Co-authored-by: latipun <latipun@users.noreply.github.com>
2026-06-29 00:40:10 +00:00
nesquena-hermes
58f23a51ca
Merge pull request #5158 from santastabber/explore-subagent-sidebar-stack-home-20260629084327
fix(sidebar): keep hidden archived parents as child references
2026-06-28 17:30:46 -07:00
nesquena-hermes
a8e921d13a fix(sidebar): scope hidden archived-parent references to active project + source
The sidebar_reference_sessions payload arrives project-unscoped from
/api/sessions. _renderSidebarRowsFromRawSessions appended it to EVERY
render unconditionally, so an archived parent in project B entered a
project-A-filtered render's suppression context and silently hid a
visible project-A child/fork (rendered as []). Add
_scopedSidebarReferenceRows() to filter references to the same project +
webui/cli source bucket as the render they feed, mirroring
_partitionSidebarSessionRows. Regression test locks the cross-project
case; the existing suppression test now exercises the scoped helper.

Co-authored-by: santastabber <santastabber@users.noreply.github.com>
2026-06-29 00:21:04 +00:00
santastabber
5ed0ba6ef6 fix(sidebar): keep hidden archived parents as child references 2026-06-29 00:13:32 +00:00
nesquena-hermes
b7c332cfc1
Merge pull request #5160 from nesquena/splash-logo-breathe
Splash logo: drop app-icon tile, free-breathing mark with per-theme glow
2026-06-28 16:52:41 -07:00
nesquena-hermes
863dc4e041 Splash logo: drop app-icon tile, free-breathing mark with per-theme glow
The new-conversation splash mark was wrapped in a glossy navy rounded-rect
that reads as a macOS app-launcher tile ('this is an app') rather than a
brand mark. Major AI chat UIs (Claude, ChatGPT, Gemini) all render their
empty-state mark bare. Remove the tile, scale the winged caduceus up
(~88px), and back it with a soft cyan/blue radial 'spirit' bloom.

Light and dark get separately tuned marks: dark keeps the bright
cyan->blue gradient + luminous bloom; light uses a deeper #0AA6CC->#1E63D6
gradient + cooler restrained bloom so the mark holds contrast on the pale
background instead of washing out. Entrance is gated behind
prefers-reduced-motion.
2026-06-28 23:42:02 +00:00
nesquena-hermes
93f5de52e1
Merge pull request #5164 from nesquena/stage-5155
Release v0.51.729 — extension browser-local settings surface (#5155, RFC #5094 first pass)
2026-06-28 16:29:56 -07:00
nesquena-hermes
4d79de266c Merge master into stage-5155 (catch up to v0.51.728) 2026-06-28 23:25:57 +00:00
nesquena-hermes
39fe1a50a5 docs(changelog): stamp #5155 extension browser-local settings surface (RFC #5094) 2026-06-28 23:21:48 +00:00
nesquena-hermes
488894e755
Merge pull request #5159 from nesquena/stage-sweep-5128-5129-5151
Release v0.51.728 — fix batch: auth-failure surfacing (#5129) + custom-provider wakeup (#5128) + gateway offline notice (#5151)
2026-06-28 16:09:17 -07:00
nesquena-hermes
f968de8d35 merge #5155 extension settings surface 2026-06-28 23:07:00 +00:00
nesquena-hermes
ffcb9b47b4 docs(changelog): stamp #5128 #5129 #5151 fix batch 2026-06-28 23:04:47 +00:00
nesquena-hermes
9736e943bb merge #5151 distinguish offline gateway approval warnings 2026-06-28 22:54:54 +00:00
nesquena-hermes
751ba20fec merge #5129 surface provider auth failures in chat 2026-06-28 22:54:54 +00:00
nesquena-hermes
1a4dcd4fb5 merge #5128 custom-provider bare-model wakeup repair 2026-06-28 22:54:54 +00:00
nesquena-hermes
83da31395e
Merge pull request #5154 from nesquena/stage/5117-defer
fix: defer non-critical session-switch refreshes (#5117)
2026-06-28 15:41:56 -07:00
nesquena-hermes
80661f03ce docs(changelog): defer non-critical session-switch refreshes (#5117) + scope-undef gate: allowlist requestIdleCallback/cancelIdleCallback 2026-06-28 22:38:22 +00:00
Rod Boev
7153e8d78f fix(extensions): prune malformed browser overrides (#5094) 2026-06-28 18:31:43 -04:00
Rod Boev
234fefe6ee fix(#5139): keep timeout capability probes on the unsupported path 2026-06-28 18:29:37 -04:00
Rod Boev
aef8e524fd fix(extensions): keep settings-only installs canonical (#5094) 2026-06-28 18:25:47 -04:00
nesquena-hermes
fc02953ea6 Merge branch 'pr-5117-head' into stage/5117-defer 2026-06-28 22:25:26 +00:00
Rod Boev
269d2e4d93 test(#5139): isolate the 404 warning regression from shared cache state 2026-06-28 18:23:20 -04:00
nesquena-hermes
7b12dff3e6 test(#5121): make auth-failure tests host-independent
The 4 terminal-auth-failure tests assert an unrecoverable 401 surfaces an
apperror / persisted _error turn. The settlement path first attempts the
#1401 credential self-heal, which reads ~/.hermes/auth.json. On a host with
populated credentials, self-heal can succeed and retry the mock agent,
swallowing the error the test expects -- so the result depended on host
credentials (green on CI / Windows with no creds, red on a live agent box).

Add an autouse fixture that forces _attempt_credential_self_heal to a no-op
so every host exercises the unrecoverable-failure path. The one test that
verifies a successful retry already patches the symbol in its own body, so it
is unaffected.

Co-authored-by: rodboev <rodboev@users.noreply.github.com>
2026-06-28 22:20:28 +00:00
Rod Boev
23b7a7935a fix(#5139): keep older gateways on the unsupported warning path 2026-06-28 18:18:47 -04:00
Rod Boev
46d91a7c61 fix(extensions): render installed controls from trusted state (#5094) 2026-06-28 18:15:36 -04:00
Rod Boev
938f721b16 fix(extensions): reload before editing untrusted installs (#5094) 2026-06-28 18:07:52 -04:00
nesquena-hermes
4e71be2268
Merge pull request #5150 from nesquena/stage/5147-approval
fix(gateway): clear stale approval mirrors on stream teardown (#5147)
2026-06-28 15:04:47 -07:00
Rod Boev
615b023eb0 fix(extensions): pin schemas to trusted bootstrap state (#5094) 2026-06-28 17:59:36 -04:00
nesquena-hermes
beb883a159 docs(changelog): clear stale gateway approval mirrors on teardown (#5147) 2026-06-28 21:57:12 +00:00
Rod Boev
343a8b50bf fix(#5139): distinguish offline gateway approval warnings 2026-06-28 17:53:37 -04:00
b3nw
7a04b7e9aa fix: gate bare-model repair on profile provider match (#5128 review)
When session model_provider differs from profile model.provider, do not
expose profile_default_model for suffix repair. Fast path also requires
profile_provider to match requested_provider when profile_provider is set.

Addresses cross-provider mis-resolution (custom:other-proxy + bare suffix).

Co-authored-by: b3nw <b3nw@users.noreply.github.com>
2026-06-28 21:52:06 +00:00
Rod Boev
cb96a5cf39 fix(extensions): trust only bootstrapped extension ids (#5094) 2026-06-28 17:51:42 -04:00
nesquena-hermes
c556262159 Merge branch 'pr-5147-head' into stage/5147-approval 2026-06-28 21:48:51 +00:00
nesquena-hermes
9bb23faf79
Merge pull request #5146 from nesquena/stage/5118-scroll
fix: pinned streaming scroll restoration (#5118)
2026-06-28 14:47:10 -07:00
nesquena-hermes
174d804da5
Merge branch 'master' into stage/5118-scroll 2026-06-28 14:44:08 -07:00
Rod Boev
07ed67a793 fix(extensions): keep runtime settings gated on owned storage (#5094) 2026-06-28 17:44:02 -04:00
nesquena-hermes
230a3af684 docs(changelog): pinned streaming scroll restoration (#5118) 2026-06-28 21:40:18 +00:00
nesquena-hermes
247aa55011
Merge pull request #5143 from nesquena/stage/5119-i18n
fix(i18n): complete Polish localization (#5119)
2026-06-28 14:34:39 -07:00
Rod Boev
62be5b02ea fix(#5135): clear stale gateway approval mirrors on stream teardown 2026-06-28 17:32:55 -04:00
Rod Boev
a76c794d6d feat(extensions): add browser-local extension settings surface (#5094) 2026-06-28 17:28:20 -04:00
nesquena-hermes
4db4b3d6f9
Merge branch 'master' into stage/5119-i18n 2026-06-28 14:26:38 -07:00
nesquena-hermes
fc087c067f Merge branch 'pr-5118-head' into stage/5118-scroll 2026-06-28 21:22:53 +00:00
nesquena-hermes
10642bc8bd
Merge pull request #5140 from nesquena/stage/5131-cron
fix(cron): recompute provider/model snapshots in the selected profile (#5131)
2026-06-28 14:13:31 -07:00
nesquena-hermes
48e6df9e39 Merge branch 'pr-5119-head' into stage/5119-i18n 2026-06-28 21:10:54 +00:00
nesquena-hermes
d482f8d256 docs(changelog): cron-snapshot profile recompute (#5131) 2026-06-28 21:10:28 +00:00
nesquena-hermes
fb7b16e723 Merge branch 'pr-5131-head' into stage/5131-cron 2026-06-28 20:51:44 +00:00