@openlup/platform 0.17.0 → 0.19.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 (525) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/README.md +299 -6
  3. package/dist/catalog/activeSkuSelection.d.ts +2 -0
  4. package/dist/catalog/activeSkuSelection.js +20 -0
  5. package/dist/catalog/adminBindings.d.ts +72 -0
  6. package/dist/catalog/adminBindings.js +1 -0
  7. package/dist/catalog/adminBundleHandler.d.ts +26 -0
  8. package/dist/catalog/adminBundleHandler.js +111 -0
  9. package/dist/catalog/adminBundleReadHandler.d.ts +21 -0
  10. package/dist/catalog/adminBundleReadHandler.js +185 -0
  11. package/dist/catalog/adminBundleWritePort.d.ts +85 -0
  12. package/dist/catalog/adminBundleWritePort.js +1 -0
  13. package/dist/catalog/bundleAvailability.d.ts +63 -0
  14. package/dist/catalog/bundleAvailability.js +78 -0
  15. package/dist/catalog/bundleAvailabilityService.d.ts +65 -0
  16. package/dist/catalog/bundleAvailabilityService.js +89 -0
  17. package/dist/catalog/bundleBindings.d.ts +33 -0
  18. package/dist/catalog/bundleBindings.js +1 -0
  19. package/dist/catalog/bundleCatalogQueries.d.ts +28 -0
  20. package/dist/catalog/bundleCatalogQueries.js +84 -0
  21. package/dist/catalog/bundleCatalogReadPort.d.ts +173 -0
  22. package/dist/catalog/bundleCatalogReadPort.js +36 -0
  23. package/dist/catalog/bundleCatalogStore.d.ts +5 -0
  24. package/dist/catalog/bundleCatalogStore.js +156 -0
  25. package/dist/catalog/bundlePriceSelection.d.ts +13 -0
  26. package/dist/catalog/bundlePriceSelection.js +26 -0
  27. package/dist/catalog/bundleRuleCodes.d.ts +41 -0
  28. package/dist/catalog/bundleRuleCodes.js +110 -0
  29. package/dist/catalog/bundleRules.d.ts +69 -0
  30. package/dist/catalog/bundleRules.js +102 -0
  31. package/dist/catalog/catalogDraftStore.d.ts +4 -0
  32. package/dist/catalog/catalogDraftStore.js +63 -0
  33. package/dist/catalog/catalogSkuEnvelope.d.ts +7 -0
  34. package/dist/catalog/catalogSkuEnvelope.js +142 -0
  35. package/dist/catalog/catalogSkuEnvelopeMapper.d.ts +38 -0
  36. package/dist/catalog/catalogSkuEnvelopeMapper.js +88 -0
  37. package/dist/catalog/contracts/bundleAdmin.d.ts +143 -0
  38. package/dist/catalog/contracts/bundleAdmin.js +1 -0
  39. package/dist/catalog/contracts/bundleAvailability.d.ts +61 -0
  40. package/dist/catalog/contracts/bundleAvailability.js +1 -0
  41. package/dist/catalog/contracts/bundleRead.d.ts +241 -0
  42. package/dist/catalog/contracts/bundleRead.js +1 -0
  43. package/dist/catalog/contracts/draft.d.ts +79 -0
  44. package/dist/catalog/contracts/draft.js +47 -0
  45. package/dist/catalog/contracts/foundation.d.ts +78 -0
  46. package/dist/catalog/contracts/foundation.js +53 -0
  47. package/dist/catalog/contracts/index.d.ts +14 -0
  48. package/dist/catalog/contracts/index.js +6 -0
  49. package/dist/catalog/contracts/lifecycle.d.ts +77 -0
  50. package/dist/catalog/contracts/lifecycle.js +1 -0
  51. package/dist/catalog/contracts/productMediaContracts.d.ts +77 -0
  52. package/dist/catalog/contracts/productMediaContracts.js +149 -0
  53. package/dist/catalog/contracts/productTypes.d.ts +54 -0
  54. package/dist/catalog/contracts/productTypes.js +16 -0
  55. package/dist/catalog/contracts/resolveProductMedia.d.ts +3 -0
  56. package/dist/catalog/contracts/resolveProductMedia.js +78 -0
  57. package/dist/catalog/contracts/sellable.d.ts +23 -0
  58. package/dist/catalog/contracts/sellable.js +1 -0
  59. package/dist/catalog/draftHandler.d.ts +25 -0
  60. package/dist/catalog/draftHandler.js +118 -0
  61. package/dist/catalog/draftPorts.d.ts +18 -0
  62. package/dist/catalog/draftPorts.js +8 -0
  63. package/dist/catalog/draftSchemas.d.ts +423 -0
  64. package/dist/catalog/draftSchemas.js +89 -0
  65. package/dist/catalog/draftValidation.d.ts +21 -0
  66. package/dist/catalog/draftValidation.js +125 -0
  67. package/dist/catalog/effectiveBundleCatalogQueries.d.ts +8 -0
  68. package/dist/catalog/effectiveBundleCatalogQueries.js +79 -0
  69. package/dist/catalog/effectiveBundleCatalogStore.d.ts +4 -0
  70. package/dist/catalog/effectiveBundleCatalogStore.js +156 -0
  71. package/dist/catalog/foundationSchemas.d.ts +98 -0
  72. package/dist/catalog/foundationSchemas.js +110 -0
  73. package/dist/catalog/index.d.ts +44 -0
  74. package/dist/catalog/index.js +26 -0
  75. package/dist/catalog/mediaSourcePack.d.ts +51 -0
  76. package/dist/catalog/mediaSourcePack.js +247 -0
  77. package/dist/catalog/productTypeSchemas.d.ts +46 -0
  78. package/dist/catalog/productTypeSchemas.js +72 -0
  79. package/dist/catalog/publicationPorts.d.ts +42 -0
  80. package/dist/catalog/publicationPorts.js +1 -0
  81. package/dist/catalog/readPorts.d.ts +51 -0
  82. package/dist/catalog/readPorts.js +1 -0
  83. package/dist/catalog/referenceCatalogHandler.d.ts +7 -0
  84. package/dist/catalog/referenceCatalogHandler.js +27 -0
  85. package/dist/catalog/resolvedSkuProjection.d.ts +88 -0
  86. package/dist/catalog/resolvedSkuProjection.js +60 -0
  87. package/dist/catalog/sellableBundleHandler.d.ts +46 -0
  88. package/dist/catalog/sellableBundleHandler.js +84 -0
  89. package/dist/catalog/sellableSchemas.d.ts +46 -0
  90. package/dist/catalog/sellableSchemas.js +27 -0
  91. package/dist/catalog/sql.d.ts +46 -0
  92. package/dist/catalog/sql.js +13 -0
  93. package/dist/catalog/validation.d.ts +2 -0
  94. package/dist/catalog/validation.js +3 -0
  95. package/dist/communications/contracts/index.d.ts +1 -0
  96. package/dist/communications/contracts/marketingSync.d.ts +194 -0
  97. package/dist/communications/contracts/marketingSync.js +1 -0
  98. package/dist/communications/index.d.ts +1 -0
  99. package/dist/communications/klaviyo/consentPush.d.ts +51 -0
  100. package/dist/communications/klaviyo/consentPush.js +19 -0
  101. package/dist/communications/klaviyo/index.d.ts +110 -0
  102. package/dist/communications/klaviyo/index.js +860 -0
  103. package/dist/communications/newsletterIntegrationContracts.d.ts +3 -3
  104. package/dist/communications/resend/index.d.ts +40 -0
  105. package/dist/communications/resend/index.js +310 -0
  106. package/dist/composition/catalogContribution.d.ts +18 -0
  107. package/dist/composition/catalogContribution.js +21 -0
  108. package/dist/composition/index.d.ts +3 -0
  109. package/dist/composition/index.js +3 -0
  110. package/dist/composition/inventoryContribution.d.ts +16 -0
  111. package/dist/composition/inventoryContribution.js +17 -0
  112. package/dist/composition/shippingContribution.d.ts +16 -0
  113. package/dist/composition/shippingContribution.js +17 -0
  114. package/dist/identity/customerContracts.d.ts +2 -2
  115. package/dist/inventory/adminInventory.d.ts +13 -0
  116. package/dist/inventory/adminInventory.js +214 -0
  117. package/dist/inventory/bindings.d.ts +35 -0
  118. package/dist/inventory/bindings.js +45 -0
  119. package/dist/inventory/contracts/forecast.d.ts +86 -0
  120. package/dist/inventory/contracts/forecast.js +1 -0
  121. package/dist/inventory/contracts/index.d.ts +4 -0
  122. package/dist/inventory/contracts/index.js +1 -0
  123. package/dist/inventory/contracts/inventory.d.ts +157 -0
  124. package/dist/inventory/contracts/inventory.js +1 -0
  125. package/dist/inventory/contracts/newPurchaseStock.d.ts +20 -0
  126. package/dist/inventory/contracts/newPurchaseStock.js +1 -0
  127. package/dist/inventory/contracts/reservation.d.ts +18 -0
  128. package/dist/inventory/contracts/reservation.js +1 -0
  129. package/dist/inventory/forecast.d.ts +24 -0
  130. package/dist/inventory/forecast.js +200 -0
  131. package/dist/inventory/index.d.ts +14 -0
  132. package/dist/inventory/index.js +11 -0
  133. package/dist/inventory/inventoryHandlers.d.ts +53 -0
  134. package/dist/inventory/inventoryHandlers.js +151 -0
  135. package/dist/inventory/newPurchaseStockAvailability.d.ts +47 -0
  136. package/dist/inventory/newPurchaseStockAvailability.js +75 -0
  137. package/dist/inventory/ports.d.ts +21 -0
  138. package/dist/inventory/ports.js +16 -0
  139. package/dist/inventory/renewalReservation.d.ts +27 -0
  140. package/dist/inventory/renewalReservation.js +61 -0
  141. package/dist/inventory/reservationPolicy.d.ts +6 -0
  142. package/dist/inventory/reservationPolicy.js +19 -0
  143. package/dist/inventory/schemas.d.ts +137 -0
  144. package/dist/inventory/schemas.js +112 -0
  145. package/dist/inventory/sql.d.ts +14 -0
  146. package/dist/inventory/sql.js +5 -0
  147. package/dist/inventory/subscriptionForecastCalculation.d.ts +4 -0
  148. package/dist/inventory/subscriptionForecastCalculation.js +133 -0
  149. package/dist/pricing/acquisitionFinancialPolicy.d.ts +26 -0
  150. package/dist/pricing/acquisitionFinancialPolicy.js +1 -0
  151. package/dist/pricing/acquisitionOfferPricing.d.ts +27 -0
  152. package/dist/pricing/acquisitionOfferPricing.js +25 -0
  153. package/dist/pricing/acquisitionOfferPricingHandler.d.ts +20 -0
  154. package/dist/pricing/acquisitionOfferPricingHandler.js +105 -0
  155. package/dist/pricing/acquisitionOfferPricingSchemas.d.ts +31 -0
  156. package/dist/pricing/acquisitionOfferPricingSchemas.js +33 -0
  157. package/dist/pricing/acquisitionQuoteBinding.d.ts +12 -0
  158. package/dist/pricing/acquisitionQuoteBinding.js +12 -0
  159. package/dist/pricing/acquisitionReadiness.d.ts +31 -0
  160. package/dist/pricing/acquisitionReadiness.js +117 -0
  161. package/dist/pricing/acquisitionTerms.d.ts +19 -0
  162. package/dist/pricing/acquisitionTerms.js +126 -0
  163. package/dist/pricing/acquisitionTermsSchemas.d.ts +59 -0
  164. package/dist/pricing/acquisitionTermsSchemas.js +42 -0
  165. package/dist/pricing/catalogFactsProvenance.d.ts +33 -0
  166. package/dist/pricing/catalogFactsProvenance.js +64 -0
  167. package/dist/pricing/catalogFactsSchemas.d.ts +45 -0
  168. package/dist/pricing/catalogFactsSchemas.js +58 -0
  169. package/dist/pricing/commerceOfferPricing.d.ts +25 -0
  170. package/dist/pricing/commerceOfferPricing.js +139 -0
  171. package/dist/pricing/commerceOfferPricingCache.d.ts +10 -0
  172. package/dist/pricing/commerceOfferPricingCache.js +44 -0
  173. package/dist/pricing/commerceOfferPricingHandler.d.ts +21 -0
  174. package/dist/pricing/commerceOfferPricingHandler.js +78 -0
  175. package/dist/pricing/commercePriceAuthority.d.ts +28 -0
  176. package/dist/pricing/commercePriceAuthority.js +140 -0
  177. package/dist/pricing/commercePricingPolicyErrors.d.ts +40 -0
  178. package/dist/pricing/commercePricingPolicyErrors.js +67 -0
  179. package/dist/pricing/commerceQuoteBatchHandler.d.ts +37 -0
  180. package/dist/pricing/commerceQuoteBatchHandler.js +83 -0
  181. package/dist/pricing/commerceQuoteCatalogReadPort.d.ts +27 -0
  182. package/dist/pricing/commerceQuoteCatalogReadPort.js +8 -0
  183. package/dist/pricing/commerceQuoteHandler.d.ts +35 -0
  184. package/dist/pricing/commerceQuoteHandler.js +122 -0
  185. package/dist/pricing/commerceQuoteSnapshotExpect.d.ts +9 -0
  186. package/dist/pricing/commerceQuoteSnapshotExpect.js +22 -0
  187. package/dist/pricing/contracts/acquisitionTerms.d.ts +32 -0
  188. package/dist/pricing/contracts/acquisitionTerms.js +2 -0
  189. package/dist/pricing/contracts/authority.d.ts +27 -0
  190. package/dist/pricing/contracts/authority.js +1 -0
  191. package/dist/pricing/contracts/evidence.d.ts +33 -0
  192. package/dist/pricing/contracts/evidence.js +1 -0
  193. package/dist/pricing/contracts/index.d.ts +17 -0
  194. package/dist/pricing/contracts/index.js +7 -0
  195. package/dist/pricing/contracts/money.d.ts +27 -0
  196. package/dist/pricing/contracts/money.js +1 -0
  197. package/dist/pricing/contracts/offer.d.ts +52 -0
  198. package/dist/pricing/contracts/offer.js +4 -0
  199. package/dist/pricing/contracts/offerPolicy.d.ts +16 -0
  200. package/dist/pricing/contracts/offerPolicy.js +5 -0
  201. package/dist/pricing/contracts/policy.d.ts +22 -0
  202. package/dist/pricing/contracts/policy.js +3 -0
  203. package/dist/pricing/contracts/provenance.d.ts +24 -0
  204. package/dist/pricing/contracts/provenance.js +2 -0
  205. package/dist/pricing/contracts/quote.d.ts +94 -0
  206. package/dist/pricing/contracts/quote.js +1 -0
  207. package/dist/pricing/dbBackedCommerceQuoteHelpers.d.ts +78 -0
  208. package/dist/pricing/dbBackedCommerceQuoteHelpers.js +146 -0
  209. package/dist/pricing/dbBackedCommerceQuotePort.d.ts +74 -0
  210. package/dist/pricing/dbBackedCommerceQuotePort.js +223 -0
  211. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.d.ts +4 -0
  212. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.js +25 -0
  213. package/dist/pricing/index.d.ts +52 -0
  214. package/dist/pricing/index.js +36 -0
  215. package/dist/pricing/offerPolicyReadiness.d.ts +21 -0
  216. package/dist/pricing/offerPolicyReadiness.js +79 -0
  217. package/dist/pricing/offerPolicySchemas.d.ts +25 -0
  218. package/dist/pricing/offerPolicySchemas.js +15 -0
  219. package/dist/pricing/offerPricingSchemas.d.ts +315 -0
  220. package/dist/pricing/offerPricingSchemas.js +65 -0
  221. package/dist/pricing/ports.d.ts +13 -0
  222. package/dist/pricing/ports.js +9 -0
  223. package/dist/pricing/pricingPolicyToken.d.ts +39 -0
  224. package/dist/pricing/pricingPolicyToken.js +84 -0
  225. package/dist/pricing/quoteAcquisitionTerms.d.ts +2 -0
  226. package/dist/pricing/quoteAcquisitionTerms.js +4 -0
  227. package/dist/pricing/quoteCodeRejectionDetails.d.ts +20 -0
  228. package/dist/pricing/quoteCodeRejectionDetails.js +22 -0
  229. package/dist/pricing/quotePorts.d.ts +30 -0
  230. package/dist/pricing/quotePorts.js +20 -0
  231. package/dist/pricing/quotePrimitives.d.ts +13 -0
  232. package/dist/pricing/quotePrimitives.js +18 -0
  233. package/dist/pricing/quotePromotionEvidence.d.ts +39 -0
  234. package/dist/pricing/quotePromotionEvidence.js +73 -0
  235. package/dist/pricing/quoteSchemas.d.ts +1176 -0
  236. package/dist/pricing/quoteSchemas.js +196 -0
  237. package/dist/pricing/quoteShippingPromotions.d.ts +20 -0
  238. package/dist/pricing/quoteShippingPromotions.js +1 -0
  239. package/dist/pricing/subscriptionPricePolicy.d.ts +52 -0
  240. package/dist/pricing/subscriptionPricePolicy.js +96 -0
  241. package/dist/pricing/taxProfileGuard.d.ts +2 -0
  242. package/dist/pricing/taxProfileGuard.js +24 -0
  243. package/dist/pricing/validation.d.ts +2 -0
  244. package/dist/pricing/validation.js +3 -0
  245. package/dist/promotions/adminBindings.d.ts +72 -0
  246. package/dist/promotions/adminBindings.js +1 -0
  247. package/dist/promotions/adminPromotionCodesContracts.d.ts +498 -0
  248. package/dist/promotions/adminPromotionCodesContracts.js +211 -0
  249. package/dist/promotions/adminPromotionCodesDataPort.d.ts +47 -0
  250. package/dist/promotions/adminPromotionCodesDataPort.js +1 -0
  251. package/dist/promotions/adminPromotionCodesHandler.d.ts +14 -0
  252. package/dist/promotions/adminPromotionCodesHandler.js +194 -0
  253. package/dist/promotions/adminPromotionsContracts.d.ts +235 -0
  254. package/dist/promotions/adminPromotionsContracts.js +99 -0
  255. package/dist/promotions/adminPromotionsDataPort.d.ts +42 -0
  256. package/dist/promotions/adminPromotionsDataPort.js +1 -0
  257. package/dist/promotions/adminPromotionsHandler.d.ts +16 -0
  258. package/dist/promotions/adminPromotionsHandler.js +47 -0
  259. package/dist/promotions/commerceQuoteReadPreparation.d.ts +3 -0
  260. package/dist/promotions/commerceQuoteReadPreparation.js +27 -0
  261. package/dist/promotions/contracts/index.d.ts +387 -0
  262. package/dist/promotions/contracts/index.js +1 -0
  263. package/dist/promotions/index.d.ts +25 -0
  264. package/dist/promotions/index.js +22 -0
  265. package/dist/promotions/promoDataPort.d.ts +47 -0
  266. package/dist/promotions/promoDataPort.js +14 -0
  267. package/dist/promotions/promotionAcceptanceTelemetry.d.ts +29 -0
  268. package/dist/promotions/promotionAcceptanceTelemetry.js +45 -0
  269. package/dist/promotions/promotionBenefitDefinition.d.ts +37 -0
  270. package/dist/promotions/promotionBenefitDefinition.js +33 -0
  271. package/dist/promotions/promotionClaimSweepPort.d.ts +14 -0
  272. package/dist/promotions/promotionClaimSweepPort.js +8 -0
  273. package/dist/promotions/promotionClaims.d.ts +5 -0
  274. package/dist/promotions/promotionClaims.js +57 -0
  275. package/dist/promotions/promotionCodePreview.d.ts +11 -0
  276. package/dist/promotions/promotionCodePreview.js +154 -0
  277. package/dist/promotions/promotionCodeQuotePort.d.ts +25 -0
  278. package/dist/promotions/promotionCodeQuotePort.js +1 -0
  279. package/dist/promotions/promotionQuoteAcceptance.d.ts +70 -0
  280. package/dist/promotions/promotionQuoteAcceptance.js +202 -0
  281. package/dist/promotions/promotionQuoteBinding.d.ts +73 -0
  282. package/dist/promotions/promotionQuoteBinding.js +87 -0
  283. package/dist/promotions/quoteAcquisitionBinding.d.ts +6 -0
  284. package/dist/promotions/quoteAcquisitionBinding.js +1 -0
  285. package/dist/promotions/quoteAutomaticPromotions.d.ts +26 -0
  286. package/dist/promotions/quoteAutomaticPromotions.js +60 -0
  287. package/dist/promotions/quotePromoDiscounts.d.ts +36 -0
  288. package/dist/promotions/quotePromoDiscounts.js +146 -0
  289. package/dist/promotions/quotePromotionCodeAdjustments.d.ts +27 -0
  290. package/dist/promotions/quotePromotionCodeAdjustments.js +223 -0
  291. package/dist/promotions/quotePromotionV2.d.ts +30 -0
  292. package/dist/promotions/quotePromotionV2.js +186 -0
  293. package/dist/promotions/quoteShippingPolicy.d.ts +23 -0
  294. package/dist/promotions/quoteShippingPolicy.js +47 -0
  295. package/dist/promotions/sql.d.ts +14 -0
  296. package/dist/promotions/sql.js +5 -0
  297. package/dist/promotions/validation.d.ts +2 -0
  298. package/dist/promotions/validation.js +3 -0
  299. package/dist/shipping/addressCanonLookupHandler.d.ts +7 -0
  300. package/dist/shipping/addressCanonLookupHandler.js +105 -0
  301. package/dist/shipping/addressCanonical.d.ts +2 -0
  302. package/dist/shipping/addressCanonical.js +26 -0
  303. package/dist/shipping/addressPorts.d.ts +39 -0
  304. package/dist/shipping/addressPorts.js +1 -0
  305. package/dist/shipping/addressSchemas.d.ts +30 -0
  306. package/dist/shipping/addressSchemas.js +1 -0
  307. package/dist/shipping/adminShippingRateHandler.d.ts +4 -0
  308. package/dist/shipping/adminShippingRateHandler.js +64 -0
  309. package/dist/shipping/bindings.d.ts +57 -0
  310. package/dist/shipping/bindings.js +46 -0
  311. package/dist/shipping/contracts/address.d.ts +144 -0
  312. package/dist/shipping/contracts/address.js +1 -0
  313. package/dist/shipping/contracts/delivery.d.ts +110 -0
  314. package/dist/shipping/contracts/delivery.js +1 -0
  315. package/dist/shipping/contracts/index.d.ts +4 -0
  316. package/dist/shipping/contracts/index.js +1 -0
  317. package/dist/shipping/contracts/shippingRate.d.ts +11 -0
  318. package/dist/shipping/contracts/shippingRate.js +1 -0
  319. package/dist/shipping/contracts/threshold.d.ts +22 -0
  320. package/dist/shipping/contracts/threshold.js +1 -0
  321. package/dist/shipping/customerAddressesHandler.d.ts +5 -0
  322. package/dist/shipping/customerAddressesHandler.js +80 -0
  323. package/dist/shipping/customerSelfServiceAddressModels.d.ts +27 -0
  324. package/dist/shipping/customerSelfServiceAddressModels.js +101 -0
  325. package/dist/shipping/deliverySelectionHandler.d.ts +10 -0
  326. package/dist/shipping/deliverySelectionHandler.js +77 -0
  327. package/dist/shipping/deliverySelectionPort.d.ts +8 -0
  328. package/dist/shipping/deliverySelectionPort.js +1 -0
  329. package/dist/shipping/deliverySelectionSummary.d.ts +2 -0
  330. package/dist/shipping/deliverySelectionSummary.js +53 -0
  331. package/dist/shipping/handlerSchemas.d.ts +21 -0
  332. package/dist/shipping/handlerSchemas.js +1 -0
  333. package/dist/shipping/index.d.ts +20 -0
  334. package/dist/shipping/index.js +10 -0
  335. package/dist/shipping/pickupPointSearchPort.d.ts +4 -0
  336. package/dist/shipping/pickupPointSearchPort.js +1 -0
  337. package/dist/shipping/readDeliverySelectionEvidence.d.ts +2 -0
  338. package/dist/shipping/readDeliverySelectionEvidence.js +44 -0
  339. package/dist/shipping/shippingRatePorts.d.ts +52 -0
  340. package/dist/shipping/shippingRatePorts.js +1 -0
  341. package/dist/shipping/thresholdPolicy.d.ts +42 -0
  342. package/dist/shipping/thresholdPolicy.js +60 -0
  343. package/package.json +62 -2
  344. package/release-gates.json +263 -53
  345. package/sql/20260807140000_read_parity_catalog.sql +94 -0
  346. package/sql/20260810120000_storefront_catalog_attributes.sql +51 -0
  347. package/sql/20260812140000_sellable_bundle_catalog.sql +124 -0
  348. package/sql/20260812210000_bundle_operator_write_boundary.sql +567 -0
  349. package/sql/20260814000000_fulfillment_stock_evidence.sql +239 -0
  350. package/sql/20260815120000_automatic_subscription_renewal.sql +1083 -0
  351. package/sql/20260817180000_promotion_claim_lifecycle.sql +591 -0
  352. package/sql/20260817180100_promotion_claim_lifecycle_validation.sql +23 -0
  353. package/sql/20260827220000_catalog_document_revision_foundation.sql +226 -0
  354. package/sql/20260827220001_catalog_document_revision_foundation_validate.sql +10 -0
  355. package/sql/20260908100000_catalog_draft_foundation.sql +217 -0
  356. package/src/catalog/activeSkuSelection.ts +20 -0
  357. package/src/catalog/adminBindings.ts +59 -0
  358. package/src/catalog/adminBundleHandler.ts +165 -0
  359. package/src/catalog/adminBundleReadHandler.ts +263 -0
  360. package/src/catalog/adminBundleWritePort.ts +102 -0
  361. package/src/catalog/bundleAvailability.ts +129 -0
  362. package/src/catalog/bundleAvailabilityService.ts +171 -0
  363. package/src/catalog/bundleBindings.ts +29 -0
  364. package/src/catalog/bundleCatalogQueries.ts +98 -0
  365. package/src/catalog/bundleCatalogReadPort.ts +181 -0
  366. package/src/catalog/bundleCatalogStore.ts +274 -0
  367. package/src/catalog/bundlePriceSelection.ts +25 -0
  368. package/src/catalog/bundleRuleCodes.ts +134 -0
  369. package/src/catalog/bundleRules.ts +153 -0
  370. package/src/catalog/catalogDraftStore.ts +71 -0
  371. package/src/catalog/catalogSkuEnvelope.ts +214 -0
  372. package/src/catalog/catalogSkuEnvelopeMapper.ts +160 -0
  373. package/src/catalog/contracts/bundleAdmin.ts +20 -0
  374. package/src/catalog/contracts/bundleAvailability.ts +5 -0
  375. package/src/catalog/contracts/bundleRead.ts +13 -0
  376. package/src/catalog/contracts/draft.ts +69 -0
  377. package/src/catalog/contracts/foundation.ts +104 -0
  378. package/src/catalog/contracts/index.ts +14 -0
  379. package/src/catalog/contracts/lifecycle.ts +74 -0
  380. package/src/catalog/contracts/productMediaContracts.ts +170 -0
  381. package/src/catalog/contracts/productTypes.ts +35 -0
  382. package/src/catalog/contracts/resolveProductMedia.ts +85 -0
  383. package/src/catalog/contracts/sellable.ts +12 -0
  384. package/src/catalog/draftHandler.ts +105 -0
  385. package/src/catalog/draftPorts.ts +18 -0
  386. package/src/catalog/draftSchemas.ts +88 -0
  387. package/src/catalog/draftValidation.ts +100 -0
  388. package/src/catalog/effectiveBundleCatalogQueries.ts +80 -0
  389. package/src/catalog/effectiveBundleCatalogStore.ts +208 -0
  390. package/src/catalog/foundationSchemas.ts +123 -0
  391. package/src/catalog/index.ts +44 -0
  392. package/src/catalog/mediaSourcePack.ts +219 -0
  393. package/src/catalog/productTypeSchemas.ts +70 -0
  394. package/src/catalog/publicationPorts.ts +44 -0
  395. package/src/catalog/readPorts.ts +61 -0
  396. package/src/catalog/referenceCatalogHandler.ts +39 -0
  397. package/src/catalog/resolvedSkuProjection.ts +76 -0
  398. package/src/catalog/sellableBundleHandler.ts +133 -0
  399. package/src/catalog/sellableSchemas.ts +33 -0
  400. package/src/catalog/sql.ts +14 -0
  401. package/src/catalog/validation.ts +3 -0
  402. package/src/communications/contracts/index.ts +1 -0
  403. package/src/communications/contracts/marketingSync.ts +109 -0
  404. package/src/communications/index.ts +1 -0
  405. package/src/communications/klaviyo/consentPush.ts +19 -0
  406. package/src/communications/klaviyo/index.ts +649 -0
  407. package/src/communications/resend/index.ts +350 -0
  408. package/src/composition/catalogContribution.ts +32 -0
  409. package/src/composition/index.ts +3 -0
  410. package/src/composition/inventoryContribution.ts +24 -0
  411. package/src/composition/shippingContribution.ts +24 -0
  412. package/src/inventory/adminInventory.ts +251 -0
  413. package/src/inventory/bindings.ts +61 -0
  414. package/src/inventory/contracts/forecast.ts +96 -0
  415. package/src/inventory/contracts/index.ts +18 -0
  416. package/src/inventory/contracts/inventory.ts +14 -0
  417. package/src/inventory/contracts/newPurchaseStock.ts +23 -0
  418. package/src/inventory/contracts/reservation.ts +20 -0
  419. package/src/inventory/forecast.ts +239 -0
  420. package/src/inventory/index.ts +22 -0
  421. package/src/inventory/inventoryHandlers.ts +215 -0
  422. package/src/inventory/newPurchaseStockAvailability.ts +120 -0
  423. package/src/inventory/ports.ts +46 -0
  424. package/src/inventory/renewalReservation.ts +88 -0
  425. package/src/inventory/reservationPolicy.ts +27 -0
  426. package/src/inventory/schemas.ts +128 -0
  427. package/src/inventory/sql.ts +5 -0
  428. package/src/inventory/subscriptionForecastCalculation.ts +157 -0
  429. package/src/pricing/acquisitionFinancialPolicy.ts +26 -0
  430. package/src/pricing/acquisitionOfferPricing.ts +38 -0
  431. package/src/pricing/acquisitionOfferPricingHandler.ts +157 -0
  432. package/src/pricing/acquisitionOfferPricingSchemas.ts +35 -0
  433. package/src/pricing/acquisitionQuoteBinding.ts +12 -0
  434. package/src/pricing/acquisitionReadiness.ts +148 -0
  435. package/src/pricing/acquisitionTerms.ts +125 -0
  436. package/src/pricing/acquisitionTermsSchemas.ts +52 -0
  437. package/src/pricing/catalogFactsProvenance.ts +102 -0
  438. package/src/pricing/catalogFactsSchemas.ts +69 -0
  439. package/src/pricing/commerceOfferPricing.ts +224 -0
  440. package/src/pricing/commerceOfferPricingCache.ts +53 -0
  441. package/src/pricing/commerceOfferPricingHandler.ts +137 -0
  442. package/src/pricing/commercePriceAuthority.ts +169 -0
  443. package/src/pricing/commercePricingPolicyErrors.ts +88 -0
  444. package/src/pricing/commerceQuoteBatchHandler.ts +129 -0
  445. package/src/pricing/commerceQuoteCatalogReadPort.ts +42 -0
  446. package/src/pricing/commerceQuoteHandler.ts +199 -0
  447. package/src/pricing/commerceQuoteSnapshotExpect.ts +48 -0
  448. package/src/pricing/contracts/acquisitionTerms.ts +26 -0
  449. package/src/pricing/contracts/authority.ts +44 -0
  450. package/src/pricing/contracts/evidence.ts +25 -0
  451. package/src/pricing/contracts/index.ts +17 -0
  452. package/src/pricing/contracts/money.ts +32 -0
  453. package/src/pricing/contracts/offer.ts +42 -0
  454. package/src/pricing/contracts/offerPolicy.ts +17 -0
  455. package/src/pricing/contracts/policy.ts +26 -0
  456. package/src/pricing/contracts/provenance.ts +19 -0
  457. package/src/pricing/contracts/quote.ts +106 -0
  458. package/src/pricing/dbBackedCommerceQuoteHelpers.ts +256 -0
  459. package/src/pricing/dbBackedCommerceQuotePort.ts +280 -0
  460. package/src/pricing/dbBackedCommerceQuoteSnapshotVerifier.ts +49 -0
  461. package/src/pricing/index.ts +53 -0
  462. package/src/pricing/offerPolicyReadiness.ts +110 -0
  463. package/src/pricing/offerPolicySchemas.ts +23 -0
  464. package/src/pricing/offerPricingSchemas.ts +92 -0
  465. package/src/pricing/ports.ts +17 -0
  466. package/src/pricing/pricingPolicyToken.ts +119 -0
  467. package/src/pricing/quoteAcquisitionTerms.ts +10 -0
  468. package/src/pricing/quoteCodeRejectionDetails.ts +23 -0
  469. package/src/pricing/quotePorts.ts +58 -0
  470. package/src/pricing/quotePrimitives.ts +21 -0
  471. package/src/pricing/quotePromotionEvidence.ts +82 -0
  472. package/src/pricing/quoteSchemas.ts +230 -0
  473. package/src/pricing/quoteShippingPromotions.ts +21 -0
  474. package/src/pricing/subscriptionPricePolicy.ts +113 -0
  475. package/src/pricing/taxProfileGuard.ts +33 -0
  476. package/src/pricing/validation.ts +3 -0
  477. package/src/promotions/adminBindings.ts +53 -0
  478. package/src/promotions/adminPromotionCodesContracts.ts +244 -0
  479. package/src/promotions/adminPromotionCodesDataPort.ts +56 -0
  480. package/src/promotions/adminPromotionCodesHandler.ts +254 -0
  481. package/src/promotions/adminPromotionsContracts.ts +121 -0
  482. package/src/promotions/adminPromotionsDataPort.ts +48 -0
  483. package/src/promotions/adminPromotionsHandler.ts +72 -0
  484. package/src/promotions/commerceQuoteReadPreparation.ts +29 -0
  485. package/src/promotions/contracts/index.ts +387 -0
  486. package/src/promotions/index.ts +25 -0
  487. package/src/promotions/promoDataPort.ts +65 -0
  488. package/src/promotions/promotionAcceptanceTelemetry.ts +73 -0
  489. package/src/promotions/promotionBenefitDefinition.ts +48 -0
  490. package/src/promotions/promotionClaimSweepPort.ts +23 -0
  491. package/src/promotions/promotionClaims.ts +70 -0
  492. package/src/promotions/promotionCodePreview.ts +183 -0
  493. package/src/promotions/promotionCodeQuotePort.ts +35 -0
  494. package/src/promotions/promotionQuoteAcceptance.ts +291 -0
  495. package/src/promotions/promotionQuoteBinding.ts +163 -0
  496. package/src/promotions/quoteAcquisitionBinding.ts +7 -0
  497. package/src/promotions/quoteAutomaticPromotions.ts +84 -0
  498. package/src/promotions/quotePromoDiscounts.ts +194 -0
  499. package/src/promotions/quotePromotionCodeAdjustments.ts +277 -0
  500. package/src/promotions/quotePromotionV2.ts +239 -0
  501. package/src/promotions/quoteShippingPolicy.ts +61 -0
  502. package/src/promotions/sql.ts +5 -0
  503. package/src/promotions/validation.ts +3 -0
  504. package/src/shipping/addressCanonLookupHandler.ts +114 -0
  505. package/src/shipping/addressCanonical.ts +31 -0
  506. package/src/shipping/addressPorts.ts +48 -0
  507. package/src/shipping/addressSchemas.ts +28 -0
  508. package/src/shipping/adminShippingRateHandler.ts +72 -0
  509. package/src/shipping/bindings.ts +74 -0
  510. package/src/shipping/contracts/address.ts +71 -0
  511. package/src/shipping/contracts/delivery.ts +114 -0
  512. package/src/shipping/contracts/index.ts +19 -0
  513. package/src/shipping/contracts/shippingRate.ts +7 -0
  514. package/src/shipping/contracts/threshold.ts +22 -0
  515. package/src/shipping/customerAddressesHandler.ts +100 -0
  516. package/src/shipping/customerSelfServiceAddressModels.ts +124 -0
  517. package/src/shipping/deliverySelectionHandler.ts +94 -0
  518. package/src/shipping/deliverySelectionPort.ts +10 -0
  519. package/src/shipping/deliverySelectionSummary.ts +56 -0
  520. package/src/shipping/handlerSchemas.ts +19 -0
  521. package/src/shipping/index.ts +26 -0
  522. package/src/shipping/pickupPointSearchPort.ts +8 -0
  523. package/src/shipping/readDeliverySelectionEvidence.ts +51 -0
  524. package/src/shipping/shippingRatePorts.ts +36 -0
  525. package/src/shipping/thresholdPolicy.ts +65 -0
