Skip to content

Restore iOS scroll-to-bottom toolbar button - #6526

Closed
lawrencecchen wants to merge 11 commits into
mainfrom
feat-ios-scroll-bottom-button
Closed

lawrencecchen wants to merge 11 commits into
mainfrom
feat-ios-scroll-bottom-button

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Restores a configurable iOS terminal toolbar action for Scroll to Bottom.
  • Routes the button through the existing Ghostty scroll_to_bottom binding on the serial surface queue.
  • Folds the new built-in into existing toolbar layouts once, so current users see it but later hide/reorder choices persist.
  • Adds English and Japanese iOS localizations for the toolbar accessibility label and settings row.

Validation

Dogfood Notes

  • iPhone install and launch succeeded for dev.cmux.ios.dog on Lawrence’s iPhone.
  • Simulator reload is blocked by the local Xcode guard. ios/scripts/reload.sh --tag dog refuses local xcodebuild without override, and the override attempt was terminated during package resolution with exit 143.
  • Physical iPhone screen capture could not be completed from this shell because the available screenshot tool needs a Tunneld service requiring sudo; process launch and device unlocked/backlight-active state were verified.

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Medium Risk
Adds a new mobile terminal RPC and Mac viewport mutation, but it mirrors the existing scroll forward path and reuses the same authorization gates rather than changing auth or data handling.

Overview
Restores a Scroll to Bottom action on the iOS terminal input accessory. Tapping it scrolls the on-device Ghostty mirror via the scroll_to_bottom binding (still dispatched on the serial surface queue) and notifies the host so the paired Mac viewport jumps to match.

The shell sends a new mobile.terminal.scroll_to_bottom RPC; the Mac handles it like other terminal mobile calls (workspace/surface validation, ticket auth) and invokes mobileScrollToBottom() on the real surface. GhosttySurfaceRepresentable wires the new delegate callback to scrollTerminalToBottom.

The action is user-configurable (icon, labels, default placement after Page Down) with a one-time v3 toolbar migration so existing layouts gain the button without wiping hide/reorder choices. Adds EN/JA strings and tests for RPC routing, defaults, and migration.

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


Summary by cubic

Restores a configurable Scroll to Bottom button in the iOS terminal toolbar and adds a floating in-terminal jump-to-bottom button that appears when the viewport is scrolled up. Tapping jumps the local mirror via Ghostty’s scroll_to_bottom and sends mobile.terminal.scroll_to_bottom so the Mac viewport matches.

  • New Features

    • Added scrollToBottom toolbar action with “arrow.down.to.line” icon; no byte output. Default placement: after Page Down. EN/JA labels and shortcut name.
    • Added a floating jump-to-bottom button that shows when scrolled up (Mac-reported or after local scroll) and hides with the toolbar/composer; accessible and tap-to-jump.
    • Mac now reports viewport position via at_bottom on MobileTerminalRenderGridFrame; iOS tracks per-surface scrolled state to drive the button. Routed from TerminalInputTextView → GhosttySurfaceView (local jump + redraw) → GhosttySurfaceRepresentable → scrollTerminalToBottom() → mobile.terminal.scroll_to_bottom → mobileScrollToBottom().
  • Migration

    • Existing v3 layouts auto-insert the new action after Page Down and show it once.
    • Users can hide/reorder it later; persisted identifiers remain stable.

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

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added “Scroll to Bottom” to the terminal input accessory toolbar for quickly jumping to the latest output.
    • It’s configurable (enable/disable and reorder) and is shown right after Page Down by default, including stable persistence and v3 layout migration.
    • Added English/Japanese localization and improved accessibility metadata.
    • Added a context-aware jump-to-bottom button that appears when the terminal is not at the newest output.
  • Bug Fixes
    • Improved gesture handling so touch interactions with controls aren’t intercepted.
  • Tests
    • Added/extended coverage for placement/order/configurability, stable persistence, and v3 migration scenarios (including missing entries).

@vercel

vercel Bot commented Jun 21, 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 Jul 18, 2026 9:38pm
cmux-staging Building Building Preview, Comment Jul 18, 2026 9:38pm

@coderabbitai

coderabbitai Bot commented Jun 21, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a configurable .scrollToBottom action, a floating jump-to-bottom button, render-grid scroll-state propagation, and end-to-end iOS-to-Mac RPC handling with migration and test coverage.

