Skip to content

Unify mobile cloud navigation, compact drawer and connection names - #2170

Merged
DoodleBears merged 13 commits into
mainfrom
codex/2161-workspace-drawer
Oct 18, 2026
Merged

DoodleBears merged 13 commits into
mainfrom
codex/2161-workspace-drawer

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Cloud navigation umbrella #2161 | Integration claim

Completed header slice #2171 | Remaining acceptance #2186

Compact drawer issue #2174 | Agent claim

Why the change

Let people switch between local computers and authorized cloud workspaces through a compact drawer, while channel-only guests see only their invited conversations.

Special things to note

  • Merge risk: two-way door, reversible UI and local display-name changes; medium blast radius, shared mobile navigation and saved connection presentation. Review contextual actions, keyboard/large-text reachability and name-only updates. No service-side authorization, storage migration or native inputs added by these slices; review account/instance scoping, guest filtering, async directory cleanup and local-name persistence.
  • Integrates Unify mobile drawer headers with iOS glass titles #2172 and feat(mobile): compact workspace drawer with contextual actions and local names #2175 after invitation prerequisite Join cloud invitations through the mobile create flow #2169. The Human authorized merging into main after tests/CI, with no production deployment. Generic Sheet uses the shared left-aligned platform header; the workspace drawer now uses tabs only. Names are local to this phone: computer aliases reuse the existing appearance store, cloud aliases reuse config.name; Host identity, organization names, credentials and trusted discovery remain unchanged. Organization creation stays in cloud service management.
  • Source CI 39116818266 passed at dc15ffd3a; final native layout uses integrated 1376b50b1. Naming save/restart/restore was verified at f2d0f4af3 with identical naming code. Android, physical phone, VoiceOver, signed-in org/guest rows and real named-computer pairing remain unverified. The previously observed Pair-modal → cloud-services drawer-overlay issue remains open; no full navigation acceptance is claimed. Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9.

Change outline

Merged into main as 9e73993308cf01e5d89f1be9a504ca657166aefa after the passing integration checks below. CodeRabbit was still pending at merge time and is not claimed as review approval. No release or production deployment.

Final current-main candidate: 4c4e4f079a4f457ca122694427b1bf5c48346575. Mobile suite: 690 passed / 8 skipped, typecheck, format and diff checks passed. Main advanced with #2109 during review; the sole root-layout conflict was resolved by retaining both HostDrawer and AppDialogHost, including the new Android dialog routing. Fresh integration CI 39125683378 passed every applicable job; the preceding candidate passed CI 39125050125. Earlier screenshots retain their source-bound status; the combined overlay interaction still requires native acceptance in #2186.

Cloud directory authority
├─ Per-instance memberships + server-authorized guest organization identity
├─ Key: instance + organization; membership takes precedence
├─ Owner/member → existing organization selection → organization channels
└─ Channel-only guest → filtered granted channels (never organization membership)

Opening refreshes grants; closing invalidates stale responses.
The directory is a memory-only presentation, never a permission grant.
Pagination/errors are per instance; refresh preserves drafts;
logout/account replacement clears account-scoped display state.

Prior UAT native member/guest navigation, sibling denial, revoke, refresh/draft and isolated logout evidence remains at bfb5cc4ec in the workspace record. It is not a fresh runtime pass of the integration candidate. Service companions TOB #25/#26 remain separately managed and UAT-only.

Drawer
├─ Fixed top: Computers / Cloud rounded tabs (no title/X row)
│  ├─ Android opaque chips; iOS glass/accessibility fallback
│  └─ One plus action immediately below tabs
│     ├─ Computers → Pair a new computer
│     └─ Cloud → Join by link or QR (organization or one-channel invitation)
├─ Scrollable middle list
│  ├─ First line: connection/workspace name
│  └─ Second line: small address; guest scope retained
└─ Fixed footer
   ├─ Manage cloud services [Cloud only]
   └─ Notifications [both tabs]

Local names
├─ Computer pairing → optional name → existing local appearance store
└─ Cloud configuration review / Rename connection → existing config.name
   └─ save → cold restart → same name; no network request for renaming

Default text uses at most two lines per connection; accessibility text can wrap. Tabs do not change a Host or membership. Swipe/backdrop/Android Back/accessibility escape replace the redundant X; iOS tabs use selected-button semantics to avoid a verified native accessibility target-grouping failure. A duplicate footer in the backdrop was caught during native review and removed before final capture.

Native drawer comparisons — 402 × 874, English

Before is the preceding title/X + mixed Add iteration (59fc97fd7), not the PR base. Both captures use the same empty Computer directory and signed-out UAT cloud configuration. Theme/viewport/locale match; the small exposed underlying route differs, so compare the drawer itself. Original PR-base evidence is retained in the older evidence directory.

