From b2f79f8f6d200c4565e005aaaac018d44d3f108e Mon Sep 17 00:00:00 2001 From: Jinwoo-H Date: Sun, 7 Jun 2026 15:56:34 -0700 Subject: [PATCH] Fix web wake respawn dedupe to only block concurrent creates. Drop the one-shot requested flag so later worktree wake clicks can respawn a terminal after the in-flight create finishes. Co-authored-by: Cursor --- .../runtime/web-runtime-wake-terminal-respawn.test.ts | 7 +++---- .../src/runtime/web-runtime-wake-terminal-respawn.ts | 11 ++--------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.test.ts b/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.test.ts index cfdf35a7501..6e55e47e66b 100644 --- a/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.test.ts +++ b/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.test.ts @@ -12,14 +12,13 @@ describe('web-runtime-wake-terminal-respawn', () => { resetWebRuntimeWakeTerminalRespawnForTests() }) - it('dedupes wake respawn requests for the same worktree', () => { + it('dedupes concurrent wake respawn requests for the same worktree', () => { expect(beginWebRuntimeWakeTerminalRespawn('wt-1')).toBe(true) expect(shouldSkipWebRuntimeWakeTerminalRespawn('wt-1')).toBe(true) expect(beginWebRuntimeWakeTerminalRespawn('wt-1')).toBe(false) endWebRuntimeWakeTerminalRespawn('wt-1') - // Why: beginWebRuntimeWakeTerminalRespawn is one request per worktree; - // endWebRuntimeWakeTerminalRespawn only clears the in-flight bit. - expect(shouldSkipWebRuntimeWakeTerminalRespawn('wt-1')).toBe(true) + expect(shouldSkipWebRuntimeWakeTerminalRespawn('wt-1')).toBe(false) + expect(beginWebRuntimeWakeTerminalRespawn('wt-1')).toBe(true) }) it('clears wake respawn tracking for a removed worktree', () => { diff --git a/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.ts b/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.ts index 9b039cd34f4..7e1dcc51020 100644 --- a/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.ts +++ b/src/renderer/src/runtime/web-runtime-wake-terminal-respawn.ts @@ -1,18 +1,13 @@ -const wakeTerminalRespawnRequestedByWorktree = new Set() const wakeTerminalRespawnInFlightByWorktree = new Set() export function shouldSkipWebRuntimeWakeTerminalRespawn(worktreeId: string): boolean { - return ( - wakeTerminalRespawnRequestedByWorktree.has(worktreeId) || - wakeTerminalRespawnInFlightByWorktree.has(worktreeId) - ) + return wakeTerminalRespawnInFlightByWorktree.has(worktreeId) } export function beginWebRuntimeWakeTerminalRespawn(worktreeId: string): boolean { - if (shouldSkipWebRuntimeWakeTerminalRespawn(worktreeId)) { + if (wakeTerminalRespawnInFlightByWorktree.has(worktreeId)) { return false } - wakeTerminalRespawnRequestedByWorktree.add(worktreeId) wakeTerminalRespawnInFlightByWorktree.add(worktreeId) return true } @@ -22,12 +17,10 @@ export function endWebRuntimeWakeTerminalRespawn(worktreeId: string): void { } export function clearWebRuntimeWakeTerminalRespawnForWorktree(worktreeId: string): void { - wakeTerminalRespawnRequestedByWorktree.delete(worktreeId) wakeTerminalRespawnInFlightByWorktree.delete(worktreeId) } export function clearAllWebRuntimeWakeTerminalRespawn(): void { - wakeTerminalRespawnRequestedByWorktree.clear() wakeTerminalRespawnInFlightByWorktree.clear() }