@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
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic, read-only WS3 proof that the synthetic v84 fixture can pass
|
|
3
|
+
* through the pinned WS2 importer for the exact diagnostic clone.
|
|
4
|
+
*
|
|
5
|
+
* This module only composes pure importer functions and one injected WS1 catalog
|
|
6
|
+
* read. It has no install/publish/enable seam, no storage seam, and no browser or
|
|
7
|
+
* network primitive. Imported records remain inert data throughout.
|
|
8
|
+
*/
|
|
9
|
+
import {
|
|
10
|
+
APPROVED_MARKETING_ACTION_NAMES,
|
|
11
|
+
MANAGED_ANALYTICS_API_VERSION,
|
|
12
|
+
buildMigrationGraph,
|
|
13
|
+
classifyMigration,
|
|
14
|
+
generateDisabledMigrationDraft,
|
|
15
|
+
parseGtmExport,
|
|
16
|
+
validateAdapterDefinition,
|
|
17
|
+
validateManagedAnalyticsSafePayload,
|
|
18
|
+
validateMigrationDraftV1,
|
|
19
|
+
type AdapterDefinition,
|
|
20
|
+
type DisabledDraftResult,
|
|
21
|
+
type GetAdapterDefinitionRequest,
|
|
22
|
+
type GetAdapterDefinitionResponse,
|
|
23
|
+
} from "@tot/public-runtime";
|
|
24
|
+
import { analyzeGtmExport, type GtmMigrationReport } from "./gtmMigrationReport.js";
|
|
25
|
+
import {
|
|
26
|
+
buildV84NonportableCodeCoaching,
|
|
27
|
+
type V84NonportableCodeCoaching,
|
|
28
|
+
} from "./v84NonportableCodeCoaching.js";
|
|
29
|
+
import type { V84CleanCloneReplayContext } from "./v84CleanCloneReplayContext.js";
|
|
30
|
+
|
|
31
|
+
export const V84_SOURCE_TENANT = "tokenoftrust.com" as const;
|
|
32
|
+
export const V84_CLONE_TENANT = "tokenoftrust.com~clone~gtm-migration-v84" as const;
|
|
33
|
+
export const V84_EVIDENCE_AT = "2026-08-29T00:00:00.000Z" as const;
|
|
34
|
+
|
|
35
|
+
export interface ReadOnlyAdapterCatalog {
|
|
36
|
+
getAdapterDefinition(request: GetAdapterDefinitionRequest): Promise<GetAdapterDefinitionResponse>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface V84CloneMigrationEvidence {
|
|
40
|
+
readonly schemaVersion: 1;
|
|
41
|
+
readonly scope: {
|
|
42
|
+
readonly sourceTenant: typeof V84_SOURCE_TENANT;
|
|
43
|
+
readonly sourceMode: "read-only-fixture";
|
|
44
|
+
readonly cloneTenant: typeof V84_CLONE_TENANT;
|
|
45
|
+
readonly destinationMode: "offline-in-memory-only";
|
|
46
|
+
};
|
|
47
|
+
readonly accounting: {
|
|
48
|
+
readonly parsedRecords: number;
|
|
49
|
+
readonly syntheticNodes: number;
|
|
50
|
+
readonly classifiedObjects: number;
|
|
51
|
+
readonly classifiedDanglingReferences: number;
|
|
52
|
+
readonly accountedTotal: number;
|
|
53
|
+
};
|
|
54
|
+
/** Complete redacted inventory, graph, dispositions, findings, and recommendations. */
|
|
55
|
+
readonly analysis: GtmMigrationReport;
|
|
56
|
+
readonly draftEvidence: DisabledDraftResult;
|
|
57
|
+
readonly adapterResolution: {
|
|
58
|
+
readonly operation: "getAdapterDefinition";
|
|
59
|
+
readonly request: GetAdapterDefinitionRequest;
|
|
60
|
+
readonly adapterId: string;
|
|
61
|
+
readonly adapterVersion: string;
|
|
62
|
+
readonly snapshotCount: 1;
|
|
63
|
+
};
|
|
64
|
+
/** Exactly the inert coaching records that cannot be represented as code. */
|
|
65
|
+
readonly codeExecutionUnsupported: DisabledDraftResult["unresolvedInventory"];
|
|
66
|
+
/** Reviewed, per-object native coaching for every unsupported code record. */
|
|
67
|
+
readonly nonportableCodeCoaching: V84NonportableCodeCoaching;
|
|
68
|
+
readonly approvedSemanticActions: readonly string[];
|
|
69
|
+
readonly safety: {
|
|
70
|
+
readonly sourceMutationCount: 0;
|
|
71
|
+
readonly cloneMutationCount: 0;
|
|
72
|
+
readonly installMutationCount: 0;
|
|
73
|
+
readonly networkRequestCount: 0;
|
|
74
|
+
readonly listenerCount: 0;
|
|
75
|
+
readonly markupAdded: false;
|
|
76
|
+
readonly cspChanged: false;
|
|
77
|
+
readonly runtimeLoaded: false;
|
|
78
|
+
readonly importedCodeExecuted: false;
|
|
79
|
+
readonly draftStatus: "draft";
|
|
80
|
+
readonly draftEnabled: false;
|
|
81
|
+
readonly draftPublishes: false;
|
|
82
|
+
readonly lifecycle: "draft-only";
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function safeAdapterResponse(response: GetAdapterDefinitionResponse): AdapterDefinition {
|
|
87
|
+
if ("error" in response) throw new Error("The offline adapter snapshot was unavailable.");
|
|
88
|
+
const checked = validateAdapterDefinition(response.data);
|
|
89
|
+
if (!checked.ok) throw new Error("The offline adapter snapshot failed the pinned contract.");
|
|
90
|
+
return checked.value;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function assertExactV84Evidence(evidence: V84CloneMigrationEvidence): void {
|
|
94
|
+
if (evidence.accounting.parsedRecords !== 86 || evidence.accounting.syntheticNodes !== 3) {
|
|
95
|
+
throw new Error("The synthetic v84 fixture inventory changed.");
|
|
96
|
+
}
|
|
97
|
+
if (evidence.accounting.classifiedObjects !== 89 || evidence.accounting.classifiedDanglingReferences !== 0) {
|
|
98
|
+
throw new Error("The synthetic v84 fixture classification is incomplete.");
|
|
99
|
+
}
|
|
100
|
+
if (evidence.accounting.accountedTotal !== 89) throw new Error("The synthetic v84 accounting did not close.");
|
|
101
|
+
if (evidence.codeExecutionUnsupported.length !== 8) {
|
|
102
|
+
throw new Error("The synthetic v84 code-execution coaching inventory changed.");
|
|
103
|
+
}
|
|
104
|
+
if (evidence.draftEvidence.mappedConcepts.length + evidence.draftEvidence.unresolvedInventory.length !== 89) {
|
|
105
|
+
throw new Error("The disabled draft inventory did not account for every classified object.");
|
|
106
|
+
}
|
|
107
|
+
if (!validateMigrationDraftV1(evidence.draftEvidence.draft).ok) {
|
|
108
|
+
throw new Error("The generated draft failed the pinned MigrationDraft v1 contract.");
|
|
109
|
+
}
|
|
110
|
+
if (!validateManagedAnalyticsSafePayload(evidence.draftEvidence.draft).ok) {
|
|
111
|
+
throw new Error("The generated draft failed the managed-analytics safety boundary.");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Run the exact synthetic v84 fixture text through the WS2 pipeline and resolve
|
|
117
|
+
* its adapter version from one injected, read-only WS1 catalog snapshot.
|
|
118
|
+
*/
|
|
119
|
+
export async function buildV84CloneMigrationEvidence(
|
|
120
|
+
fixtureText: string,
|
|
121
|
+
catalog: ReadOnlyAdapterCatalog,
|
|
122
|
+
replayContext?: V84CleanCloneReplayContext,
|
|
123
|
+
): Promise<V84CloneMigrationEvidence> {
|
|
124
|
+
const parsed = parseGtmExport(fixtureText);
|
|
125
|
+
if (!parsed.ok) throw new Error("The synthetic v84 fixture failed the pinned parser.");
|
|
126
|
+
const graph = buildMigrationGraph(parsed.container);
|
|
127
|
+
const disposition = classifyMigration(graph);
|
|
128
|
+
|
|
129
|
+
// Determine the proposed public adapter using WS2, then resolve its version
|
|
130
|
+
// through the exact WS1 read operation. The returned definition is the single
|
|
131
|
+
// catalog snapshot supplied to the final draft generation (no TOCTOU re-read).
|
|
132
|
+
const initialDraft = generateDisabledMigrationDraft({
|
|
133
|
+
container: parsed.container,
|
|
134
|
+
graph,
|
|
135
|
+
disposition,
|
|
136
|
+
provenance: { draftId: "draft-v84-clone-evidence", generatedAt: V84_EVIDENCE_AT },
|
|
137
|
+
});
|
|
138
|
+
const request: GetAdapterDefinitionRequest = {
|
|
139
|
+
apiVersion: MANAGED_ANALYTICS_API_VERSION,
|
|
140
|
+
query: { adapterId: initialDraft.draft.proposedAdapterId },
|
|
141
|
+
};
|
|
142
|
+
const adapter = safeAdapterResponse(await catalog.getAdapterDefinition(request));
|
|
143
|
+
if (adapter.adapterId !== initialDraft.draft.proposedAdapterId) {
|
|
144
|
+
throw new Error("The offline adapter snapshot did not match the proposed adapter.");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const draftEvidence = generateDisabledMigrationDraft({
|
|
148
|
+
container: parsed.container,
|
|
149
|
+
graph,
|
|
150
|
+
disposition,
|
|
151
|
+
provenance: { draftId: "draft-v84-clone-evidence", generatedAt: V84_EVIDENCE_AT },
|
|
152
|
+
adapterCatalog: [adapter],
|
|
153
|
+
});
|
|
154
|
+
const analyzed = analyzeGtmExport(fixtureText, {
|
|
155
|
+
tenantId: V84_CLONE_TENANT,
|
|
156
|
+
correlationId: "corr-v84-clone-evidence",
|
|
157
|
+
generatedAt: V84_EVIDENCE_AT,
|
|
158
|
+
});
|
|
159
|
+
if (!analyzed.ok) throw new Error("The synthetic v84 fixture failed redacted report generation.");
|
|
160
|
+
|
|
161
|
+
const scope = {
|
|
162
|
+
sourceTenant: V84_SOURCE_TENANT,
|
|
163
|
+
sourceMode: "read-only-fixture" as const,
|
|
164
|
+
cloneTenant: V84_CLONE_TENANT,
|
|
165
|
+
destinationMode: "offline-in-memory-only" as const,
|
|
166
|
+
};
|
|
167
|
+
const codeExecutionUnsupported = draftEvidence.unresolvedInventory.filter(
|
|
168
|
+
(item) => item.reasonCode === "code-execution-unsupported",
|
|
169
|
+
);
|
|
170
|
+
const evidence: V84CloneMigrationEvidence = {
|
|
171
|
+
schemaVersion: 1,
|
|
172
|
+
scope,
|
|
173
|
+
accounting: {
|
|
174
|
+
parsedRecords: Object.values(parsed.accounting.counts).reduce((sum, count) => sum + count, 0),
|
|
175
|
+
syntheticNodes: graph.accounting.syntheticNodeCount,
|
|
176
|
+
classifiedObjects: disposition.objects.length,
|
|
177
|
+
classifiedDanglingReferences: disposition.dangling.length,
|
|
178
|
+
accountedTotal: disposition.summary.total,
|
|
179
|
+
},
|
|
180
|
+
analysis: analyzed.report,
|
|
181
|
+
draftEvidence,
|
|
182
|
+
adapterResolution: {
|
|
183
|
+
operation: "getAdapterDefinition",
|
|
184
|
+
request,
|
|
185
|
+
adapterId: adapter.adapterId,
|
|
186
|
+
adapterVersion: adapter.adapterVersion,
|
|
187
|
+
snapshotCount: 1,
|
|
188
|
+
},
|
|
189
|
+
codeExecutionUnsupported,
|
|
190
|
+
nonportableCodeCoaching: buildV84NonportableCodeCoaching({ scope, codeExecutionUnsupported }),
|
|
191
|
+
approvedSemanticActions: [...APPROVED_MARKETING_ACTION_NAMES],
|
|
192
|
+
safety: {
|
|
193
|
+
sourceMutationCount: 0,
|
|
194
|
+
cloneMutationCount: 0,
|
|
195
|
+
installMutationCount: 0,
|
|
196
|
+
networkRequestCount: 0,
|
|
197
|
+
listenerCount: 0,
|
|
198
|
+
markupAdded: false,
|
|
199
|
+
cspChanged: false,
|
|
200
|
+
runtimeLoaded: false,
|
|
201
|
+
importedCodeExecuted: false,
|
|
202
|
+
draftStatus: draftEvidence.draft.status,
|
|
203
|
+
draftEnabled: draftEvidence.draft.enabled,
|
|
204
|
+
draftPublishes: draftEvidence.draft.publishes,
|
|
205
|
+
lifecycle: "draft-only",
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
assertExactV84Evidence(evidence);
|
|
209
|
+
replayContext?.write("stage/import/handoff", evidence);
|
|
210
|
+
return evidence;
|
|
211
|
+
}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact-clone, transport-free proof that reviewed GA4 and Amplitude destinations
|
|
3
|
+
* can be drafted and installed through WS1's public Integration Management API.
|
|
4
|
+
* The injected client is the only authority: this module has no database,
|
|
5
|
+
* environment/config, network, lifecycle-publish, or runtime execution seam.
|
|
6
|
+
*/
|
|
7
|
+
import {
|
|
8
|
+
APPROVED_MARKETING_ACTION_NAMES,
|
|
9
|
+
MANAGED_ANALYTICS_SCHEMA_VERSION,
|
|
10
|
+
MANAGED_ANALYTICS_API_VERSION,
|
|
11
|
+
eventDedupeKey,
|
|
12
|
+
platformAdapterCatalog,
|
|
13
|
+
sha256Hex,
|
|
14
|
+
snapshotManagedAnalyticsDeclarativeInput,
|
|
15
|
+
stableIntegrationStringify,
|
|
16
|
+
validateAdapterDefinition,
|
|
17
|
+
validateCreateMigrationDraftRequest,
|
|
18
|
+
validateManagedAnalyticsSafePayload,
|
|
19
|
+
validateMigrationDraftV1,
|
|
20
|
+
type AdapterDefinition,
|
|
21
|
+
type CreateMigrationDraftRequest,
|
|
22
|
+
type MigrationDraftV1,
|
|
23
|
+
} from "@tot/public-runtime";
|
|
24
|
+
import {
|
|
25
|
+
prepareWs1ApiResponse,
|
|
26
|
+
reviewInstallDraft,
|
|
27
|
+
} from "./gtmMigrationInstall.js";
|
|
28
|
+
import type { Ws1ManagedAnalyticsMigrationClient } from "./ws1ManagedAnalyticsClient.js";
|
|
29
|
+
import type { V84CloneMigrationEvidence } from "./v84CloneMigrationEvidence.js";
|
|
30
|
+
|
|
31
|
+
export const V84_NATIVE_SOURCE_TENANT = "tokenoftrust.com" as const;
|
|
32
|
+
export const V84_NATIVE_CLONE_TENANT = "tokenoftrust.com~clone~gtm-migration-v84" as const;
|
|
33
|
+
export const V84_WS1_FINAL = "13feb8eeb80a5f86d133c50d5a0246b43a2634ea" as const;
|
|
34
|
+
export const V84_WS1_API_CONTRACT = "8d8b1a5807fa5e4a22ef9060470da958c70ac691" as const;
|
|
35
|
+
export const V84_WS2_FINAL = "1c9accab31aff3e72ccd435ce7b6f85e683d105d" as const;
|
|
36
|
+
/** SHA-256 of the complete deterministic WS2 evidence pinned by V84_WS2_FINAL. */
|
|
37
|
+
export const V84_WS2_EVIDENCE_SHA256 = "7156b52af31f29a1055e60bdbc5488cc06bedf68e8ab89325d92ae542b303881" as const;
|
|
38
|
+
|
|
39
|
+
const DESTINATIONS = [
|
|
40
|
+
{
|
|
41
|
+
key: "ga4",
|
|
42
|
+
adapterId: "platform.google-measurement",
|
|
43
|
+
destinationId: "G-V84FAKE01",
|
|
44
|
+
findings: ["v84.ga4.reviewed", "canonical.actions.allowlisted"],
|
|
45
|
+
provenance: "ws2-draft-plus-reviewed-fake-configuration" as const,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
key: "amplitude",
|
|
49
|
+
adapterId: "platform.amplitude",
|
|
50
|
+
destinationId: "0123456789abcdef0123456789abcdef",
|
|
51
|
+
findings: ["v84.amplitude.reviewed", "canonical.actions.allowlisted"],
|
|
52
|
+
provenance: "separately-reviewed-native-addition" as const,
|
|
53
|
+
},
|
|
54
|
+
] as const;
|
|
55
|
+
|
|
56
|
+
/** Public-runtime-only adapter snapshots for the offline WS1 fake client. */
|
|
57
|
+
export function v84PublicAdapterDefinitions(): AdapterDefinition[] {
|
|
58
|
+
return platformAdapterCatalog().map((card) => {
|
|
59
|
+
const checked = validateAdapterDefinition({
|
|
60
|
+
schemaVersion: MANAGED_ANALYTICS_SCHEMA_VERSION,
|
|
61
|
+
adapterId: card.adapterId,
|
|
62
|
+
adapterVersion: "1.0.0",
|
|
63
|
+
displayName: card.name,
|
|
64
|
+
description: card.purpose,
|
|
65
|
+
availability: "available",
|
|
66
|
+
configuration: [{
|
|
67
|
+
key: "destinationId",
|
|
68
|
+
label: card.idLabel,
|
|
69
|
+
description: "Public destination identifier used by this reviewed adapter.",
|
|
70
|
+
kind: "string",
|
|
71
|
+
required: true,
|
|
72
|
+
}],
|
|
73
|
+
eventTypes: [...card.eventTypes],
|
|
74
|
+
consentPurposes: [...card.consentPurposes],
|
|
75
|
+
collectionOrigins: [...card.cspOrigins].sort(),
|
|
76
|
+
});
|
|
77
|
+
if (!checked.ok) throw new Error("The public adapter catalog failed its pinned WS1 contract.");
|
|
78
|
+
return checked.value;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface V84NativeInstallEvidence {
|
|
83
|
+
readonly schemaVersion: 1;
|
|
84
|
+
readonly scope: {
|
|
85
|
+
readonly sourceTenant: typeof V84_NATIVE_SOURCE_TENANT;
|
|
86
|
+
readonly sourceMode: "read-only";
|
|
87
|
+
readonly cloneTenant: typeof V84_NATIVE_CLONE_TENANT;
|
|
88
|
+
readonly environment: "diagnostic-clone";
|
|
89
|
+
readonly destinationMode: "offline-in-memory-fake-only";
|
|
90
|
+
readonly publicClientTransport: "tenant-bound-http-adapter-with-injected-no-network-fetch";
|
|
91
|
+
};
|
|
92
|
+
readonly contractPins: {
|
|
93
|
+
readonly ws1Final: typeof V84_WS1_FINAL;
|
|
94
|
+
readonly ws1ApiContract: typeof V84_WS1_API_CONTRACT;
|
|
95
|
+
readonly ws2Final: typeof V84_WS2_FINAL;
|
|
96
|
+
readonly ws2EvidenceSha256: typeof V84_WS2_EVIDENCE_SHA256;
|
|
97
|
+
};
|
|
98
|
+
readonly installations: readonly {
|
|
99
|
+
readonly adapterId: string;
|
|
100
|
+
readonly adapterVersion: string;
|
|
101
|
+
readonly configurationKeys: readonly ["destinationId"];
|
|
102
|
+
readonly destinationValueRedacted: true;
|
|
103
|
+
readonly consentPurposes: readonly string[];
|
|
104
|
+
readonly collectionOrigins: readonly string[];
|
|
105
|
+
readonly eventTypes: readonly string[];
|
|
106
|
+
readonly adapterSnapshotCount: 1;
|
|
107
|
+
readonly provenance: "ws2-draft-plus-reviewed-fake-configuration" | "separately-reviewed-native-addition";
|
|
108
|
+
readonly desired: {
|
|
109
|
+
readonly installStatus: "disabled";
|
|
110
|
+
readonly revisionStatus: "draft";
|
|
111
|
+
readonly configured: true;
|
|
112
|
+
};
|
|
113
|
+
readonly effective: {
|
|
114
|
+
readonly activeRevisionId: null;
|
|
115
|
+
readonly materialized: false;
|
|
116
|
+
};
|
|
117
|
+
}[];
|
|
118
|
+
readonly semanticActions: readonly string[];
|
|
119
|
+
readonly eventIdentity: {
|
|
120
|
+
readonly logicalId: "evt-v84-proof";
|
|
121
|
+
readonly dedupeKey: "evt-v84-proof";
|
|
122
|
+
readonly duplicateActionNames: 0;
|
|
123
|
+
};
|
|
124
|
+
readonly operationCounts: {
|
|
125
|
+
readonly createMigrationDraft: 2;
|
|
126
|
+
readonly getMigrationDraft: 2;
|
|
127
|
+
/** Reads performed by this install composition, independent of prior evidence production. */
|
|
128
|
+
readonly getAdapterDefinition: 2;
|
|
129
|
+
readonly createIntegrationInstall: 2;
|
|
130
|
+
readonly reviseIntegrationInstall: 0;
|
|
131
|
+
readonly setIntegrationInstallStatus: 0;
|
|
132
|
+
readonly publish: 0;
|
|
133
|
+
};
|
|
134
|
+
readonly priorEvidenceOperationCounts: {
|
|
135
|
+
/** The validated catalog snapshot already represented by the supplied WS2 evidence. */
|
|
136
|
+
readonly getAdapterDefinition: 1;
|
|
137
|
+
};
|
|
138
|
+
readonly composedOperationCounts: {
|
|
139
|
+
readonly createMigrationDraft: 2;
|
|
140
|
+
readonly getMigrationDraft: 2;
|
|
141
|
+
readonly getAdapterDefinition: 3;
|
|
142
|
+
readonly createIntegrationInstall: 2;
|
|
143
|
+
readonly reviseIntegrationInstall: 0;
|
|
144
|
+
readonly setIntegrationInstallStatus: 0;
|
|
145
|
+
readonly publish: 0;
|
|
146
|
+
};
|
|
147
|
+
readonly assurances: {
|
|
148
|
+
readonly hostileInputSnapshot: "frozen-public-validator";
|
|
149
|
+
readonly draftAndInstallWritesIdempotencyKeyed: true;
|
|
150
|
+
readonly adapterVersionSource: "one-getAdapterDefinition-snapshot-per-install";
|
|
151
|
+
readonly responseValidation: "frozen-public-validator";
|
|
152
|
+
readonly diagnosticsCarryDestinationValues: false;
|
|
153
|
+
};
|
|
154
|
+
readonly safety: {
|
|
155
|
+
readonly sourceMutationCount: 0;
|
|
156
|
+
readonly liveDestinationCount: 0;
|
|
157
|
+
readonly externalNetworkRequestCount: 0;
|
|
158
|
+
readonly importedCodeExecuted: false;
|
|
159
|
+
readonly runtimeLoaded: false;
|
|
160
|
+
readonly lifecycle: "reviewed-disabled-draft-only";
|
|
161
|
+
readonly diagnostics: "redacted";
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function createAndReviewFixedDestination(
|
|
166
|
+
client: Ws1ManagedAnalyticsMigrationClient,
|
|
167
|
+
destination: (typeof DESTINATIONS)[number],
|
|
168
|
+
) {
|
|
169
|
+
const request: CreateMigrationDraftRequest = {
|
|
170
|
+
apiVersion: MANAGED_ANALYTICS_API_VERSION,
|
|
171
|
+
idempotencyKey: `v84-${destination.key}-draft-create`,
|
|
172
|
+
expectedRevision: 0,
|
|
173
|
+
body: {
|
|
174
|
+
proposedAdapterId: destination.adapterId,
|
|
175
|
+
proposedConfiguration: { destinationId: destination.destinationId },
|
|
176
|
+
findings: [...destination.findings],
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
const checked = validateCreateMigrationDraftRequest(request);
|
|
180
|
+
if (!checked.ok) throw new Error(`The fixed ${destination.key} migration draft request failed validation.`);
|
|
181
|
+
|
|
182
|
+
let rawResponse: Awaited<ReturnType<typeof client.createMigrationDraft>>;
|
|
183
|
+
try {
|
|
184
|
+
rawResponse = await client.createMigrationDraft(checked.value);
|
|
185
|
+
} catch {
|
|
186
|
+
throw new Error(`The fixed ${destination.key} migration draft request failed safely.`);
|
|
187
|
+
}
|
|
188
|
+
const response = prepareWs1ApiResponse<MigrationDraftV1>(
|
|
189
|
+
rawResponse,
|
|
190
|
+
`corr-v84-${destination.key}-draft`,
|
|
191
|
+
"mutation",
|
|
192
|
+
);
|
|
193
|
+
if (!response.ok) {
|
|
194
|
+
throw new Error(`The fixed ${destination.key} migration draft response was refused.`);
|
|
195
|
+
}
|
|
196
|
+
const draftCheck = validateMigrationDraftV1(response.value.data);
|
|
197
|
+
if (!draftCheck.ok) throw new Error(`The fixed ${destination.key} migration draft response failed validation.`);
|
|
198
|
+
const draft = draftCheck.value;
|
|
199
|
+
if (
|
|
200
|
+
draft.proposedAdapterId !== checked.value.body.proposedAdapterId ||
|
|
201
|
+
stableIntegrationStringify(draft.proposedConfiguration) !== stableIntegrationStringify(checked.value.body.proposedConfiguration) ||
|
|
202
|
+
stableIntegrationStringify(draft.findings) !== stableIntegrationStringify(checked.value.body.findings)
|
|
203
|
+
) {
|
|
204
|
+
throw new Error(`The fixed ${destination.key} migration draft response changed reviewed input.`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const result = await reviewInstallDraft(client, {
|
|
208
|
+
draftId: draft.draftId,
|
|
209
|
+
idempotencyKey: `v84-${destination.key}-install-create`,
|
|
210
|
+
correlationId: `corr-v84-${destination.key}-install`,
|
|
211
|
+
}, draft);
|
|
212
|
+
if (!result.ok) throw new Error(`The fixed ${destination.key} review/install proof was refused: ${result.code ?? "unknown"}.`);
|
|
213
|
+
return { ...result, draft };
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const EXACT_WS2_SCOPE = {
|
|
217
|
+
sourceTenant: V84_NATIVE_SOURCE_TENANT,
|
|
218
|
+
sourceMode: "read-only-fixture",
|
|
219
|
+
cloneTenant: V84_NATIVE_CLONE_TENANT,
|
|
220
|
+
destinationMode: "offline-in-memory-only",
|
|
221
|
+
} as const;
|
|
222
|
+
const EXACT_WS2_ACCOUNTING = {
|
|
223
|
+
parsedRecords: 86,
|
|
224
|
+
syntheticNodes: 3,
|
|
225
|
+
classifiedObjects: 89,
|
|
226
|
+
classifiedDanglingReferences: 0,
|
|
227
|
+
accountedTotal: 89,
|
|
228
|
+
} as const;
|
|
229
|
+
const EXACT_WS2_ADAPTER_RESOLUTION = {
|
|
230
|
+
operation: "getAdapterDefinition",
|
|
231
|
+
request: { apiVersion: "v1", query: { adapterId: "platform.google-measurement" } },
|
|
232
|
+
adapterId: "platform.google-measurement",
|
|
233
|
+
adapterVersion: "1.0.0",
|
|
234
|
+
snapshotCount: 1,
|
|
235
|
+
} as const;
|
|
236
|
+
const EXACT_WS2_SAFETY = {
|
|
237
|
+
sourceMutationCount: 0,
|
|
238
|
+
cloneMutationCount: 0,
|
|
239
|
+
installMutationCount: 0,
|
|
240
|
+
networkRequestCount: 0,
|
|
241
|
+
listenerCount: 0,
|
|
242
|
+
markupAdded: false,
|
|
243
|
+
cspChanged: false,
|
|
244
|
+
runtimeLoaded: false,
|
|
245
|
+
importedCodeExecuted: false,
|
|
246
|
+
draftStatus: "draft",
|
|
247
|
+
draftEnabled: false,
|
|
248
|
+
draftPublishes: false,
|
|
249
|
+
lifecycle: "draft-only",
|
|
250
|
+
} as const;
|
|
251
|
+
|
|
252
|
+
function sameEvidenceValue(left: unknown, right: unknown): boolean {
|
|
253
|
+
return stableIntegrationStringify(left) === stableIntegrationStringify(right);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Fail closed unless this is the complete deterministic evidence pinned by WS2 final. */
|
|
257
|
+
async function assertV84ImportProvenance(input: unknown): Promise<V84CloneMigrationEvidence> {
|
|
258
|
+
const snapshot = snapshotManagedAnalyticsDeclarativeInput<V84CloneMigrationEvidence>(input);
|
|
259
|
+
if (!snapshot.ok) {
|
|
260
|
+
throw new Error("The native install proof requires the exact inert v84 WS2 draft evidence.");
|
|
261
|
+
}
|
|
262
|
+
const importEvidence = snapshot.value;
|
|
263
|
+
const draft = importEvidence.draftEvidence?.draft;
|
|
264
|
+
const draftCheck = validateMigrationDraftV1(draft);
|
|
265
|
+
const evidenceDigest = await sha256Hex(stableIntegrationStringify(importEvidence));
|
|
266
|
+
if (
|
|
267
|
+
importEvidence.schemaVersion !== 1 ||
|
|
268
|
+
!sameEvidenceValue(importEvidence.scope, EXACT_WS2_SCOPE) ||
|
|
269
|
+
!sameEvidenceValue(importEvidence.accounting, EXACT_WS2_ACCOUNTING) ||
|
|
270
|
+
!draftCheck.ok ||
|
|
271
|
+
draft?.proposedAdapterId !== "platform.google-measurement" ||
|
|
272
|
+
!sameEvidenceValue(draft?.proposedConfiguration, {}) ||
|
|
273
|
+
draft?.enabled !== false ||
|
|
274
|
+
draft?.publishes !== false ||
|
|
275
|
+
!validateManagedAnalyticsSafePayload(draft).ok ||
|
|
276
|
+
importEvidence.draftEvidence?.mappedConcepts?.length !== 44 ||
|
|
277
|
+
importEvidence.draftEvidence?.unresolvedInventory?.length !== 45 ||
|
|
278
|
+
importEvidence.analysis?.graph?.nodes?.length !== 89 ||
|
|
279
|
+
importEvidence.analysis?.graph?.edges?.length !== 150 ||
|
|
280
|
+
importEvidence.analysis?.dispositions?.length !== 89 ||
|
|
281
|
+
importEvidence.analysis?.graph?.danglingReferences?.length !== 0 ||
|
|
282
|
+
!sameEvidenceValue(importEvidence.adapterResolution, EXACT_WS2_ADAPTER_RESOLUTION) ||
|
|
283
|
+
importEvidence.codeExecutionUnsupported?.length !== 8 ||
|
|
284
|
+
importEvidence.nonportableCodeCoaching?.dossiers?.length !== 8 ||
|
|
285
|
+
!sameEvidenceValue(importEvidence.approvedSemanticActions, APPROVED_MARKETING_ACTION_NAMES) ||
|
|
286
|
+
!sameEvidenceValue(importEvidence.safety, EXACT_WS2_SAFETY) ||
|
|
287
|
+
evidenceDigest !== V84_WS2_EVIDENCE_SHA256
|
|
288
|
+
) {
|
|
289
|
+
throw new Error("The native install proof requires the exact inert v84 WS2 draft evidence.");
|
|
290
|
+
}
|
|
291
|
+
return importEvidence;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Configure, review, and install both fake destinations through the public client. */
|
|
295
|
+
export async function buildV84CloneNativeInstallEvidence(
|
|
296
|
+
client: Ws1ManagedAnalyticsMigrationClient,
|
|
297
|
+
importEvidence: V84CloneMigrationEvidence,
|
|
298
|
+
): Promise<V84NativeInstallEvidence> {
|
|
299
|
+
const exactImportEvidence = await assertV84ImportProvenance(importEvidence);
|
|
300
|
+
const currentCatalogReads = 2 as const;
|
|
301
|
+
const priorCatalogReads = exactImportEvidence.adapterResolution.snapshotCount;
|
|
302
|
+
const composedCatalogReads = currentCatalogReads + priorCatalogReads;
|
|
303
|
+
if (priorCatalogReads !== 1 || composedCatalogReads !== 3) {
|
|
304
|
+
throw new Error("The native install proof catalog-read ledger did not compose exactly.");
|
|
305
|
+
}
|
|
306
|
+
const installations: V84NativeInstallEvidence["installations"][number][] = [];
|
|
307
|
+
|
|
308
|
+
for (const destination of DESTINATIONS) {
|
|
309
|
+
if (destination.key === "ga4" && destination.adapterId !== exactImportEvidence.draftEvidence.draft.proposedAdapterId) {
|
|
310
|
+
throw new Error("The reviewed GA4 destination no longer matches the v84 WS2 draft.");
|
|
311
|
+
}
|
|
312
|
+
const result = await createAndReviewFixedDestination(client, destination);
|
|
313
|
+
if (
|
|
314
|
+
result.install.status !== "disabled" ||
|
|
315
|
+
result.install.activeRevisionId !== null ||
|
|
316
|
+
result.revision.status !== "draft" ||
|
|
317
|
+
result.revision.adapterVersion !== result.adapter.adapterVersion ||
|
|
318
|
+
result.adapter.adapterId !== destination.adapterId
|
|
319
|
+
) {
|
|
320
|
+
throw new Error(`The offline ${destination.key} install did not remain a disabled draft.`);
|
|
321
|
+
}
|
|
322
|
+
if (!result.adapter.eventTypes.includes("storefront.action.activated.v1")) {
|
|
323
|
+
throw new Error(`The offline ${destination.key} adapter omitted the canonical semantic action event.`);
|
|
324
|
+
}
|
|
325
|
+
installations.push({
|
|
326
|
+
adapterId: result.adapter.adapterId,
|
|
327
|
+
adapterVersion: result.adapter.adapterVersion,
|
|
328
|
+
configurationKeys: ["destinationId"],
|
|
329
|
+
destinationValueRedacted: true,
|
|
330
|
+
consentPurposes: [...result.adapter.consentPurposes],
|
|
331
|
+
collectionOrigins: [...result.adapter.collectionOrigins],
|
|
332
|
+
eventTypes: [...result.adapter.eventTypes],
|
|
333
|
+
adapterSnapshotCount: 1,
|
|
334
|
+
provenance: destination.provenance,
|
|
335
|
+
desired: { installStatus: "disabled", revisionStatus: "draft", configured: true },
|
|
336
|
+
effective: { activeRevisionId: null, materialized: false },
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const semanticActions = [...APPROVED_MARKETING_ACTION_NAMES];
|
|
341
|
+
if (eventDedupeKey({ id: "evt-v84-proof" }) !== "evt-v84-proof") {
|
|
342
|
+
throw new Error("The canonical event identity did not remain its dedupe key.");
|
|
343
|
+
}
|
|
344
|
+
if (new Set(semanticActions).size !== semanticActions.length) {
|
|
345
|
+
throw new Error("The canonical semantic action allowlist contains a duplicate.");
|
|
346
|
+
}
|
|
347
|
+
const evidence: V84NativeInstallEvidence = {
|
|
348
|
+
schemaVersion: 1,
|
|
349
|
+
scope: {
|
|
350
|
+
sourceTenant: V84_NATIVE_SOURCE_TENANT,
|
|
351
|
+
sourceMode: "read-only",
|
|
352
|
+
cloneTenant: V84_NATIVE_CLONE_TENANT,
|
|
353
|
+
environment: "diagnostic-clone",
|
|
354
|
+
destinationMode: "offline-in-memory-fake-only",
|
|
355
|
+
publicClientTransport: "tenant-bound-http-adapter-with-injected-no-network-fetch",
|
|
356
|
+
},
|
|
357
|
+
contractPins: {
|
|
358
|
+
ws1Final: V84_WS1_FINAL,
|
|
359
|
+
ws1ApiContract: V84_WS1_API_CONTRACT,
|
|
360
|
+
ws2Final: V84_WS2_FINAL,
|
|
361
|
+
ws2EvidenceSha256: V84_WS2_EVIDENCE_SHA256,
|
|
362
|
+
},
|
|
363
|
+
installations,
|
|
364
|
+
semanticActions,
|
|
365
|
+
eventIdentity: {
|
|
366
|
+
logicalId: "evt-v84-proof",
|
|
367
|
+
dedupeKey: "evt-v84-proof",
|
|
368
|
+
duplicateActionNames: 0,
|
|
369
|
+
},
|
|
370
|
+
operationCounts: {
|
|
371
|
+
createMigrationDraft: 2,
|
|
372
|
+
getMigrationDraft: 2,
|
|
373
|
+
getAdapterDefinition: currentCatalogReads,
|
|
374
|
+
createIntegrationInstall: 2,
|
|
375
|
+
reviseIntegrationInstall: 0,
|
|
376
|
+
setIntegrationInstallStatus: 0,
|
|
377
|
+
publish: 0,
|
|
378
|
+
},
|
|
379
|
+
priorEvidenceOperationCounts: {
|
|
380
|
+
getAdapterDefinition: priorCatalogReads,
|
|
381
|
+
},
|
|
382
|
+
composedOperationCounts: {
|
|
383
|
+
createMigrationDraft: 2,
|
|
384
|
+
getMigrationDraft: 2,
|
|
385
|
+
getAdapterDefinition: composedCatalogReads,
|
|
386
|
+
createIntegrationInstall: 2,
|
|
387
|
+
reviseIntegrationInstall: 0,
|
|
388
|
+
setIntegrationInstallStatus: 0,
|
|
389
|
+
publish: 0,
|
|
390
|
+
},
|
|
391
|
+
assurances: {
|
|
392
|
+
hostileInputSnapshot: "frozen-public-validator",
|
|
393
|
+
draftAndInstallWritesIdempotencyKeyed: true,
|
|
394
|
+
adapterVersionSource: "one-getAdapterDefinition-snapshot-per-install",
|
|
395
|
+
responseValidation: "frozen-public-validator",
|
|
396
|
+
diagnosticsCarryDestinationValues: false,
|
|
397
|
+
},
|
|
398
|
+
safety: {
|
|
399
|
+
sourceMutationCount: 0,
|
|
400
|
+
liveDestinationCount: 0,
|
|
401
|
+
externalNetworkRequestCount: 0,
|
|
402
|
+
importedCodeExecuted: false,
|
|
403
|
+
runtimeLoaded: false,
|
|
404
|
+
lifecycle: "reviewed-disabled-draft-only",
|
|
405
|
+
diagnostics: "redacted",
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
return evidence;
|
|
409
|
+
}
|