Skip to content

feat(mobile): mix Computer and Cloud conversations (#2179) - #2185

Merged
DoodleBears merged 9 commits into
mainfrom
codex/unified-mobile-conversations
Oct 18, 2026
Merged

DoodleBears merged 9 commits into
mainfrom
codex/unified-mobile-conversations

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Slice #2179 · Claim · Spec #2178 · Milestone v2.0

Why the change

Mobile users can open their paired Computer conversations and authenticated Cloud channels from one list while each message stays with its original service and identity.

Special things to note

Change outline

Mobile Chats
├─ current paired Computer → existing Host identity, roster, messages
└─ connected Cloud accounts → authorized organization + guest channels
   └─ open → select exact organization → existing Cloud API

Route / cache / draft key
├─ Computer: Host + conversation
└─ Cloud: connection + account + organization + channel
  • Shared row layout and trailing Computer/Cloud icon; remembered source filter and normalized search.
  • Directory reads restore the previous organization scope. Opening a Cloud channel does not change the Computer used by Host management.
  • Computer send is disabled offline. Unsent text survives reopening and is never submitted on reconnect.
  • Cloud cached history survives transient network failure; explicit access refusal clears it and prevents late cache reads from restoring it.

UAT validation

Tested source / integrated QA: d9155abe412dbdf4445394744f54d0e1f8743c4e. Evidence-only head: 0e9de978867db92b9f22738796a67f63f6f5eabc. Reviewed main-integration head: e65bd3e01b911622674135e317b927dc2f13aac8 (71 focused tests and mobile typecheck passed; original screenshots are from the tested source above, not a new native run). Existing SDK 58 native build 494a20f1e; JS-only reload, no native build/deploy.

  • Pre-integration CI passed, including prerelease preparation; tested-source CI also passed. Earlier full mobile suite: 688 passed / 8 skipped; final cold-start regressions: 42 passed. Independent Spec follow-up found no material issue in the final fix.
  • Simulator: mixed rows/source icons, Computer and organization filters, remembered filter; actual Computer send and Bot reply, with canonical Host CLI readback.
  • Cloud API readback confirmed the expected cloud user/organization and one committed message per explicit send. Cloud send succeeded with only the test Computer route disconnected.
  • Computer Send unavailable offline; existing history and draft retained. Cold restart restored Cloud identity/directory; Computer draft survived and was not sent on reconnect, verified in canonical history.
  • Original test state restored; only the newly created mobile session and Host device revoked. Latest refresh rejected, earlier CLI sessions preserved. Shared Simulator/8091 released; no Prod/merge.

The initial cold-start failure was retained and fixed: an empty organization sentinel could invalidate the saved session and block Home. New source passed fresh CI and runtime recheck. A development-tool floating button initially intercepted a keyboard Send tap; moving it through the UI restored the actual Send interaction. Neither initial attempt is counted as a successful send.

Mixed list — iOS Simulator, 402 × 874, light

Before: Computer conversations only; same fixture accounts and viewport.

Before: Computer-only conversation list

After: Computer and Cloud rows with source icons and source/organization filters.

After: mixed Computer and Cloud conversations

Computer channel — same viewport

Before/after header comparison; the after state also contains the uniquely marked UAT message sent during verification.

Before: Computer channel header

After: Computer source icon and canonical sent message

Offline and restart — actual UAT states

Left: Computer route offline, unsent draft retained and Send unavailable. Right: after cold restart and reconnect, the same draft remains unsent.

Offline Computer retains unsent draft

Restart and reconnect retain draft without automatic send

Watch offline Computer → Cloud send (4×) · Watch restored draft after restart

Dark mode and larger text

Mixed conversations in dark mode

Maximum Dynamic Type: scrollable rows, visibly truncated names

Full evidence and proof limits includes Cloud committed-message screenshots, actual incoming Bot reply, and default/intermediate/maximum text in both themes. Android/physical/VoiceOver/Human checks remain unverified. No #2180–2182 implementation in this PR.

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9

Issue: #2179

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2179

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2179

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 43 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: c410f263-a943-4a21-8964-f72b1c38d413
📥 Commits

Reviewing files that changed from the base of the PR and between be50cc0 and e65bd3e.

⛔ Files ignored due to path filters: 16
  • .github/pr-screenshots/2179-unified-conversations/after-computer-channel.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/after-list-fixed-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/after-list-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/after-list-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/after-list-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/after-list-max-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/before-computer-channel.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/before-list-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/cloud-offline-sent.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/computer-offline-draft.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/computer-received-keyboard.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/final-list-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/final-list-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2179-unified-conversations/offline-cloud-and-draft-4x.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/2179-unified-conversations/restart-draft.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/2179-unified-conversations/restart-restored-draft.png is excluded by !**/*.png
📒 Files selected for processing: 34
  • .github/pr-screenshots/2179-unified-conversations/README.md
  • apps/mobile/app/(tabs)/(home)/index.tsx
  • apps/mobile/app/channel/[id].tsx
  • apps/mobile/app/dm/[slug].tsx
  • apps/mobile/src/cloud/README.md
  • apps/mobile/src/cloud/client.ts
  • apps/mobile/src/cloud/conversations.ts
  • apps/mobile/src/cloud/native-conversations.ts
  • apps/mobile/src/cloud/native-message-cache.ts
  • apps/mobile/src/host/conversation-filter.ts
  • apps/mobile/src/host/host-session.ts
  • apps/mobile/src/host/native-conversation-filter.ts
  • apps/mobile/src/host/native-source-drafts.ts
  • apps/mobile/src/host/source-drafts.ts
  • apps/mobile/src/ui/chat/channel-title.tsx
  • apps/mobile/src/ui/chat/chat-title.tsx
  • apps/mobile/src/ui/chat/cloud-conversation-row.tsx
  • apps/mobile/src/ui/chat/conversation-row.tsx
  • apps/mobile/src/ui/chat/conversation-screen.tsx
  • apps/mobile/src/ui/chat/conversations.ts
  • apps/mobile/src/ui/chat/source-name.tsx
  • apps/mobile/src/ui/cloud/channels-screen.tsx
  • apps/mobile/src/ui/shell/open-conversation.ts
  • apps/mobile/src/ui/strings.ts
  • apps/mobile/test/cloud-channel-cache.test.tsx
  • apps/mobile/test/cloud-client.test.ts
  • apps/mobile/test/cloud-conversations.test.ts
  • apps/mobile/test/conversation-filter.test.ts
  • apps/mobile/test/conversation-navigation.test.tsx
  • apps/mobile/test/create-button.test.tsx
  • apps/mobile/test/home-search.test.tsx
  • apps/mobile/test/source-drafts.test.ts
  • changes/2179-unified-mobile-conversations.md
  • docs/architecture/botharness-architecture.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Issue: #2179

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@DoodleBears DoodleBears added this to the v2.0 milestone Oct 18, 2026
Issue: #2179

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@DoodleBears

Copy link
Copy Markdown
Contributor Author

Slice #2179 — UAT Simulator acceptance

Final head: 0e9de978867db92b9f22738796a67f63f6f5eabc. Functional source: d9155abe412dbdf4445394744f54d0e1f8743c4e; later commits only add evidence and format its README. Existing SDK 58 native build 494a20f1e, JS reload only.

  • Passed: mixed Computer/Cloud rows and filters; Computer send and incoming Bot reply; Cloud sends with the expected account/organization; Computer offline while Cloud remains usable; retained draft through cold restart/reconnect; no automatic resend. Host CLI and public Cloud API read-back confirm canonical persistence.
  • Final CI and prerelease preparation passed. Earlier full mobile suite: 688 passed / 8 skipped; final cold-start regressions: 42 passed. CodeRabbit skipped the Draft; independent Spec/Standards reviews and the final fix review are separate evidence.
  • Screenshots and two recordings are committed and linked in the PR. All eight inline screenshots loaded on GitHub. Videos are repository files available through their raw links, not inline GitHub players.
  • Cleanup: only this test's mobile session and Host device revoked; latest refresh refused, earlier CLI sessions preserved. Original app configuration and shared QA checkout restored; test proxy/Metro/driver closed and Simulator lane released.

Limits: Android/physical-device/VoiceOver/Human QA remain unverified. Maximum Dynamic Type truncates names substantially. An offline Computer's roster returns after reconnect on a cold launch; its draft survives. Complete Cloud recency/read/pin behavior remains #2181. Local exact-head HTML explainer is generated, but not published as a reviewer-accessible artifact.

PR remains Draft/open. UAT only; no Prod change, merge or later-slice implementation. Existing drawer-stack merge prerequisites remain.

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9

Issue: #2179
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@DoodleBears
DoodleBears changed the base branch from codex/2171-drawer-headers to main October 18, 2026 12:57
@DoodleBears

Copy link
Copy Markdown
Contributor Author

Standards

No blocking documented-standard violations or merge-blocking smells found at e65bd3e01b911622674135e317b927dc2f13aac8, compared with main 9e73993308cf01e5d89f1be9a504ca657166aefa. Computer route guards/cache/drafts include Host identity; Cloud scope includes service configuration, account, organization and channel. Account changes invalidate prior directory responses; explicit access refusals remove cached content. Draft persistence has no send dependency.

Spec

No actionable findings within #2179. Source/account/channel remain bound through navigation and authorized operations; temporary directory reads restore organization scope. Offline Computer sending is disabled; drafts restore independently of transport; reconnect does not invoke send. Existing explicit retry paths preserve operation identity.

Independent Spec reviewer: 64 focused tests passed. Primary review run: mobile typecheck and 71 focused tests passed. Standards reviewer performed source review only. Prior UAT source d9155abe4 remains the native evidence; main integration adds no claim of rerun native validation. Android, physical-device, VoiceOver and Human QA remain unverified. Latest requested Header/tabs/search redesign is a separate design scope, not an unimplemented requirement of #2179.

Review totals: Standards 0 actionable findings; Spec 0 actionable findings. Merge remains conditional on final-head CI. No Prod changes.

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9

@DoodleBears
DoodleBears marked this pull request as ready for review October 18, 2026 13:01
@DoodleBears
DoodleBears merged commit 8529db4 into main Oct 18, 2026
13 checks passed
@DoodleBears
DoodleBears deleted the codex/unified-mobile-conversations branch October 28, 2026 04:26
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