Skip to content

Evict hidden browser WebViews under memory pressure - #6585

Merged
austinywang merged 30 commits into
mainfrom
issue-6584-browser-webview-mem-eviction
Jun 22, 2026
Merged

austinywang merged 30 commits into
mainfrom
issue-6584-browser-webview-mem-eviction

Conversation

@austinywang

@austinywang austinywang commented Jun 22, 2026 •

Copy link
Copy Markdown
Contributor

Closes #6584

Summary

  • confirmed by code inspection that PaneMemoryGuardrail covers pane process trees while WKWebView web-content processes are not part of the hidden browser discard timing path
  • added a warning/critical DispatchSourceMemoryPressure hook that immediately fans out to browser panels across registered window tab managers
  • reused the existing hidden browser discard/restore path so eligible non-visible browser panes replace and release their current WKWebView, then reload on return
  • kept visible panes and existing safety blockers intact: loading/provisional navigation, downloads, media capture/playback, popups, devtools, fullscreen, visual automation, closing, and already-discarded panes are not evicted
  • avoided a hardcoded localhost/dev-server port blocklist; the mitigation is content-agnostic

Tests

  • added a test-only commit first for regression provenance
  • added focused coverage for the guardrail memory-pressure callback and hidden/visible browser WebView eviction behavior
  • not run locally per instruction; CI is the validation path

Notes

Observed: hidden browser panes only used the timer-based 5-minute discard path, while system memory pressure had no immediate browser WebView eviction route.
Expected: warning/critical OS memory pressure promptly frees eligible non-visible embedded browser WebViews without changing visible-pane behavior.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Evicts hidden browser WKWebViews on warning/critical system memory pressure while keeping visible panes intact. If a hidden timestamp isn’t recorded or we’re in the post‑wake safety window, we schedule a discard instead and honor the memory‑saver policy.

  • New Features

    • PaneMemoryGuardrail listens for .warning/.critical DispatchSourceMemoryPressure and invokes onSystemMemoryPressure on the main actor.
    • App fans the callback to all TabManager → Workspaces and calls BrowserHiddenWebViewDiscardManager.requestImmediateDiscardIfSafe("system_memory_pressure", now); a single now is forwarded and the total discard count is logged in debug.
    • Discard requires a recorded hidden time; otherwise we schedule using the same now. The post‑wake guard remains in place. Policy is read via injected policyDefaults (UserDefaults).
  • Tests

    • Added BrowserHiddenWebViewDiscardMemoryPressureTests covering immediate discard, scheduling when hidden state is missing, and post‑wake deferral with isolated UserDefaults.

Written for commit 9e3a5d2. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

Release Notes

  • New Features

    • Added OS memory pressure support to automatically discard hidden browser webviews during warning/critical memory events.
    • Includes a post-wake grace period to prevent discarding too early, and uses the same hidden-webview policy behavior as normal scheduling.
  • Tests

    • Added coverage for hidden-webview discard under system memory pressure, including immediate-discard when appropriate, no discard when not hidden, and correct scheduling behavior during the post-wake delay window.

@vercel

vercel Bot commented Jun 22, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 22, 2026 3:47pm
cmux-staging Building Building Preview, Comment Jun 22, 2026 3:47pm

@coderabbitai

coderabbitai Bot commented Jun 22, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds OS memory-pressure eviction for hidden browser WebViews. PaneMemoryGuardrail now monitors DispatchSourceMemoryPressure for warning/critical events and invokes a new onSystemMemoryPressure callback, which AppDelegate wires to a cascade through TabManager → Workspace → BrowserPanel → BrowserHiddenWebViewDiscardManager. The discard manager gains time injection (now: Date) and a Bool return from requestImmediateDiscardIfSafe, with three new unit tests covering the immediate discard, nil-hiddenAt no-op, and post-wake deferral cases.

Changes

System memory pressure hidden WebView eviction