Computers — light, before / after

Before computers, light

After computers, light: fixed footer and contextual Add

Cloud — light, before / after

Before cloud, light

After cloud, light: fixed footer and contextual Add

Computers — dark, before / after

Before computers, dark

After computers, dark: fixed footer and contextual Add

Cloud — dark, before / after

Before cloud, dark

After cloud, dark: fixed footer and contextual Add

Connect with a local name

Computer pairing adds an optional name before scanning/pasting. The old pairing entry is the before state; native input was exercised without redeeming a pairing. Cloud renaming was saved, survived a cold restart, then the exact original name was restored and read back. These naming screenshots use f2d0f4af3; the final correction only removed the duplicated backdrop footer.

Before: computer pairing without name

After: optional local computer name

Cloud local name retained after cold restart

Maximum text — independent list scroll

The middle list exposes the address after a swipe while Notifications remains at the same position. This checks reachability, not a full VoiceOver or accessibility acceptance.

Maximum text before scrolling

Maximum text after scrolling: footer stays fixed

Full source-bound screenshots, checks and limits. Shared Simulator/Metro released, original cloud name and display settings restored. The recorded native run made no login, invitation acceptance, Host or Prod changes. Integration is now authorized; outstanding acceptance is tracked in #2186.

Generic Sheet header retained from #2171

Workspace title/X is superseded by tabs. Generic bottom Sheet retains the left-aligned title, optional icon and independent close action; iOS uses glass with opaque fallback and Android a plain title. Settings SheetStack remains outside this slice.

Before: generic Sheet plain title

After: generic Sheet glass title

Header evidence was captured at runtime 4185d28a3; final #2172 head 4c6acb7e passed CI39117869759. Historical screenshots are not a fresh native run of the integration.

@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 7f71b76c-39e7-4c87-bb7d-481bb57c8f73
📥 Commits

Reviewing files that changed from the base of the PR and between b6434c8 and 4c4e4f0.

