Repository navigation
feat(mobile): support Duo in the shared iOS app - #12648
Conversation
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
3f80f56 to
2669f8d
Compare
8b56c0e to
5b715dc
Compare
5b715dc to
5912dc8
Compare
5912dc8 to
618a644
Compare
be6cffd to
d7eb6a0
Compare
d7eb6a0 to
33fb4da
Compare
|
Addressed the short-Duo root presentation mismatch in b8969e0. Settings and New Task now select presentation using the same shared native metrics as the workspace. Focused tests, typecheck, lint, and React Doctor pass. The PR description now follows the template and records maintainer scope and verification. The walkthrough mentioning a Duo build flag/profile describes an older revision: the current app detects hinge support at runtime, shares one binary, and uses the existing OTA channels. Please assess the latest head. |
|
@coderabbitai The description warning is based on an obsolete diff. At b8969e0, T3CODE_IOS_DUO_BUILD, T3DuoEnabled, preview:duo, and preview-duo are absent. See the current app config and EAS profiles. The description accurately records one shared iOS binary and the existing OTA channels. This is maintainer-authored work explicitly directed and scoped by Julius in this T3 thread, not an external contribution requiring prior issue approval. Please refresh the walkthrough and description check against the current head rather than restoring the removed deployment split. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
git rev-parse HEAD
gh pr view 12648 --repo pingdotgg/t3code --json headRefOid,body
fd -t f '^(app\.config\.ts|eas\.json|NativeWorkspaceColumns\.ios\.tsx|T3NativeControlsModule\.swift|fingerprint\.config\.js)$' apps/mobile
ast-grep outline apps/mobile/app.config.ts
ast-grep outline apps/mobile/src/native/NativeWorkspaceColumns.ios.tsx
ast-grep outline apps/mobile/modules/t3-native-controls/ios/T3NativeControlsModule.swift
sed -n '1,240p' apps/mobile/app.config.ts
cat apps/mobile/eas.json
sed -n '1,100p' apps/mobile/src/native/NativeWorkspaceColumns.ios.tsx
rg -n -C 4 'hinge|supportsWorkspaceColumns|duoEnabled|T3DuoEnabled' apps/mobile/modules/t3-native-controls/ios/T3NativeControlsModule.swift
rg -n -C 2 'T3CODE_IOS_DUO_BUILD|T3DuoEnabled|preview:duo|preview-duo' apps/mobile docs/operations/mobile-screens-fork.md || trueLength of output: 21742
Thanks for clarifying the maintainer scope. The external-contribution prior-issue concern does not apply here. I’m requesting a regenerated walkthrough and a fresh review against the current head. Neither should request restoration of the removed deployment split. ✏️ Learnings added
|
|
@coderabbitai full review |
✅ Action performedFull review finished. |
|
🚀 Expo continuous deployment is ready!
|
|
Fixed the failed cloud build in 71c3f0d. EAS auto selected an SDK without UIHingeInteraction, verticalBarEdge, or reservedRegions; the Swift compiler-version guard does not establish SDK availability. All shared iOS profiles now pin the documented macos-tahoe-26.6-xcode-27.1 image. EAS config resolves preview:dev to that image. A replacement preview:dev iOS build is being uploaded. |
|
The replacement preview:dev iOS build finished successfully on 71c3f0d with the pinned Xcode 27.1 image. This confirms the missing UIKit SDK symbols from the previous cloud build are resolved. |
Problem
Duo needs to adapt between its folded phone layout and expanded workspace within the same iOS app. The previous app does not account for hinge and toolbar reservations.
Change
The shared v5 navigator now supports the iPhone Duo's folded and expanded layouts. UIKit owns column presentation and toolbar placement; the existing Expo app, React Navigation router, conversation selection, and composer drafts remain shared.
This adds iOS 27.1 fold/occlusion and vertical-toolbar metrics and keeps composers and bottom controls in a usable region. The same iOS binary detects UIKit hinge capability at runtime, including while Duo is folded. Ordinary iPhones retain their existing navigator and portrait policy; iPad retains its existing header controls, sizing thresholds, bubble widths, and scroll adjustment. There is no Duo build flag, EAS profile, or separate OTA channel. Use the existing preview and production profiles. All shared iOS profiles pin the EAS image
macos-tahoe-26.6-xcode-27.1; the default SDK 58 image lacks the Duo UIKit APIs. The native APIs require a new binary built with the iOS 27.1 SDK; an OTA cannot add them to an older binary. The Screens fork is pinned to5.0.0-t3.8, which applies item axis behavior when UIKit creates header and search-placement items. The underlying v5/iPad migration has already landed on main.Folded Home uses the phone's bottom Search/Filter/New Chat toolbar. Expanded Home uses the iPad-style sidebar header and a full-width search row. New Chat has its own rail group; rail Search appears only while the sidebar is hidden and uses the same reveal-and-focus action as keyboard Search. Settings navigator containers leave horizontal insets to their leaf screens so the toolbar reservation is applied once.
Scope and approval
Maintainer-authored work directed by Julius: add Duo support to the existing Expo app, preserve regular iPhone and iPad behavior, and prepare this PR for merge. The shared v5/iPad migration has already landed separately.
Verification
Before and after the expanded sidebar change:
Before and after the Settings inset correction:
Built one unified iOS development client with the iOS 27.1 SDK and installed the same app bundle on Duo, iPhone 17 Pro on iOS 26.5, and 11-inch iPad on iPadOS 26.5. Verified identical installed bundle hashes. Checked ordinary-phone portrait lock, bottom Search, Settings push/back; iPad portrait/landscape, sidebar/inspector switching, and thread selection with Files open; Duo folded Home's bottom Search, expanded sidebar Search and separate New Task rail, Settings width, and conversation/draft retention through open, half-open, and closed poses. A folded cold launch now selects the native host after attached-window hinge detection and supplies the collapsed column before UIKit attaches it, preventing an empty screen.
Settings and New Task now use the same native metrics as the workspace when selecting card versus sheet presentation, including short regular-width Duo windows. The 47 layout and reserved-region tests pass after this correction. This selector correction has not received another simulator pass.
Mobile TypeScript, targeted lint, and 72 focused layout/reserved-region/stack/scroll-edge tests pass. React Doctor reports no issues in changed code. Earlier Opus 5.5 and Fable 5.1 adversarial review rounds returned approve with caveats after their concrete blockers were fixed. Hardware ⌘F reveal/focus and keyboard behavior on physical devices remain unverified.
The split host now allows the sidebar width to reach the fold rather than capping it at 380pt. Regression checks restored the iPad’s existing left-side New Chat/maximize group and visible-sidebar controls. Search reveal now belongs to the shared keyboard action, and native column support handles patch-version strings.
Recording: switching threads with the Files inspector open on 13-inch iPad
Final unified binary verification:
Recording: folded Duo cold launch reaches Home
Built with GPT-6.1-sol through the Codex harness in T3 Code.