Conversation
Add RxCodeWidget extension with Live Activity support to display running job status, including the MobileLiveActivityCoordinator and app group entitlements for sharing data between the app and widget. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The desktop issued a fresh push-to-start every time a session began streaming, and ended the activity with an auto-dismissal date when it stopped. Re-running the same thread therefore spent a new push-to-start each time, exhausting the iOS push-to-start budget. Once the budget is exhausted, liveactivitiesd accepts the APNs push but silently refuses to start the activity, so the Live Activity never appears. Now an activity is created once per session and reused for its lifetime: it flips between "running" and "done" via update pushes and is never ended or auto-dismissed by the desktop. The user dismisses it manually. The mobile coordinator observes activityStateUpdates and reports the dismissal so the desktop forgets the activity and the next run of that session starts a fresh one. - Payload: add LiveActivityTokenPayload.activityDismissed - MobileLiveActivityCoordinator: observe activityStateUpdates, report dismissal/end to the desktop - MobileSyncService: reuse the activity (running <-> done), drop sendLiveActivityEnd and the dismissal-date, handle the dismissal signal, track isDone per job Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add `extraSystemPrompt` to BackendSendRequest and thread it through ClaudeService into a single `--append-system-prompt` value - Surface the current branch briefing and installed-skill context to the Claude agent as background context - Fetch OpenAI curated skills into the marketplace, store SKILL.md instructions, and clip skill prompt context to a token budget - Defer Live Activity push-to-start so a foregrounded device can start the activity locally without spending the push-to-start budget - Show an active-jobs chip on mobile briefing cards Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
This PR adds iOS widget + Live Activity support for tracking ongoing RxCode jobs, expands the mobile companion to remotely manage desktop configuration (skills, ACP clients, MCP servers) and view per-thread changes, and updates the desktop + relay server plumbing to support these new capabilities (including new marketplace sources and push delivery modes).
Changes:
- Added a WidgetKit extension + shared App Group snapshot store, and implemented an aggregate “jobs” Live Activity (push-to-start + update token flow).
- Added mobile screens for Skills / ACP Clients / MCP Servers management plus a “View Changes” sheet and supporting desktop sync events.
- Updated the relay
/pushendpoint to supportliveactivityandbackgroundpush types, and expanded marketplace + Git cloning support.
Reviewed changes
Copilot reviewed 64 out of 64 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| RxCodeWidget/RxCodeWidgetLiveActivity.swift | Implements Dynamic Island + lock screen UI for an aggregate jobs Live Activity. |
| RxCodeWidget/RxCodeWidgetData.swift | Defines the shared widget snapshot model + App Group storage helpers. |
| RxCodeWidget/RxCodeWidgetBundle.swift | Registers the widget + live activity in a WidgetBundle. |
| RxCodeWidget/RxCodeWidget.swift | Implements the home-screen widget timeline + UI. |
| RxCodeWidget/RxCodeWidget.entitlements | Adds App Group entitlement for widget extension. |
| RxCodeWidget/RxCodeJobActivity.swift | Defines shared ActivityKit attributes/content-state wire contract. |
| RxCodeWidget/Info.plist | Widget extension Info.plist. |
| RxCodeWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json | Widget asset catalog entry. |
| RxCodeWidget/Assets.xcassets/Contents.json | Widget asset catalog metadata. |
| RxCodeWidget/Assets.xcassets/AppIcon.appiconset/Contents.json | Widget extension icon set metadata. |
| RxCodeWidget/Assets.xcassets/AccentColor.colorset/Contents.json | Widget accent color asset metadata. |
| RxCodeMobile/Views/ThreadChangesSheet.swift | New mobile sheet to view thread edits + uncommitted git changes and drill into diffs. |
| RxCodeMobile/Views/QRScannerView.swift | Keeps AVCapture preview correctly rotated (notably iPad). |
| RxCodeMobile/Views/ProjectsSidebar.swift | Adds TipKit popover tips to key sidebar controls. |
| RxCodeMobile/Views/OnboardingView.swift | Adds TipKit pairing tip on onboarding actions. |
| RxCodeMobile/Views/NewThreadSheet.swift | Adds TipKit tips to config controls and changes interactive dismissal behavior. |
| RxCodeMobile/Views/MobileTips.swift | Defines mobile TipKit tips used across views. |
| RxCodeMobile/Views/MobileSkillMarketView.swift | New mobile skills marketplace browser + install/remove + custom git sources. |
| RxCodeMobile/Views/MobileSettingsView.swift | Adds “Desktop Configuration” section + TipKit tips for settings controls. |
| RxCodeMobile/Views/MobileMCPServersView.swift | New mobile MCP server list + add/edit form + enable/disable + remove flow. |
| RxCodeMobile/Views/MobileChatView.swift | Adds “View Changes” action and presents ThreadChangesSheet. |
| RxCodeMobile/Views/MobileBriefingView.swift | Adds active-job count chip per project + TipKit briefing tip. |
| RxCodeMobile/Views/MobileACPClientsView.swift | New mobile ACP client manager (installed + registry install/remove/enable). |
| RxCodeMobile/State/MobileLiveActivityCoordinator.swift | iOS-side Live Activity token observation + local-start coordination. |
| RxCodeMobile/State/MobileAppState.swift | Adds state + request/response handling for skills/ACP/MCP + thread changes + widget snapshot refresh. |
| RxCodeMobile/RxCodeMobileApp.swift | Configures TipKit and binds the live activity coordinator at app start. |
| RxCodeMobile/RxCodeMobile.entitlements | Adds App Group entitlement for the mobile app. |
| RxCodeMobile/Info.plist | Enables Live Activities (incl. frequent updates). |
| RxCodeMobile/AppDelegate.swift | Handles widget snapshot background pushes and updates App Group store. |
| RxCode/Views/UserManualView.swift | Updates manual copy from “plugins” to “skills” marketplace messaging. |
| RxCode/Views/Tips/RxCodeTips.swift | Adds desktop TipKit tips for key features (MCP/ACP/mobile/briefing/search/etc.). |
| RxCode/Views/Sidebar/ProjectTreeView.swift | Adds TipKit tip to briefing button in sidebar. |
| RxCode/Views/SettingsView.swift | Adds Skill Marketplace as a settings tab and wires TipKit tips. |
| RxCode/Views/Settings/MobileSettingsTab.swift | Adds TipKit tip to pairing UI. |
| RxCode/Views/Settings/MCPSettingsTab.swift | Adds TipKit tip to MCP settings. |
| RxCode/Views/Settings/ACPClientSettingsTab.swift | Adds TipKit tip to ACP settings. |
| RxCode/Views/MainView.swift | Adds TipKit tips for global search and agent selection controls. |
| RxCode/Views/Chat/SkillMarketView.swift | Adds custom git sources UI and switches install/remove to RxCode-managed state. |
| RxCode/Views/Chat/GitHubSheet.swift | Adds “Custom” repos tab with add/clone/remove flows. |
| RxCode/Services/PersistenceService.swift | Persists custom git repo list to disk. |
| RxCode/Services/NotificationService.swift | Adds local notification for remote desktop config changes. |
| RxCode/Services/MobileSyncService.swift | Adds Live Activity + widget push orchestration and mobile remote-config request routing. |
| RxCode/Services/MCPService.swift | Adds globalRecords() to return full MCP server records for editing UIs. |
| RxCode/Services/MarketplaceService.swift | Adds OpenAI skills ingestion, custom git marketplace sources, and RxCode-owned skill install state. |
| RxCode/Services/GitHubService.swift | Adds clone-by-URL helper (git clone to specified path). |
| RxCode/Services/ClaudeService.swift | Adds per-request extraSystemPrompt support and merges system prompt append sections. |
| RxCode/App/RxCodeApp.swift | Configures TipKit in the macOS app. |
| RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme | Adds mobile test targets to the scheme. |
| RxCode.xcodeproj/project.pbxproj | Adds a WidgetKit extension target and embeds it in the mobile app. |
| relay-server/README.md | Documents new /push delivery modes (alert, liveactivity, background). |
| relay-server/push.go | Implements new push delivery modes and raw payload forwarding. |
| README.md | Updates top-level feature list to reflect skills marketplace changes. |
| Packages/Sources/RxCodeCore/Utilities/GitHelper.swift | Adds helper to compute staged/unstaged/untracked diffs for “uncommitted changes”. |
| Packages/Sources/RxCodeCore/Models/MarketplacePlugin.swift | Extends marketplace models for sources/custom sources and RxCode-owned install records. |
| Packages/Sources/RxCodeCore/Models/GitHubModels.swift | Adds CustomRepo model. |
| Packages/Sources/RxCodeCore/Backend/BackendCapability.swift | Adds .skills capability and enables it for providers. |
| Packages/Sources/RxCodeCore/Backend/AgentBackend.swift | Adds extraSystemPrompt to backend send request. |
| Packages/Sources/RxCodeChatKit/MessageListView.swift | Removes scroll-phase-based Textual selection toggling. |
| Packages/Sources/RxCodeChatKit/MarkdownView.swift | Disables Textual text selection permanently to avoid scroll jank. |
| Packages/Sources/RxCodeChatKit/InputBarView.swift | Adds TipKit popover tip for plan mode. |
| Packages/Sources/RxCodeChatKit/FeatureTips.swift | Defines ChatFeature TipKit tips. |
| Packages/Sources/RxCodeChatKit/ChangeDiffView.swift | Adds a full-screen diff renderer for mobile “View Changes” detail. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| payloadBytes, _ := notif.Payload.([]byte) | ||
| log.Printf( | ||
| "apns push send: device=%s category=%q collapse_id=%q collapse_len=%d payload_bytes=%d enc_bytes=%d", | ||
| short(req.DeviceToken), | ||
| req.Category, | ||
| req.CollapseID, | ||
| len(req.CollapseID), | ||
| len(raw), | ||
| len(req.EncryptedAlertB64), | ||
| "apns push send: mode=%s device=%s category=%q collapse_id=%q payload_bytes=%d", | ||
| mode, short(req.DeviceToken), req.Category, req.CollapseID, len(payloadBytes), | ||
| ) |
| // pushHandler returns an http.HandlerFunc that signs and forwards APNs pushes. | ||
| // | ||
| // Auth is intentionally minimal in v1: any client may submit, since the | ||
| // payload itself is E2E-encrypted to the recipient device. A future hardening | ||
| // pass should require a signed sender token (see plan: risk areas). | ||
| // Auth is intentionally minimal in v1: any client may submit, since the alert | ||
| // payload itself is E2E-encrypted to the recipient device. Live Activity and | ||
| // widget payloads are not encrypted (ActivityKit / WidgetKit consume them | ||
| // directly); a future hardening pass should require a signed sender token. |
| Toggle("", isOn: Binding( | ||
| get: { server.isGloballyEnabled }, | ||
| set: { value in Task { await state.setMCPServerEnabled(server.name, enabled: value) } } | ||
| )) | ||
| .labelsHidden() |
| let clonePath = "\(home)/RxCode/\(repo.name)" | ||
| let fm = FileManager.default | ||
| if !fm.fileExists(atPath: "\(home)/RxCode") { | ||
| try fm.createDirectory(atPath: "\(home)/RxCode", withIntermediateDirectories: true) |
| func requestThreadChanges(sessionID: String) async { | ||
| guard isPaired else { return } | ||
| let requestID = UUID() | ||
| pendingThreadChangesID = requestID | ||
| isLoadingThreadChanges = true |
|
🎉 This PR is included in version 1.8.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
No description provided.