Layer / File(s) Summary
BrowserHiddenWebViewDiscardManager: policy defaults injection and time injection
Sources/Panels/BrowserHiddenWebViewDiscardManager.swift
Initializer and policy state now use injected policyDefaults: UserDefaults; blocker and hiddenDelay computation reference this source. scheduleIfNeeded, requestImmediateDiscardIfSafe, and noteSystemDidWake gain optional now: Date parameter for testable countdown math. New isInPostWakeDiscardDelay(now:) helper encapsulates post-wake guard logic.
PaneMemoryGuardrail: OS memory pressure source and callback
Sources/PaneMemoryGuardrail.swift
Adds onSystemMemoryPressure callback property and memoryPressureSource DispatchSourceMemoryPressure field. start() calls startSystemMemoryPressureSourceIfNeeded() to create a guarded DispatchSource for .warning/.critical events on timerQueue. handleSystemMemoryPressure() dispatches the callback on the main actor with optional debug log.
Discard cascade: BrowserPanel → Workspace → TabManager → AppDelegate
Sources/Panels/BrowserPanel.swift, Sources/Workspace.swift, Sources/TabManager.swift, Sources/AppDelegate.swift, Sources/AppDelegate+PaneMemoryGuardrail.swift
BrowserPanel adds discardHiddenWebViewForSystemMemoryPressure(now:) calling requestImmediateDiscardIfSafe with reason "system_memory_pressure", and threads now through scheduleHiddenWebViewDiscardIfNeeded and noteWebViewVisibility. Workspace and TabManager iterate their children and sum discard counts. AppDelegate wires callback to discardHiddenBrowserWebViewsForSystemMemoryPressure(), aggregating across tab managers and logging in DEBUG.
Unit tests and project registration
cmuxTests/BrowserHiddenWebViewDiscardMemoryPressureTests.swift, cmux.xcodeproj/project.pbxproj
Three serialized tests cover immediate discard when hiddenAt is set, no-op/scheduling when hiddenAt is nil, and post-wake scheduling deferral. Includes test delegate recording discard counts/reasons, BlockerSnapshot factory, and UserDefaults policy toggle helper. Xcode project registers the test file in build phases.

Sequence Diagram(s)

sequenceDiagram
    rect rgba(200, 220, 255, 0.5)
        Note over OS,PaneMemoryGuardrail: OS pressure signal (timerQueue)
        participant OS as OS DispatchSource
        participant PaneMemoryGuardrail
        OS->>PaneMemoryGuardrail: .warning / .critical event
        PaneMemoryGuardrail->>PaneMemoryGuardrail: handleSystemMemoryPressure()
    end
    rect rgba(220, 255, 220, 0.5)
        Note over PaneMemoryGuardrail,BrowserHiddenWebViewDiscardManager: Eviction cascade (main actor)
        participant AppDelegate
        participant TabManager
        participant Workspace
        participant BrowserPanel
        participant BrowserHiddenWebViewDiscardManager
        PaneMemoryGuardrail->>AppDelegate: onSystemMemoryPressure()
        AppDelegate->>TabManager: discardHiddenBrowserWebViewsForSystemMemoryPressure(now)
        TabManager->>Workspace: discardHiddenBrowserWebViewsForSystemMemoryPressure(now)
        Workspace->>BrowserPanel: discardHiddenWebViewForSystemMemoryPressure(now)
        BrowserPanel->>BrowserHiddenWebViewDiscardManager: requestImmediateDiscardIfSafe(reason: "system_memory_pressure", now)
        BrowserHiddenWebViewDiscardManager-->>BrowserPanel: Bool (discarded?)
        BrowserPanel-->>Workspace: Bool
        Workspace-->>TabManager: count
        TabManager-->>AppDelegate: total count
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • manaflow-ai/cmux#5315: Directly modifies BrowserHiddenWebViewDiscardManager's scheduleIfNeeded countdown with lastSystemWakeAt/noteSystemDidWake(now:) — the same time-aware scheduling plumbing this PR extends with the now: injection parameter.
  • manaflow-ai/cmux#6508: Modifies BrowserPanel's hidden-WebView discard flow via the same BrowserHiddenWebViewDiscardManager path that this PR reuses for system memory-pressure immediate discards.
  • manaflow-ai/cmux#4245: Adds UserDefaults-backed enable+delay policy to BrowserHiddenWebViewDiscardManager that this PR directly reuses to evaluate discard readiness and compute timing thresholds.

Poem

🐇 Hop hop, memory's tight,
A pressure signal lights the night.
The guardrail stirs, the cascade flows,
Each hidden WebView quietly goes.
now: injected, tests all green —
The leanest browser ever seen! 🌿