package/CHANGELOG.md CHANGED
@@ -8,6 +8,149 @@ SemVer promise.
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.19.0]
12
+
13
+ - Publishable on the npm `latest` dist-tag as `0.19.0`, from tag
14
+ `openlup-platform-v0.19.0`.
15
+
16
+ ### 0.18.0 → 0.19.0 set scope
17
+
18
+ - Prepare the complete development-preview minor set at `0.19.0`, including everything on main since `0.18.0`; core and outbox are unchanged republications, and UI stays private `0.0.0`.
19
+ - M05 parity adds opt-in shipping-promise consent, post-discount threshold shipping and acquisition orchestration to the experimental pricing, promotions and shipping entries; financial policy and acquisition capability remain host supplied.
20
+ - M05 parity adds effective native bundle selection and an authoritative preview hook, optional resolved-target/detail/feed context fields and `selectEffectiveBundleTargetPrice`; effective feeds require unambiguous gross unit anchors and whole-BOM readiness.
21
+ - Add `createConcurrentCommercePriceAuthorityPort` with concurrent history scheduling, selected-list identity and base-refusal precedence; browser additions are type-only.
22
+ - Catalog/contracts draft canonical JSON detects lone surrogates without regex lookbehind so it loads in Safari before 16.4, with unchanged behavior.
23
+ - M06 P5a adds explicit inventory store/provider bindings and structural inventory contribution, keeping reference catalog-stock composition inert and managed authorization intact; native new-purchase stock reads remain unsupported pending an owner decision and native adjustment still refuses.
24
+ - M06 P5a retains focused installed-consumer, runtime-role, managed FEFO/adjustment and consume/refund replay evidence with unproved parity gates retained in the M06 ledger.
25
+ - M06 P5b adds opt-in shipping selection, address and flat-rate bindings with injected validation and authority; native address writes remain unsupported and refuse required readiness.
26
+ - M06 P5b adds the final isolated installed inventory/shipping consumer, preserving incumbent selection errors and flat-rate behavior.
27
+ - M06 in progress: inventory and shipping entries are early surfaces; module not complete
28
+ - Supporting main changes sort platform registration lists one item per line and use the database clock in the M05 P7 quote witness; neither adds runtime behavior.
29
+
30
+ Migration: upgrade the complete `@openlup/*` set from `0.18.0` to `0.19.0` for exact internal pins; existing bindings need no change and new module adoption remains explicit and experimental. Hosts selecting shipping promises must forward `shippingTerms` through both acceptance callbacks and use a context schema that preserves the selected terms. Bind `resolveQuoteShippingPromotions` to the promotions factory to select the bounded two-pass threshold path; financial policy and acquisition capability remain host supplied. The additive APIs require a minor set and introduce no activation. For both M05 24b and M06 P5b, the pricing and promotions API reports reorder existing enum/union members because declaration emit order changed (24b follows the catalog-to-pricing import); no member is added, removed or changed and callers need no migration for that reorder. Install the complete canonical migration catalogue, never sparse package projections as an installation chain; this preparation adds no SQL migration.
31
+
32
+ ### Known limitations
33
+
34
+ - D8-1: native advisory v2 promo-code candidates and rejection details are not supported on the native backend.
35
+ - D8-2: native mounted v2 code issue/honor/fallback is not supported on the native backend.
36
+ - D8-3: acquisition-only mounted issuance/honor is not supported on the native backend.
37
+ - D8-4: full native/managed eligibility equivalence is not supported on the native backend.
38
+ - Bundle-1: independent database human-only actor-kind enforcement is not supported on the native backend and is the first item of a future native-backend parity round.
39
+ - Bundle-2: managed-equivalent actor-kind/email history is not supported on the native backend.
40
+ - Bundle-3 remains closed for M05 mounted admin/feed readback with an injected stock reader, while native new-purchase stock reads remain unsupported despite P5a's installed native inventory-store read proof.
41
+ - Bundle-4 establishes only incumbent real-PostgreSQL contention characterization and provides no exactly-once guarantee.
42
+ - The managed baseline schema and its pgTAP tests retain the incumbent legacy value `44.404`; removing it needs a forward migration and an owner decision, while reference composition supplies that value to application code.
43
+ - A1 evidence is offline only: account verification, hosted-time behaviour and owner TEST certification are not claimed, and the `communications/klaviyo` adapter's capabilities stay verification-pending.
44
+ - M05 parity seams are opt-in and omitted bindings preserve incumbent defaults, outputs, read order, scheduling, refusals, acceptance-token bytes and exported SQL.
45
+ - Native inventory adjustment remains unsupported; native address writes and flat-rate saves refuse required-capability readiness.
46
+ - M06 managed host ATP/forecast/supply/pagination, remaining compensation/concurrency/lock-order, exact-prefix upgrade/ledger, address idempotency/conflict/readback and runtime rate authority remain pending in the M06 ledger.
47
+ - M06 adopter stock-wait lifecycle, durable subscription timing and staging control observations retain their separate C5/C6 evidence gates.
48
+
49
+ ### Size note
50
+
51
+ Only platform `pack.docs.maxPackedBytes` rises from 40,960 to 49,152 B; all other caps and budgets remain unchanged. All three baselines use integrity-verified published `0.18.0` tarballs.
52
+
53
+ Question (2026-10-21): "The platform package's root docs (README + CHANGELOG) will exceed their 40,960 B gzip cap at the next release. What should we do?"
54
+ Owner's answer: "Raise to 49,152 B (Recommended)"
55
+ Option description shown to the owner: "Same figure as core. Unblocks the next few releases; the CHANGELOG grows every release, so this cap would otherwise block each one."
56
+ Recorded as an owner decision taken through the coordinator's question on 2026-10-21.
57
+
58
+ ## [0.18.0]
59
+
60
+ - Publishable on the npm `latest` dist-tag as `0.18.0`, from tag
61
+ `openlup-platform-v0.18.0`.
62
+
63
+ - M06 P4: retain named compatibility shims, restrict inventory smoke evidence to package-owned tests, neutralize synthetic transport fixtures and clarify inventory documentation; no runtime or API change.
64
+
65
+ ### 0.17.0 → 0.18.0 set scope
66
+
67
+ - Prepare the complete development-preview set at `0.18.0`: core and outbox are
68
+ unchanged republications; platform includes every change on main in this set.
69
+ - M05 adds catalog foundation/contracts, draft validation, product/lifecycle DTOs,
70
+ authority/GTIN/quantity helpers, media and source-pack operations,
71
+ fixed-bundle read/admin/feed logic, native envelope/draft stores and an inert
72
+ catalog contribution; pricing adds the neutral quote foundation, authority,
73
+ subscription policy and assignment token, quote/offer projection, opt-in
74
+ acquisition terms and promise consent; promotions includes advisory, preview, acceptance,
75
+ admin/native reads and sweep with explicit host bindings; lifecycle/publication
76
+ contracts alone do not provide a publisher or native lifecycle writes.
77
+ - M05 P6: pricing and bundle comments are corrected, VAT arithmetic delegates to the
78
+ existing helper and moved test fixtures are neutral with assertions unchanged;
79
+ no API change.
80
+ - Reference-application source: opt-in catalog, product, basket, builder and admin UI consumes explicit
81
+ data/locale/media/lifecycle inputs; basket edits invalidate promise consent and
82
+ minor-money display uses the currency exponent.
83
+ - Shipped catalog SQL projects unchanged canonical positions 1/8/16/19/58/59/61,
84
+ promotions projects 47/48 and inventory projects 27/33; native catalog factories
85
+ retain the existing store bodies and references preserve their named exports.
86
+ - A1 adds 17 neutral marketing/consent declarations, the three-function `communications/resend`
87
+ entry, the `communications/klaviyo` marketing adapter and lazy opt-in reference bindings with
88
+ invocation-time admission; default routes, schedules and handlers stay empty.
89
+ Existing providers remain assignable; existing neutral entries keep their runtime
90
+ behaviour (the declarations above are additive), and the maintained reference
91
+ adapter and default wiring are unchanged.
92
+ Authenticated raw webhooks and GET-only delivery reconciliation retain host
93
+ ownership of persistence and admission; no SDK or default sender is added.
94
+ `communications/klaviyo` profile projection, negative consent readback,
95
+ account-wide deletion acknowledgement and authoritative consent push stay
96
+ verification-pending until the host supplies owner TEST verification.
97
+ Audience-scoped deletion and deletion status are unsupported; newsletter sync
98
+ refuses. No flow control, historical import, suppression edits or automatic
99
+ mutation retry is added.
100
+ - Consent push grants stay audience-scoped; only withdrawals may be account-wide.
101
+ The capability declares `grantEffect`; accepted/acknowledged results require
102
+ `reconcileRequired`. Conformance keeps grants unsettled until settlement and
103
+ fresh readback. Withdrawals bypass grant-caused fences/quarantine but retain
104
+ same-key withdrawal fences and account cooling. No push factory, activation,
105
+ callback, retry or subpath is added.
106
+ - M06 in progress: inventory and shipping entries are early surfaces; module not complete
107
+ - The merged M06 surfaces include inventory contracts/admin/native reads, injected
108
+ new-purchase availability, reservation policy/maintenance and dated forecast
109
+ calculation with required provider injection, plus shipping selection, address
110
+ and rate handlers with required host validation.
111
+ - @openlup/platform size growth: added M05 catalog, pricing and promotions implementations, native stores and SQL projections, A1 communications adapters and consent contracts, and the merged early M06 inventory/shipping surfaces with their declarations and documentation.
112
+
113
+ Migration: upgrade the entire `@openlup/*` set from `0.17.0` to `0.18.0` for exact
114
+ core peer pins; new module adoption remains explicit and experimental.
115
+ Catalog and promotions server entries are adapters: their declarations require
116
+ selected optional `pg` peers, while runtime imports and injected executors work
117
+ without them and their contracts entries remain non-adapters. Supply host schemas, authorization,
118
+ responders and policies through the documented bindings. Acquisition requires
119
+ an explicit `AcquisitionFinancialPolicy` with no default; absence refuses with
120
+ `acquisition_terms_policy_unconfigured`, and reference activation remains off.
121
+ Bind resolved terms from the final optional issue/honor callback argument for
122
+ acquisition-aware acceptance; existing callbacks remain assignable. Stop
123
+ assigning `NegativeFeedback.kind` or `.outcome`, now readonly. Reference-application
124
+ source threshold classifiers require the host's explicit threshold. Generated enum declaration
125
+ ordering changes preserve member values and runtime behavior. Catalog adds
126
+ `createPostgresBundleCatalogStore`, `createPostgresCatalogDraftStore` and
127
+ `createPostgresCatalogSkuEnvelopeReadPort`, plus `BUNDLE_MIGRATIONS` (16/19) and
128
+ `CATALOG_MIGRATIONS` (1/8/58/59/61); composition adds
129
+ `createCatalogContribution` and `CatalogContributionInput`, with no public export
130
+ removed or renamed. Existing named reference imports remain compatibility paths.
131
+ The native writer, pooled transaction binding and transport remain reference-owned;
132
+ browser schemas stay local. Core remains the promotions evaluator; no claim writer
133
+ is added, and claim writing and mounted acceptance retain their owners. Reference
134
+ shipping selection, pickup and stock UI mechanics and browser validation stay local.
135
+ Install the complete canonical migration manifest, never sparse package SQL
136
+ projections as an installation chain; this preparation adds no new SQL migration.
137
+ A1 hosts retain credentials, identity/authority, atomic storage, environment,
138
+ egress and schedule ownership; acknowledged/accepted does not establish remote
139
+ effect and local consent remains authoritative.
140
+
141
+ ### Known limitations
142
+
143
+ - D8-1: native advisory v2 promo-code candidates and rejection details are not supported on the native backend.
144
+ - D8-2: native mounted v2 code issue/honor/fallback is not supported on the native backend.
145
+ - D8-3: acquisition-only mounted issuance/honor is not supported on the native backend.
146
+ - D8-4: full native/managed eligibility equivalence is not supported on the native backend.
147
+ - Bundle-1: independent database human-only actor-kind enforcement is not supported on the native backend and is the first item of a future native-backend parity round.
148
+ - Bundle-2: managed-equivalent actor-kind/email history is not supported on the native backend.
149
+ - Bundle-3 is closed for M05 mounted admin/feed readback through the merged availability builder with an injected stock reader; the real native stock read remains M06 P5a work.
150
+ - Bundle-4 establishes only incumbent real-PostgreSQL contention characterization and provides no exactly-once guarantee.
151
+ - The managed baseline schema and its pgTAP tests retain the incumbent legacy value `44.404`; removing it needs a forward migration and an owner decision, while reference composition supplies that value to application code.
152
+ - A1 evidence is offline only: account verification, hosted-time behaviour and owner TEST certification are not claimed, and the `communications/klaviyo` adapter's capabilities stay verification-pending.
153
+
11
154
  ## [0.17.0]
