@seams/wallet-server 0.7.1 → 0.7.3

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 (259) hide show
  1. package/THIRD_PARTY_NOTICES.md +1 -105
  2. package/artifact-manifest.json +21 -21
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  5. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  6. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  7. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  8. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  9. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  11. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  12. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  14. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  15. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  16. package/dist/esm/authorization/service.js +8 -0
  17. package/dist/esm/authorization/vaultProxyUse.js +2 -6
  18. package/dist/esm/cloud-host.js +4 -4
  19. package/dist/esm/core/IdentityStore.js +23 -110
  20. package/dist/esm/core/SessionService.js +7 -30
  21. package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +3 -10
  22. package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +21 -97
  23. package/dist/esm/core/ThresholdService/stores/exportReplayGuard.js +7 -0
  24. package/dist/esm/core/WalletStore.js +4 -6
  25. package/dist/esm/core/authService/bytes.js +1 -4
  26. package/dist/esm/core/authService/emailOtpChallengeOperations.js +2 -5
  27. package/dist/esm/core/authService/emailOtpChallengeProof.js +9 -40
  28. package/dist/esm/core/authService/emailOtpChallengeVerification.js +19 -90
  29. package/dist/esm/core/authService/emailOtpChallenges.js +10 -45
  30. package/dist/esm/core/authService/emailOtpDelivery.js +10 -45
  31. package/dist/esm/core/authService/emailOtpEnrollment.js +9 -40
  32. package/dist/esm/core/authService/emailOtpGrant.js +9 -40
  33. package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +9 -40
  34. package/dist/esm/core/authService/emailOtpSeal.js +5 -20
  35. package/dist/esm/core/authService/emailOtpUnlock.js +20 -110
  36. package/dist/esm/core/authService/googleEmailOtpRegistration.js +28 -115
  37. package/dist/esm/core/authService/identity.js +5 -20
  38. package/dist/esm/core/authService/nearPublicKeyMetadata.js +6 -25
  39. package/dist/esm/core/authService/oidcVerification.js +22 -34
  40. package/dist/esm/core/authService/rateLimits.js +2 -5
  41. package/dist/esm/core/authService/thresholdEcdsaKeyInventory.js +2 -1
  42. package/dist/esm/core/authService/webauthn.js +37 -191
  43. package/dist/esm/core/authService/webauthnVerificationOutcomes.js +5 -24
  44. package/dist/esm/core/d1EcdsaSignerRead.js +76 -0
  45. package/dist/esm/core/d1IdentityStore.js +16 -75
  46. package/dist/esm/core/d1TenantStore.js +1 -1
  47. package/dist/esm/core/d1WalletStore.js +15 -25
  48. package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +1 -5
  49. package/dist/esm/core/deviceLinking/linkedDeviceSessionApproval.js +1 -3
  50. package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -8
  51. package/dist/esm/core/deviceLinking/requestProof.js +13 -4
  52. package/dist/esm/core/ecdsaMaterialReadSnapshot.js +85 -0
  53. package/dist/esm/core/nearRelayerAccountProvisioning.js +2 -5
  54. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +3 -6
  55. package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +2 -5
  56. package/dist/esm/core/storeBackends.js +1 -1
  57. package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -3
  58. package/dist/esm/hosted-wallet-gateway.js +2 -2
  59. package/dist/esm/localHostedWalletGatewayHandler.js +13 -0
  60. package/dist/esm/localIntendedMaterialAdmissionFault.js +176 -0
  61. package/dist/esm/localIntendedPresignCancellation.js +44 -0
  62. package/dist/esm/router/auth/commonRouterUtils.js +24 -10
  63. package/dist/esm/router/auth/walletSessionFailure.js +2 -5
  64. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +4 -15
  65. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +1 -0
  66. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.js +2 -6
  67. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +5 -27
  68. package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +76 -0
  69. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +28 -21
  70. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +209 -44
  71. package/dist/esm/router/cloudflare/d1/authorization/d1VaultProxyStore.js +8 -12
  72. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +50 -8
  73. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
  74. package/dist/esm/router/cloudflare/d1/deviceLinking/index.js +3 -3
  75. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +12 -55
  76. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +17 -80
  77. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.js +6 -25
  78. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +12 -47
  79. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +24 -85
  80. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +7 -30
  81. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +5 -20
  82. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +23 -110
  83. package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +9 -40
  84. package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +3 -10
  85. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +18 -91
  86. package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +6 -30
  87. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +4 -15
  88. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +2 -7
  89. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.js +9 -13
  90. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.js +11 -50
  91. package/dist/esm/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.js +5 -20
  92. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +4 -7
  93. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +2 -1
  94. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +7 -30
  95. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +32 -22
  96. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +1 -4
  97. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +119 -25
  98. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +31 -168
  99. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +6 -9
  100. package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +59 -66
  101. package/dist/esm/router/cloudflare/runtime/routerAbPrewarm.js +2 -2
  102. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +5 -20
  103. package/dist/esm/router/cloudflare/runtime/tenantRootCreationGrant.js +2 -9
  104. package/dist/esm/router/cloudflare/runtime/walletControlOps.js +2 -1
  105. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +2 -1
  106. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +2 -2
  107. package/dist/esm/router/cloudflare.js +2146 -1802
  108. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +5 -8
  109. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +3 -6
  110. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +6 -25
  111. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +39 -55
  112. package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +15 -62
  113. package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +83 -74
  114. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +1 -0
  115. package/dist/esm/router/domains/signingOperations/routerAbOperationStepUp.js +1 -0
  116. package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +1 -4
  117. package/dist/esm/router/domains/tenantRoot/tenantRootIdentityResolution.js +7 -13
  118. package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +41 -200
  119. package/dist/esm/router/express.js +317 -699
  120. package/dist/esm/router/framework/http.js +5 -1
  121. package/dist/esm/router/framework/runtimeSnapshotConsumer.js +8 -35
  122. package/dist/esm/router/transport/fetch/createFetchRouter.js +3 -6
  123. package/dist/esm/router/transport/fetch/routes/auth.js +9 -41
  124. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +5 -22
  125. package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +4 -16
  126. package/dist/esm/router/transport/fetch/routes/sessions.js +1 -0
  127. package/dist/esm/router/transport/fetch/routes/syncAccount.js +8 -36
  128. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +27 -79
  129. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +4 -1
  130. package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +4 -16
  131. package/dist/esm/shared-ts/src/authorization/walletSignerActivationEquality.js +12 -0
  132. package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +2 -5
  133. package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +1 -5
  134. package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +12 -16
  135. package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +5 -8
  136. package/dist/esm/shared-ts/src/passkey-custody/primitives.js +5 -1
  137. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +4 -8
  138. package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentifier.js +12 -0
  139. package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentity.js +2 -9
  140. package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -4
  141. package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +2 -4
  142. package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +0 -1
  143. package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +3 -1
  144. package/dist/esm/shared-ts/src/utils/exactKeys.js +17 -0
  145. package/dist/esm/shared-ts/src/utils/failure.js +20 -0
  146. package/dist/esm/shared-ts/src/utils/registrationIntent.js +3 -12
  147. package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +2 -5
  148. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
  149. package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +1 -1
  150. package/dist/esm/shared-ts/src/utils/thresholdEcdsaChainTarget.js +9 -0
  151. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +1 -4
  152. package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +10 -32
  153. package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +3 -3
  154. package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +3 -9
  155. package/dist/esm/threshold/session/signingSessionSeal/service.js +8 -35
  156. package/dist/esm/threshold/session/signingSessionSeal/transport/express.js +18 -94
  157. package/dist/esm/threshold/session/signingSessionSeal/transport/fetch.js +6 -30
  158. package/dist/esm/threshold/session/signingSessionSeal/transport/shared.js +5 -20
  159. package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
  160. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  161. package/dist/types/shared-ts/src/authorization/delegatedAuthority.d.ts +2 -1
  162. package/dist/types/shared-ts/src/authorization/walletSessionIssuance.d.ts +9 -2
  163. package/dist/types/shared-ts/src/authorization/walletSignerActivationEquality.d.ts +4 -0
  164. package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +3 -4
  165. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +5 -63
  166. package/dist/types/shared-ts/src/device-linking/sourceContribution.d.ts +2 -0
  167. package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +5 -12
  168. package/dist/types/shared-ts/src/passkey-custody/primitives.d.ts +9 -0
  169. package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +11 -1
  170. package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +1 -10
  171. package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +3 -5
  172. package/dist/types/shared-ts/src/tenant-root/tenantRootIdentifier.d.ts +3 -0
  173. package/dist/types/shared-ts/src/tenant-root/tenantRootOperationRecord.d.ts +2 -1
  174. package/dist/types/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.d.ts +6 -0
  175. package/dist/types/shared-ts/src/threshold/signingRootScope.d.ts +1 -0
  176. package/dist/types/shared-ts/src/utils/ecdsaKeyFactsInventory.d.ts +2 -11
  177. package/dist/types/shared-ts/src/utils/eip1559TxWasmJson.d.ts +16 -0
  178. package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +2 -0
  179. package/dist/types/shared-ts/src/utils/exactKeys.d.ts +11 -0
  180. package/dist/types/shared-ts/src/utils/failure.d.ts +12 -0
  181. package/dist/types/shared-ts/src/utils/jsonRpc.d.ts +3 -4
  182. package/dist/types/shared-ts/src/utils/nearRpcResults.d.ts +1 -0
  183. package/dist/types/shared-ts/src/utils/registrationAuthMethodInput.d.ts +3 -8
  184. package/dist/types/shared-ts/src/utils/registrationSignerPlan.d.ts +7 -19
  185. package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.d.ts +3 -1
  186. package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.d.ts +1 -0
  187. package/dist/types/shared-ts/src/utils/routerAbEd25519YaoDigests.d.ts +3 -4
  188. package/dist/types/shared-ts/src/utils/routerAbNormalSigningIdentity.d.ts +30 -8
  189. package/dist/types/shared-ts/src/utils/routerApiKeyAuth.d.ts +2 -0
  190. package/dist/types/shared-ts/src/utils/signingSessionSeal.d.ts +10 -11
  191. package/dist/types/shared-ts/src/utils/thresholdEcdsaChainTarget.d.ts +25 -0
  192. package/dist/types/shared-ts/src/utils/variant.d.ts +18 -0
  193. package/dist/types/shared-ts/src/utils/walletAuthMethodRecord.d.ts +3 -6
  194. package/dist/types/shared-ts/src/utils/webauthnDeviceInfo.d.ts +4 -2
  195. package/dist/types/shared-ts/src/wallet-recovery/recoveryEnvelopes.d.ts +3 -16
  196. package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryPreparation.d.ts +15 -0
  197. package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.d.ts +3 -4
  198. package/dist/types/wallet-server/src/authorization/domain.d.ts +13 -2
  199. package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +27 -3
  200. package/dist/types/wallet-server/src/authorization/service.d.ts +19 -0
  201. package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +2 -2
  202. package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +1 -1
  203. package/dist/types/wallet-server/src/core/ThresholdService/stores/exportReplayGuard.d.ts +3 -0
  204. package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +8 -101
  205. package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +8 -0
  206. package/dist/types/wallet-server/src/core/authService/bytes.d.ts +0 -1
  207. package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +2 -10
  208. package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +1 -1
  209. package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +3 -10
  210. package/dist/types/wallet-server/src/core/d1EcdsaSignerRead.d.ts +39 -0
  211. package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +10 -0
  212. package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSessionRecord.d.ts +3 -4
  213. package/dist/types/wallet-server/src/core/ecdsaMaterialReadSnapshot.d.ts +19 -0
  214. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +3 -5
  215. package/dist/types/wallet-server/src/core/rpcClients/near/NearClient.d.ts +1 -2
  216. package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +2 -11
  217. package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +2 -19
  218. package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +3 -11
  219. package/dist/types/wallet-server/src/core/types.d.ts +2 -6
  220. package/dist/types/wallet-server/src/localIntendedMaterialAdmissionFault.d.ts +38 -0
  221. package/dist/types/wallet-server/src/localIntendedPresignCancellation.d.ts +4 -0
  222. package/dist/types/wallet-server/src/router/auth/authRequestValidation.d.ts +4 -9
  223. package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +15 -1
  224. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.d.ts +0 -1
  225. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +1 -1
  226. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +9 -0
  227. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/authorizedOperationStatements.d.ts +4 -0
  228. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +10 -1
  229. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +19 -2
  230. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +2 -6
  231. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.d.ts +5 -8
  232. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.d.ts +2 -8
  233. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +2 -9
  234. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +5 -5
  235. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.d.ts +4 -14
  236. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +2 -6
  237. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +8 -6
  238. package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +14 -1
  239. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +10 -39
  240. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +8 -34
  241. package/dist/types/wallet-server/src/router/domains/ecdsa/thresholdEcdsaRequestValidation.d.ts +3 -15
  242. package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.d.ts +9 -50
  243. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryKeyManifest.d.ts +1 -13
  244. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.d.ts +8 -9
  245. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +13 -0
  246. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbOperationStepUp.d.ts +3 -4
  247. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +7 -16
  248. package/dist/types/wallet-server/src/router/domains/syncAccount/syncAccountRequestValidation.d.ts +2 -7
  249. package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +3 -1
  250. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +25 -4
  251. package/dist/types/wallet-server/src/router/framework/http.d.ts +1 -0
  252. package/dist/types/wallet-server/src/router/framework/ror/normalize.d.ts +1 -9
  253. package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.d.ts +3 -6
  254. package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccountBootstrap.d.ts +3 -5
  255. package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +0 -1
  256. package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyRecords.d.ts +1 -2
  257. package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.types.d.ts +6 -8
  258. package/package.json +1 -1
  259. package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker_bg.wasm +0 -0
