@seams/wallet-server 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/THIRD_PARTY_NOTICES.md +1 -9
  2. package/artifact-manifest.json +78 -33
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
  5. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  6. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  7. package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
  8. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  9. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  11. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  12. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/router/index.js +2 -2
  14. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  15. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  16. package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
  17. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  18. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  19. package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
  20. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  21. package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +0 -2
  22. package/cloudflare-router-ab/scripts/start-local-role-workers.mjs +77 -20
  23. package/dist/esm/authorization/lifecycleRouting.js +62 -0
  24. package/dist/esm/authorization/service.js +35 -12
  25. package/dist/esm/cloud-host.js +20 -22
  26. package/dist/esm/core/EmailOtpRecords.js +1 -217
  27. package/dist/esm/core/EmailOtpStores.js +0 -859
  28. package/dist/esm/core/IdentityStore.js +2 -339
  29. package/dist/esm/core/ThresholdService/config.js +1 -9
  30. package/dist/esm/core/ThresholdService/index.js +0 -4
  31. package/dist/esm/core/ThresholdService/kv.js +1 -66
  32. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +1 -13
  33. package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +1 -11
  34. package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +0 -541
  35. package/dist/esm/core/ThresholdService/validation.js +2 -346
  36. package/dist/esm/core/WalletAuthMethodStore.js +2 -123
  37. package/dist/esm/core/WalletStore.js +3 -209
  38. package/dist/esm/core/WebAuthnAuthenticatorStore.js +0 -202
  39. package/dist/esm/core/WebAuthnCredentialBindingStore.js +2 -182
  40. package/dist/esm/core/WebAuthnLoginChallengeStore.js +0 -52
  41. package/dist/esm/core/WebAuthnSyncChallengeStore.js +0 -54
  42. package/dist/esm/core/authService/emailOtpConfig.js +1 -195
  43. package/dist/esm/core/authService/emailOtpEnrollment.js +0 -110
  44. package/dist/esm/core/authService/emailOtpSeal.js +0 -63
  45. package/dist/esm/core/authService/nearTransactions.js +3 -98
  46. package/dist/esm/core/authService/rateLimits.js +0 -84
  47. package/dist/esm/core/authService/webauthn.js +2 -298
  48. package/dist/esm/core/authService/webauthnOidcHelpers.js +1 -24
  49. package/dist/esm/core/authService/webauthnWalletBinding.js +0 -37
  50. package/dist/esm/core/config.js +1 -95
  51. package/dist/esm/core/d1EcdsaSignerRead.js +1 -1
  52. package/dist/esm/core/d1IdentityStore.js +1 -2
  53. package/dist/esm/core/d1TenantStore.js +1 -24
  54. package/dist/esm/core/d1WalletAuthMethodStore.js +2 -5
  55. package/dist/esm/core/d1WalletStore.js +2 -2
  56. package/dist/esm/core/deviceLinking/linkedDeviceBootstrap.js +13 -0
  57. package/dist/esm/core/deviceLinking/linkedDeviceSession.js +20 -14
  58. package/dist/esm/core/deviceLinking/requestProof.js +9 -6
  59. package/dist/esm/core/emailOtpD1Statements.js +107 -94
  60. package/dist/esm/core/keyMaterialBrands.js +2 -12
  61. package/dist/esm/core/nearKeys.js +0 -1
  62. package/dist/esm/core/nearRelayerAccountProvisioning.js +6 -9
  63. package/dist/esm/core/passkeyCredentialClaims.js +8 -0
  64. package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +2 -6
  65. package/dist/esm/core/routerAbSigning/RouterAbNormalSigningRuntime.js +2 -30
  66. package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -4
  67. package/dist/esm/hosted-wallet-gateway.js +66 -43
  68. package/dist/esm/index.js +6 -19
  69. package/dist/esm/localHostedWalletGatewayHandler.js +12 -0
  70. package/dist/esm/localRegistrationSetupAuthority.js +89 -0
  71. package/dist/esm/router/auth/authRequestValidation.js +8 -16
  72. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +0 -1
  73. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +87 -0
  74. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +12 -2
  75. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +32 -281
  76. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +24 -22
  77. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +8 -6
  78. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +12 -13
  79. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.js +6 -1
  80. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js +12 -2
  81. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.js +4 -4
  82. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
  83. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +3 -9
  84. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.js +2 -1
  85. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.js +89 -7
  86. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +23 -14
  87. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js +9 -6
  88. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +0 -1
  89. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +0 -1
  90. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +1 -1
  91. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +0 -1
  92. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.js +1 -1
  93. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.js +1 -7
  94. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +19 -13
  95. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +0 -1
  96. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +0 -1
  97. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +2 -2
  98. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +0 -1
  99. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +44 -12
  100. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.js +1 -49
  101. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +19 -31
  102. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleRegistrationCompletion.js +85 -0
  103. package/dist/esm/router/cloudflare/d1/identity/d1IdentityRecords.js +0 -1
  104. package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +0 -48
  105. package/dist/esm/router/cloudflare/d1/near/d1SponsoredNearAccount.js +242 -0
  106. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +0 -1
  107. package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +2 -29
  108. package/dist/esm/router/cloudflare/d1/oidc/googleOidcToken.js +41 -0
  109. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +5 -0
  110. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +34 -0
  111. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +9 -3
  112. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +7 -13
  113. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +25 -13
  114. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +0 -1
  115. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +74 -0
  116. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +7 -1
  117. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +69 -238
  118. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +12 -56
  119. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +155 -0
  120. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +1 -3
  121. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +12 -6
  122. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +68 -0
  123. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +7 -54
  124. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +9 -8
  125. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +2 -142
  126. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +25 -4
  127. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +4 -70
  128. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnStore.js +23 -7
  129. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +1 -0
  130. package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -0
  131. package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +5 -0
  132. package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
  133. package/dist/esm/router/cloudflare/runtime/walletRuntimeOps.js +16 -4
  134. package/dist/esm/router/cloudflare-adaptor.js +1 -2
  135. package/dist/esm/router/cloudflare.js +1342 -1733
  136. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +11 -8
  137. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +3 -2
  138. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +6 -6
  139. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +6 -6
  140. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +3 -0
  141. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +8 -0
  142. package/dist/esm/router/domains/emailOtp/emailOtpRequestValidation.js +0 -1
  143. package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +2 -8
  144. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +2 -8
  145. package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +5 -19
  146. package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +2 -3
  147. package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +70 -0
  148. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +10 -11
  149. package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +2 -3
  150. package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +14 -0
  151. package/dist/esm/router/express.js +574 -479
  152. package/dist/esm/router/framework/http.js +2 -0
  153. package/dist/esm/router/framework/registrationSetupDispatch.js +14 -0
  154. package/dist/esm/router/framework/ror/normalize.js +0 -1
  155. package/dist/esm/router/framework/ror/options.js +0 -1
  156. package/dist/esm/router/framework/ror/provider.js +0 -1
  157. package/dist/esm/router/framework/ror/staticProvider.js +0 -1
  158. package/dist/esm/router/framework/routeDefinitions.js +1 -2
  159. package/dist/esm/router/framework/routerApiWebhooks.js +0 -1
  160. package/dist/esm/router/ror.js +0 -1
  161. package/dist/esm/router/transport/fetch/createFetchRouter.js +0 -2
  162. package/dist/esm/router/transport/fetch/routes/auth.js +2 -0
  163. package/dist/esm/router/transport/fetch/routes/deviceLinking.js +36 -147
  164. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +3 -2
  165. package/dist/esm/router/transport/fetch/routes/deviceLinkingResponses.js +130 -0
  166. package/dist/esm/router/transport/fetch/routes/ecdsaOperationStepUpFactor.js +171 -0
  167. package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +1 -0
  168. package/dist/esm/router/transport/fetch/routes/syncAccount.js +7 -2
  169. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +19 -115
  170. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +3 -1
  171. package/dist/esm/shared-ts/src/authorization/walletSessionIssuance.js +0 -1
  172. package/dist/esm/shared-ts/src/device-linking/authorityActivation.js +0 -2
  173. package/dist/esm/shared-ts/src/device-linking/contracts.js +16 -1
  174. package/dist/esm/shared-ts/src/device-linking/digests.js +1 -8
  175. package/dist/esm/shared-ts/src/near/actions.js +0 -1
  176. package/dist/esm/shared-ts/src/near/nearClient.js +0 -2
  177. package/dist/esm/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js +1 -1
  178. package/dist/esm/shared-ts/src/signing-lanes/index.js +1 -6
  179. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +1 -1
  180. package/dist/esm/shared-ts/src/signing-lanes/participantDigest.js +2 -81
  181. package/dist/esm/shared-ts/src/signing-lanes/participants.js +1 -219
  182. package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +0 -3
  183. package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -2
  184. package/dist/esm/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js +0 -1
  185. package/dist/esm/shared-ts/src/threshold/keyMaterialBrands.js +1 -22
  186. package/dist/esm/shared-ts/src/threshold/participants.js +0 -1
  187. package/dist/esm/shared-ts/src/threshold/signingRootScope.js +0 -1
  188. package/dist/esm/shared-ts/src/utils/addWalletAuthMethod.js +4 -13
  189. package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +1 -7
  190. package/dist/esm/shared-ts/src/utils/domainIds.js +1 -16
  191. package/dist/esm/shared-ts/src/utils/ecdsaCapabilityActivation.js +1 -11
  192. package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +0 -1
  193. package/dist/esm/shared-ts/src/utils/errors.js +1 -19
  194. package/dist/esm/shared-ts/src/utils/near.js +1 -1
  195. package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +1 -1
  196. package/dist/esm/shared-ts/src/utils/registrationIds.js +1 -5
  197. package/dist/esm/shared-ts/src/utils/registrationIntent.js +0 -1
  198. package/dist/esm/shared-ts/src/utils/registrationSetupOperation.js +8 -0
  199. package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +1 -1
  200. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +0 -1
  201. package/dist/esm/shared-ts/src/utils/validation.js +1 -5
  202. package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +0 -1
  203. package/dist/esm/shared-ts/src/utils/walletManagementProtocol.js +6 -0
  204. package/dist/esm/shared-ts/src/utils/wireSchema.js +2 -13
  205. package/dist/esm/shared-ts/src/wallet-recovery/backupAcknowledgement.js +6 -24
  206. package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +0 -1
  207. package/dist/esm/shared-ts/src/wallet-recovery/recoveryKeyId.js +5 -6
  208. package/dist/esm/storage/d1Sql.js +1 -7
  209. package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +0 -1
  210. package/dist/esm/threshold/session/signingSessionSeal/guards/backends.js +1 -2
  211. package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +0 -1
  212. package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +0 -1
  213. package/dist/esm/threshold/session/signingSessionSeal/options.js +0 -1
  214. package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
  215. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker.js +0 -611
  216. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  217. package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime_bg.wasm +0 -0
  218. package/dist/types/shared-ts/src/authorization/capabilityKinds.d.ts +0 -4
  219. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +1 -0
  220. package/dist/types/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.d.ts +0 -2
  221. package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +0 -11
  222. package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +2 -7
  223. package/dist/types/shared-ts/src/signing-lanes/index.d.ts +0 -4
  224. package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.d.ts +0 -1
  225. package/dist/types/shared-ts/src/signing-lanes/participantDigest.d.ts +0 -18
  226. package/dist/types/shared-ts/src/signing-lanes/participants.d.ts +6 -35
  227. package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +6 -843
  228. package/dist/types/shared-ts/src/threshold/keyMaterialBrands.d.ts +0 -10
  229. package/dist/types/shared-ts/src/threshold/participants.d.ts +1 -1
  230. package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +1 -133
  231. package/dist/types/shared-ts/src/utils/addWalletAuthMethod.typecheck.d.ts +4 -18
  232. package/dist/types/shared-ts/src/utils/domainIds.d.ts +0 -12
  233. package/dist/types/shared-ts/src/utils/errors.d.ts +0 -4
  234. package/dist/types/shared-ts/src/utils/near.d.ts +0 -20
  235. package/dist/types/shared-ts/src/utils/normalize.d.ts +0 -2
  236. package/dist/types/shared-ts/src/utils/registrationSetupOperation.d.ts +3 -0
  237. package/dist/types/shared-ts/src/utils/validation.d.ts +1 -3
  238. package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +0 -1
  239. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +3 -0
  240. package/dist/types/shared-ts/src/utils/wireSchema.d.ts +0 -2
  241. package/dist/types/shared-ts/src/wallet-recovery/backupAcknowledgement.d.ts +0 -1
  242. package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeReservation.d.ts +1 -10
  243. package/dist/types/shared-ts/src/wallet-recovery/recoveryCodes.d.ts +1 -3
  244. package/dist/types/shared-ts/src/wallet-recovery/recoveryKeyId.d.ts +5 -21
  245. package/dist/types/wallet-server/src/authorization/lifecycleRouting.d.ts +32 -0
  246. package/dist/types/wallet-server/src/authorization/lifecycleRouting.typecheck.d.ts +2 -0
  247. package/dist/types/wallet-server/src/authorization/recoveryRouting.d.ts +22 -0
  248. package/dist/types/wallet-server/src/authorization/recoveryRouting.typecheck.d.ts +2 -0
  249. package/dist/types/wallet-server/src/authorization/service.d.ts +8 -1
  250. package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +20 -0
  251. package/dist/types/wallet-server/src/authorization/sessionRouting.typecheck.d.ts +2 -0
  252. package/dist/types/wallet-server/src/cloud-host.d.ts +31 -9
  253. package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +1 -22
  254. package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +1 -79
  255. package/dist/types/wallet-server/src/core/IdentityStore.d.ts +0 -10
  256. package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +0 -1
  257. package/dist/types/wallet-server/src/core/ThresholdService/config.d.ts +0 -2
  258. package/dist/types/wallet-server/src/core/ThresholdService/index.d.ts +1 -3
  259. package/dist/types/wallet-server/src/core/ThresholdService/kv.d.ts +0 -7
  260. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +0 -3
  261. package/dist/types/wallet-server/src/core/ThresholdService/routerAbNormalSigningPolicy.d.ts +0 -1
  262. package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +7 -19
  263. package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +0 -34
  264. package/dist/types/wallet-server/src/core/WalletAuthMethodStore.d.ts +1 -5
  265. package/dist/types/wallet-server/src/core/WalletStore.d.ts +0 -3
  266. package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +0 -20
  267. package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.d.ts +1 -27
  268. package/dist/types/wallet-server/src/core/WebAuthnLoginChallengeStore.d.ts +2 -16
  269. package/dist/types/wallet-server/src/core/WebAuthnSyncChallengeStore.d.ts +22 -14
  270. package/dist/types/wallet-server/src/core/authService/emailOtpConfig.d.ts +0 -24
  271. package/dist/types/wallet-server/src/core/authService/emailOtpEnrollment.d.ts +1 -70
  272. package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +0 -13
  273. package/dist/types/wallet-server/src/core/authService/githubOAuth.d.ts +2 -1
  274. package/dist/types/wallet-server/src/core/authService/nearTransactions.d.ts +1 -39
  275. package/dist/types/wallet-server/src/core/authService/rateLimits.d.ts +0 -17
  276. package/dist/types/wallet-server/src/core/authService/webauthn.d.ts +0 -125
  277. package/dist/types/wallet-server/src/core/authService/webauthnOidcHelpers.d.ts +0 -3
  278. package/dist/types/wallet-server/src/core/authService/webauthnVerificationOutcomes.d.ts +1 -1
  279. package/dist/types/wallet-server/src/core/authService/webauthnWalletBinding.d.ts +0 -12
  280. package/dist/types/wallet-server/src/core/config.d.ts +0 -10
  281. package/dist/types/wallet-server/src/core/d1IdentityStore.d.ts +0 -2
  282. package/dist/types/wallet-server/src/core/d1TenantStore.d.ts +0 -7
  283. package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +0 -1
  284. package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceBootstrap.d.ts +19 -0
  285. package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSession.d.ts +8 -6
  286. package/dist/types/wallet-server/src/core/deviceLinking/requestProof.d.ts +2 -5
  287. package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +10 -7
  288. package/dist/types/wallet-server/src/core/keyMaterialBrands.d.ts +1 -5
  289. package/dist/types/wallet-server/src/core/nearRelayerAccountProvisioning.d.ts +0 -1
  290. package/dist/types/wallet-server/src/core/passkeyCredentialClaims.d.ts +9 -0
  291. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +0 -2
  292. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +0 -2
  293. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +1 -92
  294. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.typecheck.d.ts +4 -52
  295. package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +0 -1
  296. package/dist/types/wallet-server/src/core/types.d.ts +0 -299
  297. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +15 -3
  298. package/dist/types/wallet-server/src/index.d.ts +8 -13
  299. package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +13 -0
  300. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +23 -0
  301. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +25 -3
  302. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +1 -1
  303. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +3 -1
  304. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.d.ts +7 -1
  305. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.d.ts +1 -10
  306. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.d.ts +4 -0
  307. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +6 -0
  308. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.d.ts +1 -13
  309. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.d.ts +2 -2
  310. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -1
  311. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.d.ts +0 -2
  312. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +18 -2
  313. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.d.ts +29 -1
  314. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.d.ts +3 -16
  315. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.d.ts +7 -2
  316. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleRegistrationCompletion.d.ts +23 -0
  317. package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityService.d.ts +0 -12
  318. package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1SponsoredNearAccount.d.ts +24 -0
  319. package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1SponsoredNearAccount.typecheck.d.ts +2 -0
  320. package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcVerificationService.d.ts +0 -1
  321. package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/googleOidcToken.d.ts +4 -0
  322. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.d.ts +5 -0
  323. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +9 -0
  324. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +1 -1
  325. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.d.ts +10 -11
  326. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +3 -2
  327. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +51 -0
  328. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +3 -0
  329. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +30 -47
  330. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetup.d.ts +3 -30
  331. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +11 -0
  332. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.d.ts +27 -0
  333. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +1 -10
  334. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +2 -2
  335. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +0 -4
  336. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.d.ts +3 -0
  337. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +0 -13
  338. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.d.ts +23 -10
  339. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.typecheck.d.ts +2 -0
  340. package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflare.types.d.ts +0 -2
  341. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -0
  342. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +2 -0
  343. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +1 -1
  344. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOps.d.ts +3 -0
  345. package/dist/types/wallet-server/src/router/cloudflare-adaptor.d.ts +0 -1
  346. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +1 -1
  347. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.d.ts +2 -2
  348. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +2 -2
  349. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.typecheck.d.ts +2 -0
  350. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.d.ts +2 -0
  351. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +2 -0
  352. package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.d.ts +0 -2
  353. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +0 -3
  354. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +0 -17
  355. package/dist/types/wallet-server/src/router/domains/signingOperations/walletExecutionAdmission.d.ts +1 -2
  356. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +1 -0
  357. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +51 -0
  358. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +2 -10
  359. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationSetupPayload.d.ts +2 -2
  360. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +14 -34
  361. package/dist/types/wallet-server/src/router/framework/googleLoginResolution.typecheck.d.ts +2 -0
  362. package/dist/types/wallet-server/src/router/framework/registrationSetupDispatch.d.ts +13 -0
  363. package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinking.d.ts +1 -1
  364. package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingResponses.d.ts +17 -0
  365. package/dist/types/wallet-server/src/router/transport/fetch/routes/ecdsaOperationStepUpFactor.d.ts +37 -0
  366. package/dist/types/wallet-server/src/storage/d1Sql.d.ts +0 -1
  367. package/migrations/d1-signer/0040_namespace_home_challenges.sql +16 -0
  368. package/migrations/d1-signer/0041_step_up_admission_expiry.sql +28 -0
  369. package/migrations/d1-signer/0042_deployment_resource_challenges.sql +4 -0
  370. package/migrations/d1-signer/0043_google_registration_candidate_claim.sql +2 -0
  371. package/migrations/d1-signer/0044_linked_device_bootstrap_imports.sql +6 -0
  372. package/migrations/d1-signer/0045_wallet_owned_capability_receipts.sql +29 -0
  373. package/migrations/d1-signer/0046_wallet_owned_signing_abuse.sql +41 -0
  374. package/migrations/d1-signer/0047_remove_unused_near_public_keys.sql +2 -0
  375. package/migrations/d1-signer/0048_operation_owner_scope.sql +45 -0
  376. package/package.json +2 -3
  377. package/src/README.md +11 -3
  378. package/dist/esm/core/AuthService.js +0 -2
  379. package/dist/esm/core/NearPublicKeyStore.js +0 -200
  380. package/dist/esm/core/ThresholdService/stores/CloudflareDurableObjectStore.js +0 -397
  381. package/dist/esm/core/ThresholdService/stores/KeyStore.js +0 -140
  382. package/dist/esm/core/ThresholdService/stores/SessionStore.js +0 -361
  383. package/dist/esm/core/ThresholdService/stores/StoreConfig.js +0 -13
  384. package/dist/esm/core/ThresholdService/stores/exportReplayGuard.js +0 -7
  385. package/dist/esm/core/authService/AuthService.js +0 -594
  386. package/dist/esm/core/authService/bytes.js +0 -19
  387. package/dist/esm/core/authService/configValues.js +0 -15
  388. package/dist/esm/core/authService/emailOtpChallengeOperations.js +0 -123
  389. package/dist/esm/core/authService/emailOtpChallengeProof.js +0 -183
  390. package/dist/esm/core/authService/emailOtpChallengeVerification.js +0 -264
  391. package/dist/esm/core/authService/emailOtpChallenges.js +0 -225
  392. package/dist/esm/core/authService/emailOtpDelivery.js +0 -134
  393. package/dist/esm/core/authService/emailOtpGrant.js +0 -43
  394. package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +0 -144
  395. package/dist/esm/core/authService/emailOtpUnlock.js +0 -174
  396. package/dist/esm/core/authService/googleEmailOtpOperations.js +0 -141
  397. package/dist/esm/core/authService/googleEmailOtpRegistration.js +0 -587
  398. package/dist/esm/core/authService/identity.js +0 -42
  399. package/dist/esm/core/authService/identityOperations.js +0 -32
  400. package/dist/esm/core/authService/nearAccountOperations.js +0 -229
  401. package/dist/esm/core/authService/nearPublicKeyMetadata.js +0 -108
  402. package/dist/esm/core/authService/oidcVerification.js +0 -249
  403. package/dist/esm/core/authService/registrationThresholdHelpers.js +0 -30
  404. package/dist/esm/core/authService/runtime.js +0 -45
  405. package/dist/esm/core/authService/storeRegistry.js +0 -102
  406. package/dist/esm/core/authService/thresholdStoreSummary.js +0 -32
  407. package/dist/esm/core/authService/webauthnAuthority.js +0 -17
  408. package/dist/esm/core/defaultConfigsServer.js +0 -9
  409. package/dist/esm/core/hostedAccountIds.js +0 -225
  410. package/dist/esm/core/routerAbSigning/createRouterAbSigningRuntimes.js +0 -84
  411. package/dist/esm/core/signingLanes/LaneAggregateRevocationApplicationService.js +0 -86
  412. package/dist/esm/core/signingLanes/LaneEnrollmentActivation.js +0 -324
  413. package/dist/esm/core/signingLanes/LaneEnrollmentRevocation.js +0 -173
  414. package/dist/esm/core/signingLanes/LaneLifecycleApplicationService.js +0 -198
  415. package/dist/esm/core/signingLanes/ecdsaServerRetirement.js +0 -73
  416. package/dist/esm/core/signingLanes/ed25519ServerRetirement.js +0 -68
  417. package/dist/esm/core/signingLanes/signingWorkerLaneMaterialIdentity.js +0 -0
  418. package/dist/esm/core/storeBackends.js +0 -208
  419. package/dist/esm/core/utils.js +0 -14
  420. package/dist/esm/core/webAuthnStoreBackends.js +0 -198
  421. package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +0 -49
  422. package/dist/esm/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.js +0 -10
  423. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.js +0 -22
  424. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.js +0 -166
  425. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.js +0 -38
  426. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.js +0 -20
  427. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.js +0 -1459
  428. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLockStore.js +0 -114
  429. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.js +0 -16
  430. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneRecords.js +0 -171
  431. package/dist/esm/router/cloudflare/d1/signingLanes/index.js +0 -10
  432. package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +0 -397
  433. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +0 -597
  434. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +0 -273
  435. package/dist/esm/router/cloudflare/signingLanes/index.js +0 -4
  436. package/dist/esm/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.js +0 -32
  437. package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +0 -27
  438. package/dist/esm/shared-ts/src/signing-lanes/rotation.js +0 -8
  439. package/dist/esm/shared-ts/src/signing-lanes/rotationDigests.js +0 -358
  440. package/dist/esm/shared-ts/src/signing-lanes/rotationLifecycle.js +0 -313
  441. package/dist/esm/shared-ts/src/signing-lanes/rotationParsers.js +0 -532
  442. package/dist/esm/shared-ts/src/signing-lanes/rotationProtocolParsers.js +0 -323
  443. package/dist/esm/shared-ts/src/signing-lanes/rotationWireFields.js +0 -59
  444. package/dist/types/shared-ts/src/signing-lanes/participantDigest.typecheck.d.ts +0 -2
  445. package/dist/types/shared-ts/src/signing-lanes/rotation.typecheck.d.ts +0 -2
  446. package/dist/types/shared-ts/src/signing-lanes/rotationDigests.d.ts +0 -13
  447. package/dist/types/shared-ts/src/signing-lanes/rotationLifecycle.d.ts +0 -78
  448. package/dist/types/shared-ts/src/signing-lanes/rotationParsers.d.ts +0 -27
  449. package/dist/types/shared-ts/src/signing-lanes/rotationProtocolParsers.d.ts +0 -6
  450. package/dist/types/shared-ts/src/signing-lanes/rotationWireFields.d.ts +0 -20
  451. package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeAttempt.d.ts +0 -59
  452. package/dist/types/wallet-server/src/core/AuthService.d.ts +0 -3
  453. package/dist/types/wallet-server/src/core/NearPublicKeyStore.d.ts +0 -48
  454. package/dist/types/wallet-server/src/core/ThresholdService/stores/CloudflareDurableObjectStore.d.ts +0 -21
  455. package/dist/types/wallet-server/src/core/ThresholdService/stores/KeyStore.d.ts +0 -40
  456. package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +0 -98
  457. package/dist/types/wallet-server/src/core/ThresholdService/stores/StoreConfig.d.ts +0 -4
  458. package/dist/types/wallet-server/src/core/ThresholdService/stores/ThresholdStoreConfig.typecheck.d.ts +0 -2
  459. package/dist/types/wallet-server/src/core/ThresholdService/stores/exportReplayGuard.d.ts +0 -3
  460. package/dist/types/wallet-server/src/core/authService/AuthService.d.ts +0 -490
  461. package/dist/types/wallet-server/src/core/authService/bytes.d.ts +0 -3
  462. package/dist/types/wallet-server/src/core/authService/configValues.d.ts +0 -7
  463. package/dist/types/wallet-server/src/core/authService/emailOtpChallengeOperations.d.ts +0 -109
  464. package/dist/types/wallet-server/src/core/authService/emailOtpChallengeProof.d.ts +0 -169
  465. package/dist/types/wallet-server/src/core/authService/emailOtpChallengeVerification.d.ts +0 -47
  466. package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +0 -86
  467. package/dist/types/wallet-server/src/core/authService/emailOtpDelivery.d.ts +0 -66
  468. package/dist/types/wallet-server/src/core/authService/emailOtpGrant.d.ts +0 -43
  469. package/dist/types/wallet-server/src/core/authService/emailOtpRegistrationEnrollment.d.ts +0 -49
  470. package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +0 -64
  471. package/dist/types/wallet-server/src/core/authService/googleEmailOtpOperations.d.ts +0 -126
  472. package/dist/types/wallet-server/src/core/authService/googleEmailOtpRegistration.d.ts +0 -169
  473. package/dist/types/wallet-server/src/core/authService/identity.d.ts +0 -25
  474. package/dist/types/wallet-server/src/core/authService/identityOperations.d.ts +0 -19
  475. package/dist/types/wallet-server/src/core/authService/nearAccountOperations.d.ts +0 -55
  476. package/dist/types/wallet-server/src/core/authService/nearPublicKeyMetadata.d.ts +0 -44
  477. package/dist/types/wallet-server/src/core/authService/oidcVerification.d.ts +0 -66
  478. package/dist/types/wallet-server/src/core/authService/registrationThresholdHelpers.d.ts +0 -11
  479. package/dist/types/wallet-server/src/core/authService/runtime.d.ts +0 -20
  480. package/dist/types/wallet-server/src/core/authService/storeRegistry.d.ts +0 -53
  481. package/dist/types/wallet-server/src/core/authService/thresholdStoreSummary.d.ts +0 -3
  482. package/dist/types/wallet-server/src/core/authService/webauthnAuthority.d.ts +0 -5
  483. package/dist/types/wallet-server/src/core/defaultConfigsServer.d.ts +0 -5
  484. package/dist/types/wallet-server/src/core/hostedAccountIds.d.ts +0 -16
  485. package/dist/types/wallet-server/src/core/routerAbSigning/createRouterAbSigningRuntimes.d.ts +0 -16
  486. package/dist/types/wallet-server/src/core/signingLanes/LaneAggregateRevocationApplicationService.d.ts +0 -36
  487. package/dist/types/wallet-server/src/core/signingLanes/LaneEffectJournalStore.d.ts +0 -62
  488. package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentActivation.d.ts +0 -13
  489. package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentRevocation.d.ts +0 -24
  490. package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleApplicationService.d.ts +0 -141
  491. package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleStore.d.ts +0 -228
  492. package/dist/types/wallet-server/src/core/signingLanes/ecdsaServerRetirement.d.ts +0 -58
  493. package/dist/types/wallet-server/src/core/signingLanes/ed25519ServerRetirement.d.ts +0 -30
  494. package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +0 -4
  495. package/dist/types/wallet-server/src/core/storeBackends.d.ts +0 -83
  496. package/dist/types/wallet-server/src/core/utils.d.ts +0 -3
  497. package/dist/types/wallet-server/src/core/webAuthnStoreBackends.d.ts +0 -96
  498. package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1NearPublicKeyStore.d.ts +0 -29
  499. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.d.ts +0 -4
  500. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.d.ts +0 -4
  501. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.d.ts +0 -24
  502. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.d.ts +0 -20
  503. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.d.ts +0 -13
  504. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.d.ts +0 -51
  505. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLockStore.d.ts +0 -28
  506. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.d.ts +0 -5
  507. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneRecords.d.ts +0 -107
  508. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/index.d.ts +0 -10
  509. package/dist/types/wallet-server/src/router/cloudflare/durableObjects/thresholdStore.d.ts +0 -18
  510. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.d.ts +0 -217
  511. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.d.ts +0 -73
  512. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/index.d.ts +0 -4
  513. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.d.ts +0 -6
  514. package/dist/types/wallet-server/src/router/transport/fetch/routes/nearPublicKeys.d.ts +0 -3
  515. /package/dist/esm/{core/signingLanes/LaneEffectJournalStore.js → authorization/recoveryRouting.js} +0 -0
  516. /package/dist/esm/{core/signingLanes/LaneLifecycleStore.js → authorization/sessionRouting.js} +0 -0
