Skip to content

Fix iOS toolbar glass and lifecycle - #7116

Merged
azooz2003-bit merged 15 commits into
mainfrom
task-ios-toolbar-regression
Jul 2, 2026
Merged

azooz2003-bit merged 15 commits into
mainfrom
task-ios-toolbar-regression

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jun 30, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Keeps iOS workspace toolbar ownership on stable WorkspaceDetailView instead of branch-specific terminal/browser/chat subtrees.
  • Uses separate .topBarLeading toolbar items for Back and the workspace title, so SwiftUI owns their native toolbar identity and presentation.
  • Inserts ToolbarSpacer(.fixed, placement: .topBarLeading) between Back and title on iOS 26+, so SwiftUI creates a real toolbar break instead of visually joining adjacent leading items.
  • Removes explicit glass button styling from the workspace Back and title controls; their glass/press treatment now comes from being toolbar items.
  • Adds coverage for fresh no-agent workspace toolbar persistence, back-button pressed-frame compactness, and leading title width calculation.

Related

Testing

  • PASS: git diff --check.
  • PASS: xcodebuild -workspace ios/cmux.xcworkspace -scheme CmuxMobileShellUI -destination "platform=iOS Simulator,name=iPhone 17" -derivedDataPath /tmp/cmux-itbar-toolbarspacer build.
  • PASS: ./scripts/reload-cloud.sh --tag itbar fell back to local ./scripts/reload.sh --tag itbar and built /Users/abdulazizalbahar/Library/Developer/Xcode/DerivedData/cmux-itbar/Build/Products/Debug/cmux DEV itbar.app at commit 4bd42935b0.
  • PASS: ios/scripts/reload.sh --tag itbar --simulator "iPhone 17" built, installed, launched, signed in, and auto-paired dev.cmux.ios.itbar on iPhone 17 simulator at commit 4bd42935b0.
  • PASS: ios/scripts/reload.sh --tag itbar --device-only --device-id 4A52829D-6427-599F-A166-4058881D2DF4 --team 7WLXT3NR37 built, signed, installed, launched, signed in, and auto-paired dev.cmux.ios.itbar on Aziz at commit 4bd42935b0.
  • BLOCKED: simulator visual workspace-detail verification is still blocked by the existing restore gate in some runs. The iPhone build is installed and launched for manual inspection.
  • BLOCKED: swift test --package-path Packages/iOS/CmuxMobileShellUI --filter MobileLeadingToolbarTitleWidthTests is blocked by SwiftPM package platform inference for this iOS package.

Notes

  • No new user-facing strings.
  • This is a native toolbar ownership and placement fix, not a custom styling workaround.

Summary by CodeRabbit

  • New Features

    • Improved the mobile workspace/chat header layout for more consistent title, back button, and toolbar behavior.
    • Added better width handling so titles and controls fit more reliably on small screens.
    • Expanded iOS workspace detail actions, including close confirmation, rename, feedback, and “View as Text” flows.
  • Bug Fixes

    • Fixed toolbar sizing and spacing issues to keep controls compact after interaction.
    • Improved navigation behavior in compact workspace views.
    • Updated test coverage to validate toolbar layout and back button stability.

@vercel

vercel Bot commented Jun 30, 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 2, 2026 7:52am
cmux-staging Building Building Preview, Comment Jul 2, 2026 7:52am

@coderabbitai

coderabbitai Bot commented Jun 30, 2026 •

Copy link
Copy Markdown

Review Change Stack

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

WorkspaceChatPane is now chat-only, WorkspaceDetailView owns toolbar and title wiring, title width math moved to a new leading-toolbar helper, compact-toolbar UI tests were expanded, and compact-stack auto-open timing changed in WorkspaceShellView.

Changes

Workspace chat pane and toolbar refactor

