@tokenoftrust/storefront-runner 1.4.2-rc.0 → 2.0.1

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 (370) hide show
  1. package/apps/storefront/astro.config.mjs +3 -3
  2. package/apps/storefront/dev-plugins/tenant-hot-reload.mjs +8 -3
  3. package/apps/storefront/env.d.ts +54 -5
  4. package/apps/storefront/integrations/materialize-guard.mjs +12 -14
  5. package/apps/storefront/migrations-apps/0004_deep_morph.sql +36 -0
  6. package/apps/storefront/migrations-apps/0005_common_mystique.sql +23 -0
  7. package/apps/storefront/migrations-apps/0006_broad_microchip.sql +16 -0
  8. package/apps/storefront/migrations-apps/0007_brave_outlaw_kid.sql +15 -0
  9. package/apps/storefront/migrations-apps/0008_blue_dazzler.sql +11 -0
  10. package/apps/storefront/migrations-apps/0009_bored_shinobi_shaw.sql +15 -0
  11. package/apps/storefront/migrations-apps/0010_ws4_verified_provider_measurement.sql +35 -0
  12. package/apps/storefront/migrations-apps/meta/0004_snapshot.json +1474 -0
  13. package/apps/storefront/migrations-apps/meta/0005_snapshot.json +1617 -0
  14. package/apps/storefront/migrations-apps/meta/0006_snapshot.json +1716 -0
  15. package/apps/storefront/migrations-apps/meta/0007_snapshot.json +1812 -0
  16. package/apps/storefront/migrations-apps/meta/0008_snapshot.json +1881 -0
  17. package/apps/storefront/migrations-apps/meta/0009_snapshot.json +1979 -0
  18. package/apps/storefront/migrations-apps/meta/_journal.json +42 -0
  19. package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
  20. package/apps/storefront/public/platform/amplitude-http/v1/entry.mjs +19 -0
  21. package/apps/storefront/public/platform/google-measurement/v1/entry.mjs +19 -0
  22. package/apps/storefront/public/shared/commerce-chrome.css +20 -2
  23. package/apps/storefront/scripts/build-v84-clean-clone-standalone.mjs +68 -0
  24. package/apps/storefront/scripts/deny-v84-clean-clone-standalone-capabilities.mjs +111 -0
  25. package/apps/storefront/scripts/deny-v84-dogfood-capabilities.mjs +2 -0
  26. package/apps/storefront/scripts/deny-v84-lifecycle-capabilities.mjs +247 -0
  27. package/apps/storefront/scripts/dogfood-v84-nonportable-routes.ts +73 -0
  28. package/apps/storefront/scripts/fixed-v84-native-install-producer.ts +79 -0
  29. package/apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs +10982 -0
  30. package/apps/storefront/scripts/import-v84-through-ws2.ts +38 -0
  31. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling-dependency.ts +2 -0
  32. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling.ts +4 -0
  33. package/apps/storefront/scripts/install-v84-native-through-ws1.ts +185 -0
  34. package/apps/storefront/scripts/prove-clone-isolation.ts +506 -0
  35. package/apps/storefront/scripts/replay-v84-clean-clone-pass.ts +148 -0
  36. package/apps/storefront/scripts/replay-v84-clean-clone-standalone.ts +35 -0
  37. package/apps/storefront/scripts/replay-v84-clean-clone.ts +214 -0
  38. package/apps/storefront/scripts/run-fixed-v84-native-install-producer.mjs +18 -0
  39. package/apps/storefront/scripts/run-v84-clone-isolation-proof.mjs +18 -0
  40. package/apps/storefront/scripts/run-v84-clone-lifecycle-proof.mjs +18 -0
  41. package/apps/storefront/scripts/run-v84-import-through-ws2-proof.mjs +17 -0
  42. package/apps/storefront/scripts/run-v84-nonportable-route-dogfood.mjs +15 -0
  43. package/apps/storefront/scripts/sanitize-v84-proof-environment.mjs +21 -0
  44. package/apps/storefront/scripts/v84CleanCloneGraphPin.ts +42 -0
  45. package/apps/storefront/scripts/v84CleanCloneSourceGraph.ts +145 -0
  46. package/apps/storefront/scripts/validate-v84-clone-lifecycle.ts +18 -0
  47. package/apps/storefront/src/components/Img.astro +1 -1
  48. package/apps/storefront/src/components/admin/AdminBlogTab.astro +19 -16
  49. package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
  50. package/apps/storefront/src/components/admin/AdminPublishTab.astro +1057 -412
  51. package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
  52. package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
  53. package/apps/storefront/src/components/chrome/NavDropdown.astro +12 -0
  54. package/apps/storefront/src/components/chrome/SiteFooter.astro +7 -2
  55. package/apps/storefront/src/components/chrome/SiteHeader.astro +46 -10
  56. package/apps/storefront/src/components/compliance/AdultSignatureNotice.astro +1 -1
  57. package/apps/storefront/src/components/compliance/ComplianceNotice.astro +1 -2
  58. package/apps/storefront/src/components/compliance/ExciseTaxNotice.astro +1 -2
  59. package/apps/storefront/src/components/compliance/PactActNotice.astro +1 -1
  60. package/apps/storefront/src/components/compliance/Prop65Warning.astro +1 -2
  61. package/apps/storefront/src/components/compliance/PurchaseLimitNotice.astro +2 -3
  62. package/apps/storefront/src/components/compliance/ShippingRestrictionNotice.astro +2 -2
  63. package/apps/storefront/src/components/compliance/StateEligibilityNotice.astro +2 -3
  64. package/apps/storefront/src/components/content/TrustStrip.astro +4 -4
  65. package/apps/storefront/src/components/islands/MobileNav.tsx +26 -1
  66. package/apps/storefront/src/components/islands/VariantSelector.tsx +27 -2
  67. package/apps/storefront/src/components/islands/useCheckoutHandoffCorrelation.ts +75 -0
  68. package/apps/storefront/src/components/membership/IllustrativeLabel.astro +1 -2
  69. package/apps/storefront/src/components/membership/TierCards.astro +2 -2
  70. package/apps/storefront/src/components/membership/TierComparisonTable.astro +2 -2
  71. package/apps/storefront/src/components/subscription/SavingsExplainer.astro +2 -2
  72. package/apps/storefront/src/config/adminTenantLookup.ts +35 -0
  73. package/apps/storefront/src/config/devTenantSeed.ts +9 -9
  74. package/apps/storefront/src/config/resolver.ts +18 -10
  75. package/apps/storefront/src/layouts/Layout.astro +100 -20
  76. package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
  77. package/apps/storefront/src/lib/activity/changeActorAttribution.ts +86 -6
  78. package/apps/storefront/src/lib/activity/deployVersion.ts +1 -1
  79. package/apps/storefront/src/lib/admin/adminShell.ts +2 -0
  80. package/apps/storefront/src/lib/admin/envelope.ts +1 -2
  81. package/apps/storefront/src/lib/apps/adminService.ts +10 -0
  82. package/apps/storefront/src/lib/apps/adminSession.ts +1 -1
  83. package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
  84. package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
  85. package/apps/storefront/src/lib/apps/gtmMigrationInstall.ts +447 -0
  86. package/apps/storefront/src/lib/apps/gtmMigrationReport.ts +367 -0
  87. package/apps/storefront/src/lib/apps/gtmMigrationTab.ts +315 -0
  88. package/apps/storefront/src/lib/apps/integrationLifecycle.ts +614 -0
  89. package/apps/storefront/src/lib/apps/integrationLifecycleController.ts +125 -0
  90. package/apps/storefront/src/lib/apps/integrationReadModel.ts +563 -0
  91. package/apps/storefront/src/lib/apps/integrationsTab.ts +547 -0
  92. package/apps/storefront/src/lib/apps/integrationsView.ts +106 -0
  93. package/apps/storefront/src/lib/apps/managedAnalyticsService.ts +599 -0
  94. package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
  95. package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +8 -0
  96. package/apps/storefront/src/lib/apps/orders/ordersStore.ts +1 -1
  97. package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
  98. package/apps/storefront/src/lib/apps/registryService.ts +264 -10
  99. package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
  100. package/apps/storefront/src/lib/apps/v84CleanCloneReplayContext.ts +16 -0
  101. package/apps/storefront/src/lib/apps/v84CloneLifecycleCacheEvidence.ts +105 -0
  102. package/apps/storefront/src/lib/apps/v84CloneLifecycleEvidence.ts +177 -0
  103. package/apps/storefront/src/lib/apps/v84CloneLifecycleMaterialization.ts +251 -0
  104. package/apps/storefront/src/lib/apps/v84CloneLifecycleSemantics.ts +241 -0
  105. package/apps/storefront/src/lib/apps/v84CloneMigrationEvidence.ts +211 -0
  106. package/apps/storefront/src/lib/apps/v84CloneNativeInstallEvidence.ts +409 -0
  107. package/apps/storefront/src/lib/apps/v84NonportableCodeCoaching.ts +368 -0
  108. package/apps/storefront/src/lib/apps/v84NonportableRouteContract.ts +188 -0
  109. package/apps/storefront/src/lib/apps/v84NonportableRouteDogfood.ts +291 -0
  110. package/apps/storefront/src/lib/apps/ws1ManagedAnalyticsClient.ts +95 -0
  111. package/apps/storefront/src/lib/auth/adminApiGuard.ts +66 -0
  112. package/apps/storefront/src/lib/auth/adminEntry.ts +2 -2
  113. package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
  114. package/apps/storefront/src/lib/blog/collection.ts +114 -17
  115. package/apps/storefront/src/lib/blog/markdown.ts +1 -1
  116. package/apps/storefront/src/lib/blog/provider.ts +76 -9
  117. package/apps/storefront/src/lib/blog/types.ts +9 -9
  118. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome-assignments.example.json +6 -0
  119. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome.example.json +79 -0
  120. package/apps/storefront/src/lib/chrome/model.ts +48 -253
  121. package/apps/storefront/src/lib/chrome/navCurrent.ts +29 -0
  122. package/apps/storefront/src/lib/chrome/parseConfig.ts +18 -32
  123. package/apps/storefront/src/lib/chrome/variant.ts +39 -0
  124. package/apps/storefront/src/lib/commerce/checkoutHandoffCorrelation.ts +105 -0
  125. package/apps/storefront/src/lib/compliance/tamper-sentinel-boot.ts +152 -0
  126. package/apps/storefront/src/lib/compliance/tamper-sentinel.ts +327 -0
  127. package/apps/storefront/src/lib/content/index.ts +5 -5
  128. package/apps/storefront/src/lib/content-edit/applyDiff.ts +1 -1
  129. package/apps/storefront/src/lib/content-edit/route.ts +1 -1
  130. package/apps/storefront/src/lib/d1/catalog.ts +12 -0
  131. package/apps/storefront/src/lib/d1/schema-apps.ts +276 -0
  132. package/apps/storefront/src/lib/dev/cockpit/ask.ts +49 -0
  133. package/apps/storefront/src/lib/dev/cockpit/clickToSource.ts +71 -0
  134. package/apps/storefront/src/lib/dev/cockpit/copyCommand.ts +227 -0
  135. package/apps/storefront/src/lib/dev/cockpit/files.ts +249 -0
  136. package/apps/storefront/src/lib/dev/cockpit/hostedActivity.ts +500 -0
  137. package/apps/storefront/src/lib/dev/cockpit/infoPopover.ts +12 -0
  138. package/apps/storefront/src/lib/dev/cockpit/mcpCopy.ts +34 -0
  139. package/apps/storefront/src/lib/dev/cockpit/monitor.ts +107 -0
  140. package/apps/storefront/src/lib/dev/cockpit/stepper.ts +116 -0
  141. package/apps/storefront/src/lib/dev/cockpit/themeToggle.ts +23 -0
  142. package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
  143. package/apps/storefront/src/lib/edgeCache.ts +18 -6
  144. package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
  145. package/apps/storefront/src/lib/integration/browserEnvironment.ts +137 -0
  146. package/apps/storefront/src/lib/integration/managedInstallDeclarations.ts +72 -0
  147. package/apps/storefront/src/lib/integration/nonceStamp.ts +49 -0
  148. package/apps/storefront/src/lib/integration/tenantDeclarations.ts +116 -0
  149. package/apps/storefront/src/lib/membership/eligibility.ts +1 -1
  150. package/apps/storefront/src/lib/membership/model.ts +1 -2
  151. package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +2 -2
  152. package/apps/storefront/src/lib/newsletter/consent.ts +2 -2
  153. package/apps/storefront/src/lib/newsletter/send.ts +3 -3
  154. package/apps/storefront/src/lib/previewReload.ts +57 -1
  155. package/apps/storefront/src/lib/publish/adminPublishTab.ts +1775 -669
  156. package/apps/storefront/src/lib/publish/buildStream.ts +269 -0
  157. package/apps/storefront/src/lib/publish/collapsePersistence.ts +72 -0
  158. package/apps/storefront/src/lib/publish/lifecycleState.ts +369 -0
  159. package/apps/storefront/src/lib/publish/liveReleaseSummary.ts +29 -0
  160. package/apps/storefront/src/lib/publish/mergeDoctorOnFailure.ts +78 -0
  161. package/apps/storefront/src/lib/publish/mergeHealthBanner.ts +62 -0
  162. package/apps/storefront/src/lib/publish/mergeRowFindings.ts +124 -0
  163. package/apps/storefront/src/lib/publish/mergeSupportEscalation.ts +75 -0
  164. package/apps/storefront/src/lib/publish/publish-guard.ts +88 -0
  165. package/apps/storefront/src/lib/publish/publishFormat.ts +165 -0
  166. package/apps/storefront/src/lib/publish/publishHero.ts +177 -0
  167. package/apps/storefront/src/lib/publish/reviewRelease/changeState.ts +66 -0
  168. package/apps/storefront/src/lib/publish/reviewRelease/copy.ts +141 -0
  169. package/apps/storefront/src/lib/publish/reviewRelease/index.ts +41 -0
  170. package/apps/storefront/src/lib/publish/reviewRelease/permissions.ts +47 -0
  171. package/apps/storefront/src/lib/publish/reviewRelease/releaseState.ts +42 -0
  172. package/apps/storefront/src/lib/publish/reviewRelease/types.ts +59 -0
  173. package/apps/storefront/src/lib/publish/reviewRelease/viewModel.ts +440 -0
  174. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/actions.ts +161 -0
  175. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/controller.ts +325 -0
  176. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/render.ts +241 -0
  177. package/apps/storefront/src/lib/publish/shipWorkspace.ts +22 -3
  178. package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
  179. package/apps/storefront/src/lib/publish/streamLogConsole.ts +142 -0
  180. package/apps/storefront/src/lib/publish/versionNumber.ts +52 -0
  181. package/apps/storefront/src/lib/rawChrome.ts +125 -47
  182. package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
  183. package/apps/storefront/src/lib/seo/alternates.ts +1 -1
  184. package/apps/storefront/src/lib/social/notify.ts +4 -4
  185. package/apps/storefront/src/lib/storyblok/content-model.ts +7 -33
  186. package/apps/storefront/src/lib/storyblok/provider.ts +203 -69
  187. package/apps/storefront/src/lib/subscription/model.ts +4 -4
  188. package/apps/storefront/src/lib/the-build/provider.ts +9 -4
  189. package/apps/storefront/src/middleware/index.ts +273 -51
  190. package/apps/storefront/src/pages/[...slug].astro +9 -4
  191. package/apps/storefront/src/pages/admin/review-release.astro +265 -0
  192. package/apps/storefront/src/pages/admin/select.astro +96 -0
  193. package/apps/storefront/src/pages/admin.astro +16 -2
  194. package/apps/storefront/src/pages/api/activity.ts +8 -8
  195. package/apps/storefront/src/pages/api/admin/activity-alerts.ts +5 -20
  196. package/apps/storefront/src/pages/api/admin/orders/[id].ts +7 -2
  197. package/apps/storefront/src/pages/api/admin/orders.ts +8 -2
  198. package/apps/storefront/src/pages/api/apps/admin/gtm-migration-install.ts +174 -0
  199. package/apps/storefront/src/pages/api/apps/admin/gtm-migration.ts +96 -0
  200. package/apps/storefront/src/pages/api/apps/admin/integration-lifecycle.ts +118 -0
  201. package/apps/storefront/src/pages/api/apps/admin/integrations.ts +89 -0
  202. package/apps/storefront/src/pages/api/apps/admin/platform-adapters.ts +85 -0
  203. package/apps/storefront/src/pages/api/apps/internal/order-forward.ts +74 -2
  204. package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +77 -0
  205. package/apps/storefront/src/pages/api/compliance/tamper.ts +88 -0
  206. package/apps/storefront/src/pages/api/integrations/v1/[operation].ts +108 -0
  207. package/apps/storefront/src/pages/api/rum/vitals.ts +1 -2
  208. package/apps/storefront/src/pages/blog/[slug].astro +5 -5
  209. package/apps/storefront/src/pages/blog/author/[author].astro +3 -3
  210. package/apps/storefront/src/pages/blog/category/[category].astro +2 -2
  211. package/apps/storefront/src/pages/blog/index.astro +2 -2
  212. package/apps/storefront/src/pages/blog/tag/[tag].astro +2 -2
  213. package/apps/storefront/src/pages/cockpit.astro +61 -1362
  214. package/apps/storefront/src/pages/index.astro +10 -5
  215. package/apps/storefront/src/pages/llms.txt.ts +1 -1
  216. package/apps/storefront/src/pages/products/[handle].astro +7 -6
  217. package/apps/storefront/src/pages/sitemap.xml.ts +2 -2
  218. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +42 -31
  219. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +8 -3
  220. package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +6 -2
  221. package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +6 -2
  222. package/apps/storefront/src/pages/style-guide/index.astro +19 -5
  223. package/apps/storefront/src/pages/tenants/[id]/[...path].ts +38 -2
  224. package/apps/storefront/src/pages/the-build/[slug].astro +4 -4
  225. package/apps/storefront/src/pages/the-build/index.astro +2 -2
  226. package/apps/storefront/src/pages/the-build/rss.xml.ts +2 -2
  227. package/apps/storefront/src/styles/admin.css +27 -1
  228. package/apps/storefront/src/themes/tenants/index.ts +19 -7
  229. package/apps/storefront/tsconfig.json +1 -1
  230. package/package.json +1 -1
  231. package/packages/public-runtime/package.json +2 -1
  232. package/packages/public-runtime/schemas/managed-analytics/v1/adapter-definition.schema.json +427 -0
  233. package/packages/public-runtime/schemas/managed-analytics/v1/create-integration-install-request.schema.json +161 -0
  234. package/packages/public-runtime/schemas/managed-analytics/v1/create-migration-draft-request.schema.json +157 -0
  235. package/packages/public-runtime/schemas/managed-analytics/v1/delete-integration-install-request.schema.json +84 -0
  236. package/packages/public-runtime/schemas/managed-analytics/v1/delete-migration-draft-request.schema.json +84 -0
  237. package/packages/public-runtime/schemas/managed-analytics/v1/error-envelope.schema.json +180 -0
  238. package/packages/public-runtime/schemas/managed-analytics/v1/get-adapter-definition-request.schema.json +52 -0
  239. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-install-request.schema.json +52 -0
  240. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-revision-request.schema.json +79 -0
  241. package/packages/public-runtime/schemas/managed-analytics/v1/get-migration-draft-request.schema.json +52 -0
  242. package/packages/public-runtime/schemas/managed-analytics/v1/integration-install.schema.json +167 -0
  243. package/packages/public-runtime/schemas/managed-analytics/v1/integration-revision.schema.json +208 -0
  244. package/packages/public-runtime/schemas/managed-analytics/v1/list-adapter-definitions-request.schema.json +53 -0
  245. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-installs-request.schema.json +53 -0
  246. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-revisions-request.schema.json +82 -0
  247. package/packages/public-runtime/schemas/managed-analytics/v1/migration-draft.schema.json +218 -0
  248. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-request.schema.json +52 -0
  249. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-success-envelope.schema.json +49 -0
  250. package/packages/public-runtime/schemas/managed-analytics/v1/read-request.schema.json +20 -0
  251. package/packages/public-runtime/schemas/managed-analytics/v1/read-success-envelope.schema.json +45 -0
  252. package/packages/public-runtime/schemas/managed-analytics/v1/revise-integration-install-request.schema.json +156 -0
  253. package/packages/public-runtime/schemas/managed-analytics/v1/set-integration-install-status-request.schema.json +92 -0
  254. package/packages/public-runtime/schemas/managed-analytics/v1/update-migration-draft-request.schema.json +184 -0
  255. package/packages/public-runtime/scripts/generate-managed-analytics-api-v1-schemas.mjs +13 -0
  256. package/packages/public-runtime/src/activity/catalog.ts +41 -37
  257. package/packages/public-runtime/src/activity/event.ts +6 -6
  258. package/packages/public-runtime/src/activity/index.ts +2 -2
  259. package/packages/public-runtime/src/activity/redaction.ts +4 -4
  260. package/packages/public-runtime/src/candidate-index.ts +42 -8
  261. package/packages/public-runtime/src/checkout-orders.ts +2 -2
  262. package/packages/public-runtime/src/checkout-style-publish.ts +2 -2
  263. package/packages/public-runtime/src/checkout-style.ts +7 -7
  264. package/packages/public-runtime/src/checkout.ts +3 -3
  265. package/packages/public-runtime/src/chrome.ts +777 -0
  266. package/packages/public-runtime/src/compliance-obligations.ts +310 -0
  267. package/packages/public-runtime/src/csp.ts +99 -0
  268. package/packages/public-runtime/src/customization-runtime.ts +32 -1
  269. package/packages/public-runtime/src/destination-webhook/contract.ts +353 -0
  270. package/packages/public-runtime/src/embed-catalog.d.mts +9 -0
  271. package/packages/public-runtime/src/embed-catalog.mjs +40 -0
  272. package/packages/public-runtime/src/evidence.ts +288 -0
  273. package/packages/public-runtime/src/gtm-migration/bounds.ts +138 -0
  274. package/packages/public-runtime/src/gtm-migration/disposition-rules.ts +361 -0
  275. package/packages/public-runtime/src/gtm-migration/dispositions.ts +181 -0
  276. package/packages/public-runtime/src/gtm-migration/draft-generator.ts +400 -0
  277. package/packages/public-runtime/src/gtm-migration/graph.ts +468 -0
  278. package/packages/public-runtime/src/gtm-migration/index.ts +95 -0
  279. package/packages/public-runtime/src/gtm-migration/parse.ts +410 -0
  280. package/packages/public-runtime/src/gtm-migration/references.ts +266 -0
  281. package/packages/public-runtime/src/gtm-migration/types.ts +86 -0
  282. package/packages/public-runtime/src/index.ts +16 -1
  283. package/packages/public-runtime/src/integration/assurance-decision.ts +259 -0
  284. package/packages/public-runtime/src/integration/assurance.ts +228 -0
  285. package/packages/public-runtime/src/integration/candidate-evidence.ts +377 -0
  286. package/packages/public-runtime/src/integration/commerce-broker.ts +497 -0
  287. package/packages/public-runtime/src/integration/consent-broker.ts +337 -0
  288. package/packages/public-runtime/src/integration/consent-cmp-demand.ts +115 -0
  289. package/packages/public-runtime/src/integration/consent-config.ts +260 -0
  290. package/packages/public-runtime/src/integration/consent-preview.ts +125 -0
  291. package/packages/public-runtime/src/integration/correlation-token.ts +444 -0
  292. package/packages/public-runtime/src/integration/csp-compiler.ts +267 -0
  293. package/packages/public-runtime/src/integration/csp.ts +105 -0
  294. package/packages/public-runtime/src/integration/digest.ts +43 -0
  295. package/packages/public-runtime/src/integration/environment.ts +228 -0
  296. package/packages/public-runtime/src/integration/events-catalog.ts +186 -0
  297. package/packages/public-runtime/src/integration/events.ts +701 -0
  298. package/packages/public-runtime/src/integration/g2-action-boundary.ts +106 -0
  299. package/packages/public-runtime/src/integration/index.ts +90 -0
  300. package/packages/public-runtime/src/integration/interim-bridge.ts +138 -0
  301. package/packages/public-runtime/src/integration/lifecycle-boot.ts +317 -0
  302. package/packages/public-runtime/src/integration/lifecycle-runtime.ts +393 -0
  303. package/packages/public-runtime/src/integration/lifecycle.ts +94 -0
  304. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.d.mts +2 -0
  305. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.mjs +10 -0
  306. package/packages/public-runtime/src/integration/managed-analytics-api-v1.schemas.ts +382 -0
  307. package/packages/public-runtime/src/integration/managed-analytics-api-v1.ts +684 -0
  308. package/packages/public-runtime/src/integration/managed-analytics-bridge.ts +383 -0
  309. package/packages/public-runtime/src/integration/managed-analytics-value-safety.ts +14 -0
  310. package/packages/public-runtime/src/integration/managed-analytics.ts +277 -0
  311. package/packages/public-runtime/src/integration/manifest.ts +470 -0
  312. package/packages/public-runtime/src/integration/native-amplitude.ts +362 -0
  313. package/packages/public-runtime/src/integration/native-ga4.ts +352 -0
  314. package/packages/public-runtime/src/integration/observability.ts +451 -0
  315. package/packages/public-runtime/src/integration/order-conversion.ts +0 -0
  316. package/packages/public-runtime/src/integration/phases.ts +182 -0
  317. package/packages/public-runtime/src/integration/plan.ts +112 -0
  318. package/packages/public-runtime/src/integration/platform-adapter-runtime.ts +146 -0
  319. package/packages/public-runtime/src/integration/platform-adapters.ts +671 -0
  320. package/packages/public-runtime/src/integration/promotion-gate.ts +451 -0
  321. package/packages/public-runtime/src/integration/provider-checkout-extension.ts +425 -0
  322. package/packages/public-runtime/src/integration/receipt-measurement.ts +370 -0
  323. package/packages/public-runtime/src/integration/regulated-parent-cert.ts +311 -0
  324. package/packages/public-runtime/src/integration/render-phases.ts +267 -0
  325. package/packages/public-runtime/src/integration/resolve.ts +465 -0
  326. package/packages/public-runtime/src/integration/result.ts +239 -0
  327. package/packages/public-runtime/src/integration/secrets.ts +92 -0
  328. package/packages/public-runtime/src/integration/tamper-evidence.ts +205 -0
  329. package/packages/public-runtime/src/integration/tamper-recovery.ts +127 -0
  330. package/packages/public-runtime/src/integration/version.ts +92 -0
  331. package/packages/public-runtime/src/integration-capabilities.ts +520 -0
  332. package/packages/public-runtime/src/membership.ts +2 -2
  333. package/packages/public-runtime/src/raw-html-policy.ts +2 -4
  334. package/packages/public-runtime/src/regulated-commerce/broker/consent-dedupe.ts +144 -0
  335. package/packages/public-runtime/src/regulated-commerce/correlation/contract.ts +177 -0
  336. package/packages/public-runtime/src/regulated-commerce/diagnostics/local-dispatch.ts +24 -0
  337. package/packages/public-runtime/src/regulated-commerce/diagnostics/read-model.ts +69 -0
  338. package/packages/public-runtime/src/regulated-commerce/dispatch/core.ts +134 -0
  339. package/packages/public-runtime/src/regulated-commerce/events/contract.ts +113 -0
  340. package/packages/public-runtime/src/regulated-commerce/ledger/core.ts +81 -0
  341. package/packages/public-runtime/src/regulated-commerce/mappings/ga4-ads.ts +87 -0
  342. package/packages/public-runtime/src/regulated-commerce/provider-order/bridge.ts +52 -0
  343. package/packages/public-runtime/src/regulated-commerce/purchase-truth/contract.ts +252 -0
  344. package/packages/public-runtime/src/regulated-commerce/sources/accepted-browser-operation.ts +67 -0
  345. package/packages/public-runtime/src/regulated-commerce/testing/fake-destination.ts +93 -0
  346. package/packages/public-runtime/src/static-bundle.ts +5 -5
  347. package/packages/public-runtime/src/tenant-assets.ts +143 -4
  348. package/packages/public-runtime/src/tenant.ts +136 -9
  349. package/packages/public-runtime/tests/fixtures/integration/browser-environment.example.json +8 -0
  350. package/packages/public-runtime/tests/fixtures/integration/commerce-event.example.json +44 -0
  351. package/packages/public-runtime/tests/fixtures/integration/commerce-order-event.example.json +44 -0
  352. package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json +50 -0
  353. package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json +120 -0
  354. package/packages/public-runtime/tests/fixtures/integration/managed-analytics-v1/fake-adapter-catalog.json +35 -0
  355. package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json +11 -0
  356. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/README.md +22 -0
  357. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/entry.js +30 -0
  358. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/manifest.json +75 -0
  359. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/public-config.json +3 -0
  360. package/packages/public-runtime/tests/fixtures/regulated-commerce/fake-destinations.ts +38 -0
  361. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.provenance.json +29 -0
  362. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json +3397 -0
  363. package/scripts/build/copy-tenant-assets.mjs +12 -5
  364. package/scripts/dev/ai-edit.mjs +2 -1
  365. package/scripts/dev/file-browser.mjs +2 -2
  366. package/scripts/dev/file-writer.mjs +2 -2
  367. package/scripts/dev/integration-guardrails.mjs +498 -0
  368. package/scripts/dev/safe-path.mjs +2 -2
  369. package/scripts/dev/tenant-source-root.mjs +3 -2
  370. package/scripts/tot-dev.mjs +5 -4