@@ -90,6 +90,21 @@ function buildCorsOrigins(...inputs) {
90
90
  }
91
91
  //#endregion
92
92
  //#region ../shared-ts/src/device-linking/contracts.ts
93
+ function isLinkSessionTerminalFailureV1(state) {
94
+ switch (state.state) {
95
+ case "failed_before_commit":
96
+ case "cancelled":
97
+ case "expired": return true;
98
+ case "displaying_qr":
99
+ case "claimed":
100
+ case "awaiting_target_factor":
101
+ case "awaiting_source_contribution":
102
+ case "provisioning":
103
+ case "authority_pending_local_install":
104
+ case "active": return false;
105
+ default: return assertNeverLinkSessionStateV1(state);
106
+ }
107
+ }
93
108
  function assertNeverLinkSessionStateV1(value) {
94
109
  throw new Error(`[LinkSessionStateV1] unsupported state: ${String(value)}`);
95
110
  }
@@ -398,112 +413,6 @@ function toRorOriginOrNull(value) {
398
413
  }
399
414
  }
400
415
  //#endregion
401
- //#region ../shared-ts/src/utils/base58.ts
402
- /**
403
- * Encodes binary data to base58 string using Bitcoin's base58 alphabet.
404
- *
405
- * @param data - Binary data to encode (Uint8Array, ArrayBuffer, or number[])
406
- * @returns Base58-encoded string
407
- */
408
- const base58Encode = (data) => {
409
- if (data instanceof ArrayBuffer) return bs58.encode(new Uint8Array(data));
410
- if (Array.isArray(data)) return bs58.encode(new Uint8Array(data));
411
- return bs58.encode(data);
412
- };
413
- /**
414
- * Decodes a base58 string to binary data using Bitcoin's base58 alphabet.
415
- * Returns a Uint8Array containing the decoded bytes.
416
- *
417
- * @param base58String - Base58-encoded string to decode
418
- * @returns Uint8Array containing the decoded bytes
419
- * @throws Error if input contains invalid base58 characters
420
- */
421
- const base58Decode = (base58String) => {
422
- return bs58.decode(base58String);
423
- };
424
- //#endregion
425
- //#region ../shared-ts/src/utils/near.ts
426
- /**
427
- * NEAR-specific utility helpers.
428
- *
429
- * Keep chain-specific parsing and validation logic here so generic utility
430
- * modules (`validation`, `errors`, `encoders`, etc.) stay chain-agnostic.
431
- */
432
- /**
433
- * Ensure a key string has the NEAR Ed25519 prefix (`ed25519:`).
434
- *
435
- * - Accepts either `ed25519:<base58>` or a bare `<base58>` string.
436
- * - Canonicalizes `ED25519:` -> `ed25519:`.
437
- * - If a different prefix is present (e.g. `secp256k1:`), returns the input unchanged.
438
- */
439
- function ensureEd25519Prefix(value) {
440
- const raw = String(value ?? "").trim();
441
- if (!raw) return "";
442
- if (/^[a-z0-9_]+:/i.test(raw)) {
443
- if (/^ed25519:/i.test(raw)) return `ed25519:${raw.replace(/^ed25519:/i, "")}`;
444
- return raw;
445
- }
446
- return `ed25519:${raw}`;
447
- }
448
- /**
449
- * Lightweight NEAR account ID validation used by server-side helpers.
450
- * - length: 2..64
451
- * - chars: lowercase letters, digits, `_`, `.`, `-`
452
- */
453
- function isValidAccountId(accountId) {
454
- if (typeof accountId !== "string") return false;
455
- if (!accountId || accountId.length < 2 || accountId.length > 64) return false;
456
- return /^[a-z0-9_.-]+$/.test(accountId);
457
- }
458
- function isImplicitNearAccountId(value) {
459
- return typeof value === "string" && /^[0-9a-f]{64}$/.test(value);
460
- }
461
- function parseImplicitNearAccountId(raw) {
462
- const value = typeof raw === "string" ? raw.trim() : "";
463
- if (!value) return {
464
- ok: false,
465
- code: "missing",
466
- message: "implicit NEAR account ID is required"
467
- };
468
- if (!isImplicitNearAccountId(value)) return {
469
- ok: false,
470
- code: "invalid",
471
- message: "implicit NEAR account ID must be 64 lowercase hex characters"
472
- };
473
- return {
474
- ok: true,
475
- value
476
- };
477
- }
478
- function parseNamedNearAccountId(raw) {
479
- const value = typeof raw === "string" ? raw.trim() : "";
480
- if (!value) return {
481
- ok: false,
482
- code: "missing",
483
- message: "named NEAR account ID is required"
484
- };
485
- if (isImplicitNearAccountId(value) || !isValidAccountId(value) || !value.includes(".")) return {
486
- ok: false,
487
- code: "invalid",
488
- message: "named NEAR account ID must be a valid named account containing a dot"
489
- };
490
- return {
491
- ok: true,
492
- value
493
- };
494
- }
495
- function bytesToLowerHex(bytes) {
496
- return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
497
- }
498
- function deriveImplicitNearAccountIdFromEd25519PublicKey(publicKey) {
499
- const normalized = ensureEd25519Prefix(publicKey);
500
- const encoded = normalized.startsWith("ed25519:") ? normalized.slice(8) : "";
501
- if (!encoded) throw new Error("Ed25519 public key is required");
502
- const decoded = base58Decode(encoded);
503
- if (decoded.length !== 32) throw new Error("Ed25519 public key must decode to 32 bytes");
504
- return bytesToLowerHex(decoded);
505
- }
506
- //#endregion
507
416
  //#region ../shared-ts/src/utils/validation.ts
