hermes-agent/apps/desktop/src/lib
Brooklyn Nicholson 41dd895e12 perf(desktop): stop the statusbar re-rendering per streaming token
The statusbar subscribed to `$focusedSessionState` — a projection of
`$sessionStates`, which is republished on every message delta — but reads
only three fields off it. Every token therefore re-ran useStatusbarItems
and rebuilt all ~9 item objects, and since StatusbarItemView was not
memoized, one changed item (the running timer) re-rendered the whole bar.

Adds `useStoreSelector` beside the existing `useSessionSlice`, the same
narrowing idea for a scalar instead of a keyed array: subscribe to the
store, but bail out unless the selected value changes. Applies it to the
three fields the statusbar actually reads, and memoizes StatusbarItemView.

Measured over five concurrent streaming tabs (`render-churn`):

  total renders   78,385 -> 21,701   (-72%)
  wasted renders  10,432 ->  6,112   (-41%)
  TooltipContent   2,304 ->    143   (-94%)
  StatusbarItemView 2,174 ->      0
2026-07-26 14:21:34 -05:00
..
keybinds test(desktop): cover hidden-tab resolution for drops, focus, and timeline 2026-07-25 00:09:30 -05:00
ansi.test.ts fix(desktop): triage batch of GUI quality-of-life fixes (#37536) 2026-06-02 16:33:22 -04:00
ansi.ts desktop: registry-driven slash commands + first-class /resume & /handoff (#42351) 2026-06-11 01:49:24 +00:00
chat-messages.test.ts fmt(js): npm run fix on merge (#71196) 2026-07-25 04:51:19 +00:00
chat-messages.ts feat(desktop): auto-continue turns interrupted by a crash 2026-07-24 23:31:56 -05:00
chat-runtime.test.ts fix(desktop): close cross-session leak windows in composer + session refs (#59305) 2026-07-24 16:04:12 -07:00
chat-runtime.ts fix(desktop): close cross-session leak windows in composer + session refs (#59305) 2026-07-24 16:04:12 -07:00
clipboard.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
commit-changelog.test.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
commit-changelog.ts refactor(desktop): adopt shared utils + app-wide cleanups 2026-07-03 13:48:44 -05:00
completion-sound.ts refactor(desktop): tidy the cross-window deduper 2026-07-20 18:36:05 -05:00
composer-input-sanitize.test.ts test(input): preservation regressions and prompt.submit boundary (#62557) 2026-07-15 07:39:42 -07:00
composer-input-sanitize.ts fix(desktop): resolve eslint errors in composer-input-sanitize.ts 2026-07-16 01:42:02 +05:30
desktop-fs.test.ts style(desktop): satisfy merged eslint/prettier config 2026-07-20 23:01:49 +02:00
desktop-fs.ts style(desktop): satisfy merged eslint/prettier config 2026-07-20 23:01:49 +02:00
desktop-git.test.ts fix(desktop): salvage /compress cluster — session.compress RPC + dedicated RPC routing (#68229) 2026-07-22 16:40:06 -04:00
desktop-git.ts fix(desktop): salvage /compress cluster — session.compress RPC + dedicated RPC routing (#68229) 2026-07-22 16:40:06 -04:00
desktop-remote-auth.test.ts fmt(js): npm run fix on merge (#70914) 2026-07-24 18:14:17 +00:00
desktop-remote-auth.ts feat(desktop): add "Connect to existing Hermes" option to first-run onboarding 2026-07-24 12:55:06 -05:00
desktop-slash-commands.test.ts fix(desktop): /goal arg stays editable, kickoff queues when busy, slash header stops echoing long args 2026-07-25 16:09:38 -07:00
desktop-slash-commands.ts fix(desktop): /goal arg stays editable, kickoff queues when busy, slash header stops echoing long args 2026-07-25 16:09:38 -07:00
desktop-toolsets.test.ts fix(desktop): hide platform/internal toolsets from the Skills & Tools list 2026-06-24 19:18:29 -05:00
desktop-toolsets.ts fix(desktop): hide platform/internal toolsets from the Skills & Tools list 2026-06-24 19:18:29 -05:00
drag-ghost.ts fix(desktop): session-tab drag, focus sync, and pop-out isolation 2026-07-15 03:13:33 -04:00
embedded-images.test.ts fix(desktop): persist the image ref for natively-vision-capable models too 2026-07-24 21:20:52 -05:00
embedded-images.ts fix(desktop): persist the image ref for natively-vision-capable models too 2026-07-24 21:20:52 -05:00
escape-layers.test.ts feat(desktop): store + lib — layout/preview/session atoms, escape-layers, keybind helpers 2026-07-13 17:57:54 -04:00
escape-layers.ts feat(desktop): store + lib — layout/preview/session atoms, escape-layers, keybind helpers 2026-07-13 17:57:54 -04:00
excluded-paths.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
external-link.test.tsx fmt(js): npm run fix on merge (#71892) 2026-07-26 10:16:26 +00:00
external-link.tsx feat(desktop): style inline links as tinted chips 2026-07-26 04:25:16 -05:00
format.ts feat(desktop): Capabilities foundation — shared utils, master-detail, editors, primitives 2026-07-03 05:08:13 -05:00
gateway-events.test.ts fix(desktop, ink): don't wipe messages before final message (#65919) 2026-07-20 11:42:29 -04:00
gateway-events.ts fix(desktop, ink): don't wipe messages before final message (#65919) 2026-07-20 11:42:29 -04:00
gateway-rpc.test.ts fix(desktop): dismiss stale prompt overlays 2026-07-08 16:52:10 +02:00
gateway-rpc.ts fix(desktop): dismiss stale prompt overlays 2026-07-08 16:52:10 +02:00
gateway-ws-url.test.ts fix(desktop): avoid false remote gateway reauthentication (#68250) 2026-07-20 20:54:36 -04:00
generated-images.test.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
generated-images.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
haptics.ts feat(desktop): drag sessions into chat as @session links + spawn loader 2026-06-04 19:41:51 -05:00
icons.ts polish(desktop/billing): auto-poll, no-card notice, grouped card layout 2026-07-22 16:48:04 -05:00
incremental-external-store-runtime.test.ts perf(desktop): reconcile only the messages that actually moved 2026-07-26 02:56:08 -05:00
incremental-external-store-runtime.ts perf(desktop): reconcile only the messages that actually moved 2026-07-26 02:56:08 -05:00
inflight-turn-journal.test.ts feat(desktop): crash-survivable in-flight turn journal 2026-07-24 23:31:55 -05:00
inflight-turn-journal.ts feat(desktop): crash-survivable in-flight turn journal 2026-07-24 23:31:55 -05:00
json-format.test.ts feat(desktop): Capabilities foundation — shared utils, master-detail, editors, primitives 2026-07-03 05:08:13 -05:00
json-format.ts feat(desktop): Capabilities foundation — shared utils, master-detail, editors, primitives 2026-07-03 05:08:13 -05:00
json-rpc-gateway-url-guard.test.ts fmt(js): npm run fix on merge (#69562) 2026-07-22 19:01:09 +00:00
katex-memo.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
loadout.ts refactor(desktop): adopt shared utils + app-wide cleanups 2026-07-03 13:48:44 -05:00
local-preview.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
markdown-blocks.test.ts test(desktop): raise timeout on markdown-blocks property fuzz 2026-07-18 18:53:41 -04:00
markdown-blocks.ts fix(desktop): correct incremental markdown split boundary (setext merge) 2026-07-18 18:21:58 -04:00
markdown-code.test.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
markdown-code.ts refactor(desktop): adopt shared utils + app-wide cleanups 2026-07-03 13:48:44 -05:00
markdown-preprocess.ts feat(desktop): render agent-written @session links as chips 2026-07-24 22:52:45 -05:00
mcp-dashboard-oauth.test.ts fmt(js): npm run fix on merge (#66348) 2026-07-17 14:30:29 +00:00
mcp-dashboard-oauth.ts fmt(js): npm run fix on merge (#66348) 2026-07-17 14:30:29 +00:00
mcp-tool-filter.test.ts feat(mcp): first-class MCP tab — catalog, GUI auth/probe/logs, per-tool gating 2026-07-03 05:08:28 -05:00
mcp-tool-filter.ts feat(mcp): first-class MCP tab — catalog, GUI auth/probe/logs, per-tool gating 2026-07-03 05:08:28 -05:00
media.remote.test.ts fix(desktop): render remote markdown images in chat (#57944) 2026-07-23 00:16:20 -05:00
media.ts fix(desktop): render remote markdown images in chat (#57944) 2026-07-23 00:16:20 -05:00
model-options.test.ts fix(desktop): scope model options by profile (#62795) 2026-07-22 09:40:50 -04:00
model-options.ts fix(desktop): scope model options by profile (#62795) 2026-07-22 09:40:50 -04:00
model-status-label.test.ts Merge pull request #71601 from helix4u/fix/desktop-model-picker-authority 2026-07-25 21:20:54 -05:00
model-status-label.ts Merge pull request #71601 from helix4u/fix/desktop-model-picker-authority 2026-07-25 21:20:54 -05:00
mutable-ref.ts chore(desktop): zero eslint/typecheck debt + prettier pass (#39100) 2026-06-04 14:10:38 +00:00
oneshot.ts feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
persisted.ts feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
pool.test.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
pool.ts feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
preview-targets.test.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
preview-targets.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
profile-color.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
project-idea-templates.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
provider-setup-errors.test.ts fix(desktop): stop spurious provider onboarding from credential warnings 2026-07-23 00:18:21 -05:00
provider-setup-errors.ts fix(desktop): stop spurious provider onboarding from credential warnings 2026-07-23 00:18:21 -05:00
query-client.test.ts perf(desktop): scope tool-diff subscriptions + narrow profile query invalidation 2026-07-18 19:15:57 -04:00
query-client.ts perf(desktop): scope tool-diff subscriptions + narrow profile query invalidation 2026-07-18 19:15:57 -04:00
raf-coalesce.ts refactor(desktop): extract shared rafCoalesce helper for sash drags 2026-07-19 22:38:57 -05:00
reasoning-effort.test.ts refactor(desktop): give reasoning effort one owner 2026-07-25 20:51:18 -05:00
reasoning-effort.ts refactor(desktop): give reasoning effort one owner 2026-07-25 20:51:18 -05:00
reorder.ts feat(desktop): store + lib — layout/preview/session atoms, escape-layers, keybind helpers 2026-07-13 17:57:54 -04:00
runtime-readiness.test.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
runtime-readiness.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
sanitize.test.ts feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
sanitize.ts feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
selectable-card.ts feat(desktop): floating pet, pop-out overlay + Cmd+K picker 2026-06-20 14:18:40 -05:00
session-branch-tree.test.ts feat(desktop): add shared project UI primitives 2026-06-25 16:40:27 -05:00
session-branch-tree.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
session-date-groups.test.ts feat(desktop): date dividers in the sessions sidebar 2026-07-24 10:45:34 -05:00
session-date-groups.ts feat(desktop): date dividers in the sessions sidebar 2026-07-24 10:45:34 -05:00
session-export.ts fix(desktop): route profile session reads 2026-06-11 18:09:24 -05:00
session-ids.test.ts test(desktop): cover runtime->stored notification id resolution 2026-06-19 17:50:35 +05:30
session-ids.ts fix(desktop): resume stored session id on notification click 2026-06-19 17:50:35 +05:30
session-link-title.test.ts fmt(js): npm run fix on merge (#71532) 2026-07-25 19:11:39 +00:00
session-link-title.ts feat(desktop): render agent-written @session links as chips 2026-07-24 22:52:45 -05:00
session-refs.test.ts feat(session-search): give the agent a link to hand back 2026-07-24 23:30:25 -05:00
session-refs.ts feat(session-search): give the agent a link to hand back 2026-07-24 23:30:25 -05:00
session-search.test.ts fix(desktop): match sessions by git branch in ctrl-k palette and sidebar search (#65172) 2026-07-15 15:37:12 -04:00
session-search.ts fix(desktop): match sessions by git branch in ctrl-k palette and sidebar search (#65172) 2026-07-15 15:37:12 -04:00
session-signatures.test.ts fmt(js): npm run fix on merge (#65229) 2026-07-15 21:40:56 +00:00
session-signatures.ts feat(desktop): store + lib — layout/preview/session atoms, escape-layers, keybind helpers 2026-07-13 17:57:54 -04:00
session-source.ts refactor(desktop): adopt shared utils + app-wide cleanups 2026-07-03 13:48:44 -05:00
speech-text.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
stable-array.ts refactor(desktop): DRY the computed-dedup into stableArray + freeze 2026-07-19 19:46:09 -05:00
statusbar.tsx fix(desktop): prevent timers from shifting as they count (#68131) 2026-07-20 16:39:20 +00:00
storage.test.ts fix(desktop): keep recents sorted unless manually reordered (#45404) 2026-06-13 00:38:10 -05:00
storage.ts feat(desktop): store + lib — layout/preview/session atoms, escape-layers, keybind helpers 2026-07-13 17:57:54 -04:00
summarize-command.test.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00
summarize-command.ts fix(desktop): compact tool row titles 2026-06-25 00:01:11 -05:00
svg-image.ts feat(desktop): zoomable primitive — open full, pan/zoom, copy 2026-06-26 03:40:49 -05:00
text.ts feat(desktop): Capabilities foundation — shared utils, master-detail, editors, primitives 2026-07-03 05:08:13 -05:00
time.test.ts feat(desktop): date dividers in the sessions sidebar 2026-07-24 10:45:34 -05:00
time.ts fmt(js): npm run fix on merge (#70845) 2026-07-24 16:36:59 +00:00
todos.test.ts feat(desktop): composer status stack, live subagent windows, editable prompts (#44630) 2026-06-12 08:30:06 -05:00
todos.ts feat(desktop): composer status stack, live subagent windows, editable prompts (#44630) 2026-06-12 08:30:06 -05:00
tool-result-summary.test.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
tool-result-summary.ts refactor(desktop): adopt shared utils + app-wide cleanups 2026-07-03 13:48:44 -05:00
trackpad-gestures.ts feat(desktop): Memory Graph — playable radial timeline of memories + skills 2026-06-30 00:54:21 -05:00
update-copy.test.ts fix(desktop): name the update target in the overlay; honest no-changelog copy 2026-06-08 08:58:26 -07:00
update-copy.ts fix(desktop): name the update target in the overlay; honest no-changelog copy 2026-06-08 08:58:26 -07:00
use-enter-animation.ts fix(desktop): prevent IME Enter from splitting messages and viewport resize from disarming scroll anchor (#38333) 2026-06-03 20:14:52 +00:00
use-session-slice.ts perf(desktop): stop the statusbar re-rendering per streaming token 2026-07-26 14:21:34 -05:00
utils.ts Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
voice-barge-in.ts feat(voice): desktop speech-stream sessions with barge-in capture 2026-07-22 17:47:25 -05:00
voice-playback.ts feat(voice): desktop flags interrupted submits 2026-07-22 17:53:06 -05:00
yolo-session.ts style(desktop,tui): fix all lint/type/formatting issues 2026-06-26 01:04:33 -05:00