Skip to content

cmux-next: delete bonsplit, the legacy app and legacy-only packages (B0-B2) - #15659

Merged
lawrencecchen merged 4 commits into
feat-cmux-nextfrom
feat-cmux-next-delete-b1
Sep 29, 2026
Merged

lawrencecchen merged 4 commits into
feat-cmux-nextfrom
feat-cmux-next-delete-b1

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Deletes bonsplit and the legacy macOS app on the cmux-next branch, per batches B0, B1 and B2 of plans/cmux-next/deletion.md. The net change is about 1.40M lines deleted.

  • B0+B1 (8b3192d, 1,067 lines added, 1,276,479 deleted): the 19 Sources/ files that cmux-cli compiles move to CLI/. Deleted: the vendor/bonsplit submodule, Sources/, cmuxTests/, cmuxUITests/, TunnelExtension/, vendor/WireGuardKit, cmux-Bridging-Header.h, and the 9 bonsplit-dependent packages plus CmuxCloudTunnelCore. The legacy targets cmux, cmuxTests, cmuxUITests, CmuxDockTilePlugin and cmuxTunnelExtension go, with 4 schemes. cmux.xcodeproj keeps cmux-next, cmux-cli and cmuxCLITests; the pbxproj was pruned by object reachability and goes from 18,771 to about 2,100 lines. Legacy-only CI lanes and their tooling are deleted, and the needs lists and aggregators are fixed. reload.sh always builds cmux-next. Skills and contributor docs no longer point agents at deleted targets.
  • B2 (c62f055, 76 lines added, 122,349 deleted): 22 legacy-only macOS packages, CmuxTerminalPrediction, CmuxSyntaxHighlighting, the sidebar-extension Examples and Native/CommandPaletteNucleoFFI. cmux-cli no longer links 4 packages it never imported, and swift-syntax drops out of Package.resolved.

Kept: CmuxUpdater (the new updater uses it), CmuxNotifications, CmuxGit and the other X1 candidates, CmuxPhonePush, CmuxAPIClient/openapi.json, and everything in web/, cmux-tui/ and ios/.

Verification

  • xcodebuild -scheme cmux Debug and -scheme cmux-cli Debug succeed. cmux-cli Release also succeeds as universal (arm64 + x86_64), which proves the removed links were dead.
  • swift build --build-tests in Packages/macOS/CmuxNext succeeds.
  • ./scripts/reload.sh --tag nxdel --no-global-cli-links succeeds. The app launched with a clean env, CMUX_NEXT_NO_ACTIVATE=1 and CMUX_NEXT_SOCKET_MODE=automation, and CMUX_TAG=nxdel scripts/cmux-debug-cli.sh tree returned the window tree after B1 and after B2.
  • check-no-godfiles.sh and check-concurrency.sh pass.
  • plutil -lint and xcodebuild -list pass on the project, and check-workspace-package-groups.py passes.
  • actionlint is clean. The CI tool tests pass except 5 that also fail on the parent branch. guards-local.sh --all fails 11 steps: 9 are known failures on the parent, and 2 fail only under parallel load.
  • Not run: iOS build (no iOS input changed), cmux-cli-tests (runs on CI), macOS CI lanes, tests_v2 compat suite.

Changelog

none

🤖 Generated with Claude Code


Summary by cubic

Deletes the legacy macOS app, the vendor/bonsplit submodule, and all legacy-only packages on the cmux-next branch, following batches B0–B2 of plans/cmux-next/deletion.md and removing roughly 1.4M lines.

B0+B1

  • The 19 Sources/ files cmux-cli compiles move to CLI/, and cmux.xcodeproj now keeps only cmux-next, cmux-cli, and cmuxCLITests.
  • Removes the legacy cmux, cmuxTests, cmuxUITests, CmuxDockTilePlugin, and cmuxTunnelExtension targets, their schemes and CI lanes, TunnelExtension/, vendor/WireGuardKit, the bridging header, and the 9 bonsplit-dependent packages plus CmuxCloudTunnelCore.
  • reload.sh always builds cmux-next; skills and contributor docs no longer reference deleted targets.

B2

  • Removes 22 legacy-only macOS packages, CmuxTerminalPrediction, CmuxSyntaxHighlighting, the sidebar-extension Examples, and Native/CommandPaletteNucleoFFI.
  • cmux-cli stops linking 4 packages it never imported; swift-syntax leaves Package.resolved.

Kept: CmuxUpdater, CmuxNotifications, CmuxGit and the other X1 candidates, CmuxPhonePush, CmuxAPIClient/openapi.json, and everything in web/, cmux-tui/, and ios/.

