@openlup/platform 0.20.0 → 0.22.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 (458) hide show
  1. package/CHANGELOG.md +272 -278
  2. package/README.md +195 -6
  3. package/dist/composition/composeBundle.d.ts +13 -0
  4. package/dist/composition/composeBundle.js +4 -0
  5. package/dist/composition/fulfillmentContribution.d.ts +21 -0
  6. package/dist/composition/fulfillmentContribution.js +19 -0
  7. package/dist/composition/index.d.ts +1 -0
  8. package/dist/composition/index.js +2 -0
  9. package/dist/fulfillment/adapterConformance.d.ts +3 -0
  10. package/dist/fulfillment/adapterConformance.js +223 -0
  11. package/dist/fulfillment/bindings.d.ts +3 -0
  12. package/dist/fulfillment/bindings.js +29 -0
  13. package/dist/fulfillment/commerceFulfillmentHandlers.d.ts +29 -0
  14. package/dist/fulfillment/commerceFulfillmentHandlers.js +184 -0
  15. package/dist/fulfillment/commerceFulfillmentReadModel.d.ts +86 -0
  16. package/dist/fulfillment/commerceFulfillmentReadModel.js +131 -0
  17. package/dist/fulfillment/contracts/alignment.d.ts +25 -0
  18. package/dist/fulfillment/contracts/alignment.js +1 -0
  19. package/dist/fulfillment/contracts/bindings.d.ts +51 -0
  20. package/dist/fulfillment/contracts/bindings.js +1 -0
  21. package/dist/fulfillment/contracts/capabilities.d.ts +29 -0
  22. package/dist/fulfillment/contracts/capabilities.js +1 -0
  23. package/dist/fulfillment/contracts/conformance.d.ts +93 -0
  24. package/dist/fulfillment/contracts/conformance.js +1 -0
  25. package/dist/fulfillment/contracts/customerAlignment.d.ts +6 -0
  26. package/dist/fulfillment/contracts/customerAlignment.js +1 -0
  27. package/dist/fulfillment/contracts/dispatch.d.ts +105 -0
  28. package/dist/fulfillment/contracts/dispatch.js +1 -0
  29. package/dist/fulfillment/contracts/index.d.ts +18 -0
  30. package/dist/fulfillment/contracts/index.js +1 -0
  31. package/dist/fulfillment/contracts/label.d.ts +35 -0
  32. package/dist/fulfillment/contracts/label.js +1 -0
  33. package/dist/fulfillment/contracts/nativeUnsupported.d.ts +6 -0
  34. package/dist/fulfillment/contracts/nativeUnsupported.js +1 -0
  35. package/dist/fulfillment/contracts/observation.d.ts +52 -0
  36. package/dist/fulfillment/contracts/observation.js +1 -0
  37. package/dist/fulfillment/contracts/operator.d.ts +64 -0
  38. package/dist/fulfillment/contracts/operator.js +1 -0
  39. package/dist/fulfillment/contracts/read.d.ts +110 -0
  40. package/dist/fulfillment/contracts/read.js +1 -0
  41. package/dist/fulfillment/contracts/readback.d.ts +38 -0
  42. package/dist/fulfillment/contracts/readback.js +1 -0
  43. package/dist/fulfillment/contracts/replacement.d.ts +34 -0
  44. package/dist/fulfillment/contracts/replacement.js +1 -0
  45. package/dist/fulfillment/contracts/store.d.ts +86 -0
  46. package/dist/fulfillment/contracts/store.js +1 -0
  47. package/dist/fulfillment/contracts/sync.d.ts +170 -0
  48. package/dist/fulfillment/contracts/sync.js +1 -0
  49. package/dist/fulfillment/currentFulfillmentParcel.d.ts +2 -0
  50. package/dist/fulfillment/currentFulfillmentParcel.js +1 -0
  51. package/dist/fulfillment/delayReadModel.d.ts +11 -0
  52. package/dist/fulfillment/delayReadModel.js +45 -0
  53. package/dist/fulfillment/deliveryAlignmentReadModel.d.ts +4 -0
  54. package/dist/fulfillment/deliveryAlignmentReadModel.js +12 -0
  55. package/dist/fulfillment/dispatchProjection.d.ts +7 -0
  56. package/dist/fulfillment/dispatchProjection.js +18 -0
  57. package/dist/fulfillment/fulfillmentObservationEffects.d.ts +66 -0
  58. package/dist/fulfillment/fulfillmentObservationEffects.js +36 -0
  59. package/dist/fulfillment/handlerSchemas.d.ts +647 -0
  60. package/dist/fulfillment/handlerSchemas.js +213 -0
  61. package/dist/fulfillment/handlerSupport.d.ts +33 -0
  62. package/dist/fulfillment/handlerSupport.js +25 -0
  63. package/dist/fulfillment/index.d.ts +37 -0
  64. package/dist/fulfillment/index.js +37 -0
  65. package/dist/fulfillment/labelLifecycle.d.ts +24 -0
  66. package/dist/fulfillment/labelLifecycle.js +9 -0
  67. package/dist/fulfillment/lowStockEvidenceHandler.d.ts +36 -0
  68. package/dist/fulfillment/lowStockEvidenceHandler.js +46 -0
  69. package/dist/fulfillment/migrations.d.ts +27 -0
  70. package/dist/fulfillment/migrations.js +8 -0
  71. package/dist/fulfillment/nativeUnsupported.d.ts +10 -0
  72. package/dist/fulfillment/nativeUnsupported.js +18 -0
  73. package/dist/fulfillment/normalizedFulfillmentFacts.d.ts +2 -0
  74. package/dist/fulfillment/normalizedFulfillmentFacts.js +1 -0
  75. package/dist/fulfillment/observationProjection.d.ts +11 -0
  76. package/dist/fulfillment/observationProjection.js +37 -0
  77. package/dist/fulfillment/omnipack/capabilities.d.ts +3 -0
  78. package/dist/fulfillment/omnipack/capabilities.js +16 -0
  79. package/dist/fulfillment/omnipack/client.d.ts +37 -0
  80. package/dist/fulfillment/omnipack/client.js +162 -0
  81. package/dist/fulfillment/omnipack/index.d.ts +52 -0
  82. package/dist/fulfillment/omnipack/index.js +349 -0
  83. package/dist/fulfillment/omnipack/mappers.d.ts +73 -0
  84. package/dist/fulfillment/omnipack/mappers.js +177 -0
  85. package/dist/fulfillment/omnipack/observation.d.ts +21 -0
  86. package/dist/fulfillment/omnipack/observation.js +57 -0
  87. package/dist/fulfillment/omnipack/omnipackDispatchPayload.d.ts +36 -0
  88. package/dist/fulfillment/omnipack/omnipackDispatchPayload.js +63 -0
  89. package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.d.ts +83 -0
  90. package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.js +113 -0
  91. package/dist/fulfillment/omnipack/omnipackProductPackPayload.d.ts +11 -0
  92. package/dist/fulfillment/omnipack/omnipackProductPackPayload.js +38 -0
  93. package/dist/fulfillment/omnipack/omnipackProductPayload.d.ts +18 -0
  94. package/dist/fulfillment/omnipack/omnipackProductPayload.js +51 -0
  95. package/dist/fulfillment/omnipack/omnipackReconciliationPayload.d.ts +1 -0
  96. package/dist/fulfillment/omnipack/omnipackReconciliationPayload.js +3 -0
  97. package/dist/fulfillment/omnipack/omnipackStatusVocabulary.d.ts +4 -0
  98. package/dist/fulfillment/omnipack/omnipackStatusVocabulary.js +87 -0
  99. package/dist/fulfillment/omnipack/omnipackWebhookPayload.d.ts +9 -0
  100. package/dist/fulfillment/omnipack/omnipackWebhookPayload.js +76 -0
  101. package/dist/fulfillment/omnipack/productSyncMappers.d.ts +18 -0
  102. package/dist/fulfillment/omnipack/productSyncMappers.js +43 -0
  103. package/dist/fulfillment/omnipack/providerError.d.ts +25 -0
  104. package/dist/fulfillment/omnipack/providerError.js +47 -0
  105. package/dist/fulfillment/omnipack/trackingReferences.d.ts +16 -0
  106. package/dist/fulfillment/omnipack/trackingReferences.js +52 -0
  107. package/dist/fulfillment/paidFulfillmentRecovery.d.ts +67 -0
  108. package/dist/fulfillment/paidFulfillmentRecovery.js +154 -0
  109. package/dist/fulfillment/paidHandoff.d.ts +27 -0
  110. package/dist/fulfillment/paidHandoff.js +86 -0
  111. package/dist/fulfillment/paidHandoffPorts.d.ts +24 -0
  112. package/dist/fulfillment/paidHandoffPorts.js +3 -0
  113. package/dist/fulfillment/postgresDeliveryAlignment.d.ts +4 -0
  114. package/dist/fulfillment/postgresDeliveryAlignment.js +12 -0
  115. package/dist/fulfillment/postgresDispatchStore.d.ts +16 -0
  116. package/dist/fulfillment/postgresDispatchStore.js +44 -0
  117. package/dist/fulfillment/postgresEvidenceReadPort.d.ts +25 -0
  118. package/dist/fulfillment/postgresEvidenceReadPort.js +45 -0
  119. package/dist/fulfillment/postgresPaidFulfillmentRecovery.d.ts +25 -0
  120. package/dist/fulfillment/postgresPaidFulfillmentRecovery.js +26 -0
  121. package/dist/fulfillment/postgresPaidHandoffStore.d.ts +4 -0
  122. package/dist/fulfillment/postgresPaidHandoffStore.js +10 -0
  123. package/dist/fulfillment/postgresShipmentSpine.d.ts +63 -0
  124. package/dist/fulfillment/postgresShipmentSpine.js +232 -0
  125. package/dist/fulfillment/postgresStockSyncPort.d.ts +8 -0
  126. package/dist/fulfillment/postgresStockSyncPort.js +63 -0
  127. package/dist/fulfillment/productReconciliationEvidenceHandler.d.ts +36 -0
  128. package/dist/fulfillment/productReconciliationEvidenceHandler.js +50 -0
  129. package/dist/fulfillment/providerCapabilities.d.ts +9 -0
  130. package/dist/fulfillment/providerCapabilities.js +17 -0
  131. package/dist/fulfillment/providerCommandLedger.d.ts +143 -0
  132. package/dist/fulfillment/providerCommandLedger.js +14 -0
  133. package/dist/fulfillment/providerDispatchAcceptance.d.ts +26 -0
  134. package/dist/fulfillment/providerDispatchAcceptance.js +23 -0
  135. package/dist/fulfillment/providerDispatchError.d.ts +6 -0
  136. package/dist/fulfillment/providerDispatchError.js +5 -0
  137. package/dist/fulfillment/providerDispatchWorker.d.ts +31 -0
  138. package/dist/fulfillment/providerDispatchWorker.js +172 -0
  139. package/dist/fulfillment/providerProductSyncWorker.d.ts +28 -0
  140. package/dist/fulfillment/providerProductSyncWorker.js +122 -0
  141. package/dist/fulfillment/providerReconciliationError.d.ts +9 -0
  142. package/dist/fulfillment/providerReconciliationError.js +17 -0
  143. package/dist/fulfillment/providerReconciliationTerminalSkip.d.ts +2 -0
  144. package/dist/fulfillment/providerReconciliationTerminalSkip.js +6 -0
  145. package/dist/fulfillment/providerReconciliationTimestamp.d.ts +1 -0
  146. package/dist/fulfillment/providerReconciliationTimestamp.js +27 -0
  147. package/dist/fulfillment/providerReconciliationWorker.d.ts +82 -0
  148. package/dist/fulfillment/providerReconciliationWorker.js +151 -0
  149. package/dist/fulfillment/providerStockAvailability.d.ts +13 -0
  150. package/dist/fulfillment/providerStockAvailability.js +51 -0
  151. package/dist/fulfillment/providerStockSyncWorker.d.ts +37 -0
  152. package/dist/fulfillment/providerStockSyncWorker.js +186 -0
  153. package/dist/fulfillment/providerTrackingReferences.d.ts +15 -0
  154. package/dist/fulfillment/providerTrackingReferences.js +23 -0
  155. package/dist/fulfillment/replacementRefusals.d.ts +5 -0
  156. package/dist/fulfillment/replacementRefusals.js +38 -0
  157. package/dist/fulfillment/replacementShipmentHandler.d.ts +5 -0
  158. package/dist/fulfillment/replacementShipmentHandler.js +46 -0
  159. package/dist/fulfillment/schemaCapabilities.d.ts +13 -0
  160. package/dist/fulfillment/schemaCapabilities.js +7 -0
  161. package/dist/fulfillment/shipmentsOverviewHandler.d.ts +16 -0
  162. package/dist/fulfillment/shipmentsOverviewHandler.js +54 -0
  163. package/dist/fulfillment/statusMap.d.ts +2 -0
  164. package/dist/fulfillment/statusMap.js +1 -0
  165. package/dist/fulfillment/trackingProgress.d.ts +1 -0
  166. package/dist/fulfillment/trackingProgress.js +1 -0
  167. package/dist/fulfillment/verifiedIngress.d.ts +52 -0
  168. package/dist/fulfillment/verifiedIngress.js +66 -0
  169. package/dist/payments/adapterConformance.d.ts +8 -0
  170. package/dist/payments/adapterConformance.js +109 -0
  171. package/dist/payments/bindings.d.ts +3 -0
  172. package/dist/payments/bindings.js +17 -0
  173. package/dist/payments/checkoutActivePaymentActionResolver.d.ts +7 -0
  174. package/dist/payments/checkoutActivePaymentActionResolver.js +77 -0
  175. package/dist/payments/checkoutRecoveryPaymentResolver.d.ts +8 -0
  176. package/dist/payments/checkoutRecoveryPaymentResolver.js +87 -0
  177. package/dist/payments/contracts/adapter.d.ts +113 -0
  178. package/dist/payments/contracts/adapter.js +1 -0
  179. package/dist/payments/contracts/conformance.d.ts +155 -0
  180. package/dist/payments/contracts/conformance.js +1 -0
  181. package/dist/payments/contracts/evidence.d.ts +157 -0
  182. package/dist/payments/contracts/evidence.js +1 -0
  183. package/dist/payments/contracts/index.d.ts +10 -0
  184. package/dist/payments/contracts/index.js +1 -0
  185. package/dist/payments/contracts/preparedAttempt.d.ts +69 -0
  186. package/dist/payments/contracts/preparedAttempt.js +1 -0
  187. package/dist/payments/contracts/reconciliation.d.ts +303 -0
  188. package/dist/payments/contracts/reconciliation.js +1 -0
  189. package/dist/payments/contracts/repair.d.ts +92 -0
  190. package/dist/payments/contracts/repair.js +1 -0
  191. package/dist/payments/contracts/truth.d.ts +92 -0
  192. package/dist/payments/contracts/truth.js +1 -0
  193. package/dist/payments/eventConformanceRunner.d.ts +12 -0
  194. package/dist/payments/eventConformanceRunner.js +125 -0
  195. package/dist/payments/index.d.ts +16 -0
  196. package/dist/payments/index.js +16 -0
  197. package/dist/payments/paymentAttemptSilenceWindow.d.ts +10 -0
  198. package/dist/payments/paymentAttemptSilenceWindow.js +19 -0
  199. package/dist/payments/paymentMethodLifecycle.d.ts +11 -0
  200. package/dist/payments/paymentMethodLifecycle.js +37 -0
  201. package/dist/payments/paymentProviderReconciliationAbsenceReopen.d.ts +7 -0
  202. package/dist/payments/paymentProviderReconciliationAbsenceReopen.js +100 -0
  203. package/dist/payments/paymentProviderReconciliationEvidence.d.ts +36 -0
  204. package/dist/payments/paymentProviderReconciliationEvidence.js +91 -0
  205. package/dist/payments/paymentProviderReconciliationWorker.d.ts +4 -0
  206. package/dist/payments/paymentProviderReconciliationWorker.js +245 -0
  207. package/dist/payments/paymentTruth.d.ts +8 -0
  208. package/dist/payments/paymentTruth.js +125 -0
  209. package/dist/payments/paymentVerifyNowHandler.d.ts +27 -0
  210. package/dist/payments/paymentVerifyNowHandler.js +70 -0
  211. package/dist/payments/paymentVerifyNowService.d.ts +23 -0
  212. package/dist/payments/paymentVerifyNowService.js +93 -0
  213. package/dist/payments/paymentWebhookPostProcessing.d.ts +22 -0
  214. package/dist/payments/paymentWebhookPostProcessing.js +15 -0
  215. package/dist/payments/postgresPaymentTruth.d.ts +10 -0
  216. package/dist/payments/postgresPaymentTruth.js +126 -0
  217. package/dist/payments/preparedAttempt.d.ts +6 -0
  218. package/dist/payments/preparedAttempt.js +70 -0
  219. package/dist/payments/preparedAttemptFinalization.d.ts +5 -0
  220. package/dist/payments/preparedAttemptFinalization.js +12 -0
  221. package/dist/payments/schemaCapabilities.d.ts +10 -0
  222. package/dist/payments/schemaCapabilities.js +10 -0
  223. package/dist/payments/sql.d.ts +20 -0
  224. package/dist/payments/sql.js +6 -0
  225. package/dist/payments/stripe/classifyDecline.d.ts +46 -0
  226. package/dist/payments/stripe/classifyDecline.js +58 -0
  227. package/dist/payments/stripe/declineFailureHints.d.ts +46 -0
  228. package/dist/payments/stripe/declineFailureHints.js +87 -0
  229. package/dist/payments/stripe/donorContracts.d.ts +120 -0
  230. package/dist/payments/stripe/donorContracts.js +1 -0
  231. package/dist/payments/stripe/executionDecline.d.ts +53 -0
  232. package/dist/payments/stripe/executionDecline.js +107 -0
  233. package/dist/payments/stripe/index.d.ts +41 -0
  234. package/dist/payments/stripe/index.js +264 -0
  235. package/dist/payments/stripe/intentMapper.d.ts +26 -0
  236. package/dist/payments/stripe/intentMapper.js +51 -0
  237. package/dist/payments/stripe/methodFacts.d.ts +10 -0
  238. package/dist/payments/stripe/methodFacts.js +12 -0
  239. package/dist/payments/stripe/paymentFailureEvidence.d.ts +26 -0
  240. package/dist/payments/stripe/paymentFailureEvidence.js +33 -0
  241. package/dist/payments/stripe/stripeFailureEvidence.d.ts +41 -0
  242. package/dist/payments/stripe/stripeFailureEvidence.js +82 -0
  243. package/dist/payments/stripe/stripeIntentConfirmationEvidence.d.ts +28 -0
  244. package/dist/payments/stripe/stripeIntentConfirmationEvidence.js +32 -0
  245. package/dist/payments/stripe/stripePaymentReconciliationProvider.d.ts +35 -0
  246. package/dist/payments/stripe/stripePaymentReconciliationProvider.js +222 -0
  247. package/dist/payments/stripe/stripeRefundEvidence.d.ts +8 -0
  248. package/dist/payments/stripe/stripeRefundEvidence.js +17 -0
  249. package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.d.ts +45 -0
  250. package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.js +220 -0
  251. package/dist/payments/stripe/stripeWebhookNormalizer.d.ts +14 -0
  252. package/dist/payments/stripe/stripeWebhookNormalizer.js +243 -0
  253. package/dist/payments/stripe/webhookSignature.d.ts +14 -0
  254. package/dist/payments/stripe/webhookSignature.js +43 -0
  255. package/dist/payments/tpay/blikRecurringMapper.d.ts +37 -0
  256. package/dist/payments/tpay/blikRecurringMapper.js +24 -0
  257. package/dist/payments/tpay/capabilities.d.ts +3 -0
  258. package/dist/payments/tpay/capabilities.js +18 -0
  259. package/dist/payments/tpay/classifyDecline.d.ts +46 -0
  260. package/dist/payments/tpay/classifyDecline.js +58 -0
  261. package/dist/payments/tpay/declineFailureHints.d.ts +72 -0
  262. package/dist/payments/tpay/declineFailureHints.js +37 -0
  263. package/dist/payments/tpay/donorContracts.d.ts +140 -0
  264. package/dist/payments/tpay/donorContracts.js +1 -0
  265. package/dist/payments/tpay/index.d.ts +73 -0
  266. package/dist/payments/tpay/index.js +294 -0
  267. package/dist/payments/tpay/paymentFailureEvidence.d.ts +26 -0
  268. package/dist/payments/tpay/paymentFailureEvidence.js +33 -0
  269. package/dist/payments/tpay/preparedProviderAttempt.d.ts +22 -0
  270. package/dist/payments/tpay/preparedProviderAttempt.js +24 -0
  271. package/dist/payments/tpay/providerAttemptFailureDiagnostic.d.ts +3 -0
  272. package/dist/payments/tpay/providerAttemptFailureDiagnostic.js +95 -0
  273. package/dist/payments/tpay/tpayCreateTransactionInput.d.ts +25 -0
  274. package/dist/payments/tpay/tpayCreateTransactionInput.js +128 -0
  275. package/dist/payments/tpay/tpayDeclineEvidence.d.ts +126 -0
  276. package/dist/payments/tpay/tpayDeclineEvidence.js +177 -0
  277. package/dist/payments/tpay/tpayDispatchFailure.d.ts +60 -0
  278. package/dist/payments/tpay/tpayDispatchFailure.js +121 -0
  279. package/dist/payments/tpay/tpayFailureEvidence.d.ts +20 -0
  280. package/dist/payments/tpay/tpayFailureEvidence.js +61 -0
  281. package/dist/payments/tpay/tpayHttpClient.d.ts +52 -0
  282. package/dist/payments/tpay/tpayHttpClient.js +185 -0
  283. package/dist/payments/tpay/tpayHttpFailure.d.ts +57 -0
  284. package/dist/payments/tpay/tpayHttpFailure.js +143 -0
  285. package/dist/payments/tpay/tpayPaymentExecutionAdapter.d.ts +20 -0
  286. package/dist/payments/tpay/tpayPaymentExecutionAdapter.js +249 -0
  287. package/dist/payments/tpay/tpayPaymentReconciliationProvider.d.ts +5 -0
  288. package/dist/payments/tpay/tpayPaymentReconciliationProvider.js +244 -0
  289. package/dist/payments/tpay/tpayTransactionPayload.d.ts +120 -0
  290. package/dist/payments/tpay/tpayTransactionPayload.js +96 -0
  291. package/dist/payments/tpay/wallClockTime.d.ts +31 -0
  292. package/dist/payments/tpay/wallClockTime.js +57 -0
  293. package/dist/payments/tpay/webhookJwsVerifier.d.ts +17 -0
  294. package/dist/payments/tpay/webhookJwsVerifier.js +51 -0
  295. package/dist/payments/tpay/webhookNormalizer.d.ts +54 -0
  296. package/dist/payments/tpay/webhookNormalizer.js +200 -0
  297. package/dist/payments/verifiedEvidenceProjection.d.ts +12 -0
  298. package/dist/payments/verifiedEvidenceProjection.js +166 -0
  299. package/dist/payments/verifiedIngress.d.ts +119 -0
  300. package/dist/payments/verifiedIngress.js +220 -0
  301. package/package.json +37 -2
  302. package/release-gates.json +105 -3
  303. package/sql/20260808210000_fulfillment_shipment_rail.sql +810 -0
  304. package/sql/20260810180000_payment_settlement_rail.sql +574 -0
  305. package/sql/20260815150000_payment_truth_reconciliation.sql +479 -0
  306. package/sql/20260819150000_fulfillment_shipment_sequence.sql +98 -0
  307. package/sql/20260826100000_late_payment_shifts_the_subscription_cycle.sql +215 -0
  308. package/sql/20261022080000_fulfillment_command_ledger.sql +786 -0
  309. package/sql/20261022090000_fulfillment_delivery_alignment.sql +1106 -0
  310. package/src/composition/composeBundle.ts +13 -0
  311. package/src/composition/fulfillmentContribution.ts +28 -0
  312. package/src/composition/index.ts +2 -0
  313. package/src/fulfillment/adapterConformance.ts +195 -0
  314. package/src/fulfillment/bindings.ts +26 -0
  315. package/src/fulfillment/commerceFulfillmentHandlers.ts +263 -0
  316. package/src/fulfillment/commerceFulfillmentReadModel.ts +257 -0
  317. package/src/fulfillment/contracts/alignment.ts +13 -0
  318. package/src/fulfillment/contracts/bindings.ts +30 -0
  319. package/src/fulfillment/contracts/capabilities.ts +15 -0
  320. package/src/fulfillment/contracts/conformance.ts +61 -0
  321. package/src/fulfillment/contracts/customerAlignment.ts +4 -0
  322. package/src/fulfillment/contracts/dispatch.ts +58 -0
  323. package/src/fulfillment/contracts/index.ts +18 -0
  324. package/src/fulfillment/contracts/label.ts +9 -0
  325. package/src/fulfillment/contracts/nativeUnsupported.ts +6 -0
  326. package/src/fulfillment/contracts/observation.ts +18 -0
  327. package/src/fulfillment/contracts/operator.ts +31 -0
  328. package/src/fulfillment/contracts/read.ts +42 -0
  329. package/src/fulfillment/contracts/readback.ts +11 -0
  330. package/src/fulfillment/contracts/replacement.ts +15 -0
  331. package/src/fulfillment/contracts/store.ts +26 -0
  332. package/src/fulfillment/contracts/sync.ts +61 -0
  333. package/src/fulfillment/currentFulfillmentParcel.ts +2 -0
  334. package/src/fulfillment/delayReadModel.ts +60 -0
  335. package/src/fulfillment/deliveryAlignmentReadModel.ts +15 -0
  336. package/src/fulfillment/dispatchProjection.ts +20 -0
  337. package/src/fulfillment/fulfillmentObservationEffects.ts +86 -0
  338. package/src/fulfillment/handlerSchemas.ts +255 -0
  339. package/src/fulfillment/handlerSupport.ts +25 -0
  340. package/src/fulfillment/index.ts +38 -0
  341. package/src/fulfillment/labelLifecycle.ts +11 -0
  342. package/src/fulfillment/lowStockEvidenceHandler.ts +60 -0
  343. package/src/fulfillment/migrations.ts +8 -0
  344. package/src/fulfillment/nativeUnsupported.ts +23 -0
  345. package/src/fulfillment/normalizedFulfillmentFacts.ts +2 -0
  346. package/src/fulfillment/observationProjection.ts +41 -0
  347. package/src/fulfillment/omnipack/capabilities.ts +18 -0
  348. package/src/fulfillment/omnipack/client.ts +258 -0
  349. package/src/fulfillment/omnipack/index.ts +312 -0
  350. package/src/fulfillment/omnipack/mappers.ts +261 -0
  351. package/src/fulfillment/omnipack/observation.ts +61 -0
  352. package/src/fulfillment/omnipack/omnipackDispatchPayload.ts +93 -0
  353. package/src/fulfillment/omnipack/omnipackOutboundOrderPayload.ts +194 -0
  354. package/src/fulfillment/omnipack/omnipackProductPackPayload.ts +47 -0
  355. package/src/fulfillment/omnipack/omnipackProductPayload.ts +67 -0
  356. package/src/fulfillment/omnipack/omnipackReconciliationPayload.ts +7 -0
  357. package/src/fulfillment/omnipack/omnipackStatusVocabulary.ts +103 -0
  358. package/src/fulfillment/omnipack/omnipackWebhookPayload.ts +73 -0
  359. package/src/fulfillment/omnipack/productSyncMappers.ts +74 -0
  360. package/src/fulfillment/omnipack/providerError.ts +64 -0
  361. package/src/fulfillment/omnipack/trackingReferences.ts +77 -0
  362. package/src/fulfillment/paidFulfillmentRecovery.ts +252 -0
  363. package/src/fulfillment/paidHandoff.ts +122 -0
  364. package/src/fulfillment/paidHandoffPorts.ts +21 -0
  365. package/src/fulfillment/postgresDeliveryAlignment.ts +14 -0
  366. package/src/fulfillment/postgresDispatchStore.ts +55 -0
  367. package/src/fulfillment/postgresEvidenceReadPort.ts +59 -0
  368. package/src/fulfillment/postgresPaidFulfillmentRecovery.ts +29 -0
  369. package/src/fulfillment/postgresPaidHandoffStore.ts +11 -0
  370. package/src/fulfillment/postgresShipmentSpine.ts +321 -0
  371. package/src/fulfillment/postgresStockSyncPort.ts +65 -0
  372. package/src/fulfillment/productReconciliationEvidenceHandler.ts +64 -0
  373. package/src/fulfillment/providerCapabilities.ts +18 -0
  374. package/src/fulfillment/providerCommandLedger.ts +53 -0
  375. package/src/fulfillment/providerDispatchAcceptance.ts +31 -0
  376. package/src/fulfillment/providerDispatchError.ts +7 -0
  377. package/src/fulfillment/providerDispatchWorker.ts +131 -0
  378. package/src/fulfillment/providerProductSyncWorker.ts +154 -0
  379. package/src/fulfillment/providerReconciliationError.ts +20 -0
  380. package/src/fulfillment/providerReconciliationTerminalSkip.ts +8 -0
  381. package/src/fulfillment/providerReconciliationTimestamp.ts +34 -0
  382. package/src/fulfillment/providerReconciliationWorker.ts +150 -0
  383. package/src/fulfillment/providerStockAvailability.ts +60 -0
  384. package/src/fulfillment/providerStockSyncWorker.ts +222 -0
  385. package/src/fulfillment/providerTrackingReferences.ts +31 -0
  386. package/src/fulfillment/replacementRefusals.ts +43 -0
  387. package/src/fulfillment/replacementShipmentHandler.ts +47 -0
  388. package/src/fulfillment/schemaCapabilities.ts +7 -0
  389. package/src/fulfillment/shipmentsOverviewHandler.ts +73 -0
  390. package/src/fulfillment/statusMap.ts +2 -0
  391. package/src/fulfillment/trackingProgress.ts +1 -0
  392. package/src/fulfillment/verifiedIngress.ts +80 -0
  393. package/src/payments/adapterConformance.ts +118 -0
  394. package/src/payments/bindings.ts +17 -0
  395. package/src/payments/checkoutActivePaymentActionResolver.ts +97 -0
  396. package/src/payments/checkoutRecoveryPaymentResolver.ts +108 -0
  397. package/src/payments/contracts/adapter.ts +96 -0
  398. package/src/payments/contracts/conformance.ts +171 -0
  399. package/src/payments/contracts/evidence.ts +142 -0
  400. package/src/payments/contracts/index.ts +54 -0
  401. package/src/payments/contracts/preparedAttempt.ts +86 -0
  402. package/src/payments/contracts/reconciliation.ts +296 -0
  403. package/src/payments/contracts/repair.ts +95 -0
  404. package/src/payments/contracts/truth.ts +108 -0
  405. package/src/payments/eventConformanceRunner.ts +149 -0
  406. package/src/payments/index.ts +21 -0
  407. package/src/payments/paymentAttemptSilenceWindow.ts +26 -0
  408. package/src/payments/paymentMethodLifecycle.ts +50 -0
  409. package/src/payments/paymentProviderReconciliationAbsenceReopen.ts +130 -0
  410. package/src/payments/paymentProviderReconciliationEvidence.ts +117 -0
  411. package/src/payments/paymentProviderReconciliationWorker.ts +291 -0
  412. package/src/payments/paymentTruth.ts +131 -0
  413. package/src/payments/paymentVerifyNowHandler.ts +94 -0
  414. package/src/payments/paymentVerifyNowService.ts +125 -0
  415. package/src/payments/paymentWebhookPostProcessing.ts +36 -0
  416. package/src/payments/postgresPaymentTruth.ts +149 -0
  417. package/src/payments/preparedAttempt.ts +90 -0
  418. package/src/payments/preparedAttemptFinalization.ts +13 -0
  419. package/src/payments/schemaCapabilities.ts +10 -0
  420. package/src/payments/sql.ts +6 -0
  421. package/src/payments/stripe/classifyDecline.ts +62 -0
  422. package/src/payments/stripe/declineFailureHints.ts +89 -0
  423. package/src/payments/stripe/donorContracts.ts +87 -0
  424. package/src/payments/stripe/executionDecline.ts +126 -0
  425. package/src/payments/stripe/index.ts +265 -0
  426. package/src/payments/stripe/intentMapper.ts +58 -0
  427. package/src/payments/stripe/methodFacts.ts +21 -0
  428. package/src/payments/stripe/paymentFailureEvidence.ts +58 -0
  429. package/src/payments/stripe/stripeFailureEvidence.ts +115 -0
  430. package/src/payments/stripe/stripeIntentConfirmationEvidence.ts +34 -0
  431. package/src/payments/stripe/stripePaymentReconciliationProvider.ts +263 -0
  432. package/src/payments/stripe/stripeRefundEvidence.ts +19 -0
  433. package/src/payments/stripe/stripeSandboxPaymentExecutionAdapter.ts +283 -0
  434. package/src/payments/stripe/stripeWebhookNormalizer.ts +277 -0
  435. package/src/payments/stripe/webhookSignature.ts +55 -0
  436. package/src/payments/tpay/blikRecurringMapper.ts +42 -0
  437. package/src/payments/tpay/capabilities.ts +21 -0
  438. package/src/payments/tpay/classifyDecline.ts +62 -0
  439. package/src/payments/tpay/declineFailureHints.ts +90 -0
  440. package/src/payments/tpay/donorContracts.ts +104 -0
  441. package/src/payments/tpay/index.ts +293 -0
  442. package/src/payments/tpay/paymentFailureEvidence.ts +58 -0
  443. package/src/payments/tpay/preparedProviderAttempt.ts +38 -0
  444. package/src/payments/tpay/providerAttemptFailureDiagnostic.ts +99 -0
  445. package/src/payments/tpay/tpayCreateTransactionInput.ts +158 -0
  446. package/src/payments/tpay/tpayDeclineEvidence.ts +233 -0
  447. package/src/payments/tpay/tpayDispatchFailure.ts +186 -0
  448. package/src/payments/tpay/tpayFailureEvidence.ts +75 -0
  449. package/src/payments/tpay/tpayHttpClient.ts +290 -0
  450. package/src/payments/tpay/tpayHttpFailure.ts +186 -0
  451. package/src/payments/tpay/tpayPaymentExecutionAdapter.ts +297 -0
  452. package/src/payments/tpay/tpayPaymentReconciliationProvider.ts +285 -0
  453. package/src/payments/tpay/tpayTransactionPayload.ts +207 -0
  454. package/src/payments/tpay/wallClockTime.ts +57 -0
  455. package/src/payments/tpay/webhookJwsVerifier.ts +82 -0
  456. package/src/payments/tpay/webhookNormalizer.ts +279 -0
  457. package/src/payments/verifiedEvidenceProjection.ts +179 -0
  458. package/src/payments/verifiedIngress.ts +317 -0
