Skip to content

Fix wedged browser automation recovery - #8094

Merged
austinywang merged 28 commits into
mainfrom
issue-8054-browser-prehydration-hang
Jul 15, 2026
Merged

austinywang merged 28 commits into
mainfrom
issue-8054-browser-prehydration-hang

Conversation

@austinywang

@austinywang austinywang commented Jul 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • add a @MainActor browser-automation watchdog that probes the same WebKit callback channel after an operation deadline and only replaces the exact unresponsive WKWebView instance
  • reuse BrowserPanel's existing state-preserving WebView replacement path so URL, navigation history, profile/data store, zoom, render state, and developer-tools intent remain under one lifecycle owner
  • distinguish screenshot deadline expiry from ordinary capture errors, and give cmux browser screenshot enough socket response headroom to return the recovery diagnosis instead of timing out first

Root cause

cmux recovered a WebKit process only when webViewWebContentProcessDidTerminate fired. WebKit can instead stop completing JavaScript/snapshot callbacks without delivering that termination signal, leaving automation requests to hit their socket deadlines forever while the surface remains installed. The screenshot command's 15-second client deadline also raced the app's 15-second capture deadline, which is why the reporter saw exit 124 before cmux could classify the failure.

Tests

  • commit 1 (2d86a5409f) adds the deterministic failing watchdog regression tests
  • commit 2 (087d82f2b8) implements the watchdog and recovery path
  • arch -arm64 swift test in Packages/macOS/CmuxBrowser: 144 tests across 22 suites passed
  • project normalization, pbxproj check, package-resolution policy, workspace package grouping, localization catalog parsing, and diff checks passed
  • all touched tracked Swift files remain within their existing file-length budgets; the repository-wide local budget command currently reports unrelated pre-existing overages in five untouched files

The exact multi-hour WebKit wedge is nondeterministic and is not simulated. Coverage deterministically verifies that a live callback preserves the current process, a missing callback recovers exactly once, and a WebView superseded during probing is not replaced again.

Localization

The three new user-facing recovery/timeout messages are present and non-empty in every locale currently in Localizable.xcstrings (20 locales, including English and Japanese).

Closes #8054

Issue: #8054


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


Summary by cubic

Recover wedged browser automation by probing WebKit liveness and replacing only the stuck WKWebView. Fixes #8054 with guards so we don’t resurrect closed panels or interrupt active visual capture; recovery is clear, pending prompts stay intact, and omnibar drafts are scoped per panel.

  • Bug Fixes
    • Added a @MainActor watchdog that races JS and screenshot liveness against a deadline with outcomes: responsive/recovered/superseded/cancelled; concurrent probes share one result.
    • Preserved automation state across replacement: reattach init/style WKUserScripts, keep page‑world hooks stable, and wait for the first document commit before resuming.
    • Respected user state: skip replacement when insecure‑HTTP consent or alerts are pending; never resurrect closed or superseded views; pause if a visual capture is active.
    • Clarified timeouts: distinguish automation timeouts from JS/capture errors; screenshot returns automationTimedOut; Terminal reports recovery; CLI headroom is 30s post‑action and 20s otherwise.
    • Isolated omnibar drafts by panel and added focused CI gates for browser recovery and panel identity regressions.

Written for commit b39ad9d. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added an automation liveness watchdog for JavaScript and screenshot readiness with automatic recovery and structured outcomes (including timed out, recovered, and superseded).
    • Added “first document commit” readiness tracking to improve coordination during web-view transitions.
    • Persist automation init/style scripts across web-view replacements; added automation-specific screenshot timeout error reporting.
  • Bug Fixes

    • Improved timeout headroom and explicitly handled automation timeouts end-to-end.
    • Prevented duplicate completion and reduced incorrect/duplicate recovery via web-view identity checks; improved page-world JS handling.
  • Tests

    • Added coverage for watchdog behavior and document-readiness state transitions, including concurrency and cancellation.

@vercel

vercel Bot commented Jul 14, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
cmux Canceled Canceled Jul 15, 2026 5:55am
cmux-staging Building Building Preview, Comment Jul 15, 2026 5:55am

@coderabbitai

coderabbitai Bot commented Jul 14, 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

Browser automation now tracks WebView readiness, probes callback liveness, recovers stalled surfaces, distinguishes JavaScript and screenshot timeouts, preserves automation scripts across replacements, and applies expanded CLI request timeouts.

