Commit graph

1936 commits

Author SHA1 Message Date
austinpower1258
82a9ccf218 Fix sandbox file write issue: use start-delay-ms for display helper
The sandboxed XCTest runner can't write the start signal file to /tmp/.
Added --start-delay-ms to create-virtual-display.m as alternative to
--start-path. CI uses 10s delay so the test captures baseline render
stats before churn begins. Test skips start signal write when
pre-launched.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:16:57 -07:00
austinpower1258
0c4415ceba Pre-launch app from CI shell to escape XCTest sandbox
The XCTest runner is sandboxed, causing Process-spawned apps to
inherit sandbox restrictions. The CI step now:
1. Builds for testing first (separate step)
2. Launches display helper and app from the shell (non-sandboxed)
3. Waits for app diagnostics and render stats
4. Writes manifests for the test to find the pre-launched state
5. Runs test-without-building

The test detects the pre-launch manifest and skips its own app launch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:05:46 -07:00
austinpower1258
94c656fbbd Force windows visible on headless CI runners for UI test rendering
Two fixes:
1. Use FileManager.temporaryDirectory for diagnostics path instead of
   hardcoded /tmp/ — Process-spawned app inherits the test runner's
   sandbox and can't write to /tmp/.
2. Add orderFrontRegardless() after activate() in the UI test window
   creation path — on headless CI runners, activate() silently fails
   and windows stay invisible, preventing terminal rendering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:53:19 -07:00
austinpower1258
6233f1b2f0 Use Process with sandbox-aware temp paths for UI test app launch
The Process-spawned app inherits the test runner's sandbox. Previous
attempts failed because diagnostics used hardcoded /tmp/ which the
sandboxed app can't write to. Now using FileManager.temporaryDirectory
for all temp paths (resolves to the sandbox container's tmp), and
inheriting the full test runner environment so the child shares the
same sandbox context.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:43:26 -07:00
austinpower1258
79aae4fe83 Use NSWorkspace with activates=false to launch app in UI test
Root cause: Process inherits the XCTest runner's sandbox, preventing
the app from writing diagnostics to /tmp/. NSWorkspace.openApplication
goes through LaunchServices, which launches the app in its own process
context outside the sandbox. Using activates=false avoids the 60s
foreground activation timeout that killed the previous NSWorkspace
attempt on headless CI runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:34:56 -07:00
austinpower1258
eee5862ca7 Add verbose diagnostics to display resolution UI test launch failure
Include the app's stdout/stderr log contents and full env dump in the
error message so we can see what happens on CI when the app runs but
doesn't write diagnostics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:23:25 -07:00
austinpower1258
e4ef74c8b2 Fix env contamination in Process-based UI test app launch
The test runner's environment contains XCTest variables
(DYLD_INSERT_LIBRARIES, XCInjectBundle, etc.) that cause the app to
hang when inherited by a Process-launched binary. Pass only system
essentials + our CMUX_UI_TEST_* vars, matching how the smoke test
launches the app with a clean environment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:14:29 -07:00
austinpower1258
88751b2d12 Launch app binary directly via Process in display resolution UI test
The smoke test (smoke-test-ci.sh) passes on the same WarpBuild runners
because it launches the binary directly. XCUIApplication.launch() and
NSWorkspace.openApplication both require foreground activation which
fails on headless CI runners since ~04:00 UTC 2026-03-23. Running the
binary directly via Process works without WindowServer activation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:59:49 -07:00
austinpower1258
ae064802c6 Use NSWorkspace to launch app in display resolution UI test
XCUIApplication.launch() hard-fails with a 60-second timeout when
it can't foreground the app on headless CI runners. This test never
uses XCUIApplication for interaction (no taps/keys) — it only reads
a diagnostics file.

Replace with NSWorkspace.openApplication which launches through
Launch Services, passes env vars via OpenConfiguration, and returns
immediately without blocking on activation failure.

Also add CI retry loop since runner environment is flaky.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:48:31 -07:00
austinpower1258
fc858fcfa4 Revert UI test foreground activation changes back to 56a4d258
Reverts cbb21872, 54ec524a, 10fd323b, 75375ab7, 82a16aa7 — all
attempts to fix display resolution UI test foreground activation
on CI that introduced regressions. Restores the state from the
last fully green CI run (56a4d258).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:38:06 -07:00
austinpower1258
82a16aa746 Replace XCUIApplication with NSWorkspace for display regression test
XCUIApplication.launch() blocks for 60 seconds trying to foreground
the app on headless CI runners, then hard-fails the test (not
recoverable with continueAfterFailure). This test doesn't need
XCUIApplication — it never taps buttons or types keys, it only reads
a diagnostics file.

Switch to NSWorkspace.openApplication which:
- Launches through Launch Services (proper macOS app lifecycle)
- Passes environment vars via OpenConfiguration
- Returns immediately with NSRunningApplication handle
- Doesn't block or hard-fail on activation issues

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:29:45 -07:00
austinpower1258
75375ab7af Fix display resolution UI test foreground activation on CI
XCUIApplication.launch() fails to activate the app on headless CI
runners, reporting "Failed to activate application (current state:
Running Background)". With continueAfterFailure=false, this kills the
test before ensureForegroundAfterLaunch can retry.

