@tokenoftrust/storefront-runner 1.4.1 → 2.0.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 (474) hide show
  1. package/apps/storefront/astro.config.mjs +17 -1
  2. package/apps/storefront/env.d.ts +54 -5
  3. package/apps/storefront/integrations/materialize-guard.mjs +54 -0
  4. package/apps/storefront/migrations-apps/0002_good_switch.sql +26 -0
  5. package/apps/storefront/migrations-apps/0003_mute_marauders.sql +12 -0
  6. package/apps/storefront/migrations-apps/0004_deep_morph.sql +36 -0
  7. package/apps/storefront/migrations-apps/0005_common_mystique.sql +23 -0
  8. package/apps/storefront/migrations-apps/0006_broad_microchip.sql +16 -0
  9. package/apps/storefront/migrations-apps/0007_brave_outlaw_kid.sql +15 -0
  10. package/apps/storefront/migrations-apps/0008_blue_dazzler.sql +11 -0
  11. package/apps/storefront/migrations-apps/0009_bored_shinobi_shaw.sql +15 -0
  12. package/apps/storefront/migrations-apps/0010_ws4_verified_provider_measurement.sql +35 -0
  13. package/apps/storefront/migrations-apps/meta/0002_snapshot.json +1160 -0
  14. package/apps/storefront/migrations-apps/meta/0003_snapshot.json +1235 -0
  15. package/apps/storefront/migrations-apps/meta/0004_snapshot.json +1474 -0
  16. package/apps/storefront/migrations-apps/meta/0005_snapshot.json +1617 -0
  17. package/apps/storefront/migrations-apps/meta/0006_snapshot.json +1716 -0
  18. package/apps/storefront/migrations-apps/meta/0007_snapshot.json +1812 -0
  19. package/apps/storefront/migrations-apps/meta/0008_snapshot.json +1881 -0
  20. package/apps/storefront/migrations-apps/meta/0009_snapshot.json +1979 -0
  21. package/apps/storefront/migrations-apps/meta/_journal.json +56 -0
  22. package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
  23. package/apps/storefront/public/js/dashboard-team.js +38 -2
  24. package/apps/storefront/public/platform/amplitude-http/v1/entry.mjs +19 -0
  25. package/apps/storefront/public/platform/google-measurement/v1/entry.mjs +19 -0
  26. package/apps/storefront/public/shared/commerce-chrome.css +20 -2
  27. package/apps/storefront/scripts/build-v84-clean-clone-standalone.mjs +68 -0
  28. package/apps/storefront/scripts/deny-v84-clean-clone-standalone-capabilities.mjs +111 -0
  29. package/apps/storefront/scripts/deny-v84-dogfood-capabilities.mjs +2 -0
  30. package/apps/storefront/scripts/deny-v84-lifecycle-capabilities.mjs +247 -0
  31. package/apps/storefront/scripts/dogfood-v84-nonportable-routes.ts +73 -0
  32. package/apps/storefront/scripts/fixed-v84-native-install-producer.ts +79 -0
  33. package/apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs +10982 -0
  34. package/apps/storefront/scripts/import-v84-through-ws2.ts +38 -0
  35. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling-dependency.ts +2 -0
  36. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling.ts +4 -0
  37. package/apps/storefront/scripts/install-v84-native-through-ws1.ts +185 -0
  38. package/apps/storefront/scripts/prove-clone-isolation.ts +506 -0
  39. package/apps/storefront/scripts/replay-v84-clean-clone-pass.ts +148 -0
  40. package/apps/storefront/scripts/replay-v84-clean-clone-standalone.ts +35 -0
  41. package/apps/storefront/scripts/replay-v84-clean-clone.ts +214 -0
  42. package/apps/storefront/scripts/run-fixed-v84-native-install-producer.mjs +18 -0
  43. package/apps/storefront/scripts/run-v84-clone-isolation-proof.mjs +18 -0
  44. package/apps/storefront/scripts/run-v84-clone-lifecycle-proof.mjs +18 -0
  45. package/apps/storefront/scripts/run-v84-import-through-ws2-proof.mjs +17 -0
  46. package/apps/storefront/scripts/run-v84-nonportable-route-dogfood.mjs +15 -0
  47. package/apps/storefront/scripts/sanitize-v84-proof-environment.mjs +21 -0
  48. package/apps/storefront/scripts/v84CleanCloneGraphPin.ts +42 -0
  49. package/apps/storefront/scripts/v84CleanCloneSourceGraph.ts +145 -0
  50. package/apps/storefront/scripts/validate-v84-clone-lifecycle.ts +18 -0
  51. package/apps/storefront/src/components/Img.astro +1 -1
  52. package/apps/storefront/src/components/Seo.astro +65 -1
  53. package/apps/storefront/src/components/admin/AdminBlogDetailRail.astro +878 -0
  54. package/apps/storefront/src/components/admin/AdminBlogTab.astro +1435 -0
  55. package/apps/storefront/src/components/admin/AdminCustomersTab.astro +3 -7
  56. package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
  57. package/apps/storefront/src/components/admin/AdminPublishTab.astro +1980 -2564
  58. package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
  59. package/apps/storefront/src/components/admin/AdminSubscriptionsTab.astro +1 -3
  60. package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
  61. package/apps/storefront/src/components/blog/BlogPaywall.astro +87 -0
  62. package/apps/storefront/src/components/blog/PostAccessBadge.astro +43 -0
  63. package/apps/storefront/src/components/blog/PostGrid.astro +57 -0
  64. package/apps/storefront/src/components/blog/ReactionBar.astro +214 -0
  65. package/apps/storefront/src/components/chrome/NavDropdown.astro +12 -0
  66. package/apps/storefront/src/components/chrome/SiteFooter.astro +7 -2
  67. package/apps/storefront/src/components/chrome/SiteHeader.astro +46 -10
  68. package/apps/storefront/src/components/compliance/AdultSignatureNotice.astro +1 -1
  69. package/apps/storefront/src/components/compliance/ComplianceNotice.astro +1 -2
  70. package/apps/storefront/src/components/compliance/ExciseTaxNotice.astro +1 -2
  71. package/apps/storefront/src/components/compliance/PactActNotice.astro +1 -1
  72. package/apps/storefront/src/components/compliance/Prop65Warning.astro +1 -2
  73. package/apps/storefront/src/components/compliance/PurchaseLimitNotice.astro +2 -3
  74. package/apps/storefront/src/components/compliance/ShippingRestrictionNotice.astro +2 -2
  75. package/apps/storefront/src/components/compliance/StateEligibilityNotice.astro +2 -3
  76. package/apps/storefront/src/components/content/TrustStrip.astro +4 -4
  77. package/apps/storefront/src/components/islands/MobileNav.tsx +26 -1
  78. package/apps/storefront/src/components/islands/VariantSelector.tsx +27 -2
  79. package/apps/storefront/src/components/islands/useCheckoutHandoffCorrelation.ts +75 -0
  80. package/apps/storefront/src/components/membership/IllustrativeLabel.astro +1 -2
  81. package/apps/storefront/src/components/membership/TierCards.astro +2 -2
  82. package/apps/storefront/src/components/membership/TierComparisonTable.astro +2 -2
  83. package/apps/storefront/src/components/subscription/SavingsExplainer.astro +2 -2
  84. package/apps/storefront/src/config/adminTenantLookup.ts +35 -0
  85. package/apps/storefront/src/config/devTenantSeed.ts +9 -9
  86. package/apps/storefront/src/config/resolver.ts +4 -4
  87. package/apps/storefront/src/layouts/Layout.astro +146 -21
  88. package/apps/storefront/src/lib/activity/alerts.ts +17 -19
  89. package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
  90. package/apps/storefront/src/lib/activity/changeActorAttribution.ts +89 -9
  91. package/apps/storefront/src/lib/activity/deployVersion.ts +20 -27
  92. package/apps/storefront/src/lib/activity/ingest.ts +8 -8
  93. package/apps/storefront/src/lib/activity/ingestAuth.ts +1 -1
  94. package/apps/storefront/src/lib/activity/killSwitch.ts +6 -6
  95. package/apps/storefront/src/lib/activity/query.ts +9 -9
  96. package/apps/storefront/src/lib/activity/recordActivity.ts +11 -15
  97. package/apps/storefront/src/lib/activity/store.ts +4 -6
  98. package/apps/storefront/src/lib/activity/uiActor.ts +12 -12
  99. package/apps/storefront/src/lib/activity/workerCommit.ts +6 -6
  100. package/apps/storefront/src/lib/admin/adminShell.ts +292 -0
  101. package/apps/storefront/src/lib/admin/ai/approvalMode.ts +2 -3
  102. package/apps/storefront/src/lib/admin/ai/audit.ts +3 -5
  103. package/apps/storefront/src/lib/admin/checkoutStyleInput.ts +7 -7
  104. package/apps/storefront/src/lib/admin/checkoutStyleTarget.ts +3 -3
  105. package/apps/storefront/src/lib/admin/envelope.ts +1 -2
  106. package/apps/storefront/src/lib/admin/orderClient.ts +3 -5
  107. package/apps/storefront/src/lib/admin/services/orders.ts +17 -19
  108. package/apps/storefront/src/lib/admin/viewmodels/aiWorkflows.ts +4 -6
  109. package/apps/storefront/src/lib/admin/viewmodels/settings.ts +1 -1
  110. package/apps/storefront/src/lib/apps/adminService.ts +14 -4
  111. package/apps/storefront/src/lib/apps/adminSession.ts +54 -45
  112. package/apps/storefront/src/lib/apps/apiAuth.ts +2 -2
  113. package/apps/storefront/src/lib/apps/apiRoute.ts +2 -2
  114. package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
  115. package/apps/storefront/src/lib/apps/catalogMapper.ts +1 -1
  116. package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
  117. package/apps/storefront/src/lib/apps/credentials.ts +2 -2
  118. package/apps/storefront/src/lib/apps/gatewayKeys.ts +4 -4
  119. package/apps/storefront/src/lib/apps/gtmMigrationInstall.ts +447 -0
  120. package/apps/storefront/src/lib/apps/gtmMigrationReport.ts +367 -0
  121. package/apps/storefront/src/lib/apps/gtmMigrationTab.ts +315 -0
  122. package/apps/storefront/src/lib/apps/healthAggregate.ts +5 -5
  123. package/apps/storefront/src/lib/apps/integrationLifecycle.ts +614 -0
  124. package/apps/storefront/src/lib/apps/integrationLifecycleController.ts +125 -0
  125. package/apps/storefront/src/lib/apps/integrationReadModel.ts +563 -0
  126. package/apps/storefront/src/lib/apps/integrationsTab.ts +547 -0
  127. package/apps/storefront/src/lib/apps/integrationsView.ts +106 -0
  128. package/apps/storefront/src/lib/apps/managedAnalyticsService.ts +599 -0
  129. package/apps/storefront/src/lib/apps/orders/attributionService.ts +2 -2
  130. package/apps/storefront/src/lib/apps/orders/customerHash.ts +1 -1
  131. package/apps/storefront/src/lib/apps/orders/foxyOrderClient.ts +12 -12
  132. package/apps/storefront/src/lib/apps/orders/idempotency.ts +7 -7
  133. package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
  134. package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +9 -1
  135. package/apps/storefront/src/lib/apps/orders/orderMapper.ts +2 -2
  136. package/apps/storefront/src/lib/apps/orders/ordersStore.ts +7 -7
  137. package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
  138. package/apps/storefront/src/lib/apps/registryService.ts +270 -16
  139. package/apps/storefront/src/lib/apps/scopes.ts +2 -2
  140. package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
  141. package/apps/storefront/src/lib/apps/tokenIssuer.ts +4 -4
  142. package/apps/storefront/src/lib/apps/tokenVerifier.ts +6 -6
  143. package/apps/storefront/src/lib/apps/v84CleanCloneReplayContext.ts +16 -0
  144. package/apps/storefront/src/lib/apps/v84CloneLifecycleCacheEvidence.ts +105 -0
  145. package/apps/storefront/src/lib/apps/v84CloneLifecycleEvidence.ts +177 -0
  146. package/apps/storefront/src/lib/apps/v84CloneLifecycleMaterialization.ts +251 -0
  147. package/apps/storefront/src/lib/apps/v84CloneLifecycleSemantics.ts +241 -0
  148. package/apps/storefront/src/lib/apps/v84CloneMigrationEvidence.ts +211 -0
  149. package/apps/storefront/src/lib/apps/v84CloneNativeInstallEvidence.ts +409 -0
  150. package/apps/storefront/src/lib/apps/v84NonportableCodeCoaching.ts +368 -0
  151. package/apps/storefront/src/lib/apps/v84NonportableRouteContract.ts +188 -0
  152. package/apps/storefront/src/lib/apps/v84NonportableRouteDogfood.ts +291 -0
  153. package/apps/storefront/src/lib/apps/widgets/eligibility.ts +2 -2
  154. package/apps/storefront/src/lib/apps/widgets/frameProps.ts +3 -3
  155. package/apps/storefront/src/lib/apps/widgets/launchToken.ts +4 -4
  156. package/apps/storefront/src/lib/apps/widgets/placements.ts +2 -2
  157. package/apps/storefront/src/lib/apps/widgets/renderSlot.ts +1 -1
  158. package/apps/storefront/src/lib/apps/ws1ManagedAnalyticsClient.ts +95 -0
  159. package/apps/storefront/src/lib/auth/adminApiGuard.ts +66 -0
  160. package/apps/storefront/src/lib/auth/adminEntry.ts +11 -11
  161. package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
  162. package/apps/storefront/src/lib/auth/identityToken.ts +6 -14
  163. package/apps/storefront/src/lib/auth/loginGate.ts +75 -13
  164. package/apps/storefront/src/lib/auth/mcpClientAssertion.ts +2 -4
  165. package/apps/storefront/src/lib/auth/operatorSession.ts +113 -0
  166. package/apps/storefront/src/lib/auth/session.ts +7 -8
  167. package/apps/storefront/src/lib/auth/totAccessClient.ts +8 -18
  168. package/apps/storefront/src/lib/basePath.ts +9 -2
  169. package/apps/storefront/src/lib/blog/access.ts +29 -0
  170. package/apps/storefront/src/lib/blog/collection.ts +400 -0
  171. package/apps/storefront/src/lib/blog/markdown.ts +174 -0
  172. package/apps/storefront/src/lib/blog/provider.ts +62 -3
  173. package/apps/storefront/src/lib/blog/reactions.ts +87 -0
  174. package/apps/storefront/src/lib/blog/rss.ts +92 -0
  175. package/apps/storefront/src/lib/blog/teaser.ts +83 -0
  176. package/apps/storefront/src/lib/blog/types.ts +34 -0
  177. package/apps/storefront/src/lib/blog/viewCounts.ts +243 -0
  178. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome-assignments.example.json +6 -0
  179. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome.example.json +79 -0
  180. package/apps/storefront/src/lib/chrome/model.ts +48 -253
  181. package/apps/storefront/src/lib/chrome/navCurrent.ts +29 -0
  182. package/apps/storefront/src/lib/chrome/parseConfig.ts +18 -32
  183. package/apps/storefront/src/lib/chrome/variant.ts +39 -0
  184. package/apps/storefront/src/lib/commerce/checkoutHandoffCorrelation.ts +105 -0
  185. package/apps/storefront/src/lib/compliance/tamper-sentinel-boot.ts +152 -0
  186. package/apps/storefront/src/lib/compliance/tamper-sentinel.ts +327 -0
  187. package/apps/storefront/src/lib/content/index.ts +5 -5
  188. package/apps/storefront/src/lib/content-edit/applyDiff.ts +1 -1
  189. package/apps/storefront/src/lib/content-edit/route.ts +1 -1
  190. package/apps/storefront/src/lib/d1/catalog.ts +14 -2
  191. package/apps/storefront/src/lib/d1/schema-apps.ts +372 -17
  192. package/apps/storefront/src/lib/dev/activityIngestToken.ts +2 -4
  193. package/apps/storefront/src/lib/dev/activityStore.ts +3 -5
  194. package/apps/storefront/src/lib/dev/apiBase.ts +1 -4
  195. package/apps/storefront/src/lib/dev/cockpit/ask.ts +49 -0
  196. package/apps/storefront/src/lib/dev/cockpit/clickToSource.ts +71 -0
  197. package/apps/storefront/src/lib/dev/cockpit/copyCommand.ts +227 -0
  198. package/apps/storefront/src/lib/dev/cockpit/files.ts +249 -0
  199. package/apps/storefront/src/lib/dev/cockpit/hostedActivity.ts +500 -0
  200. package/apps/storefront/src/lib/dev/cockpit/infoPopover.ts +12 -0
  201. package/apps/storefront/src/lib/dev/cockpit/mcpCopy.ts +34 -0
  202. package/apps/storefront/src/lib/dev/cockpit/monitor.ts +107 -0
  203. package/apps/storefront/src/lib/dev/cockpit/stepper.ts +116 -0
  204. package/apps/storefront/src/lib/dev/cockpit/themeToggle.ts +23 -0
  205. package/apps/storefront/src/lib/dev/cockpitStore.ts +1 -9
  206. package/apps/storefront/src/lib/dev/devDraft.ts +1 -1
  207. package/apps/storefront/src/lib/dev/previewStatus.ts +9 -21
  208. package/apps/storefront/src/lib/dev/rendezvousBroker.ts +9 -24
  209. package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
  210. package/apps/storefront/src/lib/edgeCache.ts +34 -5
  211. package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
  212. package/apps/storefront/src/lib/http/fetchTransport.ts +63 -0
  213. package/apps/storefront/src/lib/i18n.ts +25 -0
  214. package/apps/storefront/src/lib/integration/browserEnvironment.ts +137 -0
  215. package/apps/storefront/src/lib/integration/managedInstallDeclarations.ts +72 -0
  216. package/apps/storefront/src/lib/integration/nonceStamp.ts +49 -0
  217. package/apps/storefront/src/lib/integration/tenantDeclarations.ts +116 -0
  218. package/apps/storefront/src/lib/jsonld.ts +118 -0
  219. package/apps/storefront/src/lib/membership/eligibility.ts +1 -1
  220. package/apps/storefront/src/lib/membership/model.ts +1 -2
  221. package/apps/storefront/src/lib/monitoring/manifest.ts +11 -11
  222. package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +30 -0
  223. package/apps/storefront/src/lib/newsletter/consent.ts +23 -0
  224. package/apps/storefront/src/lib/newsletter/digest.ts +117 -0
  225. package/apps/storefront/src/lib/newsletter/resendClient.ts +79 -0
  226. package/apps/storefront/src/lib/newsletter/send.ts +265 -0
  227. package/apps/storefront/src/lib/newsletter/subscribers.ts +156 -0
  228. package/apps/storefront/src/lib/previewReload.ts +57 -1
  229. package/apps/storefront/src/lib/publish/adminPublishTab.ts +4625 -0
  230. package/apps/storefront/src/lib/publish/apex-readiness.ts +41 -18
  231. package/apps/storefront/src/lib/publish/buildStream.ts +269 -0
  232. package/apps/storefront/src/lib/publish/collapsePersistence.ts +72 -0
  233. package/apps/storefront/src/lib/publish/dispatchHealth.ts +5 -7
  234. package/apps/storefront/src/lib/publish/domainState.ts +22 -13
  235. package/apps/storefront/src/lib/publish/lifecycleState.ts +369 -0
  236. package/apps/storefront/src/lib/publish/liveReleaseSummary.ts +29 -0
  237. package/apps/storefront/src/lib/publish/mergeDoctorOnFailure.ts +78 -0
  238. package/apps/storefront/src/lib/publish/mergeHealthBanner.ts +62 -0
  239. package/apps/storefront/src/lib/publish/mergeRowFindings.ts +124 -0
  240. package/apps/storefront/src/lib/publish/mergeSupportEscalation.ts +75 -0
  241. package/apps/storefront/src/lib/publish/panelPolling.ts +78 -0
  242. package/apps/storefront/src/lib/publish/publish-guard.ts +88 -0
  243. package/apps/storefront/src/lib/publish/publishFormat.ts +165 -0
  244. package/apps/storefront/src/lib/publish/publishHero.ts +177 -0
  245. package/apps/storefront/src/lib/publish/reviewRelease/changeState.ts +66 -0
  246. package/apps/storefront/src/lib/publish/reviewRelease/copy.ts +141 -0
  247. package/apps/storefront/src/lib/publish/reviewRelease/index.ts +41 -0
  248. package/apps/storefront/src/lib/publish/reviewRelease/permissions.ts +47 -0
  249. package/apps/storefront/src/lib/publish/reviewRelease/releaseState.ts +42 -0
  250. package/apps/storefront/src/lib/publish/reviewRelease/types.ts +59 -0
  251. package/apps/storefront/src/lib/publish/reviewRelease/viewModel.ts +440 -0
  252. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/actions.ts +161 -0
  253. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/controller.ts +325 -0
  254. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/render.ts +241 -0
  255. package/apps/storefront/src/lib/publish/shipWorkspace.ts +121 -51
  256. package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
  257. package/apps/storefront/src/lib/publish/stageBundleUpload.ts +215 -0
  258. package/apps/storefront/src/lib/publish/streamLogConsole.ts +142 -0
  259. package/apps/storefront/src/lib/publish/versionNumber.ts +52 -0
  260. package/apps/storefront/src/lib/rate/kvWindow.ts +53 -0
  261. package/apps/storefront/src/lib/rawChrome.ts +125 -47
  262. package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
  263. package/apps/storefront/src/lib/search/index.ts +2 -2
  264. package/apps/storefront/src/lib/seo/alternates.ts +42 -0
  265. package/apps/storefront/src/lib/seo/meta.ts +65 -0
  266. package/apps/storefront/src/lib/social/golive.ts +212 -0
  267. package/apps/storefront/src/lib/social/notify.ts +32 -0
  268. package/apps/storefront/src/lib/social/tokenStore.ts +171 -0
  269. package/apps/storefront/src/lib/storyblok/content-model.ts +7 -33
  270. package/apps/storefront/src/lib/storyblok/provider.ts +168 -60
  271. package/apps/storefront/src/lib/subscription/model.ts +4 -4
  272. package/apps/storefront/src/lib/the-build/provider.ts +32 -0
  273. package/apps/storefront/src/lib/the-build/readingTime.ts +35 -0
  274. package/apps/storefront/src/lib/the-build/toc.ts +95 -0
  275. package/apps/storefront/src/lib/tot/ToTClient.ts +1 -1
  276. package/apps/storefront/src/lib/tot/d1Client.ts +2 -2
  277. package/apps/storefront/src/lib/tot/totClientInterface.ts +3 -4
  278. package/apps/storefront/src/lib/webhooks/deliveryStore.ts +16 -17
  279. package/apps/storefront/src/middleware/index.ts +385 -52
  280. package/apps/storefront/src/pages/[...slug].astro +9 -4
  281. package/apps/storefront/src/pages/admin/review-release.astro +265 -0
  282. package/apps/storefront/src/pages/admin/select.astro +96 -0
  283. package/apps/storefront/src/pages/admin.astro +25 -1313
  284. package/apps/storefront/src/pages/api/activity.ts +8 -8
  285. package/apps/storefront/src/pages/api/admin/activity-alerts.ts +5 -20
  286. package/apps/storefront/src/pages/api/admin/orders/[id].ts +7 -2
  287. package/apps/storefront/src/pages/api/admin/orders.ts +8 -2
  288. package/apps/storefront/src/pages/api/apps/admin/gtm-migration-install.ts +174 -0
  289. package/apps/storefront/src/pages/api/apps/admin/gtm-migration.ts +96 -0
  290. package/apps/storefront/src/pages/api/apps/admin/integration-lifecycle.ts +118 -0
  291. package/apps/storefront/src/pages/api/apps/admin/integrations.ts +89 -0
  292. package/apps/storefront/src/pages/api/apps/admin/platform-adapters.ts +85 -0
  293. package/apps/storefront/src/pages/api/apps/internal/order-forward.ts +74 -2
  294. package/apps/storefront/src/pages/api/blog/[collection]/[slug]/react.ts +104 -0
  295. package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +77 -0
  296. package/apps/storefront/src/pages/api/compliance/tamper.ts +88 -0
  297. package/apps/storefront/src/pages/api/integrations/v1/[operation].ts +108 -0
  298. package/apps/storefront/src/pages/api/newsletter/[collection]/subscribe.ts +146 -0
  299. package/apps/storefront/src/pages/api/newsletter/confirm.ts +75 -0
  300. package/apps/storefront/src/pages/api/newsletter/unsubscribe.ts +90 -0
  301. package/apps/storefront/src/pages/api/publish/stage-bundle.ts +70 -0
  302. package/apps/storefront/src/pages/api/rum/vitals.ts +20 -2
  303. package/apps/storefront/src/pages/blog/[slug].astro +99 -19
  304. package/apps/storefront/src/pages/blog/author/[author].astro +140 -0
  305. package/apps/storefront/src/pages/blog/category/[category].astro +67 -0
  306. package/apps/storefront/src/pages/blog/index.astro +4 -2
  307. package/apps/storefront/src/pages/blog/tag/[tag].astro +65 -0
  308. package/apps/storefront/src/pages/cockpit.astro +77 -1353
  309. package/apps/storefront/src/pages/dashboard/[appDomain]/team.astro +15 -11
  310. package/apps/storefront/src/pages/index.astro +10 -5
  311. package/apps/storefront/src/pages/llms.txt.ts +1 -1
  312. package/apps/storefront/src/pages/products/[handle].astro +7 -6
  313. package/apps/storefront/src/pages/search.astro +1 -1
  314. package/apps/storefront/src/pages/sitemap.xml.ts +21 -1
  315. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +31 -27
  316. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +1 -1
  317. package/apps/storefront/src/pages/tenants/[id]/[...path].ts +38 -2
  318. package/apps/storefront/src/pages/the-build/[slug].astro +129 -0
  319. package/apps/storefront/src/pages/the-build/index.astro +146 -0
  320. package/apps/storefront/src/pages/the-build/rss.xml.ts +33 -0
  321. package/apps/storefront/src/styles/admin.css +1106 -0
  322. package/apps/storefront/tsconfig.json +6 -1
  323. package/package.json +1 -1
  324. package/packages/public-runtime/package.json +3 -1
  325. package/packages/public-runtime/schemas/managed-analytics/v1/adapter-definition.schema.json +427 -0
  326. package/packages/public-runtime/schemas/managed-analytics/v1/create-integration-install-request.schema.json +161 -0
  327. package/packages/public-runtime/schemas/managed-analytics/v1/create-migration-draft-request.schema.json +157 -0
  328. package/packages/public-runtime/schemas/managed-analytics/v1/delete-integration-install-request.schema.json +84 -0
  329. package/packages/public-runtime/schemas/managed-analytics/v1/delete-migration-draft-request.schema.json +84 -0
  330. package/packages/public-runtime/schemas/managed-analytics/v1/error-envelope.schema.json +180 -0
  331. package/packages/public-runtime/schemas/managed-analytics/v1/get-adapter-definition-request.schema.json +52 -0
  332. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-install-request.schema.json +52 -0
  333. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-revision-request.schema.json +79 -0
  334. package/packages/public-runtime/schemas/managed-analytics/v1/get-migration-draft-request.schema.json +52 -0
  335. package/packages/public-runtime/schemas/managed-analytics/v1/integration-install.schema.json +167 -0
  336. package/packages/public-runtime/schemas/managed-analytics/v1/integration-revision.schema.json +208 -0
  337. package/packages/public-runtime/schemas/managed-analytics/v1/list-adapter-definitions-request.schema.json +53 -0
  338. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-installs-request.schema.json +53 -0
  339. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-revisions-request.schema.json +82 -0
  340. package/packages/public-runtime/schemas/managed-analytics/v1/migration-draft.schema.json +218 -0
  341. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-request.schema.json +52 -0
  342. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-success-envelope.schema.json +49 -0
  343. package/packages/public-runtime/schemas/managed-analytics/v1/read-request.schema.json +20 -0
  344. package/packages/public-runtime/schemas/managed-analytics/v1/read-success-envelope.schema.json +45 -0
  345. package/packages/public-runtime/schemas/managed-analytics/v1/revise-integration-install-request.schema.json +156 -0
  346. package/packages/public-runtime/schemas/managed-analytics/v1/set-integration-install-status-request.schema.json +92 -0
  347. package/packages/public-runtime/schemas/managed-analytics/v1/update-migration-draft-request.schema.json +184 -0
  348. package/packages/public-runtime/scripts/generate-managed-analytics-api-v1-schemas.mjs +13 -0
  349. package/packages/public-runtime/src/activity/catalog.ts +89 -33
  350. package/packages/public-runtime/src/activity/event.ts +6 -6
  351. package/packages/public-runtime/src/activity/index.ts +2 -2
  352. package/packages/public-runtime/src/activity/redaction.ts +4 -4
  353. package/packages/public-runtime/src/candidate-index.ts +42 -8
  354. package/packages/public-runtime/src/catalog-d1.ts +1 -1
  355. package/packages/public-runtime/src/checkout-orders.ts +2 -2
  356. package/packages/public-runtime/src/checkout-style-publish.ts +2 -2
  357. package/packages/public-runtime/src/checkout-style.ts +7 -7
  358. package/packages/public-runtime/src/checkout.ts +3 -3
  359. package/packages/public-runtime/src/chrome.ts +777 -0
  360. package/packages/public-runtime/src/compliance-obligations.ts +310 -0
  361. package/packages/public-runtime/src/csp.ts +99 -0
  362. package/packages/public-runtime/src/customization-preview.ts +25 -2
  363. package/packages/public-runtime/src/customization-runtime.ts +156 -3
  364. package/packages/public-runtime/src/customization-versioning.ts +10 -0
  365. package/packages/public-runtime/src/destination-webhook/contract.ts +353 -0
  366. package/packages/public-runtime/src/embed-catalog.d.mts +9 -0
  367. package/packages/public-runtime/src/embed-catalog.mjs +40 -0
  368. package/packages/public-runtime/src/evidence.ts +288 -0
  369. package/packages/public-runtime/src/gtm-migration/bounds.ts +138 -0
  370. package/packages/public-runtime/src/gtm-migration/disposition-rules.ts +361 -0
  371. package/packages/public-runtime/src/gtm-migration/dispositions.ts +181 -0
  372. package/packages/public-runtime/src/gtm-migration/draft-generator.ts +400 -0
  373. package/packages/public-runtime/src/gtm-migration/graph.ts +468 -0
  374. package/packages/public-runtime/src/gtm-migration/index.ts +95 -0
  375. package/packages/public-runtime/src/gtm-migration/parse.ts +410 -0
  376. package/packages/public-runtime/src/gtm-migration/references.ts +266 -0
  377. package/packages/public-runtime/src/gtm-migration/types.ts +86 -0
  378. package/packages/public-runtime/src/index.ts +17 -1
  379. package/packages/public-runtime/src/integration/assurance-decision.ts +259 -0
  380. package/packages/public-runtime/src/integration/assurance.ts +228 -0
  381. package/packages/public-runtime/src/integration/candidate-evidence.ts +377 -0
  382. package/packages/public-runtime/src/integration/commerce-broker.ts +497 -0
  383. package/packages/public-runtime/src/integration/consent-broker.ts +337 -0
  384. package/packages/public-runtime/src/integration/consent-cmp-demand.ts +115 -0
  385. package/packages/public-runtime/src/integration/consent-config.ts +260 -0
  386. package/packages/public-runtime/src/integration/consent-preview.ts +125 -0
  387. package/packages/public-runtime/src/integration/correlation-token.ts +444 -0
  388. package/packages/public-runtime/src/integration/csp-compiler.ts +267 -0
  389. package/packages/public-runtime/src/integration/csp.ts +105 -0
  390. package/packages/public-runtime/src/integration/digest.ts +43 -0
  391. package/packages/public-runtime/src/integration/environment.ts +228 -0
  392. package/packages/public-runtime/src/integration/events-catalog.ts +186 -0
  393. package/packages/public-runtime/src/integration/events.ts +701 -0
  394. package/packages/public-runtime/src/integration/g2-action-boundary.ts +106 -0
  395. package/packages/public-runtime/src/integration/index.ts +90 -0
  396. package/packages/public-runtime/src/integration/interim-bridge.ts +138 -0
  397. package/packages/public-runtime/src/integration/lifecycle-boot.ts +317 -0
  398. package/packages/public-runtime/src/integration/lifecycle-runtime.ts +393 -0
  399. package/packages/public-runtime/src/integration/lifecycle.ts +94 -0
  400. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.d.mts +2 -0
  401. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.mjs +10 -0
  402. package/packages/public-runtime/src/integration/managed-analytics-api-v1.schemas.ts +382 -0
  403. package/packages/public-runtime/src/integration/managed-analytics-api-v1.ts +684 -0
  404. package/packages/public-runtime/src/integration/managed-analytics-bridge.ts +383 -0
  405. package/packages/public-runtime/src/integration/managed-analytics-value-safety.ts +14 -0
  406. package/packages/public-runtime/src/integration/managed-analytics.ts +277 -0
  407. package/packages/public-runtime/src/integration/manifest.ts +470 -0
  408. package/packages/public-runtime/src/integration/native-amplitude.ts +362 -0
  409. package/packages/public-runtime/src/integration/native-ga4.ts +352 -0
  410. package/packages/public-runtime/src/integration/observability.ts +451 -0
  411. package/packages/public-runtime/src/integration/order-conversion.ts +0 -0
  412. package/packages/public-runtime/src/integration/phases.ts +182 -0
  413. package/packages/public-runtime/src/integration/plan.ts +112 -0
  414. package/packages/public-runtime/src/integration/platform-adapter-runtime.ts +146 -0
  415. package/packages/public-runtime/src/integration/platform-adapters.ts +671 -0
  416. package/packages/public-runtime/src/integration/promotion-gate.ts +451 -0
  417. package/packages/public-runtime/src/integration/provider-checkout-extension.ts +425 -0
  418. package/packages/public-runtime/src/integration/receipt-measurement.ts +370 -0
  419. package/packages/public-runtime/src/integration/regulated-parent-cert.ts +311 -0
  420. package/packages/public-runtime/src/integration/render-phases.ts +267 -0
  421. package/packages/public-runtime/src/integration/resolve.ts +465 -0
  422. package/packages/public-runtime/src/integration/result.ts +239 -0
  423. package/packages/public-runtime/src/integration/secrets.ts +92 -0
  424. package/packages/public-runtime/src/integration/tamper-evidence.ts +205 -0
  425. package/packages/public-runtime/src/integration/tamper-recovery.ts +127 -0
  426. package/packages/public-runtime/src/integration/version.ts +92 -0
  427. package/packages/public-runtime/src/integration-capabilities.ts +520 -0
  428. package/packages/public-runtime/src/membership.ts +2 -2
  429. package/packages/public-runtime/src/raw-html-policy.ts +2 -4
  430. package/packages/public-runtime/src/regulated-commerce/broker/consent-dedupe.ts +144 -0
  431. package/packages/public-runtime/src/regulated-commerce/correlation/contract.ts +177 -0
  432. package/packages/public-runtime/src/regulated-commerce/diagnostics/local-dispatch.ts +24 -0
  433. package/packages/public-runtime/src/regulated-commerce/diagnostics/read-model.ts +69 -0
  434. package/packages/public-runtime/src/regulated-commerce/dispatch/core.ts +134 -0
  435. package/packages/public-runtime/src/regulated-commerce/events/contract.ts +113 -0
  436. package/packages/public-runtime/src/regulated-commerce/ledger/core.ts +81 -0
  437. package/packages/public-runtime/src/regulated-commerce/mappings/ga4-ads.ts +87 -0
  438. package/packages/public-runtime/src/regulated-commerce/provider-order/bridge.ts +52 -0
  439. package/packages/public-runtime/src/regulated-commerce/purchase-truth/contract.ts +252 -0
  440. package/packages/public-runtime/src/regulated-commerce/sources/accepted-browser-operation.ts +67 -0
  441. package/packages/public-runtime/src/regulated-commerce/testing/fake-destination.ts +93 -0
  442. package/packages/public-runtime/src/static-bundle.ts +357 -0
  443. package/packages/public-runtime/src/tenant-assets.ts +143 -4
  444. package/packages/public-runtime/src/tenant.ts +81 -17
  445. package/packages/public-runtime/tests/fixtures/integration/browser-environment.example.json +8 -0
  446. package/packages/public-runtime/tests/fixtures/integration/commerce-event.example.json +44 -0
  447. package/packages/public-runtime/tests/fixtures/integration/commerce-order-event.example.json +44 -0
  448. package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json +50 -0
  449. package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json +120 -0
  450. package/packages/public-runtime/tests/fixtures/integration/managed-analytics-v1/fake-adapter-catalog.json +35 -0
  451. package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json +11 -0
  452. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/README.md +22 -0
  453. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/entry.js +30 -0
  454. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/manifest.json +75 -0
  455. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/public-config.json +3 -0
  456. package/packages/public-runtime/tests/fixtures/regulated-commerce/fake-destinations.ts +38 -0
  457. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.provenance.json +29 -0
  458. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json +3397 -0
  459. package/scripts/build/copy-tenant-assets.mjs +14 -4
  460. package/scripts/dev/ai-edit.mjs +1 -1
  461. package/scripts/dev/checkout-watch.mjs +2 -2
  462. package/scripts/dev/file-browser.mjs +4 -6
  463. package/scripts/dev/file-writer.mjs +3 -3
  464. package/scripts/dev/git-status.mjs +2 -2
  465. package/scripts/dev/integration-guardrails.mjs +498 -0
  466. package/scripts/dev/locate-handler.mjs +3 -3
  467. package/scripts/dev/port-check.mjs +3 -3
  468. package/scripts/dev/publish.mjs +5 -9
  469. package/scripts/dev/safe-path.mjs +2 -2
  470. package/scripts/dev/shot.mjs +1 -1
  471. package/scripts/dev/tenant-source-root.mjs +1 -1
  472. package/scripts/dev/unified-diff.mjs +8 -3
  473. package/scripts/tot-dev.mjs +8 -11
  474. package/apps/storefront/src/lib/dev/vcBinding.ts +0 -80
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Integration capability model — the closed, versioned permission vocabulary for
3
+ * third-party extensibility of the shared multi-tenant renderer.
4
+ *
5
+ * This is the crux the CSP compiler, consent broker, compliance obligations,
6
+ * assurance/audit, and promotion gates all resolve against. It is pure and
7
+ * edge-safe (no node, no I/O), so the renderer, validators, CLI, and admin
8
+ * review all read the same source of truth.
9
+ *
10
+ * Governing decisions (see docs/architecture/decisions):
11
+ * - 0014 charter: four authority tiers (I1), non-waivable regulated floor (G1),
12
+ * regulated elevated-parent proof-gated (G2), commerce data minimized (M1/M2),
13
+ * dual client/server events (M3), invariant 7 (the ungrantable protected set).
14
+ * - 0016 sandbox-first: authority is fixed by a surface × tenant-tier matrix;
15
+ * sandbox/broker is the default; generic parent code is prohibited on commerce
16
+ * and checkout/payment surfaces; regulated pages take only certified immutable
17
+ * pinned code; mutable containers are never regulated-eligible.
18
+ * - 0023 legal gates: Q6 prohibits merchant-mutable parent code on regulated and
19
+ * commerce surfaces (no acknowledgement path); Q2 approves the outside-guarantee
20
+ * record structure for eligible unregulated/external surfaces only, disabled
21
+ * until counsel wording is wired; Q3 requires analytics consent for cross-site
22
+ * attribution.
23
+ *
24
+ * Honesty contract: only adapter, broker (sandboxed iframe + typed postMessage),
25
+ * and server tiers offer enforceable least-privilege. The elevated-parent tier is
26
+ * full parent authority and is labeled review-only — its DOM reach is never
27
+ * described as a sandbox.
28
+ */
29
+
30
+ // The four honest authority tiers are the shared browser-integration contract's
31
+ // (`./integration/phases.ts`) — one vocabulary, not a competing spelling. This
32
+ // policy layer decides which tier is grantable on which surface; the contract
33
+ // layer decides the manifest shape. `isExactOrigin` is likewise the shared
34
+ // exact-HTTPS grammar (`./integration/csp.ts`).
35
+ import { EXECUTION_TIERS, type ExecutionTier } from "./integration/phases.js";
36
+ import { isExactOrigin } from "./integration/csp.js";
37
+
38
+ /** Contract token for the whole model — bump the minor for additive vocabulary, the major for a breaking change (ADR 0006 semver). */
39
+ export const INTEGRATION_CAPABILITY_MODEL = "integration-capability-model@1" as const;
40
+ export type IntegrationCapabilityModel = typeof INTEGRATION_CAPABILITY_MODEL;
41
+
42
+ // ── Execution tiers (charter I1 / ADR 0016) ─────────────────────────────────
43
+
44
+ /** Sandbox is the default tier on every surface (ADR 0016). */
45
+ export const DEFAULT_EXECUTION_TIER: ExecutionTier = "sandbox";
46
+
47
+ export type Enforcement = "enforced" | "review-only";
48
+
49
+ /**
50
+ * Whether the platform mechanically enforces the authority of a tier. Adapter,
51
+ * broker, and server are enforced least-privilege. Elevated-parent is full parent
52
+ * authority — honestly review-only, never claimed as enforced isolation.
53
+ */
54
+ export const EXECUTION_TIER_ENFORCEMENT: Record<ExecutionTier, Enforcement> = {
55
+ "platform-adapter": "enforced",
56
+ sandbox: "enforced",
57
+ server: "enforced",
58
+ "elevated-parent": "review-only",
59
+ };
60
+
61
+ /** Honest human labels. The elevated-parent line never uses the word sandbox. */
62
+ export const EXECUTION_TIER_LABELS: Record<ExecutionTier, string> = {
63
+ "platform-adapter":
64
+ "Platform adapter — versioned, platform-owned configuration for a first-class vendor. Least-privilege and enforced.",
65
+ sandbox:
66
+ "Sandbox/broker — target: a null-origin sandboxed iframe (allow-scripts, no allow-same-origin) reaching the page only through the typed postMessage broker. Enforced fail-closed: until that isolating iframe host is wired, a sandbox-tier entry is REFUSED at runtime by the same-origin loader rather than run with parent-document access — the isolation is never faked by importing it into the parent.",
67
+ server:
68
+ "Server — server-side destination filtering and semantic events. Least-privilege and enforced; never touches the browser DOM.",
69
+ "elevated-parent":
70
+ "Full parent authority — arbitrary parent-document JavaScript. Its DOM reach is NOT enforceably narrow, so it is review-only and can never access separate server-held secrets or forbidden broker scopes. It is not isolation and must not be presented as least-privilege.",
71
+ };
72
+
73
+ /** Code shape a request ships as — the distinction that decides regulated eligibility (ADR 0016 / 0023 Q6). */
74
+ export const CODE_FORMS = ["brokered", "pinned-immutable", "mutable-container"] as const;
75
+ export type CodeForm = (typeof CODE_FORMS)[number];
76
+
77
+ // ── Tenant tiers and surfaces (the D-R2 matrix axes) ────────────────────────
78
+
79
+ /**
80
+ * Tenant compliance tier, resolved server-side from authoritative tenant state
81
+ * (charter invariant 4). Regulated tiers carry the non-waivable floor (G1).
82
+ */
83
+ export const TENANT_TIERS = [
84
+ "regulated-commerce",
85
+ "regulated-marketing",
86
+ "commerce",
87
+ "unregulated-marketing",
88
+ ] as const;
89
+ export type TenantTier = (typeof TENANT_TIERS)[number];
90
+
91
+ /**
92
+ * The canonical surface taxonomy an integration attaches to — the single
93
+ * vocabulary shared with the compliance-authority axis (`ASSURANCE_SURFACES` in
94
+ * ./integration/assurance.ts, which is this set projected so `checkout-payment`
95
+ * shares `commerce` authority; see `surfaceAuthority`).
96
+ *
97
+ * `checkout-payment` is the strictly-most-protected sub-surface of commerce
98
+ * (money, signed cart, payment DOM — sandbox-only, parent code prohibited);
99
+ * `commerce` carries money without the payment DOM; `regulated` carries the
100
+ * non-waivable compliance floor; `unregulated-marketing` is content, the one
101
+ * tier where an acknowledged outside-guarantee can admit parent code.
102
+ */
103
+ export const SURFACES = ["checkout-payment", "commerce", "regulated", "unregulated-marketing"] as const;
104
+ export type Surface = (typeof SURFACES)[number];
105
+
106
+ /** Elevated-parent disposition for one matrix cell. */
107
+ export type ElevatedParentDisposition = "prohibited" | "cert-required" | "acknowledge";
108
+
109
+ export interface CellAuthority {
110
+ /** Highest non-elevated tier grantable on this cell (platform-adapter ≤ sandbox ≤ server). */
111
+ maxTier: Exclude<ExecutionTier, "elevated-parent">;
112
+ /** How the elevated-parent tier is treated here. */
113
+ elevatedParent: ElevatedParentDisposition;
114
+ }
115
+
116
+ /**
117
+ * The binding surface × tenant-tier matrix (D-R2). A (tenantTier, surface) pair
118
+ * absent from a tier's map is unavailable — default deny. Sandbox/broker is the
119
+ * default tier on every present cell.
120
+ *
121
+ * Elevated-parent dispositions encode ADR 0016 + 0023:
122
+ * - `prohibited` — commerce and checkout/payment surfaces: no parent code path.
123
+ * - `cert-required` — regulated surfaces: only pinned-immutable code with a
124
+ * capability-specific certification; mutable containers are rejected (Q6).
125
+ * - `acknowledge` — eligible unregulated marketing: outside-guarantee record,
126
+ * disabled until counsel wording is wired (Q2).
127
+ */
128
+ export const SURFACE_TENANT_TIER_MATRIX: Record<
129
+ TenantTier,
130
+ Partial<Record<Surface, CellAuthority>>
131
+ > = {
132
+ "regulated-commerce": {
133
+ "checkout-payment": { maxTier: "sandbox", elevatedParent: "prohibited" },
134
+ commerce: { maxTier: "server", elevatedParent: "prohibited" },
135
+ regulated: { maxTier: "server", elevatedParent: "cert-required" },
136
+ "unregulated-marketing": { maxTier: "server", elevatedParent: "cert-required" },
137
+ },
138
+ "regulated-marketing": {
139
+ regulated: { maxTier: "server", elevatedParent: "cert-required" },
140
+ "unregulated-marketing": { maxTier: "server", elevatedParent: "cert-required" },
141
+ },
142
+ commerce: {
143
+ "checkout-payment": { maxTier: "sandbox", elevatedParent: "prohibited" },
144
+ commerce: { maxTier: "server", elevatedParent: "prohibited" },
145
+ "unregulated-marketing": { maxTier: "server", elevatedParent: "acknowledge" },
146
+ },
147
+ "unregulated-marketing": {
148
+ "unregulated-marketing": { maxTier: "server", elevatedParent: "acknowledge" },
149
+ },
150
+ };
151
+
152
+ const NON_ELEVATED_ORDER: Exclude<ExecutionTier, "elevated-parent">[] = [
153
+ "platform-adapter",
154
+ "sandbox",
155
+ "server",
156
+ ];
157
+
158
+ /** The concrete non-elevated tiers allowed on a cell (adapter..maxTier). */
159
+ export function allowedTiersForCell(cell: CellAuthority): Exclude<ExecutionTier, "elevated-parent">[] {
160
+ const top = NON_ELEVATED_ORDER.indexOf(cell.maxTier);
161
+ return NON_ELEVATED_ORDER.slice(0, top + 1);
162
+ }
163
+
164
+ /** Resolve the authority for a (tenantTier, surface) cell, or undefined when the surface is unavailable there. */
165
+ export function resolveCellAuthority(
166
+ tenantTier: TenantTier,
167
+ surface: Surface,
168
+ ): CellAuthority | undefined {
169
+ return SURFACE_TENANT_TIER_MATRIX[tenantTier]?.[surface];
170
+ }
171
+
172
+ // ── Capability classes and the grantable registry ───────────────────────────
173
+
174
+ export type CapabilityClass =
175
+ | "lifecycle"
176
+ | "event"
177
+ | "broker-data"
178
+ | "broker-action"
179
+ | "config"
180
+ | "consent"
181
+ | "assurance";
182
+
183
+ /** Whether a whole capability class is mechanically enforced or is review-only metadata. */
184
+ export const CAPABILITY_CLASS_ENFORCEMENT: Record<CapabilityClass, Enforcement> = {
185
+ lifecycle: "enforced",
186
+ event: "enforced",
187
+ "broker-data": "enforced",
188
+ "broker-action": "enforced",
189
+ config: "enforced",
190
+ consent: "enforced",
191
+ // The eligibility check is enforced; the guarantee itself is a human/legal claim.
192
+ assurance: "review-only",
193
+ };
194
+
195
+ /** Consent purposes (ADR 0022 / 0023 Q3). `essential` is always on and cannot be gated. */
196
+ export const CONSENT_PURPOSES = ["essential", "analytics", "marketing", "personalization"] as const;
197
+ export type ConsentPurpose = (typeof CONSENT_PURPOSES)[number];
198
+
199
+ export interface CapabilityDef {
200
+ id: string;
201
+ class: CapabilityClass;
202
+ enforcement: Enforcement;
203
+ /** Consent purpose this capability's runtime effect depends on, when any (the broker enforces it). */
204
+ requiresConsent?: ConsentPurpose;
205
+ label: string;
206
+ }
207
+
208
+ function def(
209
+ id: string,
210
+ cls: CapabilityClass,
211
+ label: string,
212
+ extra: { requiresConsent?: ConsentPurpose } = {},
213
+ ): CapabilityDef {
214
+ return {
215
+ id,
216
+ class: cls,
217
+ enforcement: CAPABILITY_CLASS_ENFORCEMENT[cls],
218
+ requiresConsent: extra.requiresConsent,
219
+ label,
220
+ };
221
+ }
222
+
223
+ /**
224
+ * The closed set of grantable capabilities. Anything not here is unknown and fails
225
+ * closed. None of these can mutate money, signed cart, compliance state/copy,
226
+ * payment DOM, identity state, warnings, tax internals, or reach unrestricted PII —
227
+ * those live only in {@link FORBIDDEN_CAPABILITIES} and are asserted disjoint.
228
+ */
229
+ export const CAPABILITY_REGISTRY: Readonly<Record<string, CapabilityDef>> = Object.freeze(
230
+ Object.fromEntries(
231
+ [
232
+ // Lifecycle contributions — the fixed, non-protected render phases (charter S1/S2).
233
+ // The compliance phases (boot, compliance-init, consent-default, age-gate,
234
+ // navigation-complete) are platform-owned and appear only in PROTECTED_PHASES.
235
+ def("lifecycle:head-late", "lifecycle", "Contribute to the head after platform compliance boot."),
236
+ def("lifecycle:body-start", "lifecycle", "Contribute at the start of the body."),
237
+ def("lifecycle:region-product-aside", "lifecycle", "Render into the product aside region."),
238
+ def("lifecycle:region-home-section", "lifecycle", "Render into a home section region."),
239
+ def("lifecycle:region-global-footer", "lifecycle", "Render into the global footer region."),
240
+ def("lifecycle:body-end", "lifecycle", "Contribute at the end of the body."),
241
+
242
+ // Semantic events (charter M3) — anonymous and minimal (M2). Analytics/marketing
243
+ // topics depend on consent (Q3); cross-site attribution is dropped when unconsented.
244
+ def("event:page.viewed", "event", "A page was viewed.", { requiresConsent: "analytics" }),
245
+ def("event:product.viewed", "event", "A product was viewed.", { requiresConsent: "analytics" }),
246
+ def("event:collection.viewed", "event", "A collection was viewed.", { requiresConsent: "analytics" }),
247
+ def("event:search.performed", "event", "A search was performed.", { requiresConsent: "analytics" }),
248
+ def("event:cart.viewed", "event", "The cart was viewed.", { requiresConsent: "analytics" }),
249
+ def("event:cart.updated", "event", "The anonymous cart changed.", { requiresConsent: "analytics" }),
250
+ def("event:checkout.started", "event", "Checkout started.", { requiresConsent: "analytics" }),
251
+ def("event:order.completed", "event", "An order completed (unattributed unless analytics-eligible).", {
252
+ requiresConsent: "analytics",
253
+ }),
254
+
255
+ // Brokered reads (charter M2) — anonymous, minimal, never PII.
256
+ def("broker:cart.read", "broker-data", "Read anonymous cart line items and totals (read-only)."),
257
+ def("broker:catalog.read", "broker-data", "Read public catalog data."),
258
+ def("broker:consent.read", "broker-data", "Read the current consent snapshot."),
259
+ def("broker:page-context.read", "broker-data", "Read non-PII page context (surface, locale, currency)."),
260
+
261
+ // Brokered actions — mediated by the typed broker; never mutate signed totals or checkout.
262
+ def("broker:cart.add-line", "broker-action", "Request an add-to-cart via the signed loader (platform prices it)."),
263
+ def("broker:analytics.emit", "broker-action", "Emit a validated analytics event through the broker.", {
264
+ requiresConsent: "analytics",
265
+ }),
266
+ def("broker:navigate", "broker-action", "Request same-tenant relative navigation."),
267
+
268
+ // Public configuration — the app's own public namespace only.
269
+ def("config:public.read", "config", "Read the app's own public configuration."),
270
+ def("config:public.write", "config", "Write the app's own public configuration."),
271
+
272
+ // Consent purpose contributions — declaring a dependent destination for a purpose.
273
+ def("consent:analytics", "consent", "Depends on analytics consent."),
274
+ def("consent:marketing", "consent", "Depends on marketing consent."),
275
+ def("consent:personalization", "consent", "Depends on personalization consent."),
276
+
277
+ // Assurance — review-only records, never mechanical enforcement.
278
+ def(
279
+ "assurance:outside-guarantee",
280
+ "assurance",
281
+ "Outside-guarantee acknowledgement (eligible unregulated/external surfaces only; Q2-gated).",
282
+ ),
283
+ def(
284
+ "assurance:regulated-parent-cert",
285
+ "assurance",
286
+ "Regulated elevated-parent certification claim (proof-gated; ADR 0016 / G2).",
287
+ ),
288
+ ].map((d) => [d.id, d]),
289
+ ),
290
+ );
291
+
292
+ // ── The unreachable set: forbidden capabilities + protected phases ───────────
293
+
294
+ /**
295
+ * Capabilities that are UNREACHABLE — they can never be granted at any tier on any
296
+ * surface. Each maps to a compliance-floor clause / charter invariant 7. They are
297
+ * kept out of {@link CAPABILITY_REGISTRY} entirely; requesting one is always denied
298
+ * `forbidden`, not merely `unknown`.
299
+ */
300
+ export const FORBIDDEN_CAPABILITIES = [
301
+ "checkout:mutate-total",
302
+ "signed-cart:mutate",
303
+ "compliance-state:mutate",
304
+ "compliance-copy:mutate",
305
+ "payment-dom:access",
306
+ "identity-state:mutate",
307
+ "warnings:mutate",
308
+ "tax-internals:mutate",
309
+ "jurisdiction:approve",
310
+ "age-gate:mutate",
311
+ "pii:unrestricted",
312
+ ] as const;
313
+ export type ForbiddenCapability = (typeof FORBIDDEN_CAPABILITIES)[number];
314
+
315
+ /**
316
+ * Platform-owned lifecycle phases. Storefront compliance code initializes before
317
+ * tenant/vendor code and cannot be reordered (charter invariant 1); no integration
318
+ * may contribute to these, so they are unreachable exactly like forbidden scopes.
319
+ */
320
+ export const PROTECTED_PHASES = [
321
+ "lifecycle:boot",
322
+ "lifecycle:compliance-init",
323
+ "lifecycle:consent-default",
324
+ "lifecycle:age-gate",
325
+ "lifecycle:navigation-complete",
326
+ ] as const;
327
+ export type ProtectedPhase = (typeof PROTECTED_PHASES)[number];
328
+
329
+ const REGISTRY_IDS: ReadonlySet<string> = new Set(Object.keys(CAPABILITY_REGISTRY));
330
+ const UNREACHABLE_IDS: ReadonlySet<string> = new Set<string>([
331
+ ...FORBIDDEN_CAPABILITIES,
332
+ ...PROTECTED_PHASES,
333
+ ]);
334
+
335
+ /** True when an id can never be granted (forbidden capability or protected phase). */
336
+ export function isUnreachableCapability(id: string): boolean {
337
+ return UNREACHABLE_IDS.has(id);
338
+ }
339
+
340
+ /** True when an id is in the closed grantable registry. */
341
+ export function isGrantableCapability(id: string): boolean {
342
+ return REGISTRY_IDS.has(id);
343
+ }
344
+
345
+ // ── Binding + request/result contract ───────────────────────────────────────
346
+
347
+ const VERSION_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
348
+
349
+ /** Every grant is bound to exactly one tenant, app, and app version (charter invariants 3/4). */
350
+ export interface IntegrationBinding {
351
+ tenantId: string;
352
+ appId: string;
353
+ version: string;
354
+ }
355
+
356
+ export interface IntegrationCapabilityRequest {
357
+ binding: IntegrationBinding;
358
+ tier: ExecutionTier;
359
+ surface: Surface;
360
+ codeForm: CodeForm;
361
+ /** Requested capability ids from {@link CAPABILITY_REGISTRY}. */
362
+ capabilities: readonly string[];
363
+ /** Requested exact-HTTPS CSP origins (the compiler expands profiles; here only shape is validated). */
364
+ origins?: readonly string[];
365
+ }
366
+
367
+ /** Server-resolved evaluation context. Every enablement gate defaults off, so elevated-parent is disabled by default. */
368
+ export interface IntegrationContext {
369
+ tenantTier: TenantTier;
370
+ /** A green capability-specific certification for pinned-immutable regulated code (ADR 0016 / G2 / ext-policy-07). */
371
+ certifiedImmutable?: boolean;
372
+ /** The outside-guarantee tier is wired with counsel wording and acknowledged (Q2). */
373
+ outsideGuaranteeEnabled?: boolean;
374
+ }
375
+
376
+ export type CapabilityDenialReason =
377
+ | "unbound"
378
+ | "unknown"
379
+ | "forbidden"
380
+ | "surface-unavailable"
381
+ | "surface-tier-exceeded"
382
+ | "elevated-parent-prohibited"
383
+ | "elevated-parent-uncertified"
384
+ | "elevated-parent-unacknowledged"
385
+ | "mutable-parent-prohibited"
386
+ | "origin-invalid";
387
+
388
+ export interface CapabilityDenial {
389
+ reason: CapabilityDenialReason;
390
+ /** The offending value (capability id, origin, tier, or a binding field), when one applies. */
391
+ subject?: string;
392
+ }
393
+
394
+ export interface GrantedCapability {
395
+ id: string;
396
+ class: CapabilityClass;
397
+ enforcement: Enforcement;
398
+ requiresConsent?: ConsentPurpose;
399
+ }
400
+
401
+ export type IntegrationCapabilityResult =
402
+ | {
403
+ ok: true;
404
+ model: IntegrationCapabilityModel;
405
+ binding: IntegrationBinding;
406
+ tier: ExecutionTier;
407
+ surface: Surface;
408
+ /** Honest overall enforcement for the granted tier (elevated-parent → review-only). */
409
+ enforcement: Enforcement;
410
+ capabilities: GrantedCapability[];
411
+ origins: string[];
412
+ }
413
+ | { ok: false; code: "capability_denied"; denials: CapabilityDenial[] };
414
+
415
+ function validateBinding(binding: IntegrationBinding, denials: CapabilityDenial[]): void {
416
+ if (!binding.tenantId) denials.push({ reason: "unbound", subject: "tenantId" });
417
+ if (!binding.appId) denials.push({ reason: "unbound", subject: "appId" });
418
+ if (!binding.version || !VERSION_PATTERN.test(binding.version)) {
419
+ denials.push({ reason: "unbound", subject: "version" });
420
+ }
421
+ }
422
+
423
+ function validateTierAndSurface(
424
+ request: IntegrationCapabilityRequest,
425
+ context: IntegrationContext,
426
+ denials: CapabilityDenial[],
427
+ ): void {
428
+ if (!(EXECUTION_TIERS as readonly string[]).includes(request.tier)) {
429
+ denials.push({ reason: "unknown", subject: request.tier });
430
+ return;
431
+ }
432
+ const cell = resolveCellAuthority(context.tenantTier, request.surface);
433
+ if (!cell) {
434
+ denials.push({ reason: "surface-unavailable", subject: request.surface });
435
+ return;
436
+ }
437
+
438
+ if (request.tier !== "elevated-parent") {
439
+ if (!allowedTiersForCell(cell).includes(request.tier)) {
440
+ denials.push({ reason: "surface-tier-exceeded", subject: request.tier });
441
+ }
442
+ return;
443
+ }
444
+
445
+ // Elevated-parent: full parent authority, disabled by default. It is reachable
446
+ // only via an explicit enablement gate that itself defaults off.
447
+ switch (cell.elevatedParent) {
448
+ case "prohibited":
449
+ denials.push({ reason: "elevated-parent-prohibited", subject: request.surface });
450
+ return;
451
+ case "cert-required":
452
+ if (request.codeForm === "mutable-container") {
453
+ // Q6: merchant-mutable parent code is never certifiable on
454
+ // regulated surfaces — rejected, never "certified".
455
+ denials.push({ reason: "mutable-parent-prohibited", subject: request.surface });
456
+ } else if (!context.certifiedImmutable) {
457
+ denials.push({ reason: "elevated-parent-uncertified", subject: request.surface });
458
+ }
459
+ return;
460
+ case "acknowledge":
461
+ if (!context.outsideGuaranteeEnabled) {
462
+ denials.push({ reason: "elevated-parent-unacknowledged", subject: request.surface });
463
+ }
464
+ return;
465
+ }
466
+ }
467
+
468
+ /**
469
+ * Validate a requested integration grant against the closed model. Fail-closed and
470
+ * all-or-nothing: any unknown, forbidden, unbound, out-of-matrix, or malformed-origin
471
+ * element denies the whole request (never a partial grant), mirroring `validateScopes`.
472
+ */
473
+ export function validateIntegrationCapabilities(
474
+ request: IntegrationCapabilityRequest,
475
+ context: IntegrationContext,
476
+ ): IntegrationCapabilityResult {
477
+ const denials: CapabilityDenial[] = [];
478
+
479
+ validateBinding(request.binding, denials);
480
+ validateTierAndSurface(request, context, denials);
481
+
482
+ const granted: GrantedCapability[] = [];
483
+ for (const id of request.capabilities) {
484
+ if (isUnreachableCapability(id)) {
485
+ denials.push({ reason: "forbidden", subject: id });
486
+ continue;
487
+ }
488
+ const cap = CAPABILITY_REGISTRY[id];
489
+ if (!cap) {
490
+ denials.push({ reason: "unknown", subject: id });
491
+ continue;
492
+ }
493
+ granted.push({
494
+ id: cap.id,
495
+ class: cap.class,
496
+ enforcement: cap.enforcement,
497
+ requiresConsent: cap.requiresConsent,
498
+ });
499
+ }
500
+
501
+ const origins = [...(request.origins ?? [])];
502
+ for (const origin of origins) {
503
+ if (!isExactOrigin(origin)) denials.push({ reason: "origin-invalid", subject: origin });
504
+ }
505
+
506
+ if (denials.length > 0) {
507
+ return { ok: false, code: "capability_denied", denials };
508
+ }
509
+
510
+ return {
511
+ ok: true,
512
+ model: INTEGRATION_CAPABILITY_MODEL,
513
+ binding: request.binding,
514
+ tier: request.tier,
515
+ surface: request.surface,
516
+ enforcement: EXECUTION_TIER_ENFORCEMENT[request.tier],
517
+ capabilities: granted,
518
+ origins,
519
+ };
520
+ }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Membership + Autopilot (subscription) purchase MECHANICS — the renderer-safe
3
- * pricing/eligibility engine (F10). This is the real, testable side of the
3
+ * pricing/eligibility engine. This is the real, testable side of the
4
4
  * education-only widgets in `lib/membership` / `lib/subscription`: it computes