@@ -90,9 +90,9 @@ export default defineConfig({
90
90
  imageService: "compile",
91
91
  }),
92
92
  integrations: [
93
- // Refuse to build unless every Gitea-classified tenant is materialized from
94
- // Gitea at a pinned ref intrinsic to `astro build`, not just deploy.sh, so
95
- // no build path can silently bake empty/stale real-tenant content.
93
+ // A framework Worker build requires no real-tenant checkout: tenant content
94
+ // resolves from KV/R2 at request time. The same integration becomes strict
95
+ // only when TOT_BUILD_TENANTS names a per-tenant static publish input.
96
96
  materializeGuard(),
97
97
  preact({ compat: true }),
98
98
  // Astro's file-based router ignores ANY path segment starting with "_" (see
@@ -4,13 +4,15 @@ import { readdirSync, existsSync } from "node:fs";
4
4
  import { basename, dirname, join } from "node:path";
5
5
  import { markSave, reportServerUp } from "./dev-loop-state.mjs";
6
6
  import { isTransientWatchFile } from "../../../scripts/dev/transient-files.mjs";
7
+ import { E2E_TENANT_DIR, tenantDirSegments } from "../../../scripts/lib/tenant-dirs.mjs";
7
8
  import { readFile } from "node:fs/promises";
8
9
 
9
10
  // Repo-root tenants/ dir (colocated tenant layout) + the generated static dest
10
11
  // the predev copy step mirrors public/ into. This module lives at
11
12
  // apps/storefront/dev-plugins/, so tenants/ is three levels up. Forward-slash
12
13
  // normalized to match Vite's ctx.file (Vite always reports posix-style paths).
13
- const TENANTS_DIR = fileURLToPath(new URL("../../../tenants", import.meta.url)).replace(/\\/g, "/");
14
+ const REPO_ROOT = fileURLToPath(new URL("../../..", import.meta.url));
15
+ const TENANTS_DIR = join(REPO_ROOT, "tenants").replace(/\\/g, "/");
14
16
  const PUBLIC_TENANTS_DEST = fileURLToPath(new URL("../public/tenants", import.meta.url));
15
17
 
16
18
  /**
@@ -53,7 +55,10 @@ async function loadTsModule(server, url) {
53
55
  export function classifyTenantFile(file) {
54
56
  const f = String(file).replace(/\\/g, "/");
55
57
  if (!f.startsWith(TENANTS_DIR + "/")) return null;
56
- const rel = f.slice(TENANTS_DIR.length + 1); // "<id>/<...>"
58
+ // "<id>/<...>" for a real tenant, "e2e/<id>/<...>" for a platform test tenant —
59
+ // consume the nesting segment so `id` is always the tenant's own id.
60
+ let rel = f.slice(TENANTS_DIR.length + 1);
61
+ if (rel.startsWith(E2E_TENANT_DIR + "/")) rel = rel.slice(E2E_TENANT_DIR.length + 1);
57
62
  const slash = rel.indexOf("/");
58
63
  if (slash < 0) return null;
59
64
  const rest = rel.slice(slash + 1);
@@ -97,7 +102,7 @@ export function isVersionedTenant(id) {
97
102
  .map((s) => s.trim())
98
103
  .filter(Boolean);
99
104
  if (envList.includes(id)) return true;
100
- return existsSync(join(TENANTS_DIR, id, ".tot", "assets-versioned"));
105
+ return existsSync(join(REPO_ROOT, ...tenantDirSegments(id), ".tot", "assets-versioned"));
101
106
  }
102
107
 
103
108
  /**
@@ -7,6 +7,9 @@ import type {
7
7
  TenantFeatures,
8
8
  ResolvedManagedCheckout,
9
9
  CapabilityConfig,
10
+ BrowserEnvironment,
11
+ CompiledIntegrationCsp,
12
+ EffectivePlan,
10
13
  } from "@tot/public-runtime";
11
14
  import type { ToTClient } from "@/lib/tot/ToTClient";
12
15
  import type { ContentProvider } from "@/lib/storyblok/provider";
@@ -29,6 +32,12 @@ interface KVNamespaceLike {
29
32
  interface R2BucketLike {
30
33
  get(key: string): Promise<unknown>;
31
34
  put(key: string, value: unknown): Promise<unknown>;
35
+ list(opts?: { prefix?: string; cursor?: string; limit?: number }): Promise<{
36
+ objects: { key: string }[];
37
+ truncated: boolean;
38
+ cursor?: string;
39
+ }>;
40
+ delete(keys: string | string[]): Promise<void>;
32
41
  }
33
42
 
34
43
  interface CloudflareEnv {
@@ -49,7 +58,7 @@ interface CloudflareEnv {
49
58
  TOT_SECRET_KEY?: string;
50
59
  TOT_ACCESS_TOKEN?: string;
51
60
  PUBLIC_CF_ANALYTICS_TOKEN?: string;
52
- /** HMAC secret for signing/verifying customization preview tokens (D4). */
61
+ /** HMAC secret for signing/verifying customization preview tokens. */
53
62
  CUSTOMIZATION_PREVIEW_SECRET?: string;
54
63
  /**
55
64
  * Managed checkout (Track A). `FOXY_STORE_SUBDOMAIN` overrides the tenant's default
@@ -64,7 +73,7 @@ interface CloudflareEnv {
64
73
  FOXY_STORE_DOMAIN?: string;
65
74
  FOXY_CART_SECRET?: string;
66
75
  /**
67
- * Order READ API bearer (U2) — the tenant's ToT `partnerApi.apiKey`, sent as
76
+ * Order READ API bearer — the tenant's ToT `partnerApi.apiKey`, sent as
68
77
  * `Authorization: Bearer` to the checkout order API. Server-side only (never
69
78
  * shipped to the browser). Absent -> the Orders route reports `not_provisioned`.
70
79
  */
@@ -120,17 +129,34 @@ declare global {
120
129
  */
121
130
  basePath: string;
122
131
  /**
123
- * Which customization environment to serve (D4). "live" on production
132
+ * Which customization environment to serve. "live" on production
124
133
  * hosts; "test" only behind a valid, tenant-bound preview token on a
125
134
  * preview host. Downstream theme/content selection reads this.
126
135
  */
127
136
  customizationEnv: CustomizationEnv;
128
137
  /**
129
- * Per-request CSP nonce (D2). Placed on the platform's own inline
138
+ * Per-request CSP nonce. Placed on the platform's own inline
130
139
  * <style>/<script is:inline> tags so a strict CSP can allow them without
131
140
  * `unsafe-inline`.
132
141
  */
133
142
  cspNonce: string;
143
+ /**
144
+ * The renderer-owned four-stage browser environment
145
+ * (`local|candidate|staged|live`) for this request, computed once by the
146
+ * middleware from authoritative server state. Both document mounts
147
+ * (Layout.astro and `rawHtmlResponse`) serialize THIS object, before any
148
+ * tenant/app code, so it is identical in both. Carries only public values —
149
+ * never a token, binding, or signed URL.
150
+ */
151
+ browserEnvironment: BrowserEnvironment;
152
+ /**
153
+ * The resolved effective plan (ext-kernel-03) for this request. The
154
+ * fixed-phase render engine (ext-kernel-04) consumes THIS in both document
155
+ * mounts (Layout.astro + rawHtmlResponse), so their renderer-owned phase
156
+ * markup is identical. Environment-only until declaration materialization is
157
+ * wired; carries no secret and no nonce.
158
+ */
159
+ integrationPlan: EffectivePlan;
134
160
  /**
135
161
  * Resolved cart/checkout facts for this request (loader src, cart URL,
136
162
  * mode). Present only for commerce tenants with a checkout store;
@@ -161,7 +187,7 @@ declare global {
161
187
  runtime?: { env: CloudflareEnv };
162
188
  /**
163
189
  * Every private-app widget placement actually rendered for this request
164
- * (PrivateApps epic, D5). The middleware seeds this to `[]` before
190
+ * (PrivateApps epic). The middleware seeds this to `[]` before
165
191
  * `next()`; each page/layout that renders a widget slot (`renderSlot.ts`)
166
192
  * pushes its resolved placements onto it as the page renders, so the
167
193
  * middleware can read the full per-request set back out AFTER `next()`
@@ -169,6 +195,29 @@ declare global {
169
195
  * the origins that ended up on the page — never more.
170
196
  */
171
197
  activeWidgetPlacements?: { endpoint: string }[];
198
+ /**
199
+ * Third-party embed opt-in (EMBED_PROVIDERS catalog slugs) for THIS
200
+ * request, when it must come from a tenant the URL router can't resolve —
201
+ * specifically the candidate renderer (`/preview/render/<tenant>/…`, where
202
+ * `<tenant>` isn't the first path segment). `candidateRender` sets it to the
203
+ * resolved candidate tenant's opt-in; the middleware's embed scan prefers it
204
+ * over the router-resolved tenant's embeds when present. Unset on normal
205
+ * renders (the router-resolved tenant's embeds are authoritative there).
206
+ */
207
+ embedOptIn?: string[];
208
+ /**
209
+ * The version-scoped integration CSP contribution for THIS request, resolved
210
+ * from the tenant/environment/version effective plan (curated adapter
211
+ * profiles expanded + advanced exact origins merged, deterministic and bound
212
+ * to the plan's `planRevision`). It is plan-scoped server state — resolved
213
+ * before the edge-cache read so its `planRevision` folds into `pageCacheKey`
214
+ * (making a rollback/uninstall a clean warm miss, not a TTL wait) and its
215
+ * `additions` fold into the strict CSP the middleware builds after `next()`,
216
+ * only ever APPENDING reviewed origins to the six contributable directives.
217
+ * Absent when no integration declares CSP — the header and cache key are then
218
+ * byte-identical to a non-integration tenant's (zero cost when disabled).
219
+ */
220
+ integrationCsp?: CompiledIntegrationCsp;
172
221
  }
173
222
  }
