@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,213 @@
1
+ import { z } from 'zod';
2
+ import { PAYMENT_INTENT_STATUSES } from '@openlup/core/payment';
3
+ const OMS_FULFILLMENT_BLOCK_REASONS = ['order_not_paid', 'payment_not_succeeded', 'subscription_cycle_not_paid', 'active_hold', 'missing_shipping_address', 'inventory_review', 'risk_review'];
4
+ const OMS_INVENTORY_STATUSES = ['not_checked', 'reserved', 'missing', 'released', 'expired', 'consumed', 'review_required'];
5
+ export const COMMERCE_FULFILLMENT_CONTRACT_VERSION = "commerce.fulfillment.v0";
6
+ export const COMMERCE_FULFILLMENT_STATUSES = [
7
+ "created",
8
+ "packed",
9
+ "label_pending",
10
+ "label_created",
11
+ "handed_over",
12
+ "in_transit",
13
+ "delivered",
14
+ "exception",
15
+ "cancelled",
16
+ ];
17
+ export const COMMERCE_FULFILLMENT_OPERATION_TYPES = [
18
+ "created",
19
+ "packed",
20
+ "provider_attempt_recorded",
21
+ "label_created",
22
+ "handed_over",
23
+ "tracking_event_recorded",
24
+ "cancelled",
25
+ ];
26
+ export const COMMERCE_FULFILLMENT_PROVIDER_ATTEMPT_STATUSES = [
27
+ "recorded",
28
+ "succeeded",
29
+ "failed",
30
+ ];
31
+ const uuidSchema = z.guid();
32
+ const datetimeSchema = z.string().datetime({ offset: true });
33
+ export const commerceFulfillmentStatusSchema = z.enum(COMMERCE_FULFILLMENT_STATUSES);
34
+ export const commerceFulfillmentOperationTypeSchema = z.enum(COMMERCE_FULFILLMENT_OPERATION_TYPES);
35
+ export const commerceFulfillmentProviderAttemptStatusSchema = z.enum(COMMERCE_FULFILLMENT_PROVIDER_ATTEMPT_STATUSES);
36
+ export const commerceFulfillmentPaymentStatusSchema = z.enum(["not_started", ...PAYMENT_INTENT_STATUSES]);
37
+ export const commerceFulfillmentInventoryStatusSchema = z.enum(OMS_INVENTORY_STATUSES);
38
+ export const commerceFulfillmentBlockReasonSchema = z.enum(OMS_FULFILLMENT_BLOCK_REASONS);
39
+ export const commerceFulfillmentShippingAddressSnapshotSchema = z.object({
40
+ addressId: uuidSchema,
41
+ clientId: uuidSchema,
42
+ label: z.string().nullable(),
43
+ line1: z.string().trim().min(1),
44
+ line2: z.string().nullable(),
45
+ city: z.string().trim().min(1),
46
+ postalCode: z.string().trim().min(1),
47
+ country: z.string().trim().min(2).max(3),
48
+ }).strict();
49
+ export const commerceFulfillmentLineSchema = z.object({
50
+ id: uuidSchema.nullable(),
51
+ orderItemId: uuidSchema,
52
+ skuId: uuidSchema,
53
+ sku: z.string().trim().min(1),
54
+ title: z.string().trim().min(1).nullable(),
55
+ quantity: z.number().int().positive(),
56
+ inventoryReservationIds: z.array(uuidSchema),
57
+ productSnapshot: z.record(z.string(), z.unknown()),
58
+ }).strict();
59
+ export const commerceFulfillmentPaymentSummarySchema = z.object({
60
+ paymentIntentId: uuidSchema,
61
+ paymentStatus: commerceFulfillmentPaymentStatusSchema,
62
+ providerPaymentId: z.string().nullable(),
63
+ }).strict();
64
+ export const commerceFulfillmentInventorySummarySchema = z.object({
65
+ status: commerceFulfillmentInventoryStatusSchema,
66
+ reservationId: uuidSchema.nullable(),
67
+ reservationStatus: z.enum(["reserved", "released", "consumed", "expired"]).nullable(),
68
+ expiresAt: datetimeSchema.nullable(),
69
+ locationId: uuidSchema.nullable(),
70
+ locationCode: z.string().nullable(),
71
+ }).strict();
72
+ export const commerceFulfillmentOmsEligibilitySchema = z.object({
73
+ allowed: z.boolean(),
74
+ reason: commerceFulfillmentBlockReasonSchema.nullable(),
75
+ }).strict();
76
+ export const commerceFulfillmentOperationSchema = z.object({
77
+ id: uuidSchema,
78
+ type: commerceFulfillmentOperationTypeSchema,
79
+ occurredAt: datetimeSchema,
80
+ actorUserId: uuidSchema.nullable(),
81
+ payload: z.record(z.string(), z.unknown()),
82
+ }).strict();
83
+ export const commerceFulfillmentOrderSchema = z.object({
84
+ id: uuidSchema,
85
+ orderId: uuidSchema,
86
+ clientId: uuidSchema.nullable(),
87
+ status: commerceFulfillmentStatusSchema,
88
+ providerKind: z.string().trim().min(1).nullable(),
89
+ providerTrackingId: z.string().trim().min(1).nullable(),
90
+ shippingAddress: commerceFulfillmentShippingAddressSnapshotSchema,
91
+ lines: z.array(commerceFulfillmentLineSchema).min(1),
92
+ payment: commerceFulfillmentPaymentSummarySchema,
93
+ inventory: commerceFulfillmentInventorySummarySchema,
94
+ omsEligibility: commerceFulfillmentOmsEligibilitySchema,
95
+ latestOperation: commerceFulfillmentOperationSchema.nullable(),
96
+ createdAt: datetimeSchema,
97
+ updatedAt: datetimeSchema,
98
+ }).strict();
99
+ export const adminCommerceFulfillmentOrdersListRequestSchema = z.object({
100
+ page: z.coerce.number().int().min(1).default(1),
101
+ pageSize: z.coerce.number().int().min(1).max(100).default(25),
102
+ status: commerceFulfillmentStatusSchema.optional(),
103
+ }).strict();
104
+ export const adminCommerceFulfillmentOrderDetailRequestSchema = z
105
+ .object({
106
+ fulfillmentOrderId: uuidSchema.optional(),
107
+ orderId: uuidSchema.optional(),
108
+ })
109
+ .strict()
110
+ .refine((request) => request.fulfillmentOrderId || request.orderId, {
111
+ message: "fulfillmentOrderId or orderId is required",
112
+ });
113
+ export const adminCommerceFulfillmentCreateRequestSchema = z.object({
114
+ idempotencyKey: z.string().trim().min(8).max(120),
115
+ orderId: uuidSchema,
116
+ metadata: z.record(z.string(), z.unknown()).optional(),
117
+ }).strict();
118
+ export const adminCommerceFulfillmentRecordProviderAttemptRequestSchema = z.object({
119
+ idempotencyKey: z.string().trim().min(8).max(120),
120
+ fulfillmentOrderId: uuidSchema,
121
+ providerKind: z.string().trim().min(1),
122
+ status: commerceFulfillmentProviderAttemptStatusSchema,
123
+ requestPayload: z.record(z.string(), z.unknown()).default({}),
124
+ responsePayload: z.record(z.string(), z.unknown()).default({}),
125
+ error: z.string().trim().min(1).nullable().optional(),
126
+ metadata: z.record(z.string(), z.unknown()).optional(),
127
+ }).strict();
128
+ export const adminCommerceFulfillmentRecordLabelRequestSchema = z.object({
129
+ idempotencyKey: z.string().trim().min(8).max(120),
130
+ fulfillmentOrderId: uuidSchema,
131
+ providerKind: z.string().trim().min(1),
132
+ providerTrackingId: z.string().trim().min(1),
133
+ labelUrl: z.string().trim().min(1).nullable().optional(),
134
+ deliveryEstimateDays: z.number().int().nonnegative().nullable().optional(),
135
+ rawProviderPayload: z.record(z.string(), z.unknown()).default({}),
136
+ metadata: z.record(z.string(), z.unknown()).optional(),
137
+ }).strict();
138
+ export const adminCommerceFulfillmentHandOffRequestSchema = z.object({
139
+ idempotencyKey: z.string().trim().min(8).max(120),
140
+ fulfillmentOrderId: uuidSchema,
141
+ metadata: z.record(z.string(), z.unknown()).optional(),
142
+ }).strict();
143
+ export const adminCommerceFulfillmentTrackingEventRequestSchema = z.object({
144
+ idempotencyKey: z.string().trim().min(8).max(120),
145
+ fulfillmentOrderId: uuidSchema,
146
+ status: z.enum(["in_transit", "delivered", "exception"]),
147
+ providerTrackingId: z.string().trim().min(1).optional(),
148
+ rawEvent: z.record(z.string(), z.unknown()).default({}),
149
+ metadata: z.record(z.string(), z.unknown()).optional(),
150
+ }).strict();
151
+ export const adminCommerceFulfillmentCancelRequestSchema = z.object({
152
+ idempotencyKey: z.string().trim().min(8).max(120),
153
+ fulfillmentOrderId: uuidSchema,
154
+ reason: z.string().trim().min(1).max(240),
155
+ metadata: z.record(z.string(), z.unknown()).optional(),
156
+ }).strict();
157
+ export const adminCommerceFulfillmentOrdersListResponseSchema = z.object({
158
+ contractVersion: z.literal(COMMERCE_FULFILLMENT_CONTRACT_VERSION),
159
+ orders: z.array(commerceFulfillmentOrderSchema),
160
+ totalCount: z.number().int().min(0),
161
+ page: z.number().int().min(1),
162
+ pageSize: z.number().int().min(1),
163
+ }).strict();
164
+ export const adminCommerceFulfillmentOrderDetailResponseSchema = z.object({
165
+ contractVersion: z.literal(COMMERCE_FULFILLMENT_CONTRACT_VERSION),
166
+ order: commerceFulfillmentOrderSchema,
167
+ }).strict();
168
+ export const adminCommerceFulfillmentMutationResponseSchema = z.object({
169
+ contractVersion: z.literal(COMMERCE_FULFILLMENT_CONTRACT_VERSION),
170
+ fulfillmentOrderId: uuidSchema,
171
+ orderId: uuidSchema,
172
+ status: commerceFulfillmentStatusSchema,
173
+ replayed: z.boolean(),
174
+ }).strict();
175
+ export const adminCommerceOrderRequestReplacementShipmentRequestSchema = z.object({
176
+ idempotencyKey: z.string().trim().min(8).max(120),
177
+ orderId: uuidSchema,
178
+ reason: z.enum(['damaged', 'lost', 'returned_undelivered', 'other']),
179
+ metadata: z.record(z.string(), z.unknown()).optional(),
180
+ }).strict();
181
+ export const omsOperationTypeSchema = z.enum([
182
+ "hold_created",
183
+ "hold_released",
184
+ "fulfillment_reviewed",
185
+ "support_note",
186
+ "shipping_address_updated",
187
+ "order_marked_refunded",
188
+ "order_cancelled_manual",
189
+ "replacement_shipment_requested",
190
+ ]);
191
+ export const omsOrderOperationSchema = z.object({
192
+ id: uuidSchema,
193
+ orderId: uuidSchema,
194
+ type: omsOperationTypeSchema,
195
+ holdId: uuidSchema.nullable(),
196
+ actorUserId: uuidSchema.nullable(),
197
+ occurredAt: datetimeSchema,
198
+ payload: z.record(z.string(), z.unknown()),
199
+ });
200
+ export const adminCommerceOrderRequestReplacementShipmentResponseSchema = z.object({
201
+ contractVersion: z.literal('commerce.v0'),
202
+ operation: omsOrderOperationSchema,
203
+ replacement: z.object({
204
+ fulfillmentOrderId: z.string().uuid(),
205
+ orderId: z.string().uuid(),
206
+ sequenceNo: z.number().int().min(1),
207
+ replacesFulfillmentOrderId: z.string().uuid(),
208
+ reason: z.enum(["damaged", "lost", "returned_undelivered", "other"]),
209
+ status: z.string(),
210
+ }),
211
+ releasedHoldIds: z.array(z.string().uuid()).default([]),
212
+ replayed: z.boolean(),
213
+ });
@@ -0,0 +1,33 @@
1
+ import type { FulfillmentNativeUnsupported } from './contracts/nativeUnsupported.js';
2
+ export interface FulfillmentHandlerRequest {
3
+ method?: string;
4
+ query: Record<string, string | string[] | undefined>;
5
+ body?: unknown;
6
+ }
7
+ export interface FulfillmentHandlerResponder<Response> {
8
+ sendMethodNotAllowed(res: Response, methods: readonly string[]): void;
9
+ sendBffSuccess(res: Response, data: unknown): void;
10
+ sendBffError(res: Response, code: 'UNAUTHORIZED' | 'FORBIDDEN' | 'BAD_REQUEST' | 'INVALID_RESPONSE' | 'NOT_FOUND' | 'CONFLICT' | 'UPSTREAM_UNAVAILABLE', message: string, options?: {
11
+ details: unknown;
12
+ }): void;
13
+ }
14
+ export type AdminAuthResult = {
15
+ ok: false;
16
+ code: 'UNAUTHORIZED' | 'FORBIDDEN';
17
+ message: string;
18
+ } | {
19
+ ok: true;
20
+ userId: string;
21
+ };
22
+ export interface BaseDeps<Response> {
23
+ authorizeAdmin(req: FulfillmentHandlerRequest): Promise<AdminAuthResult>;
24
+ respond: FulfillmentHandlerResponder<Response>;
25
+ }
26
+ export declare function isNativeUnsupported(value: unknown): value is FulfillmentNativeUnsupported;
27
+ export declare class CommerceFulfillmentConflictError extends Error {
28
+ readonly details: Record<string, unknown>;
29
+ constructor(message?: string, details?: Record<string, unknown>);
30
+ }
31
+ export declare function authorize<Response>(req: FulfillmentHandlerRequest, res: Response, authorizeAdmin: BaseDeps<Response>['authorizeAdmin'], respond: FulfillmentHandlerResponder<Response>): Promise<{
32
+ userId: string;
33
+ } | null>;
@@ -0,0 +1,25 @@
1
+ export function isNativeUnsupported(value) {
2
+ return typeof value === 'object' && value !== null && 'kind' in value && value.kind === 'native_unsupported';
3
+ }
4
+ export class CommerceFulfillmentConflictError extends Error {
5
+ details;
6
+ constructor(message = 'Commerce fulfillment conflict', details = {}) {
7
+ super(message);
8
+ this.details = details;
9
+ this.name = 'CommerceFulfillmentConflictError';
10
+ }
11
+ }
12
+ export async function authorize(req, res, authorizeAdmin, respond) {
13
+ try {
14
+ const authorization = await authorizeAdmin(req);
15
+ if (authorization.ok === false) {
16
+ respond.sendBffError(res, authorization.code, authorization.message);
17
+ return null;
18
+ }
19
+ return { userId: authorization.userId };
20
+ }
21
+ catch {
22
+ respond.sendBffError(res, 'UPSTREAM_UNAVAILABLE', 'Admin authorization failed');
23
+ return null;
24
+ }
25
+ }
@@ -0,0 +1,37 @@
1
+ export { FULFILLMENT_STATUS_MAP, CANONICAL_LOCAL_FULFILLMENT_STATUSES, CUSTOMER_STEP_SEQUENCE, canonicalStatusToken, stepForToken, customerStepFromSignals, phaseIndexForStep, stepLabelKey, timelineLabelForStep, trackingPhaseKeyForStep, stepUsesTruckIcon } from "./statusMap.js";
2
+ export { parseFulfillmentFact, parseFulfillmentTransitionConflict } from "./normalizedFulfillmentFacts.js";
3
+ export { readFulfillmentCapabilities } from "./providerCapabilities.js";
4
+ export { createOutboxOrderPaidFulfillmentHandler } from "./paidHandoff.js";
5
+ export { collectPaidFulfillmentRecoveryCandidates } from "./paidFulfillmentRecovery.js";
6
+ export { runFulfillmentDispatchWorker } from "./providerDispatchWorker.js";
7
+ export { createFulfillmentCommandLedger } from "./providerCommandLedger.js";
8
+ export { verifyAndNormalizeFulfillmentObservation } from "./verifiedIngress.js";
9
+ export { applyFulfillmentObservationEffects } from "./fulfillmentObservationEffects.js";
10
+ export { reconcileFulfillmentObservations } from "./providerReconciliationWorker.js";
11
+ export { runFulfillmentStockSyncWorker } from "./providerStockSyncWorker.js";
12
+ export { runFulfillmentProductSyncWorker } from "./providerProductSyncWorker.js";
13
+ export { createFulfillmentLowStockEvidenceHandler } from "./lowStockEvidenceHandler.js";
14
+ export { createProductReconciliationEvidenceHandler } from "./productReconciliationEvidenceHandler.js";
15
+ export { runFulfillmentAdapterConformance } from "./adapterConformance.js";
16
+ export { createPostgresFulfillmentShipmentSpinePort } from './postgresShipmentSpine.js';
17
+ export { createPostgresFulfillmentLowStockEvidencePort } from './postgresEvidenceReadPort.js';
18
+ export { createPostgresFulfillmentStockSyncPort } from './postgresStockSyncPort.js';
19
+ export { createPostgresPaidFulfillmentRecoveryOpsPort } from './postgresPaidFulfillmentRecovery.js';
20
+ export { createPostgresFulfillmentDispatchStore } from './postgresDispatchStore.js';
21
+ export { createPostgresPaidFulfillmentHandoffStore } from './postgresPaidHandoffStore.js';
22
+ export { createPostgresDeliveryAlignmentPort } from './postgresDeliveryAlignment.js';
23
+ export { readDeliveryAlignment } from './deliveryAlignmentReadModel.js';
24
+ export { FULFILLMENT_NATIVE_CAPABILITIES } from './schemaCapabilities.js';
25
+ export { FULFILLMENT_MIGRATIONS } from './migrations.js';
26
+ export { createAdminCommerceFulfillmentOrdersListHandler, createAdminCommerceFulfillmentOrderDetailHandler, createAdminCommerceFulfillmentCreateOrderHandler, createAdminCommerceFulfillmentRecordProviderAttemptHandler, createAdminCommerceFulfillmentRecordLabelHandler, createAdminCommerceFulfillmentHandOffHandler, createAdminCommerceFulfillmentTrackingEventHandler, createAdminCommerceFulfillmentCancelOrderHandler } from './commerceFulfillmentHandlers.js';
27
+ export { createAdminCommerceOrderRequestReplacementShipmentHandler } from './replacementShipmentHandler.js';
28
+ export { CommerceFulfillmentConflictError } from './handlerSupport.js';
29
+ export { readFulfillmentDelay } from './delayReadModel.js';
30
+ export { readFulfillmentLabel, cleanupFulfillmentLabel } from './labelLifecycle.js';
31
+ export { currentParcel, currentParcelFor, currentParcelPerOrder, currentParcelFirst, belongsToParcel, rowsForParcel, parcelSequenceNo, compareParcelPrecedence } from './currentFulfillmentParcel.js';
32
+ export { FULFILLMENT_NATIVE_UNSUPPORTED, createNativeUnsupportedFulfillmentPorts } from './nativeUnsupported.js';
33
+ export { FULFILLMENT_REPLACEMENT_REFUSALS } from './replacementRefusals.js';
34
+ export { buildCommerceFulfillmentOrdersListResponse, buildCommerceFulfillmentOrderDetailResponse } from './commerceFulfillmentReadModel.js';
35
+ export { createFulfillmentShipmentsOverviewHandler } from './shipmentsOverviewHandler.js';
36
+ export { fulfillmentProgressPresentation } from './trackingProgress.js';
37
+ export { createFulfillmentServices } from './bindings.js';
@@ -0,0 +1,37 @@
1
+ export { FULFILLMENT_STATUS_MAP, CANONICAL_LOCAL_FULFILLMENT_STATUSES, CUSTOMER_STEP_SEQUENCE, canonicalStatusToken, stepForToken, customerStepFromSignals, phaseIndexForStep, stepLabelKey, timelineLabelForStep, trackingPhaseKeyForStep, stepUsesTruckIcon } from "./statusMap.js";
2
+ export { parseFulfillmentFact, parseFulfillmentTransitionConflict } from "./normalizedFulfillmentFacts.js";
3
+ export { readFulfillmentCapabilities } from "./providerCapabilities.js";
4
+ export { createOutboxOrderPaidFulfillmentHandler } from "./paidHandoff.js";
5
+ export { collectPaidFulfillmentRecoveryCandidates } from "./paidFulfillmentRecovery.js";
6
+ export { runFulfillmentDispatchWorker } from "./providerDispatchWorker.js";
7
+ export { createFulfillmentCommandLedger } from "./providerCommandLedger.js";
8
+ export { verifyAndNormalizeFulfillmentObservation } from "./verifiedIngress.js";
9
+ export { applyFulfillmentObservationEffects } from "./fulfillmentObservationEffects.js";
10
+ export { reconcileFulfillmentObservations } from "./providerReconciliationWorker.js";
11
+ export { runFulfillmentStockSyncWorker } from "./providerStockSyncWorker.js";
12
+ export { runFulfillmentProductSyncWorker } from "./providerProductSyncWorker.js";
13
+ export { createFulfillmentLowStockEvidenceHandler } from "./lowStockEvidenceHandler.js";
14
+ export { createProductReconciliationEvidenceHandler } from "./productReconciliationEvidenceHandler.js";
15
+ export { runFulfillmentAdapterConformance } from "./adapterConformance.js";
16
+ export { createPostgresFulfillmentShipmentSpinePort } from './postgresShipmentSpine.js';
17
+ export { createPostgresFulfillmentLowStockEvidencePort } from './postgresEvidenceReadPort.js';
18
+ export { createPostgresFulfillmentStockSyncPort } from './postgresStockSyncPort.js';
19
+ export { createPostgresPaidFulfillmentRecoveryOpsPort } from './postgresPaidFulfillmentRecovery.js';
20
+ export { createPostgresFulfillmentDispatchStore } from './postgresDispatchStore.js';
21
+ export { createPostgresPaidFulfillmentHandoffStore } from './postgresPaidHandoffStore.js';
22
+ export { createPostgresDeliveryAlignmentPort } from './postgresDeliveryAlignment.js';
23
+ export { readDeliveryAlignment } from './deliveryAlignmentReadModel.js';
24
+ export { FULFILLMENT_NATIVE_CAPABILITIES } from './schemaCapabilities.js';
25
+ export { FULFILLMENT_MIGRATIONS } from './migrations.js';
26
+ export { createAdminCommerceFulfillmentOrdersListHandler, createAdminCommerceFulfillmentOrderDetailHandler, createAdminCommerceFulfillmentCreateOrderHandler, createAdminCommerceFulfillmentRecordProviderAttemptHandler, createAdminCommerceFulfillmentRecordLabelHandler, createAdminCommerceFulfillmentHandOffHandler, createAdminCommerceFulfillmentTrackingEventHandler, createAdminCommerceFulfillmentCancelOrderHandler } from './commerceFulfillmentHandlers.js';
27
+ export { createAdminCommerceOrderRequestReplacementShipmentHandler } from './replacementShipmentHandler.js';
28
+ export { CommerceFulfillmentConflictError } from './handlerSupport.js';
29
+ export { readFulfillmentDelay } from './delayReadModel.js';
30
+ export { readFulfillmentLabel, cleanupFulfillmentLabel } from './labelLifecycle.js';
31
+ export { currentParcel, currentParcelFor, currentParcelPerOrder, currentParcelFirst, belongsToParcel, rowsForParcel, parcelSequenceNo, compareParcelPrecedence } from './currentFulfillmentParcel.js';
32
+ export { FULFILLMENT_NATIVE_UNSUPPORTED, createNativeUnsupportedFulfillmentPorts } from './nativeUnsupported.js';
33
+ export { FULFILLMENT_REPLACEMENT_REFUSALS } from './replacementRefusals.js';
34
+ export { buildCommerceFulfillmentOrdersListResponse, buildCommerceFulfillmentOrderDetailResponse } from './commerceFulfillmentReadModel.js';
35
+ export { createFulfillmentShipmentsOverviewHandler } from './shipmentsOverviewHandler.js';
36
+ export { fulfillmentProgressPresentation } from './trackingProgress.js';
37
+ export { createFulfillmentServices } from './bindings.js';
@@ -0,0 +1,24 @@
1
+ import type { FulfillmentLabelPort, LabelDocument } from './contracts/label.js';
2
+ /** Storage-only read: a missing cached label never proves the parcel absent. Signed URLs are transient. */
3
+ export declare function readFulfillmentLabel(port: Pick<FulfillmentLabelPort, 'read'>, document: LabelDocument | null): Promise<{
4
+ kind: "available";
5
+ url: string;
6
+ expiresAt: string | null;
7
+ } | {
8
+ kind: "refused";
9
+ refusal: import("./contracts/dispatch.js").FulfillmentRefusal;
10
+ }>;
11
+ /** Provider and storage deletion remain host-owned; canProceed never asserts either deletion. */
12
+ type LabelCleanupInput = Parameters<FulfillmentLabelPort['void']>[0] & {
13
+ actorUserId: string;
14
+ idempotencyKey: string;
15
+ };
16
+ export declare function cleanupFulfillmentLabel(port: {
17
+ void(input: LabelCleanupInput): ReturnType<FulfillmentLabelPort['void']>;
18
+ }, input: LabelCleanupInput): Promise<{
19
+ providerDeletion: "confirmed" | "unconfirmed";
20
+ labelDeleted: boolean;
21
+ canProceed: boolean;
22
+ refusal?: import("./contracts/dispatch.js").FulfillmentRefusal;
23
+ }>;
24
+ export {};
@@ -0,0 +1,9 @@
1
+ /** Storage-only read: a missing cached label never proves the parcel absent. Signed URLs are transient. */
2
+ export async function readFulfillmentLabel(port, document) {
3
+ if (!document)
4
+ return { kind: 'refused', refusal: { reason: 'local_missing', phase: 'readback', retryable: false } };
5
+ return port.read(document);
6
+ }
7
+ export async function cleanupFulfillmentLabel(port, input) {
8
+ return port.void(input);
9
+ }
@@ -0,0 +1,36 @@
1
+ /** Read-only evidence boundary; parsing remains with the owning host schema. */
2
+ export declare function createFulfillmentLowStockEvidenceHandler<Request extends {
3
+ method?: string;
4
+ query: Record<string, string | string[] | undefined>;
5
+ }, Response, Query, Result>({ evidencePort, authorizeAdmin, requestSchema, responseSchema, respond }: {
6
+ evidencePort: {
7
+ getLowStockEvidence(query: Query): Promise<unknown>;
8
+ };
9
+ authorizeAdmin(request: Request): Promise<boolean>;
10
+ requestSchema: {
11
+ safeParse(input: unknown): {
12
+ success: true;
13
+ data: Query;
14
+ } | {
15
+ success: false;
16
+ error: {
17
+ flatten(): unknown;
18
+ };
19
+ };
20
+ };
21
+ responseSchema: {
22
+ safeParse(input: unknown): {
23
+ success: true;
24
+ data: Result;
25
+ } | {
26
+ success: false;
27
+ };
28
+ };
29
+ respond: {
30
+ sendBffError(res: Response, code: "UPSTREAM_UNAVAILABLE" | "UNAUTHORIZED" | "BAD_REQUEST" | "INVALID_RESPONSE", message: string, options?: {
31
+ details: unknown;
32
+ }): void;
33
+ sendBffSuccess(res: Response, data: Result): void;
34
+ sendMethodNotAllowed(res: Response, methods: readonly string[]): void;
35
+ };
36
+ }): (req: Request, res: Response) => Promise<void>;
@@ -0,0 +1,46 @@
1
+ /** Read-only evidence boundary; parsing remains with the owning host schema. */
2
+ export function createFulfillmentLowStockEvidenceHandler({ evidencePort, authorizeAdmin, requestSchema, responseSchema, respond }) {
3
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = respond;
4
+ return async function handler(req, res) {
5
+ if (req.method !== "GET") {
6
+ sendMethodNotAllowed(res, ["GET"]);
7
+ return;
8
+ }
9
+ let authorized = false;
10
+ try {
11
+ authorized = await authorizeAdmin(req);
12
+ }
13
+ catch {
14
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin authorization failed");
15
+ return;
16
+ }
17
+ if (!authorized) {
18
+ sendBffError(res, "UNAUTHORIZED", "Admin session required");
19
+ return;
20
+ }
21
+ const request = requestSchema.safeParse({
22
+ statusFilter: scalarQuery(req.query.statusFilter),
23
+ });
24
+ if (!request.success) {
25
+ sendBffError(res, "BAD_REQUEST", "Invalid low-stock evidence request", {
26
+ details: request.error.flatten(),
27
+ });
28
+ return;
29
+ }
30
+ try {
31
+ const result = await evidencePort.getLowStockEvidence(request.data);
32
+ const response = responseSchema.safeParse(result);
33
+ if (!response.success) {
34
+ sendBffError(res, "INVALID_RESPONSE", "Low-stock evidence returned invalid response");
35
+ return;
36
+ }
37
+ sendBffSuccess(res, response.data);
38
+ }
39
+ catch {
40
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Low-stock evidence read failed");
41
+ }
42
+ };
43
+ }
44
+ function scalarQuery(value) {
45
+ return Array.isArray(value) ? value[0] : value;
46
+ }
@@ -0,0 +1,27 @@
1
+ /** Byte-identical sparse projections; install the complete canonical catalogue. */
2
+ export declare const FULFILLMENT_MIGRATIONS: readonly [{
3
+ readonly position: 5;
4
+ readonly catalogPath: "db/platform/migrations/20260808210000_fulfillment_shipment_rail.sql";
5
+ readonly sha256: "eb5824551903717f3868690909fcc2cb6a7f845abe5cb19bd4cff13103b1383d";
6
+ readonly url: URL;
7
+ }, {
8
+ readonly position: 27;
9
+ readonly catalogPath: "db/platform/migrations/20260814000000_fulfillment_stock_evidence.sql";
10
+ readonly sha256: "df20c2491cb0196b4e28d19e7578c95bfa5c87b8f89fb0b6284c0e0695a3cc1d";
11
+ readonly url: URL;
12
+ }, {
13
+ readonly position: 51;
14
+ readonly catalogPath: "db/platform/migrations/20260819150000_fulfillment_shipment_sequence.sql";
15
+ readonly sha256: "906706cf66a6a555aa1219b12eb674d937eaa099abde6da18766310af43aaa9f";
16
+ readonly url: URL;
17
+ }, {
18
+ readonly position: 73;
19
+ readonly catalogPath: "db/platform/migrations/20261022080000_fulfillment_command_ledger.sql";
20
+ readonly sha256: "c6806906cdb0b6931b29f7a5c7c800016e98d04e6ea956f3c1e219a6cdb7e9d1";
21
+ readonly url: URL;
22
+ }, {
23
+ readonly position: 74;
24
+ readonly catalogPath: "db/platform/migrations/20261022090000_fulfillment_delivery_alignment.sql";
25
+ readonly sha256: "d9966ae79fe77a0feae8317dc5b46ef2d8196dd0790b1cd0ee1b06ab58061499";
26
+ readonly url: URL;
27
+ }];
@@ -0,0 +1,8 @@
1
+ /** Byte-identical sparse projections; install the complete canonical catalogue. */
2
+ export const FULFILLMENT_MIGRATIONS = [
3
+ { position: 5, catalogPath: "db/platform/migrations/20260808210000_fulfillment_shipment_rail.sql", sha256: "eb5824551903717f3868690909fcc2cb6a7f845abe5cb19bd4cff13103b1383d", url: new URL("../../sql/20260808210000_fulfillment_shipment_rail.sql", import.meta.url) },
4
+ { position: 27, catalogPath: "db/platform/migrations/20260814000000_fulfillment_stock_evidence.sql", sha256: "df20c2491cb0196b4e28d19e7578c95bfa5c87b8f89fb0b6284c0e0695a3cc1d", url: new URL("../../sql/20260814000000_fulfillment_stock_evidence.sql", import.meta.url) },
5
+ { position: 51, catalogPath: "db/platform/migrations/20260819150000_fulfillment_shipment_sequence.sql", sha256: "906706cf66a6a555aa1219b12eb674d937eaa099abde6da18766310af43aaa9f", url: new URL("../../sql/20260819150000_fulfillment_shipment_sequence.sql", import.meta.url) },
6
+ { position: 73, catalogPath: "db/platform/migrations/20261022080000_fulfillment_command_ledger.sql", sha256: "c6806906cdb0b6931b29f7a5c7c800016e98d04e6ea956f3c1e219a6cdb7e9d1", url: new URL("../../sql/20261022080000_fulfillment_command_ledger.sql", import.meta.url) },
7
+ { position: 74, catalogPath: "db/platform/migrations/20261022090000_fulfillment_delivery_alignment.sql", sha256: "d9966ae79fe77a0feae8317dc5b46ef2d8196dd0790b1cd0ee1b06ab58061499", url: new URL("../../sql/20261022090000_fulfillment_delivery_alignment.sql", import.meta.url) },
8
+ ];
@@ -0,0 +1,10 @@
1
+ import type { FulfillmentCommerceReadPort, FulfillmentShipmentsOverviewPort } from './contracts/read.js';
2
+ import type { FulfillmentNativeUnsupported } from './contracts/nativeUnsupported.js';
3
+ import type { FulfillmentReplacementPort } from './contracts/replacement.js';
4
+ import type { FulfillmentOperatorMutationPort } from './contracts/operator.js';
5
+ import type { FulfillmentCustomerAlignmentRowsReader } from './contracts/customerAlignment.js';
6
+ export declare const FULFILLMENT_NATIVE_UNSUPPORTED: FulfillmentNativeUnsupported;
7
+ /** Deliberately has no executor: unsupported native parity can never make a partial write. */
8
+ export declare function createNativeUnsupportedFulfillmentPorts(): FulfillmentReplacementPort & FulfillmentOperatorMutationPort & FulfillmentCommerceReadPort & FulfillmentShipmentsOverviewPort & {
9
+ readCustomerAlignmentRows: FulfillmentCustomerAlignmentRowsReader;
10
+ };
@@ -0,0 +1,18 @@
1
+ export const FULFILLMENT_NATIVE_UNSUPPORTED = Object.freeze({ kind: 'native_unsupported', reason: 'host_binding_required', retryable: false });
2
+ /** Deliberately has no executor: unsupported native parity can never make a partial write. */
3
+ export function createNativeUnsupportedFulfillmentPorts() {
4
+ const unsupported = async () => FULFILLMENT_NATIVE_UNSUPPORTED;
5
+ return {
6
+ requestReplacementShipment: unsupported,
7
+ createCommerceFulfillmentOrder: unsupported,
8
+ recordCommerceFulfillmentProviderAttempt: unsupported,
9
+ recordCommerceFulfillmentLabel: unsupported,
10
+ handOffCommerceFulfillmentOrder: unsupported,
11
+ recordCommerceFulfillmentTrackingEvent: unsupported,
12
+ cancelCommerceFulfillmentOrder: unsupported,
13
+ readCustomerAlignmentRows: unsupported,
14
+ listCommerceFulfillmentOrders: unsupported,
15
+ getCommerceFulfillmentOrderDetail: unsupported,
16
+ getShipmentsOverview: unsupported,
17
+ };
18
+ }
@@ -0,0 +1,2 @@
1
+ export { isCanonicalLocalFulfillmentStatus, parseFulfillmentFact, parseFulfillmentTransitionConflict } from "@openlup/core/fulfillment";
2
+ export type { CanonicalNormalizedFulfillmentFact as NormalizedFulfillmentFact, CanonicalNormalizedFulfillmentFactV1 as NormalizedFulfillmentFactV1, CanonicalNormalizedFulfillmentFactV0 as NormalizedFulfillmentFactV0, CanonicalCompatibleNormalizedFulfillmentFact as CompatibleNormalizedFulfillmentFact, CanonicalFulfillmentTransitionSnapshot as FulfillmentTransitionSnapshot, CanonicalTransitionConflict as TransitionConflict } from "@openlup/core/fulfillment";
@@ -0,0 +1 @@
1
+ export { isCanonicalLocalFulfillmentStatus, parseFulfillmentFact, parseFulfillmentTransitionConflict } from "@openlup/core/fulfillment";
@@ -0,0 +1,11 @@
1
+ import type { CanonicalLocalFulfillmentStatus, FulfillmentObservation } from "./contracts/index.js";
2
+ export declare function projectCorrelation(value: FulfillmentObservation["correlation"]): FulfillmentObservation["correlation"];
3
+ /** New boundary projection: arbitrary adapter properties are never durable. */
4
+ export declare function projectObservation(value: FulfillmentObservation): FulfillmentObservation;
5
+ /** Donor finished-picking boundary is narrower than the coarse packing stage. */
6
+ export declare const observationStatusPolicy: {
7
+ consumesStock: (status: CanonicalLocalFulfillmentStatus) => boolean;
8
+ handsOver: (status: CanonicalLocalFulfillmentStatus) => boolean;
9
+ suppressDispatched: (status: CanonicalLocalFulfillmentStatus) => status is "delivered";
10
+ trackingStatus: (status: CanonicalLocalFulfillmentStatus) => "in_transit" | "delivered";
11
+ };
@@ -0,0 +1,37 @@
1
+ import { parseFulfillmentFact } from "./normalizedFulfillmentFacts.js";
2
+ import { FULFILLMENT_STATUS_MAP } from "./statusMap.js";
3
+ export function projectCorrelation(value) {
4
+ const { orderRef, fulfillmentRef, externalRef, orderNumber, providerFulfillmentRef, parcelRef } = value;
5
+ return { orderRef, fulfillmentRef, externalRef, orderNumber, providerFulfillmentRef, parcelRef };
6
+ }
7
+ /** New boundary projection: arbitrary adapter properties are never durable. */
8
+ export function projectObservation(value) {
9
+ const diagnostics = {};
10
+ if (value.diagnostics?.refusal) {
11
+ const { reason, phase, retryable } = value.diagnostics.refusal;
12
+ diagnostics.refusal = { reason, phase, retryable };
13
+ }
14
+ if (value.diagnostics?.stockContention)
15
+ diagnostics.stockContention = { sqlState: "55P03", phase: "provider_stock_consumed", retryable: true };
16
+ if (value.diagnostics?.annotation)
17
+ diagnostics.annotation = value.diagnostics.annotation;
18
+ if (value.diagnostics?.recoveredPickedReceipt) {
19
+ const { receiptRef, closed } = value.diagnostics.recoveredPickedReceipt;
20
+ diagnostics.recoveredPickedReceipt = { receiptRef, closed };
21
+ }
22
+ return {
23
+ fact: parseFulfillmentFact(value.fact), eventKind: value.eventKind, eventKey: value.eventKey,
24
+ firstReceivedAt: value.firstReceivedAt,
25
+ correlation: projectCorrelation(value.correlation),
26
+ trackingRefs: value.trackingRefs.map(({ trackingNumber, carrierRef, serviceRef, publicUrl }) => ({ trackingNumber, carrierRef, serviceRef, publicUrl })),
27
+ ...(Object.keys(diagnostics).length ? { diagnostics } : {}),
28
+ };
29
+ }
30
+ const HANDOVER_STATUSES = new Set(FULFILLMENT_STATUS_MAP.stages.filter(stage => stage.effects.handover).flatMap(stage => stage.localStatus));
31
+ /** Donor finished-picking boundary is narrower than the coarse packing stage. */
32
+ export const observationStatusPolicy = {
33
+ consumesStock: (status) => ["packed", "in_transit", "delivered"].includes(status),
34
+ handsOver: (status) => HANDOVER_STATUSES.has(status),
35
+ suppressDispatched: (status) => status === "delivered",
36
+ trackingStatus: (status) => status,
37
+ };
@@ -0,0 +1,3 @@
1
+ import type { FulfillmentCapabilityDescriptor } from "../contracts/index.js";
2
+ /** Offline protocol capabilities; selection and account readiness belong to the host. */
3
+ export declare const omnipackFulfillmentCapabilities: Readonly<FulfillmentCapabilityDescriptor>;
@@ -0,0 +1,16 @@
1
+ /** Offline protocol capabilities; selection and account readiness belong to the host. */
2
+ export const omnipackFulfillmentCapabilities = Object.freeze({
3
+ providerRef: "omnipack", role: "warehouse", defaultOff: true, selected: false,
4
+ readiness: Object.freeze({ ready: false, refusal: Object.freeze({ reason: "not_ready", phase: "selection", retryable: false }) }),
5
+ operations: Object.freeze({
6
+ dispatch: Object.freeze({ supported: true }), readback: Object.freeze({ supported: true }),
7
+ exactAbsence: Object.freeze({ supported: false, reason: "not_exposed" }), verifyObservation: Object.freeze({ supported: true }),
8
+ syncStock: Object.freeze({ supported: true }), syncProducts: Object.freeze({ supported: true }),
9
+ labelCreate: Object.freeze({ supported: false, reason: "not_exposed" }), labelRead: Object.freeze({ supported: false, reason: "host_only" }),
10
+ labelVoid: Object.freeze({ supported: false, reason: "not_exposed" }), cancel: Object.freeze({ supported: false, reason: "not_exposed" }),
11
+ pickupPoint: Object.freeze({ supported: true }), courierPickup: Object.freeze({ supported: false, reason: "not_exposed" }),
12
+ }),
13
+ authentication: "token", freshness: "not_available", ownsDeliveredNotification: false,
14
+ stockAuthority: "external_stock_master_with_local_reservations", labelReadOwner: "host_storage",
15
+ actionPolicy: Object.freeze({ providerSpecificAdminActions: false, genericAdminActions: true, mutationSurface: "provider_adapter" }),
16
+ });