Repository navigation
Version Packages - #212
Open
github-actions[bot] wants to merge 1 commit into
Open
Version Packages#212github-actions[bot] wants to merge 1 commit into
github-actions[bot] wants to merge 1 commit into
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
6 times, most recently
from
October 27, 2026 19:05
bfab1be to
598bba1
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 28, 2026 01:01
598bba1 to
ccc195a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@seamless-auth/[email protected]
Minor Changes
authenticator-codescreen (SaAuthenticatorCode) and explains a wrong or reused code, a lockout and rate limiting. The newregister-authenticatorscreen (SaRegisterAuthenticator) shows a QR code, the setup key with a copy button and anotpauth://link, verifies the first code, and continues whereregister-passkeydoes.register-passkeyoffers it to a recovery session, which can no longer skip enrollment, and on a device that cannot register a passkey; enrolling an app lifts the recovery restriction.SaAuthenticatorAppSettingsis a router-independent settings component that shows whether an app is set up, adds one, and turns it off with a current code.SaAuthenticatorEnrollmentis exported for custom screens,SaFallbackOptionsgains anofferAuthenticatorinput and anauthenticatoroutput, and theSeamlessAuthservice gains arecoverySessionsignal.Patch Changes
@seamless-auth/[email protected]
Minor Changes
44854d0: Add the auth API v0.20 recovery primitives to the client and the session store.
getRecoveryCodeStatus(),generateRecoveryCodes()andredeemRecoveryCode(code). Replacing an existing set needs a fresh step-up; the403it answers without one is recognized byisStepUpRequired(), andgenerateRecoveryCodesWithStepUp()runs the step-up and tries again.startAccountRecovery(channel),verifyAccountRecovery(code),getAccountRecoveryStatus(),completeAccountRecovery(),cancelAccountRecovery(cancelToken), and for a signed-in ownerlistAccountRecoveryRequests()andcancelAccountRecoveryRequest(id).isRecoverySession()on the client andrecoverySessionin the session state report it, and the session actionsredeemRecoveryCodeandcompleteAccountRecoverysign in with it. After a passkey registration or TOTP enrollment made from a recovery session the client refreshes the session (POST /refresh), so the new access token drops the recovery claim the adapters' guards refuse.loadRecoveryOptions(),recoveryCancelTokenFromHash(),cancelRecoveryFromLink(),recoveryErrorMessage(),recoveryCodesText(),passkeyKind()andpasskeyDisplayName(), plusgetRecoveryErrorCode()andisEnrollmentRequired().Needs an auth API with account recovery (v0.20) and a server adapter that proxies its manifest routes.
8dbd3d8: Adds shared authenticator app (TOTP) flow helpers for the bundled screens:
signInWithTotp(),totpErrorMessage(),formatTotpSecret()andTOTP_CODE_LENGTH.The bearer transport no longer refreshes and resends a request whose
401names a rejected factor (totp_verification_failed,totp_disable_failed,step_up_failed,invalid_recovery_code). That401is the answer to a wrong code, not an expired token, and resending the same code only spent another attempt against the rate limit and lockout.generateRecoveryCodesWithStepUp()now reports a failed step-up as "Confirm it is you to replace your recovery codes." instead of naming the passkey, since the step-up can also be an authenticator app code.8dbd3d8: Adds
verifyTotpLogin(code), which signs in with an authenticator app code on the sign-inlogin()started (POST /totp/verify-login). The bearer transport sends it on the pre-auth token and stores the session it issues.8dbd3d8: Adds
qrCode(text), which turns theotpauth://URL from authenticator app enrollment into a QR code a phone camera can scan, with no extra dependency. It returns the symbol'ssizein modules (quiet zone included) and SVGpathdata, so any binding can render it as<svg viewBox="0 0 {size} {size}"><path d="{path}" /></svg>. It throws aRangeErrorfor text too long for a QR code.qrMatrix(text)returns the raw module grid for custom rendering.Patch Changes
e5e6680: The bearer redirect guard now works on React Native. Its
fetchfollows redirects itself and never setsresponse.redirected, so a response that a redirect took to another origin was handed back as if it came from the API. A bearer request now rejects withUntrustedRedirectErrorwhenever the response's final URL differs from the one requested and is not onapiHostortrustedOrigins. On React Native this detects such a redirect after it happened rather than preventing it, so the token may already have been sent on the followed hop.e5e6680: The bearer
POST /refreshno longer follows a redirect. It is sent withredirect: 'manual', and any3xxanswer, a redirect the browser hides, or a response that a platform followed to an origin outsideapiHostandtrustedOrigins(as React Native'sfetchdoes) is refused withUntrustedRedirectError. The held session is cleared, because it can no longer be renewed through that server. Before, a redirect on the refresh route resent the refresh token to the redirect target.e5e6680: The OAuth redirect ports now open only an
httpsauthorization URL, orhttponlocalhost,127.0.0.1or[::1]for local development. The browser port (createBrowserOAuthRedirect) and the React Native port (createWebBrowserOAuthRedirect) throw the newUnsafeAuthorizationUrlErrorfor anything else, such as ajavascript:ordata:URL in any letter case or with embedded tabs, and never navigate to it.startOAuthSignIn, which every bundled sign-in screen uses, reports that as a provider that could not start. A customOAuthRedirectPortcan use the newassertNavigableAuthorizationUrl(url). Auth API 0.19.4 already refuses to store or return such a URL, so this guards against an older or misconfigured server.e5e6680: A client method whose request throws now keeps the thrown error as
error.cause. Every such failure used to arrive as the same status0error with nothing to tell them apart, so an app could not distinguish anUntrustedOriginError, anUntrustedRedirectErroror a refused refresh from a network failure. Checkerror.cause instanceof UntrustedRedirectError(or another error class) to show a more specific message. Themessageandstatusare unchanged.dc52b23: Update
@seamless-auth/typesto 0.31.0, the contract for auth server v0.20.a5956b0: Update
@seamless-auth/typesto 0.33.0.AccountRecoveryRequest,AccountRecoveryRequestsResultandRecoveryErrorCodenow alias the upstream shapes, andRecoveryErrorCodegainsenrollment_required.The recovery session flag is now read from the
recoveryfield of/users/meas well, soisRecoverySession()and the session state'srecoverySessionsurvive a reload, a background revalidation andinitialSession. A restored recovery session is sent to enrollment by the bundled sign-in screen, and the session is refreshed after a passkey or TOTP enrollment made from it.@seamless-auth/[email protected]
Minor Changes
44854d0: The prebuilt UI covers account recovery from auth API v0.20.
AuthRoutesserves/recovery-code(sign in with a recovery code),/recovery-codes(shown after a passkey is enrolled, to generate and save a first set, or a new one once every code is spent),/account-recovery(self-service recovery through a verified email or phone, with its waiting period) and/recovery/cancel, where the link in every recovery notice lands. That page takes the token from the URL fragment, drops it from the address bar and cancels the request. MountAuthRoutesat the root of the deployment'sFRONTEND_URLso the link resolves.GET /system-config/publicreportsrecoveryCodesoraccountRecovery. A recovery session goes straight to passkey enrollment, which it cannot skip.PasskeyManagement(list with name, kind and last use, rename, delete, add another, and a nudge towards a second passkey),RecoveryCodeSettings(codes left, generate or replace with a step-up),RecoveryRequests(open recovery requests with cancel), andAccountSecurity, which renders all three.useAuth()addsrecoverySession,redeemRecoveryCodeandcompleteAccountRecovery, and the package re-exportsuseRecoveryOptions,isStepUpRequired,isEnrollmentRequired,getRecoveryErrorCodeand the recovery types.Needs an auth API with account recovery (v0.20) and a server adapter that proxies its manifest routes, including
POST /auth/refresh.dbd4294: The prebuilt UI covers authenticator apps (TOTP).
AuthenticatorRegistrationat/register-authenticatorsets up an authenticator app: a QR code of theotpauth://URL (drawn as an inline SVG, no new dependency), the setup key in groups of four with a copy button, anotpauth://link for a phone, and the first code. It then continues to/recovery-codesas passkey enrollment does./authenticator-codesigns in with a code from the app, on the sign-in/loginstarted. The sign-in screen offers "Use an authenticator app" on every sign-in in progress, because/loginnever liststotpand the API answers the code step the same for an address with no account. Wrong or reused codes, lockouts, rate limits and passkey-only accounts each get their own message.RecoveryCodeSettingsand on/recovery-codes, asks for a current code from the authenticator app when the API wants a step-up and the account has one, with the passkey as an alternative.AuthenticatorAppSettings(status, inline enrollment, turn off with a current code), whichAccountSecuritynow renders between passkeys and recovery codes.signInWithTotp,totpErrorMessage,formatTotpSecret,qrCode,TOTP_CODE_LENGTHand theQrCodetype for custom screens.Needs an auth API with
POST /totp/verify-loginand a server adapter that proxies it.Patch Changes
e5e6680: The bundled magic link and OAuth callback screens now remove the
token,codeandstatefrom the address bar once they have read them, replacing the history entry, so the one-time values no longer stay in browser history or travel in aReferer. The Vue, Angular and Svelte screens already did this.dc52b23: Update
@seamless-auth/typesto 0.31.0, the contract for auth server v0.20.a5956b0: Update
@seamless-auth/typesto 0.33.0.AccountRecoveryRequest,AccountRecoveryRequestsResultandRecoveryErrorCodenow alias the upstream shapes, andRecoveryErrorCodegainsenrollment_required.The recovery session flag is now read from the
recoveryfield of/users/meas well, soisRecoverySession()and the session state'srecoverySessionsurvive a reload, a background revalidation andinitialSession. A restored recovery session is sent to enrollment by the bundled sign-in screen, and the session is refreshed after a passkey or TOTP enrollment made from it.Updated dependencies [e5e6680]
Updated dependencies [e5e6680]
Updated dependencies [e5e6680]
Updated dependencies [44854d0]
Updated dependencies [e5e6680]
Updated dependencies [8dbd3d8]
Updated dependencies [8dbd3d8]
Updated dependencies [8dbd3d8]
Updated dependencies [dc52b23]
Updated dependencies [a5956b0]
@seamless-auth/[email protected]
Minor Changes
44854d0: Add the auth API v0.20 recovery primitives to the client and the session store.
getRecoveryCodeStatus(),generateRecoveryCodes()andredeemRecoveryCode(code). Replacing an existing set needs a fresh step-up; the403it answers without one is recognized byisStepUpRequired(), andgenerateRecoveryCodesWithStepUp()runs the step-up and tries again.startAccountRecovery(channel),verifyAccountRecovery(code),getAccountRecoveryStatus(),completeAccountRecovery(),cancelAccountRecovery(cancelToken), and for a signed-in ownerlistAccountRecoveryRequests()andcancelAccountRecoveryRequest(id).isRecoverySession()on the client andrecoverySessionin the session state report it, and the session actionsredeemRecoveryCodeandcompleteAccountRecoverysign in with it. After a passkey registration or TOTP enrollment made from a recovery session the client refreshes the session (POST /refresh), so the new access token drops the recovery claim the adapters' guards refuse.loadRecoveryOptions(),recoveryCancelTokenFromHash(),cancelRecoveryFromLink(),recoveryErrorMessage(),recoveryCodesText(),passkeyKind()andpasskeyDisplayName(), plusgetRecoveryErrorCode()andisEnrollmentRequired().Needs an auth API with account recovery (v0.20) and a server adapter that proxies its manifest routes.
Patch Changes
e5e6680: The bearer redirect guard now works on React Native. Its
fetchfollows redirects itself and never setsresponse.redirected, so a response that a redirect took to another origin was handed back as if it came from the API. A bearer request now rejects withUntrustedRedirectErrorwhenever the response's final URL differs from the one requested and is not onapiHostortrustedOrigins. On React Native this detects such a redirect after it happened rather than preventing it, so the token may already have been sent on the followed hop.e5e6680: The bearer
POST /refreshno longer follows a redirect. It is sent withredirect: 'manual', and any3xxanswer, a redirect the browser hides, or a response that a platform followed to an origin outsideapiHostandtrustedOrigins(as React Native'sfetchdoes) is refused withUntrustedRedirectError. The held session is cleared, because it can no longer be renewed through that server. Before, a redirect on the refresh route resent the refresh token to the redirect target.e5e6680: The OAuth redirect ports now open only an
httpsauthorization URL, orhttponlocalhost,127.0.0.1or[::1]for local development. The browser port (createBrowserOAuthRedirect) and the React Native port (createWebBrowserOAuthRedirect) throw the newUnsafeAuthorizationUrlErrorfor anything else, such as ajavascript:ordata:URL in any letter case or with embedded tabs, and never navigate to it.startOAuthSignIn, which every bundled sign-in screen uses, reports that as a provider that could not start. A customOAuthRedirectPortcan use the newassertNavigableAuthorizationUrl(url). Auth API 0.19.4 already refuses to store or return such a URL, so this guards against an older or misconfigured server.dc52b23: Update
@seamless-auth/typesto 0.31.0, the contract for auth server v0.20.a5956b0: Update
@seamless-auth/typesto 0.33.0.AccountRecoveryRequest,AccountRecoveryRequestsResultandRecoveryErrorCodenow alias the upstream shapes, andRecoveryErrorCodegainsenrollment_required.The recovery session flag is now read from the
recoveryfield of/users/meas well, soisRecoverySession()and the session state'srecoverySessionsurvive a reload, a background revalidation andinitialSession. A restored recovery session is sent to enrollment by the bundled sign-in screen, and the session is refreshed after a passkey or TOTP enrollment made from it.Updated dependencies [e5e6680]
Updated dependencies [e5e6680]
Updated dependencies [e5e6680]
Updated dependencies [44854d0]
Updated dependencies [e5e6680]
Updated dependencies [8dbd3d8]
Updated dependencies [8dbd3d8]
Updated dependencies [8dbd3d8]
Updated dependencies [dc52b23]
Updated dependencies [a5956b0]
@seamless-auth/[email protected]
Minor Changes
recoverySession,redeemRecoveryCode(code)andcompleteAccountRecovery()from@seamless-auth/client, for a custom account recovery screen.Patch Changes
@seamless-auth/[email protected]
Minor Changes
9b8a9fb: The bundled screens support authenticator apps (TOTP).
createSeamlessAuthRoutes()addsregister-authenticator(SaRegisterAuthenticator), which shows a QR code, the setup key with a copy button and anotpauth://link, verifies the first code and then continues where passkey enrolment does, andauthenticator-code(SaAuthenticatorCode), which finishes a sign-in with a code from the app. Wrong or reused codes, lockout and rate limits each get a clear message.SaRegisterPasskeyoffers "Use an authenticator app" on a device that cannot register a passkey (unless the application signs in with passkeys only, where the API would refuse the app), and always for a recovery session, which can no longer skip enrolment. Adding the app ends the recovery restriction.SaAuthenticatorAppSettings, exported from the package root and router-free, shows whether an authenticator app is set up and lets the user add one or turn it off with a current code.useSeamlessAuth()addsrecoverySession, and the package re-exports theTotpStatustype.Needs an auth API with TOTP sign-in (
POST /totp/verify-login) and a server adapter that proxies the/totproutes.Patch Changes