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 introduces first-pass Android client support for RxCode (new Gradle-based RxCodeAndroid app with a Compose UI and the necessary sync/crypto/pairing plumbing), while also tightening cross-platform mobile/desktop sync correctness (snapshot sequencing + branch/worktree race prevention) and improving desktop UX around chat archiving and stuck streams.
Changes:
- Add a new Android application project (
RxCodeAndroid) including Gradle wrapper, dependency versions, app manifest/resources, sync stack, and Compose UI screens/sheets. - Improve mobile sync robustness: add desktop-stamped snapshot
seqand mobile-side stale snapshot dropping; add a branch-op wait to prevent worktree/session spawn races. - Desktop UI/behavior improvements: archive confirmations, stream inactivity watchdog, and safer stdin writing to Claude CLI.
Reviewed changes
Copilot reviewed 97 out of 125 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| RxCodeMobile/Views/ThreadTodoSheet.swift | Use LazyVStack for todo rendering inside the sheet scroll view. |
| RxCodeMobile/Views/NewThreadSheet.swift | Wait for pending branch ops before spawning sessions; optimistic picked-branch UI label handling. |
| RxCodeMobile/State/MobileAppState+Persistence.swift | Reset snapshot-seq gate when switching desktops. |
| RxCodeMobile/State/MobileAppState+Intents.swift | Add waitForPendingBranchOps to avoid worktree/session races. |
| RxCodeMobile/State/MobileAppState+Inbound.swift | Drop out-of-order snapshots; guard against clobbering messages with empty pages. |
| RxCodeMobile/State/MobileAppState.swift | Add lastAppliedSnapshotSeq tracking. |
| RxCodeAndroid/settings.gradle.kts | Android project settings + repository configuration (incl. JitPack). |
| RxCodeAndroid/gradlew.bat | Add Windows Gradle wrapper script. |
| RxCodeAndroid/gradlew | Add Unix Gradle wrapper script. |
| RxCodeAndroid/gradle/wrapper/gradle-wrapper.properties | Configure Gradle wrapper distribution. |
| RxCodeAndroid/gradle/libs.versions.toml | Centralize Android dependency/plugin versions. |
| RxCodeAndroid/gradle.properties | Android/Gradle defaults (AndroidX, R class namespacing, JVM args). |
| RxCodeAndroid/build.gradle.kts | Root Gradle plugin aliases. |
| RxCodeAndroid/app/src/main/res/xml/data_extraction_rules.xml | Add baseline data extraction rules resource. |
| RxCodeAndroid/app/src/main/res/xml/backup_rules.xml | Add baseline backup rules resource. |
| RxCodeAndroid/app/src/main/res/values/themes.xml | Define base app theme (light). |
| RxCodeAndroid/app/src/main/res/values/strings.xml | Add app name string resource. |
| RxCodeAndroid/app/src/main/res/values/colors.xml | Add base colors + launcher background color. |
| RxCodeAndroid/app/src/main/res/values-night/themes.xml | Define base app theme (dark). |
| RxCodeAndroid/app/src/main/res/mipmap-anydpi/ic_launcher.xml | Add adaptive launcher icon definition. |
| RxCodeAndroid/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml | Add round adaptive launcher icon definition. |
| RxCodeAndroid/app/src/main/res/drawable/ic_launcher_foreground.xml | Add launcher foreground vector. |
| RxCodeAndroid/app/src/main/res/drawable/ic_launcher_background.xml | Add launcher background vector. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/Time.kt | Add relative/absolute time formatting utilities. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/Markdown.kt | Add themed Markdown rendering wrapper. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/KeyboardDismiss.kt | Add modifier to dismiss keyboard on user scroll. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/Haptics.kt | Add haptics abstraction for Compose UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/theme/Theme.kt | Add Material3 theme/colors/shapes for Android app. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sync/SyncLoadingView.kt | Add Android sync splash/timed-out recovery view. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/ToolCallSheet.kt | Add tool-call detail bottom sheet UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/ThreadTodoSheet.kt | Add todo+summary bottom sheet + progress badge UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/RunProfilesSheet.kt | Add run profiles + active runs sheet UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/RunProfileEditorSheet.kt | Add run-profile editor sheet UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/RenameThreadSheet.kt | Add rename thread bottom sheet UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/QueuedMessagesSheet.kt | Add queued-messages bottom sheet UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/QuestionSheet.kt | Add AskUserQuestion UI sheet + answer submission model. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/PermissionApprovalSheet.kt | Add permission approval bottom sheet UI + JSON pretty print. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/NewThreadSheet.kt | Add new-thread bottom sheet UI (branch + plan mode + prompt). |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/FileDiffSheet.kt | Add diff viewer sheet UI with gutter numbering and wrap/scroll toggle. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/RxCodeApp.kt | Add Android root app composable + adaptive navigation + initial sync gating. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/projects/ProjectsScreen.kt | Add Android projects list screen + pull-to-refresh + branch badges. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/chat/EditPreview.kt | Add tool-call edit/write diff extraction utilities for chat UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/browser/InAppBrowserScreen.kt | Add in-app browser with desktop proxy support via WebView proxy override. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/browser/BrowserUrlDetector.kt | Add URL detection + localhost proxy bootstrap rewriting. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/briefing/BriefingGrouping.kt | Add briefing/thread grouping model for briefing UI. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/sync/SyncClient.kt | Add Android sync client wrapper over relay + encryption. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/store/PairingStore.kt | Add DataStore persistence for paired desktop metadata and selection. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/store/PairedDesktop.kt | Add paired desktop model + stable composite id. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/state/MobileState.kt | Add immutable UI state snapshot for Android app. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/RxCodeApplication.kt | Add Android Application with Hilt bootstrap. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/relay/RelayClient.kt | Add OkHttp WebSocket relay client w/ reconnect + ping behavior. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/TodoItem.kt | Add todo models + latest TodoWrite extraction from messages. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/RunProfile.kt | Add run profile/task/proxy models matching Swift wire format. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/Models.kt | Add core proto/domain models (projects, sessions, messages, etc.). |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/Json.kt | Add shared JSON config + Swift date/UUID serializers. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/Envelope.kt | Add relay envelope model + delivery failure parsing helper. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/pairing/PairingToken.kt | Add QR/deeplink pairing token parsing compatible with Swift. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/MainActivity.kt | Add Android entry activity, deep link handling, lifecycle wiring. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/identity/DeviceIdentity.kt | Add persistent X25519 device identity using Jetpack Security. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/di/AppModule.kt | Add Hilt DI module wiring identity/store/sync client. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/crypto/SessionCrypto.kt | Add X25519+HKDF+ChaCha20-Poly1305 session crypto implementation. |
| RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/crypto/Hex.kt | Add hex encoding/decoding helper. |
| RxCodeAndroid/app/src/main/AndroidManifest.xml | Add Android manifest (permissions, activity, pairing deeplinks). |
| RxCodeAndroid/app/src/debug/res/xml/debug_network_security_config.xml | Allow cleartext traffic in debug builds. |
| RxCodeAndroid/app/src/debug/AndroidManifest.xml | Hook debug network security config + cleartext flag. |
| RxCodeAndroid/app/proguard-rules.pro | Add baseline ProGuard rules file. |
| RxCodeAndroid/app/build.gradle.kts | Add Android app module Gradle configuration + dependencies. |
| RxCodeAndroid/app/.gitignore | Ignore app build output directory. |
| RxCodeAndroid/.kotlin/errors/errors-1779703100049.log | (Problematic) committed Kotlin incremental build error log. |
| RxCodeAndroid/.kotlin/errors/errors-1779703098971.log | (Problematic) committed Kotlin incremental build error log. |
| RxCodeAndroid/.kotlin/errors/errors-1779702003413.log | (Problematic) committed Kotlin incremental build error log. |
| RxCodeAndroid/.idea/vcs.xml | Add Android Studio VCS mapping metadata. |
| RxCodeAndroid/.idea/runConfigurations.xml | Add Android Studio run configuration producer settings. |
| RxCodeAndroid/.idea/misc.xml | Add Android Studio project JDK/language level settings. |
| RxCodeAndroid/.idea/migrations.xml | Add Android Studio Gradle migration settings. |
| RxCodeAndroid/.idea/gradle.xml | Add Android Studio Gradle linkage metadata. |
| RxCodeAndroid/.idea/deploymentTargetSelector.xml | Add Android Studio deployment target selector metadata. |
| RxCodeAndroid/.idea/compiler.xml | Add Android Studio compiler bytecode target metadata. |
| RxCodeAndroid/.idea/AndroidProjectSystem.xml | Add Android Studio project system metadata. |
| RxCodeAndroid/.idea/.gitignore | Ignore selected Android Studio workspace files. |
| RxCodeAndroid/.gitignore | Add Android project gitignore rules. |
| RxCode/Views/Sidebar/ProjectTreeView.swift | Add archive confirmation flow for session archive actions. |
| RxCode/Views/Sidebar/HistoryListView.swift | Add archive confirmation flow in history list. |
| RxCode/Views/Chat/RecentChatsSuggestionList.swift | Add archive confirmation flow in recent chats list. |
| RxCode/Services/ClaudeService+Process.swift | Improve spawn failure handling and use throwable file-handle writes to avoid crashes on broken pipe. |
| RxCode/Resources/Localizable.xcstrings | Add archive-related localization keys (currently empty entries). |
| RxCode/App/AppState+Worktree.swift | Add attach-worktree-for-existing-branch path for mobile branch selection. |
| RxCode/App/AppState+Stream.swift | Add stream inactivity watchdog helpers and reset watchdog timestamp on finalize. |
| RxCode/App/AppState+MobileSync.swift | Use worktree attach instead of main-repo checkout for mobile branch switching. |
| RxCode/App/AppState+MobileSnapshots.swift | Stamp outgoing snapshots with seq. |
| RxCode/App/AppState+MobileRemote.swift | Guard against overwriting non-empty messages with empty persistence loads. |
| RxCode/App/AppState+Messaging.swift | Guard against overwriting messages with empty initialMessages. |
| RxCode/App/AppState+CrossProject.swift | Start/maintain stream watchdog timestamp during stream processing. |
| RxCode/App/AppState.swift | Add monotonic snapshot seq counter for mobile snapshots. |
| Packages/Sources/RxCodeSync/Protocol/Payload.swift | Add SnapshotPayload.seq to the sync protocol. |
| Packages/Sources/RxCodeChatKit/TodoProgressView.swift | Use LazyVStack in todo popover for better performance. |
| Packages/Sources/MessageList/MessageList.swift | Add cooldown gating to load-more triggers to prevent rapid re-entrancy. |
| .github/workflows/test.yaml | Add Android Gradle build job to CI workflow. |
Files not reviewed (9)
- RxCodeAndroid/.idea/.gitignore: Language not supported
- RxCodeAndroid/.idea/AndroidProjectSystem.xml: Language not supported
- RxCodeAndroid/.idea/compiler.xml: Language not supported
- RxCodeAndroid/.idea/deploymentTargetSelector.xml: Language not supported
- RxCodeAndroid/.idea/gradle.xml: Language not supported
- RxCodeAndroid/.idea/migrations.xml: Language not supported
- RxCodeAndroid/.idea/misc.xml: Language not supported
- RxCodeAndroid/.idea/runConfigurations.xml: Language not supported
- RxCodeAndroid/.idea/vcs.xml: Language not supported
Comments suppressed due to low confidence (2)
RxCode/Resources/Localizable.xcstrings:1051
- This localization entry is currently an empty object. Please add the expected
localizationsstructure (at least the baseenvalue) so the key resolves predictably at runtime and stays consistent with the rest of the file.
},
"Archive Chat" : {
},
RxCode/Resources/Localizable.xcstrings:6798
- This localization key is added but has no
localizationspayload. Please add the base localization (and any required translations) or remove the entry if you intend to use the key string itself as the UI text.
},
"This chat will be archived. Archived chats are hidden from the active list and can be restored from Archived." : {
},
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| kotlin version: 2.0.21 | ||
| error message: java.io.EOFException | ||
| at java.base/java.io.DataInputStream.readUnsignedByte(Unknown Source) | ||
| at org.jetbrains.kotlin.com.intellij.openapi.util.io.DataInputOutputUtilRt.readINT(DataInputOutputUtilRt.java:16) | ||
| at org.jetbrains.kotlin.com.intellij.util.io.DataInputOutputUtil.readINT(DataInputOutputUtil.java:23) |
| kotlin version: 2.0.21 | ||
| error message: java.nio.file.NoSuchFileException: /Users/qiweili/Desktop/rxlab/RxCode/RxCodeAndroid/app/build/generated/ksp/debug/java/byRounds/1/dagger | ||
| at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source) | ||
| at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) | ||
| at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) |
| kotlin version: 2.0.21 | ||
| error message: java.nio.file.NoSuchFileException: /Users/qiweili/Desktop/rxlab/RxCode/RxCodeAndroid/app/build/kspCaches/debug/backups/java | ||
| at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source) | ||
| at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) | ||
| at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) |
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="ExternalStorageConfigurationManager" enabled="true" /> | ||
| <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> |
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="CompilerConfiguration"> | ||
| <bytecodeTargetLevel target="21" /> |
| <component name="deploymentTargetSelector"> | ||
| <selectionStates> | ||
| <SelectionState runConfigName="RxCode"> | ||
| <option name="selectionMode" value="DROPDOWN" /> | ||
| </SelectionState> | ||
| </selectionStates> | ||
| </component> |
| *.iml | ||
| .gradle | ||
| /local.properties | ||
| /.idea/caches | ||
| /.idea/libraries | ||
| /.idea/modules.xml |
| } | ||
| }, | ||
| "\"%@\" will be archived. Archived chats are hidden from the active list and can be restored from Archived." : { | ||
|
|
| fun relativeTime(instant: Instant, now: Instant = Instant.now()): String { | ||
| val delta = Duration.between(instant, now) | ||
| val absSeconds = abs(delta.seconds) | ||
| val past = delta.seconds >= 0 | ||
|
|
||
| fun word(noun: String, count: Long) = if (count == 1L) "1 $noun" else "$count ${noun}s" | ||
| fun phrase(text: String) = if (past) "$text ago" else "in $text" | ||
|
|
||
| return when { | ||
| absSeconds < 5 -> "just now" | ||
| absSeconds < 60 -> phrase("$absSeconds sec") | ||
| absSeconds < 3_600 -> phrase(word("min", absSeconds / 60)) |
| Row(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.fillMaxWidth()) { | ||
| TextButton( | ||
| onClick = onDismiss, | ||
| modifier = Modifier.padding(vertical = 4.dp), | ||
| ) { Text("Cancel") } | ||
| Spacer(Modifier.weight(1f)) | ||
| Button( | ||
| onClick = { | ||
| haptics.play(HapticEvent.LightTap) | ||
| onSubmit(planMode, prompt.trim(), selectedBranch) | ||
| }, | ||
| enabled = true, | ||
| colors = ButtonDefaults.buttonColors(), | ||
| ) { Text("Start") } | ||
| } |
useblacksmith/setup-gradle@v6 doesn't exist and resolves to gradle/actions (the org root, not a valid action), so the Android job failed in "Setup Gradle". Switch to the official gradle/actions/setup-gradle@v4 and the standard actions/setup-java@v5; keep the Blacksmith runner. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
🎉 This PR is included in version 1.12.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
No description provided.