* feat(mobile): rename passkeys
* fix(mobile): refresh the passkey list from the store after a rename
* fix(mobile): skip the name dialog after creating a passkey
* feat(mobile): list passkeys
* fix(mobile): show the passkey list as the server's passkeys
* fix(mobile): reword and align the passkey list, refresh it from the store
* feat(mobile): login with passkey
* feat(mobile): use the server feature level on the login page
* refactor(mobile): share the steps after a login
* password, OAuth and passkey logins end with one finishLogin
* OAuth now also connects the websocket, like the password login
* fix(mobile): passkey login through the shared login steps
* fix(mobile): build the login response through its constructor
* feat(mobile): passkeys page with new passkey
* feat(mobile): passkeys entry under settings
* show it in settings when logged in and passkeys are on
* remove it from the profile menu
* feat(mobile): use the server feature level for passkeys
* hide passkeys below the passkeys feature level, without asking the server
* keep the server's feature level on ServerVersion
* fix(mobile): passkeys as a settings section through the store
* fix(mobile): filter the settings sections in SettingSection
* fix(mobile): remove the passkeys description and use the settings padding
* feat(mobile): passkey bridge for ios
* fix(mobile): ios passkey bridge in one file
* merge Passkeys.swift into PasskeyHostApiImpl.swift
* set up the host api on the main engine only
* map the json with Codable structs, with base64url in the coder data strategies
* throw on a missing attestation object or an unexpected credential type
* need iOS 17.4, where a passkey registration can exclude the account's passkeys
* fix(mobile): ios passkeys from ios 16
Passkeys are on from iOS 16 again. The platform registration only takes
excludedCredentials from iOS 17.4, so that check keeps its own comment.
* feat(mobile): passkey bridge for android
* fix(mobile): passkey plugin on the main engine only
* register it in configureFlutterEngine and cancel its scope on detach
* pass coroutine cancellation through instead of treating it as an error
* check for Play services 23.08+ before Android 14 in isSupported
* explain why NotAllowedError counts as a cancel
* share one perform function between register and authenticate
* fix(mobile): log out before resetting the local database
* fix(mobile): use a stateful widget for the reset state instead of hooks
* fix(mobile): run the reset tests' db work on the real clock
Apply upstream fixes from 5ebda1f0b9b109c9098026866a354f0abb4823a8, 8d662d75791f6a67effacbf9e54cbefc92e8d313 and a9c4e0ed65757279fdade2b0126c10a018286901.