Skip to content

feat(mobile): draw the host Accounts screen from the desktop's page - #30020

Merged
Jinwoo-H merged 17 commits into
mainfrom
jinwoo/mobile-accounts-on-page
Oct 17, 2026
Merged

Jinwoo-H merged 17 commits into
mainfrom
jinwoo/mobile-accounts-on-page

Conversation

@Jinwoo-H

@Jinwoo-H Jinwoo-H commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 14 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​531 $\color{#cf222e}{\Huge{\mathbf{−}}}$​655 $\color{#cf222e}{\Huge{\mathbf{−}}}$​124
Prod 34 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1101 $\color{#cf222e}{\Huge{\mathbf{−}}}$​1596 $\color{#cf222e}{\Huge{\mathbf{−}}}$​495

What changes for users

The host Accounts screen (agent accounts, usage bars, rate limits, Codex reset credits) is now drawn by the page the desktop serves, like Tasks and Agent history. Changes to it now ship with desktop releases instead of needing a phone build. It looks and behaves the same as before.

What it took to run on the page

  • Route: /h/[hostId]/accounts is a page route with the same grants as the worktree list (navigate, storage, externalLink, haptics). The screen moved to src/accounts/MobileAccountsScreen.tsx. accounts.web.tsx renders it on the page, and accounts.tsx is now the shell route that mounts the page, in the same shape as tasks.tsx.
  • Dialogs: Alert.alert does nothing on React Native Web. The reset confirmation, the reset outcome and a failed account switch now use ConfirmModal. ConfirmModal can now hide Cancel (cancelLabel={null}) for a notice that only needs an OK.
  • Back: the chevron goes through useRouteHandoff, so it pops the shell's stack. expo-router's own back() does nothing on the page.
  • Reset key: minted inside requestCodexResetCredit by randomV4Uuid (moved from the session code to src/platform/random-v4-uuid.ts). When crypto.randomUUID is missing (Hermes, or the iOS shell's custom scheme), it builds the UUID from expo-crypto's secure random bytes, never Math.random.
  • Refresh: RefreshControl is removed (it has no gesture on the web). The header refresh button is unchanged and works.
  • Edit host stays native: it is already handed to the shell. Trimming it from the page bundle is left for a separate PR. The script sweep is re-measured (80 scripts at 15 routes).

Mixed versions and release order

  • Installed phone apps + new desktop: the worktree list page opens Accounts inside the same page document, so installed apps get the page Accounts screen over the air.
  • New phone build + desktop released before this: the old desktop's page does not list the route, so Accounts shows the existing "Update Orca on your computer" wall where it used to work natively. The desktop release with this route must ship before any phone build that includes this change. I kept the existing per-route wall. Raising the page floor would wall every screen on an old desktop, not just this one.

Codex reset credit: mobile mirrors the desktop

The desktop keeps no client-side record of a reset. It asks the host, and the host's ledger owns the attempt. The phone used to keep its own retry record (an AsyncStorage journal) because the host refused a retry under a new key with "already attempted". The page can't keep that record, so this PR changes the host instead:

  • Host: a request answers as its own key's attempt, else the attempt that already claimed its offer, else the account's unresolved attempt. That last case matters because the usage refresh after an unknown outcome moves the offer, so a retry names a newer one. The reply is the recorded outcome, the running attempt, or a resume under the original key and scope, which is the desktop's own rule. The provider only ever sees the original key, and two clients confirming at once cause one provider call. A headless orca serve no longer gets stuck on "unknown outcome".
  • Mobile: like the desktop, the page sends a fresh key per attempt and keeps nothing on the phone. A reply is matched on target, account and account revision, not the offer, so a resumed attempt's scope is accepted. The journal, its client-side singleflight and the "could not clear the retry record" warnings are deleted, and the journal-resume recording goes with them. No new page storage grant or allowlist entry.
  • Old clients: installed native Accounts screens resend their journal key and scope, which takes the unchanged same-key path. Older desktops use consumeCurrent, which already resumed by account. The reply shape is unchanged. One edge: an installed native Accounts screen that sends a new key with a newer offer while an attempt is unresolved now gets "Invalid reset response" instead of "unknown outcome". No credit can be double-spent, and it goes away when users update the app.

Testing

  • Unit and render tests: src/accounts/mobile-accounts-screen-reset-credit.test.ts covers the confirm drawer, the outcome notices, cancel, a failed switch shown on screen, Back through the handoff, and a lost reply retried under a new key. On the host, service-reset-credit-durability.test.ts covers: a same-offer retry under a new key gets the recorded outcome with no second provider call, a pending attempt resumes under its original key, a different offer is still refused while an outcome is unknown, two concurrent keys for one offer spend once, an unresolved attempt reached with a newer offer resumes under its own key, and the desktop consumeCurrent and the remote RPC converge on one attempt. On mobile, a test moves the snapshot after the failure and checks that the resumed outcome is shown. These fail without the coordinator change. Also: the manifest exclusion test, accounts in the shell-route first-frame table, and the browser back-stack checks against the built page.
  • Gates: mobile tsc, mobile oxlint, oxfmt check, tests-typecheck ratchet, full mobile vitest (10,718 passed), root oxlint, anti-slop, type-aware, React Doctor, node typecheck, the host reset-credit tests, every config/scripts/mobile-web* test including Chrome render checks, pnpm build:mobile-web (built and verified, 14 routes), and check:code-quality:changed. pnpm lint passes every step except 5 no-cycle warnings in the native code-quality audit, and the base branch has the same 5.
  • Emulator: release APK from this branch, paired to an isolated orca-dev serve built from this branch. Accounts opened from the worktree list renders on the page: no native text nodes, and the page target is at /h/<host>/accounts. The refresh button sends accounts.list over the bridge (frame captured over CDP). The chevron and hardware Back both return to the worktree list. A deep link through the shell route opens a new page session for Accounts. Edit host still opens natively. The isolated host has no agent accounts, so the switch and reset flows were covered by unit tests only. After the review fixes, the APK and host were rebuilt and rechecked: Accounts opens on the page and Back returns to the worktree list.

Before (native, #29979 APK) and after (page, this branch):

before-02-accounts

after-02-accounts

…uild switch

The owner retired the native-screen fallback with no emergency native build, so
EXPO_PUBLIC_MOBILE_SHELL, mobileShellBuildKind, shellSwitchDecision, the Metro
cache-key suffix and both release workflows' shell input go. Every host route
mounts the shell; a route naming no screen the shell could open gets the
existing refusal screen instead of a native screen.

Claude-Session: https://claude.ai/code/session_6cea92f6
With every build the OTA shell, these native siblings run nowhere: the
native-executed closure (index.js plus every non-web route) does not reach
them, and the page resolves their .web siblings. Each .web sibling takes the
plain name, its web-overrides entry goes, and the native-only rich Markdown
editor and Mermaid WebView generators and their outputs go with them.

Kept: native siblings the node test suite still renders shared screens
through (terminal WebView, browser frame path, clipboard, dictation, media
picker, live input, snapshot budget, input styles).

Claude-Session: https://claude.ai/code/session_6cea92f6
…one-value shell kind

The host route files no longer switch, so their comments say what they do now:
a route naming no screen shows the unavailable screen. app/h/[hostId]/web.tsx
duplicated index.tsx and nothing linked to it, so it and its stack entry go
(the bundle sweep is re-measured: 77 scripts at 15 routes). Diagnostics print
the bridge protocol on its own instead of a shell kind that has one value.

Claude-Session: https://claude.ai/code/session_6cea92f6
…oo/ota-native-screens-delete

# Conflicts:
#	mobile/web-entry/web-overrides.json
…two unused native deps

MobileSelectableText was react-native's Text, so callers use Text. The rich
Markdown editor's host-facing seams (messages, URL prompt, keyboard inset) are
required now that the page is its only host; the WebView defaults go. Comments
that described deleted native components are rewritten, and
expo-image-manipulator and react-native-uitextview leave package.json and the
lockfile.

Claude-Session: https://claude.ai/code/session_6cea92f6
Accounts was the last host screen the shell still drew natively, so its
changes needed a phone build. It is now a page route like Tasks: the
screen moves to src/accounts/MobileAccountsScreen.tsx, accounts.web.tsx
renders it on the page, and accounts.tsx mounts the shell for it.

What React Native Web needed: Alert.alert is a no-op there, so the
reset confirmation, its outcome and a failed account switch are
ConfirmModal drawers (ConfirmModal can now drop Cancel for a notice);
Back goes through the route handoff, which pops the shell's stack; and
the reset idempotency key is built from getRandomBytes, since
randomUUID needs a secure context the iOS custom scheme is not.

edit.tsx edits the phone's own pairing and never renders on the page,
so the route manifest leaves it out and the page's host stack does not
declare it. The script sweep is re-measured for the 14-route tree.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
…d outcome; mobile mirrors the desktop

The desktop keeps no client journal for a reset credit: the host's ledger
owns the attempt. A remote client that lost a reply and retried the same
offer under a new key was refused with "already attempted" (or "unknown
outcome" while the provider call was unresolved), which is why the phone
carried its own durable journal to replay the old key.

The coordinator now answers a request for an offer an earlier key already
claimed as that attempt: the settled outcome, the running attempt, or a
resume of the pending one under its original key. A different offer for
the account is still refused while an outcome is unknown, so nothing can
spend twice. The reply shape is the one a same-key replay always had, so
installed clients with their journal read it unchanged.

With that, the Accounts page sends a fresh key per attempt like the
desktop and keeps nothing on the phone: the AsyncStorage journal, its
client singleflight and the retry-record warnings are deleted, and the
journal-resume recording goes with them.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
…try names a newer offer

Review follow-ups:
- Host: after an unknown provider outcome the usage refresh moves the
  offer, so a retry names a newer one. The coordinator now answers it as
  the account's unresolved attempt (resumed under its own key and scope),
  as the desktop's consumeCurrent does, instead of refusing forever. One
  ledger lookup finds own key, offer claimant, then unresolved attempt.
- Mobile: a reply is matched on target, account and account revision,
  not the offer, so the resumed attempt's scope is accepted.
- The key is minted inside requestCodexResetCredit from randomV4Uuid, the
  session helper moved to src/platform/random-v4-uuid.ts.
- RefreshControl goes; the header refresh stays. ConfirmModal's
  onConfirm is optional for an OK-only notice.
- Stale journal comments and the mobile docs line are corrected.
- The edit.tsx page exclusion is dropped from this PR; the script sweep
  is re-measured for 15 routes.
- Root oxlint: escape the apostrophe; zod v4 strictObject.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
…outing

- randomV4Uuid never falls back to Math.random: without crypto.randomUUID
  it builds the v4 UUID from ExpoCrypto.getRandomBytes, as the old reset
  key did. Tests get Node's secure bytes for expo-crypto from the setup
  file, since the native module has no Node build.
- Host tests: a new offer after a settled attempt spends again rather
  than replaying, and a retry naming a newer offer joins a resumed
  attempt in flight (one provider call, original key).

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
@Jinwoo-H
Jinwoo-H changed the base branch from jinwoo/ota-native-screens-delete to main October 17, 2026 09:23
…s-on-page

# Conflicts:
#	config/scripts/build-mobile-web-app-bundle.test.mjs
#	config/scripts/verify-mobile-web-app-bundle.mjs
#	mobile/src/session/MobileNativeChatMessage.tsx
#	mobile/web-entry/web-overrides.json
…ouched

The merge commit's lint-staged run reformatted 27 files this PR does not
change. Committed without the hook so they match origin/main exactly.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
@coderabbitai

coderabbitai Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

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 6 minutes.

Check out review usage here.

View limit details

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

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6452dc38-448b-49fa-9b51-31a8d706b468
📥 Commits

Reviewing files that changed from the base of the PR and between e9e7250 and 9d5f9b3.

📒 Files selected for processing: 2
  • mobile/src/test-support/bridged-parity/divergence-classes.ts
  • mobile/src/test-support/rpc-recording/rpc-recording-through-bridge.test.ts

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 683d67ca-f962-44b5-a89a-cbfea75a7f39
📥 Commits

Reviewing files that changed from the base of the PR and between 362ac0c and e9e7250.

📒 Files selected for processing: 6
  • config/scripts/build-mobile-web-app-bundle.test.mjs
  • config/scripts/verify-mobile-web-app-bundle.mjs
  • mobile/src/mobile-web-shell/shell-route-first-frame.test.tsx
  • mobile/src/test-support/expo-crypto-node.ts
  • mobile/vitest.config.ts
  • mobile/web-entry/web-overrides.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 2 remain after this review.

📝 Walkthrough

The accounts page now routes through the mobile web shell and renders a dedicated accounts screen. Codex reset requests use fresh client idempotency keys, while the host ledger finds and resumes matching attempts. Session and launch flows use a shared secure UUID utility. Bundle measurements, tests, RPC recordings, and related documentation were updated.

Priority: ➖ Normal

Merge Risk: ⚪ Minimal · up to e9e72

The inspected reset retry flow preserves the host’s original attempt, and the earlier shell-session and lint concerns are not current-head risks. No actionable merge-blocking risk remains.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 55.26% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 38 functions across 53 files. (1 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Title check Passed The title clearly and concisely identifies the primary change: moving the host Accounts screen to the desktop-served page.
Description check Passed The description is detailed and covers user impact, implementation, release ordering, reset-credit behavior, testing, platform validation, and before/after images. It does not use every template headi…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description is detailed and covers user impact, implementation, release ordering, reset-credit behavior, testing, platform validation, and before/after images. It does not use every template heading and does not include an issue link, but it provides sufficient relevant information.

Full details: Docstring Coverage

Explanation

Docstring coverage is 55.26% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 38 functions across 53 files. (1 skipped: 1 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

✨ Finishing Touches: 💡 1
📝 Generate docstrings: 💡
  • 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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: d06e0d97-c968-4b89-acd1-b9f8e5f65087
📥 Commits

Reviewing files that changed from the base of the PR and between 86f6258 and 362ac0c.

⛔ Files ignored due to path filters: 1
  • mobile/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing: 216
  • .github/workflows/mobile-android-release.yml
  • .github/workflows/mobile-ios-release.yml
  • config/scripts/build-mobile-web-app-bundle.mjs
  • config/scripts/build-mobile-web-app-bundle.test.mjs
  • config/scripts/mobile-web-app-clipboard-image-resize-render.test.mjs
  • config/scripts/mobile-web-app-external-navigation-grant.test.mjs
  • config/scripts/mobile-web-app-mermaid-render.test.mjs
  • config/scripts/mobile-web-app-page-closure-families.mjs
  • config/scripts/mobile-web-app-page-route-modules.mjs
  • config/scripts/mobile-web-app-push-subsystem-closure.test.mjs
  • config/scripts/mobile-web-app-session-dictation-capture.test.mjs
  • config/scripts/mobile-web-app-session-media-picker.test.mjs
  • config/scripts/mobile-web-app-session-webview-consumers.test.mjs
  • config/scripts/mobile-web-page-routes.mjs
  • config/scripts/verify-mobile-web-app-bundle.mjs
  • docs/site/content/docs/mobile.mdx
  • mobile/.gitignore
  • mobile/app/h/[hostId]/accounts.tsx
  • mobile/app/h/[hostId]/accounts.web.tsx
  • mobile/app/h/[hostId]/agent-history/[worktreeId].tsx
  • mobile/app/h/[hostId]/agent-history/[worktreeId].web.tsx
  • mobile/app/h/[hostId]/files/[worktreeId].tsx
  • mobile/app/h/[hostId]/files/[worktreeId].web.tsx
  • mobile/app/h/[hostId]/files/preview/[worktreeId].tsx
  • mobile/app/h/[hostId]/files/preview/[worktreeId].web.tsx
  • mobile/app/h/[hostId]/index.tsx
  • mobile/app/h/[hostId]/index.web.tsx
  • mobile/app/h/[hostId]/review/[worktreeId].tsx
  • mobile/app/h/[hostId]/review/[worktreeId].web.tsx
  • mobile/app/h/[hostId]/session/[worktreeId].tsx
  • mobile/app/h/[hostId]/session/[worktreeId].web.tsx
  • mobile/app/h/[hostId]/source-control/[worktreeId].tsx
  • mobile/app/h/[hostId]/source-control/[worktreeId].web.tsx
  • mobile/app/h/[hostId]/tasks.tsx
  • mobile/app/h/[hostId]/tasks.web.tsx
  • mobile/app/h/[hostId]/web.tsx
  • mobile/app/h/[hostId]/web.web.tsx
  • mobile/app/troubleshoot.tsx
  • mobile/metro.config.js
  • mobile/package.json
  • mobile/rpc-foundation/goldens/codex-reset-credit-consumed.json
  • mobile/rpc-foundation/goldens/codex-reset-credit-resumed.json
  • mobile/rpc-foundation/goldens/matrix-components.codex-reset-credit-accounts.consumecodexresetcredit-1.json
  • mobile/rpc-foundation/pilot-scenarios.json
  • mobile/scripts/build-mermaid-webview-engine.mjs
  • mobile/scripts/build-rich-markdown-editor-script.mjs
  • mobile/scripts/metro-shell-cache-key.test.ts
  • mobile/src/accounts/MobileAccountsScreen.tsx
  • mobile/src/accounts/mobile-accounts-screen-reset-credit.test.ts
  • mobile/src/components/ConfirmModal.tsx
  • mobile/src/components/MobileHtmlPreview.tsx
  • mobile/src/components/MobileHtmlPreview.web.tsx
  • mobile/src/components/MobileMarkdown.tsx
  • mobile/src/components/MobileRichMarkdownEditor.test.tsx
  • mobile/src/components/MobileRichMarkdownEditor.tsx
  • mobile/src/components/MobileRichMarkdownEditor.web.tsx
  • mobile/src/components/MobileSelectableText.ios.tsx
  • mobile/src/components/MobileSelectableText.tsx
  • mobile/src/components/ProtocolBlockScreen.test.ts
  • mobile/src/components/ProtocolBlockScreen.tsx
  • mobile/src/components/codex-reset-credit-consume-operations.ts
  • mobile/src/components/codex-reset-credit-reply-schema.ts
  • mobile/src/components/codex-reset-credit.test.ts
  • mobile/src/components/codex-reset-credit.ts
  • mobile/src/components/html-preview-link-affordance.test.tsx
  • mobile/src/components/mobile-rich-markdown-editor-document.test.ts
  • mobile/src/components/mobile-rich-markdown-editor-html.test.ts
  • mobile/src/components/mobile-rich-markdown-editor-html.ts
  • mobile/src/components/mobile-rich-markdown-editor-script-string.ts
  • mobile/src/components/mobile-selectable-text-ios.test.tsx
  • mobile/src/components/mobile-webview-editor-web-fallbacks.test.tsx
  • mobile/src/components/pr-sidebar/MermaidDiagram.tsx
  • mobile/src/components/pr-sidebar/MermaidDiagram.web.tsx
  • mobile/src/components/pr-sidebar/mermaid-diagram-config.ts
  • mobile/src/components/pr-sidebar/mermaid-diagram-html.test.ts
  • mobile/src/components/pr-sidebar/mermaid-page-engine.ts
  • mobile/src/components/rich-markdown/create-rich-markdown-editor-document.ts
  • mobile/src/components/rich-markdown/document-host-root.test.ts
  • mobile/src/components/rich-markdown/document-host-seams.ts
  • mobile/src/components/rich-markdown/document-lifecycle.test.ts
  • mobile/src/components/rich-markdown/document-markup.ts
  • mobile/src/components/rich-markdown/document-scope.ts
  • mobile/src/components/rich-markdown/editor-commands.ts
  • mobile/src/components/rich-markdown/editor-content.test.ts
  • mobile/src/components/rich-markdown/editor-selection.test.ts
  • mobile/src/components/rich-markdown/editor-surface.ts
  • mobile/src/components/rich-markdown/keyboard-inset.ts
  • mobile/src/components/rich-markdown/markdown-code-fence-allocation.test.ts
  • mobile/src/components/rich-markdown/markdown-round-trip.test.ts
  • mobile/src/components/rich-markdown/native-document-bundle.test.ts
  • mobile/src/components/rich-markdown/native-document-entry.ts
  • mobile/src/components/rich-markdown/rich-markdown-document-parse-time.test.ts
  • mobile/src/components/rich-markdown/rich-markdown-editor-host.test-support.ts
  • mobile/src/components/rich-markdown/rich-markdown-host-seams.test.ts
  • mobile/src/components/rich-markdown/rich-markdown-web-document-mount.ts
  • mobile/src/components/use-codex-reset-credit-action.ts
  • mobile/src/diagnostics/connection-diagnostics-report.test.ts
  • mobile/src/diagnostics/connection-diagnostics-report.ts
  • mobile/src/diagnostics/mobile-web-shell-update-failure-copy.ts
  • mobile/src/diagnostics/native-diagnostics-operations.ts
  • mobile/src/diagnostics/troubleshoot-view.tsx
  • mobile/src/files/MobileMediaPlayback.tsx
  • mobile/src/files/MobileMediaPlayback.web.tsx
  • mobile/src/files/mobile-media-preview-cache.test.ts
  • mobile/src/files/mobile-media-preview-cache.ts
  • mobile/src/files/mobile-media-preview-cache.web.ts
  • mobile/src/files/mobile-media-preview-document.ts
  • mobile/src/host-screen/HostScreen.tsx
  • mobile/src/mobile-web-shell/MobileWebShellScreen.test.tsx
  • mobile/src/mobile-web-shell/MobileWebShellScreen.tsx
  • mobile/src/mobile-web-shell/PageRouteUnavailableScreen.tsx
  • mobile/src/mobile-web-shell/bridge-host-notify.ts
  • mobile/src/mobile-web-shell/bridge/bridge-init-route.ts
  • mobile/src/mobile-web-shell/bridge/bridge-route-update.ts
  • mobile/src/mobile-web-shell/cancelled-navigation-target.ts
  • mobile/src/mobile-web-shell/catch-all-page-route-states.test.tsx
  • mobile/src/mobile-web-shell/catch-all-page-route.test.tsx
  • mobile/src/mobile-web-shell/catch-all-page-route.tsx
  • mobile/src/mobile-web-shell/host-area-layout-class-change.test.tsx
  • mobile/src/mobile-web-shell/host-area-leave-session.test.tsx
  • mobile/src/mobile-web-shell/host-area-session.test.ts
  • mobile/src/mobile-web-shell/host-area-sidebar-matrix.test.tsx
  • mobile/src/mobile-web-shell/host-area-two-hosts.test.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-agent-history-route.test.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-cached-generation.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-files-route.test.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-gates.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-host-list-route.test.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-page-route-wall.test.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-refused-update-decision.test.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-route.test.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-screen-test-harness.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-session-contract.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-session-effects.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-session-route.test.tsx
  • mobile/src/mobile-web-shell/mobile-web-shell-session.test.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-session.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-update-failure-outcome.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-update-failure-record.test.ts
  • mobile/src/mobile-web-shell/mobile-web-shell-update-failure.ts
  • mobile/src/mobile-web-shell/page-route-policy.test.ts
  • mobile/src/mobile-web-shell/page-route-policy.ts
  • mobile/src/mobile-web-shell/removed-host-shell-cache.ts
  • mobile/src/mobile-web-shell/shell-lifecycle-log.test.ts
  • mobile/src/mobile-web-shell/shell-lifecycle-log.ts
  • mobile/src/mobile-web-shell/shell-page-frame.test.ts
  • mobile/src/mobile-web-shell/shell-route-first-frame.test.tsx
  • mobile/src/mobile-web-shell/shell-screen-route.ts
  • mobile/src/mobile-web-shell/shell-switch-decision.test.ts
  • mobile/src/mobile-web-shell/shell-switch-decision.ts
  • mobile/src/mobile-web-shell/use-mobile-web-shell-bridge.ts
  • mobile/src/mobile-web-shell/use-mobile-web-shell-session.test.ts
  • mobile/src/mobile-web-shell/use-mobile-web-shell-session.ts
  • mobile/src/mobile-web-shell/use-shell-stack-pop.test.tsx
  • mobile/src/navigation/host-stack-screens.ts
  • mobile/src/navigation/workspace-route.test.tsx
  • mobile/src/platform/keyboard-persisting-taps.test.ts
  • mobile/src/platform/keyboard-persisting-taps.ts
  • mobile/src/platform/keyboard-persisting-taps.web.ts
  • mobile/src/platform/live-input-composing-range.test.ts
  • mobile/src/platform/live-input-composing-range.ts
  • mobile/src/platform/live-input-composing-range.web.ts
  • mobile/src/platform/random-v4-uuid.test.ts
  • mobile/src/platform/random-v4-uuid.ts
  • mobile/src/session/MobileDiffReviewRouteScreen.tsx
  • mobile/src/session/MobileNativeChatAwaitingInputRow.tsx
  • mobile/src/session/MobileNativeChatMessage.copy.test.tsx
  • mobile/src/session/MobileNativeChatMessage.paced-reveal.test.ts
  • mobile/src/session/MobileNativeChatMessage.tsx
  • mobile/src/session/MobileNativeChatNoticeRow.tsx
  • mobile/src/session/MobileNativeChatProse.tsx
  • mobile/src/session/MobileNativeChatResolutionReceipt.tsx
  • mobile/src/session/MobileNativeChatVisualFrame.tsx
  • mobile/src/session/MobileNativeChatVisualFrame.web.tsx
  • mobile/src/session/MobileSessionRouteScreen.tsx
  • mobile/src/session/mobile-clipboard-image-resize.ts
  • mobile/src/session/mobile-clipboard-image-resize.web.ts
  • mobile/src/session/mobile-existing-agent-launch.ts
  • mobile/src/session/mobile-native-chat-stopped-before-start.test.tsx
  • mobile/src/session/mobile-native-chat-visual-bridge.test.ts
  • mobile/src/session/mobile-native-chat-visual-bridge.ts
  • mobile/src/session/mobile-structured-agent-session-launch.ts
  • mobile/src/session/mobile-worker-takeover-send-sites.test.ts
  • mobile/src/session/structured-session-operation-id.ts
  • mobile/src/session/use-mobile-native-chat-session.ts
  • mobile/src/session/use-mobile-terminal-paste.test.ts
  • mobile/src/session/use-notification-pane-navigation.test.tsx
  • mobile/src/session/use-notification-pane-navigation.ts
  • mobile/src/session/use-notification-pane-navigation.web.test.tsx
  • mobile/src/session/use-notification-pane-navigation.web.ts
  • mobile/src/storage/codex-reset-attempt-journal.test.ts
  • mobile/src/storage/codex-reset-attempt-journal.ts
  • mobile/src/storage/preferences.test.ts
  • mobile/src/storage/preferences.ts
  • mobile/src/test-support/bridged-parity/divergence-classes.test.ts
  • mobile/src/test-support/bridged-parity/divergence-classes.ts
  • mobile/src/test-support/census-source-files.test.ts
  • mobile/src/test-support/census-source-files.ts
  • mobile/src/test-support/rpc-recording/README.md
  • mobile/src/test-support/rpc-recording/adapters/codex-reset-credit-mount-adapters.ts
  • mobile/src/test-support/rpc-recording/adapters/session-terminal-input-mount-adapters.ts
  • mobile/src/test-support/rpc-recording/declared-device-state.test.ts
  • mobile/src/test-support/rpc-recording/rpc-recording-through-bridge.test.ts
  • mobile/src/transport/mobile-web-bundle-reply-schemas.ts
  • mobile/src/transport/rpc-subscription-inventory.ts
  • mobile/src/transport/unvalidated-rpc-request-port-inventory.ts
  • mobile/tests-typecheck-baseline.txt
  • mobile/vitest.setup.ts
  • mobile/web-entry/index.tsx
  • mobile/web-entry/web-overrides.json
  • src/main/codex-accounts/codex-reset-credit-coordinator.ts
  • src/main/codex-accounts/codex-reset-credit-ledger.test.ts
  • src/main/codex-accounts/codex-reset-credit-ledger.ts
  • src/main/codex-accounts/service-reset-credit-durability.test.ts
  • src/main/codex-accounts/service-reset-credit-retry-routing.test.ts
  • src/shared/rpc-contract/accounts-params.ts
💤 Files with no reviewable changes: 50
  • mobile/src/session/MobileNativeChatMessage.copy.test.tsx
  • mobile/src/components/rich-markdown/native-document-entry.ts
  • mobile/src/components/pr-sidebar/MermaidDiagram.web.tsx
  • mobile/src/components/mobile-rich-markdown-editor-html.test.ts
  • mobile/src/components/MobileRichMarkdownEditor.test.tsx
  • mobile/src/mobile-web-shell/shell-switch-decision.test.ts
  • mobile/src/storage/codex-reset-attempt-journal.test.ts
  • mobile/src/files/MobileMediaPlayback.web.tsx
  • mobile/.gitignore
  • mobile/src/components/rich-markdown/native-document-bundle.test.ts
  • mobile/src/navigation/workspace-route.test.tsx
  • mobile/src/components/mobile-selectable-text-ios.test.tsx
  • mobile/src/mobile-web-shell/shell-switch-decision.ts
  • mobile/tests-typecheck-baseline.txt
  • mobile/src/mobile-web-shell/mobile-web-shell-route.test.tsx
  • mobile/scripts/metro-shell-cache-key.test.ts
  • mobile/src/storage/preferences.ts
  • mobile/src/files/mobile-media-preview-cache.web.ts
  • mobile/app/h/[hostId]/web.tsx
  • mobile/app/h/[hostId]/web.web.tsx
  • mobile/src/platform/live-input-composing-range.web.ts
  • mobile/src/components/MobileSelectableText.ios.tsx
  • mobile/src/components/MobileRichMarkdownEditor.web.tsx
  • mobile/src/test-support/rpc-recording/README.md
  • mobile/src/components/mobile-rich-markdown-editor-script-string.ts
  • mobile/src/files/mobile-media-preview-cache.test.ts
  • mobile/metro.config.js
  • mobile/rpc-foundation/goldens/codex-reset-credit-resumed.json
  • mobile/src/components/MobileSelectableText.tsx
  • mobile/src/session/use-mobile-terminal-paste.test.ts
  • mobile/src/session/mobile-clipboard-image-resize.web.ts
  • mobile/src/storage/codex-reset-attempt-journal.ts
  • mobile/src/session/MobileNativeChatVisualFrame.web.tsx
  • mobile/src/session/use-notification-pane-navigation.web.test.tsx
  • mobile/src/components/mobile-rich-markdown-editor-document.test.ts
  • mobile/src/session/use-notification-pane-navigation.web.ts
  • mobile/src/components/MobileHtmlPreview.web.tsx
  • mobile/src/files/mobile-media-preview-document.ts
  • mobile/src/components/mobile-rich-markdown-editor-html.ts
  • mobile/scripts/build-mermaid-webview-engine.mjs
  • mobile/src/navigation/host-stack-screens.ts
  • mobile/src/session/mobile-worker-takeover-send-sites.test.ts
  • mobile/src/storage/preferences.test.ts
  • mobile/src/session/mobile-native-chat-visual-bridge.test.ts
  • mobile/src/components/pr-sidebar/mermaid-diagram-html.test.ts
  • mobile/scripts/build-rich-markdown-editor-script.mjs
  • mobile/src/session/mobile-native-chat-stopped-before-start.test.tsx
  • mobile/src/session/MobileNativeChatMessage.paced-reveal.test.ts
  • mobile/src/platform/keyboard-persisting-taps.web.ts
  • mobile/src/session/mobile-native-chat-visual-bridge.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.

Comment thread mobile/vitest.setup.ts Resolved
…-file mock

Anti-slop forbids module mocking outside test files. The vitest config
now aliases expo-crypto to a faithful Node implementation of the names
shared code reaches; a test file's own mock still wins.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
@Jinwoo-H
Jinwoo-H merged commit 90c1c0a into main Oct 17, 2026
58 of 60 checks passed
@Jinwoo-H
Jinwoo-H deleted the jinwoo/mobile-accounts-on-page branch October 17, 2026 10:11
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