Skip to Content
On this page

Each stable release of @dogeos/dogeos-sdk, newest first. To install the latest:

npm install @dogeos/dogeos-sdk@latest

4.0.6#

Released November 3, 2026.

  • Tabs stay signed in together. Browser tabs that wake or reload at the same time no longer sign each other out.
  • Works on a device with the wrong clock. Sign-in and wallet connection now use the Social Relay’s time, so a skewed device clock no longer fails with a proof error.
  • WalletConnectEmbed fits its container. The embed fills its container up to 448px, so it fits on phone screens, and it no longer shows a close button.
  • Faster wallet reconnects across tabs. Tabs that wake together no longer push each other’s wallet connections into a backoff of up to a minute.
  • Check before upgrading. AuthErrorCode gains handoff_expired. If you map every error code exhaustively, add a case for it.
All changes in 4.0.6

Fixes and improvements

  • Browser tabs that wake or reload together no longer sign each other out. All tabs share one refresh cookie, and a session check in one tab could present a credential that another tab was rotating at that moment, which signed every tab out. Session checks, refreshes and logout now take turns across the tabs of a browser through the Web Locks API, so each one presents the current cookie. Two tabs refreshing together also no longer risk revoking the session for real: the refresh recovery key is now chosen, dropped and marked spent while the tab holds its turn. A tab waits at most 10 seconds for the others before going ahead anyway. Browsers without Web Locks behave as before.
  • Reuse one operation key per email flow, challenge and code by default, so retrying a code after a failure can recover an outcome the authority already accepted.
  • WalletConnectEmbed now fits on a page. It fills its container up to 448px instead of always being 448px wide, so it fits on phone screens. A parent that sizes to its content, such as inline-block or width: fit-content, now gets a card as wide as its content, up to 448px; give the parent a width to keep it fixed. The embed also no longer shows the modal’s close button, which had nothing to close inline. The wallet’s icon-only Back and Close buttons now have accessible names.
  • Sign-in and wallet connection no longer fail on a device whose clock is wrong, which showed up as “A valid runtime proof is required.” or “Relay returned an invalid proof-bound access lifetime.” The SDK now learns the Social Relay’s time from its responses and uses it for proofs and for every check of a Relay-issued expiry, and re-sends once when a proof was rejected for its time. @dogeos/oidc-auth adds relayClock, createRelayClock, syncRelayClock, and RELAY_CLOCK_TOLERANCE_MS; a custom createRuntimeProof should stamp iat from relayClock.now(). Needs a Relay that exposes the Date header; against an older Relay the device clock stays in use.
  • Browser tabs that wake together now push each other’s wallet connections into a backoff of up to a minute much less often. Each tab that refreshes its session signals the other tabs, which overtakes the wallet runtime requests they have in flight. An overtaken request now waits until the tab’s own session checks have been quiet for a short, jittered window (400–600 ms) before it repeats, which spreads the tabs’ repeats apart. It repeats up to three times before it falls back to the usual backoff. After about five seconds of quiet windows, each later repeat waits only for any session check still running and one more window. Renewals that start during the wait still join it.
  • A wallet connection no longer fails when it retries an earlier wallet handoff that the Social Relay finds already expired. That happens when the device clock runs behind the Relay’s: the handoff still looks valid on the device. The SDK now prepares a new handoff instead. When connecting, it also prepares a new handoff rather than reuse a retained one within 15 seconds of its expiry. @dogeos/oidc-auth adds the handoff_expired error code, which the Relay returns for that case when redeeming a wallet handoff. AuthErrorCode, which the SDK re-exports, gains that member, so code that maps every error code exhaustively needs a case for it.

4.0.5#

Released October 29, 2026.

Fixes and improvements

  • A wallet connection request that overlaps a session check is now repeated as soon as that check settles, instead of waiting out a backoff of up to a minute. This covers a second tab-return or online event during a retry (a laptop waking fires both), the provider repeating a session check that was unavailable, a session check that answers after its timeout, scheduled lease renewals, and a new session generation signalled by another tab, including one that arrives after the auth server has already answered. The request is repeated once; if it is overtaken again it falls back to the usual backoff. A wallet connection that completes while a background renewal is in flight also no longer stops later renewals from running. DogeOSAuthError now has a reason field, set to "session_changed" or "lifecycle_changed" when a request was refused because the session moved on while it was in flight, and null otherwise.
  • When automatic session recovery stops, the login form now explains that the DogeOS session couldn’t be restored and offers a Retry session button, with the social buttons labelled to sign in again with the same account. When a signed-in session’s wallet fails to reconnect in the background, a Reconnect wallet button is now offered instead of a loading overlay.
  • Show the login form instead of an endless loading state when a remembered session can no longer be proven by this browser (Social Relay proof_required), and clear the stale session hint and stored embedded-wallet state (the cookie session is kept, so a later reload can restore it). When the session check stays unavailable after its bounded retries, the login form is shown too; the session is reconciled again when the tab becomes visible, the browser reconnects, or the page reloads.
  • Switching back to the tab or reconnecting to the network while the wallet connection is waiting to retry no longer ends that recovery and clears the wallet. The waiting attempt now runs once the session check that those events also start has settled, in its own mode, so a restored session reacquires its existing wallet runtime, a reloaded wallet iframe is reinitialized, and an interrupted sign-in continues its wallet handoff. Previously, a wallet request that overlapped that session check was discarded and waited out a backoff of up to a minute.
  • Reconnect wallet now repeats the background wallet recovery attempt immediately instead of starting a new wallet handoff. A restored session reacquires its existing wallet runtime, which the authority requires, and an attempt already running is allowed to finish rather than being replaced by a second handoff that could disconnect the wallet it restores. When a connection recovering in the background keeps failing, Reconnect wallet is offered instead of an endless progress view. When the embedded wallet fails to load for a signed-in session, the login view shows a loading state and then Reconnect wallet, which loads the wallet again, next to the usual sign-in options and external wallets.

