@seams/wallet-server 0.8.0 → 0.9.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 (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,157 @@
1
+ import { requireCanonicalString, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
2
+ import { parseUnixMs } from "../../../../shared-ts/src/passkey-custody/primitives.js";
3
+ import { parseNonNegativeSafeInteger } from "../../../../shared-ts/src/device-linking/wireFields.js";
4
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
5
+ import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
6
+ import { evictWalletEd25519CapabilityCache } from "../ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js";
7
+ import { AuthorizationSnapshotLayout } from "./authorizationSnapshotLayout.js";
8
+ //#region src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.ts
9
+ const SCOPE = "namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5";
10
+ const TABLES = [
11
+ "linked_device_wallet_session_credential_deliveries_v1",
12
+ "linked_device_bootstrap_imports",
13
+ "linked_device_request_proof_nonces",
14
+ "linked_device_email_otp_grants",
15
+ "linked_device_ed25519_export_root_transfers",
16
+ "linked_device_session_transcripts",
17
+ "linked_device_target_commit_reservations",
18
+ "linked_device_target_credentials",
19
+ "linked_device_authority_installations",
20
+ "linked_device_authority_allocations",
21
+ "linked_device_sessions",
22
+ "wallet_email_otp_rate_limits",
23
+ "email_otp_wallet_enrollments",
24
+ "email_otp_auth_states",
25
+ "authorized_operation_audit_events",
26
+ "authorized_operations",
27
+ "verified_wallet_operation_evidence_sets",
28
+ "wallet_session_hosted_exchange_codes_v2",
29
+ "wallet_session_hosted_credentials_v2",
30
+ "wallet_session_authorizations_v2",
31
+ "router_ab_yao_versioned_json_records",
32
+ "webauthn_authenticators",
33
+ "webauthn_credential_bindings",
34
+ "wallet_signers",
35
+ "wallet_recovery_code_locators",
36
+ "wallets",
37
+ "wallet_auth_methods",
38
+ "wallet_relocation_approvals",
39
+ "wallet_authorities",
40
+ "wallet_relocation_authorization_import_receipts",
41
+ "wallet_relocation_authorization_chunks",
42
+ "wallet_relocation_authorization_intake_chunks"
43
+ ];
44
+ var D1WalletAuthorizationCleanup = class {
45
+ constructor(database, scope) {
46
+ this.database = database;
47
+ this.scope = scope;
48
+ }
49
+ async advance(source, rawManifest, commandDigest, nowMs) {
50
+ parseUnixMs(nowMs, "authorization cleanup time");
51
+ const manifestJson = await this.manifest(source, rawManifest);
52
+ const prior = await this.read(source, manifestJson, commandDigest);
53
+ if (prior?.state === "cleaned") return prior;
54
+ const identity = [
55
+ source.walletId,
56
+ source.moveId,
57
+ source.requestDigestHex,
58
+ source.sourceGeneration
59
+ ];
60
+ if (!prior) await prepareD1TenantStatement(this.database, this.scope, `
61
+ INSERT INTO wallet_relocation_authorization_cleanups
62
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex,
63
+ source_generation, command_digest, manifest_json, state)
64
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, 'cleaning')
65
+ ON CONFLICT DO NOTHING`, [
66
+ ...identity,
67
+ commandDigest,
68
+ manifestJson
69
+ ]).run();
70
+ const admitted = await this.read(source, manifestJson, commandDigest);
71
+ if (!admitted) throw new Error("Authorization cleanup admission disappeared");
72
+ if (admitted.state === "cleaned") return admitted;
73
+ for (const table of TABLES) {
74
+ const ownership = table === "authorized_operations" || table === "authorized_operation_audit_events" || table === "webauthn_authenticators" || table === "webauthn_credential_bindings" || table === "router_ab_yao_versioned_json_records" || table === "linked_device_sessions" || table === "linked_device_target_commit_reservations" || table === "linked_device_session_transcripts" || table === "linked_device_request_proof_nonces" || table === "linked_device_bootstrap_imports" ? AuthorizationSnapshotLayout.ownership(table) : "target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3 AND target.env_id = ?4 AND target.wallet_id = ?5";
75
+ const quota = table === "wallet_session_authorizations_v2" ? ", json_array(target.namespace, target.tenant_id, target.quota_id) AS quota_key" : "";
76
+ const rows = await prepareD1TenantStatement(this.database, this.scope, `SELECT target.rowid AS row_id${quota} FROM ${table} AS target WHERE ${ownership} ORDER BY target.rowid LIMIT 16`, [source.walletId]).all();
77
+ const rowIds = [];
78
+ const quotaKeys = [];
79
+ for (const row of rows.results ?? []) {
80
+ rowIds.push(parseNonNegativeSafeInteger(row.row_id, "cleanup row id"));
81
+ if (table === "wallet_session_authorizations_v2") quotaKeys.push(requireCanonicalString(row.quota_key, "cleanup quota key"));
82
+ }
83
+ if (rowIds.length === 0) continue;
84
+ const statements = [
85
+ prepareD1TenantStatement(this.database, this.scope, `
86
+ UPDATE wallet_relocation_authorization_cleanups SET state = state
87
+ WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
88
+ AND command_digest = ?9 AND state = 'cleaning'`, [...identity, commandDigest]),
89
+ this.database.prepare(D1_BATCH_CAS_GUARD_SQL),
90
+ prepareD1TenantStatement(this.database, this.scope, `DELETE FROM ${table} AS target WHERE ${ownership} AND target.rowid IN (SELECT value FROM json_each(?6))`, [source.walletId, JSON.stringify(rowIds)])
91
+ ];
92
+ if (quotaKeys.length > 0) statements.push(this.database.prepare(`
93
+ DELETE FROM authorization_wallet_session_quotas
94
+ WHERE json_array(namespace, tenant_id, quota_id) IN (SELECT value FROM json_each(?1))`).bind(JSON.stringify(quotaKeys)));
95
+ await this.database.batch(statements);
96
+ return { state: "cleaning" };
97
+ }
98
+ await evictWalletEd25519CapabilityCache({
99
+ database: this.database,
100
+ scope: this.scope
101
+ }, source.walletId);
102
+ await this.database.batch([prepareD1TenantStatement(this.database, this.scope, `
103
+ UPDATE wallet_relocation_authorization_cleanups SET state = 'cleaned', completed_at_ms = ?10
104
+ WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
105
+ AND command_digest = ?9 AND state = 'cleaning'`, [
106
+ ...identity,
107
+ commandDigest,
108
+ nowMs
109
+ ]), this.database.prepare(D1_BATCH_CAS_GUARD_SQL)]);
110
+ const completed = await this.read(source, manifestJson, commandDigest);
111
+ if (completed?.state !== "cleaned") throw new Error("Authorization cleanup completion disappeared");
112
+ return completed;
113
+ }
114
+ async manifest(source, raw) {
115
+ const expected = requireRecord(raw, "cleanup manifest");
116
+ const row = await prepareD1TenantStatement(this.database, this.scope, `SELECT wallet_id, move_id, request_digest_hex, source_generation,
117
+ schema_json, chunk_count, record_count, digest_hex
118
+ FROM wallet_relocation_authorization_snapshots
119
+ WHERE ${SCOPE} AND move_id = ?6 AND state = 'sealed'
120
+ UNION ALL
121
+ SELECT wallet_id, move_id, request_digest_hex, source_generation,
122
+ json_extract(manifest_json, '$.schemaJson') AS schema_json,
123
+ json_extract(manifest_json, '$.chunkCount') AS chunk_count,
124
+ json_extract(manifest_json, '$.recordCount') AS record_count,
125
+ json_extract(manifest_json, '$.digestHex') AS digest_hex
126
+ FROM wallet_relocation_authorization_cleanups
127
+ WHERE ${SCOPE} AND move_id = ?6 AND state = 'cleaned'
128
+ LIMIT 1`, [source.walletId, source.moveId]).first();
129
+ if (!row || !source.matches(row)) throw new Error("Authorization cleanup snapshot conflicts");
130
+ const manifest = {
131
+ schemaJson: requireCanonicalString(row.schema_json, "cleanup snapshot schema"),
132
+ chunkCount: parseNonNegativeSafeInteger(row.chunk_count, "cleanup snapshot chunks"),
133
+ recordCount: parseNonNegativeSafeInteger(row.record_count, "cleanup snapshot records"),
134
+ digestHex: requireCanonicalString(row.digest_hex, "cleanup snapshot digest")
135
+ };
136
+ if (Object.keys(expected).length !== 4) throw new Error("Authorization cleanup manifest conflicts");
137
+ for (const [key, value] of Object.entries(manifest)) if (expected[key] !== value) throw new Error("Authorization cleanup manifest conflicts");
138
+ return JSON.stringify(manifest);
139
+ }
140
+ async read(source, manifestJson, commandDigest) {
141
+ const row = await prepareD1TenantStatement(this.database, this.scope, `SELECT * FROM wallet_relocation_authorization_cleanups WHERE ${SCOPE} AND move_id = ?6`, [source.walletId, source.moveId]).first();
142
+ if (!row) return null;
143
+ if (!source.matches(row) || row.manifest_json !== manifestJson || row.command_digest !== commandDigest) throw new Error("Authorization cleanup identity conflicts");
144
+ switch (row.state) {
145
+ case "cleaning": return { state: "cleaning" };
146
+ case "cleaned": return {
147
+ state: "cleaned",
148
+ completedAtMs: parseUnixMs(row.completed_at_ms, "cleanup completion time")
149
+ };
150
+ default: throw new Error("Authorization cleanup state is invalid");
151
+ }
152
+ }
153
+ };
154
+ //#endregion
155
+ export { D1WalletAuthorizationCleanup };
156
+
157
+ //# sourceMappingURL=d1WalletAuthorizationCleanup.js.map
@@ -0,0 +1,56 @@
1
+ import { parseUnixMs } from "../../../../shared-ts/src/passkey-custody/primitives.js";
2
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
3
+ import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
4
+ //#region src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.ts
5
+ var D1WalletAuthorizationFreeze = class {
6
+ constructor(database, scope) {
7
+ this.database = database;
8
+ this.scope = scope;
9
+ }
10
+ async freeze(source, nowMs) {
11
+ parseUnixMs(nowMs, "authorization freeze time");
12
+ const existing = await this.read(source);
13
+ if (existing !== null) return existing;
14
+ await this.database.batch(this.freezeStatements(source, nowMs));
15
+ const frozenAtMs = await this.read(source);
16
+ if (frozenAtMs === null) throw new Error("Authorization freeze disappeared");
17
+ return frozenAtMs;
18
+ }
19
+ freezeStatements(source, nowMs) {
20
+ parseUnixMs(nowMs, "authorization freeze time");
21
+ const identity = [
22
+ source.walletId,
23
+ source.moveId,
24
+ source.requestDigestHex,
25
+ source.sourceGeneration
26
+ ];
27
+ return [
28
+ prepareD1TenantStatement(this.database, this.scope, `
29
+ INSERT INTO wallet_relocation_authorization_fences
30
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation, frozen_at_ms)
31
+ SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9
32
+ WHERE NOT EXISTS (
33
+ SELECT 1 FROM wallet_relocation_authorization_fences
34
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5
35
+ )`, [...identity, nowMs]),
36
+ prepareD1TenantStatement(this.database, this.scope, `
37
+ UPDATE wallet_relocation_authorization_fences SET frozen_at_ms = frozen_at_ms
38
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
39
+ AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8`, identity),
40
+ this.database.prepare(D1_BATCH_CAS_GUARD_SQL)
41
+ ];
42
+ }
43
+ async read(source) {
44
+ const row = await prepareD1TenantStatement(this.database, this.scope, `
45
+ SELECT wallet_id, move_id, request_digest_hex, source_generation, frozen_at_ms
46
+ FROM wallet_relocation_authorization_fences
47
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5`, [source.walletId]).first();
48
+ if (!row) return null;
49
+ if (!source.matches(row)) throw new Error("Authorization freeze identity conflicts");
50
+ return parseUnixMs(row.frozen_at_ms, "stored authorization freeze time");
51
+ }
52
+ };
53
+ //#endregion
54
+ export { D1WalletAuthorizationFreeze };
55
+
56
+ //# sourceMappingURL=d1WalletAuthorizationFreeze.js.map
@@ -0,0 +1,238 @@
1
+ import { sha256HexUtf8 } from "../../../../shared-ts/src/utils/digests.js";
2
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
3
+ import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
4
+ import { AuthorizationSnapshotLayout } from "./authorizationSnapshotLayout.js";
5
+ //#region src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.ts
6
+ const MAX_RECORD_BYTES = 2097152;
7
+ var D1WalletAuthorizationHistory = class {
8
+ constructor(database, scope) {
9
+ this.database = database;
10
+ this.scope = scope;
11
+ }
12
+ async prepare(source) {
13
+ if (await this.readImport(source)) return;
14
+ const empty = [];
15
+ for (const layout of await AuthorizationSnapshotLayout.read(this.database)) {
16
+ if (layout.table === "authorization_wallet_session_quotas") continue;
17
+ empty.push(`NOT EXISTS (SELECT 1 FROM ${layout.table} AS target
18
+ WHERE ${layout.expressions().ownership})`);
19
+ }
20
+ await this.database.batch([
21
+ ...prepareCleanedDestinationReturn(this.database, this.scope, source),
22
+ prepareD1TenantStatement(this.database, this.scope, `
23
+ INSERT INTO wallet_relocation_authorization_imports
24
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation, state)
25
+ SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'importing'
26
+ WHERE ${empty.join(" AND ")}
27
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_session_fences
28
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5)
29
+ ON CONFLICT (namespace, org_id, project_id, env_id, wallet_id) DO NOTHING`, [
30
+ source.walletId,
31
+ source.moveId,
32
+ source.requestDigestHex,
33
+ source.sourceGeneration
34
+ ]),
35
+ prepareD1TenantStatement(this.database, this.scope, `
36
+ UPDATE wallet_relocation_authorization_imports SET state = state
37
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
38
+ AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8`, [
39
+ source.walletId,
40
+ source.moveId,
41
+ source.requestDigestHex,
42
+ source.sourceGeneration
43
+ ]),
44
+ this.database.prepare(D1_BATCH_CAS_GUARD_SQL)
45
+ ]);
46
+ }
47
+ async restoreSnapshot(source, records, completion) {
48
+ const statements = [];
49
+ for (const record of records) {
50
+ const row = {
51
+ layout: record.table,
52
+ key: record.recordKey,
53
+ json: record.recordJson,
54
+ digest: await sha256HexUtf8(JSON.stringify([record.table.table, record.recordJson]))
55
+ };
56
+ statements.push(this.validateRow(source, row), this.database.prepare(D1_BATCH_CAS_GUARD_SQL), ...this.restoreStatements(source, row));
57
+ }
58
+ statements.push(...this.closeStatements(source), ...completion);
59
+ await this.database.batch(statements);
60
+ }
61
+ restoreStatements(source, row) {
62
+ const table = row.layout.table;
63
+ const identity = [
64
+ source.walletId,
65
+ source.moveId,
66
+ source.requestDigestHex,
67
+ source.sourceGeneration,
68
+ table,
69
+ row.key,
70
+ row.digest
71
+ ];
72
+ const values = [];
73
+ for (const column of row.layout.columns) values.push(`json_extract(?6, '$.${column}')`);
74
+ const expressions = row.layout.expressions();
75
+ return [
76
+ prepareD1TenantStatement(this.database, this.scope, `
77
+ INSERT INTO wallet_relocation_authorization_import_context
78
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation,
79
+ table_name, record_key, record_digest)
80
+ SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11
81
+ FROM wallet_relocation_authorization_imports
82
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
83
+ AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
84
+ AND state = 'importing'
85
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_receipts
86
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
87
+ AND wallet_id = ?5 AND move_id = ?6 AND table_name = ?9 AND record_key = ?10)`, identity),
88
+ this.database.prepare(D1_BATCH_CAS_GUARD_SQL),
89
+ prepareD1TenantStatement(this.database, this.scope, `INSERT INTO ${table} (${row.layout.columns.join(", ")}) SELECT ${values.join(", ")}`, [source.walletId, row.json]),
90
+ prepareD1TenantStatement(this.database, this.scope, `
91
+ INSERT INTO wallet_relocation_authorization_import_receipts
92
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation,
93
+ table_name, record_key, record_digest)
94
+ SELECT namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation,
95
+ table_name, record_key, record_digest
96
+ FROM wallet_relocation_authorization_import_context
97
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
98
+ AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
99
+ AND table_name = ?9 AND record_key = ?10 AND record_digest = ?11
100
+ AND EXISTS (SELECT 1 FROM ${table} AS target
101
+ WHERE ${expressions.key} = ?10 AND ${expressions.record} = ?12)`, [...identity, row.json]),
102
+ this.database.prepare(D1_BATCH_CAS_GUARD_SQL),
103
+ prepareD1TenantStatement(this.database, this.scope, `
104
+ DELETE FROM wallet_relocation_authorization_import_context
105
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
106
+ AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
107
+ AND table_name = ?9 AND record_key = ?10 AND record_digest = ?11`, identity)
108
+ ];
109
+ }
110
+ closeStatements(source) {
111
+ return [prepareD1TenantStatement(this.database, this.scope, `
112
+ UPDATE wallet_relocation_authorization_imports
113
+ SET state = CASE WHEN state = 'importing' THEN 'closed' ELSE state END
114
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
115
+ AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
116
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_receipts AS receipt
117
+ WHERE receipt.namespace = ?1 AND receipt.org_id = ?2 AND receipt.project_id = ?3 AND receipt.env_id = ?4
118
+ AND receipt.wallet_id = ?5 AND receipt.table_name = 'authorization_wallet_session_quotas'
119
+ AND NOT EXISTS (SELECT 1 FROM authorization_wallet_session_quotas AS quota
120
+ JOIN wallet_session_authorizations_v2 AS session ON session.namespace = quota.namespace
121
+ AND session.tenant_id = quota.tenant_id AND session.quota_id = quota.quota_id
122
+ AND session.wallet_session_id = quota.wallet_session_id
123
+ WHERE json_array(quota.namespace, quota.quota_id, quota.tenant_id) = receipt.record_key
124
+ AND session.namespace = ?1 AND session.org_id = ?2 AND session.project_id = ?3 AND session.env_id = ?4
125
+ AND session.wallet_id = ?5 AND session.retired_at_ms IS NOT NULL))`, [
126
+ source.walletId,
127
+ source.moveId,
128
+ source.requestDigestHex,
129
+ source.sourceGeneration
130
+ ]), this.database.prepare(D1_BATCH_CAS_GUARD_SQL)];
131
+ }
132
+ async readImport(source) {
133
+ const row = await prepareD1TenantStatement(this.database, this.scope, `
134
+ SELECT wallet_id, move_id, request_digest_hex, source_generation
135
+ FROM wallet_relocation_authorization_imports
136
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5`, [source.walletId]).first();
137
+ if (!row) return false;
138
+ if (source.matches(row)) return true;
139
+ if (typeof row.source_generation === "number" && row.source_generation + 1 < source.sourceGeneration) return false;
140
+ throw new Error("Authorization history import identity conflicts");
141
+ }
142
+ validateRow(source, row) {
143
+ const layout = row.layout;
144
+ const raw = row.json;
145
+ if (typeof raw !== "string" || new TextEncoder().encode(raw).byteLength > MAX_RECORD_BYTES) throw new Error("Authorization history requires a bounded assembled record");
146
+ const table = layout.table;
147
+ const fields = [];
148
+ const keys = [];
149
+ for (const column of layout.columns) fields.push(`'${column}', json_extract(?6, '$.${column}')`);
150
+ for (const column of layout.keyColumns) keys.push(`json_extract(?6, '$.${column}')`);
151
+ const ownership = table === "authorization_wallet_session_quotas" ? "target.namespace = ?1" : layout.expressions().ownership;
152
+ const projectedColumns = [];
153
+ for (const column of layout.columns) projectedColumns.push(`json_extract(?6, '$.${column}') AS ${column}`);
154
+ let lifecycle = "1";
155
+ if (table === "wallet_session_authorizations_v2") lifecycle = `json_type(?6, '$.retired_at_ms') = 'integer'`;
156
+ if (table === "wallet_session_hosted_credentials_v2") lifecycle = `json_type(?6, '$.retired_at_ms') = 'integer' AND json_extract(?6, '$.lifecycle_kind') = 'retired'`;
157
+ if (table === "authorized_operations") lifecycle = "target.lifecycle_kind = 'completed'";
158
+ if (table === "authorized_operation_audit_events") lifecycle = "target.result_kind != 'pending'";
159
+ return prepareD1TenantStatement(this.database, this.scope, `
160
+ UPDATE wallet_relocation_authorization_imports SET state = state
161
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5
162
+ AND move_id = ?7 AND request_digest_hex = ?8 AND source_generation = ?9 AND state = 'importing'
163
+ AND EXISTS (SELECT 1 FROM (SELECT ${projectedColumns.join(", ")}) AS target
164
+ WHERE json_valid(?6) AND json_type(?6) = 'object' AND ${ownership} AND ${lifecycle}
165
+ AND (SELECT COUNT(*) FROM json_each(?6)) = ${layout.columns.length}
166
+ AND (SELECT COUNT(DISTINCT key) FROM json_each(?6)) = ${layout.columns.length}
167
+ AND NOT EXISTS (SELECT 1 FROM json_each(?6) AS value
168
+ LEFT JOIN pragma_table_info('${table}') AS field ON field.name = value.key
169
+ WHERE field.name IS NULL OR NOT (value.type = 'null'
170
+ OR (field.type = 'TEXT' AND value.type = 'text')
171
+ OR (field.type = 'INTEGER' AND value.type = 'integer' AND typeof(value.atom) = 'integer')))
172
+ AND json_object(${fields.join(", ")}) = ?6
173
+ AND json_array(${keys.join(", ")}) = ?10)`, [
174
+ source.walletId,
175
+ raw,
176
+ source.moveId,
177
+ source.requestDigestHex,
178
+ source.sourceGeneration,
179
+ row.key
180
+ ]);
181
+ }
182
+ };
183
+ function prepareCleanedDestinationReturn(database, scope, source) {
184
+ const identity = [
185
+ source.walletId,
186
+ source.moveId,
187
+ source.requestDigestHex,
188
+ source.sourceGeneration
189
+ ];
190
+ const statements = [prepareD1TenantStatement(database, scope, `
191
+ INSERT INTO wallet_relocation_authorization_returns
192
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex,
193
+ source_generation, previous_move_id, previous_request_digest_hex, retired_generation)
194
+ SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, cleanup.move_id, cleanup.request_digest_hex, execution.generation
195
+ FROM wallet_relocation_authorization_cleanups AS cleanup
196
+ JOIN wallet_execution_generations AS execution USING (namespace, org_id, project_id, env_id, wallet_id)
197
+ WHERE cleanup.namespace = ?1 AND cleanup.org_id = ?2 AND cleanup.project_id = ?3
198
+ AND cleanup.env_id = ?4 AND cleanup.wallet_id = ?5 AND cleanup.state = 'cleaned'
199
+ AND execution.state = 'retired' AND execution.generation = cleanup.source_generation
200
+ AND execution.generation < ?8
201
+ ON CONFLICT (namespace, org_id, project_id, env_id, wallet_id, move_id) DO NOTHING`, identity)];
202
+ for (const table of [
203
+ "wallet_relocation_authorization_imports",
204
+ "wallet_relocation_authorization_intakes",
205
+ "wallet_relocation_authorization_snapshots",
206
+ "wallet_relocation_authorization_fences",
207
+ "wallet_relocation_session_fences",
208
+ "wallet_execution_generations"
209
+ ]) {
210
+ let priorIdentity;
211
+ switch (table) {
212
+ case "wallet_relocation_authorization_imports":
213
+ case "wallet_relocation_authorization_intakes":
214
+ priorIdentity = "target.source_generation + 1 = returned.retired_generation";
215
+ break;
216
+ case "wallet_execution_generations":
217
+ priorIdentity = "target.generation = returned.retired_generation AND target.state = 'retired'";
218
+ break;
219
+ default: priorIdentity = `target.source_generation = returned.retired_generation
220
+ AND target.move_id = returned.previous_move_id
221
+ AND target.request_digest_hex = returned.previous_request_digest_hex`;
222
+ }
223
+ statements.push(prepareD1TenantStatement(database, scope, `
224
+ DELETE FROM ${table} AS target
225
+ WHERE target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
226
+ AND target.env_id = ?4 AND target.wallet_id = ?5 AND EXISTS (
227
+ SELECT 1 FROM wallet_relocation_authorization_returns AS returned
228
+ WHERE returned.namespace = ?1 AND returned.org_id = ?2 AND returned.project_id = ?3
229
+ AND returned.env_id = ?4 AND returned.wallet_id = ?5 AND returned.move_id = ?6
230
+ AND returned.request_digest_hex = ?7 AND returned.source_generation = ?8
231
+ AND ${priorIdentity})`, identity));
232
+ }
233
+ return statements;
234
+ }
235
+ //#endregion
236
+ export { D1WalletAuthorizationHistory };
237
+
238
+ //# sourceMappingURL=d1WalletAuthorizationHistory.js.map