Layer / File(s) Summary
Simplify chat pane and call site
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceChatPane.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView+AgentChat.swift
WorkspaceChatPane becomes non-generic and chat-only, its header and toolbar state are removed, and the agent-chat call site drops workspace title inputs and duplicated chrome modifiers.
Move toolbar wiring into WorkspaceDetailView
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift
WorkspaceDetailView adds the chat UI import, splits iOS and non-iOS body wiring, moves geometry and toolbar handling into the iOS branch, and adds the macOS toolbar wrapper.
Update leading title width logic
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/MobileLeadingToolbarTitleWidth.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/MobileNavTitleWidth.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceTitleMenu.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceBackButton.swift
Adds the new leading-toolbar width utility, removes the old nav-title width file, switches title menu sizing to the new utility, and updates back button font, frame, and hit-testing behavior.
Extend compact toolbar UI tests
ios/cmuxUITests/cmuxUITests.swift, Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/MobileLeadingToolbarTitleWidthTests.swift
The workspace toolbar UI test revalidates compact state after creation, and new width tests cover fallback and reserved-space combinations.
Change compact-stack auto-open timing
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift
WorkspaceShellView replaces workspace-list change handling with an on-appear call to auto-open the selected workspace in the compact stack.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • manaflow-ai/cmux#7092: Both PRs change the iOS toolbar/title/back-button composition and the width calculations used for the workspace title area.
  • manaflow-ai/cmux#7097: Both PRs touch WorkspaceChatPane and WorkspaceDetailView+AgentChat.swift wiring around chat-pane construction and title-menu content.

Poem

A rabbit hopped through toolbar code,
And trimmed the chat-pane load,
Widths and buttons found their place,
Tests kept every frame in grace,
Hop hop, the UI trots steady along 🐇


Important