Verification: xcodebuild Debug succeeds for cmux and cmux-cli; cmux-cli Release also builds as universal, confirming the removed links were dead. swift build --build-tests in Packages/macOS/CmuxNext succeeds, and reload.sh with a clean env returns the window tree. iOS build, cmux-cli-tests (runs on CI), macOS CI lanes, and the tests_v2 compat suite were not run.

Written for commit c62f055. Summary will update on new commits.

Review in cubic

lawrencecchen and others added 4 commits September 29, 2026 09:38
B0: move the 19 Sources/ files the cmux-cli target compiles into CLI/ and
reparent their file references to the CLI group, so the CLI no longer
depends on Sources/.

B1: delete the vendor/bonsplit submodule, Sources/, cmuxTests/,
cmuxUITests/, cmux-Bridging-Header.h, TunnelExtension/, vendor/WireGuardKit
and the packages that only the legacy app built (CmuxPanes, CmuxBrowser,
CmuxTerminal, CmuxWorkspaces, CmuxRemoteSession, CmuxCloudTui,
CmuxAppKitSupportUI, CmuxCloud, CmuxCloudTunnelCore). Drop the tunnel
system extension (decision X2 default: cmux-next uses the userspace
`cmux-tui wg hub`).

cmux.xcodeproj keeps cmux-next, cmux-cli and cmuxCLITests; the legacy
cmux, cmuxTests, cmuxUITests, CmuxDockTilePlugin and cmuxTunnelExtension
targets, their groups, package references (Sparkle, PostHog, MarkdownUI,
bonsplit, WireGuardKit) and the cmux-legacy/cmux-unit/cmux-ci/
cmux-numeric-locale schemes are removed. Package.resolved re-resolved.

CI: delete the legacy-only lanes (app-host unit tests, UI tests, e2e,
tmux corpus, palette benchmarks, compat, full suite, regression bisect,
pr-media, cloud deadline/task tests, paste worker) and their scripts and
tests; fix needs/aggregators in ci.yml and ci-macos.yml. reload.sh always
builds cmux-next and drops the legacy cmux-tui resolver/installer.
sync-test-wiring and wire-app-sources are gone. Skills and contributor
docs no longer point agents at deleted targets or files.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ext-delete-b1

# Conflicts:
#	cmux.xcodeproj/project.pbxproj
…ia CmuxNextUpdater

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d B2)

Delete the macOS packages only the legacy app linked (CmuxSettingsUI,
CmuxRemoteWorkspace, CmuxCommandPalette, CmuxCanvasUI, CmuxSidebar,
CmuxMobileHost, CmuxRemoteDaemon, CmuxCloudMachines, CMUXProjectModel,
CmuxCanvas, CmuxExtensionKit, CmuxLiveEval, CmuxWindowing,
CmuxSudoBrokerUI, CmuxFilePreviewCore, CmuxHive, CmuxSidebarProviderKit,
CmuxCloudImagePaste, CmuxAgentSessionStore, CmuxTestSupport,
CmuxCloudBannerCore, CmuxDiffComments), Shared CmuxTerminalPrediction and
CmuxSyntaxHighlighting, the sidebar extension Examples and
Native/CommandPaletteNucleoFFI.

cmux-cli drops CmuxSwiftRender, CmuxSwiftRenderUI,
CmuxSidebarInterpreterService and CmuxCloudMachines: it imported none of
them. swift-syntax leaves Package.resolved. CmuxUpdater/Notifications/Git
and the other X1 reuse candidates stay.

CI: package-test-lane loses the deleted packages and the nucleo/Rust
phase; cloud-machine-tests.yml, reload-extension.sh and the sidebar
extension-point script go. The remote relay rule now states that
RemoteRelayCommandPolicy left with CmuxRemoteWorkspace and any future
cmux-next relay must default to deny.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: f20a54c1-f85b-4e8a-b48f-06ab8dedeb30

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@lawrencecchen
lawrencecchen merged commit a4a0868 into feat-cmux-next Sep 29, 2026
54 of 60 checks passed
@lawrencecchen
lawrencecchen deleted the feat-cmux-next-delete-b1 branch September 29, 2026 17:04
teamleaderleo added a commit that referenced this pull request Oct 1, 2026
…p's removal

browser-design-mode-runtime.test.ts reads Packages/macOS/CmuxBrowser/
.../BrowserDesignModeRuntime.js, which #15659 deleted with the legacy app,
so react-apps-check fails with ENOENT for any feat-cmux-next PR that
touches webviews.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD
teamleaderleo added a commit that referenced this pull request Oct 1, 2026
…16231)

* webviews: bring the React acpmux agent pane onto cmux-next

Ports webviews/src/agent-session/acpmux and its preview harness from
cmux#16042 (feat-acpmux-chat-pane 86e251b) as-is, plus three small
changes the cmux-next host needs:

