feat: add plan mode and deep link support to mobile#26
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
This PR extends RxCode’s mobile companion and sync protocol to support plan mode workflows and notification deep links, while also enhancing desktop→mobile snapshots (usage + host metrics) and updating the marketing website to highlight the mobile app.
Changes:
- Mobile: add APNs deep-link navigation, per-thread plan-mode configuration, plan review/decision UI, multi-Mac pairing management, and refreshed chat/briefing/settings UIs.
- Desktop + Sync: add plan-decision transport, snapshot fields for usage + host metrics, and improve relay reconnect safety.
- Website: add an “Agent Collaboration” feature card and a “Mobile Companion” section (screenshots + App Store badge).
Reviewed changes
Copilot reviewed 30 out of 36 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| website/public/download-appstore.svg | Adds App Store download badge asset for the mobile section. |
| website/app/page.tsx | Adds mobile companion section, screenshots grid, and new feature card inclusion. |
| website/app/globals.css | Adds keyframes/styles for the agent-collaboration diagram animation. |
| website/app/agent-talk-feature.tsx | Introduces animated “Agents that talk to each other” feature card. |
| RxCodeMobile/Views/RootView.swift | Adds pending deep-link consumption and shared navigation helper. |
| RxCodeMobile/Views/OnboardingView.swift | Adds optional cancel button + pairing-completion callback for in-settings pairing. |
| RxCodeMobile/Views/NewThreadSheet.swift | Sends per-thread agent config (incl. plan mode) in new-session requests; updates config UI bindings. |
| RxCodeMobile/Views/MobileSettingsView.swift | Adds multi-Mac pairing management, usage/host-metrics sections, and summarization pickers. |
| RxCodeMobile/Views/MobileChatView.swift | Adds plan banner + plan sheet, improves auto-scroll behavior, and wires plan decisions. |
| RxCodeMobile/Views/MobileBriefingView.swift | Refreshes briefing list UI with glass-style cards. |
| RxCodeMobile/Views/MobileBriefingDetailView.swift | Refreshes briefing detail UI with glass-style cards and thread cards. |
| RxCodeMobile/State/MobileAppState.swift | Adds deep-link state, multi-desktop pairing persistence, plan extraction/decision sending, and host/usage snapshot fields. |
| RxCodeMobile/RxCodeMobileApp.swift | Drives relay connect/disconnect off scenePhase. |
| RxCodeMobile/AppDelegate.swift | Handles notification taps (including cold launch) and decrypts fallback payloads. |
| RxCode/Views/Toolbar/RxCodeToolbar.swift | Switches right-sidebar visibility to persisted @AppStorage key. |
| RxCode/Views/RunProfile/RunProfileToolbarGroup.swift | Opens run inspector via persisted right-sidebar visibility. |
| RxCode/Views/ProjectWindowView.swift | Lazily starts inspector based on persisted right-sidebar visibility. |
| RxCode/Views/MainView.swift | Updates Cmd+K logic and lazy inspector startup to use persisted right-sidebar visibility. |
| RxCode/Views/Inspector/RightInspectorPanel.swift | Keys panel visibility off @AppStorage and avoids forcibly re-opening it. |
| RxCode/Services/SystemMetricsService.swift | Adds desktop CPU/memory/thermal sampling for mobile “Computer Status”. |
| RxCode/Services/NotificationService.swift | Strips Markdown from assistant-summary notification bodies before posting. |
| RxCode/Services/MobileSyncService.swift | Routes incoming plan decisions to the desktop app via NotificationCenter. |
| RxCode/App/AppState.swift | Broadcasts usage + host metrics in snapshots; applies plan decisions from mobile; fixes cancel-stream redirect edge case; persists plan decision summaries into mobile messages. |
| Packages/Tests/RxCodeSyncTests/PayloadTests.swift | Adds snapshot tests for usage + host metrics decoding/compatibility. |
| Packages/Tests/RxCodeCoreTests/MarkdownStrippingTests.swift | Adds unit tests for Markdown stripping used in notifications. |
| Packages/Sources/RxCodeSync/Transport/RelayClient.swift | Prevents reconnect races from opening multiple sockets / duplicate relay registrations. |
| Packages/Sources/RxCodeSync/Protocol/Payload.swift | Adds plan-decision payload, usage + host-metrics snapshot fields, summarization options, and per-thread new-session config fields. |
| Packages/Sources/RxCodeCore/WindowState.swift | Introduces AppStorageKeys and removes WindowState-owned inspector visibility flag. |
| Packages/Sources/RxCodeCore/Utilities/MarkdownStripping.swift | Adds stripMarkdown utility for notification-safe plain text. |
| Packages/Sources/RxCodeCore/Models/RateLimitUsage.swift | Makes RateLimitUsage Codable/Equatable for sync transport. |
| Packages/Sources/RxCodeChatKit/PlanSheetView.swift | Makes PlanSheetView iOS-compatible (UIPasteboard, frame gating, imports). |
| .gitignore | Ignores Playwright MCP workspace folder. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+188
to
+195
| /// Consume a pending APNs deep link (set by a notification tap) and navigate | ||
| /// to its thread. Called both when the link changes and when the paired view | ||
| /// first appears, since a link can already be set at cold launch. | ||
| private func consumePendingDeepLink() { | ||
| guard let link = state.pendingDeepLink else { return } | ||
| state.pendingDeepLink = nil | ||
| navigate(toSession: link.sessionID, projectID: link.projectID) | ||
| } |
Comment on lines
+9
to
13
| @State private var showPairingSheet = false | ||
| @State private var desktopPendingRemoval: PairedDesktop? | ||
| @State private var modelDraft = "" | ||
| @State private var acpClientDraft = "" | ||
|
|
Comment on lines
+22
to
+29
| // Per-thread agent config. Seeded once from the desktop's current settings, | ||
| // then applied only to the thread this sheet creates (no longer mutates the | ||
| // desktop's global defaults). | ||
| @State private var planModeEnabled = false | ||
| @State private var selectedProvider: AgentProvider? | ||
| @State private var selectedModelID: String? | ||
| @State private var selectedPermissionMode: PermissionMode = .default | ||
| @State private var didSeedConfig = false |
Comment on lines
+67
to
+73
| @Test("snapshot carries agent usage") | ||
| func snapshotCarriesAgentUsage() throws { | ||
| let payload = Payload.snapshot( | ||
| SnapshotPayload( | ||
| projects: [], | ||
| sessions: [], | ||
| usage: MobileUsageSnapshot( |
Contributor
Author
|
🎉 This PR is included in version 1.7.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.