Pre-merge checks failed

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

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Blocking Runtime ❌ Error The UI test adds a raw 5s RunLoop.current.run delay and polling waits instead of a real signal, which is timing-based synchronization. Replace the fixed delay with a state-based expectation/observer (or remove it) and keep waiting logic limited to deterministic test signals like waitForExistence.
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (23 passed)
Check name Status Explanation
Description check ✅ Passed Covers summary, rationale, and testing, but omits the demo video, review trigger block, and checklist.
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 Touched production code is SwiftUI UI or a pure value helper; main-actor stores remain annotated and no new isolation debt was introduced.
Cmux Browser Automation Off-Main ✅ Passed The PR only refactors iOS workspace toolbar/UI and UI tests; it doesn't touch browser socket automation routing, waits, or worker-lane policy.
Cmux Expensive Synchronous Load ✅ Passed PASS: The PR only refactors toolbar/agent-chat UI and async chat refresh; no RestorableAgentSessionIndex.load() or large-file sync parsing was added to body/menu/close paths.
Cmux Cache Substitution Correctness ✅ Passed Cache use is transient UI state only; chat sessions still seed from the authoritative RPC pull, with event-stream updates and cold-cache fallbacks.
Cmux No Hacky Sleeps ✅ Passed PASS: The diff only touches Swift sources/tests; the rule scopes non-Swift runtime scripts, and the only fixed waits are in test-only Swift scaffolding.
Cmux Algorithmic Complexity ✅ Passed No new nested or repeated scans were introduced; the patch is mostly constant-time toolbar math and UI wiring, while existing single-pass lookups remain unchanged.
Cmux Swift Concurrency ✅ Passed No new DispatchQueue/Combine/completion-handler code; added async work is SwiftUI .task or button-action tasks at UI boundaries.
Cmux Swift @Concurrent ✅ Passed Changed async work is UI-bound; network fetches hop to MobileChatEventSource actor and chat state lives in @MainActor ChatConversationStore, so no missing/invalid @concurrent.
Cmux Swift File And Package Boundaries ✅ Passed The PR adds a small package utility and keeps the large Swift files within the allowed boundaries; no file crosses the oversize/addition thresholds.
Cmux Swiftpm Lockfiles ✅ Passed PASS: The PR only changes source/tests; no Package.swift, project, or lockfile diffs, and the package .gitignore only ignores .build/.
Cmux Swift Logging ✅ Passed Only logging hit is a #if DEBUG NSLog in WorkspaceDetailView.swift; no production print/dump/Logger misuse appears in the changed files.
Cmux User-Facing Error Privacy ✅ Passed Added user-facing copy is generic (e.g. feedback error/help text, toolbar labels) and exposes no vendor, provider, id, token, or payload details.
Cmux Full Internationalization ✅ Passed No new production user-facing copy was added; touched strings are existing localized keys, and their catalog entries already include en/ja translations.
Cmux Swiftui State Layout ✅ Passed No banned SwiftUI state-layout pattern appears: no new ObservableObject/@published, no GeometryReader, no lazy row store refs, and state writes are lifecycle-driven.
Cmux Architecture Rethink ✅ Passed Toolbar ownership is centralized in WorkspaceDetailView; no production timing/observer workaround was added, and the RunLoop wait is test-only.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed Diff only refactors iOS workspace toolbar views/tests; no NSWindow/WindowGroup code or cmuxAuxiliaryWindowIdentifiers changes, so the rule doesn’t apply.
Cmux Source Artifacts ✅ Passed All changed paths are hand-written source/tests under source trees; no logs, screenshots, build outputs, caches, temp, or DerivedData paths appear.
Cmux No Test Or Debug Seam In Production Source ✅ Passed PASS: the touched Sources files add only toolbar/layout refactors; no new test hooks or debug-observability accessors were introduced. Existing #if DEBUG debug-log UI is a real debug feature.
Cmux No Ambient Global State ✅ Passed No new file-scope funcs/vars or singletons; new helper types are instance-based views/value types, and static lets are allowed.
Title check ✅ Passed The title is concise and broadly matches the PR’s iOS toolbar lifecycle and glass-styling changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch task-ios-toolbar-regression

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 30, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes iOS toolbar glass and lifecycle regressions by consolidating all workspace toolbar ownership (back button, title menu, trailing cluster, dialogs, sheets) onto the stable WorkspaceDetailView instead of duplicating it across the terminal, browser, and chat subtrees. It also replaces the centered-principal MobileNavTitleWidth width model with a leading-item MobileLeadingToolbarTitleWidth, inserts a ToolbarSpacer(.fixed) between the back button and title on iOS 26+, and removes explicit glass button styling from workspace controls so the toolbar context supplies it natively.

  • Toolbar ownership fix: workspaceDetailToolbar is now applied once in WorkspaceDetailView.body (iOS path); WorkspaceChatPane and the browser/terminal sub-paths no longer each declare their own .toolbar, eliminating the split-ownership lifecycle bug.
  • Width math update: MobileLeadingToolbarTitleWidth replaces the symmetric 2×max-side centered formula with a simpler leading + trailing + margins subtraction appropriate for a .topBarLeading item; new unit tests cover the key scenarios.
  • Keyboard chrome refactor: ChatKeyboardTrackingViewController adds a bottomChromeContainerView that wraps the composer and background views, decoupling the scroll-edge interaction attachment point from the composer view itself.

Confidence Score: 5/5

Safe to merge; changes are well-scoped toolbar ownership and keyboard chrome refactors with no runtime-critical regressions found.

The toolbar consolidation is architecturally clean — one stable owner, no duplicate modifier stacks, and the width-math replacement correctly adjusts the formula for a leading vs. centered placement. The keyboard chrome container insertion is carefully mirrored across constraints, animation cancellation, and scroll-edge interaction. The only issue is a new #if DEBUG accessibility seam that extends an existing pattern in ChatTranscriptUITableView, which is a code-organisation concern but does not affect shipping behaviour.

No files require special attention for merge safety.

Important Files Changed

