@seams/wallet-server 0.8.0 → 0.9.1

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 (369) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -1
  2. package/artifact-manifest.json +196 -41
  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/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
  22. package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
  23. package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
  24. package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
  25. package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
  26. package/cloudflare-router-ab/wrangler.router.toml +0 -2
  27. package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
  28. package/dist/esm/authorization/domain.js +3 -2
  29. package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
  30. package/dist/esm/authorization/service.js +64 -36
  31. package/dist/esm/cloud-host.js +24 -19
  32. package/dist/esm/core/EmailOtpRecords.js +29 -6
  33. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
  34. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
  35. package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
  36. package/dist/esm/core/ThresholdService/validation.js +2 -2
  37. package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
  38. package/dist/esm/core/authService/webauthn.js +1 -1
  39. package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
  40. package/dist/esm/core/d1WalletStore.js +14 -11
  41. package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
  42. package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
  43. package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
  44. package/dist/esm/core/emailOtpD1Statements.js +1 -0
  45. package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
  46. package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
  47. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
  48. package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
  49. package/dist/esm/hosted-wallet-gateway.js +93 -10
  50. package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
  51. package/dist/esm/localIntendedYaoSigningFault.js +2 -30
  52. package/dist/esm/localRegistrationSetupAuthority.js +8 -1
  53. package/dist/esm/router/auth/commonRouterUtils.js +17 -10
  54. package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
  55. package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
  56. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
  57. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
  58. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
  59. package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
  60. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
  61. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
  62. package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
  63. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
  64. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
  65. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
  66. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
  67. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
  68. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
  69. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
  70. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
  71. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
  72. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
  73. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
  74. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
  75. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
  76. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
  77. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
  78. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
  79. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
  80. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
  81. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
  82. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
  83. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
  84. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
  85. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
  86. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
  87. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
  88. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
  89. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
  90. package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
  91. package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
  92. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
  93. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
  94. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
  95. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
  96. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
  97. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
  98. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
  99. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
  100. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
  101. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
  102. package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
  103. package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
  104. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
  105. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
  106. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
  107. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
  108. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
  109. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
  110. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
  111. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
  112. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
  113. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
  114. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
  115. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
  116. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
  117. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
  118. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
  119. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
  120. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
  121. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
  122. package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
  123. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
  124. package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
  125. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
  126. package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
  127. package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
  128. package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
  129. package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
  130. package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
  131. package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
  132. package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
  133. package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
  134. package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
  135. package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
  136. package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
  137. package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
  138. package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
  139. package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
  140. package/dist/esm/router/cloudflare-adaptor.js +8 -8
  141. package/dist/esm/router/cloudflare.js +34115 -32240
  142. package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
  143. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
  144. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
  145. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
  146. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
  147. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
  148. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
  149. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
  150. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
  151. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
  152. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
  153. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
  154. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
  155. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
  156. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
  157. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
  158. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
  159. package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
  160. package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
  161. package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
  162. package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
  163. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
  164. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
  165. package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
  166. package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
  167. package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
  168. package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
  169. package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
  170. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
  171. package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
  172. package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
  173. package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
  174. package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
  175. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
  176. package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
  177. package/dist/esm/router/express.js +764 -894
  178. package/dist/esm/router/framework/http.js +2 -1
  179. package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
  180. package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
  181. package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
  182. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
  183. package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
  184. package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
  185. package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
  186. package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
  187. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
  188. package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
  189. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
  190. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
  191. package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
  192. package/dist/esm/shared-ts/src/authorization/index.js +1 -1
  193. package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
  194. package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
  195. package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
  196. package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
  197. package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
  198. package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
  199. package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
  200. package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
  201. package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
  202. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
  203. package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
  204. package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
  205. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
  206. package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
  207. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
  208. package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
  209. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  210. package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
  211. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
  212. package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
  213. package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
  214. package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
  215. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
  216. package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
  217. package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
  218. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
  219. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
  220. package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
  221. package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
  222. package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
  223. package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
  224. package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
  225. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
  226. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
  227. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
  228. package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
  229. package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
  230. package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
  231. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
  232. package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
  233. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
  234. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
  235. package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
  236. package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
  237. package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
  238. package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
  239. package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
  240. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
  241. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
  242. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
  243. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
  244. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
  245. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
  246. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
  247. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
  248. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
  249. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
  250. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
  251. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
  252. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
  253. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
  254. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
  255. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
  256. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
  257. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
  258. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
  259. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
  260. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
  261. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
  262. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
  263. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
  264. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
  265. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
  266. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
  267. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
  268. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
  269. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
  270. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
  271. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
  272. package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
  273. package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
  274. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
  275. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
  276. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
  277. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
  278. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
  279. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
  280. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
  281. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
  282. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
  283. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
  284. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
  285. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
  286. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
  287. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
  288. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
  289. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
  290. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
  291. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
  292. package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
  293. package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
  294. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
  295. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
  296. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
  297. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
  298. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
  299. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
  300. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
  301. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
  302. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
  303. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
  304. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
  305. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
  306. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
  307. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
  308. package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
  309. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
  310. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
  311. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
  312. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
  313. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
  314. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
  315. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
  316. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
  317. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
  318. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
  319. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
  320. package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
  321. package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
  322. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
  323. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
  324. package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
  325. package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
  326. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
  327. package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
  328. package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
  329. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
  330. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
  331. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
  332. package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
  333. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
  334. package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
  335. package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
  336. package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
  337. package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
  338. package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
  339. package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
  340. package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
  341. package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
  342. package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
  343. package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
  344. package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
  345. package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
  346. package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
  347. package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
  348. package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
  349. package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
  350. package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
  351. package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
  352. package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
  353. package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
  354. package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
  355. package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
  356. package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
  357. package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
  358. package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
  359. package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
  360. package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
  361. package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
  362. package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
  363. package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
  364. package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
  365. package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
  366. package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
  367. package/package.json +1 -1
  368. package/src/README.md +23 -1
  369. package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
