@tokenoftrust/storefront-runner 1.4.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/storefront/astro.config.mjs +17 -1
- package/apps/storefront/env.d.ts +54 -5
- package/apps/storefront/integrations/materialize-guard.mjs +54 -0
- package/apps/storefront/migrations-apps/0002_good_switch.sql +26 -0
- package/apps/storefront/migrations-apps/0003_mute_marauders.sql +12 -0
- 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/0002_snapshot.json +1160 -0
- package/apps/storefront/migrations-apps/meta/0003_snapshot.json +1235 -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 +56 -0
- package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
- package/apps/storefront/public/js/dashboard-team.js +38 -2
- 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/Seo.astro +65 -1
- package/apps/storefront/src/components/admin/AdminBlogDetailRail.astro +878 -0
- package/apps/storefront/src/components/admin/AdminBlogTab.astro +1435 -0
- package/apps/storefront/src/components/admin/AdminCustomersTab.astro +3 -7
- package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
- package/apps/storefront/src/components/admin/AdminPublishTab.astro +1980 -2564
- package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
- package/apps/storefront/src/components/admin/AdminSubscriptionsTab.astro +1 -3
- package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
- package/apps/storefront/src/components/blog/BlogPaywall.astro +87 -0
- package/apps/storefront/src/components/blog/PostAccessBadge.astro +43 -0
- package/apps/storefront/src/components/blog/PostGrid.astro +57 -0
- package/apps/storefront/src/components/blog/ReactionBar.astro +214 -0
- 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 +146 -21
- package/apps/storefront/src/lib/activity/alerts.ts +17 -19
- package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
- package/apps/storefront/src/lib/activity/changeActorAttribution.ts +89 -9
- package/apps/storefront/src/lib/activity/deployVersion.ts +20 -27
- package/apps/storefront/src/lib/activity/ingest.ts +8 -8
- package/apps/storefront/src/lib/activity/ingestAuth.ts +1 -1
- package/apps/storefront/src/lib/activity/killSwitch.ts +6 -6
- package/apps/storefront/src/lib/activity/query.ts +9 -9
- package/apps/storefront/src/lib/activity/recordActivity.ts +11 -15
- package/apps/storefront/src/lib/activity/store.ts +4 -6
- package/apps/storefront/src/lib/activity/uiActor.ts +12 -12
- package/apps/storefront/src/lib/activity/workerCommit.ts +6 -6
- package/apps/storefront/src/lib/admin/adminShell.ts +292 -0
- package/apps/storefront/src/lib/admin/ai/approvalMode.ts +2 -3
- package/apps/storefront/src/lib/admin/ai/audit.ts +3 -5
- package/apps/storefront/src/lib/admin/checkoutStyleInput.ts +7 -7
- package/apps/storefront/src/lib/admin/checkoutStyleTarget.ts +3 -3
- package/apps/storefront/src/lib/admin/envelope.ts +1 -2
- package/apps/storefront/src/lib/admin/orderClient.ts +3 -5
- package/apps/storefront/src/lib/admin/services/orders.ts +17 -19
- package/apps/storefront/src/lib/admin/viewmodels/aiWorkflows.ts +4 -6
- package/apps/storefront/src/lib/admin/viewmodels/settings.ts +1 -1
- package/apps/storefront/src/lib/apps/adminService.ts +14 -4
- package/apps/storefront/src/lib/apps/adminSession.ts +54 -45
- package/apps/storefront/src/lib/apps/apiAuth.ts +2 -2
- package/apps/storefront/src/lib/apps/apiRoute.ts +2 -2
- package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
- package/apps/storefront/src/lib/apps/catalogMapper.ts +1 -1
- package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
- package/apps/storefront/src/lib/apps/credentials.ts +2 -2
- package/apps/storefront/src/lib/apps/gatewayKeys.ts +4 -4
- 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/healthAggregate.ts +5 -5
- 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/attributionService.ts +2 -2
- package/apps/storefront/src/lib/apps/orders/customerHash.ts +1 -1
- package/apps/storefront/src/lib/apps/orders/foxyOrderClient.ts +12 -12
- package/apps/storefront/src/lib/apps/orders/idempotency.ts +7 -7
- package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
- package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +9 -1
- package/apps/storefront/src/lib/apps/orders/orderMapper.ts +2 -2
- package/apps/storefront/src/lib/apps/orders/ordersStore.ts +7 -7
- package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
- package/apps/storefront/src/lib/apps/registryService.ts +270 -16
- package/apps/storefront/src/lib/apps/scopes.ts +2 -2
- package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
- package/apps/storefront/src/lib/apps/tokenIssuer.ts +4 -4
- package/apps/storefront/src/lib/apps/tokenVerifier.ts +6 -6
- 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/widgets/eligibility.ts +2 -2
- package/apps/storefront/src/lib/apps/widgets/frameProps.ts +3 -3
- package/apps/storefront/src/lib/apps/widgets/launchToken.ts +4 -4
- package/apps/storefront/src/lib/apps/widgets/placements.ts +2 -2
- package/apps/storefront/src/lib/apps/widgets/renderSlot.ts +1 -1
- 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 +11 -11
- package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
- package/apps/storefront/src/lib/auth/identityToken.ts +6 -14
- package/apps/storefront/src/lib/auth/loginGate.ts +75 -13
- package/apps/storefront/src/lib/auth/mcpClientAssertion.ts +2 -4
- package/apps/storefront/src/lib/auth/operatorSession.ts +113 -0
- package/apps/storefront/src/lib/auth/session.ts +7 -8
- package/apps/storefront/src/lib/auth/totAccessClient.ts +8 -18
- package/apps/storefront/src/lib/basePath.ts +9 -2
- package/apps/storefront/src/lib/blog/access.ts +29 -0
- package/apps/storefront/src/lib/blog/collection.ts +400 -0
- package/apps/storefront/src/lib/blog/markdown.ts +174 -0
- package/apps/storefront/src/lib/blog/provider.ts +62 -3
- package/apps/storefront/src/lib/blog/reactions.ts +87 -0
- package/apps/storefront/src/lib/blog/rss.ts +92 -0
- package/apps/storefront/src/lib/blog/teaser.ts +83 -0
- package/apps/storefront/src/lib/blog/types.ts +34 -0
- package/apps/storefront/src/lib/blog/viewCounts.ts +243 -0
- 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 +14 -2
- package/apps/storefront/src/lib/d1/schema-apps.ts +372 -17
- package/apps/storefront/src/lib/dev/activityIngestToken.ts +2 -4
- package/apps/storefront/src/lib/dev/activityStore.ts +3 -5
- package/apps/storefront/src/lib/dev/apiBase.ts +1 -4
- 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/cockpitStore.ts +1 -9
- package/apps/storefront/src/lib/dev/devDraft.ts +1 -1
- package/apps/storefront/src/lib/dev/previewStatus.ts +9 -21
- package/apps/storefront/src/lib/dev/rendezvousBroker.ts +9 -24
- package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
- package/apps/storefront/src/lib/edgeCache.ts +34 -5
- package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
- package/apps/storefront/src/lib/http/fetchTransport.ts +63 -0
- package/apps/storefront/src/lib/i18n.ts +25 -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/jsonld.ts +118 -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/monitoring/manifest.ts +11 -11
- package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +30 -0
- package/apps/storefront/src/lib/newsletter/consent.ts +23 -0
- package/apps/storefront/src/lib/newsletter/digest.ts +117 -0
- package/apps/storefront/src/lib/newsletter/resendClient.ts +79 -0
- package/apps/storefront/src/lib/newsletter/send.ts +265 -0
- package/apps/storefront/src/lib/newsletter/subscribers.ts +156 -0
- package/apps/storefront/src/lib/previewReload.ts +57 -1
- package/apps/storefront/src/lib/publish/adminPublishTab.ts +4625 -0
- package/apps/storefront/src/lib/publish/apex-readiness.ts +41 -18
- 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/dispatchHealth.ts +5 -7
- package/apps/storefront/src/lib/publish/domainState.ts +22 -13
- 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/panelPolling.ts +78 -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 +121 -51
- package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
- package/apps/storefront/src/lib/publish/stageBundleUpload.ts +215 -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/rate/kvWindow.ts +53 -0
- package/apps/storefront/src/lib/rawChrome.ts +125 -47
- package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
- package/apps/storefront/src/lib/search/index.ts +2 -2
- package/apps/storefront/src/lib/seo/alternates.ts +42 -0
- package/apps/storefront/src/lib/seo/meta.ts +65 -0
- package/apps/storefront/src/lib/social/golive.ts +212 -0
- package/apps/storefront/src/lib/social/notify.ts +32 -0
- package/apps/storefront/src/lib/social/tokenStore.ts +171 -0
- 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 +32 -0
- package/apps/storefront/src/lib/the-build/readingTime.ts +35 -0
- package/apps/storefront/src/lib/the-build/toc.ts +95 -0
- package/apps/storefront/src/lib/tot/ToTClient.ts +1 -1
- package/apps/storefront/src/lib/tot/d1Client.ts +2 -2
- package/apps/storefront/src/lib/tot/totClientInterface.ts +3 -4
- package/apps/storefront/src/lib/webhooks/deliveryStore.ts +16 -17
- package/apps/storefront/src/middleware/index.ts +385 -52
- 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 +25 -1313
- 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/blog/[collection]/[slug]/react.ts +104 -0
- 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/newsletter/[collection]/subscribe.ts +146 -0
- package/apps/storefront/src/pages/api/newsletter/confirm.ts +75 -0
- package/apps/storefront/src/pages/api/newsletter/unsubscribe.ts +90 -0
- package/apps/storefront/src/pages/api/publish/stage-bundle.ts +70 -0
- package/apps/storefront/src/pages/api/rum/vitals.ts +20 -2
- package/apps/storefront/src/pages/blog/[slug].astro +99 -19
- package/apps/storefront/src/pages/blog/author/[author].astro +140 -0
- package/apps/storefront/src/pages/blog/category/[category].astro +67 -0
- package/apps/storefront/src/pages/blog/index.astro +4 -2
- package/apps/storefront/src/pages/blog/tag/[tag].astro +65 -0
- package/apps/storefront/src/pages/cockpit.astro +77 -1353
- package/apps/storefront/src/pages/dashboard/[appDomain]/team.astro +15 -11
- 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/search.astro +1 -1
- package/apps/storefront/src/pages/sitemap.xml.ts +21 -1
- 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 +129 -0
- package/apps/storefront/src/pages/the-build/index.astro +146 -0
- package/apps/storefront/src/pages/the-build/rss.xml.ts +33 -0
- package/apps/storefront/src/styles/admin.css +1106 -0
- package/apps/storefront/tsconfig.json +6 -1
- package/package.json +1 -1
- package/packages/public-runtime/package.json +3 -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 +89 -33
- 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/catalog-d1.ts +1 -1
- 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-preview.ts +25 -2
- package/packages/public-runtime/src/customization-runtime.ts +156 -3
- package/packages/public-runtime/src/customization-versioning.ts +10 -0
- 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 +17 -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 +357 -0
- package/packages/public-runtime/src/tenant-assets.ts +143 -4
- package/packages/public-runtime/src/tenant.ts +81 -17
- 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/build/copy-tenant-assets.mjs +14 -4
- package/scripts/dev/ai-edit.mjs +1 -1
- package/scripts/dev/checkout-watch.mjs +2 -2
- package/scripts/dev/file-browser.mjs +4 -6
- package/scripts/dev/file-writer.mjs +3 -3
- package/scripts/dev/git-status.mjs +2 -2
- package/scripts/dev/integration-guardrails.mjs +498 -0
- package/scripts/dev/locate-handler.mjs +3 -3
- package/scripts/dev/port-check.mjs +3 -3
- package/scripts/dev/publish.mjs +5 -9
- package/scripts/dev/safe-path.mjs +2 -2
- package/scripts/dev/shot.mjs +1 -1
- package/scripts/dev/tenant-source-root.mjs +1 -1
- package/scripts/dev/unified-diff.mjs +8 -3
- package/scripts/tot-dev.mjs +8 -11
- package/apps/storefront/src/lib/dev/vcBinding.ts +0 -80
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* deploy.version_observed — the deploy-provenance / deploy-skew signal
|
|
2
|
+
* deploy.version_observed — the deploy-provenance / deploy-skew signal.
|
|
3
3
|
*
|
|
4
|
-
* "A deployed worker version/commit was observed." This
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* timeline query are D5's (this module intentionally does no comparison — it has no
|
|
10
|
-
* notion of what the tip is, only what THIS build is).
|
|
4
|
+
* "A deployed worker version/commit was observed." This module makes
|
|
5
|
+
* `worker_commit` reliably present on server events and EMITs this observation at
|
|
6
|
+
* least once per running build. It intentionally does NO comparison — it has no
|
|
7
|
+
* notion of what the umbrella tip is, only what THIS build is; the "== umbrella
|
|
8
|
+
* tip?" deploy-skew comparison and the timeline query live elsewhere.
|
|
11
9
|
*
|
|
12
10
|
* WHAT IT PRODUCES. A catalog `deploy.version_observed` event (ACTION_CATALOG:
|
|
13
11
|
* actors [system|dev], source server, sinks logs+analytics+timeline). The FULL
|
|
@@ -15,24 +13,20 @@
|
|
|
15
13
|
* never redacts — because that is where the authoritative, unscrubbed sha belongs.
|
|
16
14
|
*
|
|
17
15
|
* DELIBERATELY the full sha does NOT go in `payload`. The action's argsAllow names
|
|
18
|
-
* `commit`, but a 40-char hex sha trips
|
|
16
|
+
* `commit`, but a 40-char hex sha trips the `high_entropy` VALUE canary (redaction.ts:
|
|
19
17
|
* ≥28 chars of base64url) — it would be scrubbed to «redacted» AND set
|
|
20
|
-
* `report.canaryTripped`, which
|
|
18
|
+
* `report.canaryTripped`, which alerting reads, firing a FALSE PII alarm on every cold
|
|
21
19
|
* start. So payload carries only the SHORT `version` (7 chars, safe) plus `env` +
|
|
22
20
|
* `observedFrom`; a reader wanting the full sha reads scope.workerCommit (a git sha is
|
|
23
|
-
* public, so the core zone is its correct, alert-free home).
|
|
24
|
-
*
|
|
21
|
+
* public, so the core zone is its correct, alert-free home). Treat scope.workerCommit
|
|
22
|
+
* as the authoritative provenance, payload.version as a
|
|
25
23
|
* human-eyeball convenience.
|
|
26
24
|
*
|
|
27
25
|
* WHERE IT'S EMITTED. observeDeployVersion() fires ONCE PER WORKER ISOLATE (guarded
|
|
28
26
|
* by a module-level flag) from the middleware's front door — a cold start emits one
|
|
29
|
-
* observation, not one per request, so the stream is low-volume and honest.
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* interim recordActivity.ts uses, already provisioned via `[observability]`). When
|
|
33
|
-
* D1's recordActivity() exists, swap `emitToLogs` for it (it will fan out to the
|
|
34
|
-
* analytics+timeline sinks the action declares); the EVENT this module builds is
|
|
35
|
-
* unchanged.
|
|
27
|
+
* observation, not one per request, so the stream is low-volume and honest. The
|
|
28
|
+
* emission goes to the universal `logs` sink (structured `[activity]` JSON to Workers
|
|
29
|
+
* Logs, already provisioned via `[observability]`).
|
|
36
30
|
*/
|
|
37
31
|
import { createActivityEvent } from "@tot/public-runtime";
|
|
38
32
|
import type { ActivityEvent, RedactionReport } from "@tot/public-runtime";
|
|
@@ -52,8 +46,8 @@ export interface DeployVersionObservedInput {
|
|
|
52
46
|
|
|
53
47
|
/**
|
|
54
48
|
* Build (do not emit) the `deploy.version_observed` ActivityEvent for the running
|
|
55
|
-
* build. Pure + side-effect-free — the piece
|
|
56
|
-
* tests assert against. Returns the safe-constructed event plus its redaction report.
|
|
49
|
+
* build. Pure + side-effect-free — the piece downstream consumers ultimately consume
|
|
50
|
+
* and the piece tests assert against. Returns the safe-constructed event plus its redaction report.
|
|
57
51
|
*/
|
|
58
52
|
export function buildDeployVersionObservedEvent(
|
|
59
53
|
input: DeployVersionObservedInput = {},
|
|
@@ -66,7 +60,7 @@ export function buildDeployVersionObservedEvent(
|
|
|
66
60
|
source: "server",
|
|
67
61
|
outcome: { status: "succeeded" },
|
|
68
62
|
// worker_commit (full sha) in the CORE zone — never redacted; the authoritative
|
|
69
|
-
// provenance every server event carries and
|
|
63
|
+
// provenance every server event carries and deploy skew is derived from.
|
|
70
64
|
scope: commit !== UNKNOWN_COMMIT ? { workerCommit: commit } : {},
|
|
71
65
|
// Payload carries the SHORT version (safe from the high_entropy canary that would
|
|
72
66
|
// scrub a full sha) + env + observedFrom. Unknown builds omit `version` rather than
|
|
@@ -82,10 +76,9 @@ export function buildDeployVersionObservedEvent(
|
|
|
82
76
|
}
|
|
83
77
|
|
|
84
78
|
/**
|
|
85
|
-
* Serialize an ActivityEvent to the universal `logs` sink (Workers Logs)
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* one grep finds both. Best-effort, never throws.
|
|
79
|
+
* Serialize an ActivityEvent to the universal `logs` sink (Workers Logs) —
|
|
80
|
+
* structured `[activity]` JSON so one grep finds all activity lines.
|
|
81
|
+
* Best-effort, never throws.
|
|
89
82
|
*/
|
|
90
83
|
function emitToLogs(event: ActivityEvent): void {
|
|
91
84
|
try {
|
|
@@ -108,7 +101,7 @@ export function observeDeployVersion(
|
|
|
108
101
|
input: DeployVersionObservedInput = {},
|
|
109
102
|
): ActivityEvent | undefined {
|
|
110
103
|
if (observedThisIsolate) return undefined;
|
|
111
|
-
// Kill switch
|
|
104
|
+
// Kill switch: telemetry off ⇒ skip the observation entirely (fail-open). Do
|
|
112
105
|
// NOT set the per-isolate guard, so re-enabling emits the observation on the next call.
|
|
113
106
|
if (isActivityDisabled()) return undefined;
|
|
114
107
|
observedThisIsolate = true;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ingest validation + server-side redaction for `POST /api/activity
|
|
2
|
+
* Ingest validation + server-side redaction for `POST /api/activity`.
|
|
3
3
|
*
|
|
4
4
|
* PURE (no I/O) so it is unit-testable and the route stays a thin auth/parse/
|
|
5
|
-
* respond shell. Takes the raw JSON events an emitter posted (CLI
|
|
6
|
-
*
|
|
5
|
+
* respond shell. Takes the raw JSON events an emitter posted (the CLI and UI
|
|
6
|
+
* cohorts — both send JSON matching the `ActivityEvent` shape) plus the
|
|
7
7
|
* AUTHENTICATED tenant id, and returns the accepted events (already rebuilt
|
|
8
8
|
* through `createActivityEvent`, so re-redacted server-side) and the rejections.
|
|
9
9
|
*
|
|
10
|
-
* DEFENSE IN DEPTH
|
|
10
|
+
* DEFENSE IN DEPTH. Even though every emitter is
|
|
11
11
|
* expected to have run the redaction contract itself, ingest NEVER trusts that:
|
|
12
12
|
* it rebuilds each event through `createActivityEvent()`, which re-applies the
|
|
13
13
|
* default-deny allowlist + canary scan. A malicious/careless client that posts a
|
|
@@ -61,9 +61,9 @@ export interface IngestRejection {
|
|
|
61
61
|
export interface AcceptedActivity {
|
|
62
62
|
event: ActivityEvent;
|
|
63
63
|
/** True when a value-canary fired during server-side redaction — the signal
|
|
64
|
-
* the route emits self-telemetry for and
|
|
64
|
+
* the route emits self-telemetry for and alerting reads. */
|
|
65
65
|
canaryTripped: boolean;
|
|
66
|
-
/** The redaction hits (fact-of, never the value) for
|
|
66
|
+
/** The redaction hits (fact-of, never the value) for audit / logging. */
|
|
67
67
|
redactionHits: RedactionFieldHit[];
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -122,14 +122,14 @@ export function ingestOne(index: number, raw: unknown, tenantId: string): Accept
|
|
|
122
122
|
const durationMs = typeof durationRaw === "number" && Number.isFinite(durationRaw) ? durationRaw : undefined;
|
|
123
123
|
|
|
124
124
|
// `at`: keep the emit clock when well-formed; a PRESENT-but-malformed `at` is a
|
|
125
|
-
// reject (a broken clock corrupts the
|
|
125
|
+
// reject (a broken clock corrupts the timeline ordering), a MISSING one is
|
|
126
126
|
// stamped server-side by createActivityEvent.
|
|
127
127
|
const at = e.at;
|
|
128
128
|
if (at !== undefined && !isIsoTimestamp(at)) return { index, reason: "bad_timestamp", attemptedAction: action };
|
|
129
129
|
|
|
130
130
|
const rawScope = (e.scope && typeof e.scope === "object" ? e.scope : {}) as Record<string, unknown>;
|
|
131
131
|
|
|
132
|
-
// CORE-ZONE PII GUARD
|
|
132
|
+
// CORE-ZONE PII GUARD. actor.id / actor.ref and the client-supplied
|
|
133
133
|
// scope ids land UNREDACTED in the core zone, whose contract is "opaque, never raw
|
|
134
134
|
// PII/secret". The payload contract is enforced by re-redaction below, but the core
|
|
135
135
|
// ids were NOT checked — a buggy/malicious (though authenticated) emitter could
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Service-auth for `POST /api/activity`
|
|
2
|
+
* Service-auth for `POST /api/activity` — HMAC-SHA256 over the raw
|
|
3
3
|
* body, with the authenticated TENANT bound into the signed material.
|
|
4
4
|
*
|
|
5
5
|
* WHY HMAC (not the bare `x-mcp-service-secret` shared-secret seam the
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The single operational KILL SWITCH for the whole activity-telemetry pipeline
|
|
2
|
+
* The single operational KILL SWITCH for the whole activity-telemetry pipeline.
|
|
3
3
|
*
|
|
4
4
|
* ONE flag — the `ACTIVITY_TELEMETRY_DISABLED` env var / Worker secret — switches
|
|
5
5
|
* EVERY server-side emit path to a no-op in one place:
|
|
6
|
-
* • `recordActivity()` (
|
|
7
|
-
* (
|
|
8
|
-
* • `observeDeployVersion()` (
|
|
9
|
-
* • `POST /api/activity` (
|
|
10
|
-
* The out-of-process CLI (`emitActivity
|
|
6
|
+
* • `recordActivity()` (the server emitter) — and therefore `recordUiActivity()`
|
|
7
|
+
* (the UI cohort), which is a thin wrapper over it;
|
|
8
|
+
* • `observeDeployVersion()` (the deploy-provenance observer);
|
|
9
|
+
* • `POST /api/activity` (ingest) — accepts-and-drops so emitters never error.
|
|
10
|
+
* The out-of-process CLI (`emitActivity`) honours the SAME flag name in its own
|
|
11
11
|
* JS mirror. Wiring it at these SHARED chokepoints means no call site checks it.
|
|
12
12
|
*
|
|
13
13
|
* FAIL-OPEN — this gates ONLY the observability layer. The underlying operation
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Query surface over the D1 `activity_events` timeline
|
|
2
|
+
* Query surface over the D1 `activity_events` timeline.
|
|
3
3
|
*
|
|
4
4
|
* The READ half of the operational-activity spine: given a tenant, return that
|
|
5
5
|
* tenant's lifecycle activity newest-first for the `/admin` ops timeline UI
|
|
6
6
|
* ("who shipped/rejected what, when, why — and what happened to my change/
|
|
7
7
|
* deploy"). PURE over the injected `Queryable` seam (D1 in the Worker, an
|
|
8
8
|
* in-memory `node:sqlite` in tests), same posture as `lib/d1/catalog.ts` and the
|
|
9
|
-
*
|
|
9
|
+
* write path (`store.ts`).
|
|
10
10
|
*
|
|
11
11
|
* TENANT ISOLATION IS THE INVARIANT. `tenantId` is REQUIRED on every query and is
|
|
12
12
|
* ALWAYS the first `WHERE` predicate (`tenant_id = ?`, a bound param — never
|
|
13
13
|
* string-interpolated). There is NO code path that reads `activity_events` without
|
|
14
14
|
* a tenant equality bound in: a query with a missing/empty tenant THROWS rather
|
|
15
|
-
* than degrading to a cross-tenant scan. This mirrors the
|
|
15
|
+
* than degrading to a cross-tenant scan. This mirrors the write-side isolation
|
|
16
16
|
* (ingest writes only the authenticated tenant) for the read side — a colliding
|
|
17
17
|
* `changeId`/`actorId`/`action` across two tenants can never surface tenant B's
|
|
18
18
|
* rows to a tenant-A query, because the collision is AND-ed under the tenant
|
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
* the UI. We never re-expand or un-redact it; a malformed row degrades to an empty
|
|
25
25
|
* payload rather than throwing the whole query.
|
|
26
26
|
*
|
|
27
|
-
* DEPLOY SKEW (
|
|
27
|
+
* DEPLOY SKEW (lightweight). The `deploy.version_observed` action is
|
|
28
28
|
* in the timeline cohort, so its rows are queryable here. `deriveDeploySkew()`
|
|
29
29
|
* folds those rows into the set of distinct build versions observed for the tenant
|
|
30
30
|
* and compares them against the build serving THIS query (`workerCommitShort()`),
|
|
31
31
|
* surfacing "a stale/newer isolate is (or was) live" as a visible signal. The full
|
|
32
|
-
* alerting logic
|
|
32
|
+
* alerting logic lives elsewhere — this only makes the data visibly queryable.
|
|
33
33
|
*/
|
|
34
34
|
import {
|
|
35
35
|
getActionSpec,
|
|
@@ -241,7 +241,7 @@ export async function queryActivity(
|
|
|
241
241
|
return rows.map(toTimelineRow);
|
|
242
242
|
}
|
|
243
243
|
|
|
244
|
-
// ─── Deploy skew
|
|
244
|
+
// ─── Deploy skew ─────────────────────────────────────────────────────────────
|
|
245
245
|
|
|
246
246
|
/** One distinct build version observed in the tenant's timeline. */
|
|
247
247
|
export interface ObservedVersion {
|
|
@@ -256,8 +256,8 @@ export interface ObservedVersion {
|
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
/**
|
|
259
|
-
* Deploy-skew summary for a tenant. Lightweight and derived, NOT an alert —
|
|
260
|
-
*
|
|
259
|
+
* Deploy-skew summary for a tenant. Lightweight and derived, NOT an alert —
|
|
260
|
+
* alerting lives elsewhere. It answers: what build(s) has this tenant seen serving, and does
|
|
261
261
|
* the build serving THIS request match the newest one?
|
|
262
262
|
*/
|
|
263
263
|
export interface DeploySkewSummary {
|
|
@@ -360,7 +360,7 @@ export function parseTimelineQuery(params: URLSearchParams, tenantId: string): A
|
|
|
360
360
|
};
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
-
// ─── TODO
|
|
363
|
+
// ─── TODO — cross-tenant MCP ops query for ToT staff ────────────────────────
|
|
364
364
|
// Deliberately NOT built: storefront has no in-repo MCP tool surface to hook into
|
|
365
365
|
// (the MCP tools live in the external `tot-mcp` repo; this repo only *authenticates*
|
|
366
366
|
// tot-mcp callers via the `x-mcp-service-secret` webhook seam — it exposes no tool
|
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Server-side activity emitter
|
|
3
|
-
*
|
|
2
|
+
* Server-side activity emitter — the storefront's entry point onto the
|
|
3
|
+
* actor×action telemetry contract (`@tot/public-runtime/activity`).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `{surface, action, outcome, actor_email, …}` shape logged for candidate
|
|
7
|
-
* accept/reject). That slice pre-dated the contract and imported `@/lib/change`
|
|
8
|
-
* for a session type — a `renderer-no-controlplane` violation. It is gone: every
|
|
9
|
-
* emitter now builds through {@link recordActivity}, which runs the SAFE
|
|
5
|
+
* Every emitter builds through {@link recordActivity}, which runs the SAFE
|
|
10
6
|
* constructor `createActivityEvent()` so the payload zone is always redacted, and
|
|
11
7
|
* writes the envelope as one structured JSON line to Workers Logs.
|
|
12
8
|
*
|
|
13
9
|
* TRANSPORT — Workers Logs (DECISIONS.md §8, tier 1 "universal"). `console.log` of
|
|
14
|
-
* the structured envelope, tagged `[activity]
|
|
15
|
-
*
|
|
16
|
-
* `
|
|
17
|
-
*
|
|
18
|
-
*
|
|
10
|
+
* the structured envelope, tagged `[activity]`, so `wrangler tail` / CF-dashboard
|
|
11
|
+
* grep tooling works. `[observability]` is already enabled in
|
|
12
|
+
* `apps/storefront/wrangler.toml`, so there is nothing to provision. The
|
|
13
|
+
* analytics/timeline sinks named on each action's `spec.sinks` are the ingest/store
|
|
14
|
+
* job — this emitter writes to the firehose only.
|
|
19
15
|
*
|
|
20
16
|
* BEST-EFFORT + BOUNDED — a logging failure must NEVER throw or block the caller.
|
|
21
17
|
* Every path is wrapped; a construction/serialize fault degrades to a single
|
|
@@ -31,7 +27,7 @@ import { isActivityDisabled } from "./killSwitch";
|
|
|
31
27
|
* zone is guaranteed by construction. Best-effort + never throws.
|
|
32
28
|
*/
|
|
33
29
|
export function recordActivity(input: CreateActivityEventInput): void {
|
|
34
|
-
// Kill switch
|
|
30
|
+
// Kill switch: the whole pipeline is a no-op when disabled — fail-open, the
|
|
35
31
|
// action this describes is unaffected. Covers the UI cohort too (recordUiActivity
|
|
36
32
|
// wraps this). Sync check so this fire-and-forget path stays synchronous.
|
|
37
33
|
if (isActivityDisabled()) return;
|
|
@@ -60,9 +56,9 @@ export function recordActivity(input: CreateActivityEventInput): void {
|
|
|
60
56
|
* one person stays correlatable across events) while being non-reversible.
|
|
61
57
|
*
|
|
62
58
|
* The salt is a Worker secret (`ACTIVITY_ACTOR_SALT`). The canonical salt is the
|
|
63
|
-
*
|
|
59
|
+
* open question flagged in `redaction.ts` — this SERVER-side helper is where
|
|
64
60
|
* it lands, deliberately NOT baked into the edge-shipped `@tot/public-runtime`
|
|
65
|
-
* package (which the
|
|
61
|
+
* package (which the redaction header warns against). Best-effort: on any crypto fault it
|
|
66
62
|
* returns a coarse non-PII fallback so an emitter never throws.
|
|
67
63
|
*/
|
|
68
64
|
export async function hashActorId(identifier: string, salt?: string | null): Promise<string> {
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sink fan-out for the activity spine
|
|
2
|
+
* Sink fan-out for the activity spine — routes ONE redacted
|
|
3
3
|
* `ActivityEvent` to the sink(s) its catalog entry declares (`spec.sinks`), per
|
|
4
4
|
* the store decision in DECISIONS.md §8:
|
|
5
5
|
*
|
|
6
6
|
* • "logs" — Workers Logs firehose, EVERY action. `console.log` of the
|
|
7
|
-
* structured envelope
|
|
8
|
-
* transport). Zero provision, days-only retention.
|
|
7
|
+
* structured envelope. Zero provision, days-only retention.
|
|
9
8
|
* • "analytics" — Cloudflare Analytics Engine (`ACTIVITY_ANALYTICS` binding).
|
|
10
9
|
* High-volume / query-light cohort; aggregate SQL, ~90 days.
|
|
11
10
|
* • "timeline" — D1 `STOREFRONT_APPS_DB.activity_events`. Low-volume / high-
|
|
12
11
|
* value lifecycle cohort; point queries + joins + arbitrary
|
|
13
|
-
* retention for the
|
|
12
|
+
* retention for the ops timeline UI.
|
|
14
13
|
*
|
|
15
14
|
* PURE over injected seams (a `Queryable` for D1, an `AnalyticsEngineLike` for
|
|
16
15
|
* Analytics Engine) so the same code serves the real Worker bindings and an
|
|
@@ -36,8 +35,7 @@ export interface ActivitySinks {
|
|
|
36
35
|
ingestedAt: string;
|
|
37
36
|
}
|
|
38
37
|
|
|
39
|
-
/** Structured Workers-Logs line — grep-able on the `[activity]` tag
|
|
40
|
-
* the interim admin slice emits. Never throws. */
|
|
38
|
+
/** Structured Workers-Logs line — grep-able on the `[activity]` tag. Never throws. */
|
|
41
39
|
export function logActivity(event: ActivityEvent): void {
|
|
42
40
|
try {
|
|
43
41
|
console.log(`[activity] ${JSON.stringify(event)}`);
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared emit helper for UI-ORIGINATED operational activity
|
|
2
|
+
* Shared emit helper for UI-ORIGINATED operational activity.
|
|
3
3
|
*
|
|
4
|
-
* The UI cohort's entry point onto the
|
|
5
|
-
* ON TOP of
|
|
4
|
+
* The UI cohort's entry point onto the actor×action telemetry contract. It sits
|
|
5
|
+
* ON TOP of the server emitter ({@link recordActivity}) — every admin/cockpit action
|
|
6
6
|
* handler already runs SERVER-SIDE in the same Worker, so a UI action reaches
|
|
7
|
-
* telemetry through the same in-process `recordActivity()` call
|
|
8
|
-
* structured Workers-Logs line), NOT a client-side `fetch` to the
|
|
7
|
+
* telemetry through the same in-process `recordActivity()` call the server path uses (one
|
|
8
|
+
* structured Workers-Logs line), NOT a client-side `fetch` to the ingest endpoint.
|
|
9
9
|
* There is no browser-only signal to capture: an admin/cockpit "Publish / Connect /
|
|
10
10
|
* Invite / Approve / Rollback" click is a server-rendered form/JSON POST to an API
|
|
11
11
|
* route, so the route handler that already does the work is exactly where the emit
|
|
12
|
-
* belongs (zero extra HTTP round-trip, no new auth/trust boundary). The
|
|
12
|
+
* belongs (zero extra HTTP round-trip, no new auth/trust boundary). The HMAC
|
|
13
13
|
* ingest path exists for emitters that CAN'T call `recordActivity()` directly (the
|
|
14
|
-
* out-of-process CLI cohort
|
|
14
|
+
* out-of-process CLI cohort) — it is not this cohort's path.
|
|
15
15
|
*
|
|
16
16
|
* WHAT THIS ADDS over calling `recordActivity()` raw: it stamps `source: "ui"` and,
|
|
17
17
|
* critically, resolves the ACTOR KIND from the authenticated session so the timeline
|
|
18
|
-
*
|
|
18
|
+
* can attribute an action to the right cohort:
|
|
19
19
|
*
|
|
20
20
|
* • "admin" — a ToT-STAFF viewer (the session carries `staff[]` scope). ToT
|
|
21
21
|
* operators acting through the admin shell / staff vendor selection.
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
* The classifier is a PURE function ({@link classifyActorKind}) so the cohort mapping
|
|
30
30
|
* is unit-tested without a live request. The opaque `actor.id` is the salted,
|
|
31
31
|
* non-reversible hash of the acting identity (never raw PII in the core zone) — the
|
|
32
|
-
* SAME {@link hashActorId} + `ACTIVITY_ACTOR_SALT`
|
|
32
|
+
* SAME {@link hashActorId} + `ACTIVITY_ACTOR_SALT` the server path uses, so one person stays
|
|
33
33
|
* correlatable across the CLI, server, and UI cohorts.
|
|
34
34
|
*
|
|
35
|
-
* USAGE (mirrors
|
|
35
|
+
* USAGE (mirrors reject.ts — resolve the actor ONCE after auth, emit at each
|
|
36
36
|
* exit point, zero change to the handler's control flow):
|
|
37
37
|
*
|
|
38
38
|
* const actor = await resolveUiActor(context, { owner: auth.owner });
|
|
@@ -125,8 +125,8 @@ export async function resolveUiActor(
|
|
|
125
125
|
|
|
126
126
|
/**
|
|
127
127
|
* Emit ONE UI-originated activity event with a PRE-RESOLVED actor. A thin, SYNC
|
|
128
|
-
* wrapper over
|
|
129
|
-
* calls it at each exit point (succeeded / failed / refused) exactly as
|
|
128
|
+
* wrapper over {@link recordActivity} that stamps `source: "ui"` — so a handler
|
|
129
|
+
* calls it at each exit point (succeeded / failed / refused) exactly as the server
|
|
130
130
|
* emitters do, with no control-flow change. Best-effort + never throws (inherited
|
|
131
131
|
* from `recordActivity`).
|
|
132
132
|
*/
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* worker_commit — build provenance for the running Worker
|
|
2
|
+
* worker_commit — build provenance for the running Worker.
|
|
3
3
|
*
|
|
4
4
|
* The commit SHA THIS Worker build was cut from, made available REPO-WIDE at
|
|
5
5
|
* runtime so every server-emitted ActivityEvent can carry it (see event.ts
|
|
6
|
-
* `ActivityScope.workerCommit`) and
|
|
6
|
+
* `ActivityScope.workerCommit`) and the query surface can derive **deploy skew** — "is the
|
|
7
7
|
* build serving this request == the pushed umbrella tip, or is a stale worker
|
|
8
8
|
* still live?".
|
|
9
9
|
*
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
* — we read it through the identical `typeof` guard so both agree by construction,
|
|
16
16
|
* and so the value is safe under vitest (where the define isn't applied → "unknown").
|
|
17
17
|
*
|
|
18
|
-
* This is the single accessor the whole repo threads through:
|
|
19
|
-
* spreads serverActivityScope() into every server event;
|
|
18
|
+
* This is the single accessor the whole repo threads through: recordActivity()
|
|
19
|
+
* spreads serverActivityScope() into every server event; the deploy.version_observed
|
|
20
20
|
* emitter (deployVersion.ts) reads workerCommit() directly.
|
|
21
21
|
*/
|
|
22
22
|
import type { ActivityScope } from "@tot/public-runtime";
|
|
@@ -41,7 +41,7 @@ export function workerCommitShort(override?: string): string {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* True when the build has a real git commit (not the "unknown" sentinel).
|
|
44
|
+
* True when the build has a real git commit (not the "unknown" sentinel). The
|
|
45
45
|
* skew derivation only compares against the umbrella tip when this holds — an
|
|
46
46
|
* "unknown" build can't be meaningfully skew-checked.
|
|
47
47
|
*/
|
|
@@ -51,7 +51,7 @@ export function hasKnownWorkerCommit(override?: string): boolean {
|
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
53
|
* Build the CORE scope for a SERVER-sourced ActivityEvent with `worker_commit`
|
|
54
|
-
* stamped in. This is the seam
|
|
54
|
+
* stamped in. This is the seam recordActivity() spreads into every server
|
|
55
55
|
* event so provenance is present WITHOUT each call site remembering it:
|
|
56
56
|
*
|
|
57
57
|
* createActivityEvent({ ..., source: "server", scope: serverActivityScope({ tenantId }) })
|