Filename Overview
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift Core toolbar consolidation: all iOS toolbar modifiers (back button, title menu, trailing cluster, dialogs, sheets) are moved to a single stable .toolbar { workspaceDetailToolbar } application on the top-level content, eliminating duplicate ownership across terminal/browser/chat subtrees.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceChatPane.swift Significantly simplified: toolbar, title menu, and header content removed from this subview since WorkspaceDetailView now owns the toolbar identity. Generic TitleMenuContent type parameter also dropped.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/MobileLeadingToolbarTitleWidth.swift New file replacing MobileNavTitleWidth: width formula changed from centered-principal symmetric reserve (2×max-side) to a simple leading+trailing+margins subtraction, which is correct for a .topBarLeading placement.
Packages/iOS/CmuxAgentChatUI/Sources/CmuxAgentChatUI/Transcript/ChatTranscriptUITableView.swift Adds debugBottomEdgeElementContainerRegistered and recordBottomEdgeElementContainerRegistration as new #if DEBUG test-observability seams in production Sources; extends the existing keyboard-vitals debug accessibility mechanism but introduces a new no-production-caller seam.
Packages/iOS/CmuxAgentChatUI/Sources/CmuxAgentChatUI/Screen/ChatKeyboardTrackingViewController.swift Introduces bottomChromeContainerView as an intermediate UIView container for composerBackgroundView and composerHostingController; cleanly updates all layout constraints and animation-cancellation to include it.
Packages/iOS/CmuxAgentChatUI/Sources/CmuxAgentChatUI/Screen/ChatScrollEdgeCoordinator.swift Renames composerView to bottomChromeView and adds #if DEBUG calls to recordBottomEdgeElementContainerRegistration; new debug calls extend the test-seam pattern flagged above.

Reviews (12): Last reviewed commit: "Gate terminal text sheet to terminal mod..." | Re-trigger Greptile

in: app,
context: "fresh no-agent workspace immediately after create"
)
RunLoop.current.run(until: Date().addingTimeInterval(5))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Wall-clock wait for toolbar persistence check

RunLoop.current.run(until: Date().addingTimeInterval(5)) measures calendar time starting from whenever the previous assertions finish, not from the moment the workspace finishes its initial settle. On a CI runner under load, assertWorkspaceToolbarVisible for "immediately after create" can itself take up to 4 seconds (each waitForExistence(timeout: 4)), so the 5-second window might expire just as toolbar state is stabilising rather than 5 seconds after it was first stable. Using XCTestExpectation with fulfillmentTimeout: or XCTest's built-in wait(for:timeout:enforceOrder:) would give a deterministic 5-second window relative to a known event rather than to an arbitrary point in the test timeline.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@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 `@ios/cmuxUITests/cmuxUITests.swift`:
- Around line 304-322: The test in cmuxUITests should stop using a fixed
5-second wait between two toolbar checks and instead poll continuously for the
full window. Replace the RunLoop.current.run pause with repeated validation
using assertWorkspaceToolbarVisible (or equivalent state checks on
freshBackButton, freshTitleMenu, and freshTerminalDropdown) so the test fails
immediately if the toolbar disappears or changes during the interval. Keep the
final assertBackButtonFrameStaysCompactAroundPress check, but make the waiting
logic causality-based rather than a blind sleep.