@@ -2,7 +2,9 @@ import "./shared-ts/src/utils/routerAbEd25519Yao.js";
2
2
  import { WALLET_CONSOLE_OP_PATHS_V1 } from "./router/cloudflare/runtime/walletConsoleOps.js";
3
3
  import { createStaticWalletConsoleBindingV1, parseStaticWalletConsoleBindingConfigV1 } from "./router/cloudflare/runtime/staticWalletConsoleBinding.js";
4
4
  import { handleSplitGatewayRequest } from "./hosted-wallet-gateway.js";
5
+ import { localPresignCancellationProbe } from "./localIntendedPresignCancellation.js";
5
6
  import { LOCAL_INTENDED_YAO_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoFaultControllerV1, parseLocalIntendedYaoFaultModeV1, parseLocalIntendedYaoFaultTokenV1, requestWithoutLocalIntendedYaoFaultHeadersV1, responseWithLocalIntendedYaoFaultOutcomeV1 } from "./localIntendedYaoFault.js";
7
+ import { localMaterialAdmissionFault } from "./localIntendedMaterialAdmissionFault.js";
6
8
  import { LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_HEADER_V1, LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_TOKEN_HEADER_V1, LocalIntendedEcdsaFinalizeFaultControllerV1, parseLocalIntendedEcdsaFinalizeFaultModeV1, parseLocalIntendedEcdsaFinalizeFaultTokenV1, requestWithoutLocalIntendedEcdsaFinalizeFaultHeadersV1, responseWithLocalIntendedEcdsaFinalizeFaultOutcomeV1 } from "./localIntendedEcdsaFinalizeFault.js";
