Skip to content

Issue #3866: Add terminal WebView sidekick drawer - #3968

Closed
austinywang wants to merge 58 commits into
mainfrom
issue-3866-webview-sidekick-drawer
Closed

austinywang wants to merge 58 commits into
mainfrom
issue-3866-webview-sidekick-drawer

Conversation

@austinywang

@austinywang austinywang commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Closes #3866

Summary

  • Adds a per-terminal collapsible WebView sidekick drawer rendered beside the terminal without registering it as a Bonsplit pane or tab.
  • Reuses BrowserPanel/WKWebView navigation plumbing for manual URL/search entry, back/forward/reload controls, and sidekick URL tracking.
  • Persists sidekick open state, URL, and split ratio in terminal session snapshots and restores it with the terminal.
  • Adds the focused-terminal ⌥⌘B shortcut, settings/config/docs metadata, localization, and behavior coverage.

Scope

This is a P1 first pass: manual toggle, manual URL entry, inline WKWebView rendering, and session persistence. URL detection from terminal output, detachable sidekick windows, and search indexing remain follow-up scope.

Verification

  • git diff --check
  • jq empty Resources/Localizable.xcstrings
  • Local tests not run per repo policy; CI will run via PR checks.

Note

Medium Risk
Medium risk: adds new shortcut-driven UI behavior (terminal sidekick + omnibar navigation/repeat logic) and removes Rust-based command palette search/CI Rust installs, which could affect keyboard routing and build pipelines.

Overview
Adds a focused-terminal WebView “sidekick” drawer that can be toggled via a new toggleTerminalSidekick shortcut, including new localization strings and updated shortcut documentation.

Refactors browser omnibar keyboard navigation to support Cmd/Ctrl n/p repeat behavior, simplifies address-bar focus tracking, and prevents focus-stealing after file drops via an allowsPanelFocusAfterFileDrop gate.

Removes the Rust Native/CommandPaletteNucleoFFI implementation (and its Swift glue/overlay) and drops Rust installation steps across GitHub Actions workflows; also tweaks agent launch argument sanitization for Codex session subcommands and adjusts notification menu unread counting/removes the toggle-unread shortcut/strings.

Reviewed by Cursor Bugbot for commit 12f266c. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Adds a per-terminal WebView “sidekick” beside terminals for quick lookups, with drag‑resize and per‑session persistence, addressing issue #3866. ⌥⌘B now toggles the sidekick when a terminal is focused and the right sidebar otherwise; browser shortcuts and Find route to the sidekick when it’s focused.

  • New Features

    • Terminal sidekick: toggle with ⌥⌘B; embeds BrowserPanelView; routes browser shortcuts/Find from sidekick focus.
    • Persistence/layout: saves open state, URL, and split ratio per terminal; local drag‑resize preview; clamps to 25–70%; restores with sessions.
    • Repo skills: adds cmux Debug Windows skill with a snapshot script for Sidebar/Background/Menu Bar debug windows.
  • Bug Fixes

    • Browser/omnibar: clears suggestions when hidden; supports Cmd/Ctrl+N/P cycling; improves repeat behavior.
    • Notifications: counts only real notifications; removes Toggle Unread; fixes empty states and Clear All in popovers/pages.
    • Feed and drops: expires pending items/waiters if the agent exits before showing a notification; BrowserPaneDropContext adds allowsPanelFocusAfterFileDrop to avoid focus steal.
    • Agent/CLI: generalized Codex sanitizer stops variadic --add-dir at resume and fork; supports --fork-session; topProcessLabel prints as reason=; skips launcher script when Claude auth selection env is preserved; preserves hook trust.
    • Focus/find/shortcuts: shares the ⌥⌘B fallback between sidekick and right sidebar without conflicts; Find routes from sidekick focus; restores sane default process attribution reason and OpenCode detection; preserves deferred terminal socket text semantics.
    • CI/Build: drops Rust install/steps and the CommandPaletteNucleoFFI library/tests/scripts; activation workflow uses a distinct SPM cache key; docs updated (shortcut clarifications and CLI cleanup).

