@tokenoftrust/storefront-runner 1.4.2-rc.0 → 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 (363) hide show
  1. package/apps/storefront/astro.config.mjs +3 -3
  2. package/apps/storefront/env.d.ts +54 -5
  3. package/apps/storefront/integrations/materialize-guard.mjs +12 -14
  4. package/apps/storefront/migrations-apps/0004_deep_morph.sql +36 -0
  5. package/apps/storefront/migrations-apps/0005_common_mystique.sql +23 -0
  6. package/apps/storefront/migrations-apps/0006_broad_microchip.sql +16 -0
  7. package/apps/storefront/migrations-apps/0007_brave_outlaw_kid.sql +15 -0
  8. package/apps/storefront/migrations-apps/0008_blue_dazzler.sql +11 -0
  9. package/apps/storefront/migrations-apps/0009_bored_shinobi_shaw.sql +15 -0
  10. package/apps/storefront/migrations-apps/0010_ws4_verified_provider_measurement.sql +35 -0
  11. package/apps/storefront/migrations-apps/meta/0004_snapshot.json +1474 -0
  12. package/apps/storefront/migrations-apps/meta/0005_snapshot.json +1617 -0
  13. package/apps/storefront/migrations-apps/meta/0006_snapshot.json +1716 -0
  14. package/apps/storefront/migrations-apps/meta/0007_snapshot.json +1812 -0
  15. package/apps/storefront/migrations-apps/meta/0008_snapshot.json +1881 -0
  16. package/apps/storefront/migrations-apps/meta/0009_snapshot.json +1979 -0
  17. package/apps/storefront/migrations-apps/meta/_journal.json +42 -0
  18. package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
  19. package/apps/storefront/public/platform/amplitude-http/v1/entry.mjs +19 -0
  20. package/apps/storefront/public/platform/google-measurement/v1/entry.mjs +19 -0
  21. package/apps/storefront/public/shared/commerce-chrome.css +20 -2
  22. package/apps/storefront/scripts/build-v84-clean-clone-standalone.mjs +68 -0
  23. package/apps/storefront/scripts/deny-v84-clean-clone-standalone-capabilities.mjs +111 -0
  24. package/apps/storefront/scripts/deny-v84-dogfood-capabilities.mjs +2 -0
  25. package/apps/storefront/scripts/deny-v84-lifecycle-capabilities.mjs +247 -0
  26. package/apps/storefront/scripts/dogfood-v84-nonportable-routes.ts +73 -0
  27. package/apps/storefront/scripts/fixed-v84-native-install-producer.ts +79 -0
  28. package/apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs +10982 -0
  29. package/apps/storefront/scripts/import-v84-through-ws2.ts +38 -0
  30. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling-dependency.ts +2 -0
  31. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling.ts +4 -0
  32. package/apps/storefront/scripts/install-v84-native-through-ws1.ts +185 -0
  33. package/apps/storefront/scripts/prove-clone-isolation.ts +506 -0
  34. package/apps/storefront/scripts/replay-v84-clean-clone-pass.ts +148 -0
  35. package/apps/storefront/scripts/replay-v84-clean-clone-standalone.ts +35 -0
  36. package/apps/storefront/scripts/replay-v84-clean-clone.ts +214 -0
  37. package/apps/storefront/scripts/run-fixed-v84-native-install-producer.mjs +18 -0
  38. package/apps/storefront/scripts/run-v84-clone-isolation-proof.mjs +18 -0
  39. package/apps/storefront/scripts/run-v84-clone-lifecycle-proof.mjs +18 -0
  40. package/apps/storefront/scripts/run-v84-import-through-ws2-proof.mjs +17 -0
  41. package/apps/storefront/scripts/run-v84-nonportable-route-dogfood.mjs +15 -0
  42. package/apps/storefront/scripts/sanitize-v84-proof-environment.mjs +21 -0
  43. package/apps/storefront/scripts/v84CleanCloneGraphPin.ts +42 -0
  44. package/apps/storefront/scripts/v84CleanCloneSourceGraph.ts +145 -0
  45. package/apps/storefront/scripts/validate-v84-clone-lifecycle.ts +18 -0
  46. package/apps/storefront/src/components/Img.astro +1 -1
  47. package/apps/storefront/src/components/admin/AdminBlogTab.astro +19 -16
  48. package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
  49. package/apps/storefront/src/components/admin/AdminPublishTab.astro +1057 -412
  50. package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
  51. package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
  52. package/apps/storefront/src/components/chrome/NavDropdown.astro +12 -0
  53. package/apps/storefront/src/components/chrome/SiteFooter.astro +7 -2
  54. package/apps/storefront/src/components/chrome/SiteHeader.astro +46 -10
  55. package/apps/storefront/src/components/compliance/AdultSignatureNotice.astro +1 -1
  56. package/apps/storefront/src/components/compliance/ComplianceNotice.astro +1 -2
  57. package/apps/storefront/src/components/compliance/ExciseTaxNotice.astro +1 -2
  58. package/apps/storefront/src/components/compliance/PactActNotice.astro +1 -1
  59. package/apps/storefront/src/components/compliance/Prop65Warning.astro +1 -2
  60. package/apps/storefront/src/components/compliance/PurchaseLimitNotice.astro +2 -3
  61. package/apps/storefront/src/components/compliance/ShippingRestrictionNotice.astro +2 -2
  62. package/apps/storefront/src/components/compliance/StateEligibilityNotice.astro +2 -3
  63. package/apps/storefront/src/components/content/TrustStrip.astro +4 -4
  64. package/apps/storefront/src/components/islands/MobileNav.tsx +26 -1
  65. package/apps/storefront/src/components/islands/VariantSelector.tsx +27 -2
  66. package/apps/storefront/src/components/islands/useCheckoutHandoffCorrelation.ts +75 -0
  67. package/apps/storefront/src/components/membership/IllustrativeLabel.astro +1 -2
  68. package/apps/storefront/src/components/membership/TierCards.astro +2 -2
  69. package/apps/storefront/src/components/membership/TierComparisonTable.astro +2 -2
  70. package/apps/storefront/src/components/subscription/SavingsExplainer.astro +2 -2
  71. package/apps/storefront/src/config/adminTenantLookup.ts +35 -0
  72. package/apps/storefront/src/config/devTenantSeed.ts +9 -9
  73. package/apps/storefront/src/config/resolver.ts +4 -4
  74. package/apps/storefront/src/layouts/Layout.astro +100 -20
  75. package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
  76. package/apps/storefront/src/lib/activity/changeActorAttribution.ts +86 -6
  77. package/apps/storefront/src/lib/activity/deployVersion.ts +1 -1
  78. package/apps/storefront/src/lib/admin/adminShell.ts +2 -0
  79. package/apps/storefront/src/lib/admin/envelope.ts +1 -2
  80. package/apps/storefront/src/lib/apps/adminService.ts +10 -0
  81. package/apps/storefront/src/lib/apps/adminSession.ts +1 -1
  82. package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
  83. package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
  84. package/apps/storefront/src/lib/apps/gtmMigrationInstall.ts +447 -0
  85. package/apps/storefront/src/lib/apps/gtmMigrationReport.ts +367 -0
  86. package/apps/storefront/src/lib/apps/gtmMigrationTab.ts +315 -0
  87. package/apps/storefront/src/lib/apps/integrationLifecycle.ts +614 -0
  88. package/apps/storefront/src/lib/apps/integrationLifecycleController.ts +125 -0
  89. package/apps/storefront/src/lib/apps/integrationReadModel.ts +563 -0
  90. package/apps/storefront/src/lib/apps/integrationsTab.ts +547 -0
  91. package/apps/storefront/src/lib/apps/integrationsView.ts +106 -0
  92. package/apps/storefront/src/lib/apps/managedAnalyticsService.ts +599 -0
  93. package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
  94. package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +8 -0
  95. package/apps/storefront/src/lib/apps/orders/ordersStore.ts +1 -1
  96. package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
  97. package/apps/storefront/src/lib/apps/registryService.ts +264 -10
  98. package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
  99. package/apps/storefront/src/lib/apps/v84CleanCloneReplayContext.ts +16 -0
  100. package/apps/storefront/src/lib/apps/v84CloneLifecycleCacheEvidence.ts +105 -0
  101. package/apps/storefront/src/lib/apps/v84CloneLifecycleEvidence.ts +177 -0
  102. package/apps/storefront/src/lib/apps/v84CloneLifecycleMaterialization.ts +251 -0
  103. package/apps/storefront/src/lib/apps/v84CloneLifecycleSemantics.ts +241 -0
  104. package/apps/storefront/src/lib/apps/v84CloneMigrationEvidence.ts +211 -0
  105. package/apps/storefront/src/lib/apps/v84CloneNativeInstallEvidence.ts +409 -0
  106. package/apps/storefront/src/lib/apps/v84NonportableCodeCoaching.ts +368 -0
  107. package/apps/storefront/src/lib/apps/v84NonportableRouteContract.ts +188 -0
  108. package/apps/storefront/src/lib/apps/v84NonportableRouteDogfood.ts +291 -0
  109. package/apps/storefront/src/lib/apps/ws1ManagedAnalyticsClient.ts +95 -0
  110. package/apps/storefront/src/lib/auth/adminApiGuard.ts +66 -0
  111. package/apps/storefront/src/lib/auth/adminEntry.ts +2 -2
  112. package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
  113. package/apps/storefront/src/lib/blog/collection.ts +97 -10
  114. package/apps/storefront/src/lib/blog/markdown.ts +1 -1
  115. package/apps/storefront/src/lib/blog/provider.ts +57 -3
  116. package/apps/storefront/src/lib/blog/types.ts +9 -9
  117. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome-assignments.example.json +6 -0
  118. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome.example.json +79 -0
  119. package/apps/storefront/src/lib/chrome/model.ts +48 -253
  120. package/apps/storefront/src/lib/chrome/navCurrent.ts +29 -0
  121. package/apps/storefront/src/lib/chrome/parseConfig.ts +18 -32
  122. package/apps/storefront/src/lib/chrome/variant.ts +39 -0
  123. package/apps/storefront/src/lib/commerce/checkoutHandoffCorrelation.ts +105 -0
  124. package/apps/storefront/src/lib/compliance/tamper-sentinel-boot.ts +152 -0
  125. package/apps/storefront/src/lib/compliance/tamper-sentinel.ts +327 -0
  126. package/apps/storefront/src/lib/content/index.ts +5 -5
  127. package/apps/storefront/src/lib/content-edit/applyDiff.ts +1 -1
  128. package/apps/storefront/src/lib/content-edit/route.ts +1 -1
  129. package/apps/storefront/src/lib/d1/catalog.ts +12 -0
  130. package/apps/storefront/src/lib/d1/schema-apps.ts +276 -0
  131. package/apps/storefront/src/lib/dev/cockpit/ask.ts +49 -0
  132. package/apps/storefront/src/lib/dev/cockpit/clickToSource.ts +71 -0
  133. package/apps/storefront/src/lib/dev/cockpit/copyCommand.ts +227 -0
  134. package/apps/storefront/src/lib/dev/cockpit/files.ts +249 -0
  135. package/apps/storefront/src/lib/dev/cockpit/hostedActivity.ts +500 -0
  136. package/apps/storefront/src/lib/dev/cockpit/infoPopover.ts +12 -0
  137. package/apps/storefront/src/lib/dev/cockpit/mcpCopy.ts +34 -0
  138. package/apps/storefront/src/lib/dev/cockpit/monitor.ts +107 -0
  139. package/apps/storefront/src/lib/dev/cockpit/stepper.ts +116 -0
  140. package/apps/storefront/src/lib/dev/cockpit/themeToggle.ts +23 -0
  141. package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
  142. package/apps/storefront/src/lib/edgeCache.ts +18 -6
  143. package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
  144. package/apps/storefront/src/lib/integration/browserEnvironment.ts +137 -0
  145. package/apps/storefront/src/lib/integration/managedInstallDeclarations.ts +72 -0
  146. package/apps/storefront/src/lib/integration/nonceStamp.ts +49 -0
  147. package/apps/storefront/src/lib/integration/tenantDeclarations.ts +116 -0
  148. package/apps/storefront/src/lib/membership/eligibility.ts +1 -1
  149. package/apps/storefront/src/lib/membership/model.ts +1 -2
  150. package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +2 -2
  151. package/apps/storefront/src/lib/newsletter/consent.ts +2 -2
  152. package/apps/storefront/src/lib/newsletter/send.ts +3 -3
  153. package/apps/storefront/src/lib/previewReload.ts +57 -1
  154. package/apps/storefront/src/lib/publish/adminPublishTab.ts +1775 -669
  155. package/apps/storefront/src/lib/publish/buildStream.ts +269 -0
  156. package/apps/storefront/src/lib/publish/collapsePersistence.ts +72 -0
  157. package/apps/storefront/src/lib/publish/lifecycleState.ts +369 -0
  158. package/apps/storefront/src/lib/publish/liveReleaseSummary.ts +29 -0
  159. package/apps/storefront/src/lib/publish/mergeDoctorOnFailure.ts +78 -0
  160. package/apps/storefront/src/lib/publish/mergeHealthBanner.ts +62 -0
  161. package/apps/storefront/src/lib/publish/mergeRowFindings.ts +124 -0
  162. package/apps/storefront/src/lib/publish/mergeSupportEscalation.ts +75 -0
  163. package/apps/storefront/src/lib/publish/publish-guard.ts +88 -0
  164. package/apps/storefront/src/lib/publish/publishFormat.ts +165 -0
  165. package/apps/storefront/src/lib/publish/publishHero.ts +177 -0
  166. package/apps/storefront/src/lib/publish/reviewRelease/changeState.ts +66 -0
  167. package/apps/storefront/src/lib/publish/reviewRelease/copy.ts +141 -0
  168. package/apps/storefront/src/lib/publish/reviewRelease/index.ts +41 -0
  169. package/apps/storefront/src/lib/publish/reviewRelease/permissions.ts +47 -0
  170. package/apps/storefront/src/lib/publish/reviewRelease/releaseState.ts +42 -0
  171. package/apps/storefront/src/lib/publish/reviewRelease/types.ts +59 -0
  172. package/apps/storefront/src/lib/publish/reviewRelease/viewModel.ts +440 -0
  173. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/actions.ts +161 -0
  174. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/controller.ts +325 -0
  175. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/render.ts +241 -0
  176. package/apps/storefront/src/lib/publish/shipWorkspace.ts +22 -3
  177. package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
  178. package/apps/storefront/src/lib/publish/streamLogConsole.ts +142 -0
  179. package/apps/storefront/src/lib/publish/versionNumber.ts +52 -0
  180. package/apps/storefront/src/lib/rawChrome.ts +125 -47
  181. package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
  182. package/apps/storefront/src/lib/seo/alternates.ts +1 -1
  183. package/apps/storefront/src/lib/social/notify.ts +4 -4
  184. package/apps/storefront/src/lib/storyblok/content-model.ts +7 -33
  185. package/apps/storefront/src/lib/storyblok/provider.ts +168 -60
  186. package/apps/storefront/src/lib/subscription/model.ts +4 -4
  187. package/apps/storefront/src/lib/the-build/provider.ts +9 -4
  188. package/apps/storefront/src/middleware/index.ts +273 -51
  189. package/apps/storefront/src/pages/[...slug].astro +9 -4
  190. package/apps/storefront/src/pages/admin/review-release.astro +265 -0
  191. package/apps/storefront/src/pages/admin/select.astro +96 -0
  192. package/apps/storefront/src/pages/admin.astro +16 -2
  193. package/apps/storefront/src/pages/api/activity.ts +8 -8
  194. package/apps/storefront/src/pages/api/admin/activity-alerts.ts +5 -20
  195. package/apps/storefront/src/pages/api/admin/orders/[id].ts +7 -2
  196. package/apps/storefront/src/pages/api/admin/orders.ts +8 -2
  197. package/apps/storefront/src/pages/api/apps/admin/gtm-migration-install.ts +174 -0
  198. package/apps/storefront/src/pages/api/apps/admin/gtm-migration.ts +96 -0
  199. package/apps/storefront/src/pages/api/apps/admin/integration-lifecycle.ts +118 -0
  200. package/apps/storefront/src/pages/api/apps/admin/integrations.ts +89 -0
  201. package/apps/storefront/src/pages/api/apps/admin/platform-adapters.ts +85 -0
  202. package/apps/storefront/src/pages/api/apps/internal/order-forward.ts +74 -2
  203. package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +77 -0
  204. package/apps/storefront/src/pages/api/compliance/tamper.ts +88 -0
  205. package/apps/storefront/src/pages/api/integrations/v1/[operation].ts +108 -0
  206. package/apps/storefront/src/pages/api/rum/vitals.ts +1 -2
  207. package/apps/storefront/src/pages/blog/[slug].astro +5 -5
  208. package/apps/storefront/src/pages/blog/author/[author].astro +3 -3
  209. package/apps/storefront/src/pages/blog/category/[category].astro +2 -2
  210. package/apps/storefront/src/pages/blog/index.astro +2 -2
  211. package/apps/storefront/src/pages/blog/tag/[tag].astro +2 -2
  212. package/apps/storefront/src/pages/cockpit.astro +61 -1362
  213. package/apps/storefront/src/pages/index.astro +10 -5
  214. package/apps/storefront/src/pages/llms.txt.ts +1 -1
  215. package/apps/storefront/src/pages/products/[handle].astro +7 -6
  216. package/apps/storefront/src/pages/sitemap.xml.ts +2 -2
  217. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +31 -27
  218. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +1 -1
  219. package/apps/storefront/src/pages/tenants/[id]/[...path].ts +38 -2
  220. package/apps/storefront/src/pages/the-build/[slug].astro +4 -4
  221. package/apps/storefront/src/pages/the-build/index.astro +2 -2
  222. package/apps/storefront/src/pages/the-build/rss.xml.ts +2 -2
  223. package/apps/storefront/src/styles/admin.css +27 -1
  224. package/apps/storefront/tsconfig.json +1 -1
  225. package/package.json +1 -1
  226. package/packages/public-runtime/package.json +2 -1
  227. package/packages/public-runtime/schemas/managed-analytics/v1/adapter-definition.schema.json +427 -0
  228. package/packages/public-runtime/schemas/managed-analytics/v1/create-integration-install-request.schema.json +161 -0
  229. package/packages/public-runtime/schemas/managed-analytics/v1/create-migration-draft-request.schema.json +157 -0
  230. package/packages/public-runtime/schemas/managed-analytics/v1/delete-integration-install-request.schema.json +84 -0
  231. package/packages/public-runtime/schemas/managed-analytics/v1/delete-migration-draft-request.schema.json +84 -0
  232. package/packages/public-runtime/schemas/managed-analytics/v1/error-envelope.schema.json +180 -0
  233. package/packages/public-runtime/schemas/managed-analytics/v1/get-adapter-definition-request.schema.json +52 -0
  234. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-install-request.schema.json +52 -0
  235. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-revision-request.schema.json +79 -0
  236. package/packages/public-runtime/schemas/managed-analytics/v1/get-migration-draft-request.schema.json +52 -0
  237. package/packages/public-runtime/schemas/managed-analytics/v1/integration-install.schema.json +167 -0
  238. package/packages/public-runtime/schemas/managed-analytics/v1/integration-revision.schema.json +208 -0
  239. package/packages/public-runtime/schemas/managed-analytics/v1/list-adapter-definitions-request.schema.json +53 -0
  240. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-installs-request.schema.json +53 -0
  241. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-revisions-request.schema.json +82 -0
  242. package/packages/public-runtime/schemas/managed-analytics/v1/migration-draft.schema.json +218 -0
  243. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-request.schema.json +52 -0
  244. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-success-envelope.schema.json +49 -0
  245. package/packages/public-runtime/schemas/managed-analytics/v1/read-request.schema.json +20 -0
  246. package/packages/public-runtime/schemas/managed-analytics/v1/read-success-envelope.schema.json +45 -0
  247. package/packages/public-runtime/schemas/managed-analytics/v1/revise-integration-install-request.schema.json +156 -0
  248. package/packages/public-runtime/schemas/managed-analytics/v1/set-integration-install-status-request.schema.json +92 -0
  249. package/packages/public-runtime/schemas/managed-analytics/v1/update-migration-draft-request.schema.json +184 -0
  250. package/packages/public-runtime/scripts/generate-managed-analytics-api-v1-schemas.mjs +13 -0
  251. package/packages/public-runtime/src/activity/catalog.ts +41 -37
  252. package/packages/public-runtime/src/activity/event.ts +6 -6
  253. package/packages/public-runtime/src/activity/index.ts +2 -2
  254. package/packages/public-runtime/src/activity/redaction.ts +4 -4
  255. package/packages/public-runtime/src/candidate-index.ts +42 -8
  256. package/packages/public-runtime/src/checkout-orders.ts +2 -2
  257. package/packages/public-runtime/src/checkout-style-publish.ts +2 -2
  258. package/packages/public-runtime/src/checkout-style.ts +7 -7
  259. package/packages/public-runtime/src/checkout.ts +3 -3
  260. package/packages/public-runtime/src/chrome.ts +777 -0
  261. package/packages/public-runtime/src/compliance-obligations.ts +310 -0
  262. package/packages/public-runtime/src/csp.ts +99 -0
  263. package/packages/public-runtime/src/customization-runtime.ts +32 -1
  264. package/packages/public-runtime/src/destination-webhook/contract.ts +353 -0
  265. package/packages/public-runtime/src/embed-catalog.d.mts +9 -0
  266. package/packages/public-runtime/src/embed-catalog.mjs +40 -0
  267. package/packages/public-runtime/src/evidence.ts +288 -0
  268. package/packages/public-runtime/src/gtm-migration/bounds.ts +138 -0
  269. package/packages/public-runtime/src/gtm-migration/disposition-rules.ts +361 -0
  270. package/packages/public-runtime/src/gtm-migration/dispositions.ts +181 -0
  271. package/packages/public-runtime/src/gtm-migration/draft-generator.ts +400 -0
  272. package/packages/public-runtime/src/gtm-migration/graph.ts +468 -0
  273. package/packages/public-runtime/src/gtm-migration/index.ts +95 -0
  274. package/packages/public-runtime/src/gtm-migration/parse.ts +410 -0
  275. package/packages/public-runtime/src/gtm-migration/references.ts +266 -0
  276. package/packages/public-runtime/src/gtm-migration/types.ts +86 -0
  277. package/packages/public-runtime/src/index.ts +16 -1
  278. package/packages/public-runtime/src/integration/assurance-decision.ts +259 -0
  279. package/packages/public-runtime/src/integration/assurance.ts +228 -0
  280. package/packages/public-runtime/src/integration/candidate-evidence.ts +377 -0
  281. package/packages/public-runtime/src/integration/commerce-broker.ts +497 -0
  282. package/packages/public-runtime/src/integration/consent-broker.ts +337 -0
  283. package/packages/public-runtime/src/integration/consent-cmp-demand.ts +115 -0
  284. package/packages/public-runtime/src/integration/consent-config.ts +260 -0
  285. package/packages/public-runtime/src/integration/consent-preview.ts +125 -0
  286. package/packages/public-runtime/src/integration/correlation-token.ts +444 -0
  287. package/packages/public-runtime/src/integration/csp-compiler.ts +267 -0
  288. package/packages/public-runtime/src/integration/csp.ts +105 -0
  289. package/packages/public-runtime/src/integration/digest.ts +43 -0
  290. package/packages/public-runtime/src/integration/environment.ts +228 -0
  291. package/packages/public-runtime/src/integration/events-catalog.ts +186 -0
  292. package/packages/public-runtime/src/integration/events.ts +701 -0
  293. package/packages/public-runtime/src/integration/g2-action-boundary.ts +106 -0
  294. package/packages/public-runtime/src/integration/index.ts +90 -0
  295. package/packages/public-runtime/src/integration/interim-bridge.ts +138 -0
  296. package/packages/public-runtime/src/integration/lifecycle-boot.ts +317 -0
  297. package/packages/public-runtime/src/integration/lifecycle-runtime.ts +393 -0
  298. package/packages/public-runtime/src/integration/lifecycle.ts +94 -0
  299. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.d.mts +2 -0
  300. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.mjs +10 -0
  301. package/packages/public-runtime/src/integration/managed-analytics-api-v1.schemas.ts +382 -0
  302. package/packages/public-runtime/src/integration/managed-analytics-api-v1.ts +684 -0
  303. package/packages/public-runtime/src/integration/managed-analytics-bridge.ts +383 -0
  304. package/packages/public-runtime/src/integration/managed-analytics-value-safety.ts +14 -0
  305. package/packages/public-runtime/src/integration/managed-analytics.ts +277 -0
  306. package/packages/public-runtime/src/integration/manifest.ts +470 -0
  307. package/packages/public-runtime/src/integration/native-amplitude.ts +362 -0
  308. package/packages/public-runtime/src/integration/native-ga4.ts +352 -0
  309. package/packages/public-runtime/src/integration/observability.ts +451 -0
  310. package/packages/public-runtime/src/integration/order-conversion.ts +0 -0
  311. package/packages/public-runtime/src/integration/phases.ts +182 -0
  312. package/packages/public-runtime/src/integration/plan.ts +112 -0
  313. package/packages/public-runtime/src/integration/platform-adapter-runtime.ts +146 -0
  314. package/packages/public-runtime/src/integration/platform-adapters.ts +671 -0
  315. package/packages/public-runtime/src/integration/promotion-gate.ts +451 -0
  316. package/packages/public-runtime/src/integration/provider-checkout-extension.ts +425 -0
  317. package/packages/public-runtime/src/integration/receipt-measurement.ts +370 -0
  318. package/packages/public-runtime/src/integration/regulated-parent-cert.ts +311 -0
  319. package/packages/public-runtime/src/integration/render-phases.ts +267 -0
  320. package/packages/public-runtime/src/integration/resolve.ts +465 -0
  321. package/packages/public-runtime/src/integration/result.ts +239 -0
  322. package/packages/public-runtime/src/integration/secrets.ts +92 -0
  323. package/packages/public-runtime/src/integration/tamper-evidence.ts +205 -0
  324. package/packages/public-runtime/src/integration/tamper-recovery.ts +127 -0
  325. package/packages/public-runtime/src/integration/version.ts +92 -0
  326. package/packages/public-runtime/src/integration-capabilities.ts +520 -0
  327. package/packages/public-runtime/src/membership.ts +2 -2
  328. package/packages/public-runtime/src/raw-html-policy.ts +2 -4
  329. package/packages/public-runtime/src/regulated-commerce/broker/consent-dedupe.ts +144 -0
  330. package/packages/public-runtime/src/regulated-commerce/correlation/contract.ts +177 -0
  331. package/packages/public-runtime/src/regulated-commerce/diagnostics/local-dispatch.ts +24 -0
  332. package/packages/public-runtime/src/regulated-commerce/diagnostics/read-model.ts +69 -0
  333. package/packages/public-runtime/src/regulated-commerce/dispatch/core.ts +134 -0
  334. package/packages/public-runtime/src/regulated-commerce/events/contract.ts +113 -0
  335. package/packages/public-runtime/src/regulated-commerce/ledger/core.ts +81 -0
  336. package/packages/public-runtime/src/regulated-commerce/mappings/ga4-ads.ts +87 -0
  337. package/packages/public-runtime/src/regulated-commerce/provider-order/bridge.ts +52 -0
  338. package/packages/public-runtime/src/regulated-commerce/purchase-truth/contract.ts +252 -0
  339. package/packages/public-runtime/src/regulated-commerce/sources/accepted-browser-operation.ts +67 -0
  340. package/packages/public-runtime/src/regulated-commerce/testing/fake-destination.ts +93 -0
  341. package/packages/public-runtime/src/static-bundle.ts +5 -5
  342. package/packages/public-runtime/src/tenant-assets.ts +143 -4
  343. package/packages/public-runtime/src/tenant.ts +45 -9
  344. package/packages/public-runtime/tests/fixtures/integration/browser-environment.example.json +8 -0
  345. package/packages/public-runtime/tests/fixtures/integration/commerce-event.example.json +44 -0
  346. package/packages/public-runtime/tests/fixtures/integration/commerce-order-event.example.json +44 -0
  347. package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json +50 -0
  348. package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json +120 -0
  349. package/packages/public-runtime/tests/fixtures/integration/managed-analytics-v1/fake-adapter-catalog.json +35 -0
  350. package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json +11 -0
  351. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/README.md +22 -0
  352. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/entry.js +30 -0
  353. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/manifest.json +75 -0
  354. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/public-config.json +3 -0
  355. package/packages/public-runtime/tests/fixtures/regulated-commerce/fake-destinations.ts +38 -0
  356. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.provenance.json +29 -0
  357. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json +3397 -0
  358. package/scripts/dev/file-browser.mjs +2 -2
  359. package/scripts/dev/file-writer.mjs +2 -2
  360. package/scripts/dev/integration-guardrails.mjs +498 -0
  361. package/scripts/dev/safe-path.mjs +2 -2
  362. package/scripts/dev/tenant-source-root.mjs +1 -1
  363. package/scripts/tot-dev.mjs +2 -2
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Versioned tenant static-asset store (decision `assets-r2-versioned`).
2
+ * Versioned tenant static-asset store.
3
3
  *