7
9
  import { LOCAL_INTENDED_YAO_FINALIZE_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_FINALIZE_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoFinalizeFaultDatabaseV1, parseLocalIntendedYaoFinalizeFaultModeV1, parseLocalIntendedYaoFinalizeFaultTokenV1, requestWithoutLocalIntendedYaoFinalizeFaultHeadersV1, responseWithLocalIntendedYaoFinalizeFaultOutcomeV1 } from "./localIntendedYaoFinalizeFault.js";
8
10
  import { LOCAL_INTENDED_YAO_RECOVERY_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_RECOVERY_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoRecoveryFaultControllerV1, parseLocalIntendedYaoRecoveryFaultModeV1, parseLocalIntendedYaoRecoveryFaultTokenV1, releaseLocalIntendedYaoRecoveryExecuteV1, requestWithoutLocalIntendedYaoRecoveryFaultHeadersV1, responseWithLocalIntendedYaoRecoveryFaultOutcomeV1 } from "./localIntendedYaoRecoveryFault.js";
@@ -104,6 +106,8 @@ async function handleLocalHostedWalletGatewayRequestV1(request, env, ctx, depend
104
106
  ...env,
105
107
  WALLET_CONSOLE: createStaticWalletConsoleBindingV1(config)
106
108
  };
109
+ const canceledPresign = await localPresignCancellationProbe(request, gatewayEnv, ctx, dependencies);
110
+ if (canceledPresign) return canceledPresign;
107
111
  const ecdsaFault = request.headers.get(ECDSA_RESPOND_FAULT_HEADER);
108
112
  if (ecdsaFault !== null) return await handleEcdsaRespondFault(request, gatewayEnv, ctx, dependencies, ecdsaFault, config.deployment.environmentKey, config.deployment.environmentId);
109
113
  const ecdsaFinalizeMode = request.headers.get(LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_HEADER_V1);