@@ -0,0 +1,488 @@
1
+ import { parseWalletId } from "../../../shared-ts/src/utils/domainIds.js";
2
+ import { isPlainObject, requireRecord } from "../../../shared-ts/src/utils/validation.js";
3
+ import { sha256HexUtf8 } from "../../../shared-ts/src/utils/digests.js";
4
+ import { D1WalletCeremonyActivity } from "../d1/ed25519Yao/d1WalletCeremonyActivity.js";
5
+ import { D1WalletRelocationApprovals } from "../d1/wallet/d1WalletRelocationApprovals.js";
6
+ import { AuthorizationSnapshotLayout } from "../d1/wallet/authorizationSnapshotLayout.js";
7
+ import { D1WalletAuthorizationHistory } from "../d1/wallet/d1WalletAuthorizationHistory.js";
8
+ import { D1WalletAuthorizationSnapshot } from "../d1/wallet/d1WalletAuthorizationSnapshot.js";
9
+ import { D1WalletAuthorizationIntake } from "../d1/wallet/d1WalletAuthorizationIntake.js";
10
+ import { D1WalletAuthorizationCleanup } from "../d1/wallet/d1WalletAuthorizationCleanup.js";
11
+ import { D1WalletRelocationSessions, WalletRelocationSessionSource } from "../d1/wallet/d1WalletRelocationSessions.js";
12
+ import { D1WalletRelocationWriteBlock } from "../d1/wallet/d1WalletRelocationWriteBlock.js";
13
+ //#region src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.ts
14
+ const BASE_PATH = "/internal/wallet-relocation/v1/authorization";
15
+ const ORIGIN = "https://wallet-relocation.internal";
16
+ var WalletAuthorizationRelocationRoutes = class {
17
+ constructor(options) {
18
+ this.options = options;
19
+ this.kind = "fetch_route_extension";
20
+ this.id = "wallet_authorization_relocation";
21
+ this.routes = [
22
+ {
23
+ id: "wallet_authorization_block",
24
+ surface: "relay",
25
+ method: "POST",
26
+ path: `${BASE_PATH}/block`,
27
+ auth: {
28
+ plane: "public",
29
+ rationale: "The private Console binding holds a wallet-local capacity block after destination preparation."
30
+ },
31
+ metering: { kind: "none" },
32
+ summary: "Reserve source snapshot capacity"
33
+ },
34
+ {
35
+ id: "wallet_authorization_release",
36
+ surface: "relay",
37
+ method: "POST",
38
+ path: `${BASE_PATH}/release`,
39
+ auth: {
40
+ plane: "public",
41
+ rationale: "Console durably rejects admission before releasing the source block."
42
+ },
43
+ metering: { kind: "none" },
44
+ summary: "Release an unadmitted source block"
45
+ },
46
+ {
47
+ id: "wallet_authorization_schema",
48
+ surface: "relay",
49
+ method: "POST",
50
+ path: `${BASE_PATH}/schema`,
51
+ auth: {
52
+ plane: "public",
53
+ rationale: "The private Console binding checks source schema before relocation preparation."
54
+ },
55
+ metering: { kind: "none" },
56
+ summary: "Read authorization transfer schema identity"
57
+ },
58
+ {
59
+ id: "wallet_authorization_reserve",
60
+ surface: "relay",
61
+ method: "POST",
62
+ path: `${BASE_PATH}/reserve`,
63
+ auth: {
64
+ plane: "public",
65
+ rationale: "The private Console binding prepares an empty destination before source pause."
66
+ },
67
+ metering: { kind: "none" },
68
+ summary: "Reserve inactive authorization destination"
69
+ },
70
+ {
71
+ id: "wallet_relocation_owner_approval",
72
+ surface: "relay",
73
+ method: "POST",
74
+ path: `${BASE_PATH}/owner-approval`,
75
+ auth: {
76
+ plane: "public",
77
+ rationale: "The internal binding reads fresh durable owner approval for Console admission."
78
+ },
79
+ metering: { kind: "none" },
80
+ summary: "Read fresh owner approval for relocation admission"
81
+ },
82
+ {
83
+ id: "wallet_authorization_cleanup",
84
+ surface: "relay",
85
+ method: "POST",
86
+ path: `${BASE_PATH}/cleanup`,
87
+ auth: {
88
+ plane: "public",
89
+ rationale: "Console must authorize cleanup after destination activation with the pinned authorization manifest."
90
+ },
91
+ metering: { kind: "none" },
92
+ summary: "Delete one bounded batch of obsolete source authorization state"
93
+ },
94
+ {
95
+ id: "wallet_authorization_activate",
96
+ surface: "relay",
97
+ method: "POST",
98
+ path: `${BASE_PATH}/activate`,
99
+ auth: {
100
+ plane: "public",
101
+ rationale: "Console must authorize activation after cutover with the pinned authorization manifest."
102
+ },
103
+ metering: { kind: "none" },
104
+ summary: "Activate the verified authorization destination"
105
+ },
106
+ {
107
+ id: "wallet_authorization_freeze",
108
+ surface: "relay",
109
+ method: "POST",
110
+ path: `${BASE_PATH}/freeze`,
111
+ auth: {
112
+ plane: "public",
113
+ rationale: "The handler requires an internal origin and a live Console-authorized gateway freeze command."
114
+ },
115
+ metering: { kind: "none" },
116
+ summary: "Freeze and capture admitted authorization history"
117
+ },
118
+ {
119
+ id: "wallet_authorization_export",
120
+ surface: "relay",
121
+ method: "POST",
122
+ path: `${BASE_PATH}/export`,
123
+ auth: {
124
+ plane: "public",
125
+ rationale: "The handler requires an internal origin and a live Console-authorized source export command."
126
+ },
127
+ metering: { kind: "none" },
128
+ summary: "Export the sealed authorization snapshot"
129
+ },
130
+ {
131
+ id: "wallet_authorization_import",
132
+ surface: "relay",
133
+ method: "POST",
134
+ path: `${BASE_PATH}/import`,
135
+ auth: {
136
+ plane: "public",
137
+ rationale: "Console authorizes an atomic import of the pinned snapshot."
138
+ },
139
+ metering: { kind: "none" },
140
+ summary: "Import and verify the complete authorization snapshot"
141
+ }
142
+ ];
143
+ }
144
+ async ownerApproval(body) {
145
+ const walletId = parseWalletId(body.walletId);
146
+ if (Object.keys(body).length !== 5 || !walletId.ok || typeof body.moveId !== "string" || !/^wmove_[A-Za-z0-9_-]{43}$/u.test(body.moveId) || typeof body.requestDigest !== "string" || !/^[a-f0-9]{64}$/u.test(body.requestDigest) || typeof body.authorityId !== "string" || typeof body.sourceGeneration !== "number" || !Number.isSafeInteger(body.sourceGeneration) || body.sourceGeneration < 1) return failure("invalid_input", 400);
147
+ const approvals = new D1WalletRelocationApprovals(this.options.database, this.options.scope);
148
+ const stored = await approvals.find(walletId.value, body.moveId);
149
+ if (!stored || stored.binding.requestDigestHex !== body.requestDigest || stored.binding.authorityId !== body.authorityId || stored.binding.sourceGeneration !== body.sourceGeneration) return Response.json({ kind: "denied" }, { headers: { "Cache-Control": "no-store" } });
150
+ const approval = await approvals.readForAdmission(stored.binding, Date.now());
151
+ if (!approval) return Response.json({ kind: "denied" }, { headers: { "Cache-Control": "no-store" } });
152
+ return Response.json({
153
+ kind: "approved",
154
+ requestDigest: approval.binding.requestDigestHex,
155
+ authorityId: approval.binding.authorityId,
156
+ sourceGeneration: approval.binding.sourceGeneration,
157
+ approvedAtMs: approval.approvedAtMs,
158
+ expiresAtMs: approval.expiresAtMs
159
+ }, { headers: { "Cache-Control": "no-store" } });
160
+ }
161
+ async prepareDestination(body, reserve) {
162
+ let source = null;
163
+ try {
164
+ if (reserve) {
165
+ if (Object.keys(body).length !== 2 || typeof body.schemaDigestHex !== "string" || !/^[a-f0-9]{64}$/u.test(body.schemaDigestHex)) return failure("invalid_input", 400);
166
+ source = WalletRelocationSessionSource.parse(body.source);
167
+ } else if (Object.keys(body).length !== 1 || !parseWalletId(body.walletId).ok) return failure("invalid_input", 400);
168
+ } catch {
169
+ return failure("invalid_input", 400);
170
+ }
171
+ try {
172
+ const layout = await AuthorizationSnapshotLayout.read(this.options.database);
173
+ const schemaDigestHex = await sha256HexUtf8(JSON.stringify(layout));
174
+ if (source) {
175
+ if (schemaDigestHex !== body.schemaDigestHex) return failure("authorization_schema_conflict", 409);
176
+ await new D1WalletAuthorizationHistory(this.options.database, this.options.scope).prepare(source);
177
+ return Response.json({
178
+ kind: "authorization_reserved",
179
+ source,
180
+ schemaDigestHex
181
+ }, { headers: { "Cache-Control": "no-store" } });
182
+ }
183
+ const walletId = parseWalletId(body.walletId);
184
+ if (!walletId.ok) return failure("invalid_input", 400);
185
+ await new D1WalletAuthorizationSnapshot(this.options.database, this.options.scope).assertCapacity(walletId.value);
186
+ return Response.json({
187
+ kind: "authorization_schema",
188
+ schemaDigestHex
189
+ }, { headers: { "Cache-Control": "no-store" } });
190
+ } catch {
191
+ return failure("authorization_preparation_unavailable", 503);
192
+ }
193
+ }
194
+ handleFetchRoute(input) {
195
+ return this.handle(input.request);
196
+ }
197
+ async capacityBlock(body, release) {
198
+ let source;
199
+ try {
200
+ if (Object.keys(body).length !== 1) return failure("invalid_input", 400);
201
+ source = WalletRelocationSessionSource.parse(body.source);
202
+ } catch {
203
+ return failure("invalid_input", 400);
204
+ }
205
+ const block = new D1WalletRelocationWriteBlock(this.options.database, this.options.scope);
206
+ try {
207
+ if (release) {
208
+ await block.release(source, Date.now());
209
+ return Response.json({ kind: "authorization_released" });
210
+ }
211
+ const state = await block.check(source, Date.now());
212
+ return Response.json({ kind: state === "ready" ? "authorization_blocked" : "authorization_draining" }, { status: state === "ready" ? 200 : 202 });
213
+ } catch {
214
+ return failure("authorization_capacity_unavailable", 409);
215
+ }
216
+ }
217
+ async handle(request) {
218
+ const url = new URL(request.url);
219
+ if (url.origin !== ORIGIN || !this.routes.some(matchesAuthorizationPath.bind(null, url.pathname))) return failure("not_found", 404);
220
+ if (request.method !== "POST") return failure("method_not_allowed", 405);
221
+ let body;
222
+ try {
223
+ body = await request.json();
224
+ } catch {
225
+ return failure("invalid_input", 400);
226
+ }
227
+ if (!isPlainObject(body)) return failure("invalid_input", 400);
228
+ if (url.pathname === `${BASE_PATH}/block` || url.pathname === `${BASE_PATH}/release`) return this.capacityBlock(body, url.pathname === `${BASE_PATH}/release`);
229
+ if (url.pathname === `${BASE_PATH}/schema`) return this.prepareDestination(body, false);
230
+ if (url.pathname === `${BASE_PATH}/reserve`) return this.prepareDestination(body, true);
231
+ if (url.pathname === `${BASE_PATH}/owner-approval`) return this.ownerApproval(body);
232
+ let requested;
233
+ try {
234
+ requested = parseAuthorizationOperation(url.pathname, body);
235
+ } catch {
236
+ return failure("invalid_input", 400);
237
+ }
238
+ const commandKind = authorizationCommandKind(requested.kind);
239
+ const walletId = parseWalletId(body.walletId);
240
+ if (!walletId.ok || !isPlainObject(body.attempt)) return failure("invalid_input", 400);
241
+ const wallet = {
242
+ namespace: this.options.scope.namespace,
243
+ organizationId: this.options.scope.orgId,
244
+ projectId: this.options.scope.projectId,
245
+ environmentId: this.options.scope.envId,
246
+ walletId: walletId.value
247
+ };
248
+ let authorized;
249
+ try {
250
+ authorized = await this.options.directory.fetch(new Request("https://wallet-placement.internal/internal/wallet-placement/v1/relocation-command", {
251
+ method: "POST",
252
+ headers: { "Content-Type": "application/json" },
253
+ body: JSON.stringify({
254
+ wallet,
255
+ attempt: body.attempt,
256
+ kind: commandKind
257
+ })
258
+ }));
259
+ } catch {
260
+ return failure("relocation_authority_unavailable", 503);
261
+ }
262
+ if (!authorized.ok) return failure("relocation_command_denied", authorized.status >= 500 ? 503 : 403);
263
+ let source;
264
+ let commandDigest;
265
+ let pinnedManifest;
266
+ try {
267
+ const response = requireRecord(await authorized.json(), "source authorization");
268
+ const command = requireRecord(response.command, "source command");
269
+ const identity = requireRecord(command.wallet, "source wallet");
270
+ const operation = requireRecord(command.operation, "source operation");
271
+ if (response.ok !== true || Object.keys(command).length !== 9 || Object.keys(identity).length !== 5 || command.moveId !== body.attempt.moveId || body.attempt.phase !== authorizationCommandPhase(commandKind) || command.participant !== "gateway" || operation.kind !== commandKind || Object.keys(operation).length !== authorizationCommandFields(commandKind) || command.id !== `${command.moveId}/gateway/${commandKind}`) throw new Error("Source command identity conflicts");
272
+ for (const [key, value] of Object.entries(wallet)) if (identity[key] !== value) throw new Error("Source wallet scope conflicts");
273
+ let sourceGeneration = command.generation;
274
+ if (commandKind !== "freeze") {
275
+ const receipt = requireRecord(operation.receipt, "source-fence receipt");
276
+ const receiptWallet = requireRecord(receipt.wallet, "source-fence wallet");
277
+ if (receipt.kind !== authorizationReceiptKind(commandKind) || receipt.moveId !== command.moveId || typeof receipt.generation !== "number" || command.generation !== receipt.generation + authorizationGenerationOffset(commandKind)) throw new Error("Source export receipt conflicts");
278
+ sourceGeneration = receipt.generation - (commandKind === "activate" || commandKind === "cleanup" ? 1 : 0);
279
+ for (const [key, value] of Object.entries(wallet)) if (receiptWallet[key] !== value) throw new Error("Source export receipt scope conflicts");
280
+ }
281
+ if (commandKind === "import_authorization" || commandKind === "activate") {
282
+ if (typeof operation.physicalResource !== "string" || operation.physicalResource.length === 0) throw new Error("Destination resource is absent");
283
+ pinnedManifest = operation.manifest;
284
+ }
285
+ if (commandKind === "cleanup") pinnedManifest = operation.manifest;
286
+ source = WalletRelocationSessionSource.parse({
287
+ walletId: identity.walletId,
288
+ moveId: command.moveId,
289
+ requestDigestHex: command.requestDigest,
290
+ sourceGeneration
291
+ });
292
+ commandDigest = await sha256HexUtf8(JSON.stringify([
293
+ "seams/wallet-d1-relocation-command/v1",
294
+ command.wallet,
295
+ command.moveId,
296
+ command.requestDigest,
297
+ command.participant,
298
+ command.versionId,
299
+ command.home,
300
+ command.generation,
301
+ command.operation
302
+ ]));
303
+ if (response.digest !== commandDigest) throw new Error("Source command digest conflicts");
304
+ } catch {
305
+ return failure("relocation_command_invalid", 502);
306
+ }
307
+ if (requested.kind === "cleanup") try {
308
+ const progress = await new D1WalletAuthorizationCleanup(this.options.database, this.options.scope).advance(source, pinnedManifest, commandDigest, Date.now());
309
+ return Response.json({
310
+ kind: "authorization_cleanup",
311
+ commandDigest,
312
+ progress
313
+ }, {
314
+ status: progress.state === "cleaned" ? 200 : 202,
315
+ headers: { "Cache-Control": "no-store" }
316
+ });
317
+ } catch {
318
+ return failure("authorization_cleanup_incomplete", 503);
319
+ }
320
+ if (requested.kind === "activate") try {
321
+ const activated = await new D1WalletAuthorizationIntake(this.options.database, this.options.scope).activate(source, pinnedManifest, commandDigest, Date.now());
322
+ return Response.json({
323
+ kind: "authorization_activated",
324
+ commandDigest,
325
+ digestHex: activated.digestHex,
326
+ activatedAtMs: activated.activatedAtMs
327
+ }, { headers: { "Cache-Control": "no-store" } });
328
+ } catch {
329
+ return failure("authorization_activation_incomplete", 503);
330
+ }
331
+ if (requested.kind === "import") try {
332
+ const intake = new D1WalletAuthorizationIntake(this.options.database, this.options.scope);
333
+ await intake.prepare(source, pinnedManifest);
334
+ const digestHex = await intake.acceptSnapshot(source, requested.snapshot);
335
+ return Response.json({
336
+ kind: "authorization_verified",
337
+ commandDigest,
338
+ digestHex
339
+ }, { headers: { "Cache-Control": "no-store" } });
340
+ } catch {
341
+ return failure("authorization_import_incomplete", 503);
342
+ }
343
+ if (requested.kind === "export") try {
344
+ const snapshot = await new D1WalletAuthorizationSnapshot(this.options.database, this.options.scope).exportSnapshot(source);
345
+ return Response.json({
346
+ kind: "authorization_snapshot",
347
+ commandDigest,
348
+ snapshot
349
+ }, { headers: { "Cache-Control": "no-store" } });
350
+ } catch {
351
+ return failure("authorization_export_unavailable", 503);
352
+ }
353
+ const activity = new D1WalletCeremonyActivity(this.options.database, this.options.scope);
354
+ const sessions = new D1WalletRelocationSessions(this.options.database, this.options.scope);
355
+ try {
356
+ if (await activity.hasPending(source.walletId)) return pendingAuthorization(commandDigest, "ceremonies_unsettled");
357
+ if (await sessions.hasPendingOperations(source.walletId)) return pendingAuthorization(commandDigest, "operations_unsettled");
358
+ const { retiredAtMs, frozenAtMs } = await new D1WalletRelocationWriteBlock(this.options.database, this.options.scope).freeze(source, Date.now());
359
+ const manifest = await new D1WalletAuthorizationSnapshot(this.options.database, this.options.scope).seal(source);
360
+ const publication = await this.options.directory.fetch(new Request("https://wallet-placement.internal/internal/wallet-placement/v1/relocation-authorization-manifest", {
361
+ method: "POST",
362
+ headers: { "Content-Type": "application/json" },
363
+ body: JSON.stringify({
364
+ wallet,
365
+ attempt: body.attempt,
366
+ manifest
367
+ })
368
+ }));
369
+ if (!publication.ok) return failure("authorization_manifest_unavailable", 503);
370
+ const published = requireRecord(await publication.json(), "published authorization manifest");
371
+ const savedManifest = requireRecord(published.manifest, "pinned authorization manifest");
372
+ if (published.ok !== true || Object.keys(savedManifest).length !== 4) return failure("authorization_manifest_conflict", 502);
373
+ for (const [key, value] of Object.entries(manifest)) if (savedManifest[key] !== value) return failure("authorization_manifest_conflict", 502);
374
+ return Response.json({
375
+ kind: "authorization_frozen",
376
+ commandDigest,
377
+ retiredAtMs,
378
+ frozenAtMs,
379
+ manifest
380
+ }, { headers: { "Cache-Control": "no-store" } });
381
+ } catch {
382
+ if (await activity.hasPending(source.walletId)) return pendingAuthorization(commandDigest, "ceremonies_unsettled");
383
+ if (await sessions.hasPendingOperations(source.walletId)) return pendingAuthorization(commandDigest, "operations_unsettled");
384
+ return failure("authorization_freeze_incomplete", 503);
385
+ }
386
+ }
387
+ };
388
+ function failure(code, status) {
389
+ return Response.json({
390
+ ok: false,
391
+ code
392
+ }, {
393
+ status,
394
+ headers: { "Cache-Control": "no-store" }
395
+ });
396
+ }
397
+ function matchesAuthorizationPath(pathname, route) {
398
+ return route.path === pathname;
399
+ }
400
+ function parseAuthorizationOperation(pathname, body) {
401
+ const fields = Object.keys(body).length;
402
+ switch (pathname) {
403
+ case `${BASE_PATH}/freeze`:
404
+ if (fields === 2) return { kind: "freeze" };
405
+ break;
406
+ case `${BASE_PATH}/export`:
407
+ if (fields === 2) return { kind: "export" };
408
+ break;
409
+ case `${BASE_PATH}/import`:
410
+ if (fields === 3 && "snapshot" in body) return {
411
+ kind: "import",
412
+ snapshot: body.snapshot
413
+ };
414
+ break;
415
+ case `${BASE_PATH}/activate`:
416
+ if (fields === 2) return { kind: "activate" };
417
+ break;
418
+ case `${BASE_PATH}/cleanup`:
419
+ if (fields === 2) return { kind: "cleanup" };
420
+ break;
421
+ }
422
+ throw new Error("Authorization transfer operation is invalid");
423
+ }
424
+ function authorizationCommandKind(kind) {
425
+ switch (kind) {
426
+ case "freeze":
427
+ case "export":
428
+ case "activate":
429
+ case "cleanup": return kind;
430
+ case "import": return "import_authorization";
431
+ default: return assertNever(kind);
432
+ }
433
+ }
434
+ function authorizationCommandPhase(kind) {
435
+ switch (kind) {
436
+ case "freeze": return "freezing";
437
+ case "export":
438
+ case "import_authorization": return "copying";
439
+ case "activate":
440
+ case "cleanup": return "cutover";
441
+ default: return assertNever(kind);
442
+ }
443
+ }
444
+ function authorizationReceiptKind(kind) {
445
+ switch (kind) {
446
+ case "export":
447
+ case "import_authorization": return "source_fence";
448
+ case "activate": return "destination_verification";
449
+ case "cleanup": return "destination_activation";
450
+ default: return assertNever(kind);
451
+ }
452
+ }
453
+ function authorizationGenerationOffset(kind) {
454
+ switch (kind) {
455
+ case "import_authorization": return 1;
456
+ case "cleanup": return -1;
457
+ case "activate":
458
+ case "export": return 0;
459
+ default: return assertNever(kind);
460
+ }
461
+ }
462
+ function authorizationCommandFields(kind) {
463
+ switch (kind) {
464
+ case "freeze": return 1;
465
+ case "export": return 2;
466
+ case "cleanup": return 3;
467
+ case "activate":
468
+ case "import_authorization": return 4;
469
+ default: return assertNever(kind);
470
+ }
471
+ }
472
+ function assertNever(value) {
473
+ throw new Error(`Unexpected authorization operation: ${String(value)}`);
474
+ }
475
+ function pendingAuthorization(commandDigest, reason) {
476
+ return Response.json({
477
+ kind: "authorization_pending",
478
+ commandDigest,
479
+ reason
480
+ }, {
481
+ status: 202,
482
+ headers: { "Cache-Control": "no-store" }
483
+ });
484
+ }
485
+ //#endregion
486
+ export { WalletAuthorizationRelocationRoutes };
487
+
488
+ //# sourceMappingURL=walletAuthorizationRelocationRoutes.js.map
@@ -6,8 +6,8 @@ const WALLET_CONSOLE_SERVICE_ORIGIN_V1 = "https://wallet-console.internal";
6
6
  const WALLET_CONSOLE_OP_PATHS_V1 = {
7
7
  secretKeyAuth: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/secret-key-auth`,
8
8
  publishableKeyAuth: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/publishable-key-auth`,
9
+ registrationContext: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/registration-context`,
9
10
  usageEvents: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/usage-events`,
10
- walletProjection: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/wallet-projections`,
11
11
  projectEnvironments: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/project-environments`,
12
12
  tenantRootActiveLineage: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/tenant-root/active-lineage`
13
13
  };
@@ -1,4 +1,5 @@
1
1
  import { ROUTER_API_CREDENTIAL_SCOPES } from "../../framework/apiCredentialPorts.js";
2
+ import { unavailableRegistrationContext, walletRegistrationContext } from "../../auth/walletRegistrationContext.js";
2
3
  import { WALLET_CONSOLE_OP_PATHS_V1, WALLET_CONSOLE_SERVICE_ORIGIN_V1, decodeWalletConsoleTenantRootActiveLineageResponseV1 } from "./walletConsoleOps.js";
3
4
  //#region src/router/cloudflare/runtime/walletConsoleOpsClient.ts
4
5
  async function postJson(service, path, body) {
@@ -157,6 +158,29 @@ function parseProjectEnvironmentsResponse(value) {
157
158
  }
158
159
  return environments;
159
160
  }
161
+ async function resolveRegistrationContext(service, input) {
162
+ try {
163
+ const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.registrationContext, input);
164
+ return parseWalletRegistrationContextResponse(input, status, body);
165
+ } catch {
166
+ return unavailableRegistrationContext();
167
+ }
168
+ }
169
+ function parseWalletRegistrationContextResponse(input, status, body) {
170
+ if (status === 401 || status === 403) {
171
+ const failure = parsePublishableKeyAuthResponse(body, status);
172
+ return failure && !failure.ok ? failure : unavailableRegistrationContext();
173
+ }
174
+ if (status !== 200 || typeof body !== "object" || body === null || Array.isArray(body)) return unavailableRegistrationContext();
175
+ const record = body;
176
+ if (record.ok !== true || Object.keys(record).some(unexpectedRegistrationContextField)) return unavailableRegistrationContext();
177
+ const principal = parseRouterApiKeyPrincipal(record.principal);
178
+ const environment = parseProjectEnvironment(record.environment);
179
+ return principal && environment ? walletRegistrationContext(input, principal, environment) : unavailableRegistrationContext();
180
+ }
181
+ function unexpectedRegistrationContextField(field) {
182
+ return field !== "ok" && field !== "principal" && field !== "environment";
183
+ }
160
184
  function isUsageEventsSuccessResponse(value) {
161
185
  if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
162
186
  const record = value;
@@ -193,6 +217,7 @@ function createWalletConsoleOpsClient(service) {
193
217
  const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.publishableKeyAuth, input);
194
218
  return parsePublishableKeyAuthResponse(body, status) ?? malformedPublishableKeyAuthResult(status);
195
219
  } },
220
+ registrationContext: { resolve: resolveRegistrationContext.bind(void 0, service) },
196
221
  projectEnvironments: { async listEnvironments(context, filters) {
197
222
  const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.projectEnvironments, {
198
223
  context,
@@ -215,18 +240,13 @@ function createWalletConsoleOpsClient(service) {
215
240
  custodyLineageB64u: decoded.value.custodyLineageB64u
216
241
  };
217
242
  } },
218
- walletProjection: { recordCreatedWallet: recordCreatedWallet.bind(void 0, service) },
219
243
  usageMeter: { async recordEvent(input) {
220
244
  const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.usageEvents, input);
221
245
  if (!isUsageEventsSuccessResponse(body)) throw new Error(`Wallet Console usage ingestion failed (HTTP ${status}): invalid response`);
222
246
  } }
223
247
  };
224
248
  }
225
- async function recordCreatedWallet(service, input) {
226
- const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.walletProjection, input);
227
- if (status !== 200 || !isUsageEventsSuccessResponse(body)) throw new Error(`Wallet Console projection failed (HTTP ${status})`);
228
- }
229
249
  //#endregion
230
- export { createWalletConsoleOpsClient };
250
+ export { createWalletConsoleOpsClient, parseWalletRegistrationContextResponse };
231
251
 
232
252
  //# sourceMappingURL=walletConsoleOpsClient.js.map
@@ -1,4 +1,5 @@
1
1
  import { ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1 } from "../../../core/ThresholdService/routerAb/internalServiceHttp.js";
2
+ import { handleWalletRelocationRequest } from "./walletRelocationOps.js";
2
3
  //#region src/router/cloudflare/runtime/walletControlOps.ts
3
4
  const WALLET_CONTROL_SERVICE_ORIGIN_V1 = "https://wallet-runtime.internal";
4
5
  const WALLET_CONTROL_BASE_PATH_V1 = "/internal/wallet-runtime/v1/tenant-root-control";
@@ -59,6 +60,8 @@ function createClientFetcher(binding, target) {
59
60
  } };
60
61
  }
61
62
  async function handleWalletControlRequest(request, env) {
63
+ const relocation = await handleWalletRelocationRequest(request, env);
64
+ if (relocation) return relocation;
62
65
  const url = new URL(request.url);
63
66
  if (!url.pathname.startsWith(`/internal/wallet-runtime/v1/tenant-root-control/`)) return null;
64
67
  if (url.origin !== "https://wallet-runtime.internal") return null;
@@ -136,8 +136,8 @@ function createCloudflareWalletGatewayRouterV1(input) {
136
136
  ...input.router,
137
137
  apiKeyAuth: consoleOps.apiKeyAuth,
138
138
  publishableKeyAuth: consoleOps.publishableKeyAuth,
139
+ registrationContext: input.registrationContext ?? consoleOps.registrationContext,
139
140
  apiKeyUsageMeter: consoleOps.usageMeter,
140
- walletProjection: consoleOps.walletProjection,
141
141
  orgProjectEnv: consoleOps.projectEnvironments,
142
142
  routerAbNormalSigningAdmission: createRouterAbNormalSigningAdmissionAdapter(admissionStore),
143
143
  routeExtensions: [createWalletConsoleRelayProxyExtensionV1(input.walletConsole), ...input.routeExtensions ?? []]