fix: fence late deferred split closes

This commit is contained in:
Neil
2026-08-31 01:43:12 -07:00
parent 22d542e4af
commit 962faacec8
2 changed files with 16 additions and 0 deletions
@@ -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'))
@@ -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({