Changes

Browser automation recovery

Layer / File(s) Summary
Watchdog and document readiness
Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/*, Packages/macOS/CmuxBrowser/Tests/CmuxBrowserTests/Control/*
Defines instance-bound readiness and recovery outcomes, coordinates cancellable probe races, and tests coalescing, cancellation, and supersession.
BrowserPanel probing and WebView replacement
Sources/Panels/BrowserAutomation*, Sources/Panels/BrowserPanel*
Adds guarded JavaScript and screenshot probes, preserves registered scripts across replacements, and prevents duplicate snapshot completion.
TerminalController automation flow
Sources/TerminalController*
Adds explicit evaluation outcomes, instance-specific document readiness, liveness-aware screenshot and JavaScript recovery, and BrowserPanel-owned script registration.
Timeout reporting, CLI timing, and project wiring
Resources/Localizable.xcstrings, CLI/cmux.swift, cmux.xcodeproj/project.pbxproj
Adds localized timeout and recovery messages, centralizes browser request timeouts, and registers new sources in the Xcode project.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • manaflow-ai/cmux#4244: Intersects with BrowserPanel hidden-WebView replacement and automation script preservation.

Suggested reviewers: lawrencecchen, azooz2003-bit


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (3 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Actor Isolation ❌ Error New pure value outcome enums used from nonisolated TerminalController code lack nonisolated, adding Swift 6 MainActor coupling. Mark the new outcome/result enums nonisolated (at least BrowserAutomationDocumentReadinessOutcome and BrowserAutomationRecoveryOutcome) so background callers stay actor-neutral.
Cmux Swift Blocking Runtime ❌ Error New production code adds a ContinuousClock.sleep deadline in BrowserAutomationWatchdog and a 2.5s socketAwaitCallback wait in TerminalController+BrowserAutomationRecovery. Replace the sleep/semaphore-based deadline with an explicit async completion or timer-owned signal, and keep any blocking wait/test seam out of production code.
Cmux No Test Or Debug Seam In Production Source ❌ Error BrowserAutomationDocumentReadiness.swift adds init(onWaiterRegistered:), a test-only seam in production Sources with no non-test caller; tests use it via @testable import. Move the waiter-registration observation into the test target or a dedicated debug file, and keep the production type exposing only the real initializer/API.
Docstring Coverage ⚠️ Warning Docstring coverage is 10.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (21 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes implement auto-detection and recovery for wedged browser surfaces and screenshot timeout handling for #8054.
Out of Scope Changes check ✅ Passed The added files and edits are all in service of browser automation recovery, readiness, screenshots, tests, and localization.
Cmux Browser Automation Off-Main ✅ Passed Wait-heavy browser commands stay in socketWorkerMethods with policy tests, and the new recovery helpers use explicit main hops; direct focus/show commands remain main-actor routed.
Cmux Expensive Synchronous Load ✅ Passed No agent-history load APIs were added or moved in the touched files; the PR is browser-automation recovery code, and the existing Workspace load still prefers SharedLiveAgentIndex cache.
Cmux Cache Substitution Correctness ✅ Passed No persistence/history/undo/snapshot cache swap found; the new readiness state is event-driven, instance-scoped, and cold/stale guarded.
Cmux No Hacky Sleeps ✅ Passed No changed TS/JS/shell/non-Swift runtime files introduce sleeps or polling; only a localization catalog changed outside the rule scope.
Cmux Algorithmic Complexity ✅ Passed No nested rescans or hot repeated sorts; the new loops are over a fixed 3-probe set or bounded 50-file pruning, and the script replay is a single linear pass.
Cmux Swift Concurrency ✅ Passed No new legacy async patterns were introduced; added code uses async/await, AsyncStream, and TaskGroup, with callback bridges only at WebKit/socket/XCTest boundaries.
Cmux Swift @Concurrent ✅ Passed New async work is UI-bound (@MainActor) or explicitly hops to main (v2MainSync/Task { @mainactor }); no new @concurrent misuse or missing @concurrent on nonisolated async work.
Cmux Swift File And Package Boundaries ✅ Passed PASS: the independent watchdog/readiness logic lives in the CmuxBrowser package; app-target edits are small glue, and no production Swift file was newly oversized or grew >250 lines.
Cmux Swiftpm Lockfiles ✅ Passed cmux.xcodeproj/project.pbxproj only adds file refs/build files; no packageReferences or Package.resolved changes appear, so the lockfile rule isn’t violated.
Cmux Swift Logging ✅ Passed No added or changed runtime logging appears in the touched production Swift hunks; the diff only adjusts browser-automation logic, with CLI/test prints allowed.
Cmux User-Facing Error Privacy ✅ Passed The new browser automation and screenshot copy is generic and does not reveal vendor, provider, token, manifest, or raw upstream details.
Cmux Full Internationalization ✅ Passed All new user-facing Swift strings use localized APIs, and the added xcstrings keys are translated for all 20 supported locales.
Cmux Swiftui State Layout ✅ Passed PASS: The PR only adds recovery helpers and non-SwiftUI model state; no new @Observable/@StateObject, GeometryReader, lazy/list row store refs, or render-time state writes were introduced.
Cmux Architecture Rethink ✅ Passed Owner-bound recovery with exact-instance guards and explicit outcomes; the bounded deadlines are liveness bridges, not polling or split lifecycle ownership.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed No touched file adds or materially changes a standalone NSWindow/NSPanel/NSWindowController/WindowGroup, and no cmux.* identifier or close-shortcut routing changed.
Cmux Source Artifacts ✅ Passed All changed paths are intentional source/config/test/localization files; no logs, screenshots, temp dirs, build output, caches, or artifact folders appear in the PR diff.
Cmux No Ambient Global State ✅ Passed New browser automation state lives on constructable @MainActor owners; added helpers are extension methods/local closures, with no new file-scope mutable globals or singleton state.
Title check ✅ Passed The title is concise and accurately summarizes the main change: recovery for wedged browser automation.
Description check ✅ Passed The description covers summary, root cause, tests, and localization, but omits the demo video, review trigger, and checklist sections.
✨ 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-8054-browser-prehydration-hang

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.

@greptile-apps

greptile-apps Bot commented Jul 14, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds recovery for wedged browser automation. The main changes are:

  • A MainActor watchdog for JavaScript and screenshot callback liveness.
  • WebView replacement through the existing BrowserPanel lifecycle path.
  • Typed automation timeout results instead of matching error text.
  • Document readiness tracking before browser automation runs.
  • Longer CLI socket headroom for browser automation replies.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
Sources/TerminalController+BrowserAutomationRecovery.swift Adds shared timeout recovery handling for JavaScript and screenshot automation.
Sources/TerminalController.swift Routes browser automation through document readiness and typed timeout recovery.
Sources/Panels/BrowserPanel+AutomationRecovery.swift Adds identity-guarded WebView recovery and liveness probes.
Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationWatchdog.swift Introduces the reusable callback watchdog used by the app recovery path.
cmux.xcodeproj/project.pbxproj Wires the new app sources and focused browser regression tests.

Reviews (17): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread Sources/TerminalController+BrowserAutomationRecovery.swift
Comment thread Sources/TerminalController+BrowserAutomationRecovery.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: 4

🤖 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 `@Sources/Panels/BrowserAutomationSnapshotResult.swift`:
- Around line 3-7: Update the BrowserAutomationSnapshotResult enum declaration
to explicitly conform to Sendable, preserving its existing cases and payload
types.

In `@Sources/Panels/BrowserPanel.swift`:
- Around line 7115-7116: Guard the pending preparation callbacks with didFinish
before starting work: in Sources/Panels/BrowserPanel.swift lines 7115-7116,
check didFinish before invoking operation(captureWebView, false, finish);
likewise in Sources/Panels/BrowserScreenshotSnapshotter.swift lines 340-341,
check didFinish before invoking operation(finish). Preserve the existing timeout
completion behavior while preventing callbacks from launching captures after
completion.

In `@Sources/TerminalController`+BrowserAutomationRecovery.swift:
- Around line 57-80: The recovery Task created inside socketAwaitCallback must
be tied to the socket wait’s cancellation lifecycle so it cannot continue after
the 2.5-second timeout. Update the surrounding recovery operation to retain and
cancel the Task when socketAwaitCallback times out, or use a structured worker
whose cancellation propagates to the watchdog, while preserving the existing
finish(result) behavior.
- Around line 34-49: Update V2JavaScriptResult to expose a typed
JavaScript-timeout outcome, then change v2RecoverTimedOutBrowserJavaScript to
pattern-match that structured case instead of comparing message text. Preserve
the existing recovery return for timeout results and return all other result
cases unchanged.
🪄 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: c2e73bd9-9d9b-43ca-b5a7-00fb9b2ad51d

📥 Commits

Reviewing files that changed from the base of the PR and between b041531 and 087d82f.

📒 Files selected for processing (14)
  • CLI/cmux.swift
  • Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationRecoveryOutcome.swift
  • Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationWatchdog.swift
  • Packages/macOS/CmuxBrowser/Tests/CmuxBrowserTests/Control/BrowserAutomationWatchdogTests.swift
  • Resources/Localizable.xcstrings
  • Sources/Panels/BrowserAutomationProbeChannel.swift
  • Sources/Panels/BrowserAutomationSnapshotResult.swift
  • Sources/Panels/BrowserPanel+AutomationRecovery.swift
  • Sources/Panels/BrowserPanel.swift
  • Sources/Panels/BrowserScreenshotPipeline.swift
  • Sources/Panels/BrowserScreenshotSnapshotter.swift
  • Sources/TerminalController+BrowserAutomationRecovery.swift
  • Sources/TerminalController.swift
  • cmux.xcodeproj/project.pbxproj

Comment thread Sources/Panels/BrowserAutomationSnapshotResult.swift Outdated
Comment thread Sources/Panels/BrowserPanel.swift
Comment thread Sources/TerminalController+BrowserAutomationRecovery.swift
Comment thread Sources/TerminalController+BrowserAutomationRecovery.swift
@austinywang

Copy link
Copy Markdown
Contributor Author

Review follow-up for the earlier CodeRabbit pre-merge summary on the watchdog timing shape:

  • The unowned recovery Task finding is fixed in e29cafb: the socket worker retains the task and cancels it when the outer callback wait expires, and cancellation propagates through the watchdog task group before recovery.
  • The remaining semaphore warning refers to the pre-existing, documented socketAwaitCallback bridge. It runs only on the socket worker (never MainActor) because the v2 RPC handler is synchronous; this PR does not add a main-thread blocking path.
  • The injected ContinuousClock.sleep is a bounded, cancellable one-shot liveness deadline, not polling or UI-settling. That is the explicit deadline carve-out in skills/cmux-architecture/references/concurrency-carveouts.md; real WebKit callbacks still decide responsiveness, and the deadline only detects a missing callback.

The concrete typed-timeout, late-callback, callback-channel, state-preservation, and task-lifecycle findings are all fixed on current HEAD cf69bd1.

@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
`@Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationWatchdog.swift`:
- Around line 48-72: Add a focused watchdog test covering two different
observedInstanceID values racing through recoverIfUnresponsive. Block the first
performRecovery/recover call, start the second instance, assert the old
instance’s followers resolve with .superseded and verify the old leader’s
recover invocation behavior, then release the race and assert both calls
complete with the expected outcomes. Anchor the test to recoverIfUnresponsive
and the existing watchdog test utilities.

In `@Sources/TerminalController`+BrowserAutomationRecovery.swift:
- Around line 44-50: Update the .timedOut branch in
v2BrowserAutomationMessageAfterLivenessCheck to construct the JavaScript-timeout
message with String(localized:defaultValue:) rather than a bare literal,
matching the sibling messages. Add the corresponding localization key and
translations for all 20 supported locales in Localizable.xcstrings.
🪄 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: 1e838b70-36b4-48a3-b096-8e74acac01a9

📥 Commits

Reviewing files that changed from the base of the PR and between 087d82f and ea1ec4b.

📒 Files selected for processing (14)
  • CLI/cmux.swift
  • Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationProbeSignal.swift
  • Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationWatchdog.swift
  • Packages/macOS/CmuxBrowser/Tests/CmuxBrowserTests/Control/BrowserAutomationWatchdogTests.swift
  • Resources/Localizable.xcstrings
  • Sources/Panels/BrowserAutomationProbeChannel.swift
  • Sources/Panels/BrowserAutomationSnapshotResult.swift
  • Sources/Panels/BrowserJavaScriptEvaluationResult.swift
  • Sources/Panels/BrowserPanel+AutomationRecovery.swift
  • Sources/Panels/BrowserPanel.swift
  • Sources/Panels/BrowserScreenshotSnapshotter.swift
  • Sources/TerminalController+BrowserAutomationRecovery.swift
  • Sources/TerminalController.swift
  • cmux.xcodeproj/project.pbxproj
💤 Files with no reviewable changes (1)
  • Resources/Localizable.xcstrings
👮 Files not reviewed due to content moderation or server errors (2)
  • Sources/TerminalController.swift
  • CLI/cmux.swift

Comment thread Sources/TerminalController+BrowserAutomationRecovery.swift

@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: 1

🤖 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
`@Packages/macOS/CmuxBrowser/Tests/CmuxBrowserTests/Control/BrowserAutomationWatchdogTests.swift`:
- Around line 247-258: Update the test around firstFollower and the subsequent
recovery attempt to await an explicit signal that firstFollower has joined the
in-flight recovery, rather than using Task.yield() or scheduler timing. Add or
reuse a synchronization mechanism exposed by the watchdog/coalescing flow, and
only start the superseding recovery after that signal so the later wait cannot
hang.
🪄 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: df8b038d-240a-4279-b134-536966afc802

📥 Commits

Reviewing files that changed from the base of the PR and between ea1ec4b and 7824157.

📒 Files selected for processing (3)
  • Packages/macOS/CmuxBrowser/Tests/CmuxBrowserTests/Control/BrowserAutomationWatchdogTests.swift
  • Resources/Localizable.xcstrings
  • Sources/TerminalController+BrowserAutomationRecovery.swift

@cursor

cursor Bot commented Jul 15, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@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
`@Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationDocumentReadiness.swift`:
- Around line 20-23: Remove the production-only init(onWaiterRegistered:) seam
from BrowserAutomationDocumentReadiness and update cancellationReleasesWaiter to
observe registration through `@testable` import by widening the necessary internal
state or behavior from private. If a callback remains unavoidable, move it into
a dedicated test-support extension/file rather than the main production type.

In
`@Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationDocumentReadinessOutcome.swift`:
- Around line 2-11: Mark the pure value enum
BrowserAutomationDocumentReadinessOutcome as nonisolated while preserving its
existing Sendable and Equatable conformances and cases, so it can be consumed
from both actor-isolated and nonisolated code.
🪄 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: d9b1220e-d52f-4a9b-8c87-ada4b88a8d08

📥 Commits

Reviewing files that changed from the base of the PR and between f3f1f52 and 8307d58.

📒 Files selected for processing (8)
  • CLI/cmux.swift
  • Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationDocumentReadiness.swift
  • Packages/macOS/CmuxBrowser/Sources/CmuxBrowser/Control/BrowserAutomationDocumentReadinessOutcome.swift
  • Packages/macOS/CmuxBrowser/Tests/CmuxBrowserTests/Control/BrowserAutomationDocumentReadinessTests.swift
  • Resources/Localizable.xcstrings
  • Sources/Panels/BrowserPanel+AutomationRecovery.swift
  • Sources/Panels/BrowserPanel.swift
  • Sources/TerminalController.swift

…ehydration-hang

# Conflicts:
#	Sources/Panels/BrowserPanel.swift
@cursor

cursor Bot commented Jul 15, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@cursor

cursor Bot commented Jul 15, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@austinywang
austinywang merged commit f008967 into main Jul 15, 2026
23 of 26 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Jul 15, 2026
3 of 6 tasks
hhsw2015 pushed a commit to hhsw2015/cmux that referenced this pull request Jul 16, 2026
* test: cover browser automation watchdog recovery

* fix: recover unresponsive browser automation

* fix: cover all browser automation callback channels

* refactor: isolate browser watchdog signal

* fix: preserve browser automation recovery state

* test: cover shared browser recovery

* fix: share browser automation recovery

* test: cover superseded browser recovery

* fix: preserve page-world automation state

* fix: await recovered browser document readiness

* test: preserve browser consent during recovery

* fix: preserve consent across browser recovery

* fix: preserve interactive prompts during browser recovery

* test: cover browser recovery lifecycle races

* fix: guard browser automation recovery lifecycle

* test: remove browser readiness registration hook

* fix: preserve browser recovery timeout headroom

* test: cover browser omnibar draft isolation

* fix: isolate browser omnibar drafts by panel

* ci: gate browser panel identity regression

(cherry picked from commit f008967)

This branch was successfully deployed

1 active deployment
Preview – cmux — b39ad9d8 Deployed Jul 15, 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

Development

Successfully merging this pull request may close these issues.

fix: browser surface hangs on pre-hydration empty shell, screenshot times out

1 participant