@openlup/platform 0.26.0 → 0.28.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 (603) hide show
  1. package/CHANGELOG.md +305 -327
  2. package/README.md +332 -16
  3. package/dist/account-support/accountReadFacade.d.ts +8 -0
  4. package/dist/account-support/accountReadFacade.js +10 -0
  5. package/dist/account-support/accountReadModels.d.ts +69 -0
  6. package/dist/account-support/accountReadModels.js +272 -0
  7. package/dist/account-support/bindings.d.ts +23 -0
  8. package/dist/account-support/bindings.js +16 -0
  9. package/dist/account-support/contracts/account.d.ts +281 -0
  10. package/dist/account-support/contracts/account.js +1 -0
  11. package/dist/account-support/contracts/capabilities.d.ts +44 -0
  12. package/dist/account-support/contracts/capabilities.js +1 -0
  13. package/dist/account-support/contracts/commands.d.ts +307 -0
  14. package/dist/account-support/contracts/commands.js +1 -0
  15. package/dist/account-support/contracts/customer360.d.ts +154 -0
  16. package/dist/account-support/contracts/customer360.js +1 -0
  17. package/dist/account-support/contracts/index.d.ts +10 -0
  18. package/dist/account-support/contracts/index.js +1 -0
  19. package/dist/account-support/contracts/invoice.d.ts +79 -0
  20. package/dist/account-support/contracts/invoice.js +1 -0
  21. package/dist/account-support/contracts/operator.d.ts +289 -0
  22. package/dist/account-support/contracts/operator.js +1 -0
  23. package/dist/account-support/contribution.d.ts +24 -0
  24. package/dist/account-support/contribution.js +22 -0
  25. package/dist/account-support/customer360.d.ts +106 -0
  26. package/dist/account-support/customer360.js +163 -0
  27. package/dist/account-support/customerAccountReadDiagnostics.d.ts +11 -0
  28. package/dist/account-support/customerAccountReadDiagnostics.js +71 -0
  29. package/dist/account-support/index.d.ts +26 -0
  30. package/dist/account-support/index.js +15 -0
  31. package/dist/account-support/invoiceAccess.d.ts +57 -0
  32. package/dist/account-support/invoiceAccess.js +40 -0
  33. package/dist/account-support/migrations.d.ts +14 -0
  34. package/dist/account-support/migrations.js +7 -0
  35. package/dist/account-support/operatorAuthority.d.ts +67 -0
  36. package/dist/account-support/operatorAuthority.js +379 -0
  37. package/dist/account-support/operatorRecovery.d.ts +66 -0
  38. package/dist/account-support/operatorRecovery.js +129 -0
  39. package/dist/account-support/orderHistory.d.ts +50 -0
  40. package/dist/account-support/orderHistory.js +188 -0
  41. package/dist/account-support/paymentMethodComposition.d.ts +5 -0
  42. package/dist/account-support/paymentMethodComposition.js +4 -0
  43. package/dist/account-support/postgresOperatorAuthority.d.ts +16 -0
  44. package/dist/account-support/postgresOperatorAuthority.js +93 -0
  45. package/dist/account-support/selfService.d.ts +6 -0
  46. package/dist/account-support/selfService.js +81 -0
  47. package/dist/account-support/subscriptionCommandCodec.d.ts +10 -0
  48. package/dist/account-support/subscriptionCommandCodec.js +38 -0
  49. package/dist/catalog/draftSchemas.d.ts +1 -1
  50. package/dist/catalog/foundationSchemas.d.ts +3 -3
  51. package/dist/catalog/resolvedSkuProjection.d.ts +2 -2
  52. package/dist/catalog/sellableSchemas.d.ts +2 -2
  53. package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
  54. package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
  55. package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
  56. package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
  57. package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
  58. package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
  59. package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
  60. package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
  61. package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
  62. package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
  63. package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
  64. package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
  65. package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
  66. package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
  67. package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
  68. package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
  69. package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
  70. package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
  71. package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
  72. package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
  73. package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
  74. package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
  75. package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
  76. package/dist/commerce/adapters/managed/oms/types.js +7 -0
  77. package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
  78. package/dist/commerce/checkoutCommandSchemas.js +70 -0
  79. package/dist/commerce/checkoutHelpers.d.ts +21 -0
  80. package/dist/commerce/checkoutHelpers.js +29 -0
  81. package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
  82. package/dist/commerce/checkoutResumeSchemas.js +145 -0
  83. package/dist/commerce/checkoutSchemas.d.ts +158 -0
  84. package/dist/commerce/checkoutSchemas.js +161 -0
  85. package/dist/commerce/commerceReturnsPort.d.ts +97 -0
  86. package/dist/commerce/commerceReturnsPort.js +39 -0
  87. package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
  88. package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
  89. package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
  90. package/dist/commerce/configuratorIntentSchemas.js +43 -0
  91. package/dist/commerce/contractPrimitives.d.ts +50 -0
  92. package/dist/commerce/contractPrimitives.js +25 -0
  93. package/dist/commerce/contracts/availability.d.ts +23 -0
  94. package/dist/commerce/contracts/availability.js +1 -0
  95. package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
  96. package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
  97. package/dist/commerce/contracts/index.d.ts +13 -0
  98. package/dist/commerce/contracts/index.js +1 -0
  99. package/dist/commerce/contracts/intent.d.ts +86 -0
  100. package/dist/commerce/contracts/intent.js +1 -0
  101. package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
  102. package/dist/commerce/contracts/omsTypes.js +1 -0
  103. package/dist/commerce/contracts/order.d.ts +39 -0
  104. package/dist/commerce/contracts/order.js +1 -0
  105. package/dist/commerce/contracts/orderMoney.d.ts +52 -0
  106. package/dist/commerce/contracts/orderMoney.js +1 -0
  107. package/dist/commerce/contracts/ports.d.ts +113 -0
  108. package/dist/commerce/contracts/ports.js +1 -0
  109. package/dist/commerce/contracts/recovery.d.ts +11 -0
  110. package/dist/commerce/contracts/recovery.js +1 -0
  111. package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
  112. package/dist/commerce/contracts/runtimePorts.js +1 -0
  113. package/dist/commerce/contracts/state.d.ts +26 -0
  114. package/dist/commerce/contracts/state.js +43 -0
  115. package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
  116. package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
  117. package/dist/commerce/errors.d.ts +18 -0
  118. package/dist/commerce/errors.js +36 -0
  119. package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
  120. package/dist/commerce/fulfillmentEligibility.js +31 -0
  121. package/dist/commerce/index.d.ts +72 -0
  122. package/dist/commerce/index.js +67 -0
  123. package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
  124. package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
  125. package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
  126. package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
  127. package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
  128. package/dist/commerce/model/omsAccountingVisibility.js +118 -0
  129. package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
  130. package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
  131. package/dist/commerce/model/omsCurrency.d.ts +4 -0
  132. package/dist/commerce/model/omsCurrency.js +5 -0
  133. package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
  134. package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
  135. package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
  136. package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
  137. package/dist/commerce/model/omsListTotals.d.ts +13 -0
  138. package/dist/commerce/model/omsListTotals.js +32 -0
  139. package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
  140. package/dist/commerce/model/omsOperationalLadder.js +158 -0
  141. package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
  142. package/dist/commerce/model/omsOrderLineMoney.js +25 -0
  143. package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
  144. package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
  145. package/dist/commerce/model/omsReadModel.d.ts +43 -0
  146. package/dist/commerce/model/omsReadModel.js +211 -0
  147. package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
  148. package/dist/commerce/model/omsReadModelCommunication.js +29 -0
  149. package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
  150. package/dist/commerce/model/omsReadModelHelpers.js +212 -0
  151. package/dist/commerce/model/omsReadModelList.d.ts +33 -0
  152. package/dist/commerce/model/omsReadModelList.js +50 -0
  153. package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
  154. package/dist/commerce/model/omsReadModelListSummary.js +13 -0
  155. package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
  156. package/dist/commerce/model/omsReadModelPricing.js +36 -0
  157. package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
  158. package/dist/commerce/model/omsReadModelProjections.js +1 -0
  159. package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
  160. package/dist/commerce/model/omsReadModelRowCore.js +149 -0
  161. package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
  162. package/dist/commerce/model/omsReadModelRows.js +6 -0
  163. package/dist/commerce/offerAvailability.d.ts +18 -0
  164. package/dist/commerce/offerAvailability.js +53 -0
  165. package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
  166. package/dist/commerce/offerAvailabilitySchemas.js +42 -0
  167. package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
  168. package/dist/commerce/offerEvidenceSchemas.js +13 -0
  169. package/dist/commerce/oms/omsContractBase.d.ts +130 -0
  170. package/dist/commerce/oms/omsContractBase.js +86 -0
  171. package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
  172. package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
  173. package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
  174. package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
  175. package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
  176. package/dist/commerce/oms/omsContractRequests.js +118 -0
  177. package/dist/commerce/oms/omsContracts.d.ts +5 -0
  178. package/dist/commerce/oms/omsContracts.js +4 -0
  179. package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
  180. package/dist/commerce/oms/omsControlPlane.js +72 -0
  181. package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
  182. package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
  183. package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
  184. package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
  185. package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
  186. package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
  187. package/dist/commerce/oms/omsPorts.d.ts +84 -0
  188. package/dist/commerce/oms/omsPorts.js +148 -0
  189. package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
  190. package/dist/commerce/oms/omsPrimitives.js +3 -0
  191. package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
  192. package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
  193. package/dist/commerce/orderDraftErrors.d.ts +13 -0
  194. package/dist/commerce/orderDraftErrors.js +20 -0
  195. package/dist/commerce/orderEmailEligibility.d.ts +54 -0
  196. package/dist/commerce/orderEmailEligibility.js +123 -0
  197. package/dist/commerce/orderEmailLines.d.ts +12 -0
  198. package/dist/commerce/orderEmailLines.js +8 -0
  199. package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
  200. package/dist/commerce/orderFeedbackContracts.js +33 -0
  201. package/dist/commerce/orderMoney.d.ts +6 -0
  202. package/dist/commerce/orderMoney.js +168 -0
  203. package/dist/commerce/orderReviewContracts.d.ts +475 -0
  204. package/dist/commerce/orderReviewContracts.js +94 -0
  205. package/dist/commerce/orderReviewPorts.d.ts +140 -0
  206. package/dist/commerce/orderReviewPorts.js +1 -0
  207. package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
  208. package/dist/commerce/outboxDispatchContracts.js +1 -0
  209. package/dist/commerce/outboxEventSchemas.d.ts +162 -0
  210. package/dist/commerce/outboxEventSchemas.js +164 -0
  211. package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
  212. package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
  213. package/dist/commerce/paymentContinuation.d.ts +4 -0
  214. package/dist/commerce/paymentContinuation.js +4 -0
  215. package/dist/commerce/ports.d.ts +8 -0
  216. package/dist/commerce/ports.js +1 -0
  217. package/dist/commerce/recoveryDestination.d.ts +3 -0
  218. package/dist/commerce/recoveryDestination.js +17 -0
  219. package/dist/commerce/runtimeErrors.d.ts +8 -0
  220. package/dist/commerce/runtimeErrors.js +16 -0
  221. package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
  222. package/dist/commerce/salesChannelEnvelope.js +7 -0
  223. package/dist/commerce/schemas.d.ts +174 -0
  224. package/dist/commerce/schemas.js +84 -0
  225. package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
  226. package/dist/commerce/server/checkoutCompensation.js +32 -0
  227. package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
  228. package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
  229. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
  230. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
  231. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
  232. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
  233. package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
  234. package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
  235. package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
  236. package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
  237. package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
  238. package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
  239. package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
  240. package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
  241. package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
  242. package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
  243. package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
  244. package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
  245. package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
  246. package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
  247. package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
  248. package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
  249. package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
  250. package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
  251. package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
  252. package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
  253. package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
  254. package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
  255. package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
  256. package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
  257. package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
  258. package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
  259. package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
  260. package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
  261. package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
  262. package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
  263. package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
  264. package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
  265. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
  266. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
  267. package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
  268. package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
  269. package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
  270. package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
  271. package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
  272. package/dist/commerce/server/commerceCheckoutResume.js +81 -0
  273. package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
  274. package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
  275. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
  276. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
  277. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
  278. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
  279. package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
  280. package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
  281. package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
  282. package/dist/commerce/server/commerceDiagnostics.js +31 -0
  283. package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
  284. package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
  285. package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
  286. package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
  287. package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
  288. package/dist/commerce/server/commerceOmsHandlers.js +176 -0
  289. package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
  290. package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
  291. package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
  292. package/dist/commerce/server/commerceOrderDraft.js +92 -0
  293. package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
  294. package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
  295. package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
  296. package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
  297. package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
  298. package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
  299. package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
  300. package/dist/commerce/server/commerceRuntimePort.js +57 -0
  301. package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
  302. package/dist/commerce/server/commerceRuntimeService.js +186 -0
  303. package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
  304. package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
  305. package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
  306. package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
  307. package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
  308. package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
  309. package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
  310. package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
  311. package/dist/commerce/server/emailRuntime.d.ts +47 -0
  312. package/dist/commerce/server/emailRuntime.js +1 -0
  313. package/dist/commerce/server/handlerSupport.d.ts +68 -0
  314. package/dist/commerce/server/handlerSupport.js +1 -0
  315. package/dist/commerce/server/index.d.ts +178 -0
  316. package/dist/commerce/server/index.js +127 -0
  317. package/dist/commerce/server/offerAvailability.d.ts +21 -0
  318. package/dist/commerce/server/offerAvailability.js +163 -0
  319. package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
  320. package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
  321. package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
  322. package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
  323. package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
  324. package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
  325. package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
  326. package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
  327. package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
  328. package/dist/commerce/server/orderReviewHandlers.js +42 -0
  329. package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
  330. package/dist/commerce/server/orderReviewLifecycle.js +121 -0
  331. package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
  332. package/dist/commerce/server/orderReviewMedia.js +172 -0
  333. package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
  334. package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
  335. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
  336. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
  337. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
  338. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
  339. package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
  340. package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
  341. package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
  342. package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
  343. package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
  344. package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
  345. package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
  346. package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
  347. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
  348. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
  349. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
  350. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
  351. package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
  352. package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
  353. package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
  354. package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
  355. package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
  356. package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
  357. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
  358. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
  359. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
  360. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
  361. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
  362. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
  363. package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
  364. package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
  365. package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
  366. package/dist/commerce/server/reservationSweepPort.js +45 -0
  367. package/dist/commerce/server/starterTermsPort.d.ts +22 -0
  368. package/dist/commerce/server/starterTermsPort.js +1 -0
  369. package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
  370. package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
  371. package/dist/communications/consentPurposeRegistry.d.ts +1 -1
  372. package/dist/communications/newsletterIntegrationContracts.d.ts +10 -10
  373. package/dist/composition/accountSupportContribution.d.ts +18 -0
  374. package/dist/composition/accountSupportContribution.js +21 -0
  375. package/dist/composition/commerceContribution.d.ts +21 -0
  376. package/dist/composition/commerceContribution.js +27 -0
  377. package/dist/composition/index.d.ts +2 -0
  378. package/dist/composition/index.js +2 -0
  379. package/dist/fulfillment/handlerSchemas.d.ts +69 -69
  380. package/dist/fulfillment/index.d.ts +1 -1
  381. package/dist/fulfillment/index.js +1 -1
  382. package/dist/fulfillment/paidHandoff.d.ts +12 -1
  383. package/dist/fulfillment/paidHandoff.js +2 -2
  384. package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
  385. package/dist/identity/customerContracts.d.ts +4 -4
  386. package/dist/inventory/bindings.d.ts +3 -0
  387. package/dist/inventory/bindings.js +10 -4
  388. package/dist/inventory/index.d.ts +1 -0
  389. package/dist/inventory/index.js +1 -0
  390. package/dist/inventory/managedStockAvailability.d.ts +15 -0
  391. package/dist/inventory/managedStockAvailability.js +16 -0
  392. package/dist/inventory/postgresStockAvailability.js +2 -25
  393. package/dist/inventory/schemas.d.ts +1 -1
  394. package/dist/inventory/stockReadResponse.d.ts +4 -0
  395. package/dist/inventory/stockReadResponse.js +27 -0
  396. package/dist/invoicing/snapshot.d.ts +1 -1
  397. package/dist/pricing/acquisitionQuoteBinding.d.ts +1 -1
  398. package/dist/pricing/browser/index.d.ts +6 -0
  399. package/dist/pricing/browser/index.js +6 -0
  400. package/dist/pricing/catalogFactsSchemas.d.ts +1 -1
  401. package/dist/pricing/quotePromotionEvidence.d.ts +1 -1
  402. package/dist/pricing/quoteSchemas.d.ts +56 -56
  403. package/dist/promotions/adminPromotionCodesContracts.d.ts +30 -30
  404. package/dist/promotions/adminPromotionsContracts.d.ts +16 -16
  405. package/dist/subscriptions/index.d.ts +3 -2
  406. package/dist/subscriptions/index.js +3 -2
  407. package/package.json +32 -2
  408. package/release-gates.json +90 -8
  409. package/sql/20261026120000_account_support_operator_authority.sql +693 -0
  410. package/src/account-support/accountReadFacade.ts +15 -0
  411. package/src/account-support/accountReadModels.ts +371 -0
  412. package/src/account-support/bindings.ts +28 -0
  413. package/src/account-support/contracts/account.ts +306 -0
  414. package/src/account-support/contracts/capabilities.ts +30 -0
  415. package/src/account-support/contracts/commands.ts +243 -0
  416. package/src/account-support/contracts/customer360.ts +150 -0
  417. package/src/account-support/contracts/index.ts +141 -0
  418. package/src/account-support/contracts/invoice.ts +44 -0
  419. package/src/account-support/contracts/operator.ts +123 -0
  420. package/src/account-support/contribution.ts +35 -0
  421. package/src/account-support/customer360.ts +268 -0
  422. package/src/account-support/customerAccountReadDiagnostics.ts +83 -0
  423. package/src/account-support/index.ts +72 -0
  424. package/src/account-support/invoiceAccess.ts +63 -0
  425. package/src/account-support/migrations.ts +7 -0
  426. package/src/account-support/operatorAuthority.ts +393 -0
  427. package/src/account-support/operatorRecovery.ts +136 -0
  428. package/src/account-support/orderHistory.ts +309 -0
  429. package/src/account-support/paymentMethodComposition.ts +8 -0
  430. package/src/account-support/postgresOperatorAuthority.ts +92 -0
  431. package/src/account-support/selfService.ts +83 -0
  432. package/src/account-support/subscriptionCommandCodec.ts +48 -0
  433. package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
  434. package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
  435. package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
  436. package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
  437. package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
  438. package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
  439. package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
  440. package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
  441. package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
  442. package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
  443. package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
  444. package/src/commerce/adapters/managed/oms/types.ts +9 -0
  445. package/src/commerce/checkoutCommandSchemas.ts +93 -0
  446. package/src/commerce/checkoutHelpers.ts +47 -0
  447. package/src/commerce/checkoutResumeSchemas.ts +164 -0
  448. package/src/commerce/checkoutSchemas.ts +182 -0
  449. package/src/commerce/commerceReturnsPort.ts +67 -0
  450. package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
  451. package/src/commerce/configuratorIntentSchemas.ts +47 -0
  452. package/src/commerce/contractPrimitives.ts +30 -0
  453. package/src/commerce/contracts/availability.ts +21 -0
  454. package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
  455. package/src/commerce/contracts/index.ts +17 -0
  456. package/src/commerce/contracts/intent.ts +58 -0
  457. package/src/commerce/contracts/omsTypes.ts +1217 -0
  458. package/src/commerce/contracts/order.ts +44 -0
  459. package/src/commerce/contracts/orderMoney.ts +75 -0
  460. package/src/commerce/contracts/ports.ts +124 -0
  461. package/src/commerce/contracts/recovery.ts +24 -0
  462. package/src/commerce/contracts/runtimePorts.ts +201 -0
  463. package/src/commerce/contracts/state.ts +64 -0
  464. package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
  465. package/src/commerce/errors.ts +53 -0
  466. package/src/commerce/fulfillmentEligibility.ts +32 -0
  467. package/src/commerce/index.ts +82 -0
  468. package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
  469. package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
  470. package/src/commerce/model/omsAccountingVisibility.ts +135 -0
  471. package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
  472. package/src/commerce/model/omsCurrency.ts +8 -0
  473. package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
  474. package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
  475. package/src/commerce/model/omsListTotals.ts +38 -0
  476. package/src/commerce/model/omsOperationalLadder.ts +181 -0
  477. package/src/commerce/model/omsOrderLineMoney.ts +34 -0
  478. package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
  479. package/src/commerce/model/omsReadModel.ts +302 -0
  480. package/src/commerce/model/omsReadModelCommunication.ts +32 -0
  481. package/src/commerce/model/omsReadModelHelpers.ts +279 -0
  482. package/src/commerce/model/omsReadModelList.ts +90 -0
  483. package/src/commerce/model/omsReadModelListSummary.ts +19 -0
  484. package/src/commerce/model/omsReadModelPricing.ts +57 -0
  485. package/src/commerce/model/omsReadModelProjections.ts +1 -0
  486. package/src/commerce/model/omsReadModelRowCore.ts +193 -0
  487. package/src/commerce/model/omsReadModelRows.ts +7 -0
  488. package/src/commerce/offerAvailability.ts +75 -0
  489. package/src/commerce/offerAvailabilitySchemas.ts +56 -0
  490. package/src/commerce/offerEvidenceSchemas.ts +17 -0
  491. package/src/commerce/oms/omsContractBase.ts +92 -0
  492. package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
  493. package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
  494. package/src/commerce/oms/omsContractRequests.ts +143 -0
  495. package/src/commerce/oms/omsContracts.ts +6 -0
  496. package/src/commerce/oms/omsControlPlane.ts +85 -0
  497. package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
  498. package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
  499. package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
  500. package/src/commerce/oms/omsPorts.ts +165 -0
  501. package/src/commerce/oms/omsPrimitives.ts +3 -0
  502. package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
  503. package/src/commerce/orderDraftErrors.ts +28 -0
  504. package/src/commerce/orderEmailEligibility.ts +131 -0
  505. package/src/commerce/orderEmailLines.ts +22 -0
  506. package/src/commerce/orderFeedbackContracts.ts +47 -0
  507. package/src/commerce/orderMoney.ts +207 -0
  508. package/src/commerce/orderReviewContracts.ts +124 -0
  509. package/src/commerce/orderReviewPorts.ts +94 -0
  510. package/src/commerce/outboxDispatchContracts.ts +30 -0
  511. package/src/commerce/outboxEventSchemas.ts +230 -0
  512. package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
  513. package/src/commerce/paymentContinuation.ts +5 -0
  514. package/src/commerce/ports.ts +7 -0
  515. package/src/commerce/recoveryDestination.ts +23 -0
  516. package/src/commerce/runtimeErrors.ts +19 -0
  517. package/src/commerce/salesChannelEnvelope.ts +28 -0
  518. package/src/commerce/schemas.ts +104 -0
  519. package/src/commerce/server/checkoutCompensation.ts +49 -0
  520. package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
  521. package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
  522. package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
  523. package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
  524. package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
  525. package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
  526. package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
  527. package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
  528. package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
  529. package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
  530. package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
  531. package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
  532. package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
  533. package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
  534. package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
  535. package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
  536. package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
  537. package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
  538. package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
  539. package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
  540. package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
  541. package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
  542. package/src/commerce/server/commerceCheckoutResume.ts +132 -0
  543. package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
  544. package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
  545. package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
  546. package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
  547. package/src/commerce/server/commerceDiagnostics.ts +37 -0
  548. package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
  549. package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
  550. package/src/commerce/server/commerceOmsHandlers.ts +275 -0
  551. package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
  552. package/src/commerce/server/commerceOrderDraft.ts +131 -0
  553. package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
  554. package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
  555. package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
  556. package/src/commerce/server/commerceRuntimePort.ts +75 -0
  557. package/src/commerce/server/commerceRuntimeService.ts +229 -0
  558. package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
  559. package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
  560. package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
  561. package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
  562. package/src/commerce/server/emailRuntime.ts +30 -0
  563. package/src/commerce/server/handlerSupport.ts +22 -0
  564. package/src/commerce/server/index.ts +181 -0
  565. package/src/commerce/server/offerAvailability.ts +275 -0
  566. package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
  567. package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
  568. package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
  569. package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
  570. package/src/commerce/server/orderReviewHandlers.ts +57 -0
  571. package/src/commerce/server/orderReviewLifecycle.ts +129 -0
  572. package/src/commerce/server/orderReviewMedia.ts +170 -0
  573. package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
  574. package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
  575. package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
  576. package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
  577. package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
  578. package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
  579. package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
  580. package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
  581. package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
  582. package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
  583. package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
  584. package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
  585. package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
  586. package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
  587. package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
  588. package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
  589. package/src/commerce/server/reservationSweepPort.ts +67 -0
  590. package/src/commerce/server/starterTermsPort.ts +22 -0
  591. package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
  592. package/src/composition/accountSupportContribution.ts +28 -0
  593. package/src/composition/commerceContribution.ts +35 -0
  594. package/src/composition/index.ts +2 -0
  595. package/src/fulfillment/index.ts +1 -1
  596. package/src/fulfillment/paidHandoff.ts +2 -2
  597. package/src/inventory/bindings.ts +12 -4
  598. package/src/inventory/index.ts +1 -0
  599. package/src/inventory/managedStockAvailability.ts +23 -0
  600. package/src/inventory/postgresStockAvailability.ts +2 -21
  601. package/src/inventory/stockReadResponse.ts +25 -0
  602. package/src/pricing/browser/index.ts +6 -0
  603. package/src/subscriptions/index.ts +3 -2
