hermes-agent/apps/desktop/src/components
Brooklyn Nicholson 2c867b05ce perf(desktop): 60fps sash drag on real sessions — height-gate the RO pins
Driving HER real instance (real profile, real transcripts, streams live)
via CDP instead of synthetic tiles finally exposed the remaining stall.
The timeline on a real 60-frame sash drag:

  style recalc 2736ms | script 1027ms | layout 89ms
  top callsite: pin @ fallback.tsx — 927ms

Two pin-to-bottom ResizeObservers (the bounded tool window's and the
reasoning preview's) pinned on EVERY resize delivery. A sash drag changes
every message's WIDTH once per frame, so each frame ran scrollTop write ->
scrollHeight read across every tool group: a forced write-read reflow
cascade that the render counters could never see (zero React involvement).

Both pins are now height-gated off the RO entry (reflow-free): only
content GROWTH pins. Width-only deliveries return immediately.

Measured on the live app, same drag, before -> after:
  fps      11.5 -> 59-60
  p95      101ms -> 18ms
  slow>33  60/60 -> 1/60

Also in this batch (each was verified live before the next was attempted):
- thread/list: split messageSignature into STRUCTURAL (ids/roles — keys
  boundaries + row identity) and WEIGHT (part counts — budget only), and
  memoize groups + row JSX. A streamed part-append re-rendered every
  turn's boundary via its resetKey prop; explain() measured 540-865
  wasted Block renders per drag/stream sample, now {}.
- message-render-boundary: document the structural-only resetKey contract.
- tool/fallback: memoize ToolFallback's part object + ToolEntry/ToolTitle/
  ToolGlyph (151 renders each, 100% wasted, on real transcripts).
- use-message-stream: ADAPTIVE flush floor — next flush waits 3x the
  measured cost of the last one (33ms floor, 250ms cap), so multi-stream
  load degrades text update rate instead of input latency.
- tree-split: preview sash drags with inline flex on the two seam
  wrappers, committing the store ONCE on release (fixed-zone sides get
  flexBasis only, so a hidden sidebar can't leave a phantom gap).
- debug/: perf-live LoAF long-frame attribution, explain() cascade walker
  with changed-hook indices, diag-real-loop/key-latency/switch-trace
  probes that drive the real app over CDP.

Typing during 2 live streams: keystroke->paint p50 3.3ms, p95 18.4ms,
zero frames over 33ms. Session switch p50 ~35ms settled; the remaining
~1.3s outlier tail is streaming-session switches (React work-loop, not
style/layout) — next target.
2026-07-27 01:07:48 -05:00
..
assistant-ui perf(desktop): 60fps sash drag on real sessions — height-gate the RO pins 2026-07-27 01:07:48 -05:00
chat feat(desktop): style inline links as tinted chips 2026-07-26 04:25:16 -05:00
onboarding refactor(desktop): extract shared Progress primitive; billing uses it 2026-07-22 18:53:26 -05:00
pane-shell perf(desktop): 60fps sash drag on real sessions — height-gate the RO pins 2026-07-27 01:07:48 -05:00
particles feat(desktop): TikTok-style vibe hearts on a reusable particle system 2026-07-10 05:42:14 -05:00
pet fix(desktop): suspend decorative work when inactive 2026-07-26 21:05:55 -05:00
ui Merge pull request #72346 from NousResearch/bb/desktop-perf-finish 2026-07-26 20:15:35 -05:00
Backdrop.tsx feat(desktop): add a chat backdrop on/off toggle 2026-07-14 16:50:03 -04:00
billing-banner.tsx feat(desktop): billing toast + in-chat status-row banner with smart CTA 2026-07-22 18:09:08 -05:00
boot-failure-overlay.test.tsx fix(desktop): recover a failed gateway from the boot-failure screen 2026-07-12 04:07:41 -04:00
boot-failure-overlay.tsx style(desktop): satisfy merged eslint/prettier config 2026-07-20 23:01:49 +02:00
boot-failure-reauth.test.ts style(desktop): satisfy merged eslint/prettier config 2026-07-20 23:01:49 +02:00
boot-failure-reauth.ts feat(desktop): add "Connect to existing Hermes" option to first-run onboarding 2026-07-24 12:55:06 -05:00
brand-mark.tsx docs(desktop): add DESIGN.md design-system guide + close two consistency gaps (#40823) 2026-06-06 22:13:17 +00:00
desktop-install-overlay.test.tsx fix(desktop): keep the first-run local-start error from being wiped on mount 2026-07-25 21:34:35 -05:00
desktop-install-overlay.tsx fix(desktop): keep the first-run local-start error from being wiped on mount 2026-07-25 21:34:35 -05:00
error-boundary.tsx feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
find-bar.test.tsx fix(desktop): tear down find-in-page highlights on navigation and pin the keybind registration 2026-07-26 17:48:05 -07:00
find-bar.tsx fix(desktop): tear down find-in-page highlights on navigation and pin the keybind registration 2026-07-26 17:48:05 -07:00
first-run-remote-form.tsx feat(desktop): add "Connect to existing Hermes" option to first-run onboarding 2026-07-24 12:55:06 -05:00
gateway-connecting-overlay.test.tsx test(desktop): fix remaining act() warnings in gateway-connecting-overlay 2026-07-13 17:22:17 -04:00
gateway-connecting-overlay.tsx fix(desktop): address review — overlay a11y, e2e typecheck, nits 2026-07-20 14:37:39 -04:00
haptics-provider.tsx perf(desktop): faster session resume & warm AudioContext at idle 2026-06-12 21:07:40 -05:00
idle-mount.test.tsx perf(desktop): idle-mount boot-hidden panes off the cold-start critical path (#67857) 2026-07-20 04:31:32 +00:00
idle-mount.tsx perf(desktop): idle-mount boot-hidden panes off the cold-start critical path (#67857) 2026-07-20 04:31:32 +00:00
language-switcher.test.tsx Add searchable language picker 2026-06-06 07:51:44 -07:00
language-switcher.tsx feat(desktop): button tooltip keybind hints + keybinds settings tab + unified worktree dialog (#65204) 2026-07-16 18:26:21 -04:00
model-picker.tsx fix(desktop): keep model picker aligned with session state 2026-07-25 16:01:43 -06:00
model-visibility-dialog.tsx fix(desktop): scope model options by profile (#62795) 2026-07-22 09:40:50 -04:00
notifications.tsx lint(desktop): ban atom-mirrored refs via no-restricted-syntax eslint rule 2026-07-25 18:12:48 -07:00
page-loader.tsx Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
prompt-overlays.test.tsx feat(desktop): shared UI — per-session prompt overlays, gateway overlays, tab primitives 2026-07-13 17:57:54 -04:00
prompt-overlays.tsx fmt(js): npm run fix on merge (#65229) 2026-07-15 21:40:56 +00:00
remote-display-banner.tsx refactor(desktop): adopt shared utils + app-wide cleanups 2026-07-03 13:48:44 -05:00
session-picker.tsx style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
status-dot.tsx Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00