12
155
 
13
156
  - Publishable on the npm `latest` dist-tag as `0.17.0`, from tag
package/README.md CHANGED
@@ -4,9 +4,16 @@ Development preview. This package joins core and outbox in the publishable set f
4
4
 
5
5
  It holds the runnable server substrate an OpenLup application composes: the Node HTTP runtime, BFF dispatch, scheduling and job leases, blob storage, data gateways, the node-postgres migration runner and bundle composition. Ports and their contracts stay in `@openlup/core/platform-runtime`.
6
6
 
7
+ For the prepared `0.19.0` set, read the [adjacent-release migration and known
8
+ limitations](CHANGELOG.md#0190) before selecting the opt-in M05 parity seams or
9
+ M06 composition bindings. M06 in progress: inventory and shipping entries are early surfaces; module not complete
10
+ The size gate compares this candidate with the published `0.18.0` tarball;
11
+ preparation, offline adapter evidence and a passing size cap grant no publication
12
+ or provider-account certification.
13
+
7
14
  ## Package surface
8
15
 
9
- `release-gates.json` declares kind `rail`: this foundation provides runtime infrastructure over core ports, matching the architecture's rail responsibility. Its thirteen experimental entries each bind a declaration snapshot and package-owned smoke tests. The API checker reads this same inventory.
16
+ `release-gates.json` declares kind `rail`: this foundation provides runtime infrastructure over core ports, matching the architecture's rail responsibility. Its twenty-five experimental entries each bind a declaration snapshot and package-owned smoke tests. The API checker reads this same inventory.
10
17
 
11
18
  | Export | Contents |
12
19
  | --- | --- |
@@ -23,6 +30,285 @@ It holds the runnable server substrate an OpenLup application composes: the Node
23
30
  | `./identity/contracts` | Experimental capability: browser-safe customer auth port, value types and provider parser |
24
31
  | `./communications` | Experimental existing public consent/status, newsletter sync, Auth email hook, transport contracts/capture, observation/polling orchestration, standard webhook verification and delivery receipts; host-selected rendering, egress, protocol mapping and control policy |
25
32
  | `./communications/contracts` | Pure renderer, block builders, copy-injected commerce/subscription factories and email/newsletter/Auth/intake/receipt types; no Zod, Node or provider runtime imports |
33
+ | `./inventory` | Experimental schemas/ports, handlers, native stores, projection, injected forecast and SQL descriptor; `./inventory/contracts` DTOs. |
34
+ | `./catalog` | Experimental neutral catalog schemas, drafts, reads, media source packs and publication ports |
35
+ | `./catalog/contracts` | Dependency-free catalog DTOs, media resolver, authority and canonicalization helpers |
36
+ | `./pricing` | Experimental price authority, quote computation/handlers, offer projection/cache, readiness and policy tokens |
37
+ | `./pricing/contracts` | Dependency-free authority, money, quote and offer DTOs and version constants |
38
+ | `./promotions` | Experimental promotion application, admin handlers, native read/sweep, SQL projections and acceptance |
39
+ | `./promotions/contracts` | Dependency-free preview and admin DTOs |
40
+ | `./shipping` | Experimental delivery ports, injected-schema handlers, summary and evidence |
41
+ | `./shipping/contracts` | Type-only delivery, pickup-point, summary and evidence DTOs |
42
+
43
+ ## Shipping
44
+
45
+ Shipping handlers require injected host schemas; contracts are type-only with opaque provider/carrier strings.
46
+ No vendor code, inventory import, activation or parity claim.
47
+
48
+ ## Inventory
49
+
50
+ `createInventoryBindings` selects one store with exact host provider validation. Native new-purchase reads refuse as `inventory_native_new_purchase_stock_read_unsupported`; `createInventoryContribution` declares selected callables without activation.
51
+
52
+ `INVENTORY_MIGRATIONS` projects canonical units 27/33 byte-for-byte; install the full catalogue. Store support and pending proof: [M06 parity](../../docs/platform/plans/oss-m06-stock-reservations-delivery.md#parity-pending-rows).
53
+
54
+ ## Promotions
55
+
56
+ `./promotions` owns the existing automatic/legacy and code quote application,
57
+ benefit interpretation, advisory read ports, preview proofs, public-money binding,
58
+ acceptance tokens and passive telemetry. It calls `@openlup/core/promo`; it does
59
+ not contain another evaluator. Each factory receives the host facts it needs:
60
+ `createQuotePromoDiscounts` takes a customer classifier;
61
+ `createQuotePromotionV2` also takes the product floor and bound legacy application;
62
+ `createQuoteAutomaticPromotions` takes an email eligibility resolver and the bound
63
+ applications. `createQuotePromotionCodeAdjustments` and `createPromotionCodePreview`
64
+ require the floor. No factory supplies a default financial policy.
65
+
66
+ `createPromotionQuoteAcceptance<Request>` requires `projectRequest`, which returns
67
+ the host's exact request-binding projection; `promoCodes` also binds separately.
68
+ Its four issue/verify functions retain public-money projection, section diagnostics,
69
+ TTL and rotation. Explicit `acquisitionTerms` binds the full server-selected promise.
70
+ The pricing quote handler passes resolved acquisition terms to both
71
+ acceptance callbacks. An opt-in shipping binding appends shipping terms. A host must forward them to the acceptance helper. With no
72
+ acquisition configuration, terms are absent and historical token bytes stay equal.
73
+ This opt-in signature addition does not activate acquisition-only mounted issuance.
74
+
75
+ `recordPromotionAcceptanceOutcome` requires a recorder and swallows recorder
76
+ failure. The reference wrapper retains its existing sanitized operational recorder.
77
+ Reference wrappers also retain startup floor resolution, customer classification,
78
+ email/contact precedence and the rich request projection. Quote reads never reserve
79
+ capacity. Pricing receives application callbacks and has no import back to promotions.
80
+
81
+ `createAdminPromotionsHandlers` and `createAdminPromotionCodesHandlers` receive
82
+ the relevant members of `PromotionAdminBindings`: existing host admin-kit factories, authorization
83
+ resolver, response writers, exact RPC-error constructor/mapper and bound preview
84
+ helpers. The package does not copy or relocate that kit. The reference wrappers
85
+ bind these same objects, preserving human-only writes, required audit, signed
86
+ activation previews, validity-window checks and revision-aware replay delegation.
87
+ `createAdminPromotionSchemas` also requires the host currency schema. Its list
88
+ DTOs preserve system-managed read-only rows and valid status-only mirror handles;
89
+ the managed adapter retains the underlying write fences. Adjacent shipping,
90
+ catalog-price and subscription-band schemas and managed adapters remain reference-owned.
91
+
92
+ `createPostgresCommercePromoDataPort` and `createPostgresPromotionClaimSweepPort`
93
+ use an injected `PgQueryExecutor` from `./data`. They retain four evaluator reads
94
+ and bounded stale-claim sweep; they add no claim writer or reservation path.
95
+ `PROMOTIONS_MIGRATIONS` identifies the byte-identical projections of canonical
96
+ units 47/48 with paths, positions and hashes. These sparse units are not an
97
+ installation chain: use the complete canonical catalogue. No migration or
98
+ manifest identity changes in this move.
99
+
100
+ The server entry is classified as an adapter because its executor declaration
101
+ reaches the data entry and optional pg types. It imports at runtime without pg
102
+ and works with an injected executor; selecting the data gateway retains its
103
+ named missing-pg refusal. Its declarations compile after peer selection. The
104
+ contracts entry remains a non-adapter, imports no other module and compiles
105
+ without optional peers in NodeNext and Bundler modes.
106
+
107
+ The [promotion suites](test/promotions/) retain existing assertions. The
108
+ [real PostgreSQL witness](../../tests/postgres/promotionsNative.test.ts) installs
109
+ the full canonical chain, checks projection hashes and validated constraints,
110
+ and proves reads without durable writes, paid/released lifecycle, bounded
111
+ sweep, receipt/outbox fences, replay, lock/settlement skips and explicit invoker
112
+ grants. This is existing native lifecycle/read evidence only. Native code
113
+ candidates, mounted issue/honor, acquisition-only mounted acceptance and the
114
+ full native/managed eligibility matrix are accepted native-backend capability
115
+ gaps, without a parity claim, in the
116
+ [module ledger](../../docs/platform/plans/oss-m05-catalog-offers-pricing.md#d8-pending-outcome-ledger).
117
+
118
+ Opt-in `shippingTerms` also binds shipping-only promises. `createQuoteShippingPromotions`
119
+ resolves post-discount thresholds; optional `acquisition` bindings select host policy.
120
+ Omission preserves incumbent behavior. See [parity seams](../../docs/platform/CANONICAL_CONTRACTS.md#m05-parity-seams).
121
+
122
+ ## Pricing
123
+
124
+ `./pricing` provides the existing OpenLup strict commerce price authority,
125
+ subscription-price-policy schemas, canonical digest and integer math, signed
126
+ pricing-policy assignment tokens and safe refusal mapping. Hosts inject exact
127
+ price-list, base-entry, legacy-entry and policy-history reads. The authority
128
+ validates the base before reading history and uses the observed base's
129
+ `priceListId` for that lookup. History excludes legacy fallback even when no
130
+ revision is currently effective. Digest, interval, ambiguity and amount-kind
131
+ refusals retain their existing identities and precedence. The opt-in
132
+ `createConcurrentCommercePriceAuthorityPort` instead schedules history alongside
133
+ base reads using the selected list ID, with base-refusal precedence.
134
+
135
+ `./pricing/contracts` contains dependency-free authority observations, policy
136
+ DTOs and version constants; its only external type comes from the exact
137
+ `@openlup/core/pricing` entry. Zod schemas, Web Crypto hashing and Node HMAC token
138
+ operations stay in the server entry. Tokens retain assignment binding, the
139
+ 72-hour default compatibility window and rollback behavior. Secret selection,
140
+ feature flags and readiness remain reference composition responsibilities.
141
+ Reference paths use named exports of the same functions and error classes;
142
+ the browser keeps its existing policy schema binding locally.
143
+
144
+ The quote foundation also owns neutral money/tax/quote DTOs, promotion evidence
145
+ and rejection details, bounded catalog facts, provenance creation/public stripping
146
+ and the supported-tax-profile guard. `createCommerceQuoteSchemas` requires the
147
+ host's currency, product-slug and context schemas; `createCommerceQuotePrimitives`
148
+ requires currency validation. No settlement default or catalog policy is installed.
149
+ The original line, currency, VAT, discount and shipping equations and v1/v2
150
+ provenance refusals are preserved. Quote ports accept host request/response types.
151
+ The reference keeps its rich browser request/context validation and catalog bridge;
152
+ server compatibility paths export the same error classes and provenance/tax functions.
153
+ The portable schema counterparts stay server-side; binding tests compare their
154
+ results and diagnostics with browser validation.
155
+
156
+ `createDbBackedCommerceQuotePort` owns the existing quote computation and price,
157
+ tax and component helpers. Hosts supply bounded catalog/price reads, settlement
158
+ values, a flat shipping read, promotion application and context callbacks. The
159
+ reference binds `getShippingFlatMinor`, industry context and existing promotion
160
+ implementation. Shipping is read before promotion application; the original VAT
161
+ helper and both discount lanes are preserved. Snapshot comparison accepts injected
162
+ response validation and request reconstruction, so rich context stays local.
163
+
164
+ Quote, ordered batch and offer handlers take the host's schemas and BFF responder;
165
+ the reference binds its observed request context. Their error identities, refusal
166
+ mapping, promotion acceptance/fallback and public evidence refusal are unchanged.
167
+ Offer projection requires roster, representative-request, unit-count, floor and
168
+ wire-scope policy. It retains v1/v2 responses, partial degradation only for a
169
+ missing configured price, and the first successfully priced representative.
170
+ The offer cache bounds success freshness from load start and retains its separate
171
+ failure TTL; readiness keeps its 60-second positive and 5-second negative caps.
172
+ The additive experimental acquisition API is off by default. `selectAcquisitionTerms`
173
+ and `filterAcquisitionPromotions` require an `AcquisitionFinancialPolicy<Row>`:
174
+ row facts, classification, metadata validation, pair matching, initial rate and
175
+ unconfigured terms all come from the host. Omission refuses with
176
+ `acquisition_terms_policy_unconfigured`, even with no rows; no financial policy
177
+ or schedule is bundled. Selection preserves row identity, validates the whole
178
+ tagged schedule and uses half-open windows with the next future boundary.
179
+
180
+ `createAcquisitionQuoteSchemas` composes separate capability/context/resolved-terms
181
+ schemas with the host's validators. `projectAcquisitionOfferPricing` pins the
182
+ observation time and capability for every representative request; its v3 output
183
+ contains public terms and expires by the next boundary or 60 seconds.
184
+ `createAcquisitionOfferPricingSchema` retains the injected v2 settlement and scope
185
+ rules. The opt-in handler delegates absent acquisition headers to an incumbent
186
+ handler; negotiated responses require v3, paired v2 policy and private no-store
187
+ headers. The incumbent handler continues ignoring acquisition headers.
188
+ `createAcquisitionReadinessCache` requires an explicit policy configuration,
189
+ validates acquisition evidence, clamps positive cache expiry and rereads once
190
+ after crossing a boundary. The existing shared readiness cache remains unchanged.
191
+
192
+ Promise comparison is independent of money. Explicit server-selected resolved
193
+ terms can join the existing acceptance money projection and totals section;
194
+ absence contributes no property. Quote/batch refusal mapping and unsigned-terms
195
+ fallback checks require explicit acquisition configuration. Reference composition
196
+ supplies none: existing schemas, headers, reads, error details and token bytes
197
+ are preserved. Threshold shipping is supplied by the separate
198
+ [parity seam](../../docs/platform/CANONICAL_CONTRACTS.md#m05-parity-seams).
199
+ Checkout admission, claims, finalization,
200
+ promotion implementation, stores, SQL, routes and activation remain outside
201
+ this API.
202
+
203
+ The package witnesses in `test/pricing/` move the incumbent authority, policy,
204
+ token, quote, snapshot, handler, offer, cache and readiness assertions. Currency
205
+ fixtures use synthetic identifiers while preserving the same arithmetic and
206
+ refusals. Reference schemas, rich catalog/context policy and composition remain
207
+ in the application. The existing cold consumer exercises both entries and
208
+ compiles installed declarations without optional provider peers.
209
+
210
+ ## Catalog
211
+ Opt-in `priceAuthority: "effective"` on the native bundle store and the admin
212
+ `effectiveTarget` hook provide [effective bundle parity](../../docs/platform/CANONICAL_CONTRACTS.md#m05-parity-seams);
213
+ `selectEffectiveBundleTargetPrice` is exported. Omitted seams preserve defaults.
214
+
215
+ The native envelope and dark draft adapters now live in this entry as
216
+ `createPostgresCatalogSkuEnvelopeReadPort` and `createPostgresCatalogDraftStore`.
217
+ They accept an injected executor and retain the existing mapping, errors and SQL
218
+ semantics. The mapper remains internal to the package. `CATALOG_MIGRATIONS`
219
+ projects canonical positions 1, 8, 58, 59 and 61 byte for byte; these assets are
220
+ sparse references, never a standalone install chain. No canonical migration or
221
+ manifest entry changes.
222
+
223
+ The composition entry adds `createCatalogContribution` and its structural input
224
+ interface. It describes actual catalog, pricing and promotions callables under
225
+ those existing module identities, with no environment discovery, client creation
226
+ or registration. It imports only readiness types: composition gains no catalog
227
+ edge, and catalog keeps its type-only data edge plus one pricing value edge for
228
+ the effective-window selector. Package boundary
229
+ checks pin those imports and peer-free composition declarations. The packed
230
+ consumer exercises both new stores and the descriptor without optional peers;
231
+ its synthetic executor proves named refusal, not durable storage behavior.
232
+
233
+
234
+ `./catalog` is an experimental capability for the existing neutral catalog
235
+ foundation, installed product types, draft validation/use cases, active SKU
236
+ selection, resolved SKU projection and sellable reference reads. Hosts supply
237
+ the read/store ports, verified operator authorizer, product-type registry and
238
+ BFF responder. Draft commands retain the original canonical bytes, receipt-first
239
+ replay, actor binding and named refusals. Read projections carry opaque
240
+ product-scoped document references; they do not interpret document payloads.
241
+
242
+ Fixed-bundle application/admin now uses this same server entry: rules, read/write
243
+ ports, batched stock derivation, nine mutations, four reads/price preview and the
244
+ public sellable-feed factory. Named reference wrappers inject lifecycle and stock
245
+ helpers, existing admin kit/spec/flags, validators, responder, wire versions and
246
+ the reference-owned RPC error constructor. The read error has one package identity.
247
+ `createPostgresBundleCatalogStore` now accepts the data entry's injected
248
+ `PgQueryExecutor`; it renders the incumbent list/detail/feed/history SELECTs
249
+ without constructing a pool or switching roles. The writer, pooled transaction
250
+ binding and transport adapters remain reference-owned. `BUNDLE_MIGRATIONS`
251
+ projects canonical units 16 and 19 with their original paths, positions, hashes
252
+ and byte-identical SQL. These sparse projections are not an installation chain:
253
+ apply the complete canonical manifest. No new migration or activation is added.
254
+ Preview target selection remains the existing first active matching-mode row.
255
+
256
+ `./catalog/contracts` carries dependency-free DTOs, the shared authority error,
257
+ GTIN/authority helpers, quantity/option helpers and the existing draft JSON
258
+ canonicalizer. It imports no Zod, Node runtime or server barrel. Runtime schemas
259
+ use the server entry with jitless Zod; the reference browser keeps its sellable
260
+ schemas locally. Media manifest validation and `resolveProductMedia` are also
261
+ browser exports: declared product/variant/locale associations resolve to supplied
262
+ URLs with deterministic ordering and neutral fallback, without filename inference.
263
+ The server entry adds bounded source-pack export/validation/restore/import;
264
+ `BlobStoragePort` comes from the existing `@openlup/core/platform-runtime` entry.
265
+ Import validates every resource before uploading immutable digest keys, deduplicates
266
+ shared keys and never activates associations. No upload route is mounted.
267
+
268
+ Read and draft behavior is supplied by the existing use cases and host ports.
269
+ `publicationRead`, `publish` and `lifecycleWrite` remain explicitly unsupported
270
+ in the neutral reference binding. Lifecycle DTOs and server validation/publication
271
+ ports are types only, with an opaque publisher brand and no constructor or default
272
+ binding. A missing authority is `unsupported`; an unavailable configured authority
273
+ is `dependency_unavailable`, never an absent receipt. Successful readback requires
274
+ real publication lineage; existing active rows cannot invent a head. History pages
275
+ are bounded to 100 receipts with stable revision ordering and opaque cursors.
276
+ Existing SKU `draft`/`active`/`archived` and draft receipt `open`/`abandoned` wire
277
+ statuses remain unchanged. `withdrawn` may map from `archived` only where an
278
+ authority establishes withdrawal; abandoning a draft does not withdraw a variant.
279
+ Neither entry installs SQL. Rich application catalog interpretation remains
280
+ reference-owned. The [M05 plan](../../docs/platform/plans/oss-m05-catalog-offers-pricing.md)
281
+ records the cut, its exclusions and the witness ledger.
282
+ The moved characterization suites are under `test/catalog/`; the required cold
283
+ consumer imports both entries without optional peers and checks installed
284
+ canonicalization, authority identity, selection and unauthorized draft refusal.
285
+ Three synthetic media conformance cases and one lifecycle type case complement
286
+ those moved suites; the existing package boundary tests cover browser closure.
287
+ Bundle browser schemas remain locally defined by the reference, preserving
288
+ parse/default/strictness behavior; the package contracts add plain DTO types only.
289
+ Installed callers inject validators into server factories. Five package suites
290
+ retain 44 bundle cases; two root binding suites retain 18. Four neutral W4 cases
291
+ and one binding/browser-closure case add five required cases. The cold consumer
292
+ also checks bundle composition refusal, unknown stock and exact allocation;
293
+ catalog server is deliberately classified as an adapter because its declarations
294
+ reach optional pg types through the executor. Its runtime still imports and reads
295
+ through an injected executor with optional peers absent. Catalog contracts remains
296
+ a non-adapter and compiles without peers. Server declarations compile after peer
297
+ selection. Five real-PostgreSQL cases characterize full-chain replay, complete
298
+ ordered reads with unchanged data, whole-set rollback/refusals/dry runs, price
299
+ history, sequential key recognition and explicit invoker grants. Native routines
300
+ have no independent human-only actor-kind gate; the handler supplies that gate.
301
+ This does not close the bundle parity ledger.
302
+ The complete contracts entry measures 3,281 B minified+gzip against its 4,096 B
303
+ budget; other entry and aggregate caps are unchanged.
304
+
305
+ Moved catalog, pricing and promotion fixtures use synthetic identities, regions,
306
+ currencies and host-defined context fields. Their assertions retain the original
307
+ operators and case counts. Reference classifiers receive the legacy threshold
308
+ from their host composition; only the immutable managed baseline predicates
309
+ await an owner decision. Pricing VAT calculation retains
310
+ both exported helpers and their signatures: `calculateIncludedVat` delegates to
311
+ `splitIncludedVat` through a distinct named wrapper using the same arithmetic.
26
312
 
27
313
  ## Scheduled jobs
28
314
 
@@ -149,7 +435,7 @@ phase redirects npm to an empty temporary cache.
149
435
 
150
436
  The composition declarations describe the injected Supabase factory structurally;
151
437
  they do not import the data entry or its PostgreSQL types. The cold proof still
152
- requires all six nonadapter entries (including `./identity/contracts`) to import in fresh processes and compile
438
+ requires all declared non-adapter entries (including `./identity/contracts`) to import in fresh processes and compile
153
439
  in both resolution modes with all three optional peers absent.
154
440
 
155
441
  <!-- openlup-doc-impact {"unit":"platform-substrate","digest":"sha256-00994d288cfec0c8dc0ae9aeae2ff542e2e9af2fedcb4dd2dfeb6c99523be92d","reason":"The manifest moves to the 0.15.0 set version with the exact @openlup/core 0.15.0 peer pin. The package surface, settings and verification described here are unchanged by this preparation delta."} -->
@@ -506,8 +792,10 @@ The maintained mail transport, credentials, callback verification/mapping,
506
792
  poll read/mapping, timeline and send-ledger adapters remain in reference source.
507
793
  B1 changes only the four raw-injection guard sites in the reference delivery
508
794
  adapters and the approved invoice test fixture; the concrete client and all
509
- other vendor-directory files retain the comparison-base bytes. The package exposes
510
- transport/result contracts and capture without a concrete mail factory.
795
+ other vendor-directory files retain the comparison-base bytes. The neutral
796
+ `./communications` entry exposes transport/result contracts and capture without
797
+ concrete mail wiring. The platform ships opt-in vendor adapter subpaths;
798
+ default wiring includes none, and adopters choose or replace them.
511
799
  The type-only `CommunicationProvider<Provider>` and `EmailMessageReadModel<Provider>`
512
800
  accept host vocabulary; reference types retain their original literal.
513
801
 
@@ -517,8 +805,9 @@ whole decision and enters the sender only for a coherent `production`,
517
805
  `sandbox_direct` or `sandbox_sink` decision. The sender receives the effective
518
806
  recipient and a frozen context with intended recipient, host-selected credential,
519
807
  mode, reason and environment tag. It must consume that context when selecting
520
- credentials and emitting provider metadata. The package reads no environment and
521
- contains no provider client. Missing/throwing policy, unknown modes, mismatched
808
+ credentials and emitting provider metadata. The neutral entry reads no environment
809
+ and contains no provider client. Opt-in adapters consume this same guard and
810
+ host-selected context. Missing/throwing policy, unknown modes, mismatched
522
811
  recipients/tags, blank credentials or unsupported fields fail with status zero,
523
812
  no identifier and bounded error codes. Reasons are lower-case token codes up to
524
813
  80 characters. One unadorned `local@domain.example` recipient mailbox is required;
@@ -751,3 +1040,7 @@ Core readiness, explicit provider ports and host-supplied schedules. Native
751
1040
  readback and signed-token bridges do not promise managed frequency caps, legacy
752
1041
  tester-source parity, a send-time fence or a full native network sender. The
753
1042
  opt-in browser profile adds no npm entry or UI package export.
1043
+
1044
+ Source contributors record notable changes in package changelog fragments;
1045
+ release preparation assembles the shipped CHANGELOG. Follow the
1046
+ [public contribution guide](https://github.com/openlup/openlup/blob/main/CONTRIBUTING.md#development-preview-checks).
@@ -0,0 +1,2 @@
1
+ /** Shares exact-code parsing with detail reads; omission alone keeps discovery broad. */
2
+ export declare function parseCatalogActiveSkuSelection(value: unknown): readonly string[] | undefined;
@@ -0,0 +1,20 @@
1
+ import { catalogSkuEnvelopeSelectorSchema } from "./foundationSchemas.js";
2
+ /** Shares exact-code parsing with detail reads; omission alone keeps discovery broad. */
3
+ export function parseCatalogActiveSkuSelection(value) {
4
+ if (value === undefined)
5
+ return undefined;
6
+ if (!Array.isArray(value) || value.length < 1 || value.length > 100) {
7
+ throw new RangeError("catalog_active_sku_selection_invalid");
8
+ }
9
+ const codes = [];
10
+ const seen = new Set();
11
+ for (const skuCode of value) {
12
+ const parsed = catalogSkuEnvelopeSelectorSchema.safeParse({ kind: "sku_code", skuCode });
13
+ if (!parsed.success || parsed.data.kind !== "sku_code" || seen.has(parsed.data.skuCode)) {
14
+ throw new RangeError("catalog_active_sku_selection_invalid");
15
+ }
16
+ codes.push(parsed.data.skuCode);
17
+ seen.add(parsed.data.skuCode);
18
+ }
19
+ return codes;
20
+ }
@@ -0,0 +1,72 @@
1
+ import type { ZodType } from "zod";
2
+ import type { HttpRequest, HttpResponse } from "../http/index.js";
3
+ /** Structural inputs to the reference admin kit. Authorization and parsing stay with the host. */
4
+ export type AuthorizeAdmin = () => Promise<{
5
+ ok: true;
6
+ userId: string;
7
+ role: "admin" | "distributor";
8
+ isMachineActor: boolean;
9
+ } | {
10
+ ok: false;
11
+ code: "UNAUTHORIZED" | "FORBIDDEN";
12
+ message: string;
13
+ identityCode?: string;
14
+ }>;
15
+ export interface AgentDomainQuerySpec<T> {
16
+ readonly key: string;
17
+ readonly requestSchema: ZodType<T, unknown>;
18
+ readonly gate: "read";
19
+ readonly allowedActorKinds: readonly ("human" | "machine")[];
20
+ }
21
+ export interface AgentDomainMutationSpec<T> extends Omit<AgentDomainQuerySpec<T>, "gate"> {
22
+ readonly gate: "mutation" | "activation";
23
+ readonly lifecycleMarkers: readonly ("LIFECYCLE_ACTIVATE" | "LIFECYCLE_DEACTIVATE" | "HARD_DELETE")[];
24
+ }
25
+ export type BundleMutationKey = "create" | "update" | "setComposition" | "setTargetPrice" | "archive" | "restore" | "cloneDraft" | "activate" | "deactivate";
26
+ export type BundleQueryKey = "list" | "get" | "history" | "previewPrice";
27
+ export interface BundleResponseSchema {
28
+ safeParse(value: unknown): {
29
+ success: boolean;
30
+ data?: unknown;
31
+ };
32
+ }
33
+ type Handler = (req: HttpRequest, res: HttpResponse) => Promise<void>;
34
+ interface CommonOptions<T> {
35
+ authorizeAdmin: AuthorizeAdmin;
36
+ flagName?: string;
37
+ enabled?: boolean;
38
+ toResponse(value: T): Record<string, unknown>;
39
+ disabledMessage?: string;
40
+ invalidRequestMessage: string;
41
+ failureMessage: string;
42
+ }
43
+ export interface BundleAdminBindings {
44
+ bundleSpec: {
45
+ readonly mutations: Readonly<Record<string, AgentDomainMutationSpec<unknown>>>;
46
+ readonly queries?: Readonly<Record<string, AgentDomainQuerySpec<unknown>>>;
47
+ readonly mutationFlag: `${string}_MUTATIONS_ENABLED`;
48
+ readonly activationFlag: `${string}_ACTIVATION_ENABLED`;
49
+ readonly readFlag?: `${string}_READ_ENABLED`;
50
+ };
51
+ COMMERCE_CONTRACT_VERSION: "commerce.v0";
52
+ /** Passed by identity: instanceof and shared SQLSTATE mapping retain their owner. */
53
+ BundleRpcError: new (sqlstate: string | undefined, message: string) => Error & {
54
+ sqlstate: string | undefined;
55
+ pgMessage: string;
56
+ };
57
+ createAdminMutationHandler<Request, Result>(options: CommonOptions<Result> & {
58
+ mutation: AgentDomainMutationSpec<Request>;
59
+ invoke(actorId: string, request: Request): Promise<Result>;
60
+ }): Handler;
61
+ createAdminParameterizedReadHandler<Request, Result>(options: CommonOptions<Result> & {
62
+ query: AgentDomainQuerySpec<Request>;
63
+ load(actorId: string, request: Request): Promise<Result>;
64
+ responseSchema: BundleResponseSchema;
65
+ invalidResponseMessage: string;
66
+ }): Handler;
67
+ bundleHistoryResponseSchema: BundleResponseSchema;
68
+ getBundleResponseSchema: BundleResponseSchema;
69
+ listBundlesResponseSchema: BundleResponseSchema;
70
+ previewBundlePriceResponseSchema: BundleResponseSchema;
71
+ }
72
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import type { BundleAdminBindings, AuthorizeAdmin } from "./adminBindings.js";
2
+ import type { CompositionRulesPort } from "@openlup/core/bundle";
3
+ import type { AdminBundleWritePort } from "./adminBundleWritePort.js";
4
+ export interface AdminBundleHandlerDeps {
5
+ writePort: AdminBundleWritePort;
6
+ authorizeAdmin: AuthorizeAdmin;
7
+ mutationsEnabled: boolean;
8
+ activationEnabled: boolean;
9
+ /**
10
+ * The adopter's composition rules. Supplied only where a composition constraint
11
+ * can be attached; when absent, a non-empty envelope is stored unvalidated, which
12
+ * is what "the platform never interprets it" means.
13
+ */
14
+ compositionRules?: CompositionRulesPort;
15
+ }
16
+ export declare function createAdminBundleHandlers({ bundleSpec, BundleRpcError, COMMERCE_CONTRACT_VERSION, createAdminMutationHandler }: Pick<BundleAdminBindings, "bundleSpec" | "BundleRpcError" | "COMMERCE_CONTRACT_VERSION" | "createAdminMutationHandler">): {
17
+ createAdminBundleCreateDraftHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
18
+ createAdminBundleUpdateDraftHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
19
+ createAdminBundleSetCompositionHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
20
+ createAdminBundleSetTargetPriceHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
21
+ createAdminBundleArchiveHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
22
+ createAdminBundleRestoreHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
23
+ createAdminBundleCloneDraftHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
24
+ createAdminBundleActivateHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
25
+ createAdminBundleDeactivateHandler: (deps: AdminBundleHandlerDeps) => (req: import("../http/types.js").HttpRequest, res: import("../http/types.js").HttpResponse) => Promise<void>;
26
+ };