Skip to content

Fix terminal focus retry after tiny responder handoff - #6359

Merged
austinywang merged 20 commits into
mainfrom
issue-6342-terminal-keystroke-freeze
Jun 18, 2026
Merged

austinywang merged 20 commits into
mainfrom
issue-6342-terminal-keystroke-freeze

Conversation

@austinywang

@austinywang austinywang commented Jun 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • add regression coverage for the hidden/tiny first-responder focus handoff
  • schedule the existing automatic first-responder reconciliation when GhosttyNSView.becomeFirstResponder() suppresses focus because geometry is hidden or tiny
  • keep the retry on the existing coalesced focus-apply path so it reasserts Ghostty focus only after the pane is visible, active, key-window, and still the current focus target

Root cause

Code inspection confirmed a reachable AppKit-focused/Ghostty-unfocused divergence: becomeFirstResponder() sets the view-level desiredFocus before geometry gating, then the hidden/tiny branch logs and returns without calling ghostty_surface_set_focus or scheduling the normal focus reconciliation path. If AppKit makes the Ghostty view first responder during transient bonsplit/window portal layout churn, subsequent plain key input can route to the view while the runtime surface still has desiredFocusState == false.

The branch dates to February 2026 (5070b137a4), so this looks like a latent race exposed by later timing changes rather than code introduced directly by the June refactors. The June candidates mostly changed surrounding timing: #6147 moved portal installation through window-chrome overlay resolution, #6278 moved terminal surface lifecycle into the macOS package and added restore/input-demand paths, and #6227/#6267 did not show a direct focus-state change in this path.

Tests

  • Added deterministic DEBUG app-target coverage for first-responder while the inner Ghostty view is zero-sized, then geometry settling before the deferred apply drains.
  • Per issue instructions, I did not run local tests or local builds; CI is the validation path for this branch.

Closes #6342


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


Summary by cubic