⛔ Files ignored due to path filters: 78
  • .github/pr-screenshots/2161-workspace-drawer/accessibility-extra-extra-extra-large-dark-bottom.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/accessibility-extra-extra-extra-large-light-top.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-account-a.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-cold-drawer.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-drawer-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-guest-channels.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-member-channels.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-refresh-draft.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-revoke-drawer.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/after-signed-out-drawer.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/before-verified-cloud-services.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/extra-extra-extra-large-dark-bottom.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/extra-extra-extra-large-light-top.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/first-matrix-scroll-failure.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/large-dark-top.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/workspace-switch-contact.png is excluded by !**/*.png
  • .github/pr-screenshots/2161-workspace-drawer/workspace-switch.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/2171-drawer-headers/after-drawer.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/after-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/before-drawer.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/before-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/drawer-accessibility-extra-extra-extra-large-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/drawer-accessibility-extra-extra-extra-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/drawer-close-reopen.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/2171-drawer-headers/drawer-extra-extra-extra-large-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/drawer-extra-extra-extra-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/drawer-large-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/drawer-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/first-pass/sheet-accessibility-extra-extra-extra-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/first-pass/transparency-not-enabled.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/recording-contact.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/reduce-transparency.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/restored-glass.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-accessibility-extra-extra-extra-large-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-accessibility-extra-extra-extra-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-extra-extra-extra-large-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-extra-extra-extra-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-large-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-large-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2171-drawer-headers/sheet-max-bottom.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/before-cloud-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/before-cloud-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/before-computers-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/before-computers-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-max-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/cloud-max-scrolled-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/computers-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/computers-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/computers-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/computers-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/computers-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/computers-max-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/join-direct.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/name-restored.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/pair-direct.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/pair-name-keyboard.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/pair-name.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/rename-keyboard.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/renamed-after-restart.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-compact/renamed-cloud.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-add-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-add-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-add-max-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-add-max-scrolled.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-cloud-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-cloud-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-cloud-max-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-computers-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/after-computers-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/before-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/before-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/join-destination.png is excluded by !**/*.png
  • .github/pr-screenshots/2174-drawer-tabs/pair-destination.png is excluded by !**/*.png
📒 Files selected for processing: 46
  • .agents/skills/verify-deepseekbot/features/phone-pairing.md
  • .github/pr-screenshots/2161-workspace-drawer/README.md
  • .github/pr-screenshots/2161-workspace-drawer/logout-a.json
  • .github/pr-screenshots/2161-workspace-drawer/logout-b.json
  • .github/pr-screenshots/2161-workspace-drawer/proof.json
  • .github/pr-screenshots/2161-workspace-drawer/scope-accepted.json
  • .github/pr-screenshots/2161-workspace-drawer/scope-revoked.json
  • .github/pr-screenshots/2171-drawer-headers/README.md
  • .github/pr-screenshots/2171-drawer-headers/drawer-matrix.json
  • .github/pr-screenshots/2171-drawer-headers/proof.json
  • .github/pr-screenshots/2171-drawer-headers/sheet-matrix.json
  • .github/pr-screenshots/2171-drawer-headers/transparency-app.txt
  • .github/pr-screenshots/2171-drawer-headers/transparency-enabled.txt
  • .github/pr-screenshots/2171-drawer-headers/transparency-restored.txt
  • .github/pr-screenshots/2174-drawer-compact/README.md
  • .github/pr-screenshots/2174-drawer-compact/proof.json
  • .github/pr-screenshots/2174-drawer-tabs/README.md
  • .github/pr-screenshots/2174-drawer-tabs/proof.json
  • apps/mobile/DESIGN.md
  • apps/mobile/app/(tabs)/_layout.android.tsx
  • apps/mobile/app/(tabs)/_layout.tsx
  • apps/mobile/app/(tabs)/_layout.web.tsx
  • apps/mobile/app/_layout.tsx
  • apps/mobile/app/pair.tsx
  • apps/mobile/src/cloud/channel-contract.ts
  • apps/mobile/src/cloud/client.ts
  • apps/mobile/src/cloud/workspace-directory.ts
  • apps/mobile/src/ui/chat/sheet.tsx
  • apps/mobile/src/ui/cloud/channels-screen.tsx
  • apps/mobile/src/ui/cloud/services-screen.tsx
  • apps/mobile/src/ui/primitives/connection-name-field.tsx
  • apps/mobile/src/ui/primitives/drawer-header.tsx
  • apps/mobile/src/ui/primitives/drawer-material.ios.tsx
  • apps/mobile/src/ui/primitives/drawer-material.tsx
  • apps/mobile/src/ui/shell/host-drawer.tsx
  • apps/mobile/src/ui/shell/workspace-add.tsx
  • apps/mobile/src/ui/shell/workspace-tabs.tsx
  • apps/mobile/src/ui/strings.ts
  • apps/mobile/test/cloud-client.test.ts
  • apps/mobile/test/cloud-workspace-directory.test.ts
  • changes/2161-workspace-drawer.md
  • changes/2171-drawer-headers.md
  • changes/2174-drawer-tabs.md
  • docs/adr/0229-mobile-cloud-sessions-are-independent-of-host-pairing.md
  • docs/architecture/botharness-architecture.md
  • docs/architecture/cloud-navigation.md
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves. - Alan Kay |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  \
   \     /)/)
        ( '')
        /  |
      o(___)
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • 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.

@DoodleBears

Copy link
Copy Markdown
Contributor Author

Workspace navigation tracer checkpoint (UAT only, no merge):

  • Mobile Draft: Unify mobile cloud navigation, compact drawer and connection names #2170 — runtime 7c21394062695ecd47c93120cf4bdb28f554b84f. One root drawer, Computers + Cloud workspaces, current member/guest projection, instance/org deduplication, filtered guest entry and return to local Chats. Invitation prerequisite Join cloud invitations through the mobile create flow #2169 remains separate and unmerged.
  • Service Draft: Expose authorized guest workspace identity and filtering tob#26 — UAT runtime bf6d896e813457382cd2bb2e7c74b22c03ba01ca, Cloudflare version e8427081-b4e3-420f-b344-aa844beae571. Deployment/readback pass. Formal CLI verifies authorized organization name, filter, unrelated-org empty result, no org membership, sibling denial and removal after revocation. Only the run's synthetic grant was revoked.
  • Source: 647 mobile tests pass / 8 skipped, typecheck and focused lint pass; 62 Worker tests / 20 CLI tests pass. Initial sandbox loopback failures were rerun with the required permission. Full source-policy scan is deferred to CI because this checkout is sparse; changed-source scan passes. CodeRabbit skips Drafts and is not review approval.
  • Native gate: queue request submitted, NOT ASSIGNED. Native inputs match existing signed build; no build/install/erase. Available disk fell to about 350 MiB, so no Simulator/Metro/capture started. Coordinator requires sufficient runtime headroom plus final CI before assignment. Native switching, revocation, large-text/theme screenshots and recording remain unverified; Android/physical/Human remain separate.
  • Existing wider gates (QR camera, new-instance Hosted AuthKit continuation, org-wide Agents/WebSocket and T1 identity/recovery) remain open. Prod unchanged.

@DoodleBears

Copy link
Copy Markdown
Contributor Author

Follow-up at bfb5cc4ec9b5b3029bebd7d544905efa6d2dcd4b:

  • Bind directory refresh and channel view remounting to the saved session's account and trusted configuration. The saved user ID is a display-partition hint only; restored sessions still have no verified identity. A normal refresh temporarily clears live identity without wiping the current draft; logout/account/config replacement resets display state.
  • A closed directory now stops before its next guest query. The focused regression failed before the fix (one unwanted guest query) and passes afterward; retired results cannot replace the next directory.
  • 649 mobile tests passed / 8 skipped; TypeScript, focused lint and changed-source policy passed. New CI: https://github.com/BotHarness/DeepSeekBot/actions/runs/39104178457 . Prior CI was green at the earlier head, not this one.
  • Shared Simulator request updated to this exact candidate. Still unassigned: disk remains about 338 MiB; requested ~2 GiB runtime headroom. No device, Metro, build, install, erase or Prod change. Native screenshots/account-switch/draft-retention acceptance remain pending.

@DoodleBears

DoodleBears commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor Author

Batch 22 native UAT completed; the shared Simulator window is released. No Prod or merge.

  • Runtime bfb5cc4ec9b5b3029bebd7d544905efa6d2dcd4b; evidence-only head 3be6b52c384812f801d2b9d58013580c0d6e4c0f; native 494a20f1eb4f0666a2c90bc3c758af4e7ff5f46b; TOB UAT bf6d896e813457382cd2bb2e7c74b22c03ba01ca.
  • PASS: one cloud-header workspace drawer, member organization → four channels, guest organization → one invited channel. Actual native-token HTTP readback confirms no guest-organization membership and denies the sibling. Revocation removes the guest organization on reopening.
  • PASS: real session refresh retains an unsent draft, cold directory restoration, B sign-out removes its directory, A fixture after restart displays A's Owner roles. Both mobile sessions remotely revoked; latest refresh refused; other baseline sessions retained.
  • PASS: default/intermediate/maximum Dynamic Type × light/dark, scrolling and reachable actions; maximum-size Cloud services was actually pressed. The PR body now embeds four images, all verified loaded at 402 × 874 in GitHub, and links a 26-second recording and inspected contact sheet.
  • Boundaries: no paired computer existed, so computer-return is untested. Pagination/error/cancelled-request ordering remains source-only. In-place browser account replacement, Android, physical camera, Human/VoiceOver, new-instance Hosted AuthKit, sender sharing and QR rendering/save remain open. Synthetic sessions are not Hosted AuthKit proof. The first driver/IPv6/checkpoint issues are retained in the evidence record.
  • Cleanup: only our test guest grant and temporary mobile sessions were removed, after revocation verification. Large/light restored; app, own driver and own Metro stopped. Installed app/config, original shared documents, other sessions, physical phone, Hosts and signed Products preserved.

Evidence and full limits. Runtime CI39104178457 passed; fresh evidence-head CI39108117819 passed every applicable check. The wider collaboration goal and issue #2161 remain open.

Issue: #2171
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2171
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2171
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2171
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2171
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
…cal names (#2175)

* feat(mobile): separate computer and cloud drawer tabs

Issue: #2174

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

* docs: attach native drawer tabs screenshots

Issue: #2174

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

* fix(mobile): make drawer additions category-specific (#2174)

Agent claim: #2174 (comment)

* fix(mobile): keep contextual add directly below drawer tabs (#2174)

* fix(mobile): retain native tab bounds for accessibility (#2174)

* fix(mobile): keep drawer escape container separate from tabs (#2174)

* fix(mobile): expose iOS segmented tabs as selected buttons (#2174)

* feat(mobile): compact connection rows and pin drawer footer (#2174)

Allow local names during pairing and verified cloud import, with cloud rename preserving trusted scope and sessions. Agent claim: #2174 (comment)

* fix(mobile): keep drawer footer inside panel (#2174)

* docs(mobile): capture compact drawer and naming evidence (#2174)
@DoodleBears DoodleBears changed the title Unify mobile computer and cloud workspace navigation Unify mobile cloud navigation, compact drawer and connection names Oct 18, 2026
@DoodleBears
DoodleBears marked this pull request as ready for review October 18, 2026 11:53
Keep both root overlays: HostDrawer and AppDialogHost. Preserve Android dialog routing from #2109 and the compact cloud/computer drawer.

Issue: #2161

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@DoodleBears
DoodleBears merged commit 9e73993 into main Oct 18, 2026
10 of 11 checks passed
@DoodleBears
DoodleBears deleted the codex/2161-workspace-drawer branch October 28, 2026 04:25
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