@@ -0,0 +1,53 @@
1
+ export type CheckoutStage = "quote" | "order_draft" | "start_runtime" | "account_link" | "apply_payment_result";
2
+ export type CheckoutStageRecorder = <T>(stage: CheckoutStage, operation: () => Promise<T>) => Promise<T>;
3
+
4
+ export type CheckoutTimingStage =
5
+ | CheckoutStage
6
+ | "rate_limit"
7
+ | "risk_blocklist"
8
+ | "persist_intent"
9
+ | "payment_method_ref"
10
+ | "customer_defaults"
11
+ | "total";
12
+
13
+ export type CheckoutTimingOutcome = "success" | "error" | "rejected";
14
+
15
+ export function createCheckoutTimingLogger(requestId: string, route: string): {
16
+ record: CheckoutStageRecorder & (<T>(stage: CheckoutTimingStage, operation: () => Promise<T>) => Promise<T>);
17
+ log: (stage: CheckoutTimingStage, outcome: CheckoutTimingOutcome) => void;
18
+ } {
19
+ const totalStartedAt = Date.now();
20
+
21
+ const write = (
22
+ stage: CheckoutTimingStage,
23
+ startedAt: number,
24
+ outcome: CheckoutTimingOutcome,
25
+ ): void => {
26
+ console.log(JSON.stringify({
27
+ level: "info",
28
+ event: "checkout_stage",
29
+ request_id: requestId,
30
+ route,
31
+ stage,
32
+ duration_ms: Math.max(0, Date.now() - startedAt),
33
+ outcome,
34
+ }));
35
+ };
36
+
37
+ return {
38
+ async record<T>(stage: CheckoutTimingStage, operation: () => Promise<T>): Promise<T> {
39
+ const startedAt = Date.now();
40
+ try {
41
+ const result = await operation();
42
+ write(stage, startedAt, "success");
43
+ return result;
44
+ } catch (error) {
45
+ write(stage, startedAt, "error");
46
+ throw error;
47
+ }
48
+ },
49
+ log(stage: CheckoutTimingStage, outcome: CheckoutTimingOutcome): void {
50
+ write(stage, totalStartedAt, outcome);
51
+ },
52
+ };
53
+ }
@@ -0,0 +1,37 @@
1
+ const MAX_DIAGNOSTIC_LENGTH = 240;
2
+
3
+ const REDACTION_PATTERNS: Array<[RegExp, string]> = [
4
+ [/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, "[redacted-email]"],
5
+ [/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9_]+\b/g, "[redacted-key]"],
6
+ [
7
+ /\b(client_secret|payment_secret|secret|token|authorization|password|pass|apikey|api_key)\s*[:=]\s*["']?[^"',\s}]+/gi,
8
+ "$1=[redacted]",
9
+ ],
10
+ [/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi, "Bearer [redacted]"],
11
+ [/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi, "[redacted-uuid]"],
12
+ [/\b(?:intent|checkout|order|payment|subscription|idempotency)[-_a-z0-9]*[:=][A-Za-z0-9._:-]{12,}/gi, "[redacted-id]"],
13
+ [/\+?\d[\d\s().-]{7,}\d/g, "[redacted-number]"],
14
+ ];
15
+
16
+ export function safeCommerceDiagnosticValue(value: unknown): string | null {
17
+ if (value === null || value === undefined) return null;
18
+ let text = String(value);
19
+ for (const [pattern, replacement] of REDACTION_PATTERNS) {
20
+ text = text.replace(pattern, replacement);
21
+ }
22
+ return text.length > MAX_DIAGNOSTIC_LENGTH
23
+ ? `${text.slice(0, MAX_DIAGNOSTIC_LENGTH - 3)}...`
24
+ : text;
25
+ }
26
+
27
+ export function checkoutOrchestrationFailureDetails(reason: string | null, previewDiagnosticsEnabled = false): {
28
+ feature: "checkout";
29
+ stage: "orchestrate_order";
30
+ diagnosticReason?: string;
31
+ } {
32
+ return {
33
+ feature: "checkout",
34
+ stage: "orchestrate_order",
35
+ ...(previewDiagnosticsEnabled && reason ? { diagnosticReason: reason } : {}),
36
+ };
37
+ }
@@ -0,0 +1,43 @@
1
+ import {
2
+ adminCommerceOrderCancelRequestSchema,
3
+ adminCommerceOrderMarkRefundedResponseSchema,
4
+ } from "../oms/omsContracts.js";
5
+ import type { CommerceOmsHoldPort } from "../oms/omsPorts.js";
6
+ import { authorize,parseOmsRequest,sendOmsMutationResponse,type BaseDeps } from "./commerceOmsHandlers.js";
7
+ import type { OmsHandlerRequest } from "./handlerSupport.js";
8
+
9
+ // This is deliberately not the fulfillment cancellation boundary. It only
10
+ // terminalizes an unpaid commerce order; the SQL RPC owns the state-machine and
11
+ // reservation-release side effect.
12
+ export function createAdminCommerceOrderCancelHandler<Response>({
13
+ authorizeAdmin,
14
+ omsPort,
15
+ mutationsEnabled,
16
+ respond,
17
+ }: BaseDeps<Response> & {
18
+ omsPort: Pick<CommerceOmsHoldPort, "cancelOrder">;
19
+ mutationsEnabled: () => boolean;
20
+ }) {
21
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
22
+ if (req.method !== "POST") return respond.sendMethodNotAllowed(res, ["POST"]);
23
+ const auth = await authorize(req, res, authorizeAdmin, respond);
24
+ if (!auth) return;
25
+ if (!mutationsEnabled()) {
26
+ respond.sendBffError(res, "FORBIDDEN", "Commerce OMS order cancellation is not enabled");
27
+ return;
28
+ }
29
+
30
+ const request = parseOmsRequest(res, respond, adminCommerceOrderCancelRequestSchema, req.body ?? {}, "Invalid admin commerce order cancellation request");
31
+ if (request === undefined) return;
32
+
33
+ await sendOmsMutationResponse(
34
+ res,
35
+ respond,
36
+ () => omsPort.cancelOrder({ ...request, actorUserId: auth.userId }),
37
+ adminCommerceOrderMarkRefundedResponseSchema,
38
+ "Admin commerce order cancellation returned invalid response",
39
+ "Admin commerce order cancellation failed",
40
+ (data) => data.status === "cancelled",
41
+ );
42
+ };
43
+ }
@@ -0,0 +1,71 @@
1
+ import type { OmsHandlerDeps,OmsHandlerRequest,OmsHandlerResponder } from "./handlerSupport.js";
2
+ /**
3
+ * The `?view=control_plane_v1` read handlers. Unlike the V0 handlers in
4
+ * `commerceOmsHandlers.ts`, these deliberately take NO `governance` dependency and
5
+ * do not run `applyOmsAgentCustomerReadGate`: `commerce.oms_control_plane.v1`
6
+ * carries no customer identity, so the gate would audit a `customer_read` of zero
7
+ * customers and mask a field the strict contract forbids — and the portable
8
+ * `node-postgres` branch of this same contract has neither an actor kind nor an
9
+ * audit client to run it with. The exemption holds only while the projection stays
10
+ * customer-free, a precondition pinned in `omsControlPlaneReadGovernance.test.ts`.
11
+ */
12
+ import {
13
+ omsControlPlaneDetailRequestSchema,
14
+ omsControlPlaneDetailResponseSchema,
15
+ omsControlPlaneListRequestSchema,
16
+ omsControlPlaneListResponseSchema,
17
+ type CommerceOmsControlPlanePort,
18
+ } from "../oms/omsControlPlane.js";
19
+
20
+ type Deps<Response> = OmsHandlerDeps<Response> & {
21
+ port: CommerceOmsControlPlanePort;
22
+ };
23
+
24
+ export function createCommerceOmsControlPlaneListHandler<Response>({ authorizeAdmin, port, respond }: Deps<Response>) {
25
+ return async (req: OmsHandlerRequest, res: Response): Promise<void> => {
26
+ if (req.method !== "GET") return respond.sendMethodNotAllowed(res, ["GET"]);
27
+ if (!await authorize(req, res, authorizeAdmin, respond)) return;
28
+ const request = omsControlPlaneListRequestSchema.safeParse(req.query ?? {});
29
+ if (!request.success) {
30
+ respond.sendBffError(res, "BAD_REQUEST", "Invalid OMS control-plane list request", { details: request.error.flatten() });
31
+ return;
32
+ }
33
+ try {
34
+ const result = omsControlPlaneListResponseSchema.parse(await port.listOrders(request.data));
35
+ respond.sendBffSuccess(res, result);
36
+ } catch {
37
+ respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "OMS control-plane list is unavailable");
38
+ }
39
+ };
40
+ }
41
+
42
+ export function createCommerceOmsControlPlaneDetailHandler<Response>({ authorizeAdmin, port, respond }: Deps<Response>) {
43
+ return async (req: OmsHandlerRequest, res: Response): Promise<void> => {
44
+ if (req.method !== "GET") return respond.sendMethodNotAllowed(res, ["GET"]);
45
+ if (!await authorize(req, res, authorizeAdmin, respond)) return;
46
+ const request = omsControlPlaneDetailRequestSchema.safeParse(req.query ?? {});
47
+ if (!request.success) {
48
+ respond.sendBffError(res, "BAD_REQUEST", "Invalid OMS control-plane detail request", { details: request.error.flatten() });
49
+ return;
50
+ }
51
+ try {
52
+ const result = await port.getOrderDetail(request.data);
53
+ if (!result) return respond.sendBffError(res, "NOT_FOUND", "Commerce order not found");
54
+ respond.sendBffSuccess(res, omsControlPlaneDetailResponseSchema.parse(result));
55
+ } catch {
56
+ respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "OMS control-plane detail is unavailable");
57
+ }
58
+ };
59
+ }
60
+
61
+ async function authorize<Response>(
62
+ req: OmsHandlerRequest,
63
+ res: Response,
64
+ authorizeAdmin: Deps<Response>["authorizeAdmin"],
65
+ respond: OmsHandlerResponder<Response>,
66
+ ): Promise<boolean> {
67
+ const result = await authorizeAdmin(req);
68
+ if (result.ok === true) return true;
69
+ respond.sendBffError(res, result.code, result.message);
70
+ return false;
71
+ }
@@ -0,0 +1,275 @@
1
+ import {
2
+ adminCommerceOrderDetailRequestSchema,
3
+ adminCommerceOrderDetailResponseSchema,
4
+ adminCommerceOrderHoldRequestSchema,
5
+ adminCommerceOrderHoldResponseSchema,
6
+ adminCommerceOrderNoteRequestSchema,
7
+ adminCommerceOrderNoteResponseSchema,
8
+ adminCommerceOrderReleaseHoldRequestSchema,
9
+ adminCommerceOrderUpdateShippingAddressRequestSchema,
10
+ adminCommerceOrderUpdateShippingAddressResponseSchema,
11
+ adminCommerceOrdersListRequestSchema,
12
+ adminCommerceOrdersListResponseSchema,
13
+ } from "../oms/omsContracts.js";
14
+ import { CommerceOmsConflictError,type CommerceOmsHoldPort,type CommerceOmsReadPort } from "../oms/omsPorts.js";
15
+ import type { OmsHandlerDeps,OmsHandlerRequest,OmsHandlerResponder } from "./handlerSupport.js";
16
+ import { unprojectedOmsReadGate,type OmsAdminAuthResult as AdminAuthResult } from "./handlerSupport.js";
17
+
18
+ export type { OmsAdminAuthResult as AdminAuthResult } from "./handlerSupport.js";
19
+ export type BaseDeps<Response> = OmsHandlerDeps<Response>;
20
+
21
+ export function createAdminCommerceOrdersListHandler<Response>({
22
+ authorizeAdmin,
23
+ omsPort,
24
+ readGate,
25
+ listRequestSchema = adminCommerceOrdersListRequestSchema,
26
+ listResponseSchema = adminCommerceOrdersListResponseSchema,
27
+ detailResponseSchema = adminCommerceOrderDetailResponseSchema,
28
+ respond,
29
+ }: BaseDeps<Response> & {
30
+ omsPort: Pick<CommerceOmsReadPort, "listOrders">;
31
+
32
+ }) {
33
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
34
+ if (req.method !== "GET" && req.method !== "POST") return respond.sendMethodNotAllowed(res, ["GET", "POST"]);
35
+ const auth = await authorize(req, res, authorizeAdmin, respond);
36
+ if (!auth) return;
37
+
38
+ const rawRequest = req.method === "GET" ? req.query ?? {} : req.body ?? {};
39
+ const request = parseOmsRequest(res, respond, listRequestSchema, rawRequest, "Invalid admin commerce orders request");
40
+ if (request === undefined) return;
41
+
42
+ // Wave 7a: gate the machine actor; the human admin OMS UI is unaffected.
43
+ const gate = readGate?.({
44
+ authorization: auth,
45
+ view: "list",
46
+ query: auditSafeListQuery(request),
47
+ }) ?? unprojectedOmsReadGate;
48
+ if (gate.blocked) return;
49
+
50
+ try {
51
+ const result = await omsPort.listOrders(request);
52
+ const response = listResponseSchema.safeParse(result);
53
+ if (!response.success) {
54
+ respond.sendBffError(res, "INVALID_RESPONSE", "Admin commerce orders returned invalid response");
55
+ return;
56
+ }
57
+ await gate.audit(response.data.orders.flatMap((o) => (o.clientId ? [o.clientId] : [])));
58
+ respond.sendBffSuccess(res, gate.maskOrders(response.data));
59
+ } catch {
60
+ respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce orders read failed");
61
+ }
62
+ };
63
+ }
64
+
65
+ function auditSafeListQuery(request: Record<string, unknown>): Record<string, unknown> {
66
+ const { search, ...safe } = request;
67
+ return search ? { ...safe, search: "[redacted]" } : safe;
68
+ }
69
+
70
+ export function createAdminCommerceOrderDetailHandler<Response>({
71
+ authorizeAdmin,
72
+ omsPort,
73
+ readGate,
74
+ listRequestSchema = adminCommerceOrdersListRequestSchema,
75
+ listResponseSchema = adminCommerceOrdersListResponseSchema,
76
+ detailResponseSchema = adminCommerceOrderDetailResponseSchema,
77
+ respond,
78
+ }: BaseDeps<Response> & {
79
+ omsPort: Pick<CommerceOmsReadPort, "getOrderDetail">;
80
+
81
+ }) {
82
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
83
+ if (req.method !== "GET") return respond.sendMethodNotAllowed(res, ["GET"]);
84
+ const auth = await authorize(req, res, authorizeAdmin, respond);
85
+ if (!auth) return;
86
+
87
+ const request = parseOmsRequest(res, respond, adminCommerceOrderDetailRequestSchema, req.query, "Invalid admin commerce order detail request");
88
+ if (request === undefined) return;
89
+
90
+ // Wave 7a: gate the machine actor. Detail returns FULL PII (gated + audited).
91
+ const gate = readGate?.({
92
+ authorization: auth,
93
+ view: "detail",
94
+ query: { ...request },
95
+ }) ?? unprojectedOmsReadGate;
96
+ if (gate.blocked) return;
97
+
98
+ try {
99
+ const result = await omsPort.getOrderDetail(request);
100
+ if (!result) {
101
+ respond.sendBffError(res, "NOT_FOUND", "Commerce order not found");
102
+ return;
103
+ }
104
+ const response = detailResponseSchema.safeParse(result);
105
+ if (!response.success) {
106
+ respond.sendBffError(res, "INVALID_RESPONSE", "Admin commerce order detail returned invalid response");
107
+ return;
108
+ }
109
+ await gate.audit(response.data.order.clientId ? [response.data.order.clientId] : []);
110
+ const masked = gate.maskOrders({ orders: [response.data.order] });
111
+ respond.sendBffSuccess(res, { ...response.data, order: masked.orders[0] });
112
+ } catch {
113
+ respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce order detail failed");
114
+ }
115
+ };
116
+ }
117
+
118
+ export function createAdminCommerceOrderHoldHandler<Response>({
119
+ authorizeAdmin,
120
+ omsPort,
121
+ respond,
122
+ }: BaseDeps<Response> & {
123
+ omsPort: Pick<CommerceOmsHoldPort, "createHold">;
124
+ }) {
125
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
126
+ if (req.method !== "POST") return respond.sendMethodNotAllowed(res, ["POST"]);
127
+ const auth = await authorize(req, res, authorizeAdmin, respond);
128
+ if (!auth) return;
129
+ const request = parseOmsRequest(res, respond, adminCommerceOrderHoldRequestSchema, req.body ?? {}, "Invalid admin commerce order hold request");
130
+ if (request === undefined) return;
131
+
132
+ await sendHoldResponse(res, respond, () => omsPort.createHold({ ...request, actorUserId: auth.userId }));
133
+ };
134
+ }
135
+
136
+ export function createAdminCommerceOrderReleaseHoldHandler<Response>({
137
+ authorizeAdmin,
138
+ omsPort,
139
+ respond,
140
+ }: BaseDeps<Response> & {
141
+ omsPort: Pick<CommerceOmsHoldPort, "releaseHold">;
142
+ }) {
143
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
144
+ if (req.method !== "POST") return respond.sendMethodNotAllowed(res, ["POST"]);
145
+ const auth = await authorize(req, res, authorizeAdmin, respond);
146
+ if (!auth) return;
147
+ const request = parseOmsRequest(res, respond, adminCommerceOrderReleaseHoldRequestSchema, req.body ?? {}, "Invalid admin commerce order release request");
148
+ if (request === undefined) return;
149
+
150
+ await sendHoldResponse(res, respond, () => omsPort.releaseHold({ ...request, actorUserId: auth.userId }));
151
+ };
152
+ }
153
+
154
+ export function createAdminCommerceOrderNoteHandler<Response>({
155
+ authorizeAdmin,
156
+ omsPort,
157
+ respond,
158
+ }: BaseDeps<Response> & {
159
+ omsPort: Pick<CommerceOmsHoldPort, "addNote">;
160
+ }) {
161
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
162
+ if (req.method !== "POST") return respond.sendMethodNotAllowed(res, ["POST"]);
163
+ const auth = await authorize(req, res, authorizeAdmin, respond);
164
+ if (!auth) return;
165
+ const request = parseOmsRequest(res, respond, adminCommerceOrderNoteRequestSchema, req.body ?? {}, "Invalid admin commerce order note request");
166
+ if (request === undefined) return;
167
+
168
+ await sendOmsMutationResponse(
169
+ res,
170
+ respond,
171
+ () => omsPort.addNote({ ...request, actorUserId: auth.userId }),
172
+ adminCommerceOrderNoteResponseSchema,
173
+ "Admin commerce note mutation returned invalid response",
174
+ "Admin commerce note mutation failed",
175
+ );
176
+ };
177
+ }
178
+
179
+ export function createAdminCommerceOrderUpdateShippingAddressHandler<Response>({
180
+ authorizeAdmin,
181
+ omsPort,
182
+ respond,
183
+ }: BaseDeps<Response> & {
184
+ omsPort: Pick<CommerceOmsHoldPort, "updateShippingAddress">;
185
+ }) {
186
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
187
+ if (req.method !== "POST") return respond.sendMethodNotAllowed(res, ["POST"]);
188
+ const auth = await authorize(req, res, authorizeAdmin, respond);
189
+ if (!auth) return;
190
+ const request = parseOmsRequest(res, respond, adminCommerceOrderUpdateShippingAddressRequestSchema, req.body ?? {}, "Invalid admin commerce order shipping address request");
191
+ if (request === undefined) return;
192
+
193
+ await sendOmsMutationResponse(
194
+ res,
195
+ respond,
196
+ () => omsPort.updateShippingAddress({ ...request, actorUserId: auth.userId }),
197
+ adminCommerceOrderUpdateShippingAddressResponseSchema,
198
+ "Admin commerce shipping address mutation returned invalid response",
199
+ "Admin commerce shipping address mutation failed",
200
+ );
201
+ };
202
+ }
203
+
204
+ export async function authorize<Response>(
205
+ req: OmsHandlerRequest,
206
+ res: Response,
207
+ authorizeAdmin: (req: OmsHandlerRequest) => Promise<AdminAuthResult>,
208
+ respond: OmsHandlerResponder<Response>,
209
+ ): Promise<{ ok: true; userId: string; isMachineActor?: boolean } | null> {
210
+ try {
211
+ const authorization = await authorizeAdmin(req);
212
+ if (authorization.ok === false) {
213
+ respond.sendBffError(res, authorization.code, authorization.message);
214
+ return null;
215
+ }
216
+ return { ok: true, userId: authorization.userId, isMachineActor: authorization.isMachineActor };
217
+ } catch {
218
+ respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin authorization failed");
219
+ return null;
220
+ }
221
+ }
222
+
223
+ function sendHoldResponse<Response>(res: Response, respond: OmsHandlerResponder<Response>, action: () => Promise<unknown>): Promise<void> {
224
+ return sendOmsMutationResponse(
225
+ res,
226
+ respond,
227
+ action,
228
+ adminCommerceOrderHoldResponseSchema,
229
+ "Admin commerce hold mutation returned invalid response",
230
+ "Admin commerce hold mutation failed",
231
+ );
232
+ }
233
+
234
+ // Returns the parsed request, or answers the 400 with the flattened details and returns undefined.
235
+ export function parseOmsRequest<Response, T>(
236
+ res: Response,
237
+ respond: OmsHandlerResponder<Response>,
238
+ schema: { safeParse: (input: unknown) => { success: true; data: T } | { success: false; error: { flatten: () => unknown } } },
239
+ input: unknown,
240
+ message: string,
241
+ ): T | undefined {
242
+ const request = schema.safeParse(input);
243
+ if (request.success === false) {
244
+ respond.sendBffError(res, "BAD_REQUEST", message, { details: request.error.flatten() });
245
+ return undefined;
246
+ }
247
+ return request.data;
248
+ }
249
+
250
+ // One OMS mutation answer: 502 on a refused or unaccepted result, 409 on a conflict, 503 on any other throw.
251
+ export async function sendOmsMutationResponse<Response, T>(
252
+ res: Response,
253
+ respond: OmsHandlerResponder<Response>,
254
+ action: () => Promise<unknown>,
255
+ schema: { safeParse: (input: unknown) => { success: true; data: T } | { success: false } },
256
+ invalidMessage: string,
257
+ failedMessage: string,
258
+ accept: (data: T) => boolean = () => true,
259
+ ): Promise<void> {
260
+ try {
261
+ const result = await action();
262
+ const response = schema.safeParse(result);
263
+ if (response.success === false || !accept(response.data)) {
264
+ respond.sendBffError(res, "INVALID_RESPONSE", invalidMessage);
265
+ return;
266
+ }
267
+ respond.sendBffSuccess(res, response.data);
268
+ } catch (error) {
269
+ if (error instanceof CommerceOmsConflictError) {
270
+ respond.sendBffError(res, "CONFLICT", error.message, { details: error.details });
271
+ return;
272
+ }
273
+ respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", failedMessage);
274
+ }
275
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ adminCommerceOrderMarkRefundedRequestSchema,
3
+ adminCommerceOrderMarkRefundedResponseSchema,
4
+ } from "../oms/omsContracts.js";
5
+ import type { CommerceOmsHoldPort } from "../oms/omsPorts.js";
6
+ import { authorize,parseOmsRequest,sendOmsMutationResponse,type BaseDeps } from "./commerceOmsHandlers.js";
7
+ import type { OmsHandlerRequest } from "./handlerSupport.js";
8
+
9
+ export function createAdminCommerceOrderMarkRefundedHandler<Response>({
10
+ authorizeAdmin,
11
+ omsPort,
12
+ mutationsEnabled,
13
+ respond,
14
+ }: BaseDeps<Response> & {
15
+ omsPort: Pick<CommerceOmsHoldPort, "markRefunded">;
16
+ mutationsEnabled: () => boolean;
17
+ }) {
18
+ return async function handler(req: OmsHandlerRequest, res: Response): Promise<void> {
19
+ if (req.method !== "POST") return respond.sendMethodNotAllowed(res, ["POST"]);
20
+ const auth = await authorize(req, res, authorizeAdmin, respond);
21
+ if (!auth) return;
22
+ if (!mutationsEnabled()) {
23
+ respond.sendBffError(res, "FORBIDDEN", "Commerce OMS refund mutations are not enabled");
24
+ return;
25
+ }
26
+
27
+ const request = parseOmsRequest(res, respond, adminCommerceOrderMarkRefundedRequestSchema, req.body ?? {}, "Invalid admin commerce order mark-refunded request");
28
+ if (request === undefined) return;
29
+
30
+ await sendOmsMutationResponse(
31
+ res,
32
+ respond,
33
+ () => omsPort.markRefunded({ ...request, actorUserId: auth.userId }),
34
+ adminCommerceOrderMarkRefundedResponseSchema,
35
+ "Admin commerce mark-refunded mutation returned invalid response",
36
+ "Admin commerce mark-refunded mutation failed",
37
+ );
38
+ };
39
+ }
@@ -0,0 +1,131 @@
1
+ import type { z } from "zod";
2
+ import { CommerceOrderDraftConflictError, CommerceOrderDraftInvalidResponseError, CommerceOrderDraftPersistenceError } from "../errors.js";
3
+ import { CommerceOrderDraftPriceChangedError } from "../orderDraftErrors.js";
4
+ import type { CommerceOrderDraftWritePort, CreateOrderDraftOptions } from "../contracts/ports.js";
5
+ import type { RpcError as CommerceOrderDraftRpcError } from "../contracts/omsTypes.js";
6
+ import { ORDER_DRAFT_RPC_NAME } from "./orderDraftRpcPayload.js";
7
+
8
+ /** Companion RPC that supersedes a stale pre-payment draft for a stable journey key. */
9
+ export const ORDER_DRAFT_SUPERSEDE_RPC_NAME =
10
+ "commerce_supersede_pre_payment_order_draft" as const;
11
+
12
+ export interface CommerceOrderDraftRpcClient<Args extends Record<string, unknown>> {
13
+ rpc(
14
+ functionName: typeof ORDER_DRAFT_RPC_NAME,
15
+ args: Args,
16
+ ): PromiseLike<{ data: unknown; error: CommerceOrderDraftRpcError | null }>;
17
+ rpc(
18
+ functionName: typeof ORDER_DRAFT_SUPERSEDE_RPC_NAME,
19
+ args: { p_idempotency_key: string },
20
+ ): PromiseLike<{ data: unknown; error: CommerceOrderDraftRpcError | null }>;
21
+ }
22
+
23
+ export function createCommerceOrderDraftRpcPort<Request extends { idempotencyKey: string }, Response, Args extends Record<string, unknown>>(
24
+ client: CommerceOrderDraftRpcClient<Args>,
25
+ bindings: { createOrderDraftRpcArgs(request: Request, clientId: string | null): Args; responseSchema: z.ZodType<Response> },
26
+ ): CommerceOrderDraftWritePort<Request, Response> {
27
+ return {
28
+ async createOrderDraft(
29
+ request: Request,
30
+ options?: CreateOrderDraftOptions,
31
+ ): Promise<Response> {
32
+ const args = bindings.createOrderDraftRpcArgs(request, options?.clientId ?? null);
33
+ let response = await client.rpc(ORDER_DRAFT_RPC_NAME, args);
34
+
35
+ // Stable journey key + edited cart: the producer keys the draft by
36
+ // idempotencyKey and 23505s when the same key arrives with a different
37
+ // (frozen-money) snapshot. Canonical order money freezes an order's amounts
38
+ // once written, so the stale draft cannot be mutated in place — supersede it
39
+ // (cancel the unpaid draft, drop the key) and retry create ONCE via the
40
+ // order-draft supersede RPC. If nothing was superseded (funds already moved),
41
+ // the conflict stands and the caller's resume path owns the in-flight order.
42
+ if (response.error && isIdempotencyConflict(response.error)) {
43
+ const superseded = await supersedeStalePrePaymentDraft(
44
+ client,
45
+ request.idempotencyKey,
46
+ );
47
+ if (superseded) {
48
+ response = await client.rpc(ORDER_DRAFT_RPC_NAME, args);
49
+ }
50
+ }
51
+
52
+ if (response.error) throw mapRpcError(response.error);
53
+
54
+ const parsed = bindings.responseSchema.safeParse(response.data);
55
+ if (!parsed.success) {
56
+ throw new CommerceOrderDraftInvalidResponseError();
57
+ }
58
+
59
+ return parsed.data;
60
+ },
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Best-effort supersede of a stale pre-payment draft for this idempotency key.
66
+ * Any failure returns false so the original conflict is preserved (fail-closed to
67
+ * the existing conflict path — never masks a real error as a fresh draft).
68
+ */
69
+ async function supersedeStalePrePaymentDraft<Args extends Record<string, unknown>>(
70
+ client: CommerceOrderDraftRpcClient<Args>,
71
+ idempotencyKey: string,
72
+ ): Promise<boolean> {
73
+ try {
74
+ const { data, error } = await client.rpc(ORDER_DRAFT_SUPERSEDE_RPC_NAME, {
75
+ p_idempotency_key: idempotencyKey,
76
+ });
77
+ if (error) return false;
78
+ return data === true;
79
+ } catch {
80
+ return false;
81
+ }
82
+ }
83
+
84
+ function mapRpcError(error: CommerceOrderDraftRpcError): Error {
85
+ const catalogReason = ["commerce_order_draft_catalog_head_moved", "commerce_order_draft_catalog_anchor_missing", "commerce_order_draft_offer_membership_refused"]
86
+ .find((reason) => [error.message, error.details, error.hint].some((value) => value?.includes(reason)));
87
+ if (catalogReason) return new CommerceOrderDraftConflictError("Commerce catalog admission changed", {
88
+ reason: catalogReason, code: error.code, boundary: ORDER_DRAFT_RPC_NAME,
89
+ });
90
+ if (isPromotionPriceChanged(error)) {
91
+ return new CommerceOrderDraftPriceChangedError(
92
+ "Commerce order draft promotion changed",
93
+ {
94
+ code: error.code,
95
+ boundary: ORDER_DRAFT_RPC_NAME,
96
+ reason: "promotion_code_unavailable",
97
+ },
98
+ );
99
+ }
100
+ if (isIdempotencyConflict(error)) {
101
+ return new CommerceOrderDraftConflictError("Commerce order draft idempotency conflict", {
102
+ code: error.code,
103
+ boundary: ORDER_DRAFT_RPC_NAME,
104
+ });
105
+ }
106
+
107
+ return new CommerceOrderDraftPersistenceError("Commerce order draft RPC failed", {
108
+ code: error.code,
109
+ boundary: ORDER_DRAFT_RPC_NAME,
110
+ });
111
+ }
112
+
113
+ function isPromotionPriceChanged(error: CommerceOrderDraftRpcError): boolean {
114
+ const searchable = [error.message, error.details, error.hint].filter(Boolean).join(" ");
115
+ return [
116
+ "promotion_code_global_limit_reached",
117
+ "promotion_code_customer_limit_reached",
118
+ "promotion_code_not_active",
119
+ "promotion_code_not_found",
120
+ "promotion_code_definition_changed",
121
+ "promotion_code_snapshot_revision_mismatch",
122
+ ].some((reason) => searchable.includes(reason));
123
+ }
124
+
125
+ function isIdempotencyConflict(error: CommerceOrderDraftRpcError): boolean {
126
+ const searchable = [error.message, error.details, error.hint].filter(Boolean).join(" ");
127
+ return (
128
+ error.code === "23505" ||
129
+ searchable.includes("commerce_order_draft_idempotency_conflict")
130
+ );
131
+ }