diff --git a/src/renderer/src/components/terminal-pane/sleeping-record-park-exemption.ts b/src/renderer/src/components/terminal-pane/sleeping-record-park-exemption.ts index 78d3053a595..5d9b97174eb 100644 --- a/src/renderer/src/components/terminal-pane/sleeping-record-park-exemption.ts +++ b/src/renderer/src/components/terminal-pane/sleeping-record-park-exemption.ts @@ -5,7 +5,7 @@ import { createWorktreeRecordSelector } from '@/store/worktree-record-selector-c const EMPTY_TAB_IDS: ReadonlySet = new Set() -export type SleepingRecordParkExemptionState = { +type SleepingRecordParkExemptionState = { sleepingAgentSessionsByPaneKey?: Record | undefined } @@ -28,7 +28,6 @@ export const selectSleepingRecordParkExemptTabIds = createWorktreeRecordSelector >({ readSources: (state) => [state.sleepingAgentSessionsByPaneKey], empty: EMPTY_TAB_IDS, - isEmpty: (tabIds) => tabIds.size === 0, build: (state, worktreeId) => { const sleepingAgentSessionsByPaneKey = state.sleepingAgentSessionsByPaneKey if (!sleepingAgentSessionsByPaneKey) { diff --git a/src/renderer/src/store/worktree-record-selector-cache.ts b/src/renderer/src/store/worktree-record-selector-cache.ts index 5e3c004b729..83b054b04d7 100644 --- a/src/renderer/src/store/worktree-record-selector-cache.ts +++ b/src/renderer/src/store/worktree-record-selector-cache.ts @@ -6,6 +6,14 @@ type WorktreeRecordGeneration = { byWorktreeId: Map } +/** Why not `Object.keys`: a `Set`/`Map` value has none, so the default check + * would collapse every non-empty one onto the shared empty identity. */ +function isEmptyValue(value: object): boolean { + return value instanceof Set || value instanceof Map + ? value.size === 0 + : Object.keys(value).length === 0 +} + function sameSources(previous: readonly unknown[], next: readonly unknown[]): boolean { if (previous.length !== next.length) { return false @@ -34,8 +42,6 @@ export function createWorktreeRecordSelector(opti readSources: (state: TState) => readonly unknown[] build: (state: TState, worktreeId: string) => TValue empty: TValue - /** Override for values whose emptiness is not `Object.keys` — a Set, for instance. */ - isEmpty?: (value: TValue) => boolean }): (state: TState, worktreeId: string) => TValue { let generation: WorktreeRecordGeneration | null = null return (state, worktreeId) => { @@ -54,7 +60,7 @@ export function createWorktreeRecordSelector(opti const built = options.build(state, worktreeId) const carried = generation.carried?.get(worktreeId) let value = built - if (options.isEmpty ? options.isEmpty(built) : Object.keys(built).length === 0) { + if (isEmptyValue(built)) { value = options.empty } else if (carried && shallow(carried, built)) { value = carried