Retries terminal focus after AppKit hands first responder to a hidden or tiny terminal, deferring apply until the portal and inner surface are usable. Forced reparent focus uses the same geometry guard and queues a retry on layout/visibility; dock retries only run when the dock owns first responder (fixes #6342).

  • Bug Fixes

    • Defer suppressed first-responder focus; reapply only when the window is key, pane and surface are visible, portal >1x1, and (for suppressed handoffs) inner surface >1x1. Automatic apply and Find-restore keep this deferral.
    • Gate forced reparent reassert by geometry; if hidden/tiny, queue a retry from layout/visibility and clear pending state on success or foreign focus. Skip redundant scans when an apply is queued. In the right-sidebar dock, require current first-responder ownership and readiness so visibility alone never steals focus.
  • Tests

    • Reapply after geometry settles; automatic apply doesn’t bypass deferral; Find “Restore Terminal” preserves it.
    • Forced reparent reassert queues while tiny and recovers once usable; already-first-responder reparent clear waits for surface geometry. Right-sidebar dock: deferred reapply after geometry and no focus theft on visibility apply.

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

Review in cubic

Summary by CodeRabbit

  • Bug Fixes

    • Improved terminal focus recovery when the focused surface is hidden or shrinks to a tiny size. Suppressed first-responder focus is now deferred and conditionally retried once the view is active/visible and the surface geometry is usable. Pending retries are reliably cleared after unrelated focus handoffs to prevent stale reapplication.
  • Tests

    • Added a DEBUG-only regression test that verifies deferred suppressed focus is re-applied after resizing the surface back to a usable size.

@vercel

vercel Bot commented Jun 17, 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 18, 2026 1:55am
cmux-staging Building Building Preview, Comment Jun 18, 2026 1:55am

@coderabbitai

coderabbitai Bot commented Jun 17, 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

This PR addresses a regression where terminal panes intermittently stop responding to keyboard input when running many agents. The fix implements deferred first-responder focus recovery when a Ghostty surface frame becomes hidden or tiny. When becomeFirstResponder() is suppressed due to unusable geometry, the code schedules an automatic retry that activates once layout settles and conditions allow. New state tracking prevents stale retries across focus handoff paths. A DEBUG-only regression test validates that focus is deferred during the hidden/tiny phase and automatically re-applied after geometry becomes usable.

Changes

Deferred First-Responder Focus Recovery

Layer / File(s) Summary
Pending suppressed focus state tracking and helpers
Sources/GhosttyTerminalView.swift
Adds pendingSuppressedFirstResponderFocusReapply flag to GhosttySurfaceScrollView to track whether a deferred reapply is scheduled. Introduces three fileprivate helpers: scheduleSuppressedFirstResponderFocusReapply(reason:) to mark pending and auto-schedule, cancelSuppressedFirstResponderFocusReapply() to clear pending, and scheduleSuppressedFirstResponderFocusReapplyIfReady(...) to conditionally retry when focus ownership, visibility, desired-focus intent, and permission checks pass.
Deferred scheduling and cleanup in becomeFirstResponder and resignFirstResponder
Sources/GhosttyTerminalView.swift
When GhosttyNSView.becomeFirstResponder() encounters hidden/tiny suppression, calls scheduleSuppressedFirstResponderFocusReapply(reason:) to defer the reapply. In the permission-denied path, immediately cancels pending to avoid redundant retries. After focus is successfully applied to the surface, cancels pending to ensure no stale retry. resignFirstResponder() also clears pending.
Layout-driven retry and geometry readiness checks
Sources/GhosttyTerminalView.swift
GhosttyNSView.layout() schedules suppressed reapply when hidden/tiny suppression is relevant. GhosttySurfaceScrollView.layout() calls the conditional retry helper to attempt reapply when layout advances. applyFirstResponderIfNeeded() is updated to compute and enforce additional "usable surface geometry" check (separate from portal geometry) and extends the hidden/tiny skip guard accordingly.
Cleanup across focus handoff and state-change paths
Sources/GhosttyTerminalView.swift
yieldTerminalSurfaceFocusForForeignResponder, reassertTerminalSurfaceFocus, restoreSearchFocus, yieldPanelFocusIntent, and resignOwnedFirstResponderIfNeeded all clear pendingSuppressedFirstResponderFocusReapply to prevent stale retries from executing after focus changes or yield operations.
Focus recovery regression test
cmuxTests/WorkspaceUnitTests.swift
Adds testHiddenTinyFirstResponderReappliesGhosttyFocusAfterGeometrySettles inside WorkspaceTerminalFocusRecoveryTests. Creates a Workspace, hosts the terminal panel in an NSWindow, temporarily sets the Ghostty surface frame to zero to suppress focus, verifies debugDesiredFocusState is deferred while hosted view retains focus intent, then restores the frame and spins the run loop to assert focus is re-applied. Non-DEBUG builds skip via XCTSkip.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • manaflow-ai/cmux#5296: Both PRs modify Sources/GhosttyTerminalView.swift focus-recovery logic (notably GhosttySurfaceScrollView/applyFirstResponderIfNeeded and first-responder handling), so this PR's deferred focus reapply behavior is closely intertwined with the retrieved PR's foreign/stranded first-responder recovery changes.

Suggested reviewers

  • jesstelford

Poem

🐇 A surface turned tiny, the focus went dark,
Keystrokes were lost in that windowless park!
But now there's a deferred touch waiting in line,
When geometry grows, focus re-aligns fine,
The panes dance again with each keystroke they mark! ✨

🚥 Pre-merge checks | ✅ 21 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.88% 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
Title check ✅ Passed The title clearly and specifically describes the main change: fixing terminal focus retry after the view becomes a tiny or hidden first responder, which matches the core objective of addressing intermittent keyboard input loss.
Linked Issues check ✅ Passed Changes directly address #6342 by fixing the AppKit-Ghostty focus divergence through scheduled reconciliation during hidden/tiny geometry, preventing keyboard input loss during multi-agent workflows.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the focus retry mechanism and its regression test coverage. No unrelated modifications to other systems or features are present.
Cmux Swift Actor Isolation ✅ Passed Production Swift changes properly manage actor isolation: GhosttySurfaceScrollView inherits @MainActor from NSView, new property is private, and fileprivate methods access it only within the isolat...
Cmux Swift Blocking Runtime ✅ Passed PR adds non-blocking async focus retry (using DispatchQueue.main.async) for hidden/tiny geometry, with guard-based readiness checks and DEBUG-only test scaffolding using RunLoop—no blocking operati...
Cmux Expensive Synchronous Load ✅ Passed PR adds focus retry logic with lightweight geometry bounds checks and AppKit state queries only; no expensive synchronous loaders (RestorableAgentSessionIndex.load, sysctl, disk I/O) on main actor...
Cmux Cache Substitution Correctness ✅ Passed The PR adds a transient UI-only deferred focus retry flag and doesn't swap any authoritative reads for cached values in persistence, history, undo, or snapshot paths. All changes are limited to foc...
Cmux No Hacky Sleeps ✅ Passed Test uses deterministic RunLoop.run(until:) scaffolding (permitted). Production code implements suppressed focus reapply via event-driven DispatchQueue.main.async and conditional state checks, not...
Cmux Algorithmic Complexity ✅ Passed The PR introduces no new collection scans or loops. New code uses simple boolean flag operations with early-exit guards. Existing O(n) operations in matchesCurrentTerminalFocusTarget predate this P...
Cmux Swift Concurrency ✅ Passed The DispatchQueue.main.async in scheduleAutomaticFirstResponderApply is an allowed AppKit boundary case, called from becomeFirstResponder() and window lifecycle callbacks. No new Combine patterns,...
Cmux Swift @Concurrent ✅ Passed PR adds only synchronous helper functions and DispatchQueue.main.async calls for UI-bound first-responder management; no async functions, no @concurrent annotations, no violations of concurrent ann...
Cmux Swift File And Package Boundaries ✅ Passed Changes comply with swift-file-package-boundaries rules: both files already tracked in budget; GhosttyTerminalView adds 63 lines (<250 limit for >800 line files); AppKit/Ghostty focus glue is inher...
Cmux Swiftpm Lockfiles ✅ Passed All SwiftPM lockfile requirements met: cmux-owned package .gitignore files don't ignore Package.resolved, Package.swift dependency changes include matching Package.resolved diffs, and root Xcode Pa...
Cmux Swift Logging ✅ Passed No logging violations: NSLog in GhosttyTerminalView.swift is DEBUG-guarded; test is DEBUG-only with XCTSkip for non-DEBUG; no secrets exposed; Logger uses proper static declaration pattern.
Cmux User-Facing Error Privacy ✅ Passed PR contains no user-facing error messages, alerts, or UI strings. Changes are test code (assertions only) and private implementation details for focus handling. No credentials, tokens, or sensitive...
Cmux Full Internationalization ✅ Passed All strings added are developer/test-only: test assertions and debug-only logs in #if DEBUG blocks, per full-internationalization.md's allowed cases.
Cmux Swiftui State Layout ✅ Passed PR changes are in AppKit bridge views (GhosttyNSView, GhosttySurfaceScrollView) with no new SwiftUI state patterns. No @Published/@StateObject/@EnvironmentObject/@observable decorators or GeometryR...
Cmux Architecture Rethink ✅ Passed PR uses the existing coalesced focus-apply path with a scoped geometry guard. The new pendingSuppressedFirstResponderFocusReapply flag is a required platform bridge for AppKit first-responder mec...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The PR adds focus recovery logic to GhosttyTerminalView.swift and a DEBUG-only test fixture in WorkspaceUnitTests.swift. No user-visible NSWindow, NSPanel, NSWindowController, SwiftUI Window, or Wi...
Cmux Source Artifacts ✅ Passed Both changed files (cmuxTests/WorkspaceUnitTests.swift and Sources/GhosttyTerminalView.swift) are hand-written Swift source/test files with no source control artifacts (builds, caches, logs, or tem...
Description check ✅ Passed The PR description provides a detailed summary, root cause analysis, and test coverage explanation, though it lacks some template sections.

✏️ 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-6342-terminal-keystroke-freeze

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 17, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes a latent AppKit/Ghostty focus-state divergence: when becomeFirstResponder() fires on a zero-sized or hidden surface (during bonsplit/portal layout churn), the hidden-or-tiny branch was exiting without scheduling the normal focus reconciliation, leaving Ghostty unfocused while AppKit considered the view first responder. The fix adds a pendingSuppressedFirstResponderFocusReapply boolean that tracks when focus has been deferred, wires a retry trigger into AppKit's layout() cycle, and gates applyFirstResponderIfNeeded / reassertTerminalSurfaceFocus on inner-surface geometry when a deferred retry is outstanding.

  • Core fix: becomeFirstResponder.hiddenOrTiny and becomeFirstResponder.reparent.hiddenOrTiny now call scheduleSuppressedFirstResponderFocusReapply, which sets the flag and enqueues an automatic apply; GhosttyNSView.layout() and GhosttySurfaceScrollView.layout() call scheduleSuppressedFirstResponderFocusReapplyIfReady to enqueue a fresh apply once geometry, active state, key-window, and focus-target guards all pass.
  • Cancellation coverage: the flag is cleared at resign, coordinator suppress, yieldTerminalSurfaceFocusForForeignResponder, yieldPanelFocusIntent, resignOwnedFirstResponder, and on every successful reassertTerminalSurfaceFocus or becomeFirstResponder apply path.
  • Test coverage: 7 new DEBUG-only regression scenarios cover the main recovery paths, reparent suppression retries, dock-surface focus theft prevention, and Find-bar restore deferral.

Confidence Score: 5/5

The change is a targeted retry mechanism using AppKit layout signals — no timers, no polling. The logic is correct in all traced paths, tests cover the key recovery scenarios, and the existing focus machinery is not otherwise restructured.

All cancel-sites for the new flag were verified against every focus-yield and resign path visible in the diff; the retry loop is bounded by real AppKit layout events; no regression was found in the coordinator-suppress, reparent-suppress, Find-bar restore, or right-sidebar dock paths.

Sources/GhosttyTerminalView.swift — the new pendingSuppressedFirstResponderFocusReapply flag now participates in 9+ focus code paths; any future focus-yield entrypoint that forgets to call cancelSuppressedFirstResponderFocusReapply will leave the flag stuck, causing ordinary focus applies to gate on surface geometry.

Important Files Changed

Filename Overview
Sources/GhosttyTerminalView.swift Adds pendingSuppressedFirstResponderFocusReapply flag with 2 set-paths and 7 clear-paths to defer and retry Ghostty surface focus when becomeFirstResponder fires while geometry is hidden/tiny; uses AppKit layout signals as the retry trigger rather than a timer.
cmuxTests/WorkspaceTerminalFocusRecoveryTests.swift New DEBUG-only regression test suite with 7 scenarios covering hidden/tiny first-responder deferral, reparent suppression, dock surface focus theft prevention, and Find-bar restore; uses RunLoop-based timing that is acceptable for deterministic test scaffolding.
.github/swift-file-length-budget.tsv Budget entry for GhosttyTerminalView.swift updated from 11731 to 11833 to account for the ~102-line increase; no new violations introduced.
cmux.xcodeproj/project.pbxproj Correctly wires WorkspaceTerminalFocusRecoveryTests.swift into both the file-reference and build-sources sections of the test target.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant AppKit
    participant GhosttyNSView as GhosttyNSView (surfaceView)
    participant ScrollView as GhosttySurfaceScrollView (hostedView)
    participant Ghostty

    AppKit->>GhosttyNSView: becomeFirstResponder()
    GhosttyNSView->>GhosttyNSView: "desiredFocus = true"
    Note over GhosttyNSView: geometry is hidden/tiny
    GhosttyNSView->>ScrollView: scheduleSuppressedFirstResponderFocusReapply()
    ScrollView->>ScrollView: "pendingSuppressedFirstResponderFocusReapply = true"
    ScrollView->>ScrollView: scheduleAutomaticFirstResponderApply()

    Note over ScrollView: async apply fires (geometry still tiny)
    ScrollView->>ScrollView: applyFirstResponderIfNeeded()
    ScrollView-->>ScrollView: return (geometry guard fails, flag stays true)

    AppKit->>GhosttyNSView: layout() — frame grows to usable size
    GhosttyNSView->>ScrollView: scheduleSuppressedFirstResponderFocusReapplyIfReady()
    ScrollView->>ScrollView: all guards pass → scheduleAutomaticFirstResponderApply()

    Note over ScrollView: deferred apply fires
    ScrollView->>ScrollView: applyFirstResponderIfNeeded()
    ScrollView->>ScrollView: reassertTerminalSurfaceFocus()
    ScrollView->>Ghostty: setFocus(true)
    ScrollView->>ScrollView: "pendingSuppressedFirstResponderFocusReapply = false"
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 AppKit
    participant GhosttyNSView as GhosttyNSView (surfaceView)
    participant ScrollView as GhosttySurfaceScrollView (hostedView)
    participant Ghostty

    AppKit->>GhosttyNSView: becomeFirstResponder()
    GhosttyNSView->>GhosttyNSView: "desiredFocus = true"
    Note over GhosttyNSView: geometry is hidden/tiny
    GhosttyNSView->>ScrollView: scheduleSuppressedFirstResponderFocusReapply()
    ScrollView->>ScrollView: "pendingSuppressedFirstResponderFocusReapply = true"
    ScrollView->>ScrollView: scheduleAutomaticFirstResponderApply()

    Note over ScrollView: async apply fires (geometry still tiny)
    ScrollView->>ScrollView: applyFirstResponderIfNeeded()
    ScrollView-->>ScrollView: return (geometry guard fails, flag stays true)

    AppKit->>GhosttyNSView: layout() — frame grows to usable size
    GhosttyNSView->>ScrollView: scheduleSuppressedFirstResponderFocusReapplyIfReady()
    ScrollView->>ScrollView: all guards pass → scheduleAutomaticFirstResponderApply()

    Note over ScrollView: deferred apply fires
    ScrollView->>ScrollView: applyFirstResponderIfNeeded()
    ScrollView->>ScrollView: reassertTerminalSurfaceFocus()
    ScrollView->>Ghostty: setFocus(true)
    ScrollView->>ScrollView: "pendingSuppressedFirstResponderFocusReapply = false"
Loading

Reviews (13): Last reviewed commit: "chore: clarify focus reassertion retry h..." | Re-trigger Greptile

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Sources/GhosttyTerminalView.swift (1)

4922-4926: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Cancel stale suppressed retries before returning for reparent suppression.

This branch intentionally prevents the old reparented view from stealing focus, but a previously queued hidden/tiny retry can survive and later re-apply focus during layout. Clear it before the early return.

🐛 Proposed fix
             if suppressingReparentFocus {
+                terminalSurface?.hostedView.cancelSuppressedFirstResponderFocusReapply()
 `#if` DEBUG
                 cmuxDebugLog("focus.firstResponder SUPPRESSED (reparent) surface=\(terminalSurface?.id.uuidString.prefix(5) ?? "nil")")
 `#endif`
                 return result
             }
🤖 Prompt for 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.

In `@Sources/GhosttyTerminalView.swift` around lines 4922 - 4926, Before the early
return statement in the suppressingReparentFocus block, add code to cancel any
stale queued hidden or tiny retry that might re-apply focus later during layout.
This prevents the old reparented view from stealing focus when the layout is
processed. Identify the retry mechanism being used in the codebase (likely a
scheduled task or timer) and ensure it is cleared when suppressing reparent
focus, so the cancellation happens before the function returns.
🤖 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/GhosttyTerminalView.swift`:
- Around line 9795-9809: In the
scheduleSuppressedFirstResponderFocusReapplyIfReady function, add an early guard
check for pendingAutomaticFirstResponderApply at the beginning of the function
to return early if it is already true. This prevents unnecessary re-execution of
the matchesCurrentTerminalFocusTarget pane scan when an automatic first
responder apply is already queued, since the queued apply will re-check geometry
and ownership conditions anyway on the same layout turn, avoiding redundant
collection scans.

---

Outside diff comments:
In `@Sources/GhosttyTerminalView.swift`:
- Around line 4922-4926: Before the early return statement in the
suppressingReparentFocus block, add code to cancel any stale queued hidden or
tiny retry that might re-apply focus later during layout. This prevents the old
reparented view from stealing focus when the layout is processed. Identify the
retry mechanism being used in the codebase (likely a scheduled task or timer)
and ensure it is cleared when suppressing reparent focus, so the cancellation
happens before the function returns.
🪄 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: da92da8b-888b-4402-b4e3-4b1d155dae23

📥 Commits

Reviewing files that changed from the base of the PR and between d7e073a and f0f1d43.

⛔ Files ignored due to path filters (1)
  • .github/swift-file-length-budget.tsv is excluded by !**/*.tsv
📒 Files selected for processing (2)
  • Sources/GhosttyTerminalView.swift
  • cmuxTests/WorkspaceUnitTests.swift

Comment thread Sources/GhosttyTerminalView.swift
@austinywang
austinywang merged commit 2ca4b0b into main Jun 18, 2026
20 checks passed

This branch was successfully deployed

1 active deployment
Preview – cmux — 9df36b5b Deployed Jun 18, 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.

Terminals intermittently stop responding to keystrokes when running many agents (regression since latest update)

1 participant