@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.
- package/apps/storefront/astro.config.mjs +3 -3
- package/apps/storefront/env.d.ts +54 -5
- package/apps/storefront/integrations/materialize-guard.mjs +12 -14
- package/apps/storefront/migrations-apps/0004_deep_morph.sql +36 -0
- package/apps/storefront/migrations-apps/0005_common_mystique.sql +23 -0
- package/apps/storefront/migrations-apps/0006_broad_microchip.sql +16 -0
- package/apps/storefront/migrations-apps/0007_brave_outlaw_kid.sql +15 -0
- package/apps/storefront/migrations-apps/0008_blue_dazzler.sql +11 -0
- package/apps/storefront/migrations-apps/0009_bored_shinobi_shaw.sql +15 -0
- package/apps/storefront/migrations-apps/0010_ws4_verified_provider_measurement.sql +35 -0
- package/apps/storefront/migrations-apps/meta/0004_snapshot.json +1474 -0
- package/apps/storefront/migrations-apps/meta/0005_snapshot.json +1617 -0
- package/apps/storefront/migrations-apps/meta/0006_snapshot.json +1716 -0
- package/apps/storefront/migrations-apps/meta/0007_snapshot.json +1812 -0
- package/apps/storefront/migrations-apps/meta/0008_snapshot.json +1881 -0
- package/apps/storefront/migrations-apps/meta/0009_snapshot.json +1979 -0
- package/apps/storefront/migrations-apps/meta/_journal.json +42 -0
- package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
- package/apps/storefront/public/platform/amplitude-http/v1/entry.mjs +19 -0
- package/apps/storefront/public/platform/google-measurement/v1/entry.mjs +19 -0
- package/apps/storefront/public/shared/commerce-chrome.css +20 -2
- package/apps/storefront/scripts/build-v84-clean-clone-standalone.mjs +68 -0
- package/apps/storefront/scripts/deny-v84-clean-clone-standalone-capabilities.mjs +111 -0
- package/apps/storefront/scripts/deny-v84-dogfood-capabilities.mjs +2 -0
- package/apps/storefront/scripts/deny-v84-lifecycle-capabilities.mjs +247 -0
- package/apps/storefront/scripts/dogfood-v84-nonportable-routes.ts +73 -0
- package/apps/storefront/scripts/fixed-v84-native-install-producer.ts +79 -0
- package/apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs +10982 -0
- package/apps/storefront/scripts/import-v84-through-ws2.ts +38 -0
- package/apps/storefront/scripts/initialize-v84-lifecycle-tooling-dependency.ts +2 -0
- package/apps/storefront/scripts/initialize-v84-lifecycle-tooling.ts +4 -0
- package/apps/storefront/scripts/install-v84-native-through-ws1.ts +185 -0
- package/apps/storefront/scripts/prove-clone-isolation.ts +506 -0
- package/apps/storefront/scripts/replay-v84-clean-clone-pass.ts +148 -0
- package/apps/storefront/scripts/replay-v84-clean-clone-standalone.ts +35 -0
- package/apps/storefront/scripts/replay-v84-clean-clone.ts +214 -0
- package/apps/storefront/scripts/run-fixed-v84-native-install-producer.mjs +18 -0
- package/apps/storefront/scripts/run-v84-clone-isolation-proof.mjs +18 -0
- package/apps/storefront/scripts/run-v84-clone-lifecycle-proof.mjs +18 -0
- package/apps/storefront/scripts/run-v84-import-through-ws2-proof.mjs +17 -0
- package/apps/storefront/scripts/run-v84-nonportable-route-dogfood.mjs +15 -0
- package/apps/storefront/scripts/sanitize-v84-proof-environment.mjs +21 -0
- package/apps/storefront/scripts/v84CleanCloneGraphPin.ts +42 -0
- package/apps/storefront/scripts/v84CleanCloneSourceGraph.ts +145 -0
- package/apps/storefront/scripts/validate-v84-clone-lifecycle.ts +18 -0
- package/apps/storefront/src/components/Img.astro +1 -1
- package/apps/storefront/src/components/admin/AdminBlogTab.astro +19 -16
- package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
- package/apps/storefront/src/components/admin/AdminPublishTab.astro +1057 -412
- package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
- package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
- package/apps/storefront/src/components/chrome/NavDropdown.astro +12 -0
- package/apps/storefront/src/components/chrome/SiteFooter.astro +7 -2
- package/apps/storefront/src/components/chrome/SiteHeader.astro +46 -10
- package/apps/storefront/src/components/compliance/AdultSignatureNotice.astro +1 -1
- package/apps/storefront/src/components/compliance/ComplianceNotice.astro +1 -2
- package/apps/storefront/src/components/compliance/ExciseTaxNotice.astro +1 -2
- package/apps/storefront/src/components/compliance/PactActNotice.astro +1 -1
- package/apps/storefront/src/components/compliance/Prop65Warning.astro +1 -2
- package/apps/storefront/src/components/compliance/PurchaseLimitNotice.astro +2 -3
- package/apps/storefront/src/components/compliance/ShippingRestrictionNotice.astro +2 -2
- package/apps/storefront/src/components/compliance/StateEligibilityNotice.astro +2 -3
- package/apps/storefront/src/components/content/TrustStrip.astro +4 -4
- package/apps/storefront/src/components/islands/MobileNav.tsx +26 -1
- package/apps/storefront/src/components/islands/VariantSelector.tsx +27 -2
- package/apps/storefront/src/components/islands/useCheckoutHandoffCorrelation.ts +75 -0
- package/apps/storefront/src/components/membership/IllustrativeLabel.astro +1 -2
- package/apps/storefront/src/components/membership/TierCards.astro +2 -2
- package/apps/storefront/src/components/membership/TierComparisonTable.astro +2 -2
- package/apps/storefront/src/components/subscription/SavingsExplainer.astro +2 -2
- package/apps/storefront/src/config/adminTenantLookup.ts +35 -0
- package/apps/storefront/src/config/devTenantSeed.ts +9 -9
- package/apps/storefront/src/config/resolver.ts +4 -4
- package/apps/storefront/src/layouts/Layout.astro +100 -20
- package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
- package/apps/storefront/src/lib/activity/changeActorAttribution.ts +86 -6
- package/apps/storefront/src/lib/activity/deployVersion.ts +1 -1
- package/apps/storefront/src/lib/admin/adminShell.ts +2 -0
- package/apps/storefront/src/lib/admin/envelope.ts +1 -2
- package/apps/storefront/src/lib/apps/adminService.ts +10 -0
- package/apps/storefront/src/lib/apps/adminSession.ts +1 -1
- package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
- package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
- package/apps/storefront/src/lib/apps/gtmMigrationInstall.ts +447 -0
- package/apps/storefront/src/lib/apps/gtmMigrationReport.ts +367 -0
- package/apps/storefront/src/lib/apps/gtmMigrationTab.ts +315 -0
- package/apps/storefront/src/lib/apps/integrationLifecycle.ts +614 -0
- package/apps/storefront/src/lib/apps/integrationLifecycleController.ts +125 -0
- package/apps/storefront/src/lib/apps/integrationReadModel.ts +563 -0
- package/apps/storefront/src/lib/apps/integrationsTab.ts +547 -0
- package/apps/storefront/src/lib/apps/integrationsView.ts +106 -0
- package/apps/storefront/src/lib/apps/managedAnalyticsService.ts +599 -0
- package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
- package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +8 -0
- package/apps/storefront/src/lib/apps/orders/ordersStore.ts +1 -1
- package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
- package/apps/storefront/src/lib/apps/registryService.ts +264 -10
- package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
- package/apps/storefront/src/lib/apps/v84CleanCloneReplayContext.ts +16 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleCacheEvidence.ts +105 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleEvidence.ts +177 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleMaterialization.ts +251 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleSemantics.ts +241 -0
- package/apps/storefront/src/lib/apps/v84CloneMigrationEvidence.ts +211 -0
- package/apps/storefront/src/lib/apps/v84CloneNativeInstallEvidence.ts +409 -0
- package/apps/storefront/src/lib/apps/v84NonportableCodeCoaching.ts +368 -0
- package/apps/storefront/src/lib/apps/v84NonportableRouteContract.ts +188 -0
- package/apps/storefront/src/lib/apps/v84NonportableRouteDogfood.ts +291 -0
- package/apps/storefront/src/lib/apps/ws1ManagedAnalyticsClient.ts +95 -0
- package/apps/storefront/src/lib/auth/adminApiGuard.ts +66 -0
- package/apps/storefront/src/lib/auth/adminEntry.ts +2 -2
- package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
- package/apps/storefront/src/lib/blog/collection.ts +97 -10
- package/apps/storefront/src/lib/blog/markdown.ts +1 -1
- package/apps/storefront/src/lib/blog/provider.ts +57 -3
- package/apps/storefront/src/lib/blog/types.ts +9 -9
- package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome-assignments.example.json +6 -0
- package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome.example.json +79 -0
- package/apps/storefront/src/lib/chrome/model.ts +48 -253
- package/apps/storefront/src/lib/chrome/navCurrent.ts +29 -0
- package/apps/storefront/src/lib/chrome/parseConfig.ts +18 -32
- package/apps/storefront/src/lib/chrome/variant.ts +39 -0
- package/apps/storefront/src/lib/commerce/checkoutHandoffCorrelation.ts +105 -0
- package/apps/storefront/src/lib/compliance/tamper-sentinel-boot.ts +152 -0
- package/apps/storefront/src/lib/compliance/tamper-sentinel.ts +327 -0
- package/apps/storefront/src/lib/content/index.ts +5 -5
- package/apps/storefront/src/lib/content-edit/applyDiff.ts +1 -1
- package/apps/storefront/src/lib/content-edit/route.ts +1 -1
- package/apps/storefront/src/lib/d1/catalog.ts +12 -0
- package/apps/storefront/src/lib/d1/schema-apps.ts +276 -0
- package/apps/storefront/src/lib/dev/cockpit/ask.ts +49 -0
- package/apps/storefront/src/lib/dev/cockpit/clickToSource.ts +71 -0
- package/apps/storefront/src/lib/dev/cockpit/copyCommand.ts +227 -0
- package/apps/storefront/src/lib/dev/cockpit/files.ts +249 -0
- package/apps/storefront/src/lib/dev/cockpit/hostedActivity.ts +500 -0
- package/apps/storefront/src/lib/dev/cockpit/infoPopover.ts +12 -0
- package/apps/storefront/src/lib/dev/cockpit/mcpCopy.ts +34 -0
- package/apps/storefront/src/lib/dev/cockpit/monitor.ts +107 -0
- package/apps/storefront/src/lib/dev/cockpit/stepper.ts +116 -0
- package/apps/storefront/src/lib/dev/cockpit/themeToggle.ts +23 -0
- package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
- package/apps/storefront/src/lib/edgeCache.ts +18 -6
- package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
- package/apps/storefront/src/lib/integration/browserEnvironment.ts +137 -0
- package/apps/storefront/src/lib/integration/managedInstallDeclarations.ts +72 -0
- package/apps/storefront/src/lib/integration/nonceStamp.ts +49 -0
- package/apps/storefront/src/lib/integration/tenantDeclarations.ts +116 -0
- package/apps/storefront/src/lib/membership/eligibility.ts +1 -1
- package/apps/storefront/src/lib/membership/model.ts +1 -2
- package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +2 -2
- package/apps/storefront/src/lib/newsletter/consent.ts +2 -2
- package/apps/storefront/src/lib/newsletter/send.ts +3 -3
- package/apps/storefront/src/lib/previewReload.ts +57 -1
- package/apps/storefront/src/lib/publish/adminPublishTab.ts +1775 -669
- package/apps/storefront/src/lib/publish/buildStream.ts +269 -0
- package/apps/storefront/src/lib/publish/collapsePersistence.ts +72 -0
- package/apps/storefront/src/lib/publish/lifecycleState.ts +369 -0
- package/apps/storefront/src/lib/publish/liveReleaseSummary.ts +29 -0
- package/apps/storefront/src/lib/publish/mergeDoctorOnFailure.ts +78 -0
- package/apps/storefront/src/lib/publish/mergeHealthBanner.ts +62 -0
- package/apps/storefront/src/lib/publish/mergeRowFindings.ts +124 -0
- package/apps/storefront/src/lib/publish/mergeSupportEscalation.ts +75 -0
- package/apps/storefront/src/lib/publish/publish-guard.ts +88 -0
- package/apps/storefront/src/lib/publish/publishFormat.ts +165 -0
- package/apps/storefront/src/lib/publish/publishHero.ts +177 -0
- package/apps/storefront/src/lib/publish/reviewRelease/changeState.ts +66 -0
- package/apps/storefront/src/lib/publish/reviewRelease/copy.ts +141 -0
- package/apps/storefront/src/lib/publish/reviewRelease/index.ts +41 -0
- package/apps/storefront/src/lib/publish/reviewRelease/permissions.ts +47 -0
- package/apps/storefront/src/lib/publish/reviewRelease/releaseState.ts +42 -0
- package/apps/storefront/src/lib/publish/reviewRelease/types.ts +59 -0
- package/apps/storefront/src/lib/publish/reviewRelease/viewModel.ts +440 -0
- package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/actions.ts +161 -0
- package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/controller.ts +325 -0
- package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/render.ts +241 -0
- package/apps/storefront/src/lib/publish/shipWorkspace.ts +22 -3
- package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
- package/apps/storefront/src/lib/publish/streamLogConsole.ts +142 -0
- package/apps/storefront/src/lib/publish/versionNumber.ts +52 -0
- package/apps/storefront/src/lib/rawChrome.ts +125 -47
- package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
- package/apps/storefront/src/lib/seo/alternates.ts +1 -1
- package/apps/storefront/src/lib/social/notify.ts +4 -4
- package/apps/storefront/src/lib/storyblok/content-model.ts +7 -33
- package/apps/storefront/src/lib/storyblok/provider.ts +168 -60
- package/apps/storefront/src/lib/subscription/model.ts +4 -4
- package/apps/storefront/src/lib/the-build/provider.ts +9 -4
- package/apps/storefront/src/middleware/index.ts +273 -51
- package/apps/storefront/src/pages/[...slug].astro +9 -4
- package/apps/storefront/src/pages/admin/review-release.astro +265 -0
- package/apps/storefront/src/pages/admin/select.astro +96 -0
- package/apps/storefront/src/pages/admin.astro +16 -2
- package/apps/storefront/src/pages/api/activity.ts +8 -8
- package/apps/storefront/src/pages/api/admin/activity-alerts.ts +5 -20
- package/apps/storefront/src/pages/api/admin/orders/[id].ts +7 -2
- package/apps/storefront/src/pages/api/admin/orders.ts +8 -2
- package/apps/storefront/src/pages/api/apps/admin/gtm-migration-install.ts +174 -0
- package/apps/storefront/src/pages/api/apps/admin/gtm-migration.ts +96 -0
- package/apps/storefront/src/pages/api/apps/admin/integration-lifecycle.ts +118 -0
- package/apps/storefront/src/pages/api/apps/admin/integrations.ts +89 -0
- package/apps/storefront/src/pages/api/apps/admin/platform-adapters.ts +85 -0
- package/apps/storefront/src/pages/api/apps/internal/order-forward.ts +74 -2
- package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +77 -0
- package/apps/storefront/src/pages/api/compliance/tamper.ts +88 -0
- package/apps/storefront/src/pages/api/integrations/v1/[operation].ts +108 -0
- package/apps/storefront/src/pages/api/rum/vitals.ts +1 -2
- package/apps/storefront/src/pages/blog/[slug].astro +5 -5
- package/apps/storefront/src/pages/blog/author/[author].astro +3 -3
- package/apps/storefront/src/pages/blog/category/[category].astro +2 -2
- package/apps/storefront/src/pages/blog/index.astro +2 -2
- package/apps/storefront/src/pages/blog/tag/[tag].astro +2 -2
- package/apps/storefront/src/pages/cockpit.astro +61 -1362
- package/apps/storefront/src/pages/index.astro +10 -5
- package/apps/storefront/src/pages/llms.txt.ts +1 -1
- package/apps/storefront/src/pages/products/[handle].astro +7 -6
- package/apps/storefront/src/pages/sitemap.xml.ts +2 -2
- package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +31 -27
- package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +1 -1
- package/apps/storefront/src/pages/tenants/[id]/[...path].ts +38 -2
- package/apps/storefront/src/pages/the-build/[slug].astro +4 -4
- package/apps/storefront/src/pages/the-build/index.astro +2 -2
- package/apps/storefront/src/pages/the-build/rss.xml.ts +2 -2
- package/apps/storefront/src/styles/admin.css +27 -1
- package/apps/storefront/tsconfig.json +1 -1
- package/package.json +1 -1
- package/packages/public-runtime/package.json +2 -1
- package/packages/public-runtime/schemas/managed-analytics/v1/adapter-definition.schema.json +427 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/create-integration-install-request.schema.json +161 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/create-migration-draft-request.schema.json +157 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/delete-integration-install-request.schema.json +84 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/delete-migration-draft-request.schema.json +84 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/error-envelope.schema.json +180 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-adapter-definition-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-install-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-revision-request.schema.json +79 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-migration-draft-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/integration-install.schema.json +167 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/integration-revision.schema.json +208 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/list-adapter-definitions-request.schema.json +53 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-installs-request.schema.json +53 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-revisions-request.schema.json +82 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/migration-draft.schema.json +218 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/mutation-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/mutation-success-envelope.schema.json +49 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/read-request.schema.json +20 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/read-success-envelope.schema.json +45 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/revise-integration-install-request.schema.json +156 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/set-integration-install-status-request.schema.json +92 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/update-migration-draft-request.schema.json +184 -0
- package/packages/public-runtime/scripts/generate-managed-analytics-api-v1-schemas.mjs +13 -0
- package/packages/public-runtime/src/activity/catalog.ts +41 -37
- package/packages/public-runtime/src/activity/event.ts +6 -6
- package/packages/public-runtime/src/activity/index.ts +2 -2
- package/packages/public-runtime/src/activity/redaction.ts +4 -4
- package/packages/public-runtime/src/candidate-index.ts +42 -8
- package/packages/public-runtime/src/checkout-orders.ts +2 -2
- package/packages/public-runtime/src/checkout-style-publish.ts +2 -2
- package/packages/public-runtime/src/checkout-style.ts +7 -7
- package/packages/public-runtime/src/checkout.ts +3 -3
- package/packages/public-runtime/src/chrome.ts +777 -0
- package/packages/public-runtime/src/compliance-obligations.ts +310 -0
- package/packages/public-runtime/src/csp.ts +99 -0
- package/packages/public-runtime/src/customization-runtime.ts +32 -1
- package/packages/public-runtime/src/destination-webhook/contract.ts +353 -0
- package/packages/public-runtime/src/embed-catalog.d.mts +9 -0
- package/packages/public-runtime/src/embed-catalog.mjs +40 -0
- package/packages/public-runtime/src/evidence.ts +288 -0
- package/packages/public-runtime/src/gtm-migration/bounds.ts +138 -0
- package/packages/public-runtime/src/gtm-migration/disposition-rules.ts +361 -0
- package/packages/public-runtime/src/gtm-migration/dispositions.ts +181 -0
- package/packages/public-runtime/src/gtm-migration/draft-generator.ts +400 -0
- package/packages/public-runtime/src/gtm-migration/graph.ts +468 -0
- package/packages/public-runtime/src/gtm-migration/index.ts +95 -0
- package/packages/public-runtime/src/gtm-migration/parse.ts +410 -0
- package/packages/public-runtime/src/gtm-migration/references.ts +266 -0
- package/packages/public-runtime/src/gtm-migration/types.ts +86 -0
- package/packages/public-runtime/src/index.ts +16 -1
- package/packages/public-runtime/src/integration/assurance-decision.ts +259 -0
- package/packages/public-runtime/src/integration/assurance.ts +228 -0
- package/packages/public-runtime/src/integration/candidate-evidence.ts +377 -0
- package/packages/public-runtime/src/integration/commerce-broker.ts +497 -0
- package/packages/public-runtime/src/integration/consent-broker.ts +337 -0
- package/packages/public-runtime/src/integration/consent-cmp-demand.ts +115 -0
- package/packages/public-runtime/src/integration/consent-config.ts +260 -0
- package/packages/public-runtime/src/integration/consent-preview.ts +125 -0
- package/packages/public-runtime/src/integration/correlation-token.ts +444 -0
- package/packages/public-runtime/src/integration/csp-compiler.ts +267 -0
- package/packages/public-runtime/src/integration/csp.ts +105 -0
- package/packages/public-runtime/src/integration/digest.ts +43 -0
- package/packages/public-runtime/src/integration/environment.ts +228 -0
- package/packages/public-runtime/src/integration/events-catalog.ts +186 -0
- package/packages/public-runtime/src/integration/events.ts +701 -0
- package/packages/public-runtime/src/integration/g2-action-boundary.ts +106 -0
- package/packages/public-runtime/src/integration/index.ts +90 -0
- package/packages/public-runtime/src/integration/interim-bridge.ts +138 -0
- package/packages/public-runtime/src/integration/lifecycle-boot.ts +317 -0
- package/packages/public-runtime/src/integration/lifecycle-runtime.ts +393 -0
- package/packages/public-runtime/src/integration/lifecycle.ts +94 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.d.mts +2 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.mjs +10 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1.schemas.ts +382 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1.ts +684 -0
- package/packages/public-runtime/src/integration/managed-analytics-bridge.ts +383 -0
- package/packages/public-runtime/src/integration/managed-analytics-value-safety.ts +14 -0
- package/packages/public-runtime/src/integration/managed-analytics.ts +277 -0
- package/packages/public-runtime/src/integration/manifest.ts +470 -0
- package/packages/public-runtime/src/integration/native-amplitude.ts +362 -0
- package/packages/public-runtime/src/integration/native-ga4.ts +352 -0
- package/packages/public-runtime/src/integration/observability.ts +451 -0
- package/packages/public-runtime/src/integration/order-conversion.ts +0 -0
- package/packages/public-runtime/src/integration/phases.ts +182 -0
- package/packages/public-runtime/src/integration/plan.ts +112 -0
- package/packages/public-runtime/src/integration/platform-adapter-runtime.ts +146 -0
- package/packages/public-runtime/src/integration/platform-adapters.ts +671 -0
- package/packages/public-runtime/src/integration/promotion-gate.ts +451 -0
- package/packages/public-runtime/src/integration/provider-checkout-extension.ts +425 -0
- package/packages/public-runtime/src/integration/receipt-measurement.ts +370 -0
- package/packages/public-runtime/src/integration/regulated-parent-cert.ts +311 -0
- package/packages/public-runtime/src/integration/render-phases.ts +267 -0
- package/packages/public-runtime/src/integration/resolve.ts +465 -0
- package/packages/public-runtime/src/integration/result.ts +239 -0
- package/packages/public-runtime/src/integration/secrets.ts +92 -0
- package/packages/public-runtime/src/integration/tamper-evidence.ts +205 -0
- package/packages/public-runtime/src/integration/tamper-recovery.ts +127 -0
- package/packages/public-runtime/src/integration/version.ts +92 -0
- package/packages/public-runtime/src/integration-capabilities.ts +520 -0
- package/packages/public-runtime/src/membership.ts +2 -2
- package/packages/public-runtime/src/raw-html-policy.ts +2 -4
- package/packages/public-runtime/src/regulated-commerce/broker/consent-dedupe.ts +144 -0
- package/packages/public-runtime/src/regulated-commerce/correlation/contract.ts +177 -0
- package/packages/public-runtime/src/regulated-commerce/diagnostics/local-dispatch.ts +24 -0
- package/packages/public-runtime/src/regulated-commerce/diagnostics/read-model.ts +69 -0
- package/packages/public-runtime/src/regulated-commerce/dispatch/core.ts +134 -0
- package/packages/public-runtime/src/regulated-commerce/events/contract.ts +113 -0
- package/packages/public-runtime/src/regulated-commerce/ledger/core.ts +81 -0
- package/packages/public-runtime/src/regulated-commerce/mappings/ga4-ads.ts +87 -0
- package/packages/public-runtime/src/regulated-commerce/provider-order/bridge.ts +52 -0
- package/packages/public-runtime/src/regulated-commerce/purchase-truth/contract.ts +252 -0
- package/packages/public-runtime/src/regulated-commerce/sources/accepted-browser-operation.ts +67 -0
- package/packages/public-runtime/src/regulated-commerce/testing/fake-destination.ts +93 -0
- package/packages/public-runtime/src/static-bundle.ts +5 -5
- package/packages/public-runtime/src/tenant-assets.ts +143 -4
- package/packages/public-runtime/src/tenant.ts +45 -9
- package/packages/public-runtime/tests/fixtures/integration/browser-environment.example.json +8 -0
- package/packages/public-runtime/tests/fixtures/integration/commerce-event.example.json +44 -0
- package/packages/public-runtime/tests/fixtures/integration/commerce-order-event.example.json +44 -0
- package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json +50 -0
- package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json +120 -0
- package/packages/public-runtime/tests/fixtures/integration/managed-analytics-v1/fake-adapter-catalog.json +35 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json +11 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/README.md +22 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/entry.js +30 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/manifest.json +75 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/public-config.json +3 -0
- package/packages/public-runtime/tests/fixtures/regulated-commerce/fake-destinations.ts +38 -0
- package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.provenance.json +29 -0
- package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json +3397 -0
- package/scripts/dev/file-browser.mjs +2 -2
- package/scripts/dev/file-writer.mjs +2 -2
- package/scripts/dev/integration-guardrails.mjs +498 -0
- package/scripts/dev/safe-path.mjs +2 -2
- package/scripts/dev/tenant-source-root.mjs +1 -1
- package/scripts/tot-dev.mjs +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Versioned tenant static-asset store
|
|
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
|
-
|
|
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
|
-
|
|
438
|
-
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
+
}
|
package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json
ADDED
|
@@ -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
|
+
}
|
package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json
ADDED
|
@@ -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
|
+
}
|
package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json
ADDED
|
@@ -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).
|