@@ -127,6 +131,15 @@ async function handleLocalHostedWalletGatewayRequestV1(request, env, ctx, depend
127
131
  const revokeMode = request.headers.get(LOCAL_INTENDED_REVOKE_FAULT_HEADER_V1);
128
132
  const revokeToken = request.headers.get(LOCAL_INTENDED_REVOKE_FAULT_TOKEN_HEADER_V1);
129
133
  if (revokeMode !== null || revokeToken !== null) return await handleRevokeFault(request, gatewayEnv, ctx, dependencies, revokeMode, revokeToken);
134
+ const materialFault = localMaterialAdmissionFault(request, gatewayEnv.SIGNER_DB);
135
+ if (materialFault instanceof Response) return materialFault;
136
+ if (materialFault) {
137
+ const response = await handleSplitGatewayRequest(materialFault.request, {
138
+ ...gatewayEnv,
139
+ SIGNER_DB: materialFault.database
140
+ }, ctx, dependencies);
141
+ return materialFault.database.response(response, materialFault.token);
142
+ }
130
143
  const admissionMode = request.headers.get(LOCAL_INTENDED_SESSION_ADMISSION_FAULT_HEADER_V1);
131
144
  const admissionToken = request.headers.get(LOCAL_INTENDED_SESSION_ADMISSION_FAULT_TOKEN_HEADER_V1);
132
145
  if (admissionMode !== null || admissionToken !== null) return await handleSessionAdmissionFault(request, gatewayEnv, ctx, dependencies, admissionMode, admissionToken);
@@ -0,0 +1,176 @@
1
+ import { isPlainObject } from "./shared-ts/src/utils/validation.js";
2
+ import { isLocalIntendedYaoFaultTokenV1 } from "./localIntendedYaoFault.js";
3
+ //#region src/localIntendedMaterialAdmissionFault.ts
4
+ const MODE_HEADER = "x-seams-intended-material-admission-fault-v1";
5
+ const TOKEN_HEADER = "x-seams-intended-material-admission-token-v1";
6
+ const PROOF_HEADER = "x-seams-intended-material-admission-proof-v1";
7
+ const SCOPE_PREDICATE = "namespace = ? AND org_id = ? AND project_id = ? AND env_id = ? AND wallet_id = ?";
8
+ function localMaterialAdmissionFault(request, database) {
9
+ const raw = request.headers.get(MODE_HEADER);
10
+ const token = request.headers.get(TOKEN_HEADER);
11
+ if (raw === null && token === null) return null;
12
+ const url = new URL(request.url);
13
+ if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || request.method !== "POST" || !["/router-ab/ecdsa-derivation/sign/prepare", "/router-ab/ecdsa-derivation/sign"].includes(url.pathname) || !isLocalIntendedYaoFaultTokenV1(token) || raw !== "canonical_claim" && raw !== "canonical_existing" && raw !== "linked_claim" && raw !== "linked_existing") return Response.json({ code: "invalid_intended_material_admission_fault" }, { status: 400 });
14
+ const headers = new Headers(request.headers);
15
+ headers.delete(MODE_HEADER);
16
+ headers.delete(TOKEN_HEADER);
17
+ return {
18
+ database: new LocalMaterialAdmissionFaultDatabase(database, raw),
19
+ request: new Request(request, { headers }),
20
+ token
21
+ };
22
+ }
23
+ /** Retire material after resolution and before one admission statement, then restore it. */
24
+ var LocalMaterialAdmissionFaultDatabase = class {
25
+ constructor(base, mode) {
26
+ this.base = base;
27
+ this.mode = mode;
28
+ this.scope = null;
29
+ this.state = { kind: "armed" };
30
+ }
31
+ prepare(query) {
32
+ const inner = this.base.prepare(query);
33
+ if (/^\s*INSERT INTO authorized_operations/.test(query)) return new FaultStatement(this, inner, "claim");
34
+ if (query.includes("AS material_snapshot_active")) return new FaultStatement(this, inner, "existing");
35
+ if (query.includes("AS ecdsa_material_records_json")) return new FaultStatement(this, inner, "material");
36
+ return inner;
37
+ }
38
+ captureScope(values) {
39
+ const scope = values.slice(0, 5);
40
+ const strings = [];
41
+ for (const value of scope) {
42
+ if (typeof value !== "string" || value.length === 0) throw new Error("Invalid material fault scope");
43
+ strings.push(value);
44
+ }
45
+ if (strings.length !== 5) throw new Error("Material fault did not observe a scoped material read");
46
+ this.scope = strings;
47
+ }
48
+ async batch(statements) {
49
+ const roles = statements.filter(isFaultStatement).map(statementRole);
50
+ const boundary = this.mode.endsWith("_claim") ? "claim" : "existing";
51
+ return this.execute(statements.map(unwrap), roles.includes(boundary) ? boundary : "material");
52
+ }
53
+ exec(query) {
54
+ return this.base.exec(query);
55
+ }
56
+ async first(statement, columnName) {
57
+ if (statement.role === "material") {
58
+ const row = await statement.inner.first(columnName);
59
+ if (isPlainObject(row)) this.captureScope([
60
+ row.session_namespace,
61
+ row.session_org_id,
62
+ row.session_project_id,
63
+ row.session_env_id,
64
+ row.session_wallet_id
65
+ ]);
66
+ return row;
67
+ }
68
+ if (!this.shouldRetire(statement.role)) return statement.inner.first(columnName);
69
+ if (columnName !== void 0) throw new Error("Material admission reads must return a row");
70
+ const [result] = await this.execute([statement.inner], statement.role);
71
+ return result?.results?.[0] ?? null;
72
+ }
73
+ shouldRetire(role) {
74
+ return role === (this.mode.endsWith("_claim") ? "claim" : "existing") && this.state.kind === "armed";
75
+ }
76
+ async execute(statements, role) {
77
+ if (!this.shouldRetire(role)) return this.base.batch(statements);
78
+ if (!this.scope) throw new Error("Material fault has no scoped read");
79
+ const { table, key, column } = this.target();
80
+ const predicate = this.mode.startsWith("canonical") ? `${SCOPE_PREDICATE} AND signer_family = 'ecdsa'` : SCOPE_PREDICATE;
81
+ const result = await this.base.prepare(`SELECT ${key} AS record_key, ${column} AS record_value FROM ${table} WHERE ${predicate}`).bind(...this.scope).all();
82
+ const records = [];
83
+ for (const row of result.results ?? []) {
84
+ const value = row.record_value;
85
+ if (typeof row.record_key !== "string" || value !== null && typeof value !== "number" && typeof value !== "string") throw new Error("Invalid material fault backup");
86
+ records.push({
87
+ key: row.record_key,
88
+ value
89
+ });
90
+ }
91
+ if (records.length === 0) throw new Error("Material fault did not find custody records");
92
+ const replacement = this.mode.startsWith("canonical") ? "json_set(record_json, '$.walletKey.publicCapability.material_activation.lifecycle_binding', 'retired-by-intended-test')" : "NULL";
93
+ const retire = this.base.prepare(`UPDATE ${table} SET ${column} = ${replacement} WHERE ${predicate}`).bind(...this.scope);
94
+ const restore = [];
95
+ for (const record of records) restore.push(this.base.prepare(`UPDATE ${table} SET ${column} = ? WHERE ${predicate} AND ${key} = ?`).bind(record.value, ...this.scope, record.key));
96
+ const quota = this.base.prepare(`SELECT COALESCE(SUM(quota.remaining_uses), 0) AS remaining
97
+ FROM authorization_wallet_session_quotas AS quota
98
+ JOIN wallet_session_authorizations_v2 AS session
99
+ ON session.namespace = quota.namespace AND session.tenant_id = quota.tenant_id
100
+ AND session.quota_id = quota.quota_id
101
+ WHERE session.namespace = ? AND session.org_id = ? AND session.project_id = ?
102
+ AND session.env_id = ? AND session.wallet_id = ?`).bind(...this.scope);
103
+ const results = await this.base.batch([
104
+ quota,
105
+ retire,
106
+ ...statements,
107
+ ...restore,
108
+ quota
109
+ ]);
110
+ this.state = {
111
+ kind: "restored",
112
+ rows: records.length,
113
+ quotaBefore: quotaTotal(results[0]),
114
+ quotaAfter: quotaTotal(results.at(-1))
115
+ };
116
+ return results.slice(2, 2 + statements.length);
117
+ }
118
+ response(response, token) {
119
+ const headers = new Headers(response.headers);
120
+ headers.set(PROOF_HEADER, this.state.kind === "restored" ? `${token}:${this.mode}:${this.state.rows}:${this.state.quotaBefore}:${this.state.quotaAfter}` : `${token}:not_observed`);
121
+ return new Response(response.body, {
122
+ status: response.status,
123
+ statusText: response.statusText,
124
+ headers
125
+ });
126
+ }
127
+ target() {
128
+ return this.mode.startsWith("canonical") ? {
129
+ table: "wallet_signers",
130
+ key: "signer_id",
131
+ column: "record_json"
132
+ } : {
133
+ table: "linked_device_authority_installations",
134
+ key: "link_session_id",
135
+ column: "activated_at_ms"
136
+ };
137
+ }
138
+ };
139
+ var FaultStatement = class FaultStatement {
140
+ constructor(database, inner, role) {
141
+ this.database = database;
142
+ this.inner = inner;
143
+ this.role = role;
144
+ }
145
+ bind(...values) {
146
+ return new FaultStatement(this.database, this.inner.bind(...values), this.role);
147
+ }
148
+ async first(columnName) {
149
+ return this.database.first(this, columnName);
150
+ }
151
+ all() {
152
+ return this.inner.all();
153
+ }
154
+ run() {
155
+ return this.inner.run();
156
+ }
157
+ };
158
+ function unwrap(statement) {
159
+ return statement instanceof FaultStatement ? statement.inner : statement;
160
+ }
161
+ function isFaultStatement(statement) {
162
+ return statement instanceof FaultStatement;
163
+ }
164
+ function statementRole(statement) {
165
+ return statement.role;
166
+ }
167
+ function quotaTotal(result) {
168
+ if (!isPlainObject(result) || !Array.isArray(result.results)) throw new Error("Material fault quota result is unavailable");
169
+ const row = result.results[0];
170
+ if (!isPlainObject(row) || typeof row.remaining !== "number" || !Number.isSafeInteger(row.remaining)) throw new Error("Material fault quota total is invalid");
171
+ return row.remaining;
172
+ }
173
+ //#endregion
174
+ export { localMaterialAdmissionFault };
175
+
176
+ //# sourceMappingURL=localIntendedMaterialAdmissionFault.js.map
@@ -0,0 +1,44 @@
1
+ import { handleSplitGatewayRequest } from "./hosted-wallet-gateway.js";
2
+ //#region src/localIntendedPresignCancellation.ts
3
+ const held = /* @__PURE__ */ new Set();
4
+ const header = "x-seams-intended-presign-cancellation";
5
+ const initPath = "/router-ab/ecdsa-derivation/presignature-pool/fill/init";
6
+ var HeldPresignProxy = class {
7
+ constructor(token) {
8
+ this.token = token;
9
+ }
10
+ async fetch() {
11
+ held.add(this.token);
12
+ await new Promise(resolveHeldPresign);
13
+ held.delete(this.token);
14
+ return Response.json({
15
+ ok: false,
16
+ code: "temporarily_unavailable"
17
+ }, { status: 503 });
18
+ }
19
+ };
20
+ function resolveHeldPresign(resolve) {
21
+ setTimeout(resolve, 3e4);
22
+ }
23
+ async function localPresignCancellationProbe(request, env, ctx, dependencies) {
24
+ const token = request.headers.get(header);
25
+ if (token === null) return null;
26
+ const url = new URL(request.url);
27
+ if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || url.pathname !== initPath || !/^[0-9a-f-]{36}$/u.test(token)) return Response.json({ code: "invalid_presign_cancellation_probe" }, { status: 400 });
28
+ if (request.method === "GET") return Response.json({ held: held.has(token) });
29
+ if (request.method === "DELETE") {
30
+ held.delete(token);
31
+ return new Response(null, { status: 204 });
32
+ }
33
+ if (request.method !== "POST") return new Response(null, { status: 405 });
34
+ const headers = new Headers(request.headers);
35
+ headers.delete(header);
36
+ return handleSplitGatewayRequest(new Request(request, { headers }), {
37
+ ...env,
38
+ SIGNING_WORKER: new HeldPresignProxy(token)
39
+ }, ctx, dependencies);
40
+ }
41
+ //#endregion
42
+ export { localPresignCancellationProbe };
43
+
44
+ //# sourceMappingURL=localIntendedPresignCancellation.js.map
@@ -191,32 +191,46 @@ async function validateRouterAbEcdsaDerivationWalletSessionInputs(input) {
191
191
  const token = extractBearerCredential(input.headers);
192
192
  if (!token) return walletSessionFailure("wallet_session_missing");
193
193
  const nowMs = input.nowMs || Date.now;
194
- let resolution;
194
+ let candidate;
195
195
  try {
196
- resolution = await resolveWalletSessionOperationCredentialAdmission({
197
- authorizationSessions,
196
+ candidate = await authorizationSessions.readWalletSessionSigningCandidateByOperationCredential({
197
+ tenantId: authorizationSessions.tenantId,
198
198
  token,
199
199
  nowMs: nowMs(),
200
- operation: {
201
- keyFamily: "ecdsa_secp256k1",
202
- operationKind: input.operationKind
203
- }
200
+ materialActivation: input.materialActivation
204
201
  });
205
202
  } catch {
206
203
  return walletSessionFailure("wallet_session_unavailable");
207
204
  }
208
- if (resolution.kind === "rejected") return walletSessionFailure("wallet_session_scope_mismatch");
209
- if (resolution.kind === "not_found") return {
205
+ if (!candidate) return {
210
206
  ok: false,
211
207
  code: "wallet_session_invalid",
212
208
  message: walletSessionFailureMessage("wallet_session_invalid")
213
209
  };
210
+ if (candidate.kind === "exhausted") return {
211
+ ok: true,
212
+ kind: "wallet_session_operation_credential_exhausted_candidate_v1",
213
+ candidate: candidate.candidate,
214
+ materialRead: candidate.materialRead,
215
+ policyRead: candidate.policyRead
216
+ };
217
+ const resolution = resolveWalletSessionOperationCredentialAdmissionFromContext({
218
+ context: candidate.context,
219
+ nowMs: nowMs(),
220
+ operation: {
221
+ keyFamily: "ecdsa_secp256k1",
222
+ operationKind: input.operationKind
223
+ }
224
+ });
225
+ if (resolution.kind === "rejected") return walletSessionFailure("wallet_session_scope_mismatch");
214
226
  if (resolution.admission.curve !== "ecdsa") return walletSessionFailure("wallet_session_scope_mismatch");
215
227
  return {
216
228
  ok: true,
217
229
  kind: "wallet_session_operation_credential_v1",
218
230
  admission: resolution.admission,
219
- context: resolution.admission.context
231
+ context: resolution.admission.context,
232
+ materialRead: candidate.materialRead,
233
+ policyRead: candidate.policyRead
220
234
  };
221
235
  }
222
236
  async function resolveThresholdRuntimePolicyScope(input) {
@@ -1,3 +1,4 @@
1
+ import { failure } from "../../shared-ts/src/utils/failure.js";
1
2
  //#region src/router/auth/walletSessionFailure.ts
2
3
  function walletSessionFailureMessage(code) {
3
4
  switch (code) {
@@ -24,11 +25,7 @@ function walletSessionFailureStatus(code) {
24
25
  }
25
26
  }
26
27
  function walletSessionFailure(code) {
27
- return {
28
- ok: false,
29
- code,
30
- message: walletSessionFailureMessage(code)
31
- };
28
+ return failure(code, walletSessionFailureMessage(code));
32
29
  }
33
30
  //#endregion
34
31
  export { walletSessionFailure, walletSessionFailureMessage, walletSessionFailureStatus };
@@ -2,6 +2,7 @@ import { base64Decode, base64UrlDecode, base64UrlEncode } from "../../shared-ts/
2
2
  import "../../shared-ts/src/utils/encoders.js";
3
3
  import { normalizeOptionalTrimmedString } from "../../shared-ts/src/utils/normalize.js";
4
4
  import "../../shared-ts/src/utils/validation.js";
5
+ import { failure } from "../../shared-ts/src/utils/failure.js";
5
6
  import { errorMessage } from "../../shared-ts/src/utils/errors.js";
6
7
  //#region src/router/auth/webAuthnCredentialCodecs.ts
7
8
  function decodeWebAuthnBase64UrlOrBase64(input, fieldName) {
@@ -45,30 +46,18 @@ function webAuthnOriginHostnameOrEmpty(origin) {
45
46
  }
46
47
  }
47
48
  function webAuthnCredentialIdB64uFromCredential(input) {
48
- if (input === null || typeof input !== "object" || Array.isArray(input)) return {
49
- ok: false,
50
- code: "invalid_body",
51
- message: "Missing webauthn_authentication.id/rawId"
52
- };
49
+ if (input === null || typeof input !== "object" || Array.isArray(input)) return failure("invalid_body", "Missing webauthn_authentication.id/rawId");
53
50
  const rawId = normalizeOptionalTrimmedString(Reflect.get(input, "rawId"));
54
51
  const id = normalizeOptionalTrimmedString(Reflect.get(input, "id"));
55
52
  const selected = rawId || id;
56
- if (!selected) return {
57
- ok: false,
58
- code: "invalid_body",
59
- message: "Missing webauthn_authentication.id/rawId"
60
- };
53
+ if (!selected) return failure("invalid_body", "Missing webauthn_authentication.id/rawId");
61
54
  try {
62
55
  return {
63
56
  ok: true,
64
57
  credentialIdB64u: base64UrlEncode(decodeWebAuthnBase64UrlOrBase64(selected, "webauthn_authentication.rawId"))
65
58
  };
66
59
  } catch (error) {
67
- return {
68
- ok: false,
69
- code: "invalid_body",
70
- message: errorMessage(error) || "Invalid credential rawId"
71
- };
60
+ return failure("invalid_body", errorMessage(error) || "Invalid credential rawId");
72
61
  }
73
62
  }
74
63
  function parseWebAuthnAuthenticationCredential(input) {
@@ -5,6 +5,7 @@ function createD1AuthorizedOperationRouteService(assembly) {
5
5
  if (!tenantId.ok) throw new Error(`orgId cannot identify an authorization tenant: ${tenantId.error.message}`);
6
6
  return {
7
7
  tenantId: tenantId.value,
8
+ resolveEcdsaWalletSessionOperation: assembly.authorizationStore.resolveEcdsaWalletSessionOperation.bind(assembly.authorizationStore),
8
9
  admitEcdsaWalletSessionOperation: assembly.authorizationStore.admitEcdsaWalletSessionOperation.bind(assembly.authorizationStore),
9
10
  readPinnedOwnerWalletScope: assembly.authorizationStore.readPinnedOwnerWalletScope.bind(assembly.authorizationStore),
10
11
  buildVerifiedOwnerProof: assembly.authorizationService.buildVerifiedOwnerProof.bind(assembly.authorizationService),
@@ -1,4 +1,5 @@
1
1
  import { hasWhitespaceOrControlCharacters, parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
2
+ import { toArrayBufferCopy } from "../../../../core/authService/portableCrypto.js";
2
3
  //#region src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.ts
3
4
  function parseD1BoundaryWalletIdResult(raw) {
4
5
  const parsed = parseWalletId(raw);
@@ -64,11 +65,6 @@ function d1MutationChanges(result) {
64
65
  const meta = result.meta;
65
66
  return parseD1NonNegativeCount(meta?.changes ?? meta?.rows_written);
66
67
  }
67
- function toArrayBufferCopy(bytes) {
68
- const out = new ArrayBuffer(bytes.byteLength);
69
- new Uint8Array(out).set(bytes);
70
- return out;
71
- }
72
68
  async function sha256BytesPortable(input) {
73
69
  const subtle = globalThis.crypto?.subtle;
74
70
  if (subtle && typeof subtle.digest === "function") return new Uint8Array(await subtle.digest("SHA-256", toArrayBufferCopy(input)));
@@ -79,6 +75,6 @@ async function sha256BytesPortable(input) {
79
75
  throw new Error("SHA-256 digest is unavailable in this runtime");
80
76
  }
81
77
  //#endregion
82
- export { d1MutationChanges, isB64uString, nonNegativeSafeInteger, optionalNonNegativeInteger, parseD1BoundaryWalletId, parseD1BoundaryWalletIdResult, parseD1NonNegativeCount, parseJsonObject, positiveInteger, positiveSafeInteger, sha256BytesPortable, toArrayBufferCopy, toRecordValue };
78
+ export { d1MutationChanges, isB64uString, nonNegativeSafeInteger, optionalNonNegativeInteger, parseD1BoundaryWalletId, parseD1BoundaryWalletIdResult, parseD1NonNegativeCount, parseJsonObject, positiveInteger, positiveSafeInteger, sha256BytesPortable, toRecordValue };
83
79
 
84
80
  //# sourceMappingURL=d1RouterApiAuthBoundary.js.map
@@ -19,12 +19,14 @@ import { sha256BytesPortable, toRecordValue } from "./d1RouterApiAuthBoundary.js
19
19
  import { CloudflareD1WebAuthnStore } from "../webauthn/d1WebAuthnStore.js";
20
20
  import { verifyD1LinkedDeviceFreshRevokeProofV1 } from "../wallet/d1WalletAuthMethodBoundary.js";
21
21
  import { CloudflareD1WebAuthnAuthService } from "../webauthn/d1WebAuthnAuthService.js";
22
+ import { D1LinkedDeviceAuthorityInstallServiceV1 } from "../deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
22
23
  import { D1WalletAuthorityStore } from "../wallet/d1WalletAuthorityStore.js";
23
24
  import { CloudflareD1AuthorizationStore } from "../authorization/d1AuthorizationStore.js";
24
25
  import { createCloudflareD1VersionedJsonRecordStore } from "../versionedJson/d1VersionedJsonRecordStore.js";
25
26
  import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV2, runRouterAbEd25519YaoRegistrationSideEffectV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
26
27
  import { createCloudflareOrdinaryInactiveSignerMaterialActivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialDeactivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialReservationServiceV1 } from "../../signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js";
27
28
  import { normalizeD1RouterApiAuthOptions } from "./d1RouterApiAuthConfig.js";
29
+ import { readActiveWalletSessionCredential, readExhaustedWalletSessionCredential, readWalletSessionSigningCandidate } from "./walletSessionCredentialReaders.js";
28
30
  import { createD1AuthorizedOperationRouteService } from "./d1AuthorizedOperationRouteService.js";
29
31
  import { parseRegistrationEstablishedSessionProjectionV2 } from "../../../../shared-ts/src/utils/registrationEstablishedSession.js";
30
32
  import { D1IdentityStore } from "../../../../core/d1IdentityStore.js";
@@ -68,7 +70,6 @@ import { createD1LinkedDeviceSessionServiceV1 } from "../deviceLinking/d1LinkedD
68
70
  import { D1LinkedDeviceSessionStoreV1 } from "../deviceLinking/d1LinkedDeviceSessionStore.js";
69
71
  import { createD1LinkedDeviceRouteServiceV1 } from "../deviceLinking/d1LinkedDeviceRouteService.js";
70
72
  import { D1LinkedDeviceEmailOtpGrantStoreV1 } from "../deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js";
71
- import { D1LinkedDeviceAuthorityInstallServiceV1 } from "../deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
72
73
  import { createD1LinkedDeviceManagementServiceV1 } from "../deviceLinking/d1LinkedDeviceManagementService.js";
73
74
  import { createD1LinkedDeviceRevocationV1 } from "../deviceLinking/d1LinkedDeviceRevocation.js";
74
75
  import { createD1LinkedDeviceVerifiedLinkSourceReaderV1 } from "../deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.js";
@@ -1490,39 +1491,16 @@ function createD1IdentityRouteService(assembly) {
1490
1491
  verifyGithubOAuthCode: assembly.oidcVerification.verifyGithubOAuthCode.bind(assembly.oidcVerification)
1491
1492
  };
1492
1493
  }
1493
- function isExhaustedWalletSessionStatus(status) {
1494
- return status.kind === "exhausted";
1495
- }
1496
1494
  function createD1AuthorizationSessionRouteService(assembly) {
1497
1495
  const tenantId = parseTenantId(assembly.options.orgId);
1498
1496
  if (!tenantId.ok) throw new Error(`orgId cannot identify an authorization tenant: ${tenantId.error.message}`);
1499
1497
  return {
1500
1498
  tenantId: tenantId.value,
1501
1499
  issueDirectWalletSessionAuthorizationV2: assembly.authorizationService.issueDirectWalletSessionAuthorizationV2.bind(assembly.authorizationService),
1502
- readWalletSessionAuthorizationV2ByOperationCredential: async (input) => {
1503
- const snapshot = await assembly.authorizationService.readWalletSessionAdmissionSnapshotByOperationCredential(input);
1504
- if (!snapshot) return null;
1505
- const { authorization, authority, authMethod } = snapshot;
1506
- if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active") return null;
1507
- return {
1508
- authorization,
1509
- authority,
1510
- authMethod,
1511
- retiredAtMs: null
1512
- };
1513
- },
1500
+ readWalletSessionAuthorizationV2ByOperationCredential: readActiveWalletSessionCredential.bind(null, assembly.authorizationService),
1501
+ readWalletSessionSigningCandidateByOperationCredential: readWalletSessionSigningCandidate.bind(null, assembly.authorizationService),
1514
1502
  readWalletSessionExactOperationContextByCredential: assembly.authorizationService.readWalletSessionExactOperationContextByCredential.bind(assembly.authorizationService),
1515
- readExhaustedWalletSessionAuthorizationV2CandidateByOperationCredential: async (input) => {
1516
- const { status, authority, authMethod } = await assembly.authorizationService.readExactWalletSessionStatusSnapshotByOperationCredential(input);
1517
- if (!isExhaustedWalletSessionStatus(status)) return null;
1518
- if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active" || authority.walletId !== status.session.walletId || authority.authorityDigestB64u !== status.session.authorityDigestB64u || authority.revocationEpoch !== status.session.authorityRevocationEpoch || authMethod.walletId !== status.session.walletId || authMethod.walletAuthorityId !== status.session.authorityId || authMethod.walletAuthMethodId !== status.session.walletAuthMethodId) return null;
1519
- return {
1520
- status,
1521
- authority,
1522
- authMethod,
1523
- retiredAtMs: null
1524
- };
1525
- },
1503
+ readExhaustedWalletSessionAuthorizationV2CandidateByOperationCredential: readExhaustedWalletSessionCredential.bind(null, assembly.authorizationService),
1526
1504
  readExactWalletSessionStatusByOperationCredential: assembly.authorizationService.readExactWalletSessionStatusByOperationCredential.bind(assembly.authorizationService),
1527
1505
  mintHostedWalletSeamsSessionExchange: assembly.authorizationService.mintHostedWalletSeamsSessionExchange.bind(assembly.authorizationService),
1528
1506
  redeemHostedWalletSeamsSessionExchange: assembly.authorizationService.redeemHostedWalletSeamsSessionExchange.bind(assembly.authorizationService),
@@ -0,0 +1,76 @@
1
+ //#region src/router/cloudflare/d1/auth/walletSessionCredentialReaders.ts
2
+ function activeContext(snapshot) {
3
+ const { authorization, authority, authMethod } = snapshot;
4
+ if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active") return null;
5
+ return {
6
+ authorization,
7
+ authority,
8
+ authMethod,
9
+ retiredAtMs: null
10
+ };
11
+ }
12
+ function exhaustedContext(snapshot) {
13
+ const { session, quota, authority, authMethod } = snapshot;
14
+ if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active" || authority.walletId !== session.walletId || authority.authorityDigestB64u !== session.authorityDigestB64u || authority.revocationEpoch !== session.authorityRevocationEpoch || authMethod.walletId !== session.walletId || authMethod.walletAuthorityId !== session.authorityId || authMethod.walletAuthMethodId !== session.walletAuthMethodId) return null;
15
+ return {
16
+ status: {
17
+ kind: "exhausted",
18
+ session,
19
+ quota
20
+ },
21
+ authority,
22
+ authMethod,
23
+ retiredAtMs: null
24
+ };
25
+ }
26
+ async function readActiveWalletSessionCredential(service, input) {
27
+ const snapshot = await service.readWalletSessionAdmissionSnapshotByOperationCredential(input);
28
+ if (!snapshot) return null;
29
+ if (snapshot.kind === "exhausted") throw new Error("Stored V2 Wallet Session quota is no longer active");
30
+ return activeContext(snapshot);
31
+ }
32
+ async function readWalletSessionSigningCandidate(service, input) {
33
+ const read = await service.readEcdsaWalletSessionAdmissionSnapshotByOperationCredential(input);
34
+ if (!read) return null;
35
+ const { snapshot, materialRead, policyRead } = read;
36
+ switch (snapshot.kind) {
37
+ case "active": {
38
+ const context = activeContext(snapshot);
39
+ return context ? {
40
+ kind: "active",
41
+ context,
42
+ materialRead,
43
+ policyRead
44
+ } : null;
45
+ }
46
+ case "exhausted": {
47
+ const candidate = exhaustedContext(snapshot);
48
+ if (!candidate) throw new Error("Exhausted Wallet Session authority is unavailable");
49
+ return {
50
+ kind: "exhausted",
51
+ candidate,
52
+ materialRead,
53
+ policyRead
54
+ };
55
+ }
56
+ default: {
57
+ const unexpected = snapshot;
58
+ throw new Error(`Unsupported Wallet Session snapshot: ${unexpected}`);
59
+ }
60
+ }
61
+ }
62
+ async function readExhaustedWalletSessionCredential(service, input) {
63
+ const { status, authority, authMethod } = await service.readExactWalletSessionStatusSnapshotByOperationCredential(input);
64
+ if (status.kind !== "exhausted") return null;
65
+ return exhaustedContext({
66
+ kind: "exhausted",
67
+ session: status.session,
68
+ quota: status.quota,
69
+ authority,
70
+ authMethod
71
+ });
72
+ }
73
+ //#endregion
74
+ export { readActiveWalletSessionCredential, readExhaustedWalletSessionCredential, readWalletSessionSigningCandidate };
75
+
76
+ //# sourceMappingURL=walletSessionCredentialReaders.js.map
@@ -61,7 +61,11 @@ function prepareAuthorizedOperationRead(database, namespace, input) {
61
61
  LIMIT 1`).bind(namespace, input.tenantId, input.operationFingerprintDigest);
62
62
  }
63
63
  function prepareAuthorizedOperationAdmissionRead(input) {
64
- return input.database.prepare(`SELECT operation.*, ${PINNED_OWNER_WALLET},
64
+ const material = input.materialSnapshot?.condition(input.walletSignerScope) ?? {
65
+ sql: "1",
66
+ bindings: []
67
+ };
68
+ return input.database.prepare(`SELECT operation.*, ${PINNED_OWNER_WALLET}, (${material.sql}) AS material_snapshot_active,
65
69
  CASE operation.authorization_source_kind
66
70
  WHEN 'authorization_grant' THEN EXISTS (
67
71
  SELECT 1
@@ -117,7 +121,7 @@ function prepareAuthorizedOperationAdmissionRead(input) {
117
121
  FROM authorized_operations AS operation
118
122
  WHERE operation.namespace = ? AND operation.tenant_id = ?
119
123
  AND operation.operation_fingerprint_digest = ?
120
- LIMIT 1`).bind(input.walletSignerScope.orgId, input.walletSignerScope.projectId, input.walletSignerScope.envId, input.nowMs, input.nowMs, input.namespace, input.tenantId, input.operationFingerprintDigest);
124
+ LIMIT 1`).bind(...material.bindings, input.walletSignerScope.orgId, input.walletSignerScope.projectId, input.walletSignerScope.envId, input.nowMs, input.nowMs, input.namespace, input.tenantId, input.operationFingerprintDigest);
121
125
  }
122
126
  function prepareAuthorizedOperationInsert(input) {
123
127
  const { database, namespace, walletSignerScope, operation, material } = input;
@@ -165,7 +169,27 @@ function prepareAuthorizedOperationInsert(input) {
165
169
  source.kind === "authorization_grant" ? walletSignerScope.projectId : null,
166
170
  source.kind === "authorization_grant" ? walletSignerScope.envId : null
167
171
  ];
168
- return material?.kind === "ecdsa_material_activation" ? database.prepare(`INSERT INTO authorized_operations (
172
+ let condition = input.materialSnapshot?.condition(walletSignerScope) ?? null;
173
+ if (condition === null) condition = material?.kind === "ecdsa_material_activation" ? {
174
+ sql: ECDSA_SIGNER_MATCH,
175
+ bindings: ecdsaSignerMatchBindings(walletSignerScope, material)
176
+ } : {
177
+ sql: "1",
178
+ bindings: []
179
+ };
180
+ const absence = input.existingOperation === "preserve" ? {
181
+ sql: `NOT EXISTS (SELECT 1 FROM authorized_operations
182
+ WHERE namespace = ? AND tenant_id = ? AND operation_fingerprint_digest = ?)`,
183
+ bindings: [
184
+ namespace,
185
+ operation.tenantId,
186
+ operation.operationFingerprintDigest
187
+ ]
188
+ } : {
189
+ sql: "1",
190
+ bindings: []
191
+ };
192
+ return database.prepare(`INSERT INTO authorized_operations (
169
193
  namespace, tenant_id, authorized_operation_id, audit_event_id,
170
194
  principal_id, capability_id, capability_kind, operation_kind, operation_id,
171
195
  operation_fingerprint_digest, lane_digest, intent_digest, display_digest,
@@ -183,24 +207,7 @@ function prepareAuthorizedOperationInsert(input) {
183
207
  ) SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
184
208
  'claimed', 'pending', NULL, NULL, NULL, NULL, ?, NULL, ?,
185
209
  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
186
- WHERE ${ECDSA_SIGNER_MATCH}`).bind(...values, ...ecdsaSignerMatchBindings(walletSignerScope, material)) : database.prepare(`INSERT INTO authorized_operations (
187
- namespace, tenant_id, authorized_operation_id, audit_event_id,
188
- principal_id, capability_id, capability_kind, operation_kind, operation_id,
189
- operation_fingerprint_digest, lane_digest, intent_digest, display_digest,
190
- authorization_source_kind, authorization_id, evidence_set_digest,
191
- quota_id, quota_kind, authorization_grant_kind, lifecycle_kind, result_kind,
192
- result_digest, result_status, result_content_type, result_body_text,
193
- claimed_at_ms, completed_at_ms,
194
- material_activation_id, material_activation_capability,
195
- material_activation_owner, material_activation_key_binding,
196
- material_activation_lifecycle_binding, material_activation_signing_worker,
197
- linked_wallet_id, linked_enrollment_id, linked_device_id,
198
- linked_wallet_key_id, linked_lane_id, linked_lane_share_epoch,
199
- linked_revocation_epoch, linked_scope_org_id, linked_scope_project_id,
200
- linked_scope_env_id
201
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
202
- 'claimed', 'pending', NULL, NULL, NULL, NULL, ?, NULL, ?,
203
- ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(...values);
210
+ WHERE (${condition.sql}) AND (${absence.sql})`).bind(...values, ...condition.bindings, ...absence.bindings);
204
211
  }
205
212
  //#endregion
206
213
  export { prepareAuthorizedOperationAdmissionRead, prepareAuthorizedOperationCommittedRead, prepareAuthorizedOperationInsert, prepareAuthorizedOperationRead };