diff --git a/src/renderer/src/components/terminal-pane/deferred-split-pane-handoff.test.ts b/src/renderer/src/components/terminal-pane/deferred-split-pane-handoff.test.ts index d746b46282c..0b5afd7287e 100644 --- a/src/renderer/src/components/terminal-pane/deferred-split-pane-handoff.test.ts +++ b/src/renderer/src/components/terminal-pane/deferred-split-pane-handoff.test.ts @@ -86,6 +86,18 @@ describe('deferred split pane handoff', () => { ]) }) + it('lets a late close discard a released handoff by its stable pane key', () => { + const key = makePaneKey('tab-1', LEAF_1) + const owner = beginDeferredSplitPaneHandoff(key, Promise.resolve('/source/cwd')) + appendDeferredSplitPaneInput(owner, { data: 'must-not-replay', kind: 'ordinary' }) + + // Whole-tab cleanup releases the mount-local handle before a stale close callback can run. + releaseDeferredSplitPaneHandoff(owner) + discardDeferredSplitPaneHandoffForKey(key) + + expect(claimDeferredSplitPaneHandoff(key)).toBeNull() + }) + it('clears or discards only the current owner', () => { const clearedKey = makePaneKey('tab-clear', LEAF_1) const cleared = beginDeferredSplitPaneHandoff(clearedKey, Promise.resolve('/clear')) diff --git a/src/renderer/src/components/terminal-pane/use-terminal-pane-lifecycle.ts b/src/renderer/src/components/terminal-pane/use-terminal-pane-lifecycle.ts index b7541a6e3db..a84623d21de 100644 --- a/src/renderer/src/components/terminal-pane/use-terminal-pane-lifecycle.ts +++ b/src/renderer/src/components/terminal-pane/use-terminal-pane-lifecycle.ts @@ -1649,6 +1649,10 @@ export function useTerminalPaneLifecycle({ // whole-tab remount is allowed to retain this record. discardDeferredSplitPaneHandoff(deferredSplitHandoff) deferredSplitHandoffs.delete(paneId) + } else if (leafId) { + // A close callback can outlive its mount-local numeric handle; the + // durable leaf key still identifies the deferred split to discard. + discardDeferredSplitPaneHandoffForKey(makePaneKey(tabId, leafId)) } if (leafId && isRetiredSurface) { retireMountedTerminalPaneSurface({