- a mock transport: when the host answers ready with transport "mock"
  the page keeps an in-memory transcript and answers chat actions
  itself, so the pane demos without an acpmux daemon (mock.ts);
- newSession in the host config: a pane opened as New Agent Chat does
  not attach the most recent session, the first prompt creates one
  (initialSession in direct.ts);
- ready retries back off from 250 ms to 30 s instead of retrying four
  times a second forever when the host has no daemon.

Adds marked and @chenglou/pretext to webviews. Tailwind scans
webviews/src, so the diff viewer's generated chunk changes by one line;
regenerated with scripts/build-webviews-app.sh.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* cmux-next: CmuxNextAgentPane hosts the React agent pane and the acpmux handshake

New module (Package.swift: target CmuxNextAgentPane -> Design, Actions,
test target CmuxNextAgentPaneTests; CmuxNextApp depends on it). Swift
does only the versioned host handshake and hosts the web view; the page
talks to acpmux's authenticated loopback WebSocket itself.

- AgentPaneHandshake (protocol 1): transport, endpoint, token,
  sessionId, newSession, matching the TypeScript AcpmuxHostConfig.
- AcpmuxHost finds the daemon on its unix socket (_acpmux/status ->
  webUrl) or starts one (daemon run --ready-fd 3, detached through a
  job-control shell so it outlives the app) and splits webUrl into a
  ws:// endpoint and token. Every step has a deadline; concurrent panes
  share one lookup. MockAgentPaneHost answers with the mock transport.
- AcpmuxEnvironment: bundled Contents/Resources/bin/acpmux, then PATH
  and the usual install dirs. Release shares ~/.acpmux (or ACPMUX_HOME)
  with the CLI; a tagged build gets a tag-private home and --listen
  127.0.0.1:0. The socket path mirrors acpmux config::socket_path().
- AgentPaneView: WKWebView on the bundled page; only its main frame may
  ask for the handshake; only the bundled file loads, clicked http(s)
  links open outside; theme from the view's ThemeScope tokens.
- Resources/agent-pane/index.html is one self-contained file built by
  scripts/cmux-next/build-agent-pane-web.sh (CSP: inline only, loopback
  WebSocket only). ci-web verifies it is current (--check).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* cmux-next: New Agent Chat opens the agent pane in a tab

palette.newAgentChat was typed-unavailable. It is now bound through
AgentPaneActions and reaches every entrypoint from its descriptor: the
palette, the File menu, the tab strip's new-tab menu, shortcuts
(shortcuts.palette.newAgentChat) and the CLI (cmux agent new-chat).
Open Terminal as Chat, Teams and Computer Use stay typed-unavailable.

cmux-tui has no agent tab kind yet, so agent tabs are frontend-local
like LocalBrowserTab (prefix local-agent:, AgentTabStore on
AppServices): not restored after relaunch, while the acpmux sessions
they show persist in acpmux. The App hooks are the smallest set that
lists, shows, closes and duplicates them: TabContent.agent,
PaneController snapshot/content/close, the diagnostics and find
switches. CMUX_NEXT_AGENT_PANE_MOCK=1 uses the mock host.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* cmux-next agent pane: mark nested error and state types nonisolated

They are thrown and built on Network.framework and dispatch callback
queues; under the package's MainActor default isolation a nested type
does not inherit its parent's nonisolated.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* cmux-next agent pane: find the same acpmux daemon as cmux acp

