Commit graph

1543 commits

Author SHA1 Message Date
Lawrence Chen
832426af56
Stabilize SSH remote flow after merging main 2026-03-16 23:57:48 -07:00
Lawrence Chen
03dc055138
Merge remote-tracking branch 'origin/main' into pr-ssh-stack-main
# Conflicts:
#	CLI/cmux.swift
#	Sources/Panels/BrowserPanel.swift
#	Sources/TabManager.swift
#	Sources/Workspace.swift
#	cmuxTests/GhosttyConfigTests.swift
2026-03-16 23:16:12 -07:00
Lawrence Chen
746fb8e5ec
Merge pull request #318 from manaflow-ai/issue-122-import-browser-cookies-history-settings
Browser: import data from detected installed browsers
2026-03-16 22:42:40 -07:00
Lawrence Chen
dc6bcb259a
fix: address browser import review feedback 2026-03-16 22:30:09 -07:00
Austin Wang
150600d089
Fix #1574: remove top update banner in sidebar (#1575)
* test: cover sidebar update indicator regression

* fix: remove duplicate sidebar update banner
2026-03-16 22:28:43 -07:00
Austin Wang
9bf6ad9457
Avoid blocking browser PR metadata updates (#1564) 2026-03-16 22:10:15 -07:00
Lawrence Chen
92cb42262c
feat: add browser profile mapping import flow 2026-03-16 21:22:39 -07:00
Austin Wang
7f220dc8e4
Fix sidebar PR badges for restored workspaces (#1570)
* test: cover sidebar PR explicit branch fallback

* fix: restore sidebar PR badges for workspace branches

* test: preserve sidebar PR badge on first prompt

* fix: keep sidebar PR badges through first prompt
2026-03-16 21:09:02 -07:00
Lawrence Chen
eb95cb38ce
Merge pull request #1568 from manaflow-ai/task-split-transparency-disappears
Fix split transparency regression
2026-03-16 21:08:36 -07:00
Austin Wang
1480171e5e
Support folder drops on dock icon (#1571) 2026-03-16 21:00:30 -07:00
Lawrence Chen
975a850935
Update bonsplit for split transparency 2026-03-16 20:57:04 -07:00
Lawrence Chen
08854f14db
Update bonsplit for split transparency 2026-03-16 20:42:21 -07:00
Austin Wang
971b2b4e77
fix: show sidebar update banner from background checks (#1543) 2026-03-16 20:40:35 -07:00
Lawrence Chen
3b507d361f
fix: require pinned ids in sidebar drop planner (#1505)
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-15 21:48:51 -07:00
Lawrence Chen
7a9a6a550c
Keep pinned workspaces above the sidebar pin boundary (#1503)
* test: cover pinned workspace reorder boundary

* fix: keep pinned workspaces above drag boundary

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-15 21:31:30 -07:00
Lawrence Chen
225c5b83bc Fix CI: remove broken tests for deleted function, fix review comments
- Remove tests for shouldLoadReleaseAppSupportGhosttyConfig (function was
  deleted but tests survived, breaking CI on all branches)
- Fix missed localization on optional-chain notification fallback path
- Validate explicit-but-empty --pid as invalid input
2026-03-15 21:08:02 -07:00
Austin Wang
2e4c482c21
Fix Google sign-in infinite loading in browser pane (#1493)
* Add regression test for Google sign-in popup fallback (#1491)

* Fix Google sign-in popup routing regression (#1491)
2026-03-15 18:48:23 -07:00
Austin Wang
bd1788639d
Fix terminal find overlay crash and focus handoff (#1487)
* Add regression tests for terminal find overlay races

* Fix terminal find overlay crash and focus handoff
2026-03-15 18:32:24 -07:00
Manfred Neustifter
6b138f7d9d
feat: support window.open() popup windows (#1150)
* feat: support window.open() popup windows (#742)

Return a live WKWebView from createWebViewWith using WebKit's supplied
configuration, preserving popup browsing-context semantics (window.opener,
postMessage). This fixes OAuth/OIDC flows and any site relying on standard
popup patterns.

- Add BrowserPopupWindowController: NSPanel-based popup with self-retention,
  KVO title/URL, read-only URL label, nested popup depth limit (3),
  insecure-HTTP prompt parity, auth challenge parity, download delegate
- Classifier: scripted requests (window.open) create popups; user-initiated
  actions (Cmd+click, middle-click, context menu) open tabs
- Retarget context menu "Open Link in New Tab" to bypass createWebViewWith,
  wired in both main browser and popup web views
- Cmd+W fast path in AppDelegate for popup windows
- Opener panel owns popup lifecycle; close() tears down all child popups

* fix: Cmd+W closes only the popup, not the parent tab

Add BrowserPopupPanel (NSPanel subclass) that intercepts Cmd+W in
performKeyEquivalent before the swizzled cmux_performKeyEquivalent
can dispatch it to the main menu's "Close Tab" action.

Also refine the popup classifier to reuse browserNavigationShouldOpenInNewTab
for Cmd+click/middle-click detection, add download delegate wiring, and
wire onContextMenuOpenLinkInNewTab for popup web views.

* fix: tighten popup routing and window behavior

* test: cover oversized popup frame clamping

* test: cover plain link-activated popup routing

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-15 17:48:05 -07:00
Max Schmitt
1460c97e85
fix: correct Claude Code hooks config to match actual schema (#1388)
The hooks configuration example used a format that was valid when
originally written but broke across two Claude Code releases:

- v1.0.41: Added `hook_event_name` to hook input, replacing the
  previous field name. The hook script was still reading `.event`,
  causing the case statement to always fall through to unknown.

- v2.1.63: Added HTTP hooks with `{ "type": "command", "command": "..." }`
  object format. Bare string paths in the hooks array are no longer
  valid now that hook type disambiguation is required.

Changes:
- Stop hooks now use the full matcher/hooks object structure
- PostToolUse inner hooks use typed command objects
- Hook script reads `hook_event_name` instead of `event`

Ref: https://docs.anthropic.com/en/docs/claude-code/hooks
2026-03-15 16:49:42 -07:00
Jonathan Wukitsch
9b377a930f
Fix About Panel Newline Escaping (#1298)
* fix: about panel newline escaping

* fix: other languages
2026-03-15 16:49:40 -07:00
zlatkoc
23bfc11b19
Add Startpage as a browser search engine option (#1368)
Add Startpage (startpage.com) to the BrowserSearchEngine enum alongside
Google, DuckDuckGo, Bing, and Kagi. Startpage provides an OpenSearch-
compatible suggestions endpoint at /osuggestions, so autosuggestions
work out of the box using the existing OSJSON parser.

Co-authored-by: Zlatko Cajic <git@zlat.co>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:18:46 -07:00
BillionClaw
5776cd5d81
fix: remove blocking sleep from preexec hook causing command lag (#1444)
When socket connection mode is not 'off', the shell integration runs
_cmux_stop_pr_poll_loop in the preexec hook before every command.
This function had a blocking 'sleep 0.1' call that caused noticeable
lag on every command execution.

The fix replaces the TERM+sleep+KILL pattern with direct SIGKILL.
The PR poll loop is a lightweight background process that only runs
'gh pr view' periodically - it's safe to kill abruptly without
waiting for graceful termination.

Fixes #1436

Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com>
2026-03-15 16:11:07 -07:00
Gale
07ec05b0f1
fix: make Cmd+W close About/Licenses windows instead of terminal tabs (#1473)
* fix: make Cmd+W close auxiliary windows

* test: harden auxiliary window close coverage

* style: normalize auxiliary window helper layout
2026-03-15 16:09:22 -07:00
Gaetan Juvin
dd6feed78f
Fix arrow key glyph matching in customizable shortcuts (#1443)
keyCodeForShortcutKey() did not map arrow glyphs (←→↑↓) to their
macOS key codes (123-126). The shortcut recorder correctly stored
arrow keys as glyphs via storedKey(), but matchShortcut() could
not resolve them back to key codes for ANSI fallback matching.

This only affected non-directional shortcut actions (e.g. Next/Previous
Surface) since pane focus shortcuts use a separate matchDirectionalShortcut()
path that already handles arrow keys.
2026-03-15 15:57:39 -07:00
Ragnar Rova
a7cb968a55
Add configurable sidebar tint color with light/dark mode support (#1465)
- Config: sidebar-background supports plain hex (#336699) or
  light/dark syntax (light:#fbf3db,dark:#103c48)
- Config: sidebar-tint-opacity overrides tint opacity
- Settings UI: per-scheme color pickers, opacity slider (0-70%), reset
- SidebarBackdrop resolves light/dark hex based on @Environment colorScheme
- applySidebarAppearanceToUserDefaults guards on rawSidebarBackground presence
  so UI picks survive appearance toggles when no config is set
- Stale light/dark UserDefaults keys cleared when config switches from
  dual-mode to single or sidebar-background is removed
- applyPreset() and Reset Tint clear per-scheme overrides
- Debug snapshot (combinedPayload + copySidebarConfig) includes new keys
- ColorPicker labels use String(localized:) per localization policy
- Opacity slider capped at 0.7 to match debug view vibrancy constraint

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 15:48:57 -07:00
Lawrence Chen
9bb2816e05
Fix main CI regressions (#1458)
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-15 02:04:33 -07:00
Lawrence Chen
8db9ebb4a9
Merge pull request #1459 from manaflow-ai/task-cmux-themes-helper-not-found
Fix bundled Ghostty theme picker helper packaging
2026-03-14 23:52:20 -07:00
Lawrence Chen
f576d2233f
Bundle Ghostty theme picker helper 2026-03-14 22:40:36 -07:00
Lawrence Chen
2167323153
Add bundled Ghostty helper regression test 2026-03-14 22:30:01 -07:00
Austin Wang
6c203b5144
Prepare 0.62.2 release (#1430) 2026-03-14 03:42:21 -07:00
Lawrence Chen
3fbfd74aa1 Fix socket focus and startup env regressions 2026-03-13 21:55:48 -07:00
Lawrence Chen
60137e0f68 Add regressions for v1 panel focus preservation 2026-03-13 21:55:45 -07:00
Lawrence Chen
6c644d930d
Allow smaller sidebar widths (#1420)
* Add sidebar minimum width UI regression test

* Allow narrower sidebar resizing

* Set smaller sidebar minimum to 180
2026-03-13 21:40:25 -07:00
Lawrence Chen
ca4f4b7c69 Fix browser move and zsh bootstrap regressions 2026-03-13 21:04:48 -07:00
Lawrence Chen
623262493b
Fix stale Claude sidebar status: add missing hooks, OSC suppression, PID sweep (#1306)
* Fix stale Claude status in sidebar by adding missing hooks and OSC suppression

The Claude Code integration only used 3 hooks (SessionStart, Stop, Notification),
leaving gaps that caused stale sidebar status. Now uses 6 hooks:

- SessionEnd: clears status when Claude exits (covers Ctrl+C where Stop doesn't fire)
- UserPromptSubmit: clears "Needs input" and sets "Running" on new prompt
- PreToolUse (async): clears "Needs input" when Claude resumes after permission grant

Also:
- Suppress OSC 9/99 desktop notifications for workspaces with active Claude hook
  sessions to prevent duplicates from the raw OSC path
- Store Claude process PID in status entries for stale-session detection
- Add 30-second sweep timer that checks agent PIDs and clears stale entries
  (safety net for SIGKILL/crash where no hook fires)
- Update wrapper test expectations for the new hook set

Fixes https://github.com/manaflow-ai/cmux/issues/1301

* Don't show "Running" status on Claude launch, only when actually working

SessionStart now registers the PID for tracking and OSC suppression via
set_agent_pid without setting a visible status entry. "Running" only
appears when the user submits a prompt (UserPromptSubmit) or Claude
starts using tools (PreToolUse).

Added set_agent_pid / clear_agent_pid socket commands to decouple PID
tracking from visible status entries. OSC suppression checks agentPIDs
instead of statusEntries so it works during the initial idle period.

* Don't restore status entries across app restarts

Status entries are ephemeral runtime state tied to running processes
(e.g. claude_code "Running"). Restoring them after restart shows stale
status for processes that no longer exist.

* Address PR review comments and remove debug logging

- session-end: only clear status/PID/notifications when Stop didn't fire first
- PID sweep: check errno == ESRCH instead of treating all kill(pid,0) failures as dead
- Validate CMUX_CLAUDE_PID > 0
- Propagate tracked PID in pre-tool-use setClaudeStatus
- OSC suppression: use tabManagerFor(tabId:) for multi-window support
- clearAgentPID: resolve tab UUID before async dispatch
- restoreSessionSnapshot: also clear agentPIDs alongside statusEntries
- Fix AskUserQuestion surfaceId overwrite (wrong workspace notification)
- Fix notification text matching for "Claude Code needs your attention"
- AskUserQuestion: render option labels as bracketed inline text
- Remove artificial text truncation limits
- Remove temporary JSONL debug logging from all handlers

* Use resolveTabIdForSidebarMutation in clearAgentPID
2026-03-13 20:47:42 -07:00
Lawrence Chen
902ee03019 Fix SSH transport dedupe and loopback review issues 2026-03-13 20:23:44 -07:00
Austin Wang
85ebbb686f
Merge pull request #1417 from manaflow-ai/issue-1414-cmd-palette-arrow-keys
Fix command palette command-mode shortcut and navigation
2026-03-13 20:15:28 -07:00
austinpower1258
c1e264f325 Fix command palette command mode navigation 2026-03-13 20:14:03 -07:00
austinpower1258
50c59babc1 Add regression tests for command palette shortcut routing 2026-03-13 20:14:01 -07:00
Lawrence Chen
b81adaf67c
Merge pull request #1408 from manaflow-ai/feat-cli-sentry-release-tagging
Tag CLI Sentry events with app release
2026-03-13 20:03:40 -07:00
Lawrence Chen
919c9b1632
Merge pull request #1415 from manaflow-ai/task-throttle-socket-listener-start-failures
Throttle repeated socket listener start failures
2026-03-13 20:02:56 -07:00
Lawrence Chen
5e7458b920 Fix SSH workspace priming and restore state 2026-03-13 20:01:26 -07:00
Lawrence Chen
2a8d4475a3
Throttle repeated socket listener start failures 2026-03-13 19:54:09 -07:00
Austin Wang
80fea629f5
Merge pull request #1413 from manaflow-ai/issue-1409-omnibar-backspace-arrow
Fix omnibar backspace/arrow key loss after prefix deletion
2026-03-13 18:17:54 -07:00
austinpower1258
48ec60946f Replace command palette SwiftUI TextField with native AppKit NSTextField
The SwiftUI TextField lost arrow-key and backspace handlers when the
query prefix (">") was deleted, because the scope transition tore down
the .onKeyPress modifiers. Using an NSViewRepresentable with an AppKit
field editor keeps navigation commands (up/down/enter/escape) on the
native delegate, making them immune to SwiftUI scope changes.

Fixes #1409

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:16:57 -07:00
Lawrence Chen
98f5553335
Fix macOS dictation NSTextInputClient conformance (#1410)
* Add dictation text input regression tests

* Fix dictation text input client conformance

* Fix dictation caret rect anchoring

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-13 18:14:02 -07:00
Lawrence Chen
2eae782739 Merge remote-tracking branch 'origin/main' into pr-ssh-stack-main
# Conflicts:
#	.github/workflows/ci.yml
#	CLI/cmux.swift
#	Sources/GhosttyTerminalView.swift
#	Sources/SocketControlSettings.swift
#	Sources/TabManager.swift
#	Sources/TerminalController.swift
#	Sources/Workspace.swift
#	ghostty
#	scripts/reload.sh
2026-03-13 17:56:38 -07:00
Lawrence Chen
f90bcbc862
Merge pull request #1382 from manaflow-ai/task-cmd-p-search-all-surfaces
Add Cmd+P all-surface search option
2026-03-13 17:55:10 -07:00
Lawrence Chen
89c1d6c255
Tag CLI Sentry events with app release 2026-03-13 17:53:25 -07:00