From e1a7559b7b95a4121ad9682ea8920ae0871f86cb Mon Sep 17 00:00:00 2001 From: Neil Date: Sat, 19 Sep 2026 01:19:33 -0700 Subject: [PATCH] perf(sidebar): cache sleeping worktree status --- .../sidebar/use-worktree-sleep-state.ts | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/renderer/src/components/sidebar/use-worktree-sleep-state.ts b/src/renderer/src/components/sidebar/use-worktree-sleep-state.ts index 0db546d8652..1fe5d72063d 100644 --- a/src/renderer/src/components/sidebar/use-worktree-sleep-state.ts +++ b/src/renderer/src/components/sidebar/use-worktree-sleep-state.ts @@ -22,7 +22,16 @@ type LiveAgentGeneration = { worktreeIds: ReadonlySet } +type SleepingWorktreeGeneration = { + tabsByWorktree: SleepStateInput['tabsByWorktree'] + ptyIdsByTabId: SleepStateInput['ptyIdsByTabId'] + browserTabsByWorktree: SleepStateInput['browserTabsByWorktree'] + worktreeIdsWithLiveAgent: ReadonlySet + sleepingByWorktree: Map +} + let liveAgentGeneration: LiveAgentGeneration | null = null +let sleepingWorktreeGeneration: SleepingWorktreeGeneration | null = null // Why cached across cards: zustand re-runs every mounted card's selector on every // store write, and the live-agent set is a whole-store scan. Keyed on the same @@ -52,6 +61,44 @@ function selectWorktreeIdsWithLiveAgent(state: SleepStateInput): ReadonlySet - isInactiveWorkspace( - worktreeId, - state.tabsByWorktree, - state.ptyIdsByTabId, - state.browserTabsByWorktree, - selectWorktreeIdsWithLiveAgent(state) - ) - ) + return useAppStore((state) => selectIsSleepingWorktree(state, worktreeId)) } export function resetWorktreeSleepStateCacheForTests(): void { liveAgentGeneration = null + sleepingWorktreeGeneration = null }