508
417
  function requireTrimmedString(value, label, message = "is required") {
509
418
  const parsed = normalizeOptionalTrimmedString(value);
@@ -5416,11 +5325,15 @@ function createRouterAbTraceContextV1() {
5416
5325
  };
5417
5326
  }
5418
5327
  //#endregion
5328
+ //#region ../shared-ts/src/utils/walletManagementProtocol.ts
5329
+ const WALLET_MANAGEMENT_PROTOCOL_HEADER = "X-Seams-Wallet-Protocol";
5330
+ //#endregion
5419
5331
  //#region src/router/framework/http.ts
5420
5332
  const CORS_ALLOW_METHODS = "GET,POST,PUT,PATCH,DELETE,OPTIONS";
5421
5333
  const CORS_PREFLIGHT_MAX_AGE_SECONDS = 600;
5422
5334
  const CORS_ALLOW_HEADERS = [
5423
5335
  "Content-Type",
5336
+ WALLET_MANAGEMENT_PROTOCOL_HEADER,
5424
5337
  "Authorization",
5425
5338
  "X-Seams-Benchmark-Diagnostics",
5426
5339
  LINKED_DEVICE_REQUEST_PROOF_HEADER_V1,
@@ -5529,6 +5442,11 @@ async function handleReady(ctx) {
5529
5442
  }
5530
5443
  }
5531
5444
  //#endregion
5445
+ //#region ../shared-ts/src/utils/registrationSetupOperation.ts
5446
+ function parseRegistrationSetupOperationId(value) {
5447
+ return typeof value === "string" && /^wreg_[A-Za-z0-9_-]{43}$/u.test(value) ? value : null;
5448
+ }
5449
+ //#endregion
5532
5450
  //#region src/router/auth/routerApiKeyAuth.ts