Changes

Scroll to Bottom terminal flow

Layer / File(s) Summary
Accessory action and configuration
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/GhosttySurfaceView.swift, Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/TerminalInputTextView.swift, Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/TerminalAccessoryConfiguration.swift, ios/cmux/Resources/Localizable.xcstrings
Adds .scrollToBottom, its accessibility and localization metadata, callback routing, nil byte output, default ordering, and v3 migration folding.
Terminal surface button and local scrolling
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/ScrollToBottomButton.swift, Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/GhosttySurfaceView.swift
Adds the floating button, scroll-state visibility and layout handling, local scrolling updates, hit-testing behavior, and the scroll_to_bottom surface action.
Render-grid scroll-state propagation
Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/MobileTerminalRenderGrid.swift, Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift, Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+TerminalOutputDelivery.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/GhosttySurfaceRepresentable.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift
Carries optional bottom-position state through render grids and exposes it as per-surface scrolled-up state to the terminal view.
Shell RPC and terminal execution
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+TerminalScrollDelivery.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/GhosttySurfaceRepresentable.swift, Sources/TerminalController.swift, Sources/Mobile/MobileHostService.swift, Packages/macOS/CmuxTerminal/Sources/CmuxTerminal/Surface/TerminalSurface+Mobile.swift
Sends, authorizes, dispatches, and executes mobile.terminal.scroll_to_bottom, including surface validation and success response handling.
Validation coverage
ios/cmuxPackage/Tests/cmuxFeatureTests/TerminalAccessoryConfigurationTests.swift, Packages/Shared/CMUXMobileCore/Tests/CMUXMobileCoreTests/MobileTerminalRenderGridTests.swift, Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/*
Tests accessory ordering and migration, render-grid serialization and state derivation, per-surface scroll tracking, and RPC request identifiers.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User as User
  participant SurfaceView as GhosttySurfaceView
  participant Representable as GhosttySurfaceRepresentable
  participant Shell as MobileShellComposite
  participant Controller as TerminalController
  participant Surface as TerminalSurface

  User->>SurfaceView: tap scroll-to-bottom
  SurfaceView->>Representable: notify delegate
  Representable->>Shell: scrollTerminalToBottom(surfaceID)
  Shell->>Controller: mobile.terminal.scroll_to_bottom
  Controller->>Surface: mobileScrollToBottom()
  Surface-->>Controller: success
  Controller-->>Shell: success response
Loading

Possibly related PRs

  • manaflow-ai/cmux#7196: Both changes use the GhosttySurfaceView scroll-to-bottom binding action on the terminal output queue.

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (2 errors, 2 warnings)

Check name Status Explanation Resolution
Cmux Swift Logging ❌ Error MobileShellComposite+TerminalScrollDelivery.swift adds a file-scoped private let terminalScrollDeliveryLog = Logger(...) in @MainActor code; the rule պահանջs nonisolated private let. Change it to nonisolated private let terminalScrollDeliveryLog = Logger(...) (or reuse an existing nonisolated logger) and keep the same redacted error message.
Cmux Full Internationalization ❌ Error Swift uses terminal.shortcut.name.scrollToBottom, but Localizable.xcstrings lacks that key; only terminal.input_accessory.scroll_to_bottom is present and translated for en/ja. Add terminal.shortcut.name.scrollToBottom to ios/cmux/Resources/Localizable.xcstrings with translated en and ja entries, or switch the code to an existing localized key.
Docstring Coverage ⚠️ Warning Docstring coverage is 26.56% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description is informative, but it misses required template sections like Demo Video, Review Trigger, and Checklist. Add the missing template sections, including a demo video for the UI change, the review-trigger block, and the checklist items.
✅ Passed checks (21 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The new scroll-to-bottom paths stay on UI/MainActor surfaces, and the shell-store/RPC hops use explicit @MainActor boundaries; no new isolation debt appears.
Cmux Swift Blocking Runtime ✅ Passed PASS: the added production Swift uses async dispatch and UI animation only; no new semaphores, sync waits, sleeps, polling, or blocking locks were introduced.
Cmux Browser Automation Off-Main ✅ Passed Diff only adds mobile terminal scroll-to-bottom plumbing; no browser.* hunks or processV2Command/socketWorkerMethods changes were touched.
Cmux Expensive Synchronous Load ✅ Passed PASS: The diff only adds scroll-to-bottom UI/RPC plumbing; no RestorableAgentSessionIndex.load() or other agent-history loader appears on a main/interactive path.
Cmux Cache Substitution Correctness ✅ Passed The new scroll-up cache is event-driven and UI-only; the snapshot path still uses live mobileViewportAtBottom with nil cold-cache fallback, so no durable-path cache substitution.
Cmux No Hacky Sleeps ✅ Passed PASS: The PR changes only Swift, localization, tests, and a TSV budget file; no TS/JS/shell/build runtime scripts were modified, and no fixed waits/polling were introduced.
Cmux Algorithmic Complexity ✅ Passed PASS: New work is fixed-size toolbar config and O(1) scroll-state lookups; it reuses existing linear workspace lookup without adding batch rescans or nested scans.
Cmux Swift Concurrency ✅ Passed Diff only adds button visibility/state and hit-testing in GhosttySurfaceView; no new legacy async pattern was introduced.
Cmux Swift @Concurrent ✅ Passed No new nonisolated async helper or invalid @concurrent use; the new scroll path stays on @MainActor and the Ghostty binding action is queued off-main.
Cmux Swift Package Boundaries ✅ Passed The new reusable logic lives in SwiftPM packages; app-target edits are thin RPC/UI/Ghostty glue, not independent domain code.
Cmux Swiftpm Lockfiles ✅ Passed Diff only changes sources/tests/localizations; no Package.swift, .xcodeproj, or .gitignore changes, and no cmux-owned .gitignore ignores Package.resolved.
Cmux User-Facing Error Privacy ✅ Passed Only new user-facing error text is generic 'Terminal surface not found'; no upstream/vendor/internal details are exposed.
Cmux Swiftui State Layout ✅ Passed New scroll-to-bottom state is a Bool snapshot bridged through UIViewRepresentable; no new ObservableObject/@published, GeometryReader, or lazy-row store boundary added.
Cmux Architecture Rethink ✅ Passed Scroll-to-bottom is owned by GhosttySurfaceView with explicit SwiftUI/Mac bridges and no sleeps, polling, locks, or duplicated ownership; the state path is clear.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The diff only adds terminal accessory/RPC plumbing and tests; no NSWindow/WindowGroup/NSPanel changes or cmuxAuxiliaryWindowIdentifiers edits were introduced.
Cmux Source Artifacts ✅ Passed All changed paths are source, tests, config, or localization; none match artifact/temp/cache/build-output patterns, and the TSV change is a repo config file.
Cmux No Test Or Debug Seam In Production Source ✅ Passed Only production-source change is GhosttySurfaceView; new public APIs are used by GhosttySurfaceRepresentable and no new debug/test-only seam was introduced.
Cmux No Ambient Global State ✅ Passed The PR adds instance methods/properties and one constructable UIKit button class; no new file-scope API, mutable globals, or singleton state were introduced.
Title check ✅ Passed The title clearly matches the PR’s main change: restoring the iOS scroll-to-bottom toolbar button.
✨ 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 feat-ios-scroll-bottom-button

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.

@greptile-apps

greptile-apps Bot commented Jun 21, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Restores a configurable Scroll to Bottom button to the iOS terminal input-accessory toolbar. Tapping it jumps the local Ghostty mirror via the existing scroll_to_bottom binding and syncs the Mac viewport through a new mobile.terminal.scroll_to_bottom RPC that reuses the same ticket-auth and workspace/surface validation gates as every other terminal mobile RPC.

  • iOS: GhosttySurfaceView gains a floating ScrollToBottomButton with visibility driven by both the Mac-reported atBottom state (propagated through MobileTerminalRenderGridFrame.atBottom) and a local scroll-offset accumulator; the v3 toolbar migration folds Scroll to Bottom in after Page Down without wiping user hide/reorder choices.
  • Mac: GhosttyNSView.mobileViewportAtBottom reads the current scrollbar position on each render export; TerminalSurface.mobileScrollToBottom() dispatches via ghostty_surface_binding_action on the surface queue; TerminalController handles the new RPC behind the existing auth check.
  • Localization: terminal.input_accessory.scroll_to_bottom is added for en/ja; however, terminal.shortcut.name.scrollToBottom — used in the toolbar customization settings editor — is absent from the catalog.

Confidence Score: 4/5

Safe to merge after adding the missing terminal.shortcut.name.scrollToBottom catalog entry; all core RPC, auth, and rendering paths look correct.

The new RPC, Mac surface mutation, iOS floating button, and v3 toolbar migration are all well-structured and follow existing patterns. The only concrete defect is a missing string-catalog key (terminal.shortcut.name.scrollToBottom) used in the toolbar customization settings UI — Japanese users who open the shortcuts editor will silently see the English default rather than a translated label. Every peer key in that namespace (pageDown, pageUp, home, end, rightArrow) has both en and ja entries; this one is entirely absent.

ios/cmux/Resources/Localizable.xcstrings — the shortcut name key for Scroll to Bottom is missing.

Important Files Changed

Filename Overview
ios/cmux/Resources/Localizable.xcstrings Adds en+ja for terminal.input_accessory.scroll_to_bottom but omits terminal.shortcut.name.scrollToBottom, which is used in the toolbar customization settings UI.
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/GhosttySurfaceView.swift Adds scrollToBottom action case, floating ScrollToBottomButton, local scroll-offset tracking, and custom hit-test overrides; logic flows through existing surface queue correctly.
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/ScrollToBottomButton.swift New floating UIButton with blur background and accessibility label wired correctly via terminal.input_accessory.scroll_to_bottom.
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/TerminalAccessoryConfiguration.swift Extends foldNewlyConfigurableV3 with the scrollToBottom anchor chain after Page Down; existing migration logic is reused cleanly.
Sources/TerminalController.swift Adds v2MobileTerminalScrollToBottom handler dispatching through ticket auth and mobileScrollToBottom() on the real surface, mirroring the existing scroll handler pattern.
Sources/GhosttyTerminalView.swift Adds mobileViewportAtBottom computed property that flushes pending scrollbar state and computes offset+len >= total; correctly returns nil when no scrollbar packet has arrived yet.
Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/MobileTerminalRenderGrid.swift Adds optional atBottom: Bool? field with backward-compatible Codable decoding (decodeIfPresent); nil means older producer, kept hidden rather than guessing.
Sources/Mobile/MobileTerminalRenderObserver.swift Widens RenderGridState from private to internal (no wrapper accessor added) and adds shouldEmitEmptyDelta with a real production caller; triggers delta emit on atBottom changes.
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift Adds terminalScrolledUpBySurfaceID dictionary with proper init/reset/teardown sites and a public read accessor; correctly cleared on surface removal.
Sources/Mobile/MobileHostService.swift Routes mobile.terminal.scroll_to_bottom through the existing ticketTerminalAuthorizationError gate alongside all other terminal RPCs.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant User as User (iPhone)
    participant GSVIOS as GhosttySurfaceView (iOS)
    participant Shell as MobileShellComposite
    participant Mac as TerminalController (Mac)
    participant Surface as TerminalSurface (Mac)

    User->>GSVIOS: Tap ScrollToBottomButton
    GSVIOS->>GSVIOS: scrollToBottom() — reset localScrollbackLineOffset
    GSVIOS->>GSVIOS: ghostty_surface_binding_action("scroll_to_bottom") on outputQueue
    GSVIOS->>Shell: ghosttySurfaceViewDidRequestScrollToBottom()
    Shell->>Mac: RPC mobile.terminal.scroll_to_bottom
    Mac->>Mac: ticketTerminalAuthorizationError check
    Mac->>Surface: mobileScrollToBottom()
    Surface->>Surface: ghostty_surface_binding_action("scroll_to_bottom")
    Mac->>Mac: MobileTerminalRenderObserver.noteTerminalBytes()
    Mac-->>Shell: Render frame (atBottom: true)
    Shell->>Shell: updateTerminalScrolledUp(scrolledUp: false)
    Shell-->>GSVIOS: setScrolledUp(false) via SwiftUI binding
    GSVIOS->>GSVIOS: Hide ScrollToBottomButton
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant User as User (iPhone)
    participant GSVIOS as GhosttySurfaceView (iOS)
    participant Shell as MobileShellComposite
    participant Mac as TerminalController (Mac)
    participant Surface as TerminalSurface (Mac)

    User->>GSVIOS: Tap ScrollToBottomButton
    GSVIOS->>GSVIOS: scrollToBottom() — reset localScrollbackLineOffset
    GSVIOS->>GSVIOS: ghostty_surface_binding_action("scroll_to_bottom") on outputQueue
    GSVIOS->>Shell: ghosttySurfaceViewDidRequestScrollToBottom()
    Shell->>Mac: RPC mobile.terminal.scroll_to_bottom
    Mac->>Mac: ticketTerminalAuthorizationError check
    Mac->>Surface: mobileScrollToBottom()
    Surface->>Surface: ghostty_surface_binding_action("scroll_to_bottom")
    Mac->>Mac: MobileTerminalRenderObserver.noteTerminalBytes()
    Mac-->>Shell: Render frame (atBottom: true)
    Shell->>Shell: updateTerminalScrolledUp(scrolledUp: false)
    Shell-->>GSVIOS: setScrolledUp(false) via SwiftUI binding
    GSVIOS->>GSVIOS: Hide ScrollToBottomButton
Loading

Comments Outside Diff (1)

  1. ios/cmux/Resources/Localizable.xcstrings, line 7262-7263 (link)

    P1 Missing terminal.shortcut.name.scrollToBottom catalog entry. The shortcut name is used in the toolbar customization settings UI (in GhosttySurfaceView.shortcutName) to let users identify and reorder the Scroll to Bottom action. Every peer key (pageDown, pageUp, home, end, rightArrow) carries both en and ja entries, but this new key is absent entirely — Japanese users will silently fall back to the English default value "Scroll to Bottom" when they open the toolbar editor.

    Rule Used: Flag production user-facing text that is not fully... (source)

Reviews (5): Last reviewed commit: "Show iOS jump-bottom button after local ..." | Re-trigger Greptile

@cursor

cursor Bot commented Jul 18, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+TerminalScrollDelivery.swift (1)

91-93: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use the remote workspace mapping for both scroll RPCs.

This change fixes mobile.terminal.scroll, but scrollTerminalToBottom still sends the local workspaceID.rawValue. In paired-workspace mode, the absolute scroll action can therefore resolve the wrong Mac workspace or return not_found. Apply the same remoteWorkspaceID(for:) mapping in the scroll-to-bottom request, preferably through one shared parameter-building path.

Proposed fix
-                    "workspace_id": workspaceID.rawValue,
+                    "workspace_id": remoteWorkspaceID(for: workspaceID).rawValue,
🤖 Prompt for 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.

In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite`+TerminalScrollDelivery.swift
around lines 91 - 93, Update scrollTerminalToBottom to use
remoteWorkspaceID(for:) when constructing its RPC parameters, matching the
mapping already used by the other scroll request. Prefer sharing the
parameter-building path so both scroll RPCs consistently send the remote
workspace identifier while preserving their existing action-specific behavior.
🤖 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.

Outside diff comments:
In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite`+TerminalScrollDelivery.swift:
- Around line 91-93: Update scrollTerminalToBottom to use
remoteWorkspaceID(for:) when constructing its RPC parameters, matching the
mapping already used by the other scroll request. Prefer sharing the
parameter-building path so both scroll RPCs consistently send the remote
workspace identifier while preserving their existing action-specific behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: bdae5b9c-df5f-4b31-8eed-204c222599c0

📥 Commits

Reviewing files that changed from the base of the PR and between b2526fb and d4e6c0d.

⛔ Files ignored due to path filters (1)
  • .github/swift-file-length-budget.tsv is excluded by !**/*.tsv
📒 Files selected for processing (11)
  • Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/MobileTerminalRenderGrid.swift
  • Packages/Shared/CMUXMobileCore/Tests/CMUXMobileCoreTests/MobileTerminalRenderGridTests.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+TerminalOutputDelivery.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+TerminalScrollDelivery.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/ComposerSubmitRoutingTestSupport.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/TerminalOutputDeliveryQueueTests.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/GhosttySurfaceRepresentable.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift
  • Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/GhosttySurfaceView.swift
  • Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/ScrollToBottomButton.swift

@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 — d4e6c0de Deployed Jul 18, 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.

2 participants