@@ -0,0 +1,86 @@
1
+ import type {
2
+ PaymentAttemptStatus,
3
+ PaymentExecutionBaseInput,
4
+ PaymentExecutionBaseResult,
5
+ } from "@openlup/core/payment";
6
+
7
+ /** Durable preparation facts; provider admission belongs to the caller. */
8
+ export interface PreparedAttemptPrepareInput<P extends string = string> {
9
+ idempotencyKey: string;
10
+ paymentIntentId: string;
11
+ provider: P;
12
+ providerIdempotencyKey: string;
13
+ providerRequestFingerprint: string;
14
+ providerFlow: string;
15
+ paymentMethodRef?: string | null;
16
+ requestPayload: Record<string, unknown>;
17
+ }
18
+
19
+ export interface PreparedAttemptPersistenceResult<N extends string = string> {
20
+ paymentAttemptId: string;
21
+ status: PaymentAttemptStatus;
22
+ replayed: boolean;
23
+ providerAttemptId: string | null;
24
+ providerSessionId: string | null;
25
+ nextActionKind: N | null;
26
+ }
27
+
28
+ export interface PreparedAttemptFinalizeInput<N extends string = string> extends Pick<
29
+ PaymentExecutionBaseResult,
30
+ "providerAttemptId" | "providerSessionId" | "attemptStatus" | "requestPayload" | "responsePayload"
31
+ > {
32
+ idempotencyKey: string;
33
+ paymentIntentId: string;
34
+ paymentAttemptId: string;
35
+ providerIdempotencyKey: string;
36
+ providerRequestFingerprint: string;
37
+ nextActionKind: N | null;
38
+ }
39
+
40
+ /** Only persistence capabilities needed by interactive attempt ordering. */
41
+ export interface PreparedAttemptPersistencePort<P extends string = string, N extends string = string> {
42
+ prepareProviderAttempt(input: PreparedAttemptPrepareInput<P>): Promise<PreparedAttemptPersistenceResult<N>>;
43
+ finalizeProviderAttempt(input: PreparedAttemptFinalizeInput<N>): Promise<PreparedAttemptPersistenceResult<N>>;
44
+ }
45
+
46
+ export interface PreparedAttemptExecutionPort<I extends PaymentExecutionBaseInput, R extends PaymentExecutionBaseResult> {
47
+ validateInput?(input: I): void;
48
+ execute(input: I): Promise<R>;
49
+ }
50
+
51
+ /** Exact execution extensions and original input/port references cross this seam. */
52
+ export interface PreparedAttemptExecutionInput<
53
+ I extends PaymentExecutionBaseInput,
54
+ R extends PaymentExecutionBaseResult,
55
+ P extends string,
56
+ N extends string,
57
+ > {
58
+ paymentPort: PreparedAttemptPersistencePort<P, N>;
59
+ executionPort: PreparedAttemptExecutionPort<I, R>;
60
+ provider: P;
61
+ paymentIntentId: string;
62
+ executionInput: I;
63
+ prepareIdempotencyKey: string;
64
+ finalizeIdempotencyKey: string;
65
+ providerIdempotencyKey: string;
66
+ providerRequestFingerprint: string;
67
+ providerFlow: string;
68
+ paymentMethodRef?: string | null;
69
+ prepareRequestPayload: Record<string, unknown>;
70
+ validateExecution?: (execution: R) => void;
71
+ }
72
+
73
+ /** Synchronous, call-scoped native trust, diagnostics and error construction. */
74
+ export interface PreparedAttemptFailurePolicy<E extends Error, N extends string> {
75
+ replayError(prepared: PreparedAttemptPersistenceResult<N>): Error;
76
+ isTrustedNoCharge(error: unknown): error is E;
77
+ logRetry(error: E, prepared: PreparedAttemptPersistenceResult<N>): void;
78
+ exhaustedError(error: E, first: E, prepared: PreparedAttemptPersistenceResult<N>): E;
79
+ executionError(error: unknown, prepared: PreparedAttemptPersistenceResult<N>): Error;
80
+ finalizationError(error: unknown, prepared: PreparedAttemptPersistenceResult<N>): Error;
81
+ }
82
+
83
+ export interface PreparedAttemptExecutionResult<R extends PaymentExecutionBaseResult> {
84
+ execution: R;
85
+ attempt: { paymentAttemptId: string; status: PaymentAttemptStatus };
86
+ }
@@ -0,0 +1,296 @@
1
+ import type { ProviderReadPurpose } from "./evidence.js";
2
+ export type ReconciliationProviderKind = string;
3
+ export type ProviderReconciliationStatusKind = "succeeded" | "failed" | "pending" | "unknown";
4
+
5
+ export interface ProviderReconciliationStatus {
6
+ status: ProviderReconciliationStatusKind;
7
+ providerStatus: string;
8
+ occurredAt: string | null;
9
+ failureReason: string | null;
10
+ amountMinor: number | null;
11
+ currency: string | null;
12
+ rawPayload: Record<string, unknown>;
13
+ }
14
+
15
+ /**
16
+ * Who is asking, and therefore what an unresolved provider state MEANS.
17
+ *
18
+ * The same read answers two different questions. Reconciliation — the caller
19
+ * that names no purpose — asks "is this attempt over", long after the buyer
20
+ * left, and an intent still waiting for its first payment method is over. A
21
+ * buyer standing in a live checkout asks "is this attempt settled yet", and the
22
+ * same state means the opposite: nobody has been asked anything.
23
+ *
24
+ * ⛔ Omitting the purpose keeps the reconciliation reading. Terminalizing real
25
+ * abandonment is the more expensive of the two errors to lose, so it is the
26
+ * behaviour a caller gets by default rather than one it must opt into.
27
+ */
28
+
29
+
30
+ export interface PaymentProviderReconciliationProvider {
31
+ readPayment(input: {
32
+ providerPaymentId: string;
33
+ attempt?: ClaimedPaymentAttempt;
34
+ purpose?: ProviderReadPurpose;
35
+ }): Promise<ProviderReconciliationStatus>;
36
+ /** Atomically close an incomplete provider object before minting a replacement. */
37
+ closePayment?(input: { providerPaymentId: string }): Promise<ProviderReconciliationStatus>;
38
+
39
+ /** Exact provider-side absence only; missing local acknowledgement is not
40
+ * absence proof and must never authorize another charge. */
41
+ findPaymentByLocalIntent?(input: {
42
+ attempt: ClaimedPaymentAttempt;
43
+ }): Promise<"found" | "absent">;
44
+ }
45
+
46
+ export interface ClaimedPaymentAttempt {
47
+ paymentAttemptId: string;
48
+ paymentIntentId: string;
49
+ paymentId: string;
50
+ orderId: string;
51
+ subscriptionId: string | null;
52
+ subscriptionCycleId: string | null;
53
+ provider: ReconciliationProviderKind;
54
+ providerPaymentId: string | null;
55
+ providerAttemptId: string | null;
56
+ providerSessionId: string | null;
57
+ attemptStatus: string;
58
+ intentStatus: string;
59
+ amountMinor: number;
60
+ currency: string;
61
+ orderMode: "one_time" | "subscription_cycle";
62
+ cycleRetryAttempt: number;
63
+ cycleNextRetryAt: string | null;
64
+ localUpdatedAt: string;
65
+ }
66
+
67
+
68
+ export type ManualInteractivePreparedAttemptAbsenceEvidence = {
69
+ providerAbsenceConfirmed: true;
70
+ watchdogEvidence: true;
71
+ evidenceCode: "operator_verified_absence" | "operator_documented_absence";
72
+ };
73
+
74
+ export interface InteractivePreparedAttemptReopenResult {
75
+ paymentAttemptId: string;
76
+ paymentIntentId: string;
77
+ paymentAttemptStatus: "failed";
78
+ paymentIntentStatus: "failed";
79
+ replayed: boolean;
80
+ }
81
+
82
+ export interface PaymentProviderReconciliationPort {
83
+ claimPreparedAttempts(input: {
84
+ now: string;
85
+ staleAfterSeconds: number;
86
+ limit: number;
87
+ claimKey: string;
88
+ }): Promise<ClaimedPaymentAttempt[]>;
89
+ claimStaleAttempts(input: {
90
+ now: string;
91
+ staleAfterSeconds: number;
92
+ limit: number;
93
+ claimKey: string;
94
+ }): Promise<ClaimedPaymentAttempt[]>;
95
+ recordEvidence(input: {
96
+ idempotencyKey: string;
97
+ provider: ReconciliationProviderKind;
98
+ providerPaymentId: string | null;
99
+ paymentIntentId: string;
100
+ paymentAttemptId: string;
101
+ localStatus: string;
102
+ providerStatus: string;
103
+ correctionStatus: "observed" | "corrected" | "ignored" | "failed";
104
+ checkedAt: string;
105
+ payload: Record<string, unknown>;
106
+ }): Promise<{ replayed: boolean }>;
107
+ applyTerminalResult(input: {
108
+ idempotencyKey: string;
109
+ expectedOrderId: string;
110
+ expectedPaymentIntentId: string;
111
+ expectedPaymentAttemptId: string;
112
+ expectedPaymentId: string;
113
+ provider: ReconciliationProviderKind;
114
+ providerPaymentId: string;
115
+ localStatus: string;
116
+ providerStatus: string;
117
+ resultStatus: "succeeded" | "failed";
118
+ occurredAt: string;
119
+ failureReason: string | null;
120
+ /**
121
+ * The class the reading adapter already decided for this refusal, persisted
122
+ * beside the refusal itself on both the attempt and the dunning case the
123
+ * terminal write opens.
124
+ *
125
+ * OPTIONAL, and absence is a real state rather than a default: a caller that
126
+ * omits it writes exactly what it wrote before this field existed, because
127
+ * the RPC coalesces it to NULL and the SQL treats a NULL class as "stamp
128
+ * nothing" rather than "stamp NULL". Two of this port's three consumers
129
+ * (`paymentVerifyNowService`, `checkoutRecoveryPaymentResolver`) resolve a
130
+ * payment without classifying it and are pinned to stay classification-absent.
131
+ *
132
+ * Shape mirrors `applyPaymentResultRpc` deliberately, so the synchronous
133
+ * decline rail and this polling rail hand the control plane the same object.
134
+ */
135
+ failureClassification?: { failureClass: string; decidedBy: string } | null;
136
+ checkedAt: string;
137
+ payload: Record<string, unknown>;
138
+ }): Promise<{
139
+ replayed: boolean;
140
+ paymentResult: {
141
+ paymentIntentId: string;
142
+ paymentAttemptId: string;
143
+ paymentId: string;
144
+ orderId: string;
145
+ status: string;
146
+ kind: string;
147
+ replayed: boolean;
148
+ };
149
+ correctionStatus: "corrected" | "ignored";
150
+ subscriptionWebhookDunning: {
151
+ opened: boolean;
152
+ replayed: boolean;
153
+ caseId: string | null;
154
+ } | null;
155
+ }>;
156
+ reopenPreparedAttemptAfterAbsence(input: {
157
+ idempotencyKey: string;
158
+ paymentAttemptId: string;
159
+ expectedPaymentIntentId: string;
160
+ expectedSubscriptionCycleId: string;
161
+ operatorRef: string;
162
+ absenceCheckedAt: string;
163
+ nextRetryAt: string;
164
+ absenceEvidence: Record<string, unknown>;
165
+ }): Promise<{ replayed: boolean }>;
166
+ /**
167
+ * Optional because the automatic reconciliation worker and its provider
168
+ * neutral fixtures must not acquire an operator-only interactive capability.
169
+ * A caller that selects this rail must require the narrow interface below.
170
+ */
171
+ reopenInteractivePreparedAttemptAfterAbsence?(input: {
172
+ idempotencyKey: string;
173
+ paymentAttemptId: string;
174
+ expectedPaymentIntentId: string;
175
+ expectedOrderId: string;
176
+ expectedSubscriptionId: string | null;
177
+ expectedSubscriptionCycleId: string | null;
178
+ operatorRef: string;
179
+ absenceCheckedAt: string;
180
+ absenceEvidence: ManualInteractivePreparedAttemptAbsenceEvidence;
181
+ }): Promise<InteractivePreparedAttemptReopenResult>;
182
+ }
183
+
184
+ /**
185
+ * Service-role operator boundary for an interactive checkout, distinct from
186
+ * the renewal retry RPC. It terminalizes the local prepared attempt after a
187
+ * human/provider absence confirmation; it never schedules dunning or cron.
188
+ */
189
+ export interface InteractivePreparedAttemptManualReconciliationPort extends PaymentProviderReconciliationPort {
190
+ reopenInteractivePreparedAttemptAfterAbsence(input: {
191
+ idempotencyKey: string;
192
+ paymentAttemptId: string;
193
+ expectedPaymentIntentId: string;
194
+ expectedOrderId: string;
195
+ expectedSubscriptionId: string | null;
196
+ expectedSubscriptionCycleId: string | null;
197
+ operatorRef: string;
198
+ absenceCheckedAt: string;
199
+ absenceEvidence: ManualInteractivePreparedAttemptAbsenceEvidence;
200
+ }): Promise<InteractivePreparedAttemptReopenResult>;
201
+ }
202
+
203
+ export interface PaymentProviderReconciliationWorkerResult {
204
+ ok: boolean;
205
+ checked: number;
206
+ corrected: number;
207
+ succeeded: number;
208
+ failed: number;
209
+ pending: number;
210
+ unknown: number;
211
+ ignored: number;
212
+ dunningOpened: number;
213
+ replayed: number;
214
+ providerCalls: number;
215
+ preparedWithoutProviderAck: number;
216
+ preparedAttemptsReopened: number;
217
+ manualReview: number;
218
+ /**
219
+ * Attempts whose rail has answered non-terminally for longer than that rail
220
+ * declares normal. Counted, never acted on: elapsed time is not evidence
221
+ * about money, so this surfaces a case for a human rather than resolving it.
222
+ */
223
+ silenceOverdue: number;
224
+ amountCurrencyMismatches: number;
225
+ failures: number;
226
+ skipped: boolean;
227
+ reason?: string;
228
+ }
229
+
230
+ export interface PaymentProviderReconciliationWorkerInput {
231
+ port: PaymentProviderReconciliationPort;
232
+ providers: Partial<Record<ReconciliationProviderKind, PaymentProviderReconciliationProvider>>;
233
+ now?: string;
234
+ staleAfterSeconds?: number;
235
+ batchSize?: number;
236
+ claimKey?: string;
237
+ /**
238
+ * When true, prepared attempts whose provider proves absence (see
239
+ * PaymentProviderReconciliationProvider.findPaymentByLocalIntent) and that
240
+ * are at least MIN_PREPARED_ABSENCE_REOPEN_AGE_SECONDS old are automatically
241
+ * reopened for cron retry via the operator RPC. Default false — the
242
+ * stranded-attempt loop stays operator-manual unless the flag is on.
243
+ */
244
+ autoReopenPreparedAbsence?: boolean;
245
+ /**
246
+ * Published rail capabilities, read to learn how long a non-terminal answer
247
+ * from each rail is still normal. Optional: without it no attempt is ever
248
+ * counted overdue, so omitting it preserves today's behaviour exactly.
249
+ */
250
+ capabilities?: SilenceWindowLookup;
251
+ }
252
+
253
+ /**
254
+ * The narrow slice of the capability registry this worker reads.
255
+ *
256
+ * Declared here rather than importing the whole registry type so the worker
257
+ * depends on the one question it asks - "when does this rail's silence stop
258
+ * being normal" - and not on the shape of every unattended-charge capability.
259
+ */
260
+ export interface SilenceWindowLookup {
261
+ get(providerKind: string): { terminalOutcomeReporting?: { silenceBecomesSuspectAfterMinutes: number } } | null;
262
+ }
263
+
264
+
265
+
266
+ export interface VerifiableAttemptSnapshot {
267
+ orderId: string;
268
+ orderClientId: string;
269
+ orderMode: string;
270
+ paymentIntentId: string;
271
+ intentStatus: string;
272
+ intentProviderPaymentId: string | null;
273
+ paymentAttemptId: string;
274
+ paymentId: string;
275
+ attemptStatus: string;
276
+ provider: string;
277
+ providerAttemptId: string | null;
278
+ providerSessionId: string | null;
279
+ amountMinor: number;
280
+ currency: string;
281
+ localUpdatedAt: string;
282
+ }
283
+
284
+
285
+ export interface PaymentVerifyReadPort {
286
+ readVerifiableAttempt(input: {
287
+ orderId: string;
288
+ paymentIntentId: string;
289
+ }): Promise<VerifiableAttemptSnapshot | null>;
290
+ }
291
+
292
+
293
+ export type PaymentVerifyNowResult =
294
+ | { status: string; verified: false; applied: false; providerPaymentId: string | null; attempt: ClaimedPaymentAttempt | null }
295
+ | { status: "unavailable" | "pending" | "manual_review"; verified: boolean; applied: false; providerPaymentId: string | null; attempt: ClaimedPaymentAttempt | null }
296
+ | { status: "succeeded" | "failed"; verified: true; applied: boolean; providerPaymentId: string; attempt: ClaimedPaymentAttempt };
@@ -0,0 +1,95 @@
1
+ import type { PaymentMethodHandoff } from "./adapter.js";
2
+ import type { ClaimedPaymentAttempt, PaymentProviderReconciliationProvider, ProviderReconciliationStatus, PaymentVerifyReadPort } from "./reconciliation.js";
3
+ import type { ProviderReadPurpose } from "./evidence.js";
4
+
5
+ export type CheckoutRecoveryPaymentResolution =
6
+ | { kind: "paid" }
7
+ | { kind: "retry_new" }
8
+ | { kind: "resume_existing"; clientAction: PaymentRecoveryAction }
9
+ | { kind: "awaiting_provider" }
10
+ | { kind: "manual_review" };
11
+
12
+ export interface ProviderPaymentReferenceInput {
13
+ providerAttemptId: string | null;
14
+ providerSessionId: string | null;
15
+ intentProviderPaymentId: string | null;
16
+ }
17
+
18
+ export type PaymentRecoveryAction = { provider: string } & PaymentMethodHandoff;
19
+
20
+ export interface ProviderRecoveryRead {
21
+ status: ProviderReconciliationStatus;
22
+ identityMatches: boolean;
23
+ configuredMoneyMatches: boolean;
24
+ manualReviewRequired: boolean;
25
+ clientAction: PaymentRecoveryAction | null;
26
+ }
27
+
28
+ /**
29
+ * Recovery is an explicit capability, not an optional method on generic
30
+ * reconciliation providers. One read returns both PSP truth and any transient
31
+ * buyer action, so a redeem never calls the provider twice.
32
+ */
33
+ export interface PaymentProviderRecoveryProvider extends PaymentProviderReconciliationProvider {
34
+ resolvePaymentReference(input: ProviderPaymentReferenceInput): string | null;
35
+ readRecoveryPayment(input: {
36
+ providerPaymentId: string;
37
+ attempt: ClaimedPaymentAttempt;
38
+ purpose?: ProviderReadPurpose;
39
+ }): Promise<ProviderRecoveryRead>;
40
+ }
41
+
42
+ export interface CheckoutRecoveryPaymentResolver {
43
+ resolve(input: {
44
+ orderId: string;
45
+ paymentIntentId: string | null;
46
+ intentStatus?: string | null;
47
+ }): Promise<CheckoutRecoveryPaymentResolution>;
48
+ }
49
+
50
+
51
+ export interface ActivePaymentActionAuthority {
52
+ orderId: string;
53
+ clientId: string;
54
+ paymentIntentId: string;
55
+ paymentAttemptId: string;
56
+ executionRail: string;
57
+ }
58
+
59
+ export interface CheckoutActivePaymentActionResolver {
60
+ readActiveAction(authority: ActivePaymentActionAuthority): Promise<PaymentRecoveryAction | null>;
61
+ }
62
+
63
+ export type CheckoutActionReadProvider = Pick<
64
+ PaymentProviderRecoveryProvider,
65
+ "resolvePaymentReference" | "readRecoveryPayment"
66
+ >;
67
+
68
+
69
+ /** Method collection only. Hosts authorize ownership before calling this port.
70
+ * The result never confirms payment, redeems a token or writes a subscription.
71
+ * Handoffs remain transient; unsupported must be shown as an explicit refusal.
72
+ */
73
+ export interface PaymentRepairMethodPort {
74
+ setupMethod(input: {
75
+ customer: string;
76
+ metadata: Record<string, string>;
77
+ idempotencyKey: string;
78
+ }): Promise<
79
+ | { kind: "ready"; setupRef: string; handoff: PaymentMethodHandoff; replayed: boolean }
80
+ | { kind: "unsupported" }
81
+ >;
82
+ }
83
+
84
+ /** Host-selected durable truth scope. Unsupported schema never opens a store. */
85
+ export interface PaymentServicesOptions {
86
+ schema?: { truth: "supported" | "unsupported" };
87
+ openTruth?: () => Promise<{
88
+ port: import("./truth.js").PaymentTruthPort;
89
+ close(): Promise<void>;
90
+ }>;
91
+ }
92
+
93
+ export interface PaymentServices {
94
+ run<T>(work: (port: import("./truth.js").PaymentTruthPort) => Promise<T>): Promise<T>;
95
+ }
@@ -0,0 +1,108 @@
1
+
2
+
3
+ export type PaymentTruthOutcome = "captured" | "refused" | "indeterminate";
4
+
5
+
6
+ /**
7
+ * How a refusal looked to the settlement source that reported it.
8
+ *
9
+ * NOT the retry taxonomy. `PaymentFailureClass` in `@openlup/core/payment` is a
10
+ * different vocabulary with no value in common: that one answers "may this be
11
+ * retried, and how", and is what `commerce_payment_attempts.failure_class`
12
+ * persists. This one answers "what did the source say happened" and never leaves
13
+ * this module's reconciliation ledger. They shared a name until this wave, which
14
+ * meant an import could quietly resolve to the wrong five strings.
15
+ */
16
+ export type PaymentTruthRefusalClass =
17
+ | "authorization_refused"
18
+ | "insufficient_funds"
19
+ | "method_unavailable"
20
+ | "risk_refused"
21
+ | "unknown_refusal";
22
+
23
+
24
+ export type PaymentSourceEvidence = {
25
+ sourceKind: "accepted_event" | "reconciliation_read";
26
+ sourceReference: string;
27
+ observedStatus: string;
28
+ observedAt: string;
29
+ payloadFingerprint: string;
30
+ };
31
+
32
+
33
+ export type PaymentTruthEvent = {
34
+ sourceEventId: string;
35
+ idempotencyKey: string;
36
+ settlementIntentId: string;
37
+ outcome: PaymentTruthOutcome;
38
+ amountMinor: number;
39
+ currency: string;
40
+ occurredAt: string;
41
+ failure: { classification: PaymentTruthRefusalClass; reason: string | null } | null;
42
+ evidence: PaymentSourceEvidence;
43
+ };
44
+
45
+
46
+ export type PaymentReconciliationResult = {
47
+ eventId: string;
48
+ idempotencyKey: string;
49
+ evidenceStatus: "observed" | "failed";
50
+ outcome: PaymentTruthOutcome;
51
+ occurredAt: string;
52
+ failure: PaymentTruthEvent["failure"];
53
+ evidence: PaymentSourceEvidence;
54
+ };
55
+
56
+
57
+ export type PaymentTruthReadback = {
58
+ event: {
59
+ id: string;
60
+ sourceEventId: string;
61
+ fingerprint: string;
62
+ state: "open" | "settled";
63
+ outcome: PaymentTruthOutcome;
64
+ replayed: boolean;
65
+ };
66
+ effects: {
67
+ paymentResultRecorded: boolean;
68
+ dunningOpened: boolean;
69
+ accountingRequested: boolean;
70
+ };
71
+ financial: {
72
+ settlementStatus: string | null;
73
+ orderStatus: string | null;
74
+ subscriptionStatus: string | null;
75
+ accountingStatus: string | null;
76
+ amountMinor: number;
77
+ currency: string;
78
+ };
79
+ };
80
+
81
+
82
+ export interface PaymentTruthPort {
83
+ ingestEvent(input: PaymentTruthEvent): Promise<PaymentTruthReadback>;
84
+ recordReconciliation(input: PaymentReconciliationResult): Promise<PaymentTruthReadback>;
85
+ sweepOpenEvents(input: { now: string; limit: number }): Promise<{
86
+ claimed: number;
87
+ settledIgnored: number;
88
+ eventIds: string[];
89
+ }>;
90
+ readEvent(eventId: string): Promise<PaymentTruthReadback | null>;
91
+ }
92
+
93
+
94
+ export type CanonicalPaymentSource = {
95
+ sourceEventId: string;
96
+ eventKind: string;
97
+ settlementIntentId: string | null;
98
+ amountMinor: number | null;
99
+ currency: string | null;
100
+ occurredAt: string | null;
101
+ payloadFingerprint: string;
102
+ };
103
+
104
+ export type PostgresPaymentTruthOptions = {
105
+ dunningTemplateSlug: string;
106
+ recoveryUrlPath: string;
107
+ recoveryTemplateSlug: string;
108
+ };