Written for commit 12f266c. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • New Features

    • Terminal Sidekick: toggle a split browser pane beside the focused terminal (Option‑Command‑B).
    • File Preview: enable/disable Cmd‑click file preview routing and UI for preview subtitles.
  • Changes

    • Notifications: removed “Toggle Unread” shortcut; introduced “Mark oldest unread and jump next” and clarified unread handling.
    • Keyboard shortcuts and documentation updated for clarity and consistency.

Review Change Stack

@vercel

vercel Bot commented May 12, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment May 22, 2026 8:43pm
cmux-staging Building Building Preview, Comment May 22, 2026 8:43pm

@coderabbitai

coderabbitai Bot commented May 12, 2026 •

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a Terminal Sidekick (state, coordinator, toggle shortcut, split UI, divider, persistence, restore), rewrites omnibar/shortcut routing and selection-repeat, ties terminal runtime/input to real window attachment with socket injection changes, simplifies notifications/unread syncing, updates AgentLaunch sanitization, renames Xcode project/CI/CLI to GhosttyTabs, and adjusts/extends tests and docs accordingly.

Changes

Terminal Sidekick & UI / Sources/Panels/..., Sources/SessionPersistence.swift, Sources/Workspace.swift

Layer / File(s) Summary
Sidekick state and coordinator
Sources/Panels/TerminalSidekickCoordinator.swift
Adds TerminalSidekickState and @MainActor TerminalSidekickCoordinator to manage sidekick state, panel lifecycle, navigation, split ratio, and session snapshotting.
Terminal panel integration
Sources/Panels/TerminalPanel.swift, Sources/Panels/TerminalPanelView.swift
TerminalPanel now exposes sidekick state/browserPanel and delegates sidekick APIs to coordinator; TerminalPanelView renders split layout with draggable TerminalSidekickDivider and resizing math in TerminalSidekickLayout.
Session snapshots
Sources/SessionPersistence.swift, cmuxTests/TabManagerSessionSnapshotTests.swift
Adds SessionTerminalSidekickSnapshot, persists it in SessionTerminalPanelSnapshot, and adds tests verifying sanitization, clamping, restore behavior, and panel creation when open.
Workspace restore & split creation
Sources/Workspace.swift
Restore applies sidekick snapshot immediately; simplifies splitPaneWithNewTerminal signature; rewrites reparent-focus suppression and unread-sync helpers to use derived syncing.

Shortcuts & Omnibar routing / Sources/KeyboardShortcut*, Sources/AppDelegate.swift, Sources/App/ShortcutRoutingSupport.swift

Layer / File(s) Summary
Shortcut actions and conflicts
Sources/KeyboardShortcutSettings.swift, web/data/cmux-shortcuts.ts, cmuxTests/WorkspaceUnitTests.swift
Removes .toggleUnread, adds .toggleTerminalSidekick with default ⌥⌘B, updates conflict logic to allow sharing with right-sidebar, and adds shortcut metadata/test.
Shortcut context & browser-panel resolution
Sources/KeyboardShortcutContext.swift
Routes toggleTerminalSidekick to .nonBrowserPanel and updates browser panel resolution to detect sidekick browser panels via new helpers.
AppDelegate shortcut handling & omnibar repeat
Sources/AppDelegate.swift, Sources/App/ShortcutRoutingSupport.swift
Refactors focused-address-bar detection, adds command-based omnibar selection-delta repeat, preserves/bypasses logic for local ephemeral navigation, wires .toggleTerminalSidekick handling, removes .toggleUnread branch, and rewrites repeat lifecycle. Tests in cmuxTests/AppDelegateShortcutRoutingTests.swift updated.

Terminal surface/input & controller / Sources/GhosttyTerminalView.swift, Sources/TerminalController.swift

Layer / File(s) Summary
Surface attachment and input queue
Sources/GhosttyTerminalView.swift
Runtime creation now tied to real AppKit window attachment; isViewInWindow uses hostedView.window; pending socket input reworked to queue .pasteText/key events with non-returning enqueue and flush semantics; adds suppression counter APIs.
Socket injection & v2 handling
Sources/TerminalController.swift
Adds socket text/key chunking helpers, prefers direct socket injection when surface attached, bounded surface readiness resolution helpers, simplifies v2 responses, and updates tests.