4
4
  * Tenant static assets (`tenants/<id>/public/**` — logo, CSS, ~36 binaries) are
5
5
  * served from **R2, version-scoped**, replacing the build-time
@@ -275,6 +275,46 @@ export interface IngestResult {
275
275
  count: number;
276
276
  }
277
277
 
278
+ const R2_PUT_MAX_ATTEMPTS = 3;
279
+ const R2_PUT_RETRY_DELAYS_MS = [100, 400] as const;
280
+
281
+ function errorField(error: unknown, field: string): unknown {
282
+ if (typeof error !== "object" || error === null || !(field in error)) return undefined;
283
+ return (error as Record<string, unknown>)[field];
284
+ }
285
+
286
+ function isTransientR2PutError(error: unknown): boolean {
287
+ const code = String(errorField(error, "code") ?? "");
288
+ const status = Number(errorField(error, "status") ?? errorField(error, "statusCode"));
289
+ const message = error instanceof Error ? error.message : String(error);
290
+ return (
291
+ code === "10001" ||
292
+ code === "InternalError" ||
293
+ (Number.isFinite(status) && status >= 500 && status <= 599) ||
294
+ /\b10001\b|internal error|temporarily unavailable|service unavailable|timed? out/i.test(message)
295
+ );
296
+ }
297
+
298
+ function waitForR2Retry(ms: number): Promise<void> {
299
+ return new Promise((resolve) => setTimeout(resolve, ms));
300
+ }
301
+
302
+ async function putAssetWithRetry(
303
+ bucket: R2BucketLike,
304
+ key: string,
305
+ bytes: Uint8Array,
306
+ ): Promise<void> {
307
+ for (let attempt = 1; attempt <= R2_PUT_MAX_ATTEMPTS; attempt++) {
308
+ try {
309
+ await bucket.put(key, bytes);
310
+ return;
311
+ } catch (error) {
312
+ if (attempt === R2_PUT_MAX_ATTEMPTS || !isTransientR2PutError(error)) throw error;
313
+ await waitForR2Retry(R2_PUT_RETRY_DELAYS_MS[attempt - 1]!);
314
+ }
315
+ }
316
+ }
317
+
278
318
  /**
279
319
  * Write a version's public assets to R2 under `tenants/<id>/<versionId>/<rel>`.
280
320
  * Content-addressed by the (caller-supplied or computed) snapshot id → immutable
@@ -294,7 +334,9 @@ export async function ingestAssetVersion(
294
334
  const keys: string[] = [];
295
335
  for (const a of assets) {
296
336
  const key = tenantAssetKey(tenantId, vid, a.rel);
297
- await bucket.put(key, a.bytes);
337
+ // The key and bytes are immutable for this version, so retrying an ambiguous
338
+ // transient R2 failure is idempotent even if the first write landed server-side.
339
+ await putAssetWithRetry(bucket, key, a.bytes);
298
340
  keys.push(key);
299
341
  }
300
342
  return { versionId: vid, keys, count: keys.length };
@@ -411,6 +453,16 @@ export interface ServeTenantAssetDeps {
411
453
  kvGet: (key: string) => Promise<string | null>;
412
454
  /** Channel to serve; default "live". Pass `locals.customizationEnv`. */
