Commit graph

74 commits

Author SHA1 Message Date
Lawrence Chen
7da2357a16 Merge remote-tracking branch 'origin/main' into pr-374-ssh-remote-cli-relay
# Conflicts:
#	CLI/cmux.swift
#	Sources/ContentView.swift
#	Sources/GhosttyTerminalView.swift
#	Sources/Panels/TerminalPanel.swift
#	Sources/TabManager.swift
#	Sources/TerminalController.swift
#	Sources/Workspace.swift
2026-02-24 17:57:15 -08:00
Lawrence Chen
2877531ea2
Auto-focus omnibar when focusing blank browser surfaces (#448)
* Auto-focus omnibar when focusing blank browser surfaces

* Fix browser omnibar autofocus across pane and palette paths

* Fix Cmd+P switcher omnibar autofocus timing
2026-02-24 16:00:03 -08:00
Lawrence Chen
7ee3831eb5
Merge pull request #317 from manaflow-ai/issue-143-session-persistence
Implement session persistence pass 1 (windows/workspaces/scrollback)
2026-02-24 15:25:46 -08:00
Lawrence Chen
37be8efeb0 Print browser console/errors in non-JSON mode 2026-02-24 14:57:55 -08:00
Lawrence Chen
03b05c0f84 Fix browser chrome contrast for mixed light/dark themes 2026-02-24 14:36:13 -08:00
Lawrence Chen
6c6f363e4b Guard terminal onFocus from re-entrant focus loops 2026-02-24 14:35:10 -08:00
Lawrence Chen
9db730718b Fix browser eval CLI output 2026-02-24 14:29:01 -08:00
Lawrence Chen
c56ef67750 Fix browser chrome contrast for mixed light/dark themes 2026-02-24 14:05:45 -08:00
Lawrence Chen
fb1802a54d Guard terminal onFocus from re-entrant focus loops 2026-02-23 20:20:55 -08:00
Lawrence Chen
ea33e3adbd Merge remote-tracking branch 'origin/main' into pr-317-session-persistence
# Conflicts:
#	Sources/AppDelegate.swift
2026-02-23 19:20:56 -08:00
Lawrence Chen
f3fc880468 Guard self-hosted CI from fork pull requests 2026-02-23 14:58:17 -08:00
Lawrence Chen
6eeca9c5da Merge remote-tracking branch 'origin/main' into pr-317-session-persistence
# Conflicts:
#	Sources/AppDelegate.swift
#	Sources/cmuxApp.swift
2026-02-23 14:58:16 -08:00
austinpower1258
4bc3da65b6 Fix terminal/web portal overflow during narrow pane resizing 2026-02-23 12:26:05 -08:00
Raghav Pillai
325abe6ea6 Enable stream-local forwarding in SSH fixture
- add AllowStreamLocalForwarding yes to test SSH server config
- add StreamLocalBindUnlink yes to allow binding to existing socket paths
- update ssh-remote fixture to support stream local socket forwarding scenarios
2026-02-23 18:24:34 +02:00
Lawrence Chen
bf69fcbdcf Hide apply-update command until update is available 2026-02-23 04:56:48 -08:00
Lawrence Chen
82d2d0e474 Add command palette apply and attempt update actions 2026-02-23 04:53:25 -08:00
Lawrence Chen
8d03657c94
Command palette caret uses white tint (#361)
* Set command palette caret tint to white

* Add command palette window actions and shortcut sync
2026-02-23 04:08:01 -08:00
Lawrence Chen
1d71303d18
Merge pull request #331 from manaflow-ai/task-307-configurable-open-wrapper
Respect open-wrapper browser settings and preserve PR 307 history
2026-02-22 19:38:17 -08:00
Lawrence Chen
3afa345f3a Harden open wrapper for Bash 3 and IDN host parity 2026-02-22 18:38:37 -08:00
Lawrence Chen
af2b276e98 Make browser omnibar squircle 2026-02-22 18:36:27 -08:00
Lawrence Chen
0046b674aa Split open-wrapper interception into its own setting 2026-02-22 18:26:07 -08:00
Lawrence Chen
8c149428c3
Set default workspace indicator style to left rail (#332) 2026-02-22 18:25:07 -08:00
Lawrence Chen
2428ae5dbd Respect browser link settings in open wrapper 2026-02-22 18:13:14 -08:00
Lawrence Chen
927b0eb2d1 Implement session persistence pass 1 with multi-window restore 2026-02-22 15:39:59 -08:00
Lawrence Chen
ea87076fe4 Fix CLI exit code on v1 auth errors 2026-02-22 01:37:42 -08:00
Lawrence Chen
a205028b2e Strengthen socket access integration coverage
Make tests/test_socket_access.py deterministic across environments and add password-mode auth integration checks (v1 and v2).
2026-02-22 01:08:25 -08:00
Lawrence Chen
f184f882c0 Add CLI --version output and regression test 2026-02-22 00:16:01 -08:00
Lawrence Chen
ed0d246039
Slim browser omnibar and add button hover/press states (#271) 2026-02-21 04:39:27 -08:00
Lawrence Chen
e0a7c32f62 Fix cmux ssh shell integration niceties and prove with docker e2e 2026-02-21 02:00:24 -08:00
Lawrence Chen
9c54bc9e5d Add cmux ssh remote workspaces with auto SSH forwarding 2026-02-20 21:12:39 -08:00
Lawrence Chen
cf38330483 Address review: allow favicon refresh across history URL changes 2026-02-20 20:23:16 -08:00
Lawrence Chen
26a88a4b2e Fix favicon race during back/forward navigation 2026-02-20 20:17:58 -08:00
Lawrence Chen
fe6c9ec1dc Restrict portal pass-through to active drag-motion events 2026-02-20 20:07:54 -08:00
Lawrence Chen
a5c7600458 Harden drag overlay routing and add terminal overlay regression probes 2026-02-20 19:58:58 -08:00
Lawrence Chen
9388358914 Merge remote-tracking branch 'origin/main' into fix-dragdrop-overlay 2026-02-20 19:53:45 -08:00
Lawrence Chen
cf767cf9af Fix bonsplit drag routing and pin submodule commit 2026-02-20 18:47:34 -08:00
Lawrence Chen
f294699670 Fix browser DevTools retry and portal visibility follow-ups 2026-02-20 18:00:20 -08:00
Lawrence Chen
146ac253af Harden file-drop routing for local tab drags 2026-02-20 16:27:12 -08:00
Lawrence Chen
a5d724cf28 Unify drag overlay routing and add regression coverage 2026-02-20 16:09:42 -08:00
Austin Wang
f455af4541
Fix issue #185 overlay recursion hardening and scroll regression (#193) 2026-02-20 14:51:44 -08:00
Lawrence Chen
fc1de08561
Fix homebrew SHA mismatch race condition (#111)
Root cause: update-homebrew.yml triggered on release:published, which fires
before softprops/action-gh-release finishes uploading assets. The workflow
downloaded a 404 page instead of the DMG and committed its SHA.

Fix:
- Change trigger from release:published to workflow_run (fires after the
  release workflow completes, guaranteeing assets are uploaded)
- Add download validation with retries and file size checks
- Add SHA verification step before committing to the cask
- Add homebrew cask update to build-sign-upload.sh for local releases
- Add regression test (tests/test_homebrew_sha.sh)
- Update /release and /release-local skills with homebrew verification steps

Fixes #110
2026-02-19 17:44:00 -08:00
Lawrence Chen
de666ff05b Fix split blackout race and stabilize focus handoff 2026-02-19 17:10:27 -08:00
Lawrence Chen
1b2688233f Animate terminal drop overlay and add stale tabtransfer click regression 2026-02-19 15:22:30 -08:00
Lawrence Chen
631f689aba Fix stale drag overlay click routing and add real-click regression test 2026-02-19 05:21:15 -08:00
Lawrence Chen
9642bb59fc
Move port scanning from shell to app-side with batching (#100)
* Move port scanning from shell to app-side with batching

Replace per-shell `ps -axo + lsof` scanning with a centralized
PortScanner singleton in the app. Each shell now sends lightweight
`report_tty` (once per session) and `ports_kick` (on preexec/precmd)
socket messages. The app coalesces kicks across all panels and runs a
single `ps -t <ttys> + lsof -p <pids>` covering every active panel.

Also fixes a macOS 26 Tahoe regression where `getsockopt(LOCAL_PEERPID)`
returns ENOTCONN on accepted sockets when the peer disconnects before
the handler thread starts. This was silently breaking ALL socket
commands sent via ncat --send-only. The fix captures the peer PID in
the accept loop immediately after accept(), and falls back to
LOCAL_PEERCRED (uid check) when the PID lookup fails.

* Fix PR review feedback: burst timing and auth comment clarity

- P2: burstDelays were accumulating (0.5+1.5+3+... = ~22.5s) instead of
  firing at absolute offsets from burst start. Now uses burstStart anchor
  so scans fire at 0.5s, 1.5s, 3s, 5s, 7.5s, 10s as intended.

- P1: Clarify LOCAL_PEERCRED fallback rationale — same security boundary
  as socket file permissions (0600), does not widen attack surface.
  Long-lived connections still get full descendant check via LOCAL_PEERPID.
2026-02-19 01:04:47 -08:00
Lawrence Chen
5fc4df467a
Fix omnibar Cmd+L infinite focus loop causing 100% CPU (#97)
The browser omnibar's updateNSView and controlTextDidEndEditing
were both dispatching makeFirstResponder calls without any guard
against re-dispatch. Each makeFirstResponder triggers SwiftUI's
FirstResponderObserver, which re-evaluates the view graph, which
calls updateNSView again, creating an infinite loop via the main
dispatch queue.

Fix: Add a pendingFocusRequest flag on the coordinator to prevent
re-dispatching while a focus/blur request is already in flight.
Also add nsView.currentEditor() != nil to the isFirstResponder
check so the field is recognized as focused during the transition
when the field editor (not the field itself) is first responder.
2026-02-18 23:18:08 -08:00
Lawrence Chen
ed7f6301d0 Improve terminal hosting depth and workspace mount policy 2026-02-18 19:55:41 -08:00
Lawrence Chen
51a67e31fd
Socket access control: process ancestry check (#58)
* Socket access control: process ancestry check + file permissions

Redesign socket control modes from (off, notifications, full) to
(off, cmuxOnly, allowAll):

- cmuxOnly (default): uses LOCAL_PEERPID + sysctl process tree walk to
  verify the connecting process is a descendant of cmux. External
  processes (SSH, other terminals) are rejected.
- allowAll: hidden mode accessible only via CMUX_SOCKET_MODE=allowAll
  env var, skips ancestry check. Legacy "full"/"notifications" env
  values map here for backward compat.
- off: disables socket entirely.

Security hardening:
- Server: chmod 0600 on socket after bind (owner-only access)
- CLI: stat() ownership check before connect (reject fake sockets)

Removes per-command allow-list (isCommandAllowed) — once a process
passes the ancestry check, all commands are available.

Includes migration for persisted UserDefaults values and env var
aliases (cmux_only, cmux-only, allow_all, allow-all).

* Add /sync-branch skill for submodule + main sync
2026-02-18 01:09:24 -08:00
Lawrence Chen
9fd3cc2a6c Add file drop support from Finder into terminal splits
Nested NSHostingController layers (from bonsplit's SinglePaneWrapper)
prevent AppKit's NSDraggingDestination routing from reaching terminal
views. Install a transparent FileDropOverlayView on the window's theme
frame that intercepts file drags and forwards drops to the GhosttyNSView
under the cursor. Mouse events pass through via a hide-send-unhide
pattern.

Fix y-axis inversion in split targeting: hitTest expects coordinates in
the receiver's superview's coordinate system, not the receiver's own.
Converting to contentView's coords flipped y because NSHostingView is
flipped, causing top/bottom split drops to land in the wrong terminal.

Also adds bonsplit onFileDrop API, PaneDragContainerView, and
drop_hit_test socket command for testing coordinate-to-terminal mapping.
2026-02-17 21:55:31 -08:00
Lawrence Chen
c2fdd48290
Release v1.36.0 (#47)
* Fix multi-workspace drag/drop, WebView click focus, and add regression tests

- Wire bonsplit isInteractive to workspace active state so inactive
  workspace NSViews are hidden from AppKit event routing
- Add CmuxWebView.mouseDown notification for browser panel focus
  tracking (AppKit delivers clicks to WKWebView, not SwiftUI overlays)
- Add multi-workspace focus regression test covering isHidden fix,
  rapid workspace switching, and browser panel focus routing

* Bump version to 1.36.0
2026-02-17 04:04:29 -08:00