BrowserPanel / Omnibar & WebView injection / Sources/Panels/BrowserPanel.swift, Sources/Panels/BrowserPanelView.swift

Layer / File(s) Summary
Omnibar focus and field handling
Sources/Panels/BrowserPanelView.swift
Removes registry usage, adds usesProvidedPaneContext and embeddedCloseAction, rewrites omnibar focus/reassert events, selection behavior, field lookup via responder traversal, and suggestion popup height logic.
WebView user scripts
Sources/Panels/BrowserPanel.swift
Removes BrowserFileSystemAccessBridge script injection at document start; gate external-navigation handler to main-frame navigations.

Notifications & unread sync / Sources/TerminalNotificationStore.swift, Sources/cmuxApp.swift, Sources/App/MenuBarExtraController.swift

Layer / File(s) Summary
Notification source-of-truth and workspace unread
Sources/TerminalNotificationStore.swift, Sources/Workspace.swift
Make notifications list authoritative, remove panel-derived unread tracking, introduce syncPanelDerivedWorkspaceUnreadState(), and adjust all read/clear flows to only clear manual/restored workspace unread.
Menu/popover wiring
Sources/App/MenuBarExtraController.swift, Sources/Update/UpdateTitlebarAccessory.swift, Sources/cmuxApp.swift
Builders and popovers now derive unread/hasNotifications directly from notificationStore.notifications; remove Toggle Unread menu/shortcut entries; simplify CmdClickSupportedFileRouteSettings notification posting.

Agent launch sanitizer & restorable sessions / Packages/CMUXAgentLaunch/..., Sources/RestorableAgentSession.swift

Layer / File(s) Summary
Sanitizer logic and policies
Packages/CMUXAgentLaunch/...
Generalize preserved-argument handling (use kind:"codex"), add Policy.sessionSubcommands, update variadic/ value option handling, and add tests for codex --add-dir variadic termination.
Resume command cleanup
Sources/RestorableAgentSession.swift
Remove fork-specific resume helpers, centralize resume/script generation with byte-size gating and a helper that blocks script generation when preserved Claude auth environment is present. Tests updated accordingly.

Tests, CI/workflows, CLI, docs, project rename / various files