174
223
  }
@@ -4,23 +4,20 @@ import {
4
4
  } from "../../../scripts/tenant/materialize-tenant-content.mjs";
5
5
 
6
6
  /**
7
- * Refuse `astro build` when any Gitea-classified tenant's content isn't
8
- * materialized from Gitea at a pinned ref. Runs in `astro:build:start`, so the
9
- * guard is INTRINSIC to the build it fires for a bare `astro build`, `pnpm
10
- * build`, or a deploy.sh build alike, never letting an unmaterialized real
11
- * tenant bake empty content into the Worker.
7
+ * Protect the two intentionally different build modes:
8
+ *
9
+ * - Framework Worker (no TOT_BUILD_TENANTS): tenant content is runtime data,
10
+ * so absent Gitea checkouts are expected and must never block deployment.
11
+ * - Per-tenant static publish (TOT_BUILD_TENANTS set): the named checkout is
12
+ * build input and therefore must be materialized at a pinned ref.
12
13
  *
13
14
  * TOT_TENANT_REF also assert every stamp is EXACTLY this commit (off-ref → refuse)
14
15
  * TOT_ALLOW_UNPINNED=1 tolerate a default-branch (unpinned) materialize
15
- * TOT_FRAMEWORK_ONLY_BUILD=1 tolerate ABSENT tenant content (a credential-less
16
- * compile check bakes nothing, so there is nothing stale to guard). Populated
17
- * content without a pinned Gitea stamp still refuses — this never weakens the
18
- * deploy path, which materializes first and never sets this.
16
+ * TOT_FRAMEWORK_ONLY_BUILD=1 retained as a backwards-compatible explicit name
17
+ * for framework mode; it is now the default whenever TOT_BUILD_TENANTS is unset.
19
18
  * TOT_BUILD_TENANTS comma-separated tenant ids to scope the guard to. A per-tenant
20
19
  * STATIC publish (materialize-tenant.mjs) sets this to the single tenant it renders,
21
- * so a SIBLING Gitea tenant that isn't part of THIS publish can't block it. Unset ⇒
22
- * guard every Gitea tenant — the Worker-deploy contract, where all tenants are
23
- * served from one Worker at once and any unmaterialized tenant IS a real hazard.
20
+ * so a sibling tenant can never block it. Unset ⇒ framework-only Worker build.
24
21
  */