5
5
  * member-vs-list pricing, composes a member discount with a subscription
6
6
  * (Autopilot) discount under a tenant-configurable STACKING policy, and decides
@@ -280,7 +280,7 @@ export interface MemberSignedCartPayloadOptions {
280
280
 
281
281
  /**
282
282
  * Build a signed add-to-cart payload whose price is the MEMBER-ADJUSTED effective
283
- * price for the resolved shopper (F11b) — never the raw list price. The effective
283
+ * price for the resolved shopper — never the raw list price. The effective
284
284
  * price is computed here, server-side, from {@link priceForPurchaseOption} (the
285
285
  * single signed source of truth) using the membership eligibility resolved for
286
286
  * this request, then HMAC-signed by {@link buildVariantCartPayload}.
@@ -7,7 +7,7 @@
7
7
  * gates remain non-removable.
8
8
  */
9
9
  import type { TenantConfig } from "./tenant.js";
10
- import { resolveComplianceObligations } from "./capabilities.js";
10
+ import { isRegulated } from "./compliance-obligations.js";
11
11
 
12
12
  export interface RawHtmlPolicyDecision {
13
13
  allowed: boolean;
@@ -18,9 +18,7 @@ export interface RawHtmlPolicyDecision {
18
18
  export function rawHtmlPolicy(
19
19
  tenant: Pick<TenantConfig, "siteType" | "compliance">,
20
20
  ): RawHtmlPolicyDecision {
21
- const obligations = resolveComplianceObligations(tenant);
22
- const regulated =
23
- obligations.ageVerification.required || obligations.exciseTax.required;
21
+ const regulated = isRegulated(tenant);
24
22
 
25
23
  if (regulated) {
26
24
  return {