4.0.4#

Released October 15, 2026.

Fixes and improvements

  • Recover automatically when native wallet readiness arrives after the startup timeout while preserving native provider and capability validation.
  • Replace internal setup notes in the package README with public installation, wallet connection, configuration and documentation guides.

4.0.3#

Released October 14, 2026.

Fixes and improvements

  • Keep social sign-in progress active through automatic wallet recovery, including online and visibility retries. Use current provider readiness after OAuth and keep silent restoration separate from interactive sign-in. Fence recovery callbacks and terminal cleanup to their originating attempt so stale failures cannot restart recovery or settle a replacement sign-in. Preserve the public connection and readiness API.
  • Keep social-login progress at provider scope so wallet setup does not expose the login form after authentication or a view remount. End the runtime-readiness timeout when wallet connection starts, preserving the existing interactive handoff timeout and public readiness/connection API.

4.0.2#

Released October 8, 2026.

Fixes and improvements

  • Preserve MetaMask mobile browser deep-link routes, query strings, fragments, and existing URL escapes while retaining component encoding for other wallet URL templates.

    Settle wallet-browser handoffs with WALLET_BROWSER_REDIRECT instead of leaving connection promises pending. Close the SDK picker, clear connecting state, and preserve any existing source-tab connection without reporting a new connected account. Use mobile wallet instructions instead of desktop extension copy.

  • Show the configured connection screen instead of an empty account modal when a retained openModal() callback is called after disconnecting.

  • Require an explicit, app-owned WalletConnect project ID. Hide WalletConnect when the ID is missing or blank, and preserve the owning configuration through restoration and window-focus discovery.

    Keep WalletConnect protocol storage values isolated from callers so pairing records cannot be corrupted by shared references.

4.0.1#

Released October 3, 2026.

Fixes and improvements

  • Prefer the injected MyDoge wallet inside the mobile app, wait for native readiness without mounting the embedded wallet, show a connection retry when native startup is unavailable, and preserve its current supported EVM network.

    Correct EVM wallet sign-in messages to the SIWE standard, including URI, decimal chain ID, and required field formatting. Preserve server-supplied nonce and URI, normalize issuedAt to ISO UTC, and reject mismatched wallet address or chain context before signing. Custom verifiers that reconstructed the old nonstandard text must adopt SIWE; the helper still returns only a signature.

    Correct the sign-in retry instruction after successful authentication cleanup, retain redacted cleanup-stage diagnostics, and reject a popup handle that points to the main page without navigating or closing it.

    Serialize requests to the confirmed mobile MyDoge provider to respect build 644’s single active request limit. Preserve the announced provider identity and native results/errors, without retries; cancel queued work on disconnect.

    Verify the mobile MyDoge wallet’s live account and chain before restoring a connected state, so a saved network cannot replace the current native signing context. Restoration remains passive and never switches networks; an explicit disconnect also prevents automatic native reconnection.

4.0.0#

Released September 23, 2026.

Breaking changes

  • Expose a provider-scoped Social Relay authentication facade, negotiate the registered protocol before login, and retain only a non-exportable DPoP key in IndexedDB across reloads.
  • Compile DogeOS service destinations into the published SDK, route email, Google, and X authentication through the SDK-owned Social Relay client, and remove consumer service, auth-client, and embedded-wallet deployment overrides.

Fixes and improvements

  • Treat social-login entries as provider selectors only. OAuth client IDs and other provider metadata are now discarded from the SDK runtime configuration because the DogeOS authentication authority owns them per environment.
  • Keep external-wallet reconnect hints, compatibility cache entries, and OTP countdown presentation state in document memory, and enforce the browser-runtime storage policy in source and release artifacts.
  • Reserve the hosted authentication popup during the user’s button press so proof-key initialization cannot cause browsers to block Google, X, or email login.
  • Restore an active SDK session after access-token expiry by refreshing its authority-validated session family before wallet restoration, while preserving embedded custody, bounding retry recovery, and fencing refresh after logout.
  • Restore a connected embedded wallet after the browser tab is closed and reopened. The session reconciliation hint now survives in durable per-origin storage, wallet runtime lease expiries tolerate relay clock skew, a discarded lease result no longer wedges the coordinator, and a cold acquire retries promptly instead of waiting out the expired-lease backoff.
  • Pair the beta SDK with Social Relay’s fail-closed refresh-cookie migration so browsers carrying colliding pre-CHIPS and partitioned cookies reauthenticate once, retain only the live partitioned session, and restore on later reloads or new tabs.
  • Recover an interrupted session refresh instead of losing the session. A refresh whose response never reaches the browser can leave a consumed refresh token in the cookie, and presenting it under a new Idempotency-Key makes the authority treat it as a replay and revoke the whole session family. The refresh key is now briefly persisted and replayed so the rotated credential is recovered instead, and session cookies are partitioned so browsers that block unpartitioned third-party cookies keep sending them.
  • Stop restored embedded-wallet authorization from retrying after the authority has categorically rejected the saved runtime, while retaining durable session reconciliation hints for a later explicit reconnect.
  • Fix embedded approval request ownership, restore hosted application builds, and keep the public SDK package type-complete and within its release size budget.
  • Keep WalletConnect seeds, symmetric keys, pairings, and sessions in isolated document memory; cancel abandoned pairings; and require re-pairing after reload.