25
22
  export function materializeGuard() {
26
23
  return {
@@ -35,12 +32,13 @@ export function materializeGuard() {
35
32
  .map((t) => t.trim())
36
33
  .filter(Boolean);
37
34
  const onlyTenants = scoped.length > 0 ? scoped : null;
38
- if (process.env.TOT_FRAMEWORK_ONLY_BUILD === "1") {
35
+ const frameworkOnly = onlyTenants === null || process.env.TOT_FRAMEWORK_ONLY_BUILD === "1";
36
+ if (frameworkOnly) {
39
37
  const { problems } = checkPinned(undefined, { expectRef, allowUnpinned, onlyTenants });
40
38
  const absent = problems.filter((p) => p.reason === "absent");
41
39
  const real = problems.filter((p) => p.reason !== "absent");
42
40
  if (absent.length) {
43
- const msg = `[materialize-guard] framework-only build: ${absent.length} tenant(s) absent (nothing baked): ${absent.map((p) => p.tenant).join(", ")}`;
41
+ const msg = `[materialize-guard] framework-only build: ${absent.length} tenant checkout(s) absent (served from runtime storage): ${absent.map((p) => p.tenant).join(", ")}`;
44
42
  if (logger && typeof logger.info === "function") logger.info(msg);
45
43
  else console.log(msg);
46
44
  }
@@ -0,0 +1,36 @@
1
+ CREATE TABLE `candidate_attempts` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `candidate_id` text NOT NULL,
4
+ `tenant_id` text NOT NULL,
5
+ `attempt_number` integer NOT NULL,
6
+ `kind` text NOT NULL,
7
+ `status` text DEFAULT 'pending' NOT NULL,
8
+ `head_sha` text,
9
+ `detail` text,
10
+ `evidence` text,
11
+ `started_at` text NOT NULL,
12
+ `finished_at` text
13
+ );
14
+ --> statement-breakpoint
15
+ CREATE UNIQUE INDEX `uq_candidate_attempts_candidate_number` ON `candidate_attempts` (`candidate_id`,`attempt_number`);--> statement-breakpoint
16
+ CREATE INDEX `idx_candidate_attempts_candidate` ON `candidate_attempts` (`candidate_id`);--> statement-breakpoint
17
+ CREATE INDEX `idx_candidate_attempts_tenant` ON `candidate_attempts` (`tenant_id`);--> statement-breakpoint
18
+ CREATE TABLE `candidates` (
19
+ `id` text PRIMARY KEY NOT NULL,
20
+ `tenant_id` text NOT NULL,
21
+ `repository` text NOT NULL,
22
+ `pr_number` integer NOT NULL,
23
+ `change_id` text NOT NULL,
24
+ `branch` text,
25
+ `title` text,
26
+ `author` text,
27
+ `status` text DEFAULT 'open' NOT NULL,
28
+ `head_sha` text,
29
+ `base_sha` text,
30
+ `created_at` text NOT NULL,
31
+ `updated_at` text NOT NULL
32
+ );
33
+ --> statement-breakpoint
34
+ CREATE UNIQUE INDEX `uq_candidates_tenant_repo_pr` ON `candidates` (`tenant_id`,`repository`,`pr_number`);--> statement-breakpoint
35
+ CREATE UNIQUE INDEX `uq_candidates_tenant_change` ON `candidates` (`tenant_id`,`change_id`);--> statement-breakpoint
36
+ CREATE INDEX `idx_candidates_tenant_status` ON `candidates` (`tenant_id`,`status`);
@@ -0,0 +1,23 @@
1
+ CREATE TABLE `consent_cmp_demand` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `tenant_id` text NOT NULL,
4
+ `adapter_id` text NOT NULL,
5
+ `source` text,
6
+ `at` text NOT NULL
7
+ );
8
+ --> statement-breakpoint
9
+ CREATE UNIQUE INDEX `uq_consent_cmp_demand_tenant_adapter` ON `consent_cmp_demand` (`tenant_id`,`adapter_id`);--> statement-breakpoint
10
+ CREATE INDEX `idx_consent_cmp_demand_adapter` ON `consent_cmp_demand` (`adapter_id`);--> statement-breakpoint
11
+ CREATE TABLE `consent_config_revisions` (
12
+ `id` text PRIMARY KEY NOT NULL,
13
+ `tenant_id` text NOT NULL,
14
+ `revision` integer NOT NULL,
15
+ `config` text NOT NULL,
16
+ `actor` text NOT NULL,
17
+ `note` text,
18
+ `reverted_from` integer,
19
+ `created_at` text NOT NULL
20
+ );
21
+ --> statement-breakpoint
22
+ CREATE UNIQUE INDEX `uq_consent_config_tenant_revision` ON `consent_config_revisions` (`tenant_id`,`revision`);--> statement-breakpoint
23
+ CREATE INDEX `idx_consent_config_tenant` ON `consent_config_revisions` (`tenant_id`);
@@ -0,0 +1,16 @@
1
+ CREATE TABLE `correlation_replay` (
2
+ `jti` text PRIMARY KEY NOT NULL,
3
+ `expires_at` integer NOT NULL,
4
+ `consumed_at` text NOT NULL
5
+ );
6
+ --> statement-breakpoint
7
+ CREATE TABLE `order_attribution` (
8
+ `tenant_id` text NOT NULL,
9
+ `external_order_id` text NOT NULL,
10
+ `attributed` integer DEFAULT 0 NOT NULL,
11
+ `correlation_id` text,
12
+ `correlation_expires_at` text,
13
+ `reason` text,
14
+ `recorded_at` text NOT NULL,
15
+ PRIMARY KEY(`tenant_id`, `external_order_id`)
16
+ );
@@ -0,0 +1,15 @@
1
+ CREATE TABLE `app_version_snapshots` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `install_id` text NOT NULL,
4
+ `tenant_id` text NOT NULL,
5
+ `seq` integer NOT NULL,
6
+ `app_version` text NOT NULL,
7
+ `facets` text NOT NULL,
8
+ `actor` text NOT NULL,
9
+ `note` text,
10
+ `restored_from_seq` integer,
11
+ `created_at` text NOT NULL
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE UNIQUE INDEX `uq_app_version_snapshots_install_seq` ON `app_version_snapshots` (`install_id`,`seq`);--> statement-breakpoint
15
+ CREATE INDEX `idx_app_version_snapshots_install` ON `app_version_snapshots` (`install_id`);
@@ -0,0 +1,11 @@
1
+ CREATE TABLE `candidate_submit_leases` (
2
+ `tenant_id` text NOT NULL,
3
+ `change_id` text NOT NULL,
4
+ `authorization_id` text NOT NULL,
5
+ `status` text DEFAULT 'active' NOT NULL,
6
+ `acquired_at` text NOT NULL,
7
+ `expires_at` text NOT NULL,
8
+ PRIMARY KEY(`tenant_id`, `change_id`)
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE INDEX `idx_candidate_submit_leases_expires` ON `candidate_submit_leases` (`expires_at`);
@@ -0,0 +1,15 @@
1
+ CREATE TABLE `integration_migration_drafts` (
2
+ `draft_id` text PRIMARY KEY NOT NULL,
3
+ `tenant_id` text NOT NULL,
4
+ `revision` integer NOT NULL,
5
+ `state` text DEFAULT 'open' NOT NULL,
6
+ `record` text NOT NULL,
7
+ `created_at` text NOT NULL,
8
+ `updated_at` text NOT NULL
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE INDEX `idx_integration_migration_drafts_tenant` ON `integration_migration_drafts` (`tenant_id`,`created_at`);--> statement-breakpoint
12
+ ALTER TABLE `app_installs` ADD `managed_kind` text;--> statement-breakpoint
13
+ ALTER TABLE `app_installs` ADD `managed_revision` integer DEFAULT 0 NOT NULL;--> statement-breakpoint
14
+ ALTER TABLE `app_installs` ADD `managed_active_revision_id` text;--> statement-breakpoint
15
+ ALTER TABLE `app_installs` ADD `managed_candidate` text;
@@ -0,0 +1,35 @@
1
+ -- WS4 durable, minimized server ledger/outbox. No raw provider payload,
2
+ -- customer identity, browser correlation, credential, or destination data.
3
+ CREATE TABLE `regulated_commerce_provider_events` (
4
+ `provider` text NOT NULL,
5
+ `provider_event_id` text NOT NULL,
6
+ `fingerprint` text NOT NULL,
7
+ `receipt_id` text NOT NULL,
8
+ `received_at` text NOT NULL,
9
+ PRIMARY KEY(`provider`, `provider_event_id`)
10
+ );
11
+ --> statement-breakpoint
12
+ CREATE TABLE `regulated_commerce_provider_orders` (
13
+ `provider` text NOT NULL,
14
+ `provider_order_id` text NOT NULL,
15
+ `tenant_id` text NOT NULL,
16
+ `state` text NOT NULL,
17
+ `provider_event_id` text NOT NULL,
18
+ `updated_at` text NOT NULL,
19
+ PRIMARY KEY(`provider`, `provider_order_id`, `tenant_id`)
20
+ );
21
+ --> statement-breakpoint
22
+ CREATE TABLE `regulated_commerce_intent_outbox` (
23
+ `intent_id` text PRIMARY KEY NOT NULL,
24
+ `tenant_id` text NOT NULL,
25
+ `provider` text NOT NULL,
26
+ `provider_event_id` text NOT NULL,
27
+ `payload` text NOT NULL,
28
+ `created_at` text NOT NULL
29
+ );
30
+ --> statement-breakpoint
31
+ CREATE UNIQUE INDEX `uq_regulated_commerce_outbox_provider_event`
32
+ ON `regulated_commerce_intent_outbox` (`provider`, `provider_event_id`);
33
+ --> statement-breakpoint
34
+ CREATE INDEX `idx_regulated_commerce_outbox_tenant_created`
35
+ ON `regulated_commerce_intent_outbox` (`tenant_id`, `created_at`);