@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
@@ -1,4 +1,6 @@
1
1
  import { parseRouterAbEcdsaDerivationActivationRefreshCommitRequestV1, parseRouterAbEcdsaDerivationActivationRefreshResponseV1, parseRouterAbEcdsaDerivationExplicitExportRequestV1, parseRouterAbEcdsaExplicitExportProtocolForwardedResponseV1, parseRouterAbEcdsaRegistrationActivationReceiptV1, parseRouterAbEcdsaStrictForwardedRegistrationResponseV1, projectRouterAbEcdsaDerivationExplicitExportRequestToProtocolV1 } from "../../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
2
+ import { walletObjectIdentity, walletObjectIdentityHeaders } from "../../cloudflare/runtime/walletObjectAddresses.js";
3
+ import { ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1, normalizeRouterAbInternalServiceAuthSecret } from "../../../core/ThresholdService/routerAb/internalServiceHttp.js";
2
4
  import { ROUTER_AB_TRACE_ID_HEADER_V1 } from "../../../shared-ts/src/utils/routerAbTraceContext.js";
3
5
  //#region src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.ts
4
6
  const STRICT_ECDSA_REGISTRATION_PATH = "/router-ab/ecdsa-derivation/register";
@@ -90,9 +92,17 @@ var StrictRegistrationForwarder = class {
90
92
  message: "Strict ECDSA registration request policy is invalid",
91
93
  retryable: false
92
94
  };
95
+ const claims = ceremonyTokenClaimsForAuthority(input.authority, this.config.tokenScope, input.projectEnvironmentId, input.kind === "activation" ? pendingOwnershipGeneration(input.pendingActivation) : input.tenantRoot.ownershipGeneration);
96
+ const token = await this.config.tokenIssuer.issueRequest(claims, requestPolicy);
93
97
  const headers = {
94
- authorization: `Bearer ${await this.config.tokenIssuer.issueRequest(ceremonyTokenClaimsForAuthority(input.authority, this.config.tokenScope, input.projectEnvironmentId), requestPolicy)}`,
95
- "content-type": JSON_CONTENT_TYPE
98
+ [ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1]: normalizeRouterAbInternalServiceAuthSecret(this.config.internalServiceAuthSecret),
99
+ authorization: `Bearer ${token}`,
100
+ "content-type": JSON_CONTENT_TYPE,
101
+ ...walletObjectIdentityHeaders(walletObjectIdentity(claims.accountId, claims.ownershipGeneration, {
102
+ orgId: claims.orgId,
103
+ projectId: claims.projectId,
104
+ envId: claims.projectEnvironmentId
105
+ }))
96
106
  };
97
107
  if (input.traceContext) headers[ROUTER_AB_TRACE_ID_HEADER_V1] = input.traceContext.value;