Fix by temporarily setting continueAfterFailure=true around launch(),
then retrying activation via app.activate(). Also add a retry loop in
the CI workflow since foreground activation is inherently flaky on
headless runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:19:12 -07:00
austinpower1258
10fd323bb0 Fix display regression UI test launch gating 2026-03-23 02:05:07 -07:00
austinpower1258
54ec524a63 Fix display regression launch on CI runner 2026-03-23 01:54:29 -07:00
Austin Wang
cbb2187260
Fix UI test foreground activation on CI (#1981) 2026-03-23 01:42:03 -07:00
Austin Wang
56a4d25836
Fix blank terminal renders after workspace switches (#1964) 2026-03-22 18:57:30 -07:00
BillionToken
59f526a452
fix(terminal): prevent cursor movement on double-click selection (#1709)
Double-clicking to select text in the terminal was causing unwanted cursor
movement because the mouse position was being updated on both the first and
second clicks. This disrupted the selection gesture and caused the cursor to
jump to a different position than intended.

Fix by only updating the mouse position on the first click (clickCount == 1),
allowing the terminal's selection logic to handle multi-click gestures without
cursor interference.

Fixes manaflow-ai/cmux#1698

Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com>
2026-03-22 18:54:12 -07:00
Lawrence Chen
da1bfedb87
Merge pull request #1965 from manaflow-ai/task-scrollbar-fix-mainline
Preserve explicit wheel scrollback against passive follow
2026-03-22 18:51:15 -07:00
Gale
ef9d917bef
Fix reload.sh build failure exit handling (#1888) 2026-03-22 18:40:08 -07:00
Lawrence Chen
c1c028e628
Preserve explicit wheel scrollback against passive follow 2026-03-22 18:11:06 -07:00
Lawrence Chen
7634abe616
Add regression test for wheel scrollback follow bug 2026-03-22 18:11:00 -07:00
Austin Wang
fd279bdcec
Fix splitter hitbox overlap and terminal scrollbar width resync (#1950)
* test: add splitter and scrollbar regressions

* fix: narrow sidebar overlap and resync terminal width

* test: unwrap pending surface width in scrollbar regression

* fix: restore hosted inspector divider drag path
2026-03-22 18:06:11 -07:00
Apptah
5ced3134d3
Fix browser freeze after pane split by reattaching WKWebView rendering state (#1852)
When a pane split occurs, SwiftUI recreates host views and the portal
system rebinds the WKWebView to a new container. However, the bind path
never called BrowserWindowPortalRegistry.refresh(), so WebKit's internal
rendering state (_exitInWindow/_enterInWindow) was never cycled. This
left the WKWebView frozen in the original pane after a split.

Add refresh() calls after every portal bind that changes the host, in
three code paths: the main update path (shouldBindNow), onDidMoveToWindow,
and onGeometryChanged. The refresh is a no-op when no reattach is needed
(browserPortalNeedsRenderingStateReattach == false), so normal rendering
is unaffected.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:05:39 -07:00
Lawrence Chen
5be9edaf5e
Merge pull request #1957 from che-3/fix/esc-not-working-in-panels
Fix Escape key not working in terminal panels (e.g. lazygit)
2026-03-22 17:49:00 -07:00
Austin Wang
e8cf83ca57
Fix claude-hook stop teardown races (#1954)
* Add regression test for claude-hook stop teardown errors

* Handle claude-hook stop teardown races
2026-03-22 17:34:33 -07:00
Lawrence Chen
c9616c59e9
Merge pull request #1937 from rerun0510/fix/macos26-background-thread
Fix terminal black screen on macOS 26.3.1 by dispatching Ghostty callbacks to main thread
2026-03-22 17:28:29 -07:00
Lawrence Chen
4c92271137
Merge pull request #1913 from centraldogma99/fix/korean-input-keyboard-shortcuts
Fix keyboard shortcuts not working with Korean input mode
2026-03-22 17:18:47 -07:00
Lawrence Chen
c5b306655d
Merge pull request #1915 from elvistranhere/fix/split-crash-intel-1870
Fix #1870: prevent split crash on Intel Macs caused by stale font pointer
2026-03-22 17:14:03 -07:00
Austin Wang
100612d96e
Fix locale page crashes under Google Translate (#1956)
* fix(web): fall back to English for missing locale keys

* fix(web): stabilize translated homepage typing
2026-03-22 16:55:00 -07:00
Matthew Z.
eb248a1cdb
Fix Cmd+Shift+key combos being swallowed for unbound keys (#1959)
Use charactersIgnoringModifiers instead of characters when redispatching
Cmd-modified key events in performKeyEquivalent. Cmd-modified keys don't
produce text characters, so event.characters returns an empty string for
Cmd+Shift combos, preventing Ghostty from encoding them as kitty protocol
sequences. charactersIgnoringModifiers returns the actual key character
(e.g. "k" for Cmd+Shift+K) while modifiers are preserved in modifierFlags.

Fixes #1718

Co-authored-by: CHE-3 <schumannzheng@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 16:52:42 -07:00
CHE-3
5de59cd4ed fix: stop consuming repeated Escape keys after command palette dismissal
The `shouldConsumeSuppressedEscape` function had an early return that
unconditionally consumed all repeated Escape key events (`isARepeat`),
regardless of whether the suppression window had expired. This caused
Escape presses to be swallowed in TUI apps (e.g. lazygit) running in
panels, because the repeat events never reached the active responder.

Removing the `isARepeat` guard lets repeated Escapes fall through to
the existing time-based check (0.35s window), which correctly expires
and stops consuming events after the command palette is dismissed.

Fixes #1610

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:42:24 -04:00
Lawrence Chen
e0e0e35279
Merge pull request #1834 from lifrary/fix/replace-force-unwrapped-utf8-data-encoding
Replace force-unwrapped .data(using: .utf8)! with Data(string.utf8)
2026-03-22 15:38:40 -07:00
Lawrence Chen
01ffeb3f44
Merge pull request #1898 from manaflow-ai/feat-tmux-notification-attention-state
Improve tmux notification attention routing
2026-03-22 15:36:36 -07:00
austinpower1258
fd1376d2d5 fix: update WorkspaceShortcutMapper tests to match renamed API from #1951
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 15:04:36 -07:00
Austin Wang
33dcc606bf
Customizable number shortcuts (#1951)
* Allow customizing numbered workspace and surface shortcuts

* Update bonsplit submodule to squashed main commit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 14:54:54 -07:00
Austin Wang
661a4e8c7f
Merge pull request #1908 from manaflow-ai/issue-1906-update-dialog-double-press
Fix Sparkle update dialog requiring two presses
2026-03-22 13:19:01 -07:00
Hiroki Kajiwara
ad57e10772 fix: dispatch UI updates to main thread for macOS 26 compatibility
Publishing changes from background threads is not allowed in macOS 26
(Tahoe). Ghostty action callbacks run on I/O threads but were modifying
AppKit view properties and posting notifications without dispatching to
the main thread.

Fixes:
- GHOSTTY_ACTION_SCROLLBAR: wrap in DispatchQueue.main.async
- GHOSTTY_ACTION_CELL_SIZE: wrap in DispatchQueue.main.async
- GHOSTTY_ACTION_COLOR_CHANGE: wrap background color updates in main async
- GHOSTTY_ACTION_CONFIG_CHANGE: wrap background color clear in main async
2026-03-22 14:45:53 +09:00
austinpower1258
44b4374f2a fix: harden Sparkle manual update dialog flow 2026-03-21 15:19:31 -07:00
Austin Wang
76c1e632f0
Merge pull request #1895 from manaflow-ai/issue-1863-pinned-workspace-close-protect
Confirm before closing pinned workspaces
2026-03-21 12:36:55 -07:00
Austin Wang
374de63b8b
Merge pull request #1921 from manaflow-ai/issue-1894-browser-fullscreen-video
Fix browser pane video fullscreen
2026-03-21 12:22:59 -07:00
austinpower1258
e935eb57d3 Fix browser pane video fullscreen 2026-03-21 12:17:55 -07:00
Elvis Tran
ded07306df Remove em dash from code comment 2026-03-22 00:15:02 +10:30
Elvis Tran
a396242631 Address review feedback: guard TabManager call site, clarify malloc_size
- Add hasLiveSurface guard in TabManager.inheritedTerminalConfigForNewWorkspace
  to protect the cmuxInheritedSurfaceConfig call site missed in the initial fix
- Expand malloc_size comment to clarify it is a best-effort heuristic, not a
  lifetime guarantee (per Copilot review)
2026-03-22 00:06:15 +10:30
Elvis Tran
b1b07bf55b Fix #1870: prevent split crash on Intel Macs caused by stale font pointer
ghostty_surface_quicklook_font returns an unretained CTFont pointer that
can become stale on Intel Macs, leading to EXC_BAD_ACCESS (SIGSEGV) when
creating a split. This is a follow-up to the same crash pattern fixed in
#1496.

Add malloc_size validation in cmuxCurrentSurfaceFontSizePoints to detect
freed heap allocations before interpreting the pointer as a CTFont. Also
add hasLiveSurface guards in inheritedTerminalConfig and
rememberTerminalConfigInheritanceSource to skip surfaces whose native
state is closing or closed. All callers already handle nil gracefully by
falling back to inherited config values.
2026-03-22 00:00:10 +10:30
최준영
8cd9cd96c1 Fix keyboard shortcuts not working with Korean (한글) input mode
When a non-Latin input source like Korean 두벌식 is active,
event.charactersIgnoringModifiers returns Hangul characters (e.g. ㅅ
for T key) instead of Latin letters. This caused all character-based
shortcut matching to fail — Cmd+T, Cmd+D, Cmd+1-9, Ctrl+N/P, etc.

Root cause: KeyboardLayout.character(forKeyCode:modifierFlags:) assumed
CJK input sources lack kTISPropertyUnicodeKeyLayoutData, but Korean
두벌식 has it. UCKeyTranslate returned Korean characters and the ASCII
fallback was never reached.

Fix:
- KeyboardLayout.character(): check result is ASCII before accepting;
  fall through to TISCopyCurrentASCIICapableKeyboardInputSource() when
  the current source returns non-ASCII characters
- Add KeyboardLayout.normalizedCharacters(for:) helper that normalizes
  event.charactersIgnoringModifiers for shortcut comparison
- Apply normalization in handleCustomShortcut (AppDelegate),
  BrowserPanelView omnibar key handler, and BrowserPopupWindowController
  Cmd+W handler

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:16:10 +09:00
Lawrence Chen
5cef77e456
Self-heal tmux attention routing for cmux panes 2026-03-21 03:26:11 -07:00
Lawrence Chen
6ff81579d9
Merge pull request #1858 from martinezhermes/fix/background-opacity-blur-879
fix: apply background-opacity and background-blur to terminal rendering area (#879)
2026-03-21 03:16:47 -07:00
Lawrence Chen
65b2ba7597
Merge pull request #1845 from mvanhorn/osc/1603-close-tab-show-name
feat(dialog): show tab name in close tab confirmation
2026-03-21 03:16:36 -07:00
Lawrence Chen
e1bef073b4
Merge pull request #1826 from grimmerk/fix/applescript-windows-empty
fix: AppleScript count windows returns 0 + working directory returns empty
2026-03-21 03:10:26 -07:00
Lawrence Chen
f0fb098d3b
Add tmux stale-surface routing regression tests 2026-03-21 03:04:53 -07:00