Commit graph

1013 commits

Author SHA1 Message Date
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
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
austinpower1258
e935eb57d3 Fix browser pane video fullscreen 2026-03-21 12:17:55 -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
ae5b81ca1f
Merge pull request #1877 from Jesssullivan/sid/fix-captcha-upstream
fix: Cloudflare/CAPTCHA verification failures in browser panel
2026-03-21 02:11:59 -07:00
Lawrence Chen
a592ed126a
Add failing regression test for browser find focus (#1891)
* test: add browser find focus regression

* ci: run browser find focus regression on prs

* ci: merge pr ui regressions into one job

* fix: focus browser find after navigation

* test: rename ui regressions workflow guard

* Fix browser find focus after address bar navigation

* Fix test-e2e workflow manifest script

* Address PR review feedback

* Stabilize browser focus regression on CI

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-20 22:12:26 -07:00
Lawrence Chen
c2065b135d
Fix SSH image transfer cleanup and IPv6 followups (#1907)
* Add SSH image transfer followup regressions

* Fix SSH image transfer ownership and IPv6 followups

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-20 22:04:52 -07:00
Lawrence Chen
43c61f6e63
Fix SSH image transfer followups (#1904)
* Add regressions for SSH image transfer followups

* Fix SSH image transfer followup regressions

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-20 21:32:21 -07:00
Austin Wang
cdf8d367b2
Fix browser back navigation history handoff (#1897)
* Add regression test for browser back history

* Fix browser back history handoff

* Fix browser tab favicon not updating on navigation

Two issues caused stale or missing favicons in browser tabs:

1. KVO race: The isLoading observer read webView.isLoading inside a deferred
   Task instead of capturing the KVO change value at observation time. For fast
   navigations (back-forward cache), isLoading flips true→false before the Task
   runs, so handleWebViewLoadingChanged(true) was never called and the old
   favicon was never cleared.

2. SPA favicon discovery: Sites that inject <link rel="icon"> via JavaScript
   (e.g. React apps) had no favicon link in the DOM when didFinish fired. The
   fallback to /favicon.ico often 404'd, leaving the globe icon permanently.
   Now retries the JS query after 600ms to give client-side scripts time to
   add the tag.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 21:11:56 -07:00
Austin Wang
5c4fab1296
Fix sidebar PR badge detection for workspace branches (#1896)
* test: cover sidebar PR probe selection

* fix: detect sidebar PR badges across github remotes
2026-03-20 21:10:08 -07:00
austinpower1258
0580de44a5 Confirm before closing pinned workspaces 2026-03-20 20:59:43 -07:00
austinpower1258
b10cddcb9b Protect pinned workspaces from close actions 2026-03-20 19:38:24 -07:00
Lawrence Chen
4376e6e19a
Support image drag-and-drop into SSH terminals (#1838)
* Add remote image drag-and-drop uploads

* test: cover ssh image paste planning

* fix: upload images pasted into ssh terminals

* fix: share zsh history in cmux ssh relay shells

* fix: add cancellable ssh image transfer indicator

* fix: harden async ssh image transfer callbacks

* fix: address ssh image upload review feedback

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-20 18:31:19 -07:00
Jess Sullivan
9394774ab0 Fix CAPTCHA failures: restrict script injection to main frame only
CAPTCHA providers (reCAPTCHA, hCaptcha, Cloudflare Turnstile) detect
environment tampering in their cross-origin iframes. With
forMainFrameOnly: false, the telemetry hooks (overridden console.*)
and address bar focus tracker (__cmux* globals) run inside CAPTCHA
iframes, causing challenges to fail or score the session as a bot.

Change forMainFrameOnly from false to true on:
- telemetryHookBootstrapScriptSource
- addressBarFocusTrackingBootstrapScript

Both only need to run in the top-level page context.

Fixes #1429
2026-03-20 13:04:58 -04:00
Lawrence Chen
cc0fc557cf
Share browser context with OAuth popups (#1600)
* Add popup browser context regression tests

* Share browser context with OAuth popups

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-20 03:57:36 -07:00
Lawrence Chen
886de2a7c9
Add IntelliJ IDEA to command palette Open Directory targets (#1860)
Co-authored-by: jjonyo <jonyo.park@gmail.com>
2026-03-20 02:57:17 -07:00
이수민
8b49d66763
fix: support keyboard shortcuts with CJK input sources (Korean, Chinese, Japanese) (#1649)
When a non-Latin input source is active, event.charactersIgnoringModifiers
returns CJK characters that cannot match Latin shortcut keys. This adds
ASCII-capable input source fallback in KeyboardLayout and updates the
matchShortcut guard to skip early-return when event chars are non-ASCII.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 02:47:19 -07:00
Lawrence Chen
22689d5e0d
fix(sidebar): avoid premature workspace title truncation (#1859)
Co-authored-by: Brian Le <brian@brianle.xyz>
2026-03-20 02:44:29 -07:00
martinezhermes
1235daff04
fix: apply background-opacity and background-blur to terminal rendering area
Two root causes for issue #879:

1. GhosttyNSView was missing makeBackingLayer(), so AppKit provided a
   generic CALayer as the view's backing layer. libghostty expects
   (view.layer as? CAMetalLayer) != nil to set up Metal rendering on
   the existing layer. Without a CAMetalLayer backing layer, the Metal
   surface defaulted to isOpaque=true, making the terminal area fully
   opaque regardless of background-opacity config.

   Fix: override makeBackingLayer() to return a CAMetalLayer with
   isOpaque=false and bgra8Unorm pixel format (matching standalone
   Ghostty's SurfaceView behavior).

2. ghostty_set_window_background_blur(app, window) is exposed in
   ghostty.h but was never called in cmux. Without this call the
   macOS window never gets the NSVisualEffectView blur backdrop that
   background-blur requires.

   Fix: add applyWindowBlurIfNeeded() on GhosttyApp that reads
   background-blur from config via ghostty_config_get and calls
   ghostty_set_window_background_blur when the value is non-zero.
   Called from applyBackgroundToKeyWindow() and
   applyWindowBackgroundIfActive() whenever the window is made
   transparent.

Fixes #879

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 10:16:27 +01:00
BillionToken
8782978aba
fix(hooks): handle TabManager unavailable in SessionEnd/Start hooks (#1735)
Fixes #1715

The resolveTabForReport() function had an early guard that returned nil
when self.tabManager was nil, even when a valid --tab argument was
provided. This prevented Claude hook commands from resolving tabs via
AppDelegate.shared when the local tabManager wasn't available.

Changes:
- Modified resolveTabForReport() to allow tab resolution via --tab param
  even when self.tabManager is nil
- Removed early guard in upsertSidebarMetadata() that blocked resolution

Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com>
2026-03-20 02:14:29 -07:00
pstanton237
0fa7160de8
fix: align titlebar icons with traffic-light buttons (#1754)
The titlebar control icons (sidebar, notifications, new tab) were
vertically misaligned — centered within the full titlebar+tab-bar
area instead of the titlebar alone.

Use the close button's superview height as the true titlebar height
so the icons sit at the same vertical center as the traffic lights,
matching the behavior of apps like Slack.
2026-03-20 01:57:35 -07:00
Zachary Salzbank
730d64b943
feat: add --direction flag to markdown open command (#1763)
Supports left/right/up/down, defaulting to right (existing behavior).
Matches the --direction flag convention used by new-pane and new-split.
2026-03-20 01:48:28 -07:00
Lawrence Chen
c44e975855 fix: preserve custom commands for focused notifications 2026-03-20 01:11:10 -07:00
Lawrence Chen
60b6d8badc fix: play notification sound when focused 2026-03-20 01:11:10 -07:00
Lawrence Chen
d7db13a140 test: cover focused notification sound feedback 2026-03-20 01:11:10 -07:00
김서현
9844913ea1
fix: skip Korean from CJK font-codepoint-map auto-injection (#1700)
* fix: skip Korean from CJK font-codepoint-map auto-injection

The automatic CJK font-codepoint-map injection (PR #1017) maps Korean
ranges to Apple SD Gothic Neo, which has a different style/weight from
the primary terminal font. This overrides Ghostty's native
CTFontCreateForString fallback, which dynamically selects a
better-matching font for Hangul.

Ghostty itself (ghostty-org/ghostty) has no hardcoded CJK font names
and relies entirely on CTFontCreateForString for fallback. For Korean,
this native fallback produces visually consistent results with the
primary font.

Remove the Korean branch from cjkFontMappings() so Ghostty's native
fallback handles Hangul rendering. Japanese and Chinese mappings are
unaffected.

* test: update CJK font mapping tests for Korean removal

- testCJKFontMappingsReturnsAppleSDGothicNeoWithHangulForKorean
  → renamed to testCJKFontMappingsReturnsNilForKoreanOnly
  → asserts nil since Korean is no longer auto-mapped

- testCJKFontMappingsMultiLanguageMapsScriptSpecificRanges
  → renamed to testCJKFontMappingsMultiLanguageSkipsKorean
  → asserts no Apple SD Gothic Neo mapping exists
  → Japanese mappings remain unchanged

---------

Co-authored-by: dante-ad-shield <danate@ad-shield.io>
2026-03-20 00:14:01 -07:00
bagelcode-jhkim
e0c301b277
feat: add set-color/clear-color to workspace-action CLI (#1833)
* [auto] cmux session changes (1 files) [03/19 17:38]

* feat: add set-color/clear-color to workspace-action

- CLI: parse --color option in runWorkspaceAction
- CLI: validate --color required for set-color action
- CLI: pass color param to v2 payload
- CLI: update help text and usage summary
- TerminalController: add set_color/clear_color to supportedActions
- TerminalController: handle set_color/clear_color cases via setTabColor

* fix: resolve named colors via palette, improve clear_color response

* fix: validate hex input via normalizedHex, fix synopsis typo
2026-03-19 22:34:31 -07:00
Austin Wang
b0ffe7a4cd
Fix browser image copy pasteboard data (#1850) 2026-03-19 22:20:09 -07:00
Austin Wang
638f74f42e
Fix browser pane file drops hanging on Uploading (#1843)
* Add regression test for browser file drop uploads

* Fix browser pane file drop upload lifecycle
2026-03-19 21:23:11 -07:00
Matt Van Horn
f0f734de0a
feat(dialog): show tab name in close tab confirmation
Include the panel's custom title, terminal title, or directory name in
the close tab confirmation dialog's informative text so users know which
tab will be closed. Falls back to the generic message when no name is
available. The dialog title stays "Close tab?" for consistency with the
close-confirmation detection in AppDelegate.

Fixes #1603

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 21:19:36 -07:00
Austin Wang
ed18e32d11
Fix terminal pane drag/drop handoff delay (#1837)
* Fix terminal pane portal handoff after drag

* Fix terminal portal handoff during split churn

* Fix terminal host handoff for same-pane rebuilds
2026-03-19 20:37:32 -07:00
Lawrence Chen
944e43ed21
Merge pull request #1799 from manaflow-ai/task-cmux-ssh-notify-blue-border
Fix cmux ssh notify surface targeting
2026-03-19 18:37:03 -07:00
Grimmer Kang
4b0ae5180d fix: read working directory from panelDirectories instead of TerminalPanel
TerminalPanel.directory is never updated (updateDirectory() is
never called anywhere). Workspace.panelDirectories is kept up to
date via updatePanelDirectory() from OSC 7 / shell integration.

Before: working directory always returns ""
After:  working directory returns correct cwd (e.g. "/Users/grimmer")

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 04:15:44 +08:00
Grimmer Kang
cf5162ff4a fix: enable AppleScript by always returning true for isAppleScriptEnabled
The underlying Ghostty fork does not include the `macos-applescript`
config key (added in upstream ghostty commit 25fa58143, 2026-03-06).
As a result, `appleScriptAutomationEnabled()` always returns false,
causing `scriptWindows` to return an empty array.

This makes `count windows`, `every window`, `front window`, and all
AppleScript window/tab/terminal access silently return empty results.

Fix: always return true from `isAppleScriptEnabled` until the fork
is updated with the upstream config key.

Test results (before fix):
  osascript -e 'tell application "cmux" to count windows'  →  0
  osascript -e 'tell application "cmux" to get version'    →  0.62.2

Test results (after fix):
  osascript -e 'tell application "cmux DEV ..." to count windows'  →  1
  osascript -e 'tell application "cmux DEV ..." to count terminals of tab 1 of window 1'  →  works
  osascript -e 'tell application "cmux DEV ..." to input text "..." to terminal 1 of ...'  →  works

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 04:01:58 +08:00
Lawrence Chen
183c5601be
Make remote sidebar directory canonicalization preserve live paths 2026-03-19 01:23:53 -07:00
Lawrence Chen
b301218405
Honor explicit notification surface targets 2026-03-19 01:21:18 -07:00
Lawrence Chen
0010e10bf5
Stabilize sidebar directory ordering when split focus changes (#1798)
* Add sidebar directory ordering regression test

* Stabilize sidebar directory ordering

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-19 01:05:12 -07:00
Lawrence Chen
7cbac356fc
Add optional single-click focus for inactive panes (#1796)
* Add failing first-click pane focus tests

* Enable optional first-click focus for inactive panes

* Address PR review follow-ups

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-19 01:01:10 -07:00
Austin Wang
e203c51c7a
Show update-available banner automatically on launch (#1651)
* Show update-available banner automatically on launch

Probe for updates immediately on launch via Sparkle's
checkForUpdateInformation() so the sidebar surfaces a passive update
indicator without waiting for the 24h scheduler. When Sparkle detects
an available update in the background, the pill now shows
"Update Available: X.Y.Z" with accent styling while the updater is
idle. Clicking it triggers the full interactive update flow.

Also fixes thread safety in delegate callbacks by dispatching
@Published mutations to the main queue.

Closes #1643

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

* Add periodic background update probe every 15 minutes

The launch-only probe wouldn't catch updates published while the app
is already running. Add a repeating 15-minute timer that calls
checkForUpdateInformation() so the sidebar banner appears within a
reasonable window after a new version is published.

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

* Change background update probe interval to 30 minutes

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

* Change update check interval to 1 hour and migrate existing users

Reduce Sparkle's scheduled check interval from 24h to 1h so update
banners appear sooner. Migrate users stuck on the old 24h default by
bumping the migration key to v2. Align background probe interval with
the Sparkle check interval instead of hardcoding 30 minutes.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 12:30:44 -07:00
Lawrence Chen
637a0eed13
Add command palette minimal mode actions 2026-03-18 04:18:11 -07:00
Lawrence Chen
1e908b2b75
Merge origin/main into feat-hidden-titlebar-minimalism-reset 2026-03-18 04:05:43 -07:00
Lawrence Chen
1311d4aec3
Merge pull request #1740 from manaflow-ai/task-command-palette-check-ordering
Fix command palette ordering for check query
2026-03-18 03:52:10 -07:00
Lawrence Chen
d63f852719
Stabilize command palette ordering UI test 2026-03-18 03:34:36 -07:00
Lawrence Chen
8512e6d8a5
fix: skip identical session autosave writes (#1732)
* test: cover repeated identical session saves

* fix: skip identical session snapshot writes

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-18 03:24:40 -07:00
Lawrence Chen
2c81192299
Prefer command palette title matches over keywords 2026-03-18 03:13:37 -07:00
Lawrence Chen
cb4197ecee
Make founders email selectable in feedback success view (#1733)
Add .textSelection(.enabled) to the success body text so users can
select and copy the founders@manaflow.com email address.

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-18 02:59:55 -07:00
Lawrence Chen
de1aa7a6ae
Include hardware details in feedback submissions (#1726)
Add chip (e.g. Apple M1 Pro), RAM, hardware model, architecture
(arm64/x86_64), and display info to feedback metadata. All fields are
non-sensitive system properties collected via sysctlbyname, ProcessInfo,
and NSScreen. Server-side route accepts and renders the new fields in
both plain text and HTML email bodies.

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-18 02:59:16 -07:00
Austin Wang
2f08e1bee0
Revert "fix: repair NIGHTLY Sparkle quarantine metadata (#1703)" (#1725)
This reverts commit 629b63dfb8.
2026-03-18 01:56:36 -07:00