In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift`:
- Around line 174-181: The browser-title branch in WorkspaceDetailView is
duplicating title styling instead of using the shared WorkspaceToolbarTitleView.
Update the activeBrowser path to route browser.title through
WorkspaceToolbarTitleView the same way the default branch does, preserving the
existing fallback to workspace.name and selectedToolbarSubtitle where
appropriate. This keeps truncation and typography consistent and avoids
diverging styling between the browser and non-browser states.
🪄 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: 53064651-548c-4a66-a867-9fec3e667982

📥 Commits

Reviewing files that changed from the base of the PR and between 2aaee8d and 849417a.

📒 Files selected for processing (4)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceChatPane.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView+AgentChat.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift
  • ios/cmuxUITests/cmuxUITests.swift
💤 Files with no reviewable changes (1)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView+AgentChat.swift

Comment thread ios/cmuxUITests/cmuxUITests.swift
Comment on lines +174 to +181
} else if let browser = activeBrowser {
Text(browser.title ?? workspace.name)
.font(.headline)
.lineLimit(1)
.truncationMode(.tail)
.foregroundStyle(TerminalPalette.foreground)
} else {
WorkspaceToolbarTitleView(title: workspace.name, subtitle: selectedToolbarSubtitle)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Reuse WorkspaceToolbarTitleView for the browser title instead of ad hoc styling.

The browser branch hand-rolls Text(...).font(.headline)...foregroundStyle(...) while the default branch uses WorkspaceToolbarTitleView. Routing the browser title through the same component would keep truncation/typography consistent across modes and avoid drift if the shared title view's styling changes later.

♻️ Possible consolidation
-        } else if let browser = activeBrowser {
-            Text(browser.title ?? workspace.name)
-                .font(.headline)
-                .lineLimit(1)
-                .truncationMode(.tail)
-                .foregroundStyle(TerminalPalette.foreground)
-        } else {
+        } else if let browser = activeBrowser {
+            WorkspaceToolbarTitleView(title: browser.title ?? workspace.name, subtitle: nil)
+        } else {
             WorkspaceToolbarTitleView(title: workspace.name, subtitle: selectedToolbarSubtitle)
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
} else if let browser = activeBrowser {
Text(browser.title ?? workspace.name)
.font(.headline)
.lineLimit(1)
.truncationMode(.tail)
.foregroundStyle(TerminalPalette.foreground)
} else {
WorkspaceToolbarTitleView(title: workspace.name, subtitle: selectedToolbarSubtitle)
} else if let browser = activeBrowser {
WorkspaceToolbarTitleView(title: browser.title ?? workspace.name, subtitle: nil)
} else {
WorkspaceToolbarTitleView(title: workspace.name, subtitle: selectedToolbarSubtitle)
🤖 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/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift`
around lines 174 - 181, The browser-title branch in WorkspaceDetailView is
duplicating title styling instead of using the shared WorkspaceToolbarTitleView.
Update the activeBrowser path to route browser.title through
WorkspaceToolbarTitleView the same way the default branch does, preserving the
existing fallback to workspace.name and selectedToolbarSubtitle where
appropriate. This keeps truncation and typography consistent and avoids
diverging styling between the browser and non-browser states.

@cubic-dev-ai cubic-dev-ai 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.

No issues found across 10 files

Re-trigger cubic

Comment on lines 170 to 175
}
store.selectedWorkspaceID = selectedWorkspaceID
}
.onChange(of: store.workspaces.map(\.id)) { _, workspaceIDs in
compactNavigationPath.removeAll { !workspaceIDs.contains($0) }
autoOpenSelectedWorkspaceForSoakIfNeeded()
}
.onAppear {
autoOpenSelectedWorkspaceForSoakIfNeeded()
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Stale compact-path entry on workspace deletion

The onChange(of: store.workspaces.map(\.id)) block that contained compactNavigationPath.removeAll { !workspaceIDs.contains($0) } was removed without a replacement. When a workspace is deleted on the Mac while it is the current destination in compactNavigationPath, the stale ID remains in the path unless store.selectedWorkspaceID also changes at the same moment. If the Mac does not update selectedWorkspaceID (e.g. the user's selection was already on a different workspace on the Mac side, or there are no remaining workspaces to select), the onChange(of: store.selectedWorkspaceID) handler never fires, and WorkspaceDetailContainer is left rendering a workspace ID that no longer exists in the store. The user must manually press the back button to escape; no automatic recovery occurs.

@azooz2003-bit azooz2003-bit changed the title Fix iOS workspace toolbar lifecycle Fix iOS toolbar glass and lifecycle Jul 2, 2026
@azooz2003-bit
azooz2003-bit merged commit b94933a into main Jul 2, 2026
34 of 36 checks passed
@azooz2003-bit
azooz2003-bit deleted the task-ios-toolbar-regression branch July 2, 2026 07:43
austinywang added a commit that referenced this pull request Jul 2, 2026
Second sync with origin/main (6 commits, incl. #7116 iOS toolbar glass/lifecycle).
GhosttySurfaceView.swift auto-merged cleanly on top of the prior coordinator-based
resolution; multi-row invariants verified intact (instance persistentToolbarHeight
flows into the viewport snapshot's toolbarFrameHeight; no stale Self. static
reference). Only conflict was .github/swift-file-length-budget.tsv, regenerated via
scripts/swift_file_length_budget.py --write-budget (not hand-edited).

This branch was successfully deployed

1 active deployment
Preview – cmux — cb6fa074 Deployed Jul 2, 2026 by vercel[bot]
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