diff --git a/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.test.ts b/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.test.ts index 7b9b329ac41..baf739fe947 100644 --- a/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.test.ts +++ b/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.test.ts @@ -1,9 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import type { BrowserWorkspace } from '../../../../../shared/browser-workspace-types' -import { - browserTabsVetoGuestEviction, - selectBrowserGuestEvictionWorktreeIds -} from './browser-guest-worktree-retention' +import { browserTabsVetoGuestEviction } from './browser-guest-eviction-veto' +import { selectBrowserGuestEvictionWorktreeIds } from './browser-guest-worktree-retention' import { hydrateBrowserDrivers } from '../../../lib/pane-manager/browser-mobile-driver-state' import { hydrateBrowserRemoteViewerPages } from '../../../lib/pane-manager/browser-remote-viewer-state' import { diff --git a/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.ts b/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.ts new file mode 100644 index 00000000000..4f71c875d61 --- /dev/null +++ b/src/renderer/src/components/browser-pane/host-guest/browser-guest-eviction-veto.ts @@ -0,0 +1,14 @@ +import type { BrowserWorkspace } from '../../../../../shared/browser-workspace-types' +import { browserTabVisibilityPageIds } from './browser-guest-worktree-retention' +import { hasActiveBrowserPageDownload } from '../navigate/browser-page-download-activity' +import { browserPageNeedsPaintRetention } from './browser-guest-paint-retention' + +// Why eviction needs more than the paint terms: eviction DESTROYS the guest rather than parking +// it, and main cancels a page's active downloads when its guest unregisters (tab-close semantics). +export function browserTabsVetoGuestEviction(tabs: readonly BrowserWorkspace[]): boolean { + return tabs.some((tab) => + browserTabVisibilityPageIds(tab).some( + (pageId) => browserPageNeedsPaintRetention(pageId) || hasActiveBrowserPageDownload(pageId) + ) + ) +} diff --git a/src/renderer/src/components/browser-pane/host-guest/browser-guest-worktree-retention.ts b/src/renderer/src/components/browser-pane/host-guest/browser-guest-worktree-retention.ts index 00400670308..ca0d0b56dcd 100644 --- a/src/renderer/src/components/browser-pane/host-guest/browser-guest-worktree-retention.ts +++ b/src/renderer/src/components/browser-pane/host-guest/browser-guest-worktree-retention.ts @@ -1,6 +1,4 @@ import type { BrowserPage, BrowserWorkspace } from '../../../../../shared/browser-workspace-types' -import { hasActiveBrowserPageDownload } from '../navigate/browser-page-download-activity' -import { browserPageNeedsPaintRetention } from './browser-guest-paint-retention' // Why 4: every hidden worktree that retains browser guests keeps one Electron // guest process per page alive purely for instant revisits, so guest memory @@ -70,16 +68,6 @@ export function worktreeHoldsLiveBrowserGuests( }) } -// Why eviction needs more than the paint terms: eviction DESTROYS the guest rather than parking -// it, and main cancels a page's active downloads when its guest unregisters (tab-close semantics). -export function browserTabsVetoGuestEviction(tabs: readonly BrowserWorkspace[]): boolean { - return tabs.some((tab) => - browserTabVisibilityPageIds(tab).some( - (pageId) => browserPageNeedsPaintRetention(pageId) || hasActiveBrowserPageDownload(pageId) - ) - ) -} - // Mirrors BrowserOverlaySlot's page-id derivation so visibility pinning // (automation-visible / mobile-driven) protects exactly the slots it paints. export function browserTabVisibilityPageIds(tab: BrowserWorkspace): readonly string[] { diff --git a/src/renderer/src/components/use-terminal-browser-retention.ts b/src/renderer/src/components/use-terminal-browser-retention.ts index 34d3b0e1a80..1cc2e8d6740 100644 --- a/src/renderer/src/components/use-terminal-browser-retention.ts +++ b/src/renderer/src/components/use-terminal-browser-retention.ts @@ -1,8 +1,8 @@ import { useEffect } from 'react' import { useAppStore } from '../store' import { onBrowserGuestPaintRetentionChange } from './browser-pane/host-guest/browser-guest-paint-retention' +import { browserTabsVetoGuestEviction } from './browser-pane/host-guest/browser-guest-eviction-veto' import { - browserTabsVetoGuestEviction, selectBrowserGuestEvictionWorktreeIds, touchBrowserGuestWorktreeRecency, worktreeHoldsLiveBrowserGuests