🚥 Pre-merge checks | ✅ 22 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.63% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (22 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and specifically summarizes the main change: evicting hidden browser WebViews in response to system memory pressure, which is the primary objective of this PR.
Linked Issues check ✅ Passed The PR successfully implements the primary objective from #6584: adding a DispatchSourceMemoryPressure hook that immediately evicts non-visible browser WebViews on warning/critical pressure, bypassing the 5-minute delay, while preserving visible panes and safety blockers.
Out of Scope Changes check ✅ Passed All changes directly support the memory-pressure eviction objective: PaneMemoryGuardrail monitoring, fanout to TabManager/Workspace/BrowserPanel, injecting 'now' timestamps for testability, and comprehensive test coverage—no out-of-scope changes detected.
Cmux Swift Actor Isolation ✅ Passed All production code changes maintain proper Swift 6 actor isolation. New methods in @MainActor classes (AppDelegate, TabManager, Workspace, BrowserPanel) implicitly inherit @MainActor. The memory p...
Cmux Swift Blocking Runtime ✅ Passed PR introduces non-blocking DispatchSourceMemoryPressure notifications with async Task dispatch; adds no semaphores, locks, sleeps, or synchronous patterns; date parameters are deterministic test sc...
Cmux Expensive Synchronous Load ✅ Passed PR adds system memory pressure handling that only invokes lightweight operations (boolean checks, date comparisons, UI hierarchy iteration) to trigger existing WebView discard mechanism. No agent h...
Cmux Cache Substitution Correctness ✅ Passed PR uses fresh UserDefaults reads for all policy decisions; cached policyState is unused and never substitutes for authoritative values in persistence/snapshot paths.
Cmux No Hacky Sleeps ✅ Passed Check scope is TypeScript/JavaScript/shell/non-Swift build scripts; all PR changes are Swift code (covered by swift-blocking-runtime) or build config (.pbxproj).
Cmux Algorithmic Complexity ✅ Passed The PR reuses the existing nested iteration pattern from paneMemoryGuardrailDescriptors (called every 4 seconds) but in a much colder path: memory pressure events (infrequent OS signals), not conti...
Cmux Swift Concurrency ✅ Passed All Task patterns in the PR are properly placed at OS/AppKit API boundaries (DispatchSourceMemoryPressure, DispatchSourceTimer, NotificationCenter callbacks) to cross into MainActor isolation—exact...
Cmux Swift @Concurrent ✅ Passed All Swift changes properly handle actor isolation: synchronous methods inherited from @MainActor classes, no async/await without proper isolation, and DispatchSourceMemoryPressure correctly hops to...
Cmux Swift File And Package Boundaries ✅ Passed All PR changes comply with Swift file and package boundary rules: new 67-line coordination file, <25 lines added to each large file, coherent responsibilities, test code allowed, appropriate app-ta...
Cmux Swiftpm Lockfiles ✅ Passed PR modifies only Swift source files and Xcode project test registration; no Package.swift, .gitignore, or SwiftPM package-reference changes, so SwiftPM lockfile rules do not apply.
Cmux Swift Logging ✅ Passed PR adds only debug-only logging guarded by #if DEBUG in AppDelegate+PaneMemoryGuardrail.swift and PaneMemoryGuardrail.swift; no secrets or personal data exposed; all production code changes contain...
Cmux User-Facing Error Privacy ✅ Passed No user-facing error messages, alerts, or sensitive information exposed in PR changes. All debug logs are guarded by #if DEBUG and won't appear in Release builds.
Cmux Full Internationalization ✅ Passed No user-facing text introduced: all new code contains only debug-only logs (wrapped in #if DEBUG), internal parameter strings ('system_memory_pressure'), and method names; no string catalog modific...
Cmux Swiftui State Layout ✅ Passed PR adds only methods and configuration logic; no new SwiftUI state violations. PaneMemoryGuardrail uses modern @Observable correctly with @ObservationIgnored callback. Existing ObservableObject cla...
Cmux Architecture Rethink ✅ Passed PR implements memory-pressure eviction by reusing existing BrowserHiddenWebViewDiscardManager architecture: required DispatchSourceMemoryPressure bridge with simple callback delegation, no new timi...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds no standalone cmux-owned windows. Changes are memory-management methods, dispatch source handler for system memory pressure, and test fixtures—none require window identifier registration.
Cmux Source Artifacts ✅ Passed All 9 changed files are intentional source code, tests, or required build configs. No local tool output, generated logs, temp folders, caches, build artifacts, or scratch directories were added to...
Cmux No Test Or Debug Seam In Production Source ✅ Passed No test or debug seams found in production source code. All #if DEBUG blocks gate cmuxDebugLog calls; all new methods use legitimate production names; the now: Date parameter enables timestamp-base...
Description check ✅ Passed The PR description covers all required template sections: clear summary of what changed and why, explanation of testing approach, appropriate checklists completed, and automated bot summaries included.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-6584-browser-webview-mem-eviction

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps

greptile-apps Bot commented Jun 22, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds OS memory pressure eviction for hidden browser WKWebViews by wiring a DispatchSourceMemoryPressure (.warning/.critical) in PaneMemoryGuardrail through a new onSystemMemoryPressure callback that fans out to every TabManager → Workspace → BrowserPanel and calls the existing hidden-discard path via a new requestImmediateDiscardIfSafe entry point. The implementation reuses all existing safety blockers (visible, loading, download, media, devtools, fullscreen, etc.) and the post-wake crash guard.

  • PaneMemoryGuardrail installs a DispatchSourceMemoryPressure source (same timerQueue + Task { @MainActor } hop pattern as the existing poll timer) and exposes a new onSystemMemoryPressure: (@MainActor () -> Void)? callback.
  • BrowserHiddenWebViewDiscardManager gains requestImmediateDiscardIfSafe(reason:now:) that bypasses the hidden-duration countdown but still respects blockers and the post-wake crash window; policyDefaults injection makes the new tests hermetic.
  • A new BrowserHiddenWebViewDiscardMemoryPressureTests suite covers immediate discard, no-hidden-at deferral, and post-wake deferral without touching any production APIs beyond @testable import.

Confidence Score: 5/5

Safe to merge; the memory-pressure path reuses all existing discard safety blockers and the post-wake crash guard, so no visible pane or pane in a fragile state is at risk.

The implementation follows established patterns (same DispatchSource + Task @mainactor hop as the poll timer, same blockers checklist, same post-wake guard), threads a single now timestamp through the entire fan-out, and the new requestImmediateDiscardIfSafe entry point is gated by all existing safety blockers including already_discarded and isSystemSleeping which prevents both double-discard and discard-during-sleep.

No files require special attention.

Important Files Changed

Filename Overview
Sources/PaneMemoryGuardrail.swift Adds a DispatchSourceMemoryPressure source using the same timerQueue + Task @mainactor hop pattern as the existing poll timer; handler is private, no test seams introduced.
Sources/Panels/BrowserHiddenWebViewDiscardManager.swift Adds requestImmediateDiscardIfSafe and isInPostWakeDiscardDelay; injects policyDefaults for test isolation; threads now: Date through scheduleIfNeeded consistently.
Sources/AppDelegate+PaneMemoryGuardrail.swift Adds discardHiddenBrowserWebViewsForSystemMemoryPressure() capturing a single now for the full fan-out; debug log behind #if DEBUG.
Sources/AppDelegate.swift Three-line wiring of onSystemMemoryPressure callback on the guardrail instance; correct weak-self capture.
Sources/Panels/BrowserPanel.swift Adds discardHiddenWebViewForSystemMemoryPressure delegating to the manager; now: threaded through scheduleHiddenWebViewDiscardIfNeeded.
Sources/Workspace.swift Iterates panels.values with compactMap to BrowserPanel and fans out; O(n) over a small fixed panel set, no algorithmic concern.
Sources/TabManager.swift Adds discardHiddenBrowserWebViewsForSystemMemoryPressure delegating to each workspace; clean reduce pattern.
cmuxTests/BrowserHiddenWebViewDiscardMemoryPressureTests.swift Covers immediate discard, no-hidden-at scheduling deferral, and post-wake deferral; uses injected UserDefaults suite, @testable import only, no production seams.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant OS as macOS Kernel
    participant Src as DispatchSourceMemoryPressure
    participant MA as MainActor Task
    participant PMG as PaneMemoryGuardrail
    participant AD as AppDelegate
    participant TM as TabManager
    participant WS as Workspace
    participant BP as BrowserPanel
    participant MGR as BrowserHiddenWebViewDiscardManager

    OS->>Src: .warning / .critical event
    Src->>MA: "Task @MainActor (weak self)"
    MA->>PMG: handleSystemMemoryPressure()
    PMG->>AD: onSystemMemoryPressure()
    AD->>AD: "let now = Date()"
    loop each TabManager
        AD->>TM: discardHiddenBrowserWebViewsForSystemMemoryPressure(now:)
        loop each Workspace
            TM->>WS: discardHiddenBrowserWebViewsForSystemMemoryPressure(now:)
            loop each BrowserPanel
                WS->>BP: discardHiddenWebViewForSystemMemoryPressure(now:)
                BP->>MGR: requestImmediateDiscardIfSafe(reason:now:)
                alt blockers empty AND hiddenAt set AND not in post-wake window
                    MGR-->>BP: true - discard immediately
                else hiddenAt nil OR in post-wake window
                    MGR->>MGR: scheduleIfNeeded(reason:now:)
                    MGR-->>BP: false - scheduled
                else blockers present
                    MGR-->>BP: false - skipped
                end
            end
        end
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant OS as macOS Kernel
    participant Src as DispatchSourceMemoryPressure
    participant MA as MainActor Task
    participant PMG as PaneMemoryGuardrail
    participant AD as AppDelegate
    participant TM as TabManager
    participant WS as Workspace
    participant BP as BrowserPanel
    participant MGR as BrowserHiddenWebViewDiscardManager

    OS->>Src: .warning / .critical event
    Src->>MA: "Task @MainActor (weak self)"
    MA->>PMG: handleSystemMemoryPressure()
    PMG->>AD: onSystemMemoryPressure()
    AD->>AD: "let now = Date()"
    loop each TabManager
        AD->>TM: discardHiddenBrowserWebViewsForSystemMemoryPressure(now:)
        loop each Workspace
            TM->>WS: discardHiddenBrowserWebViewsForSystemMemoryPressure(now:)
            loop each BrowserPanel
                WS->>BP: discardHiddenWebViewForSystemMemoryPressure(now:)
                BP->>MGR: requestImmediateDiscardIfSafe(reason:now:)
                alt blockers empty AND hiddenAt set AND not in post-wake window
                    MGR-->>BP: true - discard immediately
                else hiddenAt nil OR in post-wake window
                    MGR->>MGR: scheduleIfNeeded(reason:now:)
                    MGR-->>BP: false - scheduled
                else blockers present
                    MGR-->>BP: false - skipped
                end
            end
        end
    end
Loading

Reviews (23): Last reviewed commit: "Merge origin/main into browser memory ev..." | Re-trigger Greptile

Comment thread Sources/PaneMemoryGuardrail.swift Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cmuxTests/BrowserHiddenWebViewDiscardMemoryPressureTests.swift`:
- Around line 74-86: The withMemoryPressureHiddenWebViewDiscardPolicyEnabled
method only snapshots and restores the enabledKey from UserDefaults, but it does
not handle hiddenDelayKey. This allows hiddenDelayKey state from other tests to
leak into this test, making hasScheduledDiscard flaky. Add snapshot-and-restore
logic for BrowserHiddenWebViewDiscardPolicy.hiddenDelayKey in addition to
enabledKey by capturing its previous value before calling body() and then either
restoring it or removing it in the defer block, following the same pattern
already used for enabledKey.

In `@cmuxTests/GhosttyConfigTests.swift`:
- Around line 2166-2188: The test
testSystemMemoryPressureDoesNotDiscardVisibleWebView is passing vacuously
because it does not explicitly enable the discard policy before testing that
visibility blocks the discard behavior. Before calling
discardHiddenWebViewForSystemMemoryPressure, explicitly set the policy state to
ensure the test exercises the intended "visible blocks discard" path rather than
passing simply because the policy is disabled by default. Avoid relying on
shared or global UserDefaults state; instead, configure the discard policy state
directly on the panel or through the appropriate configuration mechanism before
invoking the discard method.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0b0aaf9b-3a56-43f4-b4d0-b457c6912753

📥 Commits

Reviewing files that changed from the base of the PR and between f9b66da and 6f8f7b8.

⛔ Files ignored due to path filters (1)
  • .github/swift-file-length-budget.tsv is excluded by !**/*.tsv
📒 Files selected for processing (10)
  • Sources/AppDelegate+PaneMemoryGuardrail.swift
  • Sources/AppDelegate.swift
  • Sources/PaneMemoryGuardrail.swift
  • Sources/Panels/BrowserHiddenWebViewDiscardManager.swift
  • Sources/Panels/BrowserPanel.swift
  • Sources/TabManager.swift
  • Sources/Workspace.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/BrowserHiddenWebViewDiscardMemoryPressureTests.swift
  • cmuxTests/GhosttyConfigTests.swift

Comment thread cmuxTests/BrowserHiddenWebViewDiscardMemoryPressureTests.swift Outdated
Comment thread cmuxTests/GhosttyConfigTests.swift Outdated
…bview-mem-eviction

# Conflicts:
#	.github/swift-file-length-budget.tsv

This branch was successfully deployed

1 active deployment
Preview – cmux — 9e3a5d26 Deployed Jun 22, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant