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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/apps/storefront/astro.config.mjs +3 -3
  2. package/apps/storefront/dev-plugins/tenant-hot-reload.mjs +8 -3
  3. package/apps/storefront/env.d.ts +54 -5
  4. package/apps/storefront/integrations/materialize-guard.mjs +12 -14
  5. package/apps/storefront/migrations-apps/0004_deep_morph.sql +36 -0
  6. package/apps/storefront/migrations-apps/0005_common_mystique.sql +23 -0
  7. package/apps/storefront/migrations-apps/0006_broad_microchip.sql +16 -0
  8. package/apps/storefront/migrations-apps/0007_brave_outlaw_kid.sql +15 -0
  9. package/apps/storefront/migrations-apps/0008_blue_dazzler.sql +11 -0
  10. package/apps/storefront/migrations-apps/0009_bored_shinobi_shaw.sql +15 -0
  11. package/apps/storefront/migrations-apps/0010_ws4_verified_provider_measurement.sql +35 -0
  12. package/apps/storefront/migrations-apps/meta/0004_snapshot.json +1474 -0
  13. package/apps/storefront/migrations-apps/meta/0005_snapshot.json +1617 -0
  14. package/apps/storefront/migrations-apps/meta/0006_snapshot.json +1716 -0
  15. package/apps/storefront/migrations-apps/meta/0007_snapshot.json +1812 -0
  16. package/apps/storefront/migrations-apps/meta/0008_snapshot.json +1881 -0
  17. package/apps/storefront/migrations-apps/meta/0009_snapshot.json +1979 -0
  18. package/apps/storefront/migrations-apps/meta/_journal.json +42 -0
  19. package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
  20. package/apps/storefront/public/platform/amplitude-http/v1/entry.mjs +19 -0
  21. package/apps/storefront/public/platform/google-measurement/v1/entry.mjs +19 -0
  22. package/apps/storefront/public/shared/commerce-chrome.css +20 -2
  23. package/apps/storefront/scripts/build-v84-clean-clone-standalone.mjs +68 -0
  24. package/apps/storefront/scripts/deny-v84-clean-clone-standalone-capabilities.mjs +111 -0
  25. package/apps/storefront/scripts/deny-v84-dogfood-capabilities.mjs +2 -0
  26. package/apps/storefront/scripts/deny-v84-lifecycle-capabilities.mjs +247 -0
  27. package/apps/storefront/scripts/dogfood-v84-nonportable-routes.ts +73 -0
  28. package/apps/storefront/scripts/fixed-v84-native-install-producer.ts +79 -0
  29. package/apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs +10982 -0
  30. package/apps/storefront/scripts/import-v84-through-ws2.ts +38 -0
  31. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling-dependency.ts +2 -0
  32. package/apps/storefront/scripts/initialize-v84-lifecycle-tooling.ts +4 -0
  33. package/apps/storefront/scripts/install-v84-native-through-ws1.ts +185 -0
  34. package/apps/storefront/scripts/prove-clone-isolation.ts +506 -0
  35. package/apps/storefront/scripts/replay-v84-clean-clone-pass.ts +148 -0
  36. package/apps/storefront/scripts/replay-v84-clean-clone-standalone.ts +35 -0
  37. package/apps/storefront/scripts/replay-v84-clean-clone.ts +214 -0
  38. package/apps/storefront/scripts/run-fixed-v84-native-install-producer.mjs +18 -0
  39. package/apps/storefront/scripts/run-v84-clone-isolation-proof.mjs +18 -0
  40. package/apps/storefront/scripts/run-v84-clone-lifecycle-proof.mjs +18 -0
  41. package/apps/storefront/scripts/run-v84-import-through-ws2-proof.mjs +17 -0
  42. package/apps/storefront/scripts/run-v84-nonportable-route-dogfood.mjs +15 -0
  43. package/apps/storefront/scripts/sanitize-v84-proof-environment.mjs +21 -0
  44. package/apps/storefront/scripts/v84CleanCloneGraphPin.ts +42 -0
  45. package/apps/storefront/scripts/v84CleanCloneSourceGraph.ts +145 -0
  46. package/apps/storefront/scripts/validate-v84-clone-lifecycle.ts +18 -0
  47. package/apps/storefront/src/components/Img.astro +1 -1
  48. package/apps/storefront/src/components/admin/AdminBlogTab.astro +19 -16
  49. package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
  50. package/apps/storefront/src/components/admin/AdminPublishTab.astro +1057 -412
  51. package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
  52. package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
  53. package/apps/storefront/src/components/chrome/NavDropdown.astro +12 -0
  54. package/apps/storefront/src/components/chrome/SiteFooter.astro +7 -2
  55. package/apps/storefront/src/components/chrome/SiteHeader.astro +46 -10
  56. package/apps/storefront/src/components/compliance/AdultSignatureNotice.astro +1 -1
  57. package/apps/storefront/src/components/compliance/ComplianceNotice.astro +1 -2
  58. package/apps/storefront/src/components/compliance/ExciseTaxNotice.astro +1 -2
  59. package/apps/storefront/src/components/compliance/PactActNotice.astro +1 -1
  60. package/apps/storefront/src/components/compliance/Prop65Warning.astro +1 -2
  61. package/apps/storefront/src/components/compliance/PurchaseLimitNotice.astro +2 -3
  62. package/apps/storefront/src/components/compliance/ShippingRestrictionNotice.astro +2 -2
  63. package/apps/storefront/src/components/compliance/StateEligibilityNotice.astro +2 -3
  64. package/apps/storefront/src/components/content/TrustStrip.astro +4 -4
  65. package/apps/storefront/src/components/islands/MobileNav.tsx +26 -1
  66. package/apps/storefront/src/components/islands/VariantSelector.tsx +27 -2
  67. package/apps/storefront/src/components/islands/useCheckoutHandoffCorrelation.ts +75 -0
  68. package/apps/storefront/src/components/membership/IllustrativeLabel.astro +1 -2
  69. package/apps/storefront/src/components/membership/TierCards.astro +2 -2
  70. package/apps/storefront/src/components/membership/TierComparisonTable.astro +2 -2
  71. package/apps/storefront/src/components/subscription/SavingsExplainer.astro +2 -2
  72. package/apps/storefront/src/config/adminTenantLookup.ts +35 -0
  73. package/apps/storefront/src/config/devTenantSeed.ts +9 -9
  74. package/apps/storefront/src/config/resolver.ts +18 -10
  75. package/apps/storefront/src/layouts/Layout.astro +100 -20
  76. package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
  77. package/apps/storefront/src/lib/activity/changeActorAttribution.ts +86 -6
  78. package/apps/storefront/src/lib/activity/deployVersion.ts +1 -1
  79. package/apps/storefront/src/lib/admin/adminShell.ts +2 -0
  80. package/apps/storefront/src/lib/admin/envelope.ts +1 -2
  81. package/apps/storefront/src/lib/apps/adminService.ts +10 -0
  82. package/apps/storefront/src/lib/apps/adminSession.ts +1 -1
  83. package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
  84. package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
  85. package/apps/storefront/src/lib/apps/gtmMigrationInstall.ts +447 -0
  86. package/apps/storefront/src/lib/apps/gtmMigrationReport.ts +367 -0
  87. package/apps/storefront/src/lib/apps/gtmMigrationTab.ts +315 -0
  88. package/apps/storefront/src/lib/apps/integrationLifecycle.ts +614 -0
  89. package/apps/storefront/src/lib/apps/integrationLifecycleController.ts +125 -0
  90. package/apps/storefront/src/lib/apps/integrationReadModel.ts +563 -0
  91. package/apps/storefront/src/lib/apps/integrationsTab.ts +547 -0
  92. package/apps/storefront/src/lib/apps/integrationsView.ts +106 -0
  93. package/apps/storefront/src/lib/apps/managedAnalyticsService.ts +599 -0
  94. package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
  95. package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +8 -0
  96. package/apps/storefront/src/lib/apps/orders/ordersStore.ts +1 -1
  97. package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
  98. package/apps/storefront/src/lib/apps/registryService.ts +264 -10
  99. package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
  100. package/apps/storefront/src/lib/apps/v84CleanCloneReplayContext.ts +16 -0
  101. package/apps/storefront/src/lib/apps/v84CloneLifecycleCacheEvidence.ts +105 -0
  102. package/apps/storefront/src/lib/apps/v84CloneLifecycleEvidence.ts +177 -0
  103. package/apps/storefront/src/lib/apps/v84CloneLifecycleMaterialization.ts +251 -0
  104. package/apps/storefront/src/lib/apps/v84CloneLifecycleSemantics.ts +241 -0
  105. package/apps/storefront/src/lib/apps/v84CloneMigrationEvidence.ts +211 -0
  106. package/apps/storefront/src/lib/apps/v84CloneNativeInstallEvidence.ts +409 -0
  107. package/apps/storefront/src/lib/apps/v84NonportableCodeCoaching.ts +368 -0
  108. package/apps/storefront/src/lib/apps/v84NonportableRouteContract.ts +188 -0
  109. package/apps/storefront/src/lib/apps/v84NonportableRouteDogfood.ts +291 -0
  110. package/apps/storefront/src/lib/apps/ws1ManagedAnalyticsClient.ts +95 -0
  111. package/apps/storefront/src/lib/auth/adminApiGuard.ts +66 -0
  112. package/apps/storefront/src/lib/auth/adminEntry.ts +2 -2
  113. package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
  114. package/apps/storefront/src/lib/blog/collection.ts +114 -17
  115. package/apps/storefront/src/lib/blog/markdown.ts +1 -1
  116. package/apps/storefront/src/lib/blog/provider.ts +76 -9
  117. package/apps/storefront/src/lib/blog/types.ts +9 -9
  118. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome-assignments.example.json +6 -0
  119. package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome.example.json +79 -0
  120. package/apps/storefront/src/lib/chrome/model.ts +48 -253
  121. package/apps/storefront/src/lib/chrome/navCurrent.ts +29 -0
  122. package/apps/storefront/src/lib/chrome/parseConfig.ts +18 -32
  123. package/apps/storefront/src/lib/chrome/variant.ts +39 -0
  124. package/apps/storefront/src/lib/commerce/checkoutHandoffCorrelation.ts +105 -0
  125. package/apps/storefront/src/lib/compliance/tamper-sentinel-boot.ts +152 -0
  126. package/apps/storefront/src/lib/compliance/tamper-sentinel.ts +327 -0
  127. package/apps/storefront/src/lib/content/index.ts +5 -5
  128. package/apps/storefront/src/lib/content-edit/applyDiff.ts +1 -1
  129. package/apps/storefront/src/lib/content-edit/route.ts +1 -1
  130. package/apps/storefront/src/lib/d1/catalog.ts +12 -0
  131. package/apps/storefront/src/lib/d1/schema-apps.ts +276 -0
  132. package/apps/storefront/src/lib/dev/cockpit/ask.ts +49 -0
  133. package/apps/storefront/src/lib/dev/cockpit/clickToSource.ts +71 -0
  134. package/apps/storefront/src/lib/dev/cockpit/copyCommand.ts +227 -0
  135. package/apps/storefront/src/lib/dev/cockpit/files.ts +249 -0
  136. package/apps/storefront/src/lib/dev/cockpit/hostedActivity.ts +500 -0
  137. package/apps/storefront/src/lib/dev/cockpit/infoPopover.ts +12 -0
  138. package/apps/storefront/src/lib/dev/cockpit/mcpCopy.ts +34 -0
  139. package/apps/storefront/src/lib/dev/cockpit/monitor.ts +107 -0
  140. package/apps/storefront/src/lib/dev/cockpit/stepper.ts +116 -0
  141. package/apps/storefront/src/lib/dev/cockpit/themeToggle.ts +23 -0
  142. package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
  143. package/apps/storefront/src/lib/edgeCache.ts +18 -6
  144. package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
  145. package/apps/storefront/src/lib/integration/browserEnvironment.ts +137 -0
  146. package/apps/storefront/src/lib/integration/managedInstallDeclarations.ts +72 -0
  147. package/apps/storefront/src/lib/integration/nonceStamp.ts +49 -0
  148. package/apps/storefront/src/lib/integration/tenantDeclarations.ts +116 -0
  149. package/apps/storefront/src/lib/membership/eligibility.ts +1 -1
  150. package/apps/storefront/src/lib/membership/model.ts +1 -2
  151. package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +2 -2
  152. package/apps/storefront/src/lib/newsletter/consent.ts +2 -2
  153. package/apps/storefront/src/lib/newsletter/send.ts +3 -3
  154. package/apps/storefront/src/lib/previewReload.ts +57 -1
  155. package/apps/storefront/src/lib/publish/adminPublishTab.ts +1775 -669
  156. package/apps/storefront/src/lib/publish/buildStream.ts +269 -0
  157. package/apps/storefront/src/lib/publish/collapsePersistence.ts +72 -0
  158. package/apps/storefront/src/lib/publish/lifecycleState.ts +369 -0
  159. package/apps/storefront/src/lib/publish/liveReleaseSummary.ts +29 -0
  160. package/apps/storefront/src/lib/publish/mergeDoctorOnFailure.ts +78 -0
  161. package/apps/storefront/src/lib/publish/mergeHealthBanner.ts +62 -0
  162. package/apps/storefront/src/lib/publish/mergeRowFindings.ts +124 -0
  163. package/apps/storefront/src/lib/publish/mergeSupportEscalation.ts +75 -0
  164. package/apps/storefront/src/lib/publish/publish-guard.ts +88 -0
  165. package/apps/storefront/src/lib/publish/publishFormat.ts +165 -0
  166. package/apps/storefront/src/lib/publish/publishHero.ts +177 -0
  167. package/apps/storefront/src/lib/publish/reviewRelease/changeState.ts +66 -0
  168. package/apps/storefront/src/lib/publish/reviewRelease/copy.ts +141 -0
  169. package/apps/storefront/src/lib/publish/reviewRelease/index.ts +41 -0
  170. package/apps/storefront/src/lib/publish/reviewRelease/permissions.ts +47 -0
  171. package/apps/storefront/src/lib/publish/reviewRelease/releaseState.ts +42 -0
  172. package/apps/storefront/src/lib/publish/reviewRelease/types.ts +59 -0
  173. package/apps/storefront/src/lib/publish/reviewRelease/viewModel.ts +440 -0
  174. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/actions.ts +161 -0
  175. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/controller.ts +325 -0
  176. package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/render.ts +241 -0
  177. package/apps/storefront/src/lib/publish/shipWorkspace.ts +22 -3
  178. package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
  179. package/apps/storefront/src/lib/publish/streamLogConsole.ts +142 -0
  180. package/apps/storefront/src/lib/publish/versionNumber.ts +52 -0
  181. package/apps/storefront/src/lib/rawChrome.ts +125 -47
  182. package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
  183. package/apps/storefront/src/lib/seo/alternates.ts +1 -1
  184. package/apps/storefront/src/lib/social/notify.ts +4 -4
  185. package/apps/storefront/src/lib/storyblok/content-model.ts +7 -33
  186. package/apps/storefront/src/lib/storyblok/provider.ts +203 -69
  187. package/apps/storefront/src/lib/subscription/model.ts +4 -4
  188. package/apps/storefront/src/lib/the-build/provider.ts +9 -4
  189. package/apps/storefront/src/middleware/index.ts +273 -51
  190. package/apps/storefront/src/pages/[...slug].astro +9 -4
  191. package/apps/storefront/src/pages/admin/review-release.astro +265 -0
  192. package/apps/storefront/src/pages/admin/select.astro +96 -0
  193. package/apps/storefront/src/pages/admin.astro +16 -2
  194. package/apps/storefront/src/pages/api/activity.ts +8 -8
  195. package/apps/storefront/src/pages/api/admin/activity-alerts.ts +5 -20
  196. package/apps/storefront/src/pages/api/admin/orders/[id].ts +7 -2
  197. package/apps/storefront/src/pages/api/admin/orders.ts +8 -2
  198. package/apps/storefront/src/pages/api/apps/admin/gtm-migration-install.ts +174 -0
  199. package/apps/storefront/src/pages/api/apps/admin/gtm-migration.ts +96 -0
  200. package/apps/storefront/src/pages/api/apps/admin/integration-lifecycle.ts +118 -0
  201. package/apps/storefront/src/pages/api/apps/admin/integrations.ts +89 -0
  202. package/apps/storefront/src/pages/api/apps/admin/platform-adapters.ts +85 -0
  203. package/apps/storefront/src/pages/api/apps/internal/order-forward.ts +74 -2
  204. package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +77 -0
  205. package/apps/storefront/src/pages/api/compliance/tamper.ts +88 -0
  206. package/apps/storefront/src/pages/api/integrations/v1/[operation].ts +108 -0
  207. package/apps/storefront/src/pages/api/rum/vitals.ts +1 -2
  208. package/apps/storefront/src/pages/blog/[slug].astro +5 -5
  209. package/apps/storefront/src/pages/blog/author/[author].astro +3 -3
  210. package/apps/storefront/src/pages/blog/category/[category].astro +2 -2
  211. package/apps/storefront/src/pages/blog/index.astro +2 -2
  212. package/apps/storefront/src/pages/blog/tag/[tag].astro +2 -2
  213. package/apps/storefront/src/pages/cockpit.astro +61 -1362
  214. package/apps/storefront/src/pages/index.astro +10 -5
  215. package/apps/storefront/src/pages/llms.txt.ts +1 -1
  216. package/apps/storefront/src/pages/products/[handle].astro +7 -6
  217. package/apps/storefront/src/pages/sitemap.xml.ts +2 -2
  218. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +42 -31
  219. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +8 -3
  220. package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +6 -2
  221. package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +6 -2
  222. package/apps/storefront/src/pages/style-guide/index.astro +19 -5
  223. package/apps/storefront/src/pages/tenants/[id]/[...path].ts +38 -2
  224. package/apps/storefront/src/pages/the-build/[slug].astro +4 -4
  225. package/apps/storefront/src/pages/the-build/index.astro +2 -2
  226. package/apps/storefront/src/pages/the-build/rss.xml.ts +2 -2
  227. package/apps/storefront/src/styles/admin.css +27 -1
  228. package/apps/storefront/src/themes/tenants/index.ts +19 -7
  229. package/apps/storefront/tsconfig.json +1 -1
  230. package/package.json +1 -1
  231. package/packages/public-runtime/package.json +2 -1
  232. package/packages/public-runtime/schemas/managed-analytics/v1/adapter-definition.schema.json +427 -0
  233. package/packages/public-runtime/schemas/managed-analytics/v1/create-integration-install-request.schema.json +161 -0
  234. package/packages/public-runtime/schemas/managed-analytics/v1/create-migration-draft-request.schema.json +157 -0
  235. package/packages/public-runtime/schemas/managed-analytics/v1/delete-integration-install-request.schema.json +84 -0
  236. package/packages/public-runtime/schemas/managed-analytics/v1/delete-migration-draft-request.schema.json +84 -0
  237. package/packages/public-runtime/schemas/managed-analytics/v1/error-envelope.schema.json +180 -0
  238. package/packages/public-runtime/schemas/managed-analytics/v1/get-adapter-definition-request.schema.json +52 -0
  239. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-install-request.schema.json +52 -0
  240. package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-revision-request.schema.json +79 -0
  241. package/packages/public-runtime/schemas/managed-analytics/v1/get-migration-draft-request.schema.json +52 -0
  242. package/packages/public-runtime/schemas/managed-analytics/v1/integration-install.schema.json +167 -0
  243. package/packages/public-runtime/schemas/managed-analytics/v1/integration-revision.schema.json +208 -0
  244. package/packages/public-runtime/schemas/managed-analytics/v1/list-adapter-definitions-request.schema.json +53 -0
  245. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-installs-request.schema.json +53 -0
  246. package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-revisions-request.schema.json +82 -0
  247. package/packages/public-runtime/schemas/managed-analytics/v1/migration-draft.schema.json +218 -0
  248. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-request.schema.json +52 -0
  249. package/packages/public-runtime/schemas/managed-analytics/v1/mutation-success-envelope.schema.json +49 -0
  250. package/packages/public-runtime/schemas/managed-analytics/v1/read-request.schema.json +20 -0
  251. package/packages/public-runtime/schemas/managed-analytics/v1/read-success-envelope.schema.json +45 -0
  252. package/packages/public-runtime/schemas/managed-analytics/v1/revise-integration-install-request.schema.json +156 -0
  253. package/packages/public-runtime/schemas/managed-analytics/v1/set-integration-install-status-request.schema.json +92 -0
  254. package/packages/public-runtime/schemas/managed-analytics/v1/update-migration-draft-request.schema.json +184 -0
  255. package/packages/public-runtime/scripts/generate-managed-analytics-api-v1-schemas.mjs +13 -0
  256. package/packages/public-runtime/src/activity/catalog.ts +41 -37
  257. package/packages/public-runtime/src/activity/event.ts +6 -6
  258. package/packages/public-runtime/src/activity/index.ts +2 -2
  259. package/packages/public-runtime/src/activity/redaction.ts +4 -4
  260. package/packages/public-runtime/src/candidate-index.ts +42 -8
  261. package/packages/public-runtime/src/checkout-orders.ts +2 -2
  262. package/packages/public-runtime/src/checkout-style-publish.ts +2 -2
  263. package/packages/public-runtime/src/checkout-style.ts +7 -7
  264. package/packages/public-runtime/src/checkout.ts +3 -3
  265. package/packages/public-runtime/src/chrome.ts +777 -0
  266. package/packages/public-runtime/src/compliance-obligations.ts +310 -0
  267. package/packages/public-runtime/src/csp.ts +99 -0
  268. package/packages/public-runtime/src/customization-runtime.ts +32 -1
  269. package/packages/public-runtime/src/destination-webhook/contract.ts +353 -0
  270. package/packages/public-runtime/src/embed-catalog.d.mts +9 -0
  271. package/packages/public-runtime/src/embed-catalog.mjs +40 -0
  272. package/packages/public-runtime/src/evidence.ts +288 -0
  273. package/packages/public-runtime/src/gtm-migration/bounds.ts +138 -0
  274. package/packages/public-runtime/src/gtm-migration/disposition-rules.ts +361 -0
  275. package/packages/public-runtime/src/gtm-migration/dispositions.ts +181 -0
  276. package/packages/public-runtime/src/gtm-migration/draft-generator.ts +400 -0
  277. package/packages/public-runtime/src/gtm-migration/graph.ts +468 -0
  278. package/packages/public-runtime/src/gtm-migration/index.ts +95 -0
  279. package/packages/public-runtime/src/gtm-migration/parse.ts +410 -0
  280. package/packages/public-runtime/src/gtm-migration/references.ts +266 -0
  281. package/packages/public-runtime/src/gtm-migration/types.ts +86 -0
  282. package/packages/public-runtime/src/index.ts +16 -1
  283. package/packages/public-runtime/src/integration/assurance-decision.ts +259 -0
  284. package/packages/public-runtime/src/integration/assurance.ts +228 -0
  285. package/packages/public-runtime/src/integration/candidate-evidence.ts +377 -0
  286. package/packages/public-runtime/src/integration/commerce-broker.ts +497 -0
  287. package/packages/public-runtime/src/integration/consent-broker.ts +337 -0
  288. package/packages/public-runtime/src/integration/consent-cmp-demand.ts +115 -0
  289. package/packages/public-runtime/src/integration/consent-config.ts +260 -0
  290. package/packages/public-runtime/src/integration/consent-preview.ts +125 -0
  291. package/packages/public-runtime/src/integration/correlation-token.ts +444 -0
  292. package/packages/public-runtime/src/integration/csp-compiler.ts +267 -0
  293. package/packages/public-runtime/src/integration/csp.ts +105 -0
  294. package/packages/public-runtime/src/integration/digest.ts +43 -0
  295. package/packages/public-runtime/src/integration/environment.ts +228 -0
  296. package/packages/public-runtime/src/integration/events-catalog.ts +186 -0
  297. package/packages/public-runtime/src/integration/events.ts +701 -0
  298. package/packages/public-runtime/src/integration/g2-action-boundary.ts +106 -0
  299. package/packages/public-runtime/src/integration/index.ts +90 -0
  300. package/packages/public-runtime/src/integration/interim-bridge.ts +138 -0
  301. package/packages/public-runtime/src/integration/lifecycle-boot.ts +317 -0
  302. package/packages/public-runtime/src/integration/lifecycle-runtime.ts +393 -0
  303. package/packages/public-runtime/src/integration/lifecycle.ts +94 -0
  304. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.d.mts +2 -0
  305. package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.mjs +10 -0
  306. package/packages/public-runtime/src/integration/managed-analytics-api-v1.schemas.ts +382 -0
  307. package/packages/public-runtime/src/integration/managed-analytics-api-v1.ts +684 -0
  308. package/packages/public-runtime/src/integration/managed-analytics-bridge.ts +383 -0
  309. package/packages/public-runtime/src/integration/managed-analytics-value-safety.ts +14 -0
  310. package/packages/public-runtime/src/integration/managed-analytics.ts +277 -0
  311. package/packages/public-runtime/src/integration/manifest.ts +470 -0
  312. package/packages/public-runtime/src/integration/native-amplitude.ts +362 -0
  313. package/packages/public-runtime/src/integration/native-ga4.ts +352 -0
  314. package/packages/public-runtime/src/integration/observability.ts +451 -0
  315. package/packages/public-runtime/src/integration/order-conversion.ts +0 -0
  316. package/packages/public-runtime/src/integration/phases.ts +182 -0
  317. package/packages/public-runtime/src/integration/plan.ts +112 -0
  318. package/packages/public-runtime/src/integration/platform-adapter-runtime.ts +146 -0
  319. package/packages/public-runtime/src/integration/platform-adapters.ts +671 -0
  320. package/packages/public-runtime/src/integration/promotion-gate.ts +451 -0
  321. package/packages/public-runtime/src/integration/provider-checkout-extension.ts +425 -0
  322. package/packages/public-runtime/src/integration/receipt-measurement.ts +370 -0
  323. package/packages/public-runtime/src/integration/regulated-parent-cert.ts +311 -0
  324. package/packages/public-runtime/src/integration/render-phases.ts +267 -0
  325. package/packages/public-runtime/src/integration/resolve.ts +465 -0
  326. package/packages/public-runtime/src/integration/result.ts +239 -0
  327. package/packages/public-runtime/src/integration/secrets.ts +92 -0
  328. package/packages/public-runtime/src/integration/tamper-evidence.ts +205 -0
  329. package/packages/public-runtime/src/integration/tamper-recovery.ts +127 -0
  330. package/packages/public-runtime/src/integration/version.ts +92 -0
  331. package/packages/public-runtime/src/integration-capabilities.ts +520 -0
  332. package/packages/public-runtime/src/membership.ts +2 -2
  333. package/packages/public-runtime/src/raw-html-policy.ts +2 -4
  334. package/packages/public-runtime/src/regulated-commerce/broker/consent-dedupe.ts +144 -0
  335. package/packages/public-runtime/src/regulated-commerce/correlation/contract.ts +177 -0
  336. package/packages/public-runtime/src/regulated-commerce/diagnostics/local-dispatch.ts +24 -0
  337. package/packages/public-runtime/src/regulated-commerce/diagnostics/read-model.ts +69 -0
  338. package/packages/public-runtime/src/regulated-commerce/dispatch/core.ts +134 -0
  339. package/packages/public-runtime/src/regulated-commerce/events/contract.ts +113 -0
  340. package/packages/public-runtime/src/regulated-commerce/ledger/core.ts +81 -0
  341. package/packages/public-runtime/src/regulated-commerce/mappings/ga4-ads.ts +87 -0
  342. package/packages/public-runtime/src/regulated-commerce/provider-order/bridge.ts +52 -0
  343. package/packages/public-runtime/src/regulated-commerce/purchase-truth/contract.ts +252 -0
  344. package/packages/public-runtime/src/regulated-commerce/sources/accepted-browser-operation.ts +67 -0
  345. package/packages/public-runtime/src/regulated-commerce/testing/fake-destination.ts +93 -0
  346. package/packages/public-runtime/src/static-bundle.ts +5 -5
  347. package/packages/public-runtime/src/tenant-assets.ts +143 -4
  348. package/packages/public-runtime/src/tenant.ts +136 -9
  349. package/packages/public-runtime/tests/fixtures/integration/browser-environment.example.json +8 -0
  350. package/packages/public-runtime/tests/fixtures/integration/commerce-event.example.json +44 -0
  351. package/packages/public-runtime/tests/fixtures/integration/commerce-order-event.example.json +44 -0
  352. package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json +50 -0
  353. package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json +120 -0
  354. package/packages/public-runtime/tests/fixtures/integration/managed-analytics-v1/fake-adapter-catalog.json +35 -0
  355. package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json +11 -0
  356. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/README.md +22 -0
  357. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/entry.js +30 -0
  358. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/manifest.json +75 -0
  359. package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/public-config.json +3 -0
  360. package/packages/public-runtime/tests/fixtures/regulated-commerce/fake-destinations.ts +38 -0
  361. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.provenance.json +29 -0
  362. package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json +3397 -0
  363. package/scripts/build/copy-tenant-assets.mjs +12 -5
  364. package/scripts/dev/ai-edit.mjs +2 -1
  365. package/scripts/dev/file-browser.mjs +2 -2
  366. package/scripts/dev/file-writer.mjs +2 -2
  367. package/scripts/dev/integration-guardrails.mjs +498 -0
  368. package/scripts/dev/safe-path.mjs +2 -2
  369. package/scripts/dev/tenant-source-root.mjs +3 -2
  370. package/scripts/tot-dev.mjs +5 -4
@@ -29,6 +29,48 @@
29
29
  "when": 1787403061681,
30
30
  "tag": "0003_mute_marauders",
31
31
  "breakpoints": true
32
+ },
33
+ {
34
+ "idx": 4,
35
+ "version": "6",
36
+ "when": 1787675399435,
37
+ "tag": "0004_deep_morph",
38
+ "breakpoints": true
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "version": "6",
43
+ "when": 1787993394721,
44
+ "tag": "0005_common_mystique",
45
+ "breakpoints": true
46
+ },
47
+ {
48
+ "idx": 6,
49
+ "version": "6",
50
+ "when": 1788001135182,
51
+ "tag": "0006_broad_microchip",
52
+ "breakpoints": true
53
+ },
54
+ {
55
+ "idx": 7,
56
+ "version": "6",
57
+ "when": 1788007131463,
58
+ "tag": "0007_brave_outlaw_kid",
59
+ "breakpoints": true
60
+ },
61
+ {
62
+ "idx": 8,
63
+ "version": "6",
64
+ "when": 1788199945462,
65
+ "tag": "0008_blue_dazzler",
66
+ "breakpoints": true
67
+ },
68
+ {
69
+ "idx": 9,
70
+ "version": "6",
71
+ "when": 1788226793871,
72
+ "tag": "0009_bored_shinobi_shaw",
73
+ "breakpoints": true
32
74
  }
33
75
  ]
34
76
  }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ToT Demo Analytics — the exact-version entry module for the tot.demo.analytics
3
+ * tenant-local declaration (ext-kernel-09). Served same-origin and verbatim from
4
+ * apps/storefront/public/apps/…, it is the module the integration lifecycle runtime
5
+ * dynamically imports once its `analytics` consent purpose is eligible.
6
+ *
7
+ * It exports only the lifecycle contract (init, optional update/dispose). init()
8
+ * publishes a public window marker so a preview page demonstrably proves the entry
9
+ * ran, and sends a best-effort cookieless beacon to the declared analytics origin
10
+ * (permitted by the plan's CSP connect-src). No secret, no cross-origin script.
11
+ */
12
+ const BEACON_ORIGIN = "https://demo-analytics.tokenoftrust.com";
13
+
14
+ /** Publish a frozen, public marker other page code / a preview probe can observe. */
15
+ function mark(phase) {
16
+ try {
17
+ const w = /** @type {Record<string, unknown>} */ (window);
18
+ const prior = Array.isArray(w.__TOT_DEMO_ANALYTICS__) ? w.__TOT_DEMO_ANALYTICS__ : [];
19
+ w.__TOT_DEMO_ANALYTICS__ = Object.freeze([...prior, { phase, at: Date.now() }]);
20
+ } catch {
21
+ /* a hardened window may reject the assignment — the marker is best-effort */
22
+ }
23
+ }
24
+
25
+ export function init() {
26
+ mark("init");
27
+ try {
28
+ if (typeof navigator !== "undefined" && typeof navigator.sendBeacon === "function") {
29
+ navigator.sendBeacon(`${BEACON_ORIGIN}/collect`, "tot-demo:init");
30
+ }
31
+ } catch {
32
+ /* beacon is best-effort; a blocked/offline endpoint never breaks the page */
33
+ }
34
+ }
35
+
36
+ export function update(reason) {
37
+ mark(`update:${reason}`);
38
+ }
39
+
40
+ export function dispose() {
41
+ mark("dispose");
42
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Data-only marker for the reviewed platform adapter runtime registry.
3
+ *
4
+ * This public path proves the exact versioned asset declared by the adapter is
5
+ * materialized. The lifecycle loader resolves this tuple to Storefront-owned code
6
+ * from its closed registry; this marker never imports or executes vendor code.
7
+ */
8
+ export const platformAdapterEntry = Object.freeze({
9
+ schemaVersion: 1,
10
+ origin: "platform-adapter",
11
+ executionTier: "platform-adapter",
12
+ appId: "platform.amplitude",
13
+ version: "1.0.0",
14
+ entry: Object.freeze({
15
+ url: "/platform/amplitude-http/v1/entry.mjs",
16
+ format: "module",
17
+ }),
18
+ runtime: "native-amplitude-http-v1",
19
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Reviewed same-origin marker for the native GA4 platform adapter.
3
+ *
4
+ * The lifecycle host imports this exact-version asset, verifies every field, then
5
+ * constructs the adapter from its bundled @tot/public-runtime implementation with
6
+ * host-injected fetch. This file executes no vendor code and reads no browser global.
7
+ */
8
+ export const platformAdapterEntry = Object.freeze({
9
+ schemaVersion: 1,
10
+ origin: "platform-adapter",
11
+ executionTier: "platform-adapter",
12
+ appId: "platform.google-measurement",
13
+ version: "1.0.0",
14
+ entry: Object.freeze({
15
+ url: "/platform/google-measurement/v1/entry.mjs",
16
+ format: "module",
17
+ }),
18
+ runtime: "native-ga4-v1",
19
+ });
@@ -146,6 +146,17 @@ body { overflow-x: clip; }
146
146
  font-size: .62rem; font-weight: 700; min-width: 16px; height: 16px; border-radius: var(--radius-full);
147
147
  display: grid; place-items: center; padding: 0 4px;
148
148
  }
149
+ .header-cta {
150
+ border-radius: var(--radius-full); padding: 8px 16px;
151
+ font-family: var(--font-display, inherit); font-size: .875rem; font-weight: 500;
152
+ white-space: nowrap; transition: transform .15s ease, opacity .15s ease;
153
+ }
154
+ .header-cta--primary {
155
+ background: var(--color-accent); color: var(--color-primary-contrast);
156
+ }
157
+ .header-actions .header-cta--primary:hover { color: var(--color-primary-contrast); transform: translateY(-1px); }
158
+ .header-cta--secondary, .header-cta--ghost { border: 1px solid currentColor; }
159
+ .header-actions .header-cta--secondary:hover, .header-actions .header-cta--ghost:hover { opacity: .8; }
149
160
  .hamburger { display: none; flex-direction: column; gap: 5px; background: none; border: 0; padding: 6px; }
150
161
  .hamburger span { width: 26px; height: 2px; background: var(--color-text); border-radius: 2px; }
151
162
 
@@ -346,11 +357,18 @@ a.article-card__tag:hover { text-decoration: underline; }
346
357
  .tile-grid { grid-template-columns: repeat(3, 1fr); }
347
358
  }
348
359
  @media (max-width: 860px) {
349
- .primary-nav { position: fixed; inset: 0 0 0 auto; width: min(84vw, 340px); background: var(--color-surface); box-shadow: var(--shadow-lg); transform: translateX(100%); transition: transform .25s ease; padding: 78px 20px 24px; overflow-y: auto; z-index: 120; }
350
- .primary-nav.open { transform: none; }
360
+ /* No-JS base: the primary nav stays a normal, in-flow stacked list always
361
+ visible and reachable by scroll/Tab with no script running at all. */
351
362
  .primary-nav > ul { flex-direction: column; align-items: stretch; gap: 4px; }
352
363
  .primary-nav a, .primary-nav .nav-item > a { display: block; padding: 12px 4px; border-bottom: 1px solid var(--color-border); }
353
364
  .hamburger { display: flex; }
365
+ /* Progressive enhancement only: CHROME_BEHAVIOR_JS stamps .js-nav on <html>
366
+ as soon as it runs, turning the same nav into an off-canvas drawer toggled
367
+ by the hamburger. Gating the fixed/off-screen positioning behind .js-nav
368
+ means a no-JS visitor always sees the nav in place — JS only changes its
369
+ PRESENTATION, never its reachability. */
370
+ .js-nav .primary-nav { position: fixed; inset: 0 0 0 auto; width: min(84vw, 340px); background: var(--color-surface); box-shadow: var(--shadow-lg); transform: translateX(100%); transition: transform .25s ease; padding: 78px 20px 24px; overflow-y: auto; z-index: 120; }
371
+ .js-nav .primary-nav.open { transform: none; }
354
372
  /* Mega panels: inline accordion on mobile */
355
373
  .mega { position: static; opacity: 1; visibility: visible; transform: none; box-shadow: none; border: 0; border-radius: 0; padding: 4px 4px 8px 14px; min-width: 0; }
356
374
  .mega--wide { min-width: 0; }
@@ -0,0 +1,68 @@
1
+ /** Deterministically build the committed runtime-only clean-clone replay snapshot. */
2
+ import { readFileSync, writeFileSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const scriptsDir = dirname(fileURLToPath(import.meta.url));
8
+ const storefrontDir = dirname(scriptsDir);
9
+ const repositoryRoot = resolve(storefrontDir, "../..");
10
+ const outputPath = resolve(repositoryRoot, "apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs");
11
+
12
+ export async function buildV84CleanCloneStandaloneBytes() {
13
+ const require = createRequire(import.meta.url);
14
+ const tsxRequire = createRequire(require.resolve("tsx/package.json"));
15
+ const esbuild = tsxRequire("esbuild");
16
+ if (tsxRequire("esbuild/package.json").version !== "0.28.1") {
17
+ throw new Error("The pinned standalone replay bundler changed.");
18
+ }
19
+ const fixture = readFileSync(resolve(
20
+ repositoryRoot,
21
+ "packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json",
22
+ ), "utf8");
23
+ const runtimeLoaderPath = resolve(
24
+ repositoryRoot,
25
+ "packages/public-runtime/src/integration/lifecycle-boot.ts",
26
+ );
27
+ const result = await esbuild.build({
28
+ absWorkingDir: repositoryRoot,
29
+ entryPoints: ["apps/storefront/scripts/replay-v84-clean-clone-standalone.ts"],
30
+ outfile: "apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs",
31
+ bundle: true,
32
+ write: false,
33
+ platform: "node",
34
+ format: "esm",
35
+ target: "node24",
36
+ charset: "utf8",
37
+ legalComments: "none",
38
+ sourcemap: false,
39
+ treeShaking: true,
40
+ plugins: [{
41
+ name: "remove-unused-standalone-runtime-loader",
42
+ setup(build) {
43
+ build.onLoad({ filter: /lifecycle-boot\.ts$/ }, (args) => {
44
+ if (args.path !== runtimeLoaderPath) {
45
+ throw new Error("The standalone runtime-loader removal target changed.");
46
+ }
47
+ return { contents: "export {};\n", loader: "ts" };
48
+ });
49
+ },
50
+ }],
51
+ define: { __V84_FIXED_FIXTURE_TEXT__: JSON.stringify(fixture) },
52
+ logLevel: "silent",
53
+ });
54
+ if (result.outputFiles.length !== 1) throw new Error("The standalone replay build output changed.");
55
+ const bytes = result.outputFiles[0].contents;
56
+ const source = Buffer.from(bytes).toString("utf8");
57
+ const loaderMatch = source.match(/\bimport\s*\(|\b(?:createRequire|tsImport)\s*\(/);
58
+ if (loaderMatch) {
59
+ throw new Error(`The standalone replay contains a dynamic module loader: ${loaderMatch[0]}`);
60
+ }
61
+ return bytes;
62
+ }
63
+
64
+ const invokedPath = fileURLToPath(import.meta.url) === process.argv[1];
65
+ if (invokedPath) {
66
+ if (process.argv.length !== 2) throw new Error("The standalone replay build accepts no arguments.");
67
+ writeFileSync(outputPath, await buildV84CleanCloneStandaloneBytes());
68
+ }
@@ -0,0 +1,111 @@
1
+ /** Install the no-network/no-process/no-filesystem-mutation boundary inside the attested bundle. */
2
+ import childProcess from "node:child_process";
3
+ import cluster from "node:cluster";
4
+ import dgram from "node:dgram";
5
+ import dns from "node:dns";
6
+ import fs from "node:fs";
7
+ import http from "node:http";
8
+ import http2 from "node:http2";
9
+ import https from "node:https";
10
+ import net from "node:net";
11
+ import tls from "node:tls";
12
+ import vm from "node:vm";
13
+ import workerThreads from "node:worker_threads";
14
+ import { syncBuiltinESMExports } from "node:module";
15
+
16
+ const MESSAGE = "Capability access is disabled for the fixed clean-clone replay.";
17
+ const MUTATION_MESSAGE = "Mutation capability is disabled for the fixed clean-clone replay.";
18
+
19
+ function deny() {
20
+ throw new Error(MESSAGE);
21
+ }
22
+ function denyMutation() {
23
+ throw new Error(MUTATION_MESSAGE);
24
+ }
25
+ function replace(target, name, value = deny) {
26
+ if (typeof target[name] !== "function") return;
27
+ Object.defineProperty(target, name, { configurable: false, enumerable: true, writable: false, value });
28
+ }
29
+
30
+ export async function installV84CleanCloneStandaloneCapabilityBoundary() {
31
+ replace(globalThis, "fetch");
32
+ replace(globalThis, "WebSocket");
33
+ replace(globalThis, "EventSource");
34
+ replace(globalThis, "Worker");
35
+ if (typeof process.execve === "function") replace(process, "execve");
36
+ for (const target of [http, https]) {
37
+ replace(target, "request");
38
+ replace(target, "get");
39
+ replace(target, "ClientRequest");
40
+ }
41
+ replace(http2, "connect");
42
+ replace(net, "connect");
43
+ replace(net, "createConnection");
44
+ replace(net.Socket.prototype, "connect");
45
+ replace(tls, "connect");
46
+ replace(tls.TLSSocket.prototype, "connect");
47
+ replace(dgram, "createSocket");
48
+ replace(dgram, "Socket");
49
+ for (const method of [
50
+ "lookup", "lookupService", "resolve", "resolve4", "resolve6", "resolveAny", "resolveCaa",
51
+ "resolveCname", "resolveMx", "resolveNaptr", "resolveNs", "resolvePtr", "resolveSoa", "resolveSrv",
52
+ "resolveTlsa", "resolveTxt", "reverse",
53
+ ]) {
54
+ replace(dns, method);
55
+ replace(dns.promises, method);
56
+ }
57
+ replace(dns, "Resolver");
58
+ replace(dns.promises, "Resolver");
59
+ for (const method of ["exec", "execFile", "execFileSync", "execSync", "fork", "spawn", "spawnSync"]) {
60
+ replace(childProcess, method);
61
+ }
62
+ replace(childProcess.ChildProcess.prototype, "spawn");
63
+ replace(childProcess, "ChildProcess");
64
+ replace(cluster, "fork");
65
+ for (const method of ["runInContext", "runInNewContext", "runInThisContext"]) {
66
+ replace(vm.Script.prototype, method);
67
+ }
68
+ for (const method of [
69
+ "Script", "compileFunction", "createScript", "runInContext", "runInNewContext", "runInThisContext",
70
+ ]) replace(vm, method);
71
+ replace(workerThreads, "Worker");
72
+
73
+ const WRITE_OPEN_FLAGS = fs.constants.O_WRONLY | fs.constants.O_RDWR |
74
+ fs.constants.O_CREAT | fs.constants.O_TRUNC | fs.constants.O_APPEND;
75
+ const readOnlyFlags = (flags) => typeof flags === "number"
76
+ ? (flags & WRITE_OPEN_FLAGS) === 0
77
+ : flags === "r" || flags === "rs" || flags === "sr";
78
+ const guardedOpen = (original) => function (path, flags, ...rest) {
79
+ if (!readOnlyFlags(flags)) return denyMutation();
80
+ return Reflect.apply(original, this, [path, flags, ...rest]);
81
+ };
82
+ const originalOpen = fs.open;
83
+ const originalOpenSync = fs.openSync;
84
+ const originalPromiseOpen = fs.promises.open;
85
+ const guardFileHandle = await originalPromiseOpen(process.execPath, "r");
86
+ const fileHandlePrototype = Object.getPrototypeOf(guardFileHandle);
87
+ await guardFileHandle.close();
88
+ for (const method of [
89
+ "appendFile", "appendFileSync", "chmod", "chmodSync", "chown", "chownSync",
90
+ "copyFile", "copyFileSync", "cp", "cpSync", "createWriteStream", "link", "linkSync",
91
+ "fchmod", "fchmodSync", "fchown", "fchownSync", "fdatasync", "fdatasyncSync",
92
+ "fsync", "fsyncSync", "ftruncate", "ftruncateSync", "futimes", "futimesSync",
93
+ "lchmod", "lchmodSync", "lchown", "lchownSync", "lutimes", "lutimesSync",
94
+ "mkdir", "mkdirSync", "mkdtemp", "mkdtempSync", "mkdtempDisposable",
95
+ "mkdtempDisposableSync", "openAsBlob", "rename", "renameSync", "rm", "rmSync",
96
+ "rmdir", "rmdirSync", "symlink", "symlinkSync", "truncate", "truncateSync",
97
+ "unlink", "unlinkSync", "utimes", "utimesSync", "write", "writeFile", "writeFileSync",
98
+ "writeSync", "writev", "writevSync", "FileWriteStream", "WriteStream",
99
+ ]) {
100
+ replace(fs, method, denyMutation);
101
+ replace(fs.promises, method, denyMutation);
102
+ }
103
+ for (const method of [
104
+ "appendFile", "chmod", "chown", "createWriteStream", "datasync", "sync", "truncate",
105
+ "utimes", "write", "writeFile", "writev",
106
+ ]) replace(fileHandlePrototype, method, denyMutation);
107
+ replace(fs, "open", guardedOpen(originalOpen));
108
+ replace(fs, "openSync", guardedOpen(originalOpenSync));
109
+ replace(fs.promises, "open", guardedOpen(originalPromiseOpen));
110
+ syncBuiltinESMExports();
111
+ }
@@ -0,0 +1,2 @@
1
+ /** The common v84 proof guard includes filesystem mutation denial. */
2
+ import "./deny-v84-lifecycle-capabilities.mjs";
@@ -0,0 +1,247 @@
1
+ /** Fail-closed capability prelude for the fixed offline v84 lifecycle proof. */
2
+ import childProcess from "node:child_process";
3
+ import cluster from "node:cluster";
4
+ import dgram from "node:dgram";
5
+ import dns from "node:dns";
6
+ import fs from "node:fs";
7
+ import http from "node:http";
8
+ import http2 from "node:http2";
9
+ import https from "node:https";
10
+ import net from "node:net";
11
+ import tls from "node:tls";
12
+ import vm from "node:vm";
13
+ import workerThreads from "node:worker_threads";
14
+ import { fileURLToPath } from "node:url";
15
+ import { createRequire, syncBuiltinESMExports } from "node:module";
16
+
17
+ const MESSAGE = "Capability access is disabled for the fixed lifecycle proof.";
18
+ const MUTATION_MESSAGE = "Mutation capability is disabled for the fixed nonportable-route dogfood proof.";
19
+ const PRODUCER_CAPABILITY = Symbol.for("tot.v84.lifecycle-producer-capability");
20
+ let producerAvailable = globalThis[PRODUCER_CAPABILITY] === "allow-exact-native-install-producer";
21
+ Reflect.deleteProperty(globalThis, PRODUCER_CAPABILITY);
22
+ const PRODUCER_BOOTSTRAP_PATH = fileURLToPath(
23
+ new URL("./run-fixed-v84-native-install-producer.mjs", import.meta.url),
24
+ );
25
+ const require = createRequire(import.meta.url);
26
+ const tsxRequire = createRequire(require.resolve("tsx/package.json"));
27
+ const ESBUILD_WORKER_PATH = tsxRequire.resolve("esbuild");
28
+ const ESBUILD_VERSION = tsxRequire("esbuild/package.json").version;
29
+ const ESBUILD_DEFAULT_WORKING_DIRECTORY = process.cwd();
30
+ const ESBUILD_WORKER_ENV = Object.freeze(Object.fromEntries(
31
+ Object.entries(process.env).filter(([name]) => name !== "ESBUILD_BINARY_PATH"),
32
+ ));
33
+ if (Object.prototype.hasOwnProperty.call(ESBUILD_WORKER_ENV, "ESBUILD_BINARY_PATH")) {
34
+ throw new Error("Capability guard could not sanitize the tooling environment.");
35
+ }
36
+ const NODE_EXECUTABLE = process.execPath;
37
+ const PRODUCER_TIMEOUT_MS = 20_000;
38
+ const originalSpawnSync = childProcess.spawnSync;
39
+ const OriginalWorker = workerThreads.Worker;
40
+ function deny(..._args) {
41
+ throw new Error(MESSAGE);
42
+ }
43
+ const replace = (target, name, value = deny) => {
44
+ Object.defineProperty(target, name, {
45
+ configurable: false,
46
+ enumerable: true,
47
+ writable: false,
48
+ value,
49
+ });
50
+ };
51
+
52
+ const producerArgs = Object.freeze([PRODUCER_BOOTSTRAP_PATH]);
53
+ const producerOptions = Object.freeze({
54
+ encoding: "utf8",
55
+ env: Object.freeze({}),
56
+ timeout: PRODUCER_TIMEOUT_MS,
57
+ maxBuffer: 16 * 1024 * 1024,
58
+ });
59
+ const hasExactDataProperties = (value, expected) => {
60
+ if (value === null || typeof value !== "object") return false;
61
+ const descriptors = Object.getOwnPropertyDescriptors(value);
62
+ const keys = Reflect.ownKeys(descriptors);
63
+ if (keys.length !== Reflect.ownKeys(expected).length) return false;
64
+ return keys.every((key) => {
65
+ const descriptor = descriptors[key];
66
+ return Object.prototype.hasOwnProperty.call(expected, key) &&
67
+ descriptor !== undefined && "value" in descriptor && descriptor.value === expected[key];
68
+ });
69
+ };
70
+ const guardedSpawnSync = (command, args, options) => {
71
+ try {
72
+ if (!producerAvailable) return deny();
73
+ const exactArgs = Array.isArray(args) && hasExactDataProperties(args, {
74
+ 0: PRODUCER_BOOTSTRAP_PATH,
75
+ length: 1,
76
+ });
77
+ const optionDescriptors = options !== null && typeof options === "object"
78
+ ? Object.getOwnPropertyDescriptors(options)
79
+ : {};
80
+ const env = optionDescriptors.env && "value" in optionDescriptors.env
81
+ ? optionDescriptors.env.value
82
+ : undefined;
83
+ const exactOptions = hasExactDataProperties(options, {
84
+ encoding: "utf8",
85
+ env,
86
+ timeout: PRODUCER_TIMEOUT_MS,
87
+ maxBuffer: 16 * 1024 * 1024,
88
+ }) && hasExactDataProperties(env, {});
89
+ if (command !== NODE_EXECUTABLE || !exactArgs || !exactOptions) return deny();
90
+ } catch {
91
+ return deny();
92
+ }
93
+ producerAvailable = false;
94
+ return originalSpawnSync(NODE_EXECUTABLE, [...producerArgs], {
95
+ ...producerOptions,
96
+ env: { ...producerOptions.env },
97
+ });
98
+ };
99
+ let esbuildWorkerStarted = false;
100
+ const guardedWorker = function (filename, options) {
101
+ try {
102
+ const optionDescriptors = options !== null && typeof options === "object"
103
+ ? Object.getOwnPropertyDescriptors(options)
104
+ : {};
105
+ const workerData = optionDescriptors.workerData && "value" in optionDescriptors.workerData
106
+ ? optionDescriptors.workerData.value
107
+ : undefined;
108
+ const transferList = optionDescriptors.transferList && "value" in optionDescriptors.transferList
109
+ ? optionDescriptors.transferList.value
110
+ : undefined;
111
+ const execArgv = optionDescriptors.execArgv && "value" in optionDescriptors.execArgv
112
+ ? optionDescriptors.execArgv.value
113
+ : undefined;
114
+ const dataDescriptors = workerData !== null && typeof workerData === "object"
115
+ ? Object.getOwnPropertyDescriptors(workerData)
116
+ : {};
117
+ const port = dataDescriptors.workerPort && "value" in dataDescriptors.workerPort
118
+ ? dataDescriptors.workerPort.value
119
+ : undefined;
120
+ const exact = !esbuildWorkerStarted && filename === ESBUILD_WORKER_PATH &&
121
+ port instanceof workerThreads.MessagePort &&
122
+ hasExactDataProperties(workerData, {
123
+ workerPort: port,
124
+ defaultWD: ESBUILD_DEFAULT_WORKING_DIRECTORY,
125
+ esbuildVersion: ESBUILD_VERSION,
126
+ }) &&
127
+ hasExactDataProperties(transferList, { 0: port, length: 1 }) &&
128
+ hasExactDataProperties(execArgv, { length: 0 }) &&
129
+ hasExactDataProperties(options, { workerData, transferList, execArgv });
130
+ if (!exact) return deny();
131
+ esbuildWorkerStarted = true;
132
+ return new OriginalWorker(ESBUILD_WORKER_PATH, {
133
+ workerData: {
134
+ workerPort: port,
135
+ defaultWD: ESBUILD_DEFAULT_WORKING_DIRECTORY,
136
+ esbuildVersion: ESBUILD_VERSION,
137
+ },
138
+ transferList: [port],
139
+ execArgv: [],
140
+ env: { ...ESBUILD_WORKER_ENV },
141
+ });
142
+ } catch {
143
+ return deny();
144
+ }
145
+ };
146
+
147
+ replace(globalThis, "fetch");
148
+ replace(globalThis, "WebSocket");
149
+ replace(globalThis, "EventSource");
150
+ replace(globalThis, "Worker");
151
+ if (typeof process.execve === "function") replace(process, "execve");
152
+ replace(http, "request");
153
+ replace(http, "get");
154
+ replace(http, "ClientRequest");
155
+ replace(https, "request");
156
+ replace(https, "get");
157
+ replace(http2, "connect");
158
+ replace(net, "connect");
159
+ replace(net, "createConnection");
160
+ replace(net.Socket.prototype, "connect");
161
+ replace(tls, "connect");
162
+ replace(tls.TLSSocket.prototype, "connect");
163
+ replace(dgram, "createSocket");
164
+ replace(dgram, "Socket");
165
+
166
+ const dnsMethods = [
167
+ "lookup", "lookupService", "resolve", "resolve4", "resolve6", "resolveAny",
168
+ "resolveCaa", "resolveCname", "resolveMx", "resolveNaptr", "resolveNs",
169
+ "resolvePtr", "resolveSoa", "resolveSrv", "resolveTlsa", "resolveTxt", "reverse",
170
+ ];
171
+ for (const method of dnsMethods) {
172
+ replace(dns, method);
173
+ replace(dns.promises, method);
174
+ }
175
+ replace(dns, "Resolver");
176
+ replace(dns.promises, "Resolver");
177
+
178
+ for (const method of ["exec", "execFile", "execFileSync", "execSync", "fork", "spawn"]) {
179
+ replace(childProcess, method);
180
+ }
181
+ replace(childProcess.ChildProcess.prototype, "spawn");
182
+ replace(childProcess, "ChildProcess");
183
+ replace(childProcess, "spawnSync", guardedSpawnSync);
184
+ replace(cluster, "fork");
185
+ replace(vm.Script.prototype, "runInContext");
186
+ replace(vm.Script.prototype, "runInNewContext");
187
+ replace(vm.Script.prototype, "runInThisContext");
188
+ for (const method of [
189
+ "Script", "compileFunction", "createScript", "runInContext", "runInNewContext", "runInThisContext",
190
+ ]) {
191
+ replace(vm, method);
192
+ }
193
+ replace(workerThreads, "Worker", guardedWorker);
194
+
195
+ function denyMutation(..._args) {
196
+ throw new Error(MUTATION_MESSAGE);
197
+ }
198
+ function replaceMutation(target, name, value = denyMutation) {
199
+ if (typeof target[name] !== "function") return;
200
+ Object.defineProperty(target, name, {
201
+ configurable: false,
202
+ enumerable: true,
203
+ writable: false,
204
+ value,
205
+ });
206
+ }
207
+ const WRITE_OPEN_FLAGS = fs.constants.O_WRONLY | fs.constants.O_RDWR |
208
+ fs.constants.O_CREAT | fs.constants.O_TRUNC | fs.constants.O_APPEND;
209
+ const readOnlyFlags = (flags) => typeof flags === "number"
210
+ ? (flags & WRITE_OPEN_FLAGS) === 0
211
+ : flags === "r" || flags === "rs" || flags === "sr";
212
+ const guardedOpen = (original) => function (path, flags, ...rest) {
213
+ if (!readOnlyFlags(flags)) return denyMutation();
214
+ return Reflect.apply(original, this, [path, flags, ...rest]);
215
+ };
216
+ const originalOpen = fs.open;
217
+ const originalOpenSync = fs.openSync;
218
+ const originalPromiseOpen = fs.promises.open;
219
+ const guardFileHandle = await originalPromiseOpen(fileURLToPath(import.meta.url), "r");
220
+ const fileHandlePrototype = Object.getPrototypeOf(guardFileHandle);
221
+ await guardFileHandle.close();
222
+ for (const method of [
223
+ "appendFile", "appendFileSync", "chmod", "chmodSync", "chown", "chownSync",
224
+ "copyFile", "copyFileSync", "cp", "cpSync", "createWriteStream", "link", "linkSync",
225
+ "fchmod", "fchmodSync", "fchown", "fchownSync", "fdatasync", "fdatasyncSync",
226
+ "fsync", "fsyncSync", "ftruncate", "ftruncateSync",
227
+ "futimes", "futimesSync", "lchmod", "lchmodSync", "lchown", "lchownSync",
228
+ "lutimes", "lutimesSync", "mkdir", "mkdirSync", "mkdtemp", "mkdtempSync",
229
+ "mkdtempDisposable", "mkdtempDisposableSync", "openAsBlob", "rename", "renameSync",
230
+ "rm", "rmSync", "rmdir", "rmdirSync",
231
+ "symlink", "symlinkSync", "truncate", "truncateSync", "unlink", "unlinkSync",
232
+ "utimes", "utimesSync", "write", "writeFile", "writeFileSync", "writeSync",
233
+ "writev", "writevSync", "FileWriteStream", "WriteStream",
234
+ ]) {
235
+ replaceMutation(fs, method);
236
+ replaceMutation(fs.promises, method);
237
+ }
238
+ for (const method of [
239
+ "appendFile", "chmod", "chown", "createWriteStream", "datasync", "sync", "truncate",
240
+ "utimes", "write", "writeFile", "writev",
241
+ ]) {
242
+ replaceMutation(fileHandlePrototype, method);
243
+ }
244
+ replaceMutation(fs, "open", guardedOpen(originalOpen));
245
+ replaceMutation(fs, "openSync", guardedOpen(originalOpenSync));
246
+ replaceMutation(fs.promises, "open", guardedOpen(originalPromiseOpen));
247
+ syncBuiltinESMExports();