cmux-tui now runs acpmux in-process (cmux acp, or an acpmux symlink) and
gives a tagged build ~/.acpmux/tags/<slug> (#16174, acp::tagged_home).
Use the same home and slug rule, and honour ACPMUX_HOME and
ACPMUX_SOCKET as acpmux does, so the pane and cmux acp in the tagged
app's terminals reach one daemon. A daemon the app starts for a tag
still listens on an ephemeral port.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Agent pane: tests for the review findings

- direct-reconnect.test.ts: a dropped acpmux socket hands back to the
  host once (red on the old code: it retried the dead endpoint every 250 ms).
- FocusReducerTests: a selected agent tab is a keyboard target, not an
  empty pane.
- AgentTabStoreTests: closing a pane forgets its agent tabs.
- AcpmuxWebEndpointTests: refuse https and ::1, which the page CSP blocks.

The Swift tests need the next commit to compile.

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

* Agent pane: fix reconnect loop, focus, tab leak and endpoint scope

- direct.ts / App.tsx: after a dropped connection, ask the host for a
  fresh endpoint (acpmux may have restarted on a new port and token),
  with backoff up to 30 s instead of a fixed 250 ms retry.
- Focus: agent tabs get their own kind and `agentPage` target, so the
  web view becomes first responder instead of the pane being cleared.
- AgentTabStore.closePane: when the daemon drops a pane, its agent tabs
  and pages go with it. Workspace switches and layout moves keep them.
- AcpmuxHost resolves the acpmux binary on first use, off the main
  thread, and retries until found.
- AcpmuxWebEndpoint accepts only http on 127.0.0.1 or localhost,
  matching the page's connect-src.

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

* Agent pane: rebuild the bundled page after the reconnect fix

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

* Agent pane: scope its action and strings onto their receivers

feat-cmux-next's package conventions lint (#16206) flags AgentPaneActions
and AgentPaneStrings as all-static namespace types. The action id is now
ActionID.newAgentChat with ActionRegistry.bindAgentPane(openNewChat:);
error text is AgentPaneHostError.userMessage(for:) and the tab title is
AgentPaneModel.tabTitle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

* Agent pane: debug perf instrumentation for seed, fling, frames and typing

window.cmuxAcpmuxDebug now matches what the native pane measures with
debug.agent_chat.action:

- seedRows(count) builds a port of AcpmuxSyntheticTranscript (count / 3
  turns of user message, 1-5 sentence answer with a list every third turn
  and a code block every seventh, and a turn summary) and resolves with the
  row count and the time from seed to the transcript's first commit.
- startFling(seconds) scrolls to the bottom, measures the idle frame
  interval over a warm-up (or takes nominal_ms), then scrolls bottom to top
  over `seconds`, one step per animation frame. It used to run from the
  current position to the bottom, so after the auto-scroll it never moved.
- flingStats() adds nominal_ms and dropped_frames
  (sum of max(0, round(interval / nominal) - 1)) to p50/p95/p99/max.
- perfStats() is a per-frame ring buffer: geometry (layoutConversation),
  React render to commit, the rest of the frame interval, and blank frames
  where the mounted rows do not cover the viewport.
- typingStats()/resetTyping(): composer keydown timeStamp to the next
  frame and to after that frame paints (rAF + MessageChannel).

Measurement stays off until the first debug call; the render path checks
one boolean and records the mounted range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

* Agent pane: DEBUG debug.agent_pane socket method

Drives the page's cmuxAcpmuxDebug in the agent tab shown in `pane` (default:
the focused pane) through callAsyncJavaScript in the page world: seed_rows,
fling, fling_stats, perf_stats, typing_stats, reset_typing. `pid` returns
the WebContent process (_webProcessIdentifier, as WebKitTab reports it) for
attaching a profiler. Async lane with a 30 s deadline so a 5000-row seed or
a waited fling fits; it never changes focus. DEBUG builds also make the
pane's web view inspectable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

* Agent pane: rebuild the bundled page with the perf debug hooks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

* webviews: rebuild the markdown viewer app after the agent pane's dependencies

react-apps-check reported Resources/markdown-viewer/webviews-app/chunks/
diffSurface.mjs stale; regenerated with scripts/build-webviews-app.sh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

* webviews: drop the design-mode runtime test orphaned by the legacy app's removal

browser-design-mode-runtime.test.ts reads Packages/macOS/CmuxBrowser/
.../BrowserDesignModeRuntime.js, which #15659 deleted with the legacy app,
so react-apps-check fails with ENOENT for any feat-cmux-next PR that
touches webviews.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

* webviews: rebuild the markdown viewer app without the deleted test's classes

Tailwind scans webviews/src, so removing browser-design-mode-runtime.test.ts
dropped its `outline` utilities from diffSurface.mjs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYQHfug1ZVQDp4eWgwVUtD

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 2, 2026
…ey test RP

plans/cmux-next/passkeys.md proposes Chrome-parity passkeys for CEF and
WebKit panes. Its "Known bugs: do not repeat" table lists every passkey bug
in the old app and repo history (K1-K18) with symptom, root cause, fix
status and the regression test each engine needs. New findings: cmux next
lost the whole WebKit passkey bridge with the legacy deletion on
2026-09-29 (#15659), so WebKit panes are back to "partial passkey support"
and the #9060/#15525 fixes are gone; the RC channel ships without the
passkey entitlement (verified on the installed 0.65.0-rc); three fixes on
main never merged (#6766 hybrid routing, #8630 private-selector crash,
#9529 leaked presentation windows); the bridge was silently dropped for ten
weeks by cb1a6de; the bridge ignores AbortSignal; Chromium refuses
WebAuthn in a tab that is not VISIBLE (cmux-browser #95), which applies to
our CEF occlusion and hibernation.

tests/passkeys: a local relying party (index.html, frame.html on
frame.localhost for cross-origin iframes, scenarios.js) and run.mjs, which
runs 17 scenarios in Chromium with a DevTools virtual authenticator. Stock
Chrome for Testing 153.0.8010.12 passes 17/17 (16 judged, 1 record-only);
the same runner targets a cmux CEF instance with --cdp, and --serve serves
the page for manual runs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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.

1 participant