98
108
  const response = await this.config.router.fetch(new Request(`https://router.router-ab.internal${input.path}`, {
@@ -186,7 +196,8 @@ var StrictPostRegistrationForwarder = class {
186
196
  async forwardRaw(input) {
187
197
  const authorityFailure = validatePostRegistrationAuthorityBinding(input);
188
198
  if (authorityFailure) return authorityFailure;
189
- const token = await this.config.tokenIssuer.issueRequest(ceremonyTokenClaimsForAuthority(input.authority, this.config.tokenScope, input.tenantRoot.projectEnvironmentId), postRegistrationRequestPolicy(input.kind === "explicit_export" ? {
199
+ const claims = ceremonyTokenClaimsForAuthority(input.authority, this.config.tokenScope, input.tenantRoot.projectEnvironmentId, input.tenantRoot.ownershipGeneration);
200
+ const token = await this.config.tokenIssuer.issueRequest(claims, postRegistrationRequestPolicy(input.kind === "explicit_export" ? {
190
201
  workKind: "key_export",
191
202
  requestDigestB64u: input.requestDigestB64u
192
203
  } : {
@@ -196,8 +207,14 @@ var StrictPostRegistrationForwarder = class {
196
207
  const response = await this.config.router.fetch(new Request(`https://router.router-ab.internal${input.path}`, {
197
208
  method: "POST",
198
209
  headers: {
210
+ [ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1]: normalizeRouterAbInternalServiceAuthSecret(this.config.internalServiceAuthSecret),
199
211
  authorization: `Bearer ${token}`,
200
- "content-type": JSON_CONTENT_TYPE
212
+ "content-type": JSON_CONTENT_TYPE,
213
+ ...walletObjectIdentityHeaders(walletObjectIdentity(claims.accountId, claims.ownershipGeneration, {
214
+ orgId: claims.orgId,
215
+ projectId: claims.projectId,
216
+ envId: claims.projectEnvironmentId
217
+ }))
201
218
  },
202
219
  body: strictPostRegistrationForwardBodyJson(input)
203
220
  }));
@@ -297,6 +314,7 @@ function assertNeverStrictForwardBody(value) {
297
314
  function canonicalPendingActivationJson(value) {
298
315
  if (!exactObject(value, [
299
316
  "registration",
317
+ "ownership_generation",
300
318
  "tenant_root_custody_binding_digest",
301
319
  "wallet_scope",
302
320
  "environment_key",
@@ -305,6 +323,11 @@ function canonicalPendingActivationJson(value) {
305
323
  ])) throw new Error("MPCRouter pending activation has an invalid envelope");
306
324
  return canonicalJson(value);
307
325
  }
326
+ function pendingOwnershipGeneration(pending) {
327
+ const generation = objectValue(JSON.parse(pending.canonicalPayloadJson))?.ownership_generation;
328
+ if (typeof generation !== "number" || !Number.isSafeInteger(generation) || generation < 1) throw new Error("Stored ECDSA pending activation has an invalid ownership generation");
329
+ return generation;
330
+ }
308
331
  function pendingProjectEnvironmentId(pending) {
309
332
  const projectEnvironmentId = nonEmptyString(objectValue(objectValue(JSON.parse(pending.canonicalPayloadJson))?.wallet_scope)?.project_environment_id);
310
333
  if (!projectEnvironmentId) throw new Error("Stored ECDSA pending activation has no canonical project environment");
@@ -313,11 +336,12 @@ function pendingProjectEnvironmentId(pending) {
313
336
  function parseStoredRouterAbEcdsaPendingActivationV1(value) {
314
337
  const record = exactObject(value, ["kind", "canonicalPayloadJson"]);
315
338
  if (!record || record.kind !== "router_ab_ecdsa_pending_activation_v1" || typeof record.canonicalPayloadJson !== "string") throw new Error("Stored MPCRouter ECDSA pending activation is invalid");
316
- const canonicalPayloadJson = canonicalPendingActivationJson(JSON.parse(record.canonicalPayloadJson));
317
- if (canonicalPayloadJson !== record.canonicalPayloadJson) throw new Error("Stored MPCRouter ECDSA pending activation is not canonical");
339
+ const parsed = objectValue(JSON.parse(record.canonicalPayloadJson));
340
+ if (!parsed || canonicalJson(parsed) !== record.canonicalPayloadJson) throw new Error("Stored MPCRouter ECDSA pending activation is not canonical");
341
+ if (!Object.hasOwn(parsed, "ownership_generation")) parsed.ownership_generation = 1;
318
342
  return {
319
343
  kind: "router_ab_ecdsa_pending_activation_v1",
320
- canonicalPayloadJson
344
+ canonicalPayloadJson: canonicalPendingActivationJson(parsed)
321
345
  };
322
346
  }
323
347
  function canonicalJson(value) {
@@ -380,8 +404,9 @@ function parseStrictRegistrationForwardingResult(raw) {
380
404
  };
381
405
  }
382
406
  }
383
- function ceremonyTokenClaimsForAuthority(authority, scope, projectEnvironmentId) {
407
+ function ceremonyTokenClaimsForAuthority(authority, scope, projectEnvironmentId, ownershipGeneration) {
384
408
  return {
409
+ ownershipGeneration,
385
410
  subjectId: authority.subjectId,
386
411
  sessionId: authority.sessionId,
387
412
  orgId: scope.orgId,
@@ -501,6 +526,7 @@ var Ed25519CeremonyTokenIssuer = class {
501
526
  project_id: claims.projectId,
502
527
  environment: claims.environment,
503
528
  project_environment_id: claims.projectEnvironmentId,
529
+ ownership_generation: claims.ownershipGeneration,
504
530
  account_id: claims.accountId,
505
531
  ...requestPolicy ? { routerAbRequestPolicy: requestPolicy } : {}
506
532
  })}`;
@@ -659,7 +685,7 @@ function validateCeremonyTokenIssuerConfig(config) {
659
685
  if (!nonEmptyString(config.issuer) || !nonEmptyString(config.audience) || !nonEmptyString(config.keyId) || config.privateJwk.kty !== "OKP" || config.privateJwk.crv !== "Ed25519" || !base64UrlString(config.privateJwk.x, 32) || !base64UrlString(config.privateJwk.d, 32)) throw new Error("Router A/B ECDSA ceremony token issuer requires an Ed25519 private JWK");
660
686
  }
661
687
  function validateCeremonyTokenClaims(claims) {
662
- if (!nonEmptyString(claims.subjectId) || !nonEmptyString(claims.sessionId) || !nonEmptyString(claims.orgId) || !nonEmptyString(claims.projectId) || !nonEmptyString(claims.environment) || !nonEmptyString(claims.projectEnvironmentId) || !nonEmptyString(claims.accountId) || !Number.isSafeInteger(claims.expiresAtMs) || claims.expiresAtMs <= Date.now()) throw new Error("Router A/B ECDSA ceremony token claims are invalid");
688
+ if (!Number.isSafeInteger(claims.ownershipGeneration) || claims.ownershipGeneration < 1 || !nonEmptyString(claims.subjectId) || !nonEmptyString(claims.sessionId) || !nonEmptyString(claims.orgId) || !nonEmptyString(claims.projectId) || !nonEmptyString(claims.environment) || !nonEmptyString(claims.projectEnvironmentId) || !nonEmptyString(claims.accountId) || !Number.isSafeInteger(claims.expiresAtMs) || claims.expiresAtMs <= Date.now()) throw new Error("Router A/B ECDSA ceremony token claims are invalid");
663
689
  }
664
690
  function exactObject(raw, keys) {
665
691
  const record = objectValue(raw);
@@ -0,0 +1,42 @@
1
+ import { InMemoryRouterAbEd25519YaoRecoveryService, InMemoryRouterAbEd25519YaoRecoveryStateV1 } from "../recovery/routerAbEd25519YaoRecovery.js";
2
+ //#region src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.ts
3
+ /** The wallet and its initial capability become visible in the same transaction. */
4
+ function commitRouterAbEd25519YaoRegistrationCapability(store, installation, walletWrite) {
5
+ return commitCapability(store, installRegistration.bind(void 0, installation), walletWrite);
6
+ }
7
+ function rehydrateRouterAbEd25519YaoCapability(store, capability) {
8
+ return commitCapability(store, installPersisted.bind(void 0, capability), Promise.resolve(null));
9
+ }
10
+ async function commitCapability(store, install, preparedWrite) {
11
+ for (let attempt = 0; attempt < 2; attempt += 1) {
12
+ const [snapshot, companionWrite] = await Promise.all([store.loadCapabilities(), preparedWrite]);
13
+ const state = new InMemoryRouterAbEd25519YaoRecoveryStateV1();
14
+ for (const [key, capability] of snapshot.value.recoveryCapabilities) state.capabilities.set(key, capability);
15
+ for (const [key, capabilityKey] of snapshot.value.recoveryIdentityCapabilities) state.identityCapabilities.set(key, capabilityKey);
16
+ const result = install(new InMemoryRouterAbEd25519YaoRecoveryService({
17
+ admitRecovery: rejectProtocolExecution,
18
+ resolveRecoveryDispatchRoot: rejectProtocolExecution,
19
+ executeRecovery: rejectProtocolExecution,
20
+ activateRecovery: rejectProtocolExecution
21
+ }, state));
22
+ if (!result.ok) return result;
23
+ if ((await store.commitCapabilities(snapshot, {
24
+ capabilities: state.capabilities,
25
+ identityCapabilities: state.identityCapabilities
26
+ }, companionWrite)).kind === "stored") return result;
27
+ }
28
+ throw new Error("Capability state remained contended after one reconciliation");
29
+ }
30
+ function installRegistration(input, service) {
31
+ return service.installRegistrationFinalizeCapability(input);
32
+ }
33
+ function installPersisted(input, service) {
34
+ return service.installPersistedActiveCapability(input);
35
+ }
36
+ function rejectProtocolExecution() {
37
+ throw new Error("A capability commit cannot execute a protocol");
38
+ }
39
+ //#endregion
40
+ export { commitRouterAbEd25519YaoRegistrationCapability, rehydrateRouterAbEd25519YaoCapability };
41
+
42
+ //# sourceMappingURL=routerAbEd25519YaoCapabilityCommit.js.map
@@ -92,6 +92,23 @@ function isWalletOwnershipMap(input) {
92
92
  }
93
93
  return true;
94
94
  }
95
+ function hasIntentAuthorityGeneration(input) {
96
+ return isPlainObject(input) && INTENT_AUTHORITY_KINDS.has(String(input.kind)) && typeof input.ownershipGeneration === "number" && Number.isSafeInteger(input.ownershipGeneration) && input.ownershipGeneration > 0;
97
+ }
98
+ function hasRecoveryOwnershipGenerations(input) {
99
+ if (!(input instanceof Map)) return false;
100
+ for (const state of input.values()) {
101
+ if (!isPlainObject(state) || !isPlainObject(state.context)) return false;
102
+ const authorization = state.context.authorization;
103
+ if (!isPlainObject(authorization) || typeof authorization.ownershipGeneration !== "number" || !Number.isSafeInteger(authorization.ownershipGeneration) || authorization.ownershipGeneration < 1) return false;
104
+ }
105
+ return true;
106
+ }
107
+ function hasExportOwnershipGenerations(input) {
108
+ if (!(input instanceof Map)) return false;
109
+ for (const state of input.values()) if (!isPlainObject(state) || typeof state.ownershipGeneration !== "number" || !Number.isSafeInteger(state.ownershipGeneration) || state.ownershipGeneration < 1) return false;
110
+ return true;
111
+ }
95
112
  function hasProductStateCollections(input) {
96
113
  if (!isPlainObject(input)) return false;
97
114
  if (input.kind !== "router_ab_ed25519_yao_product_registration_state_v1") return false;
@@ -100,7 +117,7 @@ function hasProductStateCollections(input) {
100
117
  const recovery = input.recovery;
101
118
  const exportState = input.export;
102
119
  if (!isPlainObject(registration) || !isPlainObject(authorization) || !isPlainObject(recovery) || !isPlainObject(exportState)) return false;
103
- return isStringMapWithStateKinds(registration.states, REGISTRATION_STATE_KINDS) && isStringMap(registration.lifecycleSessions) && (registration.admissionClaims === void 0 || isStringMapWithStateKinds(registration.admissionClaims, REGISTRATION_ADMISSION_CLAIM_KINDS)) && isDispatchRootMap(registration.dispatchRoots) && Array.isArray(authorization.authorities) && authorization.authorities.every((authority) => isPlainObject(authority) && INTENT_AUTHORITY_KINDS.has(String(authority.kind))) && isStringMapWithStateKinds(recovery.capabilities, CAPABILITY_STATE_KINDS) && isStringMap(recovery.identityCapabilities) && isStringMapWithStateKinds(recovery.recoveries, RECOVERY_STATE_KINDS) && isStringMap(recovery.recoverySessions) && isStringMapWithStateKinds(exportState.exports, EXPORT_STATE_KINDS) && isWalletOwnershipMap(exportState.authorizationNonceOwners) && isWalletOwnershipMap(exportState.authorizationUncertainOwners);
120
+ return isStringMapWithStateKinds(registration.states, REGISTRATION_STATE_KINDS) && isStringMap(registration.lifecycleSessions) && (registration.admissionClaims === void 0 || isStringMapWithStateKinds(registration.admissionClaims, REGISTRATION_ADMISSION_CLAIM_KINDS)) && isDispatchRootMap(registration.dispatchRoots) && Array.isArray(authorization.authorities) && authorization.authorities.every(hasIntentAuthorityGeneration) && isStringMapWithStateKinds(recovery.capabilities, CAPABILITY_STATE_KINDS) && isStringMap(recovery.identityCapabilities) && isStringMapWithStateKinds(recovery.recoveries, RECOVERY_STATE_KINDS) && hasRecoveryOwnershipGenerations(recovery.recoveries) && isStringMap(recovery.recoverySessions) && isStringMapWithStateKinds(exportState.exports, EXPORT_STATE_KINDS) && hasExportOwnershipGenerations(exportState.exports) && isWalletOwnershipMap(exportState.authorizationNonceOwners) && isWalletOwnershipMap(exportState.authorizationUncertainOwners);
104
121
  }
105
122
  function parseRouterAbEd25519YaoProductRegistrationStateV1(input) {
106
123
  if (!hasProductStateCollections(input)) return {
@@ -202,17 +219,26 @@ var RouterAbEd25519YaoProductRegistrationRuntime = class {
202
219
  async bindVerifiedIntent(input) {
203
220
  return await this.input.authorization.bindVerifiedIntent(input);
204
221
  }
222
+ /** The registration service of this runtime resolves the tenant root when it executes. */
223
+ startRegistrationDispatchRoot() {
224
+ return null;
225
+ }
205
226
  async bindAndAdmitVerifiedRegistration(input) {
206
- const bound = await this.input.authorization.bindVerifiedIntent(input);
227
+ const bound = await this.input.authorization.bindAndAuthorizeAdmission(input);
207
228
  if (!bound.ok) return bound;
208
- return await this.input.registrationService.admit(bound.admissionRequest);
229
+ const admitted = await this.input.registrationService.admit(bound.admissionRequest);
230
+ if (!admitted.ok) return admitted;
231
+ return {
232
+ ok: true,
233
+ status: 200,
234
+ admissionRequest: bound.admissionRequest,
235
+ value: admitted.value,
236
+ companionWrite: "not_committed"
237
+ };
209
238
  }
210
239
  async consumeActivated(request) {
211
240
  return await this.input.registrationService.consumeActivated(request);
212
241
  }
213
- async installRegistrationFinalizeCapability(input) {
214
- return await this.input.capabilityInstaller.installRegistrationFinalizeCapability(input);
215
- }
216
242
  async installPersistedActiveCapability(input) {
217
243
  return await this.input.capabilityInstaller.installPersistedActiveCapability(input);
218
244
  }
@@ -1,7 +1,7 @@
1
+ import { buildRouterAbEd25519YaoRegistrationExecutionAuthorityV1 } from "../registration/routerAbEd25519YaoRegistrationExecutionRecord.js";
1
2
  import { createRouterAbEd25519YaoProductRegistrationStateV1 } from "./routerAbEd25519YaoProductRegistration.js";
2
3
  import { encodeRouterAbEd25519YaoProductRegistrationStateV1, parseRouterAbEd25519YaoProductRegistrationStateJsonV1 } from "./routerAbEd25519YaoProductRegistrationPersistence.js";
3
4
  import { boundedRouterAbEd25519YaoProductRegistrationSharedStateV1, mergeRouterAbEd25519YaoProductRegistrationStatePartitionV1, partitionRouterAbEd25519YaoProductRegistrationStateV1 } from "./routerAbEd25519YaoProductRegistrationPartitioning.js";
4
- import { buildRouterAbEd25519YaoRegistrationExecutionAuthorityV1 } from "../registration/routerAbEd25519YaoRegistrationExecutionRecord.js";
5
5
  //#region src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.ts
6
6
  const ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1 = "router-ab-ed25519-yao:shared";
7
7
  const PARTITION_RECORD_CODEC_KIND = "router_ab_ed25519_yao_product_registration_partition_record_json_v1";
@@ -159,6 +159,66 @@ var RouterAbEd25519YaoProductRegistrationPartitionedStateStore = class {
159
159
  });
160
160
  return await this.store.putMany(encodedMutations, companion);
161
161
  }
162
+ async loadCapabilities() {
163
+ return readSharedRecord(readManyEntry(await this.readMany([ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1]), ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1));
164
+ }
165
+ async commitCapabilities(snapshot, mutation, companionWrite) {
166
+ const shared = boundedRouterAbEd25519YaoProductRegistrationSharedStateV1({
167
+ kind: "router_ab_ed25519_yao_product_registration_shared_state_v1",
168
+ recoveryCapabilities: mutation.capabilities,
169
+ recoveryIdentityCapabilities: mutation.identityCapabilities,
170
+ recoverySessions: snapshot.value.recoverySessions,
171
+ exportAuthorizationNonceOwners: snapshot.value.exportAuthorizationNonceOwners,
172
+ exportAuthorizationUncertainOwners: snapshot.value.exportAuthorizationUncertainOwners
173
+ });
174
+ if (companionWrite === null && sameRouterAbEd25519YaoSharedStateCanonicalEncodingV1(encodeSharedStateCanonicalEncoding(shared), encodeSharedStateCanonicalEncoding(snapshot.value))) return {
175
+ kind: "stored",
176
+ versions: []
177
+ };
178
+ return await this.putMany([{
179
+ key: ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1,
180
+ expectedVersion: snapshot.version,
181
+ value: {
182
+ kind: SHARED_RECORD_KIND,
183
+ value: shared
184
+ }
185
+ }], companionWrite);
186
+ }
187
+ async loadRegistration(lifecycleId) {
188
+ const normalizedLifecycleId = requireLifecycleId(lifecycleId);
189
+ const ceremony = readCeremonyRecord(readManyEntry(await this.readMany([normalizedLifecycleId]), normalizedLifecycleId), normalizedLifecycleId);
190
+ const state = materializeState(readSharedRecord({ kind: "missing" }).value, ceremony.value);
191
+ return {
192
+ lifecycleId: normalizedLifecycleId,
193
+ state: {
194
+ registration: state.registration,
195
+ authorization: state.authorization
196
+ },
197
+ baseline: {
198
+ version: ceremony.version,
199
+ recovery: ceremony.value.recovery,
200
+ export: ceremony.value.export
201
+ }
202
+ };
203
+ }
204
+ async commitRegistration(snapshot, companionWrite) {
205
+ return await this.putMany([{
206
+ key: snapshot.lifecycleId,
207
+ expectedVersion: snapshot.baseline.version,
208
+ value: {
209
+ kind: CEREMONY_RECORD_KIND,
210
+ lifecycleId: snapshot.lifecycleId,
211
+ value: {
212
+ kind: "router_ab_ed25519_yao_product_registration_ceremony_state_v1",
213
+ lifecycleId: snapshot.lifecycleId,
214
+ registration: snapshot.state.registration,
215
+ authorization: snapshot.state.authorization,
216
+ recovery: snapshot.baseline.recovery,
217
+ export: snapshot.baseline.export
218
+ }
219
+ }
220
+ }], companionWrite);
221
+ }
162
222
  async load(lifecycleId) {
163
223
  const normalizedLifecycleId = requireLifecycleId(lifecycleId);
164
224
  const entries = await this.readMany([ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, normalizedLifecycleId]);
@@ -9,7 +9,10 @@ function createRouterAbEd25519YaoCeremonyStateStoreV1(store) {
9
9
  put: async (key, value, expectedVersion) => await store.put(key.lifecycleId, value, expectedVersion)
10
10
  };
11
11
  }
12
- const CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v1";
12
+ const CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v4";
13
+ const RECOVERY_GENERATION_CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v3";
14
+ const REGISTRATION_GENERATION_CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v2";
15
+ const FIXED_HOME_CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v1";
13
16
  const MAP_KIND = "map_v1";
14
17
  const SET_KIND = "set_v1";
15
18
  const BYTES_KIND = "bytes_v1";
@@ -23,12 +26,76 @@ function encodeRouterAbEd25519YaoProductRegistrationStateV1(state) {
23
26
  }
24
27
  function parseRouterAbEd25519YaoProductRegistrationStateJsonV1(input) {
25
28
  const record = exactRouterAbEd25519YaoProductRegistrationStateEnvelopeV1(input);
26
- if (record === null || record.kind !== CODEC_KIND) return null;
29
+ if (record === null || record.kind !== CODEC_KIND && record.kind !== FIXED_HOME_CODEC_KIND && record.kind !== REGISTRATION_GENERATION_CODEC_KIND && record.kind !== RECOVERY_GENERATION_CODEC_KIND) return null;
27
30
  const decoded = decodeRouterAbEd25519YaoProductRegistrationStateValueV1(record.state);
28
31
  if (!decoded.ok || !isRouterAbEd25519YaoProductRegistrationJsonObjectV1(decoded.value)) return null;
29
- const parsed = parseRouterAbEd25519YaoProductRegistrationStateV1(decoded.value);
32
+ const state = record.kind === FIXED_HOME_CODEC_KIND ? normalizeFixedHomeAuthorities(decoded.value) : decoded.value;
33
+ const recoveryNormalized = record.kind === CODEC_KIND || record.kind === RECOVERY_GENERATION_CODEC_KIND ? state : normalizeFixedHomeRecoveries(state);
34
+ const parsed = parseRouterAbEd25519YaoProductRegistrationStateV1(record.kind === CODEC_KIND ? recoveryNormalized : normalizeFixedHomeExports(recoveryNormalized));
30
35
  return parsed.ok ? parsed.value : null;
31
36
  }
37
+ function normalizeFixedHomeAuthority(input) {
38
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
39
+ if (Object.prototype.hasOwnProperty.call(input, "ownershipGeneration")) return input;
40
+ return {
41
+ ...input,
42
+ ownershipGeneration: 1
43
+ };
44
+ }
45
+ function normalizeFixedHomeAuthorities(state) {
46
+ const authorization = state.authorization;
47
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(authorization)) return state;
48
+ if (!Array.isArray(authorization.authorities)) return state;
49
+ return {
50
+ ...state,
51
+ authorization: {
52
+ ...authorization,
53
+ authorities: authorization.authorities.map(normalizeFixedHomeAuthority)
54
+ }
55
+ };
56
+ }
57
+ function normalizeFixedHomeRecovery(input) {
58
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
59
+ const context = input.context;
60
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(context)) return input;
61
+ return {
62
+ ...input,
63
+ context: {
64
+ ...context,
65
+ authorization: normalizeFixedHomeAuthority(context.authorization)
66
+ }
67
+ };
68
+ }
69
+ function normalizeFixedHomeRecoveries(input) {
70
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
71
+ const recovery = input.recovery;
72
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(recovery)) return input;
73
+ if (!(recovery.recoveries instanceof Map)) return input;
74
+ const recoveries = /* @__PURE__ */ new Map();
75
+ for (const [key, value] of recovery.recoveries) recoveries.set(key, normalizeFixedHomeRecovery(value));
76
+ return {
77
+ ...input,
78
+ recovery: {
79
+ ...recovery,
80
+ recoveries
81
+ }
82
+ };
83
+ }
84
+ function normalizeFixedHomeExports(input) {
85
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
86
+ const exportState = input.export;
87
+ if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(exportState)) return input;
88
+ if (!(exportState.exports instanceof Map)) return input;
89
+ const exports = /* @__PURE__ */ new Map();
90
+ for (const [key, value] of exportState.exports) exports.set(key, normalizeFixedHomeAuthority(value));
91
+ return {
92
+ ...input,
93
+ export: {
94
+ ...exportState,
95
+ exports
96
+ }
97
+ };
98
+ }
32
99
  function parseRouterAbEd25519YaoCeremonyKeyV1(input) {
33
100
  const record = readRouterAbEd25519YaoCeremonyKeyObjectV1(input);
34
101
  if (record === null) return null;
@@ -1,21 +1,14 @@
1
1
  import { InMemoryRouterAbEd25519YaoRegistrationService } from "../registration/routerAbEd25519YaoRegistration.js";
2
2
  import { InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter } from "../registration/routerAbEd25519YaoRegistrationIntentAuthorization.js";
3
- import { InMemoryRouterAbEd25519YaoRecoveryService } from "../recovery/routerAbEd25519YaoRecovery.js";
4
- import { routerAbEd25519YaoPersistedCapabilityMatchesLookupV1 } from "./routerAbEd25519YaoProductRegistration.js";
5
- import { parseRouterAbEd25519YaoRegistrationRouterAnswerV1 } from "../registration/routerAbEd25519YaoHttpRegistrationBackend.js";
6
3
  import { pinRouterAbEd25519YaoRegistrationDispatchRootV1, routerAbEd25519YaoRegistrationExecuteRequestFromRouterRequestJsonV1, routerAbEd25519YaoRegistrationResultFromRouterAnswerV1 } from "../registration/routerAbEd25519YaoRegistrationExecutionRecord.js";
4
+ import { resolveRouterAbEd25519YaoActiveCapability } from "../recovery/routerAbEd25519YaoRecovery.js";
5
+ import { routerAbEd25519YaoRegistrationSigningRootIdV1 } from "../routerAbEd25519YaoGatewayEnvelope.js";
6
+ import { routerAbEd25519YaoPersistedCapabilityMatchesLookupV1 } from "./routerAbEd25519YaoProductRegistration.js";
7
7
  import { routerAbEd25519YaoAdmittedRegistrationAuthorityV1 } from "./routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
8
+ import { parseRouterAbEd25519YaoRegistrationRouterAnswerV1 } from "../registration/routerAbEd25519YaoHttpRegistrationBackend.js";
9
+ import { rehydrateRouterAbEd25519YaoCapability } from "./routerAbEd25519YaoCapabilityCommit.js";
8
10
  //#region src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.ts
9
- const SHARED_CAPABILITY_READ_LIFECYCLE_ID = "shared-capability-read";
10
11
  const MAX_DETERMINISTIC_COMMIT_ATTEMPTS = 2;
11
- const UNUSED_BACKEND = {
12
- admit: rejectUnusedBackend,
13
- execute: rejectUnusedBackend,
14
- admitRecovery: rejectUnusedBackend,
15
- resolveRecoveryDispatchRoot: rejectUnusedBackend,
16
- executeRecovery: rejectUnusedBackend,
17
- activateRecovery: rejectUnusedBackend
18
- };
19
12
  /**
20
13
  * Product-state runtime for wallet start/finalize routes. Each mutation loads
21
14
  * fresh partitioned state and reconciles CAS conflicts by reapplying only the
@@ -33,11 +26,28 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
33
26
  if (!this.signingWorkerId) throw new Error("Ed25519 Yao SigningWorker ID is required");
34
27
  }
35
28
  async bindVerifiedIntent(input) {
36
- return await this.commitUntilReconciled(input.admissionRequest.scope.lifecycle_id, bindVerifiedIntentMutation.bind(void 0, input));
29
+ for (let attempt = 0; attempt < MAX_DETERMINISTIC_COMMIT_ATTEMPTS; attempt += 1) {
30
+ const loaded = await this.input.store.loadRegistration(input.admissionRequest.scope.lifecycle_id);
31
+ const result = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(loaded.state.authorization).bindVerifiedIntent(input);
32
+ if (!result.ok) return result;
33
+ if ((await this.input.store.commitRegistration(loaded, null)).kind !== "stored") continue;
34
+ return result;
35
+ }
36
+ throw new Error("Registration intent remained contended after one reconciliation");
37
+ }
38
+ startRegistrationDispatchRoot(signingRootId) {
39
+ const dispatchRoot = this.input.registrationBackend.resolveRegistrationDispatchRoot(signingRootId);
40
+ dispatchRoot.catch(ignoreUnobservedDispatchRoot);
41
+ return {
42
+ signingRootId,
43
+ dispatchRoot
44
+ };
37
45
  }
38
- async bindAndAdmitVerifiedRegistration(input) {
46
+ async bindAndAdmitVerifiedRegistration(input, companionWrite, startedDispatchRoot) {
39
47
  return await bindAndAdmitVerifiedRegistration({
40
48
  input,
49
+ companionWrite,
50
+ startedDispatchRoot,
41
51
  store: this.input.store,
42
52
  backend: this.input.registrationBackend
43
53
  });
@@ -51,7 +61,7 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
51
61
  */
52
62
  async consumeActivated(input) {
53
63
  const lifecycleId = input.reference.lifecycleId;
54
- const authority = routerAbEd25519YaoAdmittedRegistrationAuthorityV1((await this.input.store.load(lifecycleId)).state, lifecycleId);
64
+ const authority = routerAbEd25519YaoAdmittedRegistrationAuthorityV1((await this.input.store.loadRegistration(lifecycleId)).state, lifecycleId);
55
65
  if (!authority) return {
56
66
  ok: false,
57
67
  code: "unknown_registration",
@@ -59,9 +69,7 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
59
69
  };
60
70
  const backend = this.input.registrationBackend;
61
71
  const consumed = await backend.consumeRegistration({
62
- tenantRoot: authority.dispatchRoot,
63
- walletId: authority.admissionReceipt.binding.lifecycle.account_id,
64
- lifecycleId,
72
+ authority,
65
73
  sessionId: input.reference.sessionId,
66
74
  consumerBinding: input.consumerBinding
67
75
  });
@@ -91,14 +99,11 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
91
99
  }
92
100
  };
93
101
  }
94
- async installRegistrationFinalizeCapability(input) {
95
- return await this.commitUntilReconciled(input.registrationAdmissionRequest.scope.lifecycle_id, installRegistrationFinalizeCapabilityMutation.bind(void 0, input));
96
- }
97
102
  async installPersistedActiveCapability(input) {
98
- return await this.commitUntilReconciled(input.admissionRequest.scope.lifecycle_id, installPersistedActiveCapabilityMutation.bind(void 0, input));
103
+ return await rehydrateRouterAbEd25519YaoCapability(this.input.store, input);
99
104
  }
100
105
  async resolveActiveCapability(input) {
101
- const result = recoveryService((await this.input.store.load(SHARED_CAPABILITY_READ_LIFECYCLE_ID)).state).resolveActiveCapability(input);
106
+ const result = resolveRouterAbEd25519YaoActiveCapability((await this.input.store.loadCapabilities()).value.recoveryCapabilities, input);
102
107
  if (result.ok || result.code !== "unknown_capability" || !this.input.loadPersistedActiveCapability) return result;
103
108
  const persisted = await this.input.loadPersistedActiveCapability(input);
104
109
  if (!persisted || !routerAbEd25519YaoPersistedCapabilityMatchesLookupV1(persisted, input)) return result;
@@ -108,48 +113,52 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
108
113
  code: "capability_conflict",
109
114
  message: installed.message
110
115
  };
111
- return recoveryService((await this.input.store.load(SHARED_CAPABILITY_READ_LIFECYCLE_ID)).state).resolveActiveCapability(input);
112
- }
113
- async commitUntilReconciled(lifecycleId, mutate) {
114
- for (let attempt = 0; attempt < MAX_DETERMINISTIC_COMMIT_ATTEMPTS; attempt += 1) {
115
- const loaded = await this.input.store.load(lifecycleId);
116
- const mutation = await mutate(loaded.state);
117
- if (mutation.kind === "reject") return mutation.value;
118
- if ((await this.input.store.commit(commitInput(lifecycleId, loaded))).kind === "stored") return mutation.value;
119
- }
120
- throw new Error("Request-scoped product state remained contended after one reconciliation");
116
+ return resolveRouterAbEd25519YaoActiveCapability((await this.input.store.loadCapabilities()).value.recoveryCapabilities, input);
121
117
  }
122
118
  };
123
119
  /**
124
120
  * Binds a verified intent and admits its registration. The tenant root the
125
121
  * registration dispatches to is resolved once, for a fresh admission, and
126
- * pinned with the admission in the ceremony record.
122
+ * pinned with the admission in the ceremony record. A companion write commits
123
+ * in that record's batch.
127
124
  */
128
125
  async function bindAndAdmitVerifiedRegistration(input) {
129
126
  const lifecycleId = input.input.admissionRequest.scope.lifecycle_id;
130
127
  let backendResult = null;
131
128
  let dispatchRoot = null;
132
129
  for (let attempt = 0; attempt < MAX_DETERMINISTIC_COMMIT_ATTEMPTS; attempt += 1) {
133
- const loaded = await input.store.load(lifecycleId);
134
- const bound = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(loaded.state.authorization).bindVerifiedIntent(input.input);
130
+ const loaded = await input.store.loadRegistration(lifecycleId);
131
+ const bound = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(loaded.state.authorization).bindAndAuthorizeAdmission(input.input);
135
132
  if (!bound.ok) return bound;
136
133
  const service = new InMemoryRouterAbEd25519YaoRegistrationService(input.backend, loaded.state.registration);
137
134
  const preparation = service.prepareAdmit(bound.admissionRequest);
138
135
  if (preparation.kind === "completed") return {
139
136
  ok: true,
140
137
  status: 200,
141
- value: preparation.value
138
+ admissionRequest: bound.admissionRequest,
139
+ value: preparation.value,
140
+ companionWrite: "not_committed"
142
141
  };
143
142
  if (preparation.kind === "failed") return preparation.failure;
144
- if (dispatchRoot === null) try {
145
- dispatchRoot = await input.backend.resolveRegistrationDispatchRoot(bound.admissionRequest);
146
- } catch (error) {
147
- return {
143
+ if (dispatchRoot === null) {
144
+ const signingRootId = routerAbEd25519YaoRegistrationSigningRootIdV1(bound.admissionRequest);
145
+ const started = input.startedDispatchRoot;
146
+ if (started !== null && (started.signingRootId.signing_root_id !== signingRootId.signing_root_id || started.signingRootId.root_share_epoch !== signingRootId.root_share_epoch)) return {
148
147
  ok: false,
149
148
  status: 503,
150
149
  code: "admission_failed",
151
- message: `registration tenant root is unavailable: ${error instanceof Error ? error.message : String(error)}`
150
+ message: "registration tenant root was read for another signing root ID"
152
151
  };
152
+ try {
153
+ dispatchRoot = await (started ? started.dispatchRoot : input.backend.resolveRegistrationDispatchRoot(signingRootId));
154
+ } catch (error) {
155
+ return {
156
+ ok: false,
157
+ status: 503,
158
+ code: "admission_failed",
159
+ message: `registration tenant root is unavailable: ${error instanceof Error ? error.message : String(error)}`
160
+ };
161
+ }
153
162
  }
154
163
  if (backendResult === null) try {
155
164
  backendResult = await input.backend.admit(bound.admissionRequest);
@@ -171,7 +180,13 @@ async function bindAndAdmitVerifiedRegistration(input) {
171
180
  });
172
181
  if (!admitted.ok) return admitted;
173
182
  pinRouterAbEd25519YaoRegistrationDispatchRootV1(loaded.state.registration, lifecycleId, dispatchRoot);
174
- if ((await input.store.commit(commitInput(lifecycleId, loaded))).kind === "stored") return admitted;
183
+ if ((await input.store.commitRegistration(loaded, input.companionWrite?.(bound.admissionRequest) ?? null)).kind === "stored") return {
184
+ ok: true,
185
+ status: 200,
186
+ admissionRequest: bound.admissionRequest,
187
+ value: admitted.value,
188
+ companionWrite: input.companionWrite ? "committed" : "not_committed"
189
+ };
175
190
  }
176
191
  return {
177
192
  ok: false,
@@ -180,50 +195,7 @@ async function bindAndAdmitVerifiedRegistration(input) {
180
195
  message: "Yao verified registration admission remained contended after one reconciliation"
181
196
  };
182
197
  }
183
- async function bindVerifiedIntentMutation(input, state) {
184
- const result = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(state.authorization).bindVerifiedIntent(input);
185
- return result.ok ? {
186
- kind: "commit",
187
- value: result
188
- } : {
189
- kind: "reject",
190
- value: result
191
- };
192
- }
193
- async function installRegistrationFinalizeCapabilityMutation(input, state) {
194
- const result = recoveryService(state).installRegistrationFinalizeCapability(input);
195
- return result.ok ? {
196
- kind: "commit",
197
- value: result
198
- } : {
199
- kind: "reject",
200
- value: result
201
- };
202
- }
203
- async function installPersistedActiveCapabilityMutation(input, state) {
204
- const result = recoveryService(state).installPersistedActiveCapability(input);
205
- return result.ok ? {
206
- kind: "commit",
207
- value: result
208
- } : {
209
- kind: "reject",
210
- value: result
211
- };
212
- }
213
- function recoveryService(state) {
214
- return new InMemoryRouterAbEd25519YaoRecoveryService(UNUSED_BACKEND, state.recovery);
215
- }
216
- function commitInput(lifecycleId, loaded) {
217
- return {
218
- lifecycleId,
219
- state: loaded.state,
220
- baseline: loaded.baseline,
221
- companionWrite: null
222
- };
223
- }
224
- async function rejectUnusedBackend() {
225
- throw new Error("Request-scoped product runtime invoked an unavailable protocol backend");
226
- }
198
+ function ignoreUnobservedDispatchRoot() {}
227
199
  //#endregion
228
200
  export { createRouterAbEd25519YaoProductRegistrationRequestScopedRuntimeV1 };
229
201