413
455
  channel?: CustomizationEnv;
456
+ /**
457
+ * Explicit snapshot versionId that OVERRIDES the channel→version pointer. Set for
458
+ * a CANDIDATE preview session: a candidate's assets are ingested to R2 keyed by
459
+ * the candidate versionId but NEVER pointed to by the shared test/live channel
460
+ * (the no-channel-flip invariant), so without this the candidate's NEW assets are
461
+ * materialized-but-unreachable. The caller must have authorized the viewer for
462
+ * THIS tenant (the versionId is a content hash, tenant-scoped by the R2 key) —
463
+ * see the `/tenants/<id>` route's preview-token check.
464
+ */
465
+ versionId?: string;
414
466
  /** Request `If-None-Match` header, for conditional GET (304). */
415
467
  ifNoneMatch?: string | null;
416
468
  }
@@ -434,8 +486,13 @@ export async function serveTenantAsset(
434
486
  if (!parsed) return null;
435
487
  const { tenantId, rel } = parsed;
436
488
 
437
- const pointer = await readAssetsPointer({ get: deps.kvGet }, tenantId);
438
- const versionId = resolveAssetVersion(pointer, deps.channel ?? "live");
489
+ // A candidate-preview override pins the snapshot directly; otherwise resolve the
490
+ // channel→version pointer (live/test) as usual.
491
+ let versionId = deps.versionId ?? null;
492
+ if (!versionId) {
493
+ const pointer = await readAssetsPointer({ get: deps.kvGet }, tenantId);
494
+ versionId = resolveAssetVersion(pointer, deps.channel ?? "live");
495
+ }
439
496
  if (!versionId) return null; // non-versioned tenant → fall through
440
497
 
441
498
  const etag = `"${versionId}"`;
@@ -477,3 +534,85 @@ function matchesEtag(ifNoneMatch: string, etag: string): boolean {
477
534
  .split(",")
478
535
  .some((t) => t.trim() === "*" || norm(t) === target);
479
536
  }
537
+
538
+ // ---------------------------------------------------------------------------
539
+ // Verify — fetch-confirm a version's app-asset subtree actually materialized
540
+ // ---------------------------------------------------------------------------
541
+
542
+ /** Outcome of {@link verifyMaterializedAssets}. */
543
+ export interface AssetVerificationResult {
544
+ /** App-asset objects expected to serve at this version. */
545
+ expected: number;
546
+ /** How many were confirmed present + non-empty in R2. */
547
+ verified: number;
548
+ /** The served relative paths (or artifact paths) that did NOT materialize. */
549
+ missing: string[];
550
+ /** Set when the verification itself could not run (fail-closed, not a pass). */
551
+ error?: string;
552
+ }
553
+
554
+ /** How many R2 existence probes run at once — matches the runtime's ~6/host reality. */
555
+ const VERIFY_PROBE_POOL = 6;
556
+
557
+ /**
558
+ * Confirm every app-asset artifact path is present + non-empty in R2 at
559
+ * `versionId` — the EXACT object `serveTenantAsset` streams for `/tenants/<id>/<rel>`.
560
+ * Positive, fail-closed evidence for the version-scoped asset lane: an asset whose
561
+ * path can't normalize to a served rel, or is absent/empty in R2, is reported
562
+ * `missing`; a systemic fault (the bucket throwing on every probe) reports the whole
563
+ * subtree missing with an `error` rather than a vacuous pass. Checking the object at
564
+ * the published `versionId` (not an HTTP self-fetch) is channel-independent: the
565
+ * served route may resolve a different channel→version pointer per request, but a
566
+ * version's bytes are fixed. `bucket` needs only `get`; the body is never read.
567
+ */
568
+ export async function verifyMaterializedAssets(
569
+ bucket: Pick<R2BucketLike, "get">,
570
+ tenantId: string,
571
+ versionId: string,
572
+ appAssetArtifactPaths: readonly string[],
573
+ ): Promise<AssetVerificationResult> {
574
+ const expected = appAssetArtifactPaths.length;
575
+ if (expected === 0) return { expected: 0, verified: 0, missing: [] };
576
+
577
+ try {
578
+ const missing: string[] = [];
579
+ let verified = 0;
580
+ let next = 0;
581
+ const worker = async (): Promise<void> => {
582
+ while (next < appAssetArtifactPaths.length) {
583
+ const artifactPath = appAssetArtifactPaths[next++]!;
584
+ const rel = toPublicRel(tenantId, artifactPath);
585
+ // An app asset whose path doesn't normalize to a served rel can't serve —
586
+ // count it missing (fail-closed), labelled by its artifact path.
587
+ if (!rel) {
588
+ missing.push(artifactPath);
589
+ continue;
590
+ }
591
+ let present = false;
592
+ try {
593
+ const obj = await bucket.get(tenantAssetKey(tenantId, versionId, rel));
594
+ // Present when the object exists and (when the store reports size) is non-empty.
595
+ present = obj != null && (obj.size == null || obj.size > 0);
596
+ } catch {
597
+ present = false;
598
+ }
599
+ if (present) verified++;
600
+ else missing.push(rel);
601
+ }
602
+ };
603
+ const width = Math.max(1, Math.min(VERIFY_PROBE_POOL, appAssetArtifactPaths.length));
604
+ await Promise.all(Array.from({ length: width }, worker));
605
+ // Stable order aids diffing/readability — pool completion order is nondeterministic.
606
+ missing.sort();
607
+ return { expected, verified, missing };
608
+ } catch (err) {
609
+ // Systemic failure (e.g. the bucket seam throwing on every call): fail closed —
610
+ // report the whole subtree as unverified rather than claiming a pass.
611
+ return {
612
+ expected,
613
+ verified: 0,
614
+ missing: [...appAssetArtifactPaths],
615
+ error: err instanceof Error ? err.message : String(err),
616
+ };
617
+ }
618
+ }
@@ -8,6 +8,7 @@
8
8
  import type { ManagedCheckoutConfig } from "./checkout.js";
9
9
  import type { CapabilityConfig } from "./capabilities.js";
10
10
  import type { AutopilotConfig, MembershipProgramConfig } from "./membership.js";
11
+ import type { IntegrationDeclarationInput } from "./integration/resolve.js";
11
12
 
12
13
  /**
13
14
  * The shared semantic COLOR contract — the widget library's public API.
@@ -65,7 +66,7 @@ export interface ThemeColorTokens {
65
66
  /** Hover/active shade of `accent`. Default: a derived darken of `accent`. */
66
67
  "accent-hover"?: string;
67
68
 
68
- // --- Interaction/quality-bar extensions (unit F6). Same "always resolvable"
69
+ // --- Interaction/quality-bar extensions. Same "always resolvable"
69
70
  // contract: each carries a derived @theme-bridge default so a component may
70
71
  // read it unconditionally; a theme sets one only to brand-tune it. ---
71
72
  /** Keyboard focus-ring color (`:focus-visible` outline). Default: `accent`. */
@@ -272,7 +273,7 @@ export interface ComplianceConfig {
272
273
  export type SiteType = "commerce" | "marketing";
273
274
 
274
275
  /**
275
- * The storefront paywall mode (decision `golive-paywall-storefront-mode-enabled`).
276
+ * The storefront paywall mode.
276
277
  * `"enabled"` is the ONLY value that permits go-live; `"disabled"` (or an absent
277
278
  * `storefront.mode`) fails the paywall closed. Kept OPEN as a string union with an
278
279
  * `enabled` member so a future billing state (e.g. "trial", "past_due") can be added
@@ -286,7 +287,7 @@ export const STOREFRONT_MODE_ENABLED = "enabled" as const;
286
287
 
287
288
  /**
288
289
  * PURE paywall predicate: does this storefront mode permit go-live? True iff the
289
- * mode is exactly `"enabled"` (decision `golive-paywall-storefront-mode-enabled`).
290
+ * mode is exactly `"enabled"`.
290
291
  * Generic — takes the mode value, NEVER a domain — so there is no per-store
291
292
  * special-case. Undefined/unknown → false (fail-closed).
292
293
  */
@@ -390,6 +391,17 @@ export interface TenantConfig {
390
391
  siteType?: SiteType;
391
392
  /** Explicit feature overrides layered atop the siteType defaults. */
392
393
  features?: Partial<TenantFeatures>;
394
+ /**
395
+ * Third-party embeds this tenant is allowed to render, as provider slugs from
396
+ * the platform's `EMBED_PROVIDERS` catalog (e.g. `["pipedrive"]`) — NOT raw
397
+ * origins. The platform owns each provider's exact CSP origins; listing a slug
398
+ * here opts the tenant in, and the strict CSP then permits that embed only on
399
+ * the pages that actually contain it (see `embedCspAdditions`). A provider not
400
+ * in the catalog needs a reviewed platform addition, not a config edit — so
401
+ * this stays an auditable allow-list, never an escape hatch to arbitrary hosts.
402
+ * Declared in the tenant's platform config alongside `siteType`/`capabilities`.
403
+ */
404
+ embeds?: string[];
393
405
  /** Regulated-commerce affordances; undefined for unregulated tenants. */
394
406
  compliance?: ComplianceConfig;
395
407
  /**
@@ -431,14 +443,14 @@ export interface TenantConfig {
431
443
  commerce?: {
432
444
  checkout?: ManagedCheckoutConfig;
433
445
  /**
434
- * Autopilot (subscription) program visibility (F10). Absent → subscription
446
+ * Autopilot (subscription) program visibility. Absent → subscription
435
447
  * purchase options render wherever a product authors them (framework/dev
436
448
  * default). `enabled: false` HIDES Autopilot at launch — the first-class
437
449
  * hide-at-launch state for a tenant that isn't selling recurring orders yet.
438
450
  */
439
451
  autopilot?: AutopilotConfig;
440
452
  /**
441
- * Membership pricing program (F10): member-vs-list pricing + how a member
453
+ * Membership pricing program: member-vs-list pricing + how a member
442
454
  * discount stacks with a subscription discount. Absent/`enabled:false` → no
443
455
  * member pricing renders (the launch default; shopper membership accounts are
444
456
  * a Phase-2 managed-checkout capability).
@@ -468,10 +480,20 @@ export interface TenantConfig {
468
480
  target: string;
469
481
  /** Opt back out without removing the target. Default true when present. */
470
482
  enabled?: boolean;
483
+ /**
484
+ * Where THIS tenant's LIVE public site actually serves its `live/manifest.json`
485
+ * — the per-tenant override for the public-site freshness read-back AND the admin
486
+ * "Live Site" link (see `staticLiveManifestUrl`). Defaults to
487
+ * `https://<canonicalDomain>/manifest.json` when unset; set it only while a
488
+ * tenant's live site serves somewhere OTHER than its canonical apex (e.g. a
489
+ * pre-apex-cutover host). Per-tenant so it never bleeds across stores the way a
490
+ * single global env override would.
491
+ */
492
+ verifyUrl?: string;
471
493
  };
472
494
  /**
473
495
  * Storefront product/subscription state — the paywall the platform gates GO-LIVE
474
- * on (decision `golive-paywall-storefront-mode-enabled`). This is the storefront's
496
+ * on. This is the storefront's
475
497
  * analog of the ToT platform SDK's `apiClient.options.storefront.mode`: a per-store
476
498
  * PROPERTY set from the merchant's account/subscription, NEVER a per-domain
477
499
  * special-case in code. Go-live (the public LIVE publish, `POST /api/changes/accept`)
@@ -495,6 +517,20 @@ export interface TenantConfig {
495
517
  * (candidate create/ship/rollback) against a CLONE of a real tenant.
496
518
  */
497
519
  classification?: "internal-test";
520
+ /**
521
+ * Tenant-local browser-integration declarations (ext-kernel-09) — the tenant's
522
+ * OWN, exact-version integrations (`origin: "tenant-local"`), each a fully
523
+ * materialized {@link IntegrationDeclarationInput}: the shared browser manifest,
524
+ * the resolved public config values, and the set of asset paths present for the
525
+ * declared version. The middleware feeds these to the interim marketing bridge
526
+ * (`resolveInterimBridgePlan`), which refuses a regulated tenant and otherwise
527
+ * resolves them into the effective plan the render engine serves — so a declared
528
+ * unregulated tenant boots its integration on-by-default (consent-gated), and a
529
+ * tenant with NO declaration is byte-identical to environment-only behavior.
530
+ * Distinct from `embeds` (opt-in slugs into a platform-owned catalog): this is a
531
+ * complete self-owned declaration, not a reference into a vetted list.
532
+ */
533
+ integrations?: readonly IntegrationDeclarationInput[];
498
534
  }
499
535
 
500
536
  /**
@@ -511,7 +547,7 @@ export function isInternalTestTenant(
511
547
  }
512
548
 
513
549
  // ---------------------------------------------------------------------------
514
- // Non-premium (self-serve) tenant identity — D4.
550
+ // Non-premium (self-serve) tenant identity.
515
551
  //
516
552
  // A NEW self-serve / non-premium shop is minted with its identity anchored to a
517
553
  // per-tenant subdomain on our own Cloudflare zone: `<label>.tokenoftrust.store`.
@@ -522,7 +558,7 @@ export function isInternalTestTenant(
522
558
  // A custom `.com` is layered on LATER as an optional premium alias/upgrade
523
559
  // (`rebindPremiumDomain`), never a precondition for a preview.
524
560
  //
525
- // See docs/epics/proposed/invite-gated-auto-build.md §D4.
561
+ // See docs/epics/proposed/invite-gated-auto-build.md.
526
562
  // ---------------------------------------------------------------------------
527
563
 
528
564
  /**
@@ -574,7 +610,7 @@ export function isHostedStoreDomain(domain: string): boolean {
574
610
  }
575
611
 
576
612
  /**
577
- * Mint the identity for a NEW self-serve / non-premium tenant (D4).
613
+ * Mint the identity for a NEW self-serve / non-premium tenant.
578
614
  *
579
615
  * tenant_id == appDomain == canonicalDomain == tot_data_scope ==
580
616
  * `<label>.tokenoftrust.store`, with that single hostname as the sole `domains`
@@ -0,0 +1,8 @@
1
+ {
2
+ "$comment": "Public browser-safe example. Missing, malformed, or unknown values must never be treated as live.",
3
+ "schemaVersion": 1,
4
+ "siteSurface": "storefront",
5
+ "environment": "candidate",
6
+ "canonicalHost": "shop.example.com",
7
+ "revision": "sha256:example-non-sensitive-render-revision"
8
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$comment": "Architectural browser-event example; contains no customer identity, payment data, signed-cart material, or preview token.",
3
+ "specversion": "1.0",
4
+ "id": "01J6EXAMPLE7J6JX18R2X8P4Y5Q",
5
+ "source": "urn:tokenoftrust:storefront:site-public-example",
6
+ "type": "storefront.checkout.handoff.v1",
7
+ "subject": "cart:anonymous-session-item-set",
8
+ "time": "2026-08-28T20:15:30.000Z",
9
+ "datacontenttype": "application/json",
10
+ "dataschema": "https://schemas.tokenoftrust.example/storefront/events/checkout-handoff-v1.json",
11
+ "storefront": {
12
+ "schemaVersion": 1,
13
+ "tenant": "site_public_example",
14
+ "environment": "staged",
15
+ "siteSurface": "storefront",
16
+ "emitter": "browser",
17
+ "sequence": 7
18
+ },
19
+ "correlation": {
20
+ "id": "corr_public_01J6EXAMPLE",
21
+ "expiresAt": "2026-08-28T21:15:30.000Z"
22
+ },
23
+ "consent": {
24
+ "schemaVersion": 1,
25
+ "snapshotId": "consent_public_01J6EXAMPLE",
26
+ "eligiblePurposes": [
27
+ "essential",
28
+ "analytics"
29
+ ]
30
+ },
31
+ "data": {
32
+ "currency": "USD",
33
+ "value": "42.50",
34
+ "itemCount": 2,
35
+ "items": [
36
+ {
37
+ "productId": "product_public_example",
38
+ "variantId": "variant_public_example",
39
+ "quantity": 2,
40
+ "unitPrice": "21.25"
41
+ }
42
+ ]
43
+ }
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$comment": "Server-authoritative conversion example; emitted from a verified provider webhook, shares the handoff's correlation thread, carries no customer identity or payment data.",
3
+ "specversion": "1.0",
4
+ "id": "01J6EXAMPLEORDER9Q2K7M3ZC4T",
5
+ "source": "urn:tokenoftrust:storefront:site-public-example",
6
+ "type": "storefront.order.created.v1",
7
+ "subject": "order:external-public-example",
8
+ "time": "2026-08-28T20:31:12.000Z",
9
+ "datacontenttype": "application/json",
10
+ "dataschema": "https://schemas.tokenoftrust.example/storefront/events/order-created-v1.json",
11
+ "storefront": {
12
+ "schemaVersion": 1,
13
+ "tenant": "site_public_example",
14
+ "environment": "staged",
15
+ "siteSurface": "storefront",
16
+ "emitter": "server"
17
+ },
18
+ "correlation": {
19
+ "id": "corr_public_01J6EXAMPLE",
20
+ "expiresAt": "2026-08-28T21:15:30.000Z"
21
+ },
22
+ "consent": {
23
+ "schemaVersion": 1,
24
+ "snapshotId": "consent_public_01J6EXAMPLE",
25
+ "eligiblePurposes": [
26
+ "essential",
27
+ "analytics"
28
+ ]
29
+ },
30
+ "data": {
31
+ "orderId": "order_public_example",
32
+ "currency": "USD",
33
+ "value": "42.50",
34
+ "itemCount": 2,
35
+ "items": [
36
+ {
37
+ "productId": "product_public_example",
38
+ "variantId": "variant_public_example",
39
+ "quantity": 2,
40
+ "unitPrice": "21.25"
41
+ }
42
+ ]
43
+ }
44
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$comment": "Architectural audit example; not an authorization token or approved production schema.",
3
+ "schemaVersion": 1,
4
+ "recordId": "assurance_public_01J6EXAMPLE",
5
+ "tenantPublicId": "site_public_example",
6
+ "environment": "live",
7
+ "surface": "unregulated-marketing",
8
+ "classification": "elevated-supported",
9
+ "integration": {
10
+ "appId": "com.example.analytics-adapter",
11
+ "version": "2.1.0",
12
+ "digest": "sha256:example-immutable-package-digest",
13
+ "executionTier": "elevated-parent"
14
+ },
15
+ "declaredEffects": {
16
+ "capabilities": [
17
+ "parent-document.full",
18
+ "events.page-and-cart.anonymous"
19
+ ],
20
+ "consentPurposes": [
21
+ "analytics"
22
+ ],
23
+ "cspOrigins": [
24
+ "https://cdn.analytics.example",
25
+ "https://collect.analytics.example",
26
+ "https://pixel.analytics.example"
27
+ ],
28
+ "dataClasses": [
29
+ "public-catalog",
30
+ "anonymous-cart-summary"
31
+ ]
32
+ },
33
+ "compliance": {
34
+ "regulatedSharedRuntimeWaiver": false,
35
+ "configuredObligations": [],
36
+ "eligibleForOutsideGuarantee": true,
37
+ "protectedSurfaceEvidence": "evidence://candidate/example-assurance-proof"
38
+ },
39
+ "acknowledgement": {
40
+ "actorId": "operator_public_example",
41
+ "actorRole": "tenant-owner",
42
+ "reason": "Approved analytics integration after candidate privacy, performance, and CSP review.",
43
+ "recordedAt": "2026-08-28T20:30:00.000Z",
44
+ "expiresAt": "2027-02-28T20:30:00.000Z"
45
+ },
46
+ "rollback": {
47
+ "knownGoodVersion": "2.0.3",
48
+ "knownGoodRevision": "sha256:example-known-good-revision"
49
+ }
50
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "$comment": "Architectural example only; field names and schema URI are not approved production contracts.",
3
+ "$schema": "https://schemas.tokenoftrust.example/storefront/integration-manifest-v2.schema.json",
4
+ "schemaVersion": 2,
5
+ "app": {
6
+ "id": "com.example.analytics-adapter",
7
+ "name": "Example Analytics Adapter",
8
+ "version": "2.1.0",
9
+ "digest": "sha256:example-immutable-package-digest",
10
+ "publisher": "Example Vendor",
11
+ "supportUrl": "https://support.example.invalid/storefront"
12
+ },
13
+ "compatibility": {
14
+ "storefrontBrowserContract": ">=2.0.0 <3.0.0",
15
+ "configurationSchemaVersion": 3
16
+ },
17
+ "browser": {
18
+ "executionTier": "elevated-parent",
19
+ "entry": {
20
+ "asset": "public/apps/example-analytics/entry.v2.1.0.js",
21
+ "format": "module",
22
+ "phase": "document.deferred"
23
+ },
24
+ "contributions": [
25
+ {
26
+ "id": "consent-defaults",
27
+ "phase": "consent.defaults",
28
+ "kind": "platform-template",
29
+ "template": "consent-defaults.v1"
30
+ },
31
+ {
32
+ "id": "fallback-markup",
33
+ "phase": "body.start",
34
+ "kind": "platform-template",
35
+ "template": "vendor-fallback-frame.v1"
36
+ }
37
+ ],
38
+ "dependencies": [
39
+ {
40
+ "contribution": "entry",
41
+ "after": "consent-defaults"
42
+ }
43
+ ],
44
+ "publicConfigSchema": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "required": [
48
+ "destinationId"
49
+ ],
50
+ "properties": {
51
+ "destinationId": {
52
+ "type": "string",
53
+ "pattern": "^[A-Z0-9_-]{3,64}$",
54
+ "description": "Public vendor destination identifier; never a credential."
55
+ },
56
+ "debugInNonLive": {
57
+ "type": "boolean",
58
+ "default": false
59
+ }
60
+ }
61
+ },
62
+ "consent": {
63
+ "purposes": [
64
+ "analytics"
65
+ ],
66
+ "loadWhen": "all-declared-purposes-eligible",
67
+ "unknownState": "block"
68
+ },
69
+ "csp": {
70
+ "profiles": [],
71
+ "sources": {
72
+ "script-src": [
73
+ "https://cdn.analytics.example"
74
+ ],
75
+ "connect-src": [
76
+ "https://collect.analytics.example"
77
+ ],
78
+ "frame-src": [],
79
+ "img-src": [
80
+ "https://pixel.analytics.example"
81
+ ],
82
+ "style-src": []
83
+ }
84
+ },
85
+ "permissions": {
86
+ "events": [
87
+ "storefront.page.viewed.v1",
88
+ "storefront.product.viewed.v1",
89
+ "storefront.cart.updated.v1"
90
+ ],
91
+ "data": [
92
+ "catalog.product.public",
93
+ "cart.summary.anonymous"
94
+ ],
95
+ "actions": [],
96
+ "domIntent": "full-parent-authority-review-metadata-only"
97
+ },
98
+ "performanceBudget": {
99
+ "maxTransferredBytes": 75000,
100
+ "maxAdditionalRequests": 4,
101
+ "maxMainThreadMilliseconds": 50,
102
+ "mustBeAsyncOrDeferred": true
103
+ }
104
+ },
105
+ "server": {
106
+ "topics": [],
107
+ "secretRequirements": []
108
+ },
109
+ "assurance": {
110
+ "requestedClassification": "elevated-supported",
111
+ "regulatedTenantDefault": "disabled-until-certified"
112
+ },
113
+ "configurationMigrations": [
114
+ {
115
+ "from": 2,
116
+ "to": 3,
117
+ "migration": "migrations/public-config-2-to-3.v1.json"
118
+ }
119
+ ]
120
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "apiVersion": "v1",
3
+ "requestId": "req_fake_catalog_1",
4
+ "data": {
5
+ "items": [
6
+ {
7
+ "schemaVersion": 1,
8
+ "adapterId": "fake.metrics",
9
+ "adapterVersion": "1.0.0",
10
+ "displayName": "Fake Metrics",
11
+ "description": "A deterministic fake catalog adapter for consumers and tests.",
12
+ "availability": "available",
13
+ "configuration": [
14
+ {
15
+ "key": "datasetId",
16
+ "label": "Dataset id",
17
+ "description": "Public identifier for the fake dataset.",
18
+ "kind": "string",
19
+ "required": true
20
+ },
21
+ {
22
+ "key": "sampleRate",
23
+ "label": "Sample rate",
24
+ "description": "Integer sampling percentage.",
25
+ "kind": "integer",
26
+ "required": false
27
+ }
28
+ ],
29
+ "eventTypes": ["storefront.page.viewed.v1"],
30
+ "consentPurposes": ["analytics"],
31
+ "collectionOrigins": ["https://collector.invalid"]
32
+ }
33
+ ]
34
+ }
35
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$comment": "Canonical v1 action names are explicit authored data and are never inferred from markup or labels.",
3
+ "schemaVersion": 1,
4
+ "actions": [
5
+ { "name": "user_clicked_contact_sales_mktg" },
6
+ { "name": "user_clicked_create_account_mktg" },
7
+ { "name": "user_clicked_login_mktg" },
8
+ { "name": "user_clicked_contact_support_consumer_mktg" },
9
+ { "name": "user_clicked_contact_support_partner_mktg" }
10
+ ]
11
+ }
@@ -0,0 +1,22 @@
1
+ # Tenant-local example integration
2
+
3
+ The smallest complete, valid tenant-local integration declaration: one
4
+ `document.deferred` entry module plus one `body.start` fallback contribution,
5
+ gated on the `analytics` consent purpose and the curated `plausible` CSP
6
+ profile. It validates through `validateIntegrationManifest` — the identical
7
+ function a managed app's manifest validates through (ADR 0014 C1) — so
8
+ nothing here is a tenant-local special case.
9
+
10
+ | File | What it is |
11
+ |---|---|
12
+ | `manifest.json` | The `IntegrationManifest` — the same contract a managed app ships. |
13
+ | `public-config.json` | Resolved tenant values for `manifest.json`'s `browser.publicConfigSchema`. |
14
+ | `entry.js` | The `document.deferred` entry module (`IntegrationLifecycleModule`: `init`/`update`/`dispose`). |
15
+
16
+ Walked end to end — validate → resolve → render → boot → update → dispose →
17
+ remove — by
18
+ [`../../../integration/kernel-docs-harness.test.ts`](../../../integration/kernel-docs-harness.test.ts).
19
+ Run it with `pnpm --filter @tot/public-runtime test kernel-docs-harness`.
20
+
21
+ Full contract reference, ordering/failure guide, and removal walkthrough:
22
+ [`docs/architecture/browser-integration-kernel.md`](../../../../../../docs/architecture/browser-integration-kernel.md).