Layer / File(s) Summary
CI / workflows and scripts
.github/workflows/*, .circleci/config.yml, scripts/reload.sh
Switch xcodebuild/project and SwiftPM cache keys to GhosttyTabs.xcodeproj, remove Rust install steps in CI, update DerivedData globs and cache keys.
Xcode project and CLI/docs
GhosttyTabs.xcodeproj/project.pbxproj, CLI/cmux.swift, README.md, CLAUDE.md, .gitignore, .coderabbit.yaml, .greptile/*
Rename target to GhosttyTabs, update project file memberships (add TerminalSidekickCoordinator, remove obsolete Nucleo/Fork files), update CLI help/docs and README shortcuts, and adjust tooling configs.
Tests updates
many cmuxTests/* files
Add tests for sidekick snapshot, split-ratio clamping, shortcut sharing, sanitizer behaviors; remove or refactor tests tied to removed features (fork-agent commands, toggleUnread), and update test cleanup patterns (use window.close()).

Estimated code review effort: 🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs:

  • manaflow-ai/cmux#4193: overlaps changes to Workspace.sendInputWhenReady and background surface/startup behavior.
  • manaflow-ai/cmux#4268: related omnibar shortcut/arrow-key routing changes; likely overlapping with shortcut/omnibar refactor in this PR.

"I'm a rabbit with a shell so bright,
I toggled a sidekick with a shortcut light.
Split the pane, the web did peep,
Saved my state for quiet sleep.
Hoppity code—works through the night! 🐇"

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-3866-webview-sidekick-drawer

Comment thread Sources/AppDelegate.swift Outdated
Comment thread Sources/KeyboardShortcutSettings.swift
@greptile-apps

greptile-apps Bot commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds a per-terminal WKWebView sidekick drawer with toolbar controls, a draggable divider, and session persistence \u2014 all gated behind BrowserAvailabilitySettings. Previous review concerns (state divergence on panel-creation failure, GeometryReader layout contract flip, spurious initial navigation, availability bypass on restore, and window-change-before-guard) are addressed in this revision.

  • New TerminalSidekickCoordinator owns all sidekick lifecycle (open/close/navigate/restore), with correct availability guards at every entrypoint and a notifyChanged closure to propagate state up to TerminalPanel.objectWillChange.
  • TerminalPanelView uses onGeometryChange + stable ZStack container so toggling the drawer no longer changes the parent layout contract; resize preview stays local and commits on drag end.
  • Session persistence is backward-compatible (sidekick is an optional field on SessionTerminalPanelSnapshot) and the restore path respects BrowserAvailabilitySettings before creating any panel.

Confidence Score: 5/5

Safe to merge; all previously identified correctness concerns are addressed and the new code is well-structured.

The coordinator lifecycle, availability gating, and session restore are all exercised by the new test suite. No correctness or data-loss issues were found; the only feedback is a file-organisation nit on TerminalPanelView.swift having grown to 460 lines.

TerminalPanelView.swift — worth splitting the sidekick types into their own file before the file grows further, but no blocking issue in the current state.

Important Files Changed

Filename Overview
Sources/Panels/TerminalSidekickCoordinator.swift New 235-line @mainactor coordinator managing sidekick BrowserPanel lifecycle, state, and URL tracking; well-structured with clear ownership and correct availability guards throughout.
Sources/Panels/TerminalPanelView.swift 460 lines — grew from ~92 to 460 by adding 8 distinct sidekick types; logic is correct but exceeds the single-responsibility budget for files over 400 lines.
Sources/Panels/TerminalPanel.swift Thin forwarding layer delegating all sidekick operations to TerminalSidekickCoordinator; lazy initialization with correct workspaceId propagation and cleanup on close().
Sources/AppDelegate.swift Adds toggleTerminalSidekick shortcut routing with BrowserAvailabilitySettings guard before setActiveMainWindow; deferred Task matches existing toggleRightSidebar pattern.
Sources/SessionPersistence.swift Adds SessionTerminalSidekickSnapshot as nonisolated Codable/Sendable struct with optional sidekick field on SessionTerminalPanelSnapshot; backward-compatible nil default.
cmuxTests/TabManagerSessionSnapshotTests.swift 169 lines of new tests covering persist/restore, clamp, minimum widths, disabled-browser gate, no-preload guarantee, and re-restore navigation; comprehensive behavior coverage.

Sequence Diagram

sequenceDiagram
    participant User
    participant AppDelegate
    participant TerminalPanel
    participant Coordinator as TerminalSidekickCoordinator
    participant BrowserPanel
    participant View as TerminalPanelView

    User->>AppDelegate: opt+cmd+B keyEquivalent
    AppDelegate->>AppDelegate: canToggleTerminalSidekickInActiveMainWindow()
    AppDelegate->>AppDelegate: "Task @MainActor (escape animation context)"
    AppDelegate->>TerminalPanel: toggleSidekick()
    TerminalPanel->>Coordinator: toggleSidekick()
    Coordinator->>Coordinator: ensureBrowserPanel()
    Coordinator->>BrowserPanel: init(initialURL:, renderInitialNavigation:)
    Coordinator->>Coordinator: replaceState(isOpen: true)
    Coordinator->>TerminalPanel: notifyChanged() objectWillChange.send()
    TerminalPanel-->>View: "re-render sidekickState.isOpen=true"

    User->>View: drag divider
    View->>View: sidekickResizePreviewRatio local State
    View->>TerminalPanel: setSidekickSplitRatio() on drag end
    TerminalPanel->>Coordinator: setSidekickSplitRatio()

    User->>View: submit address bar
    View->>TerminalPanel: navigateSidekick(input:)
    TerminalPanel->>Coordinator: navigateSidekick(input:)
    Coordinator->>BrowserPanel: navigateSmart(trimmed)

    Note over AppDelegate,View: On session save
    TerminalPanel->>Coordinator: sessionSnapshot()
    Coordinator-->>TerminalPanel: SessionTerminalSidekickSnapshot?

    Note over AppDelegate,View: On session restore
    TerminalPanel->>Coordinator: restoreSidekick(snapshot)
    Coordinator->>Coordinator: BrowserAvailabilitySettings.isEnabled() guard
    Coordinator->>BrowserPanel: ensureBrowserPanel() navigate(to:)
Loading

Reviews (10): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread Sources/Panels/TerminalPanel.swift Outdated
Comment thread Sources/Panels/TerminalPanelView.swift Outdated
Comment thread Sources/Panels/TerminalPanelView.swift Outdated
Comment thread Sources/Panels/TerminalPanel.swift Outdated
Comment thread Sources/Panels/TerminalPanel.swift
Comment thread Sources/Panels/TerminalPanel.swift
Comment thread Sources/Panels/TerminalPanel.swift
Comment thread Sources/AppDelegate.swift Outdated
coderabbitai[bot]
coderabbitai Bot previously requested changes May 12, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/Panels/TerminalPanel.swift`:
- Around line 212-217: The closeSidekick() currently only flips
sidekickState.isOpen to false but leaves sidekickBrowserPanel alive; modify
closeSidekick() to call sidekickBrowserPanel?.close() and then set
sidekickBrowserPanel = nil to release the BrowserPanel/WKWebView resources, and
ensure openSidekick() lazily recreates sidekickBrowserPanel when needed (or
document this as an intentional trade-off if you prefer keeping it for faster
reopen). Keep references to sidekickState and currentSidekickURLString()
unchanged and only add the close() + nil assignment to properly release
resources.

In `@Sources/Panels/TerminalPanelView.swift`:
- Around line 235-238: commitAddress currently calls onNavigate(addressText)
unconditionally, allowing empty/whitespace submissions via Enter; add a guard
that trims addressText and returns early if empty (matching the "Open in
Sidekick" button disable logic), only calling onNavigate(trimmed) and then
setting addressFocused = false when the trimmed value is non-empty; reference
commitAddress, addressText, onNavigate, and addressFocused when making the
change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 065dcf39-8895-4ece-ae46-bed7fc1df251

📥 Commits

Reviewing files that changed from the base of the PR and between 37e2330 and 8edd80b.

📒 Files selected for processing (13)
  • Resources/Localizable.xcstrings
  • Sources/AppDelegate.swift
  • Sources/KeyboardShortcutContext.swift
  • Sources/KeyboardShortcutSettings.swift
  • Sources/Panels/TerminalPanel.swift
  • Sources/Panels/TerminalPanelView.swift
  • Sources/SessionPersistence.swift
  • Sources/Workspace.swift
  • cmuxTests/AppDelegateShortcutRoutingTests.swift
  • cmuxTests/KeyboardShortcutContextTests.swift
  • cmuxTests/TabManagerSessionSnapshotTests.swift
  • cmuxTests/WorkspaceUnitTests.swift
  • web/data/cmux-shortcuts.ts

Comment thread Sources/Panels/TerminalPanel.swift
Comment thread Sources/Panels/TerminalPanelView.swift Outdated
Comment thread Sources/AppDelegate.swift

Copy link
Copy Markdown
Contributor

Follow-up review fixes are now on head 8f3c70b92:

  • Routed Find / Find Next / Find Previous / Hide Find through the terminal sidekick browser when the current first responder belongs to that embedded web view, so Cmd+F no longer opens Ghostty find while interacting with sidekick content.
  • Increased the command-palette result row metric to match subtitle rows and applied that minimum row height to the row content, so list sizing no longer assumes 24px rows.

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented May 19, 2026

Copy link
Copy Markdown

Follow-up review fixes are now on head 8f3c70b92:

  • Routed Find / Find Next / Find Previous / Hide Find through the terminal sidekick browser when the current first responder belongs to that embedded web view, so Cmd+F no longer opens Ghostty find while interacting with sidekick content.
  • Increased the command-palette result row metric to match subtitle rows and applied that minimum row height to the row content, so list sizing no longer assumes 24px rows.

...

@lawrencecchen I have started the AI code review. It will take a few minutes to complete.

Copy link
Copy Markdown
Contributor

Follow-up compile fix is now on head fa0403e87 (explicit return in the sidekick find selection getter).

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented May 19, 2026

Copy link
Copy Markdown

Follow-up compile fix is now on head fa0403e87 (explicit return in the sidekick find selection getter).

@cubic-dev-ai review

@lawrencecchen I have started the AI code review. It will take a few minutes to complete.

Copy link
Copy Markdown
Contributor

Follow-up unit compile fix is now on head a394d0e7f (updated the right-sidebar command-palette test to use the shared top-level CommandPaletteContextSnapshot model type after the extraction).

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented May 19, 2026

Copy link
Copy Markdown

Follow-up unit compile fix is now on head a394d0e7f (updated the right-sidebar command-palette test to use the shared top-level CommandPaletteContextSnapshot model type after the extraction).

@cubic-dev-ai review

@lawrencecchen I have started the AI code review. It will take a few minutes to complete.

Copy link
Copy Markdown
Contributor

Follow-up unit compile fix is now on head 197a702ee: tests now use the production beginSuppressingReparentFocus() / endSuppressingReparentFocus() API instead of the removed/private reparent-focus test hooks.

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented May 19, 2026

Copy link
Copy Markdown

Follow-up unit compile fix is now on head 197a702ee: tests now use the production beginSuppressingReparentFocus() / endSuppressingReparentFocus() API instead of the removed/private reparent-focus test hooks.

@cubic-dev-ai review

@lawrencecchen I have started the AI code review. It will take a few minutes to complete.

Copy link
Copy Markdown
Contributor

Follow-up unit compile fix is now on head 6afc97386: updated the remaining unit test API references for the command palette fingerprint helper types, restored the field-editor probe window helper, and passed omnibarSuggestions: nil at the updated WebViewRepresentable test call sites.

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented May 19, 2026

Copy link
Copy Markdown

Follow-up unit compile fix is now on head 6afc97386: updated the remaining unit test API references for the command palette fingerprint helper types, restored the field-editor probe window helper, and passed omnibarSuggestions: nil at the updated WebViewRepresentable test call sites.

@cubic-dev-ai review

@lawrencecchen I have started the AI code review. It will take a few minutes to complete.

…-3866-webview-sidekick-drawer

# Conflicts:
#	.circleci/config.yml
#	.github/workflows/ci.yml
#	.github/workflows/perf-activation.yml
#	Sources/AppDelegate.swift
#	Sources/TabManager.swift
#	cmuxTests/AppDelegateShortcutRoutingTests.swift
#	cmuxTests/SessionPersistenceTests.swift
#	docs/internal/skills-customization-ideas.md
Comment thread .github/workflows/perf-activation.yml
Comment thread Sources/AppDelegate.swift Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 12f266c. Configure here.

func browserOmnibarShouldContinueControlNavigationRepeat(flags: NSEvent.ModifierFlags) -> Bool {
browserOmnibarNormalizedModifierFlags(flags) == [.control]
let normalizedFlags = browserOmnibarNormalizedModifierFlags(flags)
return normalizedFlags == [.control] || normalizedFlags == [.command]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Production-unused function after inline replacement

Low Severity

browserOmnibarShouldContinueControlNavigationRepeat was updated to support both Command and Control modifiers, but its only production call site in handleBrowserOmnibarSelectionRepeatLifecycleEvent was replaced with inline logic checking browserOmnibarRepeatModifierFlags. The function is now only referenced by tests, making it dead code in production.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 12f266c. Configure here.

@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — 12f266c0 Deployed May 22, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Per-session WebView Sidekick (collapsible browser drawer beside terminal)

3 participants