5533
5451
  function readHeader(headers, name) {
5534
5452
  if (headers instanceof Headers) return String(headers.get(name) || "").trim();
@@ -5729,22 +5647,6 @@ function parseLaneParticipantBindingDigestB64u(raw) {
5729
5647
  return parseDigest(raw, "participantBindingDigestB64u", brandParticipantDigest);
5730
5648
  }
5731
5649
  //#endregion
5732
- //#region ../shared-ts/src/utils/registrationIds.ts
5733
- function walletIdFromString(value) {
5734
- const parsed = parseWalletId(value);
5735
- if (!parsed.ok) throw new Error(parsed.error.message);
5736
- return parsed.value;
5737
- }
5738
- function nearEd25519SigningKeyIdFromString(value) {
5739
- const normalized = String(value || "").trim();
5740
- if (!normalized) throw new Error("nearEd25519SigningKeyId is required");
5741
- return normalized;
5742
- }
5743
- function parseNearEd25519SigningKeyId(value) {
5744
- if (typeof value !== "string") throw new Error("nearEd25519SigningKeyId must be a string");
5745
- return nearEd25519SigningKeyIdFromString(value);
5746
- }
5747
- //#endregion
5748
5650
  //#region ../shared-ts/src/signing-lanes/participantDigest.ts
5749
5651
  function u32(value) {
5750
5652
  if (!Number.isInteger(value) || value < 0 || value > 4294967295) throw new Error("canonical u32 must be an integer between 0 and 4294967295");
@@ -5775,6 +5677,17 @@ function encodeLaneCanonicalU64V1(value) {
5775
5677
  return output;
5776
5678
  }
5777
5679
  //#endregion
5680
+ //#region ../shared-ts/src/signing-lanes/execution.ts
5681
+ function buildPreparedOwnerWalletExecution(input) {
5682
+ return {
5683
+ kind: "prepared_owner_wallet_execution",
5684
+ laneKind: input.lane.laneKind,
5685
+ authorization: input.authorization,
5686
+ materialActivation: input.materialActivation,
5687
+ lane: input.lane
5688
+ };
5689
+ }
5690
+ //#endregion
5778
5691
  //#region ../shared-ts/src/signing-lanes/ownerContinuity.ts
5779
5692
  const OWNER_LANE_PARTICIPANT_BINDING_DOMAIN_V1 = "seams/rotatable-signing-lanes/owner-lane-participant-continuity/v1";
5780
5693
  const OWNER_LANE_PARTICIPANT_CONTINUITY_FIELDS = [
@@ -5842,18 +5755,6 @@ function ownerLaneParticipantContinuityCanonicalBytesV1(input) {
5842
5755
  async function computeOwnerLaneParticipantBindingDigestV1(input) {
5843
5756
  return requireParsed$2(parseLaneParticipantBindingDigestB64u(base64UrlEncode(await sha256Bytes(ownerLaneParticipantContinuityCanonicalBytesV1(input)))), "owner participant digest");
5844
5757
  }
5845
- new TextEncoder();
5846
- //#endregion
5847
- //#region ../shared-ts/src/signing-lanes/execution.ts
5848
- function buildPreparedOwnerWalletExecution(input) {
5849
- return {
5850
- kind: "prepared_owner_wallet_execution",
5851
- laneKind: input.lane.laneKind,
5852
- authorization: input.authorization,
5853
- materialActivation: input.materialActivation,
5854
- lane: input.lane
5855
- };
5856
- }
5857
5758
  //#endregion
5858
5759
  //#region ../shared-ts/src/authorization/operationFingerprint.ts
5859
5760
  const CAPABILITY_OPERATION_FINGERPRINT_DOMAIN_V1 = "seams:authorization:capability-operation-fingerprint:v1";
@@ -5906,6 +5807,30 @@ function parseSigningOperationFingerprintDigest(value) {
5906
5807
  return parseDigestB64u(value.slice(7));
5907
5808
  }
5908
5809
  //#endregion
5810
+ //#region ../shared-ts/src/utils/base58.ts
5811
+ /**
5812
+ * Encodes binary data to base58 string using Bitcoin's base58 alphabet.
5813
+ *
5814
+ * @param data - Binary data to encode (Uint8Array, ArrayBuffer, or number[])
5815
+ * @returns Base58-encoded string
5816
+ */
5817
+ const base58Encode = (data) => {
5818
+ if (data instanceof ArrayBuffer) return bs58.encode(new Uint8Array(data));
5819
+ if (Array.isArray(data)) return bs58.encode(new Uint8Array(data));
5820
+ return bs58.encode(data);
5821
+ };
5822
+ /**
5823
+ * Decodes a base58 string to binary data using Bitcoin's base58 alphabet.
5824
+ * Returns a Uint8Array containing the decoded bytes.
5825
+ *
5826
+ * @param base58String - Base58-encoded string to decode
5827
+ * @returns Uint8Array containing the decoded bytes
5828
+ * @throws Error if input contains invalid base58 characters
5829
+ */
5830
+ const base58Decode = (base58String) => {
5831
+ return bs58.decode(base58String);
5832
+ };
5833
+ //#endregion
5909
5834
  //#region src/authorization/domain.ts
5910
5835
  /**
5911
5836
  * The digest-free authorization projection published to the browser. It carries
@@ -6144,8 +6069,7 @@ function resolveWalletSessionAuthorizationV2AdministrationAdmission(input) {
6144
6069
  if (!subject || subject.authorityId !== input.authority.authorityId) return admissionRefused("capability_subject_mismatch");
6145
6070
  return {
6146
6071
  ok: true,
6147
- operationKind: "link_devices",
6148
- authorityId: input.authority.authorityId
6072
+ operationKind: "link_devices"
6149
6073
  };
6150
6074
  }
6151
6075
  default: return assertNeverWalletSessionAuthorizationV2AdministrationOperation(input.operation.kind);
@@ -6768,6 +6692,22 @@ function toFetchRouteResponse(response) {
6768
6692
  });
6769
6693
  }
6770
6694
  //#endregion
6695
+ //#region ../shared-ts/src/utils/registrationIds.ts
6696
+ function walletIdFromString(value) {
6697
+ const parsed = parseWalletId(value);
6698
+ if (!parsed.ok) throw new Error(parsed.error.message);
6699
+ return parsed.value;
6700
+ }
6701
+ function nearEd25519SigningKeyIdFromString(value) {
6702
+ const normalized = String(value || "").trim();
6703
+ if (!normalized) throw new Error("nearEd25519SigningKeyId is required");
6704
+ return normalized;
6705
+ }
6706
+ function parseNearEd25519SigningKeyId(value) {
6707
+ if (typeof value !== "string") throw new Error("nearEd25519SigningKeyId must be a string");
6708
+ return nearEd25519SigningKeyIdFromString(value);
6709
+ }
6710
+ //#endregion
6771
6711
  //#region ../shared-ts/src/passkey-custody/custodySecretBinding.ts
6772
6712
  /** The only derivation scheme owner custody supports. */
6773
6713
  const WALLET_SEED_DERIVATION_SCHEME_V1 = "wallet_seed_parallel_hkdf_sha256_v1";
@@ -7274,40 +7214,122 @@ async function computeWalletEcdsaKeyFactsInventoryChallengeDigestB64u(input) {
7274
7214
  return base64UrlEncode(await sha256BytesUtf8(canonicalizeWalletEcdsaKeyFactsInventoryChallenge(input)));
7275
7215
  }
7276
7216
  //#endregion
7277
- //#region ../shared-ts/src/utils/registrationSignerPlan.ts
7278
- function normalizePositiveInteger(raw, fallback) {
7279
- const value = typeof raw === "number" ? raw : Number(raw);
7280
- return Number.isFinite(value) && value >= 1 ? Math.floor(value) : fallback;
7281
- }
7282
- function collectPositiveParticipantIds(raw) {
7283
- if (!Array.isArray(raw)) return [];
7284
- const participantIds = [];
7285
- for (const id of raw) {
7286
- const numericId = Number(id);
7287
- if (Number.isInteger(numericId) && numericId > 0) participantIds.push(numericId);
7217
+ //#region ../shared-ts/src/utils/near.ts
7218
+ /**
7219
+ * NEAR-specific utility helpers.
7220
+ *
7221
+ * Keep chain-specific parsing and validation logic here so generic utility
7222
+ * modules (`validation`, `errors`, `encoders`, etc.) stay chain-agnostic.
7223
+ */
7224
+ /**
7225
+ * Ensure a key string has the NEAR Ed25519 prefix (`ed25519:`).
7226
+ *
7227
+ * - Accepts either `ed25519:<base58>` or a bare `<base58>` string.
7228
+ * - Canonicalizes `ED25519:` -> `ed25519:`.
7229
+ * - If a different prefix is present (e.g. `secp256k1:`), returns the input unchanged.
7230
+ */
7231
+ function ensureEd25519Prefix(value) {
7232
+ const raw = String(value ?? "").trim();
7233
+ if (!raw) return "";
7234
+ if (/^[a-z0-9_]+:/i.test(raw)) {
7235
+ if (/^ed25519:/i.test(raw)) return `ed25519:${raw.replace(/^ed25519:/i, "")}`;
7236
+ return raw;
7288
7237
  }
7289
- return participantIds;
7238
+ return `ed25519:${raw}`;
7290
7239
  }
7291
- function normalizeUnknownArray(raw) {
7292
- return Array.isArray(raw) ? raw : [];
7240
+ /**
7241
+ * Lightweight NEAR account ID validation used by server-side helpers.
7242
+ * - length: 2..64
7243
+ * - chars: lowercase letters, digits, `_`, `.`, `-`
7244
+ */
7245
+ function isValidAccountId(accountId) {
7246
+ if (typeof accountId !== "string") return false;
7247
+ if (!accountId || accountId.length < 2 || accountId.length > 64) return false;
7248
+ return /^[a-z0-9_.-]+$/.test(accountId);
7293
7249
  }
7294
- function normalizeRegistrationNearAccountProvisioning(raw) {
7295
- const record = inspectRawObject(raw);
7296
- if (!record || !("kind" in record)) return null;
7297
- switch (trimString(record.kind)) {
7298
- case "implicit_account":
7299
- if (Object.prototype.hasOwnProperty.call(record, "requestedAccountId") || Object.prototype.hasOwnProperty.call(record, "sponsor")) return null;
7300
- return {
7301
- kind: "implicit_account",
7302
- accountIdSource: "ed25519_public_key"
7303
- };
7304
- case "sponsored_named_account": {
7305
- if (Object.prototype.hasOwnProperty.call(record, "accountIdSource") || !("requestedAccountId" in record)) return null;
7306
- const parsed = parseNamedNearAccountId(record.requestedAccountId);
7307
- if (!parsed.ok) return null;
7308
- return {
7309
- kind: "sponsored_named_account",
7310
- requestedAccountId: parsed.value,
7250
+ function isImplicitNearAccountId(value) {
7251
+ return typeof value === "string" && /^[0-9a-f]{64}$/.test(value);
7252
+ }
7253
+ function parseImplicitNearAccountId(raw) {
7254
+ const value = typeof raw === "string" ? raw.trim() : "";
7255
+ if (!value) return {
7256
+ ok: false,
7257
+ code: "missing",
7258
+ message: "implicit NEAR account ID is required"
7259
+ };
7260
+ if (!isImplicitNearAccountId(value)) return {
7261
+ ok: false,
7262
+ code: "invalid",
7263
+ message: "implicit NEAR account ID must be 64 lowercase hex characters"
7264
+ };
7265
+ return {
7266
+ ok: true,
7267
+ value
7268
+ };
7269
+ }
7270
+ function parseNamedNearAccountId(raw) {
7271
+ const value = typeof raw === "string" ? raw.trim() : "";
7272
+ if (!value) return {
7273
+ ok: false,
7274
+ code: "missing",
7275
+ message: "named NEAR account ID is required"
7276
+ };
7277
+ if (isImplicitNearAccountId(value) || !isValidAccountId(value) || !value.includes(".")) return {
7278
+ ok: false,
7279
+ code: "invalid",
7280
+ message: "named NEAR account ID must be a valid named account containing a dot"
7281
+ };
7282
+ return {
7283
+ ok: true,
7284
+ value
7285
+ };
7286
+ }
7287
+ function bytesToLowerHex(bytes) {
7288
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
7289
+ }
7290
+ function deriveImplicitNearAccountIdFromEd25519PublicKey(publicKey) {
7291
+ const normalized = ensureEd25519Prefix(publicKey);
7292
+ const encoded = normalized.startsWith("ed25519:") ? normalized.slice(8) : "";
7293
+ if (!encoded) throw new Error("Ed25519 public key is required");
7294
+ const decoded = base58Decode(encoded);
7295
+ if (decoded.length !== 32) throw new Error("Ed25519 public key must decode to 32 bytes");
7296
+ return bytesToLowerHex(decoded);
7297
+ }
7298
+ //#endregion
7299
+ //#region ../shared-ts/src/utils/registrationSignerPlan.ts
7300
+ function normalizePositiveInteger(raw, fallback) {
7301
+ const value = typeof raw === "number" ? raw : Number(raw);
7302
+ return Number.isFinite(value) && value >= 1 ? Math.floor(value) : fallback;
7303
+ }
7304
+ function collectPositiveParticipantIds(raw) {
7305
+ if (!Array.isArray(raw)) return [];
7306
+ const participantIds = [];
7307
+ for (const id of raw) {
7308
+ const numericId = Number(id);
7309
+ if (Number.isInteger(numericId) && numericId > 0) participantIds.push(numericId);
7310
+ }
7311
+ return participantIds;
7312
+ }
7313
+ function normalizeUnknownArray(raw) {
7314
+ return Array.isArray(raw) ? raw : [];
7315
+ }
7316
+ function normalizeRegistrationNearAccountProvisioning(raw) {
7317
+ const record = inspectRawObject(raw);
7318
+ if (!record || !("kind" in record)) return null;
7319
+ switch (trimString(record.kind)) {
7320
+ case "implicit_account":
7321
+ if (Object.prototype.hasOwnProperty.call(record, "requestedAccountId") || Object.prototype.hasOwnProperty.call(record, "sponsor")) return null;
7322
+ return {
7323
+ kind: "implicit_account",
7324
+ accountIdSource: "ed25519_public_key"
7325
+ };
7326
+ case "sponsored_named_account": {
7327
+ if (Object.prototype.hasOwnProperty.call(record, "accountIdSource") || !("requestedAccountId" in record)) return null;
7328
+ const parsed = parseNamedNearAccountId(record.requestedAccountId);
7329
+ if (!parsed.ok) return null;
7330
+ return {
7331
+ kind: "sponsored_named_account",
7332
+ requestedAccountId: parsed.value,
7311
7333
  sponsor: "relayer"
7312
7334
  };
7313
7335
  }
@@ -7941,6 +7963,12 @@ function parseWalletRegistrationSetupWallet(raw) {
7941
7963
  };
7942
7964
  }
7943
7965
  function parseWalletRegistrationSetupRequest(body) {
7966
+ const registrationOperationId = parseRegistrationSetupOperationId(body.registrationOperationId);
7967
+ if (!registrationOperationId) return {
7968
+ ok: false,
7969
+ code: "invalid_body",
7970
+ message: "registrationOperationId is required"
7971
+ };
7944
7972
  const signerSelection = parseRegistrationSignerSet(body.signerSelection);
7945
7973
  if (!signerSelection.ok) return signerSelection;
7946
7974
  const authMethod = normalizeRegistrationAuthMethodInput(body.authMethod);
@@ -7954,6 +7982,7 @@ function parseWalletRegistrationSetupRequest(body) {
7954
7982
  return {
7955
7983
  ok: true,
7956
7984
  value: {
7985
+ registrationOperationId,
7957
7986
  ...wallet.value ? { wallet: wallet.value } : {},
7958
7987
  signerSelection: signerSelection.value.selection,
7959
7988
  authMethod
@@ -9171,14 +9200,6 @@ async function handleRouterApiWalletAddSignerIntent(input) {
9171
9200
  });
9172
9201
  return routeJson(result.ok ? 200 : 400, result);
9173
9202
  }
9174
- /**
9175
- * `POST /wallets/register/setup` — the single admitted entry point that
9176
- * replaces the bootstrap grant, the intent, and start.
9177
- *
9178
- * Authentication is the same API-credential plane the intent route used, so
9179
- * origin and environment binding are unchanged; what is gone is the stored
9180
- * grant that used to sit between the check and its only reader.
9181
- */
9182
9203
  async function handleRouterApiWalletRegistrationSetup(input) {
9183
9204
  if (!isPlainObject(input.body)) return routeError(400, "invalid_body", "JSON body required");
9184
9205
  const origin = normalizeCorsOrigin(input.origin);
@@ -9221,7 +9242,7 @@ async function handleRouterApiWalletRegistrationSetup(input) {
9221
9242
  if (!session) return routeError(500, "internal", "wallet registration setup requires session signing");
9222
9243
  const request = parseWalletRegistrationSetupRequest(input.body);
9223
9244
  if (!request.ok) return routeError(400, request.code, request.message);
9224
- const result = await input.services.walletRegistration.setupWalletRegistration({
9245
+ return input.services.walletRegistration.setupWalletRegistration({
9225
9246
  request: request.value,
9226
9247
  orgId: principal.orgId,
9227
9248
  expectedOrigin: origin,
@@ -9232,7 +9253,6 @@ async function handleRouterApiWalletRegistrationSetup(input) {
9232
9253
  signingRootVersion: runtimePolicyScope.signingRootVersion
9233
9254
  } : {}
9234
9255
  });
9235
- return routeJson(result.ok ? 200 : 400, result);
9236
9256
  }
9237
9257
  /**
9238
9258
  * `POST /wallets/register/respond` — the authenticated leg.
@@ -10233,7 +10253,6 @@ const ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES = [
10233
10253
  "session"
10234
10254
  ];
10235
10255
  const ROUTER_API_WEBAUTHN_AUTHENTICATOR_SERVICES = ["webAuthn", "session"];
10236
- const ROUTER_API_NEAR_PUBLIC_KEY_SERVICES = ["nearFunding", "session"];
10237
10256
  const ROUTER_API_PASSKEY_CUSTODY_SERVICES = [
10238
10257
  "passkeyCustody",
10239
10258
  "walletAuthMethods",
@@ -10600,7 +10619,7 @@ function createRouterApiRouteDefinitions(options = {}) {
10600
10619
  }, ROUTER_API_ED25519_WALLET_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ed25519_sign_prepare", "POST", ROUTER_AB_ED25519_NORMAL_SIGNING_PREPARE_PATH, "Prepare Router A/B Ed25519 normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ed25519_sign_finalize", "POST", ROUTER_AB_ED25519_NORMAL_SIGNING_PATH, "Finalize Router A/B Ed25519 normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), publicRoute("router_ab_ecdsa_derivation_healthz", "GET", ROUTER_AB_ECDSA_DERIVATION_HEALTH_PATH, "Router A/B ECDSA derivation health probe", {
10601
10620
  plane: "public",
10602
10621
  rationale: "Router A/B health probes are intentionally public diagnostics."
10603
- }, ROUTER_API_THRESHOLD_RUNTIME_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_export", "POST", ROUTER_AB_ECDSA_DERIVATION_EXPORT_PATH, "Export authorized Router A/B ECDSA derivation material", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_refresh", "POST", ROUTER_AB_ECDSA_DERIVATION_REFRESH_PATH, "Refresh Router A/B ECDSA derivation activation", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_session_activate", "POST", ROUTER_AB_ECDSA_DERIVATION_SESSION_ACTIVATION_PATH, "Activate Router A/B ECDSA normal-signing session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_prepare", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PREPARE_PATH, "Prepare Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_finalize", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PATH, "Finalize Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_init", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_INIT_PATH, "Begin Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_step", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_STEP_PATH, "Continue Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("webauthn_authenticators", "GET", "/webauthn/authenticators", "List registered WebAuthn authenticators", ROUTER_API_WEBAUTHN_AUTHENTICATOR_SERVICES), sessionPrincipalRoute("near_public_keys", "GET", "/near/public-keys", "List NEAR public keys for current session", ROUTER_API_NEAR_PUBLIC_KEY_SERVICES), publicRoute("wallet_unlock_challenge", "POST", "/wallet/unlock/challenge", "Create wallet unlock challenge", {
10622
+ }, ROUTER_API_THRESHOLD_RUNTIME_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_export", "POST", ROUTER_AB_ECDSA_DERIVATION_EXPORT_PATH, "Export authorized Router A/B ECDSA derivation material", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_refresh", "POST", ROUTER_AB_ECDSA_DERIVATION_REFRESH_PATH, "Refresh Router A/B ECDSA derivation activation", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_session_activate", "POST", ROUTER_AB_ECDSA_DERIVATION_SESSION_ACTIVATION_PATH, "Activate Router A/B ECDSA normal-signing session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_prepare", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PREPARE_PATH, "Prepare Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_finalize", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PATH, "Finalize Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_init", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_INIT_PATH, "Begin Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_step", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_STEP_PATH, "Continue Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("webauthn_authenticators", "GET", "/webauthn/authenticators", "List registered WebAuthn authenticators", ROUTER_API_WEBAUTHN_AUTHENTICATOR_SERVICES), publicRoute("wallet_unlock_challenge", "POST", "/wallet/unlock/challenge", "Create wallet unlock challenge", {
10604
10623
  plane: "public",
10605
10624
  proof: "challenge_exchange",
10606
10625
  rationale: "Wallet unlock challenge issuance is intentionally public."
@@ -10680,6 +10699,7 @@ function resolveWalletRegistrationRoute(ctx) {
10680
10699
  async function handleWalletRegistration(ctx) {
10681
10700
  const route = resolveWalletRegistrationRoute(ctx);
10682
10701
  if (!route) return null;
10702
+ if (ctx.request.headers.get("X-Seams-Wallet-Protocol") !== "2") return jsonFailure(409, "wallet_protocol_mismatch", "Your wallet application needs an update. Reload this page and try again. If the problem continues, ask the application developer to upgrade the Wallet SDK.");
10683
10703
  const common = {
10684
10704
  body: await readJson(ctx.request),
10685
10705
  headers: Object.fromEntries(ctx.request.headers.entries()),
@@ -11748,6 +11768,7 @@ async function handleWalletRecoveryPrepare(ctx) {
11748
11768
  case "refused": return toFetchRouteResponse(refusedSpend());
11749
11769
  case "reserved":
11750
11770
  case "consumed": return routeErrorResponse(401, "recovery_code_used", "that recovery code has already been used");
11771
+ case "routing_unavailable": return routeErrorResponse(503, "wallet_home_unavailable", "Wallet recovery routing is temporarily unavailable");
11751
11772
  case "manifest_unavailable":
11752
11773
  case "registration_unavailable": return routeErrorResponse(409, "recovery_preparation_conflict", "wallet recovery could not be prepared");
11753
11774
  }
@@ -12949,6 +12970,20 @@ async function handleWalletUnlockChallengeRoute(input) {
12949
12970
  orgId: body.orgId,
12950
12971
  ttlMs: body.ttlMs
12951
12972
  });
12973
+ if (!result.ok && result.code === "wallet_home_unavailable") return {
12974
+ status: 503,
12975
+ body: {
12976
+ ...result,
12977
+ unlockBackend
12978
+ }
12979
+ };
12980
+ if (!result.ok && result.code === "wallet_home_conflict") return {
12981
+ status: 409,
12982
+ body: {
12983
+ ...result,
12984
+ unlockBackend
12985
+ }
12986
+ };
12952
12987
  return {
12953
12988
  status: result.ok ? 200 : result.code === "internal" ? 500 : 400,
12954
12989
  body: {
@@ -14382,7 +14417,7 @@ async function buildRouterAbEd25519PrivateSigningWorkerBody(input) {
14382
14417
  const scope = parseRouterAbEd25519NormalSigningScopeV2(input.body.scope);
14383
14418
  const signingContext = privateSigningAuthorizationContext(scope, input.authorization);
14384
14419
  const trustedSourceDigest = await privateSigningTrustedSourceDigest(input.headers);
14385
- const materialSource = input.materialSource ?? registrationMaterialSourceV1({
14420
+ const materialSource = registrationMaterialSourceV1({
14386
14421
  accountId: scope.account_id,
14387
14422
  materialActivationId: scope.material_activation.activation_id,
14388
14423
  signingWorkerId: scope.signing_worker_id
@@ -15296,6 +15331,164 @@ function parseRouterAbEcdsaDerivationPoolFillStepRouteRequest(raw) {
15296
15331
  };
15297
15332
  }
15298
15333
  //#endregion
15334
+ //#region src/router/transport/fetch/routes/ecdsaOperationStepUpFactor.ts
15335
+ async function verifyEcdsaOperationStepUpFactor(input) {
15336
+ const proof = input.proof;
15337
+ switch (proof.kind) {
15338
+ case "passkey": {
15339
+ if (input.authSource.kind !== "passkey" || proof.authority.factor.credentialIdB64u !== input.authSource.credentialIdB64u) return {
15340
+ ok: false,
15341
+ response: json$1({
15342
+ ok: false,
15343
+ code: "scope_mismatch",
15344
+ message: "Passkey authority changed"
15345
+ }, { status: 403 })
15346
+ };
15347
+ const credential = proof.webauthn_authentication;
15348
+ if (String(credential.rawId || credential.id).trim() !== input.authSource.credentialIdB64u) return {
15349
+ ok: false,
15350
+ response: json$1({
15351
+ ok: false,
15352
+ code: "unauthorized",
15353
+ message: "Passkey credential changed"
15354
+ }, { status: 401 })
15355
+ };
15356
+ const verified = await input.webAuthn.verifyWebAuthnAuthenticationLite({
15357
+ userId: input.walletId,
15358
+ rpId: proof.authority.verifier.rpId,
15359
+ expectedChallenge: input.expectedChallenge,
15360
+ expected_origin: input.requestOrigin,
15361
+ webauthn_authentication: credential
15362
+ });
15363
+ if (!verified.success || !verified.verified) return {
15364
+ ok: false,
15365
+ response: json$1({
15366
+ ok: false,
15367
+ code: verified.code || "not_verified",
15368
+ message: verified.message || "WebAuthn authentication verification failed"
15369
+ }, { status: 401 })
15370
+ };
15371
+ const assertionDigest = parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify(credential))));
15372
+ const verifiedAtMs = Date.now();
15373
+ if (input.expiresAtMs <= verifiedAtMs) return expiredStepUpFactor();
15374
+ const factorId = parseAuthFactorId(`passkey:${input.authSource.credentialIdB64u}`);
15375
+ if (!factorId.ok) throw new Error(factorId.error.message);
15376
+ return {
15377
+ ok: true,
15378
+ factor: buildVerifiedWalletOperationPasskeyFactorResult({
15379
+ tenantId: input.operation.tenantId,
15380
+ principalId: input.operation.principalId,
15381
+ walletId: input.walletId,
15382
+ requestOrigin: input.requestOrigin,
15383
+ audience: input.requestOrigin,
15384
+ factorId: factorId.value,
15385
+ authorityRef: input.authorityRef,
15386
+ operation: input.operation,
15387
+ credentialIdB64u: proof.authority.factor.credentialIdB64u,
15388
+ assertionDigest,
15389
+ verifiedAtMs,
15390
+ expiresAtMs: input.expiresAtMs
15391
+ }),
15392
+ unseal: { kind: "not_requested" }
15393
+ };
15394
+ }
15395
+ case "email_otp": {
15396
+ const isExport = input.operation.operation.operationKind === "evm.export_key";
15397
+ const emailOtpOperation = isExport ? WALLET_EMAIL_OTP_EXPORT_OPERATION : WALLET_EMAIL_OTP_TRANSACTION_SIGN_OPERATION;
15398
+ const operationBinding = await hashEmailOtpOperationBinding({
15399
+ walletId: input.walletId,
15400
+ providerUserId: proof.authority.factor.providerUserId,
15401
+ orgId: input.operation.tenantId,
15402
+ operation: emailOtpOperation,
15403
+ requestOrigin: input.requestOrigin,
15404
+ audience: input.requestOrigin,
15405
+ authorityRef: input.authorityRef,
15406
+ ...isExport ? {} : { operationFingerprintDigest: input.operation.digests.laneDigest }
15407
+ });
15408
+ const verified = await input.emailOtp.verifyEmailOtpChallenge({
15409
+ userId: proof.authority.factor.providerUserId,
15410
+ walletId: input.walletId,
15411
+ orgId: input.operation.tenantId,
15412
+ challengeId: proof.challenge_id,
15413
+ otpCode: proof.otp_code,
15414
+ otpChannel: EMAIL_OTP_CHANNEL,
15415
+ ownerProofBindingDigest: operationBinding,
15416
+ operation: emailOtpOperation
15417
+ });
15418
+ if (!verified.ok) return {
15419
+ ok: false,
15420
+ response: json$1(verified, { status: verified.code === "invalid_body" ? 400 : 401 })
15421
+ };
15422
+ let verifiedChallengeId = verified.challengeId;
15423
+ if (!isExport) {
15424
+ const orgId = parseOrgId(input.operation.tenantId);
15425
+ const providerSubject = parseProviderSubject(proof.authority.factor.providerUserId);
15426
+ if (!orgId.ok) throw new Error(orgId.error.message);
15427
+ if (!providerSubject.ok) throw new Error(providerSubject.error.message);
15428
+ const consumed = await input.emailOtp.consumeEmailOtpGrant({
15429
+ subject: {
15430
+ kind: "provider_identity",
15431
+ orgId: orgId.value,
15432
+ providerSubject: providerSubject.value,
15433
+ walletId: input.walletId
15434
+ },
15435
+ loginGrant: verified.loginGrant,
15436
+ otpChannel: EMAIL_OTP_CHANNEL
15437
+ });
15438
+ if (!consumed.ok) return {
15439
+ ok: false,
15440
+ response: json$1(consumed, { status: consumed.code === "invalid_body" ? 400 : 401 })
15441
+ };
15442
+ verifiedChallengeId = consumed.challengeId;
15443
+ }
15444
+ const verificationReceiptDigest = parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify({
15445
+ challengeId: verifiedChallengeId,
15446
+ operationFingerprint: input.expectedChallenge
15447
+ }))));
15448
+ const verifiedAtMs = Date.now();
15449
+ const expiresAtMs = Math.min(input.expiresAtMs, verified.grantExpiresAtMs);
15450
+ if (expiresAtMs <= verifiedAtMs) return expiredStepUpFactor();
15451
+ const factorId = parseAuthFactorId(`email_otp:${proof.authority.factor.provider}:${proof.authority.factor.providerUserId}`);
15452
+ const challengeId = parseEmailOtpChallengeId(verifiedChallengeId);
15453
+ if (!factorId.ok) throw new Error(factorId.error.message);
15454
+ if (!challengeId.ok) throw new Error(challengeId.error.message);
15455
+ return {
15456
+ ok: true,
15457
+ factor: buildVerifiedWalletOperationEmailOtpFactorResult({
15458
+ tenantId: input.operation.tenantId,
15459
+ principalId: input.operation.principalId,
15460
+ walletId: input.walletId,
15461
+ requestOrigin: input.requestOrigin,
15462
+ audience: input.requestOrigin,
15463
+ factorId: factorId.value,
15464
+ authorityRef: input.authorityRef,
15465
+ operation: input.operation,
15466
+ challengeId: challengeId.value,
15467
+ verificationReceiptDigest,
15468
+ verifiedAtMs,
15469
+ expiresAtMs
15470
+ }),
15471
+ unseal: isExport ? {
15472
+ kind: "email_otp_grant",
15473
+ grant: verified.loginGrant,
15474
+ challenge_id: verified.challengeId
15475
+ } : { kind: "not_requested" }
15476
+ };
15477
+ }
15478
+ default: throw new Error("Unsupported ECDSA operation step-up proof");
15479
+ }
15480
+ }
15481
+ function expiredStepUpFactor() {
15482
+ return {
15483
+ ok: false,
15484
+ response: json$1({
15485
+ ok: false,
15486
+ code: "verified_step_up_rejected",
15487
+ message: "Operation step-up authorization expired"
15488
+ }, { status: 403 })
15489
+ };
15490
+ }
15491
+ //#endregion
15299
15492
  //#region ../shared-ts/src/signing-lanes/recordParsers.ts
15300
15493
  const WALLET_KEY_COMMON_FIELDS = [
15301
15494
  "kind",
@@ -16057,7 +16250,6 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
16057
16250
  }, { status: 400 });
16058
16251
  }
16059
16252
  const expectedChallenge = await computeRouterAbEcdsaOperationStepUpChallengeB64u(operation);
16060
- const nowMs = Date.now();
16061
16253
  const requestId = operation.operation_id;
16062
16254
  let freshMaterial;
16063
16255
  if (v2Resolution.kind === "admitted") {
@@ -16098,112 +16290,24 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
16098
16290
  const evidenceSetId = requireAuthorizationValue$1(parseAuthorizationEvidenceSetId(`ecdsa-step-up-evidence-set:${requestId}`));
16099
16291
  const expiresAtMs = operation.expires_at_ms;
16100
16292
  const requestOrigin = authenticated.requestOrigin;
16101
- let emailOtpUnseal;
16102
- let factor;
16103
- switch (proof.kind) {
16104
- case "passkey": {
16105
- if (authenticated.session.laneAuthorization.authSource.kind !== "passkey" || proof.authority.factor.credentialIdB64u !== authenticated.session.laneAuthorization.authSource.credentialIdB64u) return json$1({
16106
- ok: false,
16107
- code: "scope_mismatch",
16108
- message: "Passkey authority changed"
16109
- }, { status: 403 });
16110
- const credential = proof.webauthn_authentication;
16111
- if (String(credential.rawId || credential.id).trim() !== authenticated.session.laneAuthorization.authSource.credentialIdB64u) return json$1({
16112
- ok: false,
16113
- code: "unauthorized",
16114
- message: "Passkey credential changed"
16115
- }, { status: 401 });
16116
- const verified = await input.ctx.service.webAuthn.verifyWebAuthnAuthenticationLite({
16117
- userId: authenticated.session.walletId,
16118
- rpId: proof.authority.verifier.rpId,
16119
- expectedChallenge,
16120
- expected_origin: requestOrigin,
16121
- webauthn_authentication: credential
16122
- });
16123
- if (!verified.success || !verified.verified) return json$1({
16124
- ok: false,
16125
- code: verified.code || "not_verified",
16126
- message: verified.message || "WebAuthn authentication verification failed"
16127
- }, { status: 401 });
16128
- factor = buildVerifiedWalletOperationPasskeyFactorResult({
16129
- tenantId: authenticated.session.tenantId,
16130
- principalId: authenticated.session.principalId,
16131
- walletId: walletIdFromString(authenticated.session.walletId),
16132
- requestOrigin,
16133
- audience: requestOrigin,
16134
- factorId: requireAuthorizationValue$1(parseAuthFactorId(`passkey:${authenticated.session.laneAuthorization.authSource.credentialIdB64u}`)),
16135
- authorityRef: authenticated.authorityRef,
16136
- operation: envelope,
16137
- credentialIdB64u: proof.authority.factor.credentialIdB64u,
16138
- assertionDigest: parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify(credential)))),
16139
- verifiedAtMs: nowMs,
16140
- expiresAtMs
16141
- });
16142
- break;
16143
- }
16144
- case "email_otp": {
16145
- const operationBinding = await hashEmailOtpOperationBinding({
16146
- walletId: authenticated.session.walletId,
16147
- providerUserId: proof.authority.factor.providerUserId,
16148
- orgId: authenticated.session.tenantId,
16149
- operation: operation.operation_kind === "evm.export_key" ? WALLET_EMAIL_OTP_EXPORT_OPERATION : WALLET_EMAIL_OTP_TRANSACTION_SIGN_OPERATION,
16150
- requestOrigin,
16151
- audience: requestOrigin,
16152
- authorityRef: authenticated.authorityRef,
16153
- ...operation.operation_kind === "evm.sign_transaction" ? { operationFingerprintDigest: envelope.digests.laneDigest } : {}
16154
- });
16155
- const verified = await input.ctx.service.emailOtp.verifyEmailOtpChallenge({
16156
- userId: proof.authority.factor.providerUserId,
16157
- walletId: authenticated.session.walletId,
16158
- orgId: authenticated.session.tenantId,
16159
- challengeId: proof.challenge_id,
16160
- otpCode: proof.otp_code,
16161
- otpChannel: EMAIL_OTP_CHANNEL,
16162
- ownerProofBindingDigest: operationBinding,
16163
- operation: operation.operation_kind === "evm.export_key" ? WALLET_EMAIL_OTP_EXPORT_OPERATION : WALLET_EMAIL_OTP_TRANSACTION_SIGN_OPERATION
16164
- });
16165
- if (!verified.ok) return json$1(verified, { status: verified.code === "invalid_body" ? 400 : 401 });
16166
- const consumed = operation.operation_kind === "evm.export_key" ? null : await input.ctx.service.emailOtp.consumeEmailOtpGrant({
16167
- subject: {
16168
- kind: "provider_identity",
16169
- orgId: requireAuthorizationValue$1(parseOrgId(authenticated.session.tenantId)),
16170
- providerSubject: requireAuthorizationValue$1(parseProviderSubject(proof.authority.factor.providerUserId)),
16171
- walletId: walletIdFromString(authenticated.session.walletId)
16172
- },
16173
- loginGrant: verified.loginGrant,
16174
- otpChannel: EMAIL_OTP_CHANNEL
16175
- });
16176
- if (consumed && !consumed.ok) return json$1(consumed, { status: consumed.code === "invalid_body" ? 400 : 401 });
16177
- if (operation.operation_kind === "evm.export_key") emailOtpUnseal = {
16178
- grant: verified.loginGrant,
16179
- challengeId: verified.challengeId
16180
- };
16181
- const verifiedChallengeId = consumed?.ok ? consumed.challengeId : verified.challengeId;
16182
- factor = buildVerifiedWalletOperationEmailOtpFactorResult({
16183
- tenantId: authenticated.session.tenantId,
16184
- principalId: authenticated.session.principalId,
16185
- walletId: walletIdFromString(authenticated.session.walletId),
16186
- requestOrigin,
16187
- audience: requestOrigin,
16188
- factorId: requireAuthorizationValue$1(parseAuthFactorId(`email_otp:${proof.authority.factor.provider}:${proof.authority.factor.providerUserId}`)),
16189
- authorityRef: authenticated.authorityRef,
16190
- operation: envelope,
16191
- challengeId: requireAuthorizationValue$1(parseEmailOtpChallengeId(verifiedChallengeId)),
16192
- verificationReceiptDigest: parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify({
16193
- challengeId: verifiedChallengeId,
16194
- operationFingerprint: expectedChallenge
16195
- })))),
16196
- verifiedAtMs: nowMs,
16197
- expiresAtMs: Math.min(expiresAtMs, verified.grantExpiresAtMs)
16198
- });
16199
- break;
16200
- }
16201
- }
16293
+ const verifiedFactor = await verifyEcdsaOperationStepUpFactor({
16294
+ proof,
16295
+ operation: envelope,
16296
+ walletId: walletIdFromString(authenticated.session.walletId),
16297
+ authorityRef: authenticated.authorityRef,
16298
+ authSource: authenticated.session.laneAuthorization.authSource,
16299
+ requestOrigin,
16300
+ expectedChallenge,
16301
+ expiresAtMs,
16302
+ webAuthn: input.ctx.service.webAuthn,
16303
+ emailOtp: input.ctx.service.emailOtp
16304
+ });
16305
+ if (!verifiedFactor.ok) return verifiedFactor.response;
16202
16306
  const evidenceSet = await input.ctx.service.authorizedOperations.recordVerifiedWalletOperationFactorEvidenceSet({
16203
16307
  operation: envelope,
16204
16308
  evidenceId,
16205
16309
  evidenceSetId,
16206
- factor
16310
+ factor: verifiedFactor.factor
16207
16311
  });
16208
16312
  const authorizedOperationId = requireAuthorizationValue$1(parseAuthorizedOperationId(`ecdsa-step-up-authorized-operation:${operation.operation_id}`));
16209
16313
  const atomicOperation = await input.ctx.service.authorizedOperations.admitAuthorizedOperation({
@@ -16217,7 +16321,7 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
16217
16321
  evidenceSetDigest: evidenceSet.evidenceSetDigest
16218
16322
  },
16219
16323
  quota: { kind: "quota_neutral" },
16220
- claimedAtMs: nowMs
16324
+ claimedAtMs: Date.now()
16221
16325
  },
16222
16326
  material: {
16223
16327
  walletId: walletIdFromString(authenticated.session.walletId),
@@ -16250,11 +16354,7 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
16250
16354
  const responseAuthorization = {
16251
16355
  kind: "operation_step_up",
16252
16356
  evidence_set_digest: evidenceSet.evidenceSetDigest,
16253
- unseal: emailOtpUnseal ? {
16254
- kind: "email_otp_grant",
16255
- grant: emailOtpUnseal.grant,
16256
- challenge_id: emailOtpUnseal.challengeId
16257
- } : { kind: "not_requested" }
16357
+ unseal: verifiedFactor.unseal
16258
16358
  };
16259
16359
  if (operation.operation_kind === "evm.export_key") {
16260
16360
  const exportTopology = v2Resolution.kind === "admitted" && v2Resolution.operationKind === "evm.export_key" ? v2Resolution.exportTopology : await resolveStrictEcdsaExportTopology({
@@ -18829,7 +18929,12 @@ function bootstrapError(code, message, status) {
18829
18929
  //#region src/router/transport/fetch/routes/syncAccount.ts
18830
18930
  function syncAccountResponseStatus(result) {
18831
18931
  if (result.ok && result.verified) return 200;
18832
- switch (result.code) {
18932
+ return syncAccountFailureStatus(result.code);
18933
+ }
18934
+ function syncAccountFailureStatus(code) {
18935
+ switch (code) {
18936
+ case "wallet_home_unavailable": return 503;
18937
+ case "wallet_home_conflict": return 409;
18833
18938
  case "internal": return 500;
18834
18939
  case "ed25519_not_provisioned": return 409;
18835
18940
  default: return 400;
@@ -18859,7 +18964,7 @@ async function handleSyncAccount(ctx) {
18859
18964
  const parsed = parseSyncAccountOptionsRequest(await readJson(ctx.request));
18860
18965
  if (!parsed.ok) return json$1(parsed.body, { status: parsed.status });
18861
18966
  const result = await ctx.service.webAuthn.createWebAuthnSyncAccountOptions(parsed.request);
18862
- return json$1(result, { status: result.ok ? 200 : result.code === "internal" ? 500 : 400 });
18967
+ return json$1(result, { status: result.ok ? 200 : syncAccountFailureStatus(result.code) });
18863
18968
  }
18864
18969
  if (ctx.pathname === "/sync-account/verify") {
18865
18970
  const parsed = parseSyncAccountVerifyRequest({
@@ -21652,23 +21757,15 @@ function parseOptionalPositiveInteger(raw, fieldName) {
21652
21757
  value: Math.floor(value)
21653
21758
  };
21654
21759
  }
21655
- function parseAuthProviderAction(input) {
21656
- const provider = normalizeOptionalTrimmedString(input.provider);
21657
- const action = normalizeOptionalTrimmedString(input.action);
21658
- if (provider === "passkey" && action === "options") return { kind: "passkey_options" };
21659
- if (provider === "passkey" && action === "verify") return { kind: "passkey_verify" };
21660
- if (provider === "google" && action === "options") return { kind: "google_options" };
21661
- if (provider === "google" && action === "verify") return { kind: "google_verify" };
21662
- if (provider === "github" && action === "options") return { kind: "github_options" };
21663
- return null;
21664
- }
21665
21760
  function parseAuthProviderActionPath(pathname) {
21666
- const parts = String(pathname || "").split("/").filter(Boolean);
21667
- if (parts.length !== 3 || parts[0] !== "auth") return null;
21668
- return parseAuthProviderAction({
21669
- provider: parts[1],
21670
- action: parts[2]
21671
- });
21761
+ switch (pathname) {
21762
+ case "/auth/passkey/options": return { kind: "passkey_options" };
21763
+ case "/auth/passkey/verify": return { kind: "passkey_verify" };
21764
+ case "/auth/google/options": return { kind: "google_options" };
21765
+ case "/auth/google/verify": return { kind: "google_verify" };
21766
+ case "/auth/github/options": return { kind: "github_options" };
21767
+ default: return null;
21768
+ }
21672
21769
  }
21673
21770
  function parsePasskeyLoginOptionsRequest(raw) {
21674
21771
  const body = requireJsonObject(raw);
@@ -21963,6 +22060,8 @@ async function handleAuth(ctx) {
21963
22060
  const parsed = parsePasskeyLoginOptionsRequest(await readJson(ctx.request));
21964
22061
  if (!parsed.ok) return json$1(parsed.body, { status: parsed.status });
21965
22062
  const result = await ctx.service.webAuthn.createWebAuthnLoginOptions(parsed.request);
22063
+ if (result.code === "wallet_home_unavailable") return json$1(result, { status: 503 });
22064
+ if (result.code === "wallet_home_conflict") return json$1(result, { status: 409 });
21966
22065
  return json$1(result, { status: result.ok ? 200 : result.code === "internal" ? 500 : 400 });
21967
22066
  }
21968
22067
  case "passkey_verify": {
@@ -22015,28 +22114,6 @@ async function handleAuth(ctx) {
22015
22114
  }
22016
22115
  }
22017
22116
  //#endregion
22018
- //#region src/router/transport/fetch/routes/nearPublicKeys.ts
22019
- async function handleNearPublicKeys(ctx) {
22020
- if (ctx.method !== "GET") return null;
22021
- if (ctx.pathname !== "/near/public-keys") return null;
22022
- try {
22023
- const token = extractBearerCredential(ctx.request.headers);
22024
- if (!token) return jsonFailure(401, "unauthorized", "No valid Wallet Session");
22025
- const nowMs = Date.now();
22026
- const exact = await ctx.service.authorizationSessions.readWalletSessionAuthorizationV2ByOperationCredential({
22027
- tenantId: ctx.service.authorizationSessions.tenantId,
22028
- token,
22029
- nowMs
22030
- });
22031
- if (!exact) return jsonFailure(401, "unauthorized", "No valid Wallet Session");
22032
- const result = await ctx.service.nearFunding.listNearPublicKeysForUser({ userId: String(exact.authorization.session.walletId) });
22033
- if (!result.ok) return json$1(result, { status: result.code === "not_supported" ? 501 : result.code === "invalid_args" ? 400 : 500 });
22034
- return json$1(result, { status: 200 });
22035
- } catch (e) {
22036
- return jsonFailure(500, "internal", e?.message || "Internal error");
22037
- }
22038
- }
22039
- //#endregion
22040
22117
  //#region src/router/framework/ror/normalize.ts
22041
22118
  function sanitizeRorOrigins(origins) {
22042
22119
  const list = Array.isArray(origins) ? origins : [];
@@ -22151,6 +22228,137 @@ async function handleWellKnown(ctx) {
22151
22228
  });
22152
22229
  }
22153
22230
  //#endregion
22231
+ //#region src/router/transport/fetch/routes/deviceLinkingResponses.ts
22232
+ function projectLinkSessionStateV1(state) {
22233
+ switch (state.state) {
22234
+ case "displaying_qr": return { state: "displaying_qr" };
22235
+ case "claimed":
22236
+ case "awaiting_target_factor":
22237
+ case "awaiting_source_contribution":
22238
+ case "provisioning": return {
22239
+ state: state.state,
22240
+ deviceId: state.deviceId
22241
+ };
22242
+ case "authority_pending_local_install": return {
22243
+ state: "authority_pending_local_install",
22244
+ deviceId: state.deviceId,
22245
+ authorityId: state.authorityId,
22246
+ packageSetDigestB64u: state.packageSetDigestB64u
22247
+ };
22248
+ case "active": return {
22249
+ state: "active",
22250
+ deviceId: state.deviceId,
22251
+ authorityId: state.authorityId,
22252
+ activatedAtMs: state.activatedAtMs
22253
+ };
22254
+ case "failed_before_commit": return {
22255
+ state: "failed_before_commit",
22256
+ error: state.error
22257
+ };
22258
+ case "cancelled": return {
22259
+ state: "cancelled",
22260
+ cancelledAtMs: state.cancelledAtMs
22261
+ };
22262
+ case "expired": return {
22263
+ state: "expired",
22264
+ expiredAtMs: state.expiredAtMs
22265
+ };
22266
+ default: return assertNeverLinkSessionStateV1(state);
22267
+ }
22268
+ }
22269
+ function projectSession(record) {
22270
+ return {
22271
+ kind: "linked_device_session_projection_v1",
22272
+ linkSessionId: record.linkSessionId,
22273
+ qrPayload: record.qrPayload,
22274
+ revision: record.revision,
22275
+ createdAtMs: record.createdAtMs,
22276
+ updatedAtMs: record.updatedAtMs,
22277
+ state: projectLinkSessionStateV1(record.state)
22278
+ };
22279
+ }
22280
+ function invalidStateResponse(record) {
22281
+ return json$1({
22282
+ ok: false,
22283
+ outcome: "invalid_state",
22284
+ state: record.state.state,
22285
+ session: projectSession(record)
22286
+ }, { status: 409 });
22287
+ }
22288
+ function sessionProjectionResponse(record, outcome) {
22289
+ return json$1({
22290
+ ok: true,
22291
+ outcome,
22292
+ session: projectSession(record)
22293
+ }, { status: 200 });
22294
+ }
22295
+ function targetCredentialResultResponse(record, outcome, targetCredential) {
22296
+ return json$1({
22297
+ ok: true,
22298
+ outcome,
22299
+ targetCredential,
22300
+ session: projectSession(record)
22301
+ }, { status: 200 });
22302
+ }
22303
+ function exportRootWriteResponse(result) {
22304
+ return result.outcome === "conflict" ? json$1({
22305
+ ok: false,
22306
+ code: result.reason ?? "conflict",
22307
+ message: "export-root relay conflict"
22308
+ }, { status: 409 }) : json$1({
22309
+ ok: true,
22310
+ outcome: result.outcome
22311
+ }, { status: 200 });
22312
+ }
22313
+ function invalidInputResponse(message) {
22314
+ return json$1({
22315
+ ok: false,
22316
+ outcome: "invalid_input",
22317
+ code: "invalid_input",
22318
+ message
22319
+ }, { status: 400 });
22320
+ }
22321
+ function notSupportedResponse(message = "Device linking is not configured") {
22322
+ return json$1({
22323
+ ok: false,
22324
+ code: "not_supported",
22325
+ message
22326
+ }, { status: 501 });
22327
+ }
22328
+ function notFoundResponse() {
22329
+ return json$1({
22330
+ ok: false,
22331
+ code: "not_found",
22332
+ message: "Linked-device session not found"
22333
+ }, { status: 404 });
22334
+ }
22335
+ function methodNotAllowedResponse$2() {
22336
+ return json$1({
22337
+ ok: false,
22338
+ code: "method_not_allowed",
22339
+ message: "Method is not allowed"
22340
+ }, { status: 405 });
22341
+ }
22342
+ function authDeniedResponse$2(result) {
22343
+ if (result.code === "unavailable") return json$1({
22344
+ ok: false,
22345
+ code: result.code,
22346
+ message: result.message
22347
+ }, { status: 503 });
22348
+ return json$1({
22349
+ ok: false,
22350
+ outcome: "unauthorized",
22351
+ code: result.code,
22352
+ message: result.message
22353
+ }, { status: result.code === "expired" ? 410 : 401 });
22354
+ }
22355
+ //#endregion
22356
+ //#region src/core/deviceLinking/linkedDeviceBootstrap.ts
22357
+ function linkedDeviceBootstrapFailure(error) {
22358
+ if (error && typeof error === "object" && "code" in error && (error.code === "home_conflict" || error.code === "home_unavailable")) return error.code;
22359
+ return null;
22360
+ }
22361
+ //#endregion
22154
22362
  //#region ../shared-ts/src/utils/exactKeys.ts
22155
22363
  /**
22156
22364
  * True when `value` is a non-array object whose own enumerable string keys are exactly `keys`.
@@ -22272,6 +22480,11 @@ async function handleDeviceLinking(ctx) {
22272
22480
  default: return assertNever$1(action);
22273
22481
  }
22274
22482
  } catch (error) {
22483
+ const bootstrapFailure = linkedDeviceBootstrapFailure(error);
22484
+ if (bootstrapFailure) return sessionResultResponse({
22485
+ outcome: bootstrapFailure,
22486
+ message: "Linked-device bootstrap authority failed"
22487
+ });
22275
22488
  if (error instanceof DeviceLinkingInputError) return invalidInputResponse(error.message);
22276
22489
  return json$1({
22277
22490
  ok: false,
@@ -22283,7 +22496,7 @@ async function handleDeviceLinking(ctx) {
22283
22496
  async function handleCreate(ctx, service, nowMs) {
22284
22497
  if (ctx.method !== "POST") return methodNotAllowedResponse$2();
22285
22498
  const bodyDigestB64u = await requestBodyDigest$1(ctx.request);
22286
- const rawBody = await readJsonBody(ctx.request);
22499
+ const rawBody = await readJson(ctx.request);
22287
22500
  const body = parseBoundary$1(() => parseCreateRequest(rawBody));
22288
22501
  const keyDigest = await computeDevicePublicKeyDigestB64u(body.payload.devicePublicKeyB64u);
22289
22502
  const proof = parseBoundary$1(() => parseRequestProofHeader(ctx.request));
@@ -22360,7 +22573,7 @@ async function handleApproval(ctx, service, rawLinkSessionId, nowMs) {
22360
22573
  });
22361
22574
  if (!session) return notFoundResponse();
22362
22575
  const ownerMismatch = requireOwnerMatchesClaimedWallet(authentication.owner, session);
22363
- if (ownerMismatch) return ownerMismatch;
22576
+ if (ownerMismatch) return authDeniedResponse$2(ownerMismatch);
22364
22577
  if (authentication.owner.walletId !== approval.walletId) return authDeniedResponse$2({
22365
22578
  kind: "denied",
22366
22579
  code: "unauthorized",
@@ -22444,6 +22657,7 @@ async function handleCredential(ctx, service, rawLinkSessionId, nowMs) {
22444
22657
  async function handleSourceContributionPreparation(ctx, service, rawLinkSessionId, nowMs) {
22445
22658
  const owner = await authenticateOwnerForSession(ctx, service, parseSessionId(rawLinkSessionId), nowMs);
22446
22659
  if (owner.kind !== "authorized") return ownerSessionResponse(owner);
22660
+ if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
22447
22661
  if (ctx.method !== "GET") return methodNotAllowedResponse$2();
22448
22662
  const preparation = owner.session.sourceContributionPreparation;
22449
22663
  if (!preparation) return new Response(null, { status: 204 });
@@ -22494,10 +22708,6 @@ async function handleSourceContribution(ctx, service, rawLinkSessionId, nowMs) {
22494
22708
  }));
22495
22709
  return sessionProjectionResponse(committed.session, committed.kind === "replayed" ? "replayed" : recorded.outcome);
22496
22710
  }
22497
- /**
22498
- * A precommit failure's reason is a single token. The installer's message
22499
- * keeps its words, joined, so the session still says what failed.
22500
- */
22501
22711
  function precommitFailureReasonV1(message) {
22502
22712
  const token = message.trim().replace(/\s+/g, "_").replace(/[\u0000-\u001f\u007f]/g, "");
22503
22713
  return token.length > 0 ? token : "authority_commit_failed";
@@ -22506,6 +22716,7 @@ async function handleSourceContributionExecute(ctx, service, rawLinkSessionId, n
22506
22716
  if (ctx.method !== "POST") return methodNotAllowedResponse$2();
22507
22717
  const owner = await authenticateOwnerForSession(ctx, service, parseSessionId(rawLinkSessionId), nowMs);
22508
22718
  if (owner.kind !== "authorized") return ownerSessionResponse(owner);
22719
+ if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
22509
22720
  const router = service.sourceContributionRouter;
22510
22721
  if (!router) return notSupportedResponse("Ed25519 source-preserving linking is not configured");
22511
22722
  const preparation = requireEd25519SourceContributionPreparation(owner.session);
@@ -22578,8 +22789,6 @@ async function handleEmailOtpBaseFactor(ctx, service, rawLinkSessionId, nowMs) {
22578
22789
  const authenticated = await authenticateOwnerForSession(ctx, service, parseSessionId(rawLinkSessionId), nowMs);
22579
22790
  if (authenticated.kind !== "authorized") return ownerSessionResponse(authenticated);
22580
22791
  const session = authenticated.session;
22581
- const ownerMismatch = requireOwnerMatchesClaimedWallet(authenticated.owner, session);
22582
- if (ownerMismatch) return ownerMismatch;
22583
22792
  if (session.state.state !== "claimed" || session.qrPayload.targetFactor.kind !== "email_otp" || !session.claimTranscript) return invalidStateResponse(session);
22584
22793
  const walletId = session.claimTranscript.value.walletId;
22585
22794
  const request = parseBoundary$1(() => parseLinkedDeviceEmailOtpBaseFactorRequestV1(authenticated.body));
@@ -22607,8 +22816,6 @@ async function handleOwnerCancel(ctx, service, rawLinkSessionId, nowMs) {
22607
22816
  if (authenticated.kind !== "authorized") return ownerSessionResponse(authenticated);
22608
22817
  parseBoundary$1(() => parseOwnerCancelRequest(authenticated.body));
22609
22818
  const session = authenticated.session;
22610
- const ownerMismatch = requireOwnerMatchesClaimedWallet(authenticated.owner, session);
22611
- if (ownerMismatch) return ownerMismatch;
22612
22819
  if (session.state.state === "cancelled") return sessionProjectionResponse(session, "replayed");
22613
22820
  return sessionResultResponse(await service.sessionService.cancelSessionV1({
22614
22821
  linkSessionId,
@@ -22656,6 +22863,7 @@ async function handleExportRootRecipient(ctx, service, rawLinkSessionId, nowMs)
22656
22863
  if (ctx.method === "GET") {
22657
22864
  const owner = await authenticateOwnerForSession(ctx, service, sessionId, nowMs);
22658
22865
  if (owner.kind !== "authorized") return ownerSessionResponse(owner);
22866
+ if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
22659
22867
  const transfer = await port.readTransferV1(sessionId);
22660
22868
  return transfer ? json$1(transfer.recipient, { status: 200 }) : new Response(null, { status: 204 });
22661
22869
  }
@@ -22663,8 +22871,14 @@ async function handleExportRootRecipient(ctx, service, rawLinkSessionId, nowMs)
22663
22871
  const authenticated = await authenticateDeviceForSession(ctx, service, rawLinkSessionId, nowMs);
22664
22872
  if (authenticated.kind === "denied") return authDeniedResponse$2(authenticated);
22665
22873
  if (authenticated.kind === "not_found") return notFoundResponse();
22874
+ if (isLinkSessionTerminalFailureV1(authenticated.session.state)) return invalidStateResponse(authenticated.session);
22666
22875
  const recipient = parseBoundary$1(() => parseLinkedDeviceEd25519ExportRootRecipientV1(authenticated.body));
22667
22876
  if (recipient.linkSessionId !== authenticated.linkSessionId) return invalidInputResponse("link session id does not match route");
22877
+ const session = authenticated.session;
22878
+ const preparation = await readTargetPreparation(service, session, requireApproval(session), { access: "replay_only" }, nowMs);
22879
+ if (preparation.kind === "conflict") return invalidStateResponse(session);
22880
+ const facts = preparation.ed25519ExportRoot;
22881
+ if (!facts || recipient.walletId !== preparation.walletId || recipient.enrollmentId !== preparation.enrollmentId || recipient.deviceId !== preparation.deviceId || recipient.targetFactor.kind !== preparation.targetFactor.kind || recipient.walletKeyId !== facts.walletKeyId || recipient.revocationEpoch !== facts.revocationEpoch || recipient.applicationBindingDigestB64u !== facts.applicationBindingDigestB64u || recipient.registeredPublicKeyB64u !== facts.registeredPublicKeyB64u) return invalidInputResponse("export-root recipient does not match target preparation");
22668
22882
  return exportRootWriteResponse(await port.registerRecipientV1({ recipient }));
22669
22883
  }
22670
22884
  async function handleExportRootPackage(ctx, service, rawLinkSessionId, nowMs) {
@@ -22675,12 +22889,14 @@ async function handleExportRootPackage(ctx, service, rawLinkSessionId, nowMs) {
22675
22889
  const authenticated = await authenticateDeviceForSession(ctx, service, rawLinkSessionId, nowMs);
22676
22890
  if (authenticated.kind === "denied") return authDeniedResponse$2(authenticated);
22677
22891
  if (authenticated.kind === "not_found") return notFoundResponse();
22892
+ if (isLinkSessionTerminalFailureV1(authenticated.session.state)) return invalidStateResponse(authenticated.session);
22678
22893
  const transfer = await port.readTransferV1(sessionId);
22679
22894
  return transfer?.state === "sealed" ? json$1(transfer.package, { status: 200 }) : new Response(null, { status: 204 });
22680
22895
  }
22681
22896
  if (ctx.method !== "POST") return methodNotAllowedResponse$2();
22682
22897
  const owner = await authenticateOwnerForSession(ctx, service, sessionId, nowMs);
22683
22898
  if (owner.kind !== "authorized") return ownerSessionResponse(owner);
22899
+ if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
22684
22900
  const submission = parseBoundary$1(() => parseLinkedDeviceEd25519ExportRootSubmissionV1(owner.body));
22685
22901
  if (submission.linkSessionId !== sessionId) return invalidInputResponse("link session id does not match route");
22686
22902
  return exportRootWriteResponse(await port.submitPackageV1({
@@ -22692,7 +22908,7 @@ async function handleReceipt(ctx, service, rawLinkSessionId, nowMs) {
22692
22908
  if (!service.installationReceipt) return notSupportedResponse("Installation receipt is not configured");
22693
22909
  if (ctx.method !== "POST") return methodNotAllowedResponse$2();
22694
22910
  const linkSessionId = parseSessionId(rawLinkSessionId);
22695
- const rawBody = await readJsonBody(ctx.request.clone());
22911
+ const rawBody = await readJson(ctx.request.clone());
22696
22912
  if (isFinalActivationAcknowledgement(rawBody)) {
22697
22913
  const acknowledgement = parseBoundary$1(() => parseLocalAuthorityActivationFinalAckV1(rawBody));
22698
22914
  if (acknowledgement.linkSessionId !== linkSessionId) return invalidInputResponse("activation acknowledgement session does not match the route");
@@ -22878,6 +23094,8 @@ async function authenticateOwnerForSession(ctx, service, linkSessionId, nowMs) {
22878
23094
  });
22879
23095
  if (!session) return { kind: "not_found" };
22880
23096
  validateOwnerRequestBinding(authentication.binding, ctx, bodyDigestB64u, nowMs);
23097
+ const ownerMismatch = requireOwnerMatchesClaimedWallet(authentication.owner, session);
23098
+ if (ownerMismatch) return ownerMismatch;
22881
23099
  return {
22882
23100
  kind: "authorized",
22883
23101
  body: authentication.body,
@@ -23082,69 +23300,6 @@ async function authenticateTargetPasskeyOriginV1(ctx, routeId) {
23082
23300
  expectedOrigin
23083
23301
  };
23084
23302
  }
23085
- function projectLinkSessionStateV1(state) {
23086
- switch (state.state) {
23087
- case "displaying_qr": return { state: "displaying_qr" };
23088
- case "claimed":
23089
- case "awaiting_target_factor":
23090
- case "awaiting_source_contribution":
23091
- case "provisioning": return {
23092
- state: state.state,
23093
- deviceId: state.deviceId
23094
- };
23095
- case "authority_pending_local_install": return {
23096
- state: "authority_pending_local_install",
23097
- deviceId: state.deviceId,
23098
- authorityId: state.authorityId,
23099
- packageSetDigestB64u: state.packageSetDigestB64u
23100
- };
23101
- case "active": return {
23102
- state: "active",
23103
- deviceId: state.deviceId,
23104
- authorityId: state.authorityId,
23105
- activatedAtMs: state.activatedAtMs
23106
- };
23107
- case "failed_before_commit": return {
23108
- state: "failed_before_commit",
23109
- error: state.error
23110
- };
23111
- case "cancelled": return {
23112
- state: "cancelled",
23113
- cancelledAtMs: state.cancelledAtMs
23114
- };
23115
- case "expired": return {
23116
- state: "expired",
23117
- expiredAtMs: state.expiredAtMs
23118
- };
23119
- default: return assertNeverLinkSessionStateV1(state);
23120
- }
23121
- }
23122
- function projectSession(record) {
23123
- return {
23124
- kind: "linked_device_session_projection_v1",
23125
- linkSessionId: record.linkSessionId,
23126
- qrPayload: record.qrPayload,
23127
- revision: record.revision,
23128
- createdAtMs: record.createdAtMs,
23129
- updatedAtMs: record.updatedAtMs,
23130
- state: projectLinkSessionStateV1(record.state)
23131
- };
23132
- }
23133
- function sessionProjectionResponse(record, outcome) {
23134
- return json$1({
23135
- ok: true,
23136
- outcome,
23137
- session: projectSession(record)
23138
- }, { status: 200 });
23139
- }
23140
- function targetCredentialResultResponse(record, outcome, targetCredential) {
23141
- return json$1({
23142
- ok: true,
23143
- outcome,
23144
- targetCredential,
23145
- session: projectSession(record)
23146
- }, { status: 200 });
23147
- }
23148
23303
  function claimResultResponse(result) {
23149
23304
  if (result.outcome !== "applied" && result.outcome !== "replayed") return sessionResultResponse(result);
23150
23305
  const claim = result.record.claimTranscript?.value;
@@ -23173,6 +23328,16 @@ function approvalResultResponse(result) {
23173
23328
  }
23174
23329
  function sessionResultResponse(result) {
23175
23330
  switch (result.outcome) {
23331
+ case "home_conflict": return json$1({
23332
+ ok: false,
23333
+ code: "wallet_home_conflict",
23334
+ message: result.message
23335
+ }, { status: 409 });
23336
+ case "home_unavailable": return json$1({
23337
+ ok: false,
23338
+ code: "wallet_home_unavailable",
23339
+ message: result.message
23340
+ }, { status: 503 });
23176
23341
  case "applied":
23177
23342
  case "replayed": return sessionProjectionResponse(result.record, result.outcome);
23178
23343
  case "conflict": return json$1({
@@ -23213,49 +23378,19 @@ function sessionResultResponse(result) {
23213
23378
  default: return assertNever$1(result);
23214
23379
  }
23215
23380
  }
23216
- function invalidStateResponse(record) {
23217
- return json$1({
23218
- ok: false,
23219
- outcome: "invalid_state",
23220
- state: record.state.state,
23221
- session: projectSession(record)
23222
- }, { status: 409 });
23223
- }
23224
- function exportRootWriteResponse(result) {
23225
- return result.outcome === "conflict" ? json$1({
23226
- ok: false,
23227
- code: result.reason ?? "conflict",
23228
- message: "export-root relay conflict"
23229
- }, { status: 409 }) : json$1({
23230
- ok: true,
23231
- outcome: result.outcome
23232
- }, { status: 200 });
23233
- }
23234
23381
  function ownerSessionResponse(context) {
23235
23382
  return context.kind === "denied" ? authDeniedResponse$2(context) : notFoundResponse();
23236
23383
  }
23237
- /**
23238
- * The one owner-to-session binding, shared by every owner route on a claimed
23239
- * session. It runs before any state is disclosed: an authenticated owner of a
23240
- * DIFFERENT wallet must get the same denial for every state, not a projection
23241
- * or an invalid-state body. An unclaimed session has no wallet to bind to yet,
23242
- * so the caller's state checks answer instead.
23243
- */
23244
23384
  function requireOwnerMatchesClaimedWallet(owner, session) {
23245
23385
  const claimWalletId = session.claimTranscript?.value.walletId;
23246
23386
  if (claimWalletId === void 0) return null;
23247
23387
  if (owner.walletId === claimWalletId) return null;
23248
- return authDeniedResponse$2({
23388
+ return {
23249
23389
  kind: "denied",
23250
23390
  code: "unauthorized",
23251
23391
  message: "owner session does not match link wallet"
23252
- });
23392
+ };
23253
23393
  }
23254
- /**
23255
- * Approval-time revalidation of the selected Email OTP base method. The same
23256
- * eligibility question the dedicated base-factor route answers, asked once
23257
- * more with the id the approval names, so the two paths cannot drift.
23258
- */
23259
23394
  async function requireSelectedEmailOtpBaseFactorV1(service, session, input) {
23260
23395
  const provider = service.emailOtpTargetFactor;
23261
23396
  if (!provider) return notSupportedResponse("Email OTP linking is not configured");
@@ -23274,43 +23409,6 @@ async function requireSelectedEmailOtpBaseFactorV1(service, session, input) {
23274
23409
  });
23275
23410
  return null;
23276
23411
  }
23277
- function authDeniedResponse$2(result) {
23278
- return json$1({
23279
- ok: false,
23280
- outcome: "unauthorized",
23281
- code: result.code,
23282
- message: result.message
23283
- }, { status: result.code === "expired" ? 410 : 401 });
23284
- }
23285
- function invalidInputResponse(message) {
23286
- return json$1({
23287
- ok: false,
23288
- outcome: "invalid_input",
23289
- code: "invalid_input",
23290
- message
23291
- }, { status: 400 });
23292
- }
23293
- function notSupportedResponse(message = "Device linking is not configured") {
23294
- return json$1({
23295
- ok: false,
23296
- code: "not_supported",
23297
- message
23298
- }, { status: 501 });
23299
- }
23300
- function notFoundResponse() {
23301
- return json$1({
23302
- ok: false,
23303
- code: "not_found",
23304
- message: "Linked-device session not found"
23305
- }, { status: 404 });
23306
- }
23307
- function methodNotAllowedResponse$2() {
23308
- return json$1({
23309
- ok: false,
23310
- code: "method_not_allowed",
23311
- message: "Method is not allowed"
23312
- }, { status: 405 });
23313
- }
23314
23412
  function parseCreateRequest(raw) {
23315
23413
  const record = requireRecord(raw, "device-linking create request");
23316
23414
  requireExactKeys$1(record, ["kind", "payload"]);
@@ -23375,9 +23473,6 @@ function parseB64uBytes(raw, field) {
23375
23473
  if (bytes.length === 0 || base64UrlEncode(bytes) !== raw) throw new Error(`${field} is not canonical base64url`);
23376
23474
  return bytes;
23377
23475
  }
23378
- async function readJsonBody(request) {
23379
- return await readJson(request);
23380
- }
23381
23476
  function parseBoundary$1(parse) {
23382
23477
  try {
23383
23478
  return parse();
@@ -23924,7 +24019,8 @@ function methodNotAllowedResponse() {
23924
24019
  }, { status: 405 });
23925
24020
  }
23926
24021
  function authDeniedResponse(value) {
23927
- return jsonFailure(value.code === "expired" ? 401 : value.code === "invalid" ? 403 : 401, value.code, value.message);
24022
+ if (value.code === "unavailable") return jsonFailure(503, value.code, value.message);
24023
+ return jsonFailure(value.code === "invalid" ? 403 : 401, value.code, value.message);
23928
24024
  }
23929
24025
  //#endregion
23930
24026
  //#region src/threshold/session/signingSessionSeal/transport/fetch.ts
@@ -24330,7 +24426,6 @@ function createFetchRouter(service, opts, runtime) {
24330
24426
  handleThresholdEcdsa,
24331
24427
  handleExactWalletSigningSessionSeal,
24332
24428
  handleWebAuthnAuthenticators,
24333
- handleNearPublicKeys,
24334
24429
  handleExactWalletSessionStatus,
24335
24430
  handleHostedWalletSessionExchangeIssue,
24336
24431
  handleHostedWalletSessionExchangeRedeem,
@@ -25938,8 +26033,8 @@ function resolveTraceContext(request) {
25938
26033
  var InMemoryRouterAbEd25519YaoExportStateV1 = class {
25939
26034
  constructor() {
25940
26035
  this.exports = /* @__PURE__ */ new Map();
25941
- this.authorizationNonces = /* @__PURE__ */ new Set();
25942
- this.authorizationUncertain = /* @__PURE__ */ new Set();
26036
+ this.authorizationNonceOwners = /* @__PURE__ */ new Map();
26037
+ this.authorizationUncertainOwners = /* @__PURE__ */ new Map();
25943
26038
  }
25944
26039
  };
25945
26040
  const ROUTES = Object.freeze([defineRoute({