Repository navigation
cmux-next: delete bonsplit, the legacy app and legacy-only packages (B0-B2) - #15659
Conversation
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>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository: manaflow-ai/cmux/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
…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
…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>
…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>
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.Sources/files thatcmux-clicompiles move toCLI/. Deleted: thevendor/bonsplitsubmodule,Sources/,cmuxTests/,cmuxUITests/,TunnelExtension/,vendor/WireGuardKit,cmux-Bridging-Header.h, and the 9 bonsplit-dependent packages plus CmuxCloudTunnelCore. The legacy targetscmux,cmuxTests,cmuxUITests,CmuxDockTilePluginandcmuxTunnelExtensiongo, with 4 schemes.cmux.xcodeprojkeepscmux-next,cmux-cliandcmuxCLITests; 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 theneedslists and aggregators are fixed.reload.shalways builds cmux-next. Skills and contributor docs no longer point agents at deleted targets.cmux-clino 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 cmuxDebug and-scheme cmux-cliDebug succeed.cmux-cliRelease also succeeds as universal (arm64 + x86_64), which proves the removed links were dead.swift build --build-testsin Packages/macOS/CmuxNext succeeds../scripts/reload.sh --tag nxdel --no-global-cli-linkssucceeds. The app launched with a clean env,CMUX_NEXT_NO_ACTIVATE=1andCMUX_NEXT_SOCKET_MODE=automation, andCMUX_TAG=nxdel scripts/cmux-debug-cli.sh treereturned the window tree after B1 and after B2.check-no-godfiles.shandcheck-concurrency.shpass.plutil -lintandxcodebuild -listpass on the project, andcheck-workspace-package-groups.pypasses.guards-local.sh --allfails 11 steps: 9 are known failures on the parent, and 2 fail only under parallel load.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/bonsplitsubmodule, and all legacy-only packages on the cmux-next branch, following batches B0–B2 ofplans/cmux-next/deletion.mdand removing roughly 1.4M lines.B0+B1
Sources/filescmux-clicompiles move toCLI/, andcmux.xcodeprojnow keeps onlycmux-next,cmux-cli, andcmuxCLITests.cmux,cmuxTests,cmuxUITests,CmuxDockTilePlugin, andcmuxTunnelExtensiontargets, their schemes and CI lanes,TunnelExtension/,vendor/WireGuardKit, the bridging header, and the 9 bonsplit-dependent packages plusCmuxCloudTunnelCore.reload.shalways buildscmux-next; skills and contributor docs no longer reference deleted targets.B2
CmuxTerminalPrediction,CmuxSyntaxHighlighting, the sidebar-extension Examples, andNative/CommandPaletteNucleoFFI.cmux-clistops linking 4 packages it never imported; swift-syntax leavesPackage.resolved.Kept:
CmuxUpdater,CmuxNotifications,CmuxGitand the other X1 candidates,CmuxPhonePush,CmuxAPIClient/openapi.json, and everything inweb/,cmux-tui/, andios/.Verification:
xcodebuildDebug succeeds forcmuxandcmux-cli;cmux-cliRelease also builds as universal, confirming the removed links were dead.swift build --build-testsinPackages/macOS/CmuxNextsucceeds, andreload.shwith 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.