Task 8: codemod repointed 150 namespace-type files to #/lexicons
(AppBskyFeedDefs.PostView -> app.bsky.feed.defs.PostView, .Record -> .Main)
plus ~105 hand-fixed consumers (composer/video state, DebugMod, Profile,
onboarding, dialogs). DM_SERVICE_HEADERS deleted; last chat call sites on
the chat client. RichText.tsx flipped to SDK-only. Remaining @atproto/api
importers: the three session bridge files, the deliberate dual-world
matcher in lib/xrpc-error.ts, and test fixtures. toLex boundary casts are
TODO(phase4)-tagged for bridge removal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 3 task 2: types/bsky sibling modules (post/profile/starterPack) now
source from generated #/lexicons with interim dual-world widening aliases
(TODO(phase4) markers). SessionBundle gains a chatClient proxied to
did:web:api.bsky.chat#bsky_chat via useChatClient(). usePdsClient() and
useChatClient() no longer fall back to the public appview when logged out -
they return a client that throws NotAuthenticatedError before any network
I/O; useMaybePdsClient()/useMaybeChatClient() cover logged-out-aware
callers. RichText pilot: useRichText.ts on @bsky.app/sdk/richtext with
detectFacets(pdsClient); RichText.tsx display sink accepts both worlds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PasswordSession (@atproto/lex-password-session) is now the single auth
core; SessionAgent bridges it to the base Agent from @atproto/api so
the ~148 useAgent() consumer files keep working unchanged
- SessionBundle carries {session, agent, accountClient, appviewClient};
useLexClient() now returns the authed appview client, new
useAppviewClient()/usePdsClient() hooks
- reducer: OpaqueSessionBundle, new replaced-current-bundle action for
network-free cross-tab same-did sync (PasswordSession is immutable, so
the bundle is rebuilt instead of mutated in place)
- moderation: AtpAgent.configure -> Client.configure + Agent.configure,
per-account labelers on both the bridge and the appview client
- push-token unregistration uses temporary PasswordSessions
- hard-tail migrations: SignupQueued refresh via resumeSession shim,
useBeginAgeAssurance scoped-token raw Client, useAccountEmailState
reads currentAccount
- PDS routing preserved on the no-network resume fast path by
synthesizing a minimal didDoc from the persisted pdsUrl
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* persist startup queries
* Use IDB for query storage (#9687)
* Add storage abstraction for persisted query data
Introduce a platform-specific storage abstraction layer for react-query
persistence:
- Native: Uses MMKV for high-performance synchronous storage
- Web: Uses IndexedDB via the `idb` library for efficient async storage
This replaces the previous AsyncStorage implementation with more performant
platform-native solutions. The abstraction maintains API compatibility with
@tanstack/query-async-storage-persister.
* Refactor storage abstraction to use factory pattern
Change createPersistedQueryStorage to a factory function that accepts a
storage ID, allowing multiple isolated storage instances:
- Native: Each instance gets its own MMKV store
- Web: Each instance gets its own IndexedDB database
Adopt the factory pattern in:
- react-query.tsx: Uses 'persisted_queries' storage
- ageAssurance/data.tsx: Uses 'age_assurance' storage
This provides better separation between different query client caches
and allows each to be managed independently.
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Refactor to use archival storage
(cherry picked from commit a773b40e41c96f821cd32260919ce1437c0fc3ab)
* Improve archive db types
(cherry picked from commit 80e4959ba2aa00c984c26aed2f7dfae1095720b0)
* rm idb
* clear on logout, bust on app version
* create abstraction for persisting queries, make gcTime infinite
* Rm abstraction
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Eric Bailey <git@esb.lol>
* WIP
* Clean up growthbook code, integrate into init and sessions
* Move everything out of React
* Add metrics client
* Move to separate file
* Shared metadata cache
* Ensure we update metadata when session ID changes
* Ensure userMetadata is cleared when logging out
* WIP revamp
* Integrate feature gates into analytics context
* Clean up old code
* Fix useMeta util
* Some comments and cleanup
* Add logger to base analytics context
* Refactor current route handling
* Rip out LogEvent from navigation
* Update tracking endpoint
* Migrate toClout
* Clear out statsig client
* Add todo, reset logger readme
* Ope fix statsig noop
* Refactor logging in feed-feedback, add debug logging to metrics client
* Remove LogEvents alias for Metrics
* Prefer root package export
* Remove Metrics alias from logger
* [APP-1782] Migrate to new analytics APIs (#9735)
* Migrate logEvent to useAnalytics
* Migrate logger.metric to useAnalytics
* Migrate tricky spot, fix types
* Migrate remaining tricky spot
* Missed one
* Remove metric() from logger
* Migrate useGate to useAnalytics
* Remove all other StatSig mentions
* Update event payload
* Update logger tests
* Mock expo method
* Fix session ID bug
* Add session ID test
* Add test for metrics client
* Clarify intent
* Clean up core analytics file
* Clean up the call once utils
* Fix TODO
* Fix TODO
* Fix TODO
* Fix TODO
* Fix TODO
* Remove debug code
* Fix navigation context
* OK nav context is not working, todo
* Checkpoint: works but feels hacky
* Fix navigation context issue
* Improve feature API
* Improve metric logging
* Update logger tests
* Age Assurance V2
* Tighten up test
* Add todos for sdk migration
* Align RQ versions
* Use useEffect for side effect
* Improve effects, memoize
* Standarize on birthdate
* Copy feedback
* Copilot
* Add support link
* Reove double ..
* Cleanup
* Remove redirect dialog
* Cleanup todos, add comments
* Update splash in main template too
* Mock some stuff
* Exhaustive checks
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
* Exhaustive checks
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
* Small fix to bday handling
* Add comment
* onboarding style tweak
sneaking this in sorry!
* rm unreachable breaks
* Put useIntentHandler back on web
* Remove misleading success set
* Align on birthdate
---------
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
* replace resumeSession with getSession
* copy lil type tweak from the other PR
* Add partialRefreshSession to session API context, use session state to infer state further down tree
* Review
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* takendown screen
* add form, move button inline
* expect type error
* display error
* disable submit if too long
* move around all the ctas
* typos, rm layoutanimation, fix link
* use REASONAPPEAL
* Rename logout to logoutEveryAccount
* Add logoutCurrentAccount()
* Make all "Log out" buttons refer to current account
Each of these usages is completely contextual and refers to a specific account.
* Add Sign out of all accounts to Settings
* Move single account Sign Out below as well
* Prompt on account removal
* Add Other Accounts header to reduce ambiguity
* Spacing fix
---------
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
* Split utils into files
* Move reducer to another file
* Write types explicitly
* Remove unnnecessary check
* Move things around a bit
* Move more stuff into agent factories
* Move more stuff into agent
* Fix gates await
* Clarify comments
* Enforce more via types
* Nit
* initSession -> resumeSession
* Protect against races
* Make agent opaque to reducer
* Check using plain condition
* Remove logs and outdated comments
* Move side effect upwards
* Pull refreshedAccount next to usage
* Simplify account refresh logic
* Extract setupPublicAgentState()
* Collapse setStates into one
* Ignore events from stale agents
* Use agent from state
* Remove clearCurrentAccount
* Move state to a reducer
* Remove global agent
* Fix stale agent reference in create flow
* Proceed to onboarding even if setting date fails
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* Expand currentAccountDid into currentAgentState
* Inline all callsites of upsertAccount
* Inline all internal callsites of clearCurrentAccount
* Add agent to currentAgentState
* Collapse extra setStates
* Add TODOs
* Move isInitialLoad and isSwitchingAccounts out of main state
* Remove spreads, order object keys
* Track need to persist on state object
* Reoder state variables
* Move types to another file
Co-authored-by: dan <dan.abramov@gmail.com>
* Move utilities out
Co-authored-by: dan <dan.abramov@gmail.com>
* Move PUBLIC_BSKY_AGENT
Co-authored-by: dan <dan.abramov@gmail.com>
* Move createPersistSessionHandler inline
Co-authored-by: dan <dan.abramov@gmail.com>
* Call configureModeration when clearing account too
This ensures that the app labelers get reset in a test environment.
Co-authored-by: dan <dan.abramov@gmail.com>
* Make guest configureModeration sync, non-guest async
* Extract isSessionExpired
Co-authored-by: dan <dan.abramov@gmail.com>
* Flip isSessionExpired condition
Co-authored-by: dan <dan.abramov@gmail.com>
* Extract agentToSessionAccount
Co-authored-by: dan <dan.abramov@gmail.com>
* Extract createAgent*
Co-authored-by: dan <dan.abramov@gmail.com>
* Simplify isSessionExpired
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* Update persisted schema for new source of truth, implement in existing session
(cherry picked from commit b1e5f12bae)
* Improve toasts, log caught error, during switch account
(cherry picked from commit fe0d150706)
* Handle thrown errors from initSession during login
(cherry picked from commit 2c85c04591)
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* fix: store PDS URL for session resumption
* fix: handle a few more cases
* fix: blocking resumption should also use pds url
* refactor: do it in the construct itself
* fix: revert ce96223
* Add email 2fa toggle
* Add UI elements needed for 2fa codes in login
* Wire up to the server
* Give a better failure message for bad 2fa code
* Handle enter key